mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-03-11 23:31:03 +03:00
seperate video decoding thread for each display (#9968)
* seperate video decoding thread for each display 1. Separate Video Decoding Thread for Each Display 2. Fix Decode Errors When Clearing the Queue Previously, on-flight frames after clearing the queue could not be decoded successfully. This issue can be resolved by setting a discard_queue flag when sending a refresh message. The flag will be reset upon receiving a keyframe. Signed-off-by: 21pages <sunboeasy@gmail.com> * update video format along with fps to flutter Signed-off-by: 21pages <sunboeasy@gmail.com> * Fix keyframe interval when auto record outgoing sessions Signed-off-by: 21pages <sunboeasy@gmail.com> --------- Signed-off-by: 21pages <sunboeasy@gmail.com>
This commit is contained in:
@@ -35,8 +35,8 @@ use hbb_common::{
|
||||
use crate::client::io_loop::Remote;
|
||||
use crate::client::{
|
||||
check_if_retry, handle_hash, handle_login_error, handle_login_from_ui, handle_test_delay,
|
||||
input_os_password, send_mouse, send_pointer_device_event, start_video_audio_threads,
|
||||
FileManager, Key, LoginConfigHandler, QualityStatus, KEY_MAP,
|
||||
input_os_password, send_mouse, send_pointer_device_event, FileManager, Key, LoginConfigHandler,
|
||||
QualityStatus, KEY_MAP,
|
||||
};
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
use crate::common::GrabState;
|
||||
@@ -1848,40 +1848,7 @@ pub async fn io_loop<T: InvokeUiSession>(handler: Session<T>, round: u32) {
|
||||
}
|
||||
return;
|
||||
}
|
||||
let frame_count_map: Arc<RwLock<HashMap<usize, usize>>> = Default::default();
|
||||
let frame_count_map_cl = frame_count_map.clone();
|
||||
let ui_handler = handler.ui_handler.clone();
|
||||
let (video_sender, audio_sender, video_queue_map, decode_fps, chroma) =
|
||||
start_video_audio_threads(
|
||||
handler.clone(),
|
||||
move |display: usize,
|
||||
data: &mut scrap::ImageRgb,
|
||||
_texture: *mut c_void,
|
||||
pixelbuffer: bool| {
|
||||
let mut write_lock = frame_count_map_cl.write().unwrap();
|
||||
let count = write_lock.get(&display).unwrap_or(&0) + 1;
|
||||
write_lock.insert(display, count);
|
||||
drop(write_lock);
|
||||
if pixelbuffer {
|
||||
ui_handler.on_rgba(display, data);
|
||||
} else {
|
||||
#[cfg(all(feature = "vram", feature = "flutter"))]
|
||||
ui_handler.on_texture(display, _texture);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
let mut remote = Remote::new(
|
||||
handler,
|
||||
video_queue_map,
|
||||
video_sender,
|
||||
audio_sender,
|
||||
receiver,
|
||||
sender,
|
||||
frame_count_map,
|
||||
decode_fps,
|
||||
chroma,
|
||||
);
|
||||
let mut remote = Remote::new(handler, receiver, sender);
|
||||
remote.io_loop(&key, &token, round).await;
|
||||
remote.sync_jobs_status_to_local().await;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user