portable-service: try dxgi before gdi, which not controlled by video_service

Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
21pages 2022-11-13 20:15:38 +08:00
parent 45bfb0e22e
commit abd665153b

View File

@ -47,6 +47,7 @@ const ADDR_CAPTURE_FRAME: usize =
const IPC_PROFIX: &str = "_portable_service"; const IPC_PROFIX: &str = "_portable_service";
pub const SHMEM_NAME: &str = "_portable_service"; pub const SHMEM_NAME: &str = "_portable_service";
const MAX_NACK: usize = 3; const MAX_NACK: usize = 3;
const MAX_DXGI_FAIL_TIME: usize = 5;
pub struct SharedMemory { pub struct SharedMemory {
inner: Shmem, inner: Shmem,
@ -269,6 +270,7 @@ pub mod server {
let mut last_timeout_ms: i32 = 33; let mut last_timeout_ms: i32 = 33;
let mut spf = Duration::from_millis(last_timeout_ms as _); let mut spf = Duration::from_millis(last_timeout_ms as _);
let mut first_frame_captured = false; let mut first_frame_captured = false;
let mut dxgi_failed_times = 0;
loop { loop {
if EXIT.lock().unwrap().clone() { if EXIT.lock().unwrap().clone() {
break; break;
@ -294,9 +296,10 @@ pub mod server {
last_current_display = current_display; last_current_display = current_display;
last_use_yuv = use_yuv; last_use_yuv = use_yuv;
first_frame_captured = false; first_frame_captured = false;
// dxgi failed at loadFrame on my PC. if dxgi_failed_times > MAX_DXGI_FAIL_TIME {
// to-do: try dxgi on another PC. dxgi_failed_times = 0;
v.set_gdi(); v.set_gdi();
}
Some(v) Some(v)
} }
} }
@ -341,14 +344,26 @@ pub mod server {
shmem.write(ADDR_CAPTURE_WOULDBLOCK, &utils::i32_to_vec(TRUE)); shmem.write(ADDR_CAPTURE_WOULDBLOCK, &utils::i32_to_vec(TRUE));
utils::increase_counter(shmem.as_ptr().add(ADDR_CAPTURE_FRAME_COUNTER)); utils::increase_counter(shmem.as_ptr().add(ADDR_CAPTURE_FRAME_COUNTER));
first_frame_captured = true; first_frame_captured = true;
dxgi_failed_times = 0;
} }
Err(e) => { Err(e) => {
if e.kind() != std::io::ErrorKind::WouldBlock { if e.kind() != std::io::ErrorKind::WouldBlock {
log::error!("capture frame failed:{:?}", e); // DXGI_ERROR_INVALID_CALL after each success on Microsoft GPU driver
crate::platform::try_change_desktop(); // log::error!("capture frame failed:{:?}", e);
c = None; if crate::platform::windows::desktop_changed() {
shmem.write(ADDR_CAPTURE_WOULDBLOCK, &utils::i32_to_vec(FALSE)); crate::platform::try_change_desktop();
continue; c = None;
std::thread::sleep(spf);
continue;
}
if !c.as_ref().unwrap().is_gdi() {
dxgi_failed_times += 1;
}
if dxgi_failed_times > MAX_DXGI_FAIL_TIME {
c = None;
shmem.write(ADDR_CAPTURE_WOULDBLOCK, &utils::i32_to_vec(FALSE));
std::thread::sleep(spf);
}
} else { } else {
shmem.write(ADDR_CAPTURE_WOULDBLOCK, &utils::i32_to_vec(TRUE)); shmem.write(ADDR_CAPTURE_WOULDBLOCK, &utils::i32_to_vec(TRUE));
} }
@ -512,6 +527,7 @@ pub mod client {
timeout_ms: 33, timeout_ms: 33,
}, },
); );
shmem.write(ADDR_CAPTURE_WOULDBLOCK, &utils::i32_to_vec(TRUE));
CapturerPortable {} CapturerPortable {}
} }
@ -586,6 +602,7 @@ pub mod client {
} }
} }
// control by itself
fn is_gdi(&self) -> bool { fn is_gdi(&self) -> bool {
true true
} }