Skip to content

Commit e4f3b76

Browse files
committed
refactor!: add supported codecs in BitmapConfig
"session" has a fixed set of supported codecs with associated IDs. "connector" must expose the set of codecs during capabilities exchange. It currently uses hard-codes codec IDs in different places. Move the BitmapCodecs set to ironrdp-pdu. Shared code will be used by the server, so this is a suitable common place. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
1 parent f7fd86d commit e4f3b76

File tree

10 files changed

+51
-35
lines changed

10 files changed

+51
-35
lines changed

crates/ironrdp-client/src/config.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use anyhow::Context as _;
66
use clap::clap_derive::ValueEnum;
77
use clap::Parser;
88
use ironrdp::connector::{self, Credentials};
9-
use ironrdp::pdu::rdp::capability_sets::MajorPlatformType;
9+
use ironrdp::pdu::rdp::capability_sets::{client_codecs_capabilities, MajorPlatformType};
1010
use ironrdp::pdu::rdp::client_info::PerformanceFlags;
1111
use tap::prelude::*;
1212

@@ -264,6 +264,7 @@ impl Config {
264264
Some(connector::BitmapConfig {
265265
color_depth,
266266
lossy_compression: true,
267+
codecs: client_codecs_capabilities(),
267268
})
268269
} else {
269270
None

crates/ironrdp-connector/src/connection_activation.rs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -355,16 +355,7 @@ fn create_client_confirm_active(
355355
CapabilitySet::SurfaceCommands(SurfaceCommands {
356356
flags: CmdFlags::SET_SURFACE_BITS | CmdFlags::STREAM_SURFACE_BITS | CmdFlags::FRAME_MARKER,
357357
}),
358-
CapabilitySet::BitmapCodecs(BitmapCodecs(vec![Codec {
359-
id: 0x03, // RemoteFX
360-
property: CodecProperty::RemoteFx(RemoteFxContainer::ClientContainer(RfxClientCapsContainer {
361-
capture_flags: CaptureFlags::empty(),
362-
caps_data: RfxCaps(RfxCapset(vec![RfxICap {
363-
flags: RfxICapFlags::empty(),
364-
entropy_bits: EntropyBits::Rlgr3,
365-
}])),
366-
})),
367-
}])),
358+
CapabilitySet::BitmapCodecs(config.bitmap.as_ref().map(|b| b.codecs.clone()).unwrap_or_default()),
368359
CapabilitySet::FrameAcknowledge(FrameAcknowledge {
369360
// FIXME(#447): Revert this to 2 per FreeRDP.
370361
// This is a temporary hack to fix a resize bug, see:

crates/ironrdp-connector/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use std::sync::Arc;
2323

2424
use ironrdp_core::{encode_buf, encode_vec, Encode, WriteBuf};
2525
use ironrdp_pdu::nego::NegoRequestData;
26-
use ironrdp_pdu::rdp::capability_sets;
26+
use ironrdp_pdu::rdp::capability_sets::{self, BitmapCodecs};
2727
use ironrdp_pdu::rdp::client_info::PerformanceFlags;
2828
use ironrdp_pdu::x224::X224;
2929
use ironrdp_pdu::{gcc, x224, PduHint};
@@ -43,11 +43,12 @@ pub struct DesktopSize {
4343
pub height: u16,
4444
}
4545

46-
#[derive(Debug, Clone, Copy)]
46+
#[derive(Debug, Clone)]
4747
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
4848
pub struct BitmapConfig {
4949
pub lossy_compression: bool,
5050
pub color_depth: u32,
51+
pub codecs: BitmapCodecs,
5152
}
5253

5354
#[derive(Debug, Clone)]

crates/ironrdp-pdu/src/rdp/capability_sets.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ pub use self::bitmap_cache::{
3232
BitmapCache, BitmapCacheRev2, CacheEntry, CacheFlags, CellInfo, BITMAP_CACHE_ENTRIES_NUM,
3333
};
3434
pub use self::bitmap_codecs::{
35-
BitmapCodecs, CaptureFlags, Codec, CodecProperty, EntropyBits, Guid, NsCodec, RemoteFxContainer, RfxCaps,
36-
RfxCapset, RfxClientCapsContainer, RfxICap, RfxICapFlags,
35+
client_codecs_capabilities, BitmapCodecs, CaptureFlags, Codec, CodecId, CodecProperty, EntropyBits, Guid, NsCodec,
36+
RemoteFxContainer, RfxCaps, RfxCapset, RfxClientCapsContainer, RfxICap, RfxICapFlags,
3737
};
3838
pub use self::brush::{Brush, SupportLevel};
3939
pub use self::frame_acknowledge::FrameAcknowledge;

crates/ironrdp-pdu/src/rdp/capability_sets/bitmap_codecs.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ impl<'de> Decode<'de> for Guid {
9797
}
9898
}
9999

100-
#[derive(Debug, PartialEq, Eq, Clone)]
100+
#[derive(Debug, PartialEq, Eq, Clone, Default)]
101101
pub struct BitmapCodecs(pub Vec<Codec>);
102102

103103
impl BitmapCodecs {
@@ -617,3 +617,37 @@ bitflags! {
617617
const CODEC_MODE = 2;
618618
}
619619
}
620+
621+
// Those IDs are hard-coded for practical reasons, they are implementation
622+
// details of the IronRDP client. The server should respect the client IDs.
623+
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
624+
#[repr(u8)]
625+
pub enum CodecId {
626+
None = 0x0,
627+
RemoteFx = 0x3,
628+
}
629+
630+
impl CodecId {
631+
pub const fn from_u8(value: u8) -> Option<Self> {
632+
match value {
633+
0 => Some(Self::None),
634+
3 => Some(Self::RemoteFx),
635+
_ => None,
636+
}
637+
}
638+
}
639+
640+
pub fn client_codecs_capabilities() -> BitmapCodecs {
641+
let codecs = vec![Codec {
642+
id: CodecId::RemoteFx as u8,
643+
property: CodecProperty::RemoteFx(RemoteFxContainer::ClientContainer(RfxClientCapsContainer {
644+
capture_flags: CaptureFlags::empty(),
645+
caps_data: RfxCaps(RfxCapset(vec![RfxICap {
646+
flags: RfxICapFlags::empty(),
647+
entropy_bits: EntropyBits::Rlgr3,
648+
}])),
649+
})),
650+
}];
651+
652+
BitmapCodecs(codecs)
653+
}

crates/ironrdp-session/src/fast_path.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ use ironrdp_pdu::codecs::rfx::FrameAcknowledgePdu;
99
use ironrdp_pdu::fast_path::{FastPathHeader, FastPathUpdate, FastPathUpdatePdu, Fragmentation};
1010
use ironrdp_pdu::geometry::{InclusiveRectangle, Rectangle as _};
1111
use ironrdp_pdu::pointer::PointerUpdateData;
12+
use ironrdp_pdu::rdp::capability_sets::CodecId;
1213
use ironrdp_pdu::rdp::headers::ShareDataPdu;
1314
use ironrdp_pdu::surface_commands::{FrameAction, FrameMarkerPdu, SurfaceCommand};
1415

1516
use crate::image::DecodedImage;
1617
use crate::pointer::PointerCache;
17-
use crate::utils::CodecId;
1818
use crate::{rfx, SessionError, SessionErrorExt, SessionResult};
1919

2020
#[derive(Debug)]

crates/ironrdp-session/src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ pub mod image;
1313
pub mod legacy;
1414
pub mod pointer;
1515
pub mod rfx; // FIXME: maybe this module should not be in this crate
16-
pub mod utils;
1716
pub mod x224;
1817

1918
mod active_stage;

crates/ironrdp-session/src/utils.rs

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,4 @@
1-
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
2-
#[repr(u8)]
3-
pub enum CodecId {
4-
None = 0x0,
5-
RemoteFx = 0x3,
6-
}
7-
8-
impl CodecId {
9-
pub const fn from_u8(value: u8) -> Option<Self> {
10-
match value {
11-
0 => Some(Self::None),
12-
3 => Some(Self::RemoteFx),
13-
_ => None,
14-
}
15-
}
16-
}
1+
use ironrdp_pdu::rdp::capability_sets::{
2+
BitmapCodecs, CaptureFlags, Codec, CodecProperty, EntropyBits, RemoteFxContainer, RfxCaps, RfxCapset,
3+
RfxClientCapsContainer, RfxICap, RfxICapFlags,
4+
};

crates/ironrdp-web/src/session.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use ironrdp::displaycontrol::client::DisplayControlClient;
2323
use ironrdp::dvc::DrdynvcClient;
2424
use ironrdp::graphics::image_processing::PixelFormat;
2525
use ironrdp::pdu::input::fast_path::FastPathInputEvent;
26+
use ironrdp::pdu::rdp::capability_sets::client_codecs_capabilities;
2627
use ironrdp::pdu::rdp::client_info::PerformanceFlags;
2728
use ironrdp::session::image::DecodedImage;
2829
use ironrdp::session::{fast_path, ActiveStage, ActiveStageOutput, GracefulDisconnectReason};
@@ -846,6 +847,7 @@ fn build_config(
846847
bitmap: Some(connector::BitmapConfig {
847848
color_depth: 16,
848849
lossy_compression: true,
850+
codecs: client_codecs_capabilities(),
849851
}),
850852
#[allow(clippy::arithmetic_side_effects)] // fine unless we end up with an insanely big version
851853
client_build: semver::Version::parse(env!("CARGO_PKG_VERSION"))

ffi/src/connector/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ pub mod ffi {
124124
}
125125

126126
pub fn set_bitmap_config(&mut self, bitmap: &BitmapConfig) {
127-
self.bitmap = Some(bitmap.0);
127+
self.bitmap = Some(bitmap.0.clone());
128128
}
129129

130130
pub fn set_client_build(&mut self, client_build: u32) {

0 commit comments

Comments
 (0)