Skip to content

Commit 806f1d7

Browse files
authored
fix(server): use desktop size for RFX channel size (#756)
1 parent bdde2c7 commit 806f1d7

File tree

2 files changed

+44
-23
lines changed

2 files changed

+44
-23
lines changed

crates/ironrdp-server/src/encoder/mod.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ impl UpdateEncoder {
4747
BitmapUpdater::Bitmap(BitmapHandler::new())
4848
} else if remotefx.is_some() {
4949
let (algo, id) = remotefx.unwrap();
50-
BitmapUpdater::RemoteFx(RemoteFxHandler::new(algo, id))
50+
BitmapUpdater::RemoteFx(RemoteFxHandler::new(algo, id, desktop_size))
5151
} else {
5252
BitmapUpdater::None(NoneHandler)
5353
};
@@ -68,6 +68,7 @@ impl UpdateEncoder {
6868

6969
pub(crate) fn set_desktop_size(&mut self, size: DesktopSize) {
7070
self.desktop_size = size;
71+
self.bitmap_updater.set_desktop_size(size);
7172
}
7273

7374
fn rgba_pointer(ptr: RGBAPointer) -> Result<UpdateFragmenter> {
@@ -181,6 +182,12 @@ impl BitmapUpdater {
181182
Self::RemoteFx(up) => up.handle(bitmap),
182183
}
183184
}
185+
186+
fn set_desktop_size(&mut self, size: DesktopSize) {
187+
if let Self::RemoteFx(up) = self {
188+
up.set_desktop_size(size)
189+
}
190+
}
184191
}
185192

186193
trait BitmapUpdateHandler {
@@ -246,28 +253,36 @@ impl BitmapUpdateHandler for BitmapHandler {
246253
struct RemoteFxHandler {
247254
remotefx: RfxEncoder,
248255
codec_id: u8,
256+
desktop_size: Option<DesktopSize>,
249257
}
250258

251259
impl RemoteFxHandler {
252-
fn new(algo: EntropyBits, codec_id: u8) -> Self {
260+
fn new(algo: EntropyBits, codec_id: u8, desktop_size: DesktopSize) -> Self {
253261
Self {
254262
remotefx: RfxEncoder::new(algo),
263+
desktop_size: Some(desktop_size),
255264
codec_id,
256265
}
257266
}
267+
268+
fn set_desktop_size(&mut self, size: DesktopSize) {
269+
self.desktop_size = Some(size);
270+
}
258271
}
259272

260273
impl BitmapUpdateHandler for RemoteFxHandler {
261274
fn handle(&mut self, bitmap: &BitmapUpdate) -> Result<UpdateFragmenter> {
262275
let mut buffer = vec![0; bitmap.data.len()];
263276
let len = loop {
264-
match self.remotefx.encode(bitmap, buffer.as_mut_slice()) {
277+
match self
278+
.remotefx
279+
.encode(bitmap, buffer.as_mut_slice(), self.desktop_size.take())
280+
{
265281
Err(e) => match e.kind() {
266282
ironrdp_core::EncodeErrorKind::NotEnoughBytes { .. } => {
267283
buffer.resize(buffer.len() * 2, 0);
268284
debug!("encoder buffer resized to: {}", buffer.len() * 2);
269285
}
270-
271286
_ => Err(e).context("RemoteFX encode error")?,
272287
},
273288
Ok(len) => break len,

crates/ironrdp-server/src/encoder/rfx.rs

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use ironrdp_acceptor::DesktopSize;
12
use ironrdp_core::{cast_length, other_err, Encode, EncodeResult};
23
use ironrdp_graphics::color_conversion::to_64x64_ycbcr_tile;
34
use ironrdp_graphics::rfx_encode_component;
@@ -25,29 +26,34 @@ impl RfxEncoder {
2526
Self { entropy_algorithm }
2627
}
2728

28-
pub(crate) fn encode(&mut self, bitmap: &BitmapUpdate, output: &mut [u8]) -> EncodeResult<usize> {
29+
pub(crate) fn encode(
30+
&mut self,
31+
bitmap: &BitmapUpdate,
32+
output: &mut [u8],
33+
desktop_size: Option<DesktopSize>,
34+
) -> EncodeResult<usize> {
2935
let mut cursor = WriteCursor::new(output);
30-
31-
let width = bitmap.width.get();
32-
let height = bitmap.height.get();
3336
let entropy_algorithm = self.entropy_algorithm;
3437

3538
// header messages
36-
// FIXME: skip if unnecessary?
37-
Block::Sync(SyncPdu).encode(&mut cursor)?;
38-
let context = rfx::ContextPdu {
39-
flags: OperatingMode::IMAGE_MODE,
40-
entropy_algorithm,
41-
};
42-
Block::CodecChannel(CodecChannel::Context(context)).encode(&mut cursor)?;
43-
44-
let channels = ChannelsPdu(vec![RfxChannel {
45-
width: cast_length!("width", width)?,
46-
height: cast_length!("height", height)?,
47-
}]);
48-
Block::Channels(channels).encode(&mut cursor)?;
49-
50-
Block::CodecVersions(CodecVersionsPdu).encode(&mut cursor)?;
39+
if let Some(desktop_size) = desktop_size {
40+
let width = desktop_size.width;
41+
let height = desktop_size.height;
42+
Block::Sync(SyncPdu).encode(&mut cursor)?;
43+
let context = rfx::ContextPdu {
44+
flags: OperatingMode::IMAGE_MODE,
45+
entropy_algorithm,
46+
};
47+
Block::CodecChannel(CodecChannel::Context(context)).encode(&mut cursor)?;
48+
49+
let channels = ChannelsPdu(vec![RfxChannel {
50+
width: cast_length!("width", width)?,
51+
height: cast_length!("height", height)?,
52+
}]);
53+
Block::Channels(channels).encode(&mut cursor)?;
54+
55+
Block::CodecVersions(CodecVersionsPdu).encode(&mut cursor)?;
56+
}
5157

5258
// data messages
5359
let frame_begin = FrameBeginPdu {

0 commit comments

Comments
 (0)