diff --git a/flutter/lib/consts.dart b/flutter/lib/consts.dart index d5b133bf1..011709cc5 100644 --- a/flutter/lib/consts.dart +++ b/flutter/lib/consts.dart @@ -78,6 +78,7 @@ const String kOptionScrollStyle = "scroll_style"; const String kOptionImageQuality = "image_quality"; const String kOptionOpenNewConnInTabs = "enable-open-new-connections-in-tabs"; const String kOptionTextureRender = "use-texture-render"; +const String kOptionD3DRender = "allow-d3d-render"; const String kOptionOpenInTabs = "allow-open-in-tabs"; const String kOptionOpenInWindows = "allow-open-in-windows"; const String kOptionForceAlwaysRelay = "force-always-relay"; diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index ad9a1296c..5d95c8d0c 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -496,6 +496,16 @@ class _GeneralState extends State<_General> { await bind.mainSetLocalOption(key: k, value: v ? 'Y' : 'N'), ), ), + if (isWindows) + Tooltip( + message: translate('d3d_render_tip'), + child: _OptionCheckBox( + context, + "Use D3D rendering", + kOptionD3DRender, + isServer: false, + ), + ), if (!isWeb && !bind.isCustomClient()) _OptionCheckBox( context, diff --git a/libs/hbb_common b/libs/hbb_common index 7cf11f7b7..181987547 160000 --- a/libs/hbb_common +++ b/libs/hbb_common @@ -1 +1 @@ -Subproject commit 7cf11f7b771e27ecbd14fd1dd0ced55a64f40eb5 +Subproject commit 1819875476d487612a654099881b8a16f4337599 diff --git a/libs/scrap/Cargo.toml b/libs/scrap/Cargo.toml index d336f2d3b..16196d11f 100644 --- a/libs/scrap/Cargo.toml +++ b/libs/scrap/Cargo.toml @@ -23,7 +23,6 @@ lazy_static = "1.4" hbb_common = { path = "../hbb_common" } webm = { git = "https://github.com/rustdesk-org/rust-webm" } serde = {version="1.0", features=["derive"]} -nokhwa = { git = "https://github.com/rustdesk-org/nokhwa.git", branch = "fix_from_raw_parts", features = ["input-native"] } [dependencies.winapi] version = "0.3" @@ -63,3 +62,6 @@ gstreamer-video = { version = "0.16", optional = true } git = "https://github.com/rustdesk-org/hwcodec" optional = true +[target.'cfg(any(target_os = "windows", target_os = "linux"))'.dependencies] +nokhwa = { git = "https://github.com/rustdesk-org/nokhwa.git", branch = "fix_from_raw_parts", features = ["input-native"] } + diff --git a/libs/scrap/src/common/camera.rs b/libs/scrap/src/common/camera.rs index e857423ed..a84e8d7cd 100644 --- a/libs/scrap/src/common/camera.rs +++ b/libs/scrap/src/common/camera.rs @@ -3,6 +3,7 @@ use std::{ sync::{Arc, Mutex}, }; +#[cfg(any(target_os = "windows", target_os = "linux"))] use nokhwa::{ pixel_format::RgbAFormat, query, @@ -23,6 +24,9 @@ lazy_static::lazy_static! { static ref SYNC_CAMERA_DISPLAYS: Arc>> = Arc::new(Mutex::new(Vec::new())); } +#[cfg(not(any(target_os = "windows", target_os = "linux")))] +const CAMERA_NOT_SUPPORTED: &str = "This platform doesn't support camera yet"; + pub struct Cameras; // pre-condition @@ -30,12 +34,9 @@ pub fn primary_camera_exists() -> bool { Cameras::exists(PRIMARY_CAMERA_IDX) } +#[cfg(any(target_os = "windows", target_os = "linux"))] impl Cameras { pub fn all_info() -> ResultType> { - // TODO: support more platforms. - #[cfg(not(any(target_os = "linux", target_os = "windows")))] - return Ok(Vec::new()); - match query(ApiBackend::Auto) { Ok(cameras) => { let mut camera_displays = SYNC_CAMERA_DISPLAYS.lock().unwrap(); @@ -102,10 +103,6 @@ impl Cameras { } pub fn exists(index: usize) -> bool { - // TODO: support more platforms. - #[cfg(not(any(target_os = "linux", target_os = "windows")))] - return false; - match query(ApiBackend::Auto) { Ok(cameras) => index < cameras.len(), _ => return false, @@ -113,10 +110,6 @@ impl Cameras { } fn create_camera(index: &CameraIndex) -> ResultType { - // TODO: support more platforms. - #[cfg(not(any(target_os = "linux", target_os = "windows")))] - bail!("This platform doesn't support camera yet"); - let result = Camera::new( index.clone(), RequestedFormat::new::(RequestedFormatType::AbsoluteHighestResolution), @@ -147,13 +140,41 @@ impl Cameras { } } +#[cfg(not(any(target_os = "windows", target_os = "linux")))] +impl Cameras { + pub fn all_info() -> ResultType> { + return Ok(Vec::new()); + } + + pub fn exists(index: usize) -> bool { + false + } + + pub fn get_camera_resolution(index: usize) -> ResultType { + bail!(CAMERA_NOT_SUPPORTED); + } + + pub fn get_sync_cameras() -> Vec { + vec![] + } + + pub fn get_capturer(current: usize) -> ResultType> { + bail!(CAMERA_NOT_SUPPORTED); + } +} + +#[cfg(any(target_os = "windows", target_os = "linux"))] pub struct CameraCapturer { camera: Camera, data: Vec, last_data: Vec, // for faster compare and copy } +#[cfg(not(any(target_os = "windows", target_os = "linux")))] +pub struct CameraCapturer; + impl CameraCapturer { + #[cfg(any(target_os = "windows", target_os = "linux"))] fn new(current: usize) -> ResultType { let index = CameraIndex::Index(current as u32); let camera = Cameras::create_camera(&index)?; @@ -163,9 +184,15 @@ impl CameraCapturer { last_data: Vec::new(), }) } + + #[cfg(not(any(target_os = "windows", target_os = "linux")))] + fn new(_current: usize) -> ResultType { + bail!(CAMERA_NOT_SUPPORTED); + } } impl TraitCapturer for CameraCapturer { + #[cfg(any(target_os = "windows", target_os = "linux"))] fn frame<'a>(&'a mut self, _timeout: std::time::Duration) -> std::io::Result> { // TODO: move this check outside `frame`. if !self.camera.is_stream_open() { @@ -212,6 +239,14 @@ impl TraitCapturer for CameraCapturer { } } + #[cfg(not(any(target_os = "windows", target_os = "linux")))] + fn frame<'a>(&'a mut self, _timeout: std::time::Duration) -> std::io::Result> { + Err(io::Error::new( + io::ErrorKind::Other, + CAMERA_NOT_SUPPORTED.to_string(), + )) + } + #[cfg(windows)] fn is_gdi(&self) -> bool { false diff --git a/libs/scrap/src/common/codec.rs b/libs/scrap/src/common/codec.rs index 662ac02a5..8eb0c1589 100644 --- a/libs/scrap/src/common/codec.rs +++ b/libs/scrap/src/common/codec.rs @@ -864,7 +864,7 @@ pub fn enable_vram_option(encode: bool) -> bool { if encode { enable && enable_directx_capture() } else { - enable + enable && allow_d3d_render() } } else { false @@ -874,10 +874,13 @@ pub fn enable_vram_option(encode: bool) -> bool { #[cfg(windows)] pub fn enable_directx_capture() -> bool { use hbb_common::config::keys::OPTION_ENABLE_DIRECTX_CAPTURE as OPTION; - option2bool( - OPTION, - &Config::get_option(hbb_common::config::keys::OPTION_ENABLE_DIRECTX_CAPTURE), - ) + option2bool(OPTION, &Config::get_option(OPTION)) +} + +#[cfg(windows)] +pub fn allow_d3d_render() -> bool { + use hbb_common::config::keys::OPTION_ALLOW_D3D_RENDER as OPTION; + option2bool(OPTION, &hbb_common::config::LocalConfig::get_option(OPTION)) } pub const BR_BEST: f32 = 1.5; diff --git a/libs/scrap/src/common/mod.rs b/libs/scrap/src/common/mod.rs index 7b8388fbd..af5421973 100644 --- a/libs/scrap/src/common/mod.rs +++ b/libs/scrap/src/common/mod.rs @@ -48,8 +48,9 @@ pub use self::convert::*; pub const STRIDE_ALIGN: usize = 64; // commonly used in libvpx vpx_img_alloc caller pub const HW_STRIDE_ALIGN: usize = 0; // recommended by av_frame_get_buffer -pub mod camera; pub mod aom; +#[cfg(not(any(target_os = "ios")))] +pub mod camera; pub mod record; mod vpx; diff --git a/libs/scrap/src/common/record.rs b/libs/scrap/src/common/record.rs index 628d2d5a3..d121984f1 100644 --- a/libs/scrap/src/common/record.rs +++ b/libs/scrap/src/common/record.rs @@ -25,7 +25,8 @@ pub struct RecorderContext { pub server: bool, pub id: String, pub dir: String, - pub video_service_name: String, + pub display_idx: usize, + pub camera: bool, pub tx: Option>, } @@ -46,7 +47,11 @@ impl RecorderContext2 { + "_" + &ctx.id.clone() + &chrono::Local::now().format("_%Y%m%d%H%M%S%3f_").to_string() - + &format!("{}_", ctx.video_service_name) + + &format!( + "{}{}_", + if ctx.camera { "camera" } else { "display" }, + ctx.display_idx + ) + &self.format.to_string().to_lowercase() + if self.format == CodecFormat::VP9 || self.format == CodecFormat::VP8 diff --git a/src/client.rs b/src/client.rs index 380559bb8..c056a64f3 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1389,14 +1389,15 @@ impl VideoHandler { } /// Start or stop screen record. - pub fn record_screen(&mut self, start: bool, id: String, video_service_name: String) { + pub fn record_screen(&mut self, start: bool, id: String, display_idx: usize, camera: bool) { self.record = false; if start { self.recorder = Recorder::new(RecorderContext { server: false, id, dir: crate::ui_interface::video_save_directory(false), - video_service_name, + display_idx, + camera, tx: None, }) .map_or(Default::default(), |r| Arc::new(Mutex::new(Some(r)))); @@ -2437,14 +2438,7 @@ pub fn start_video_thread( { let mut video_callback = video_callback; let mut last_chroma = None; - let video_service_name = crate::video_service::get_service_name( - if session.is_view_camera() { - crate::video_service::VideoSource::Camera - } else { - crate::video_service::VideoSource::Monitor - }, - display, - ); + let is_view_camera = session.is_view_camera(); std::thread::spawn(move || { #[cfg(windows)] @@ -2487,7 +2481,7 @@ pub fn start_video_thread( let record_permission = session.lc.read().unwrap().record_permission; let id = session.lc.read().unwrap().id.clone(); if record_state && record_permission { - handler.record_screen(true, id, video_service_name.clone()); + handler.record_screen(true, id, display, is_view_camera); } video_handler = Some(handler); } @@ -2568,7 +2562,7 @@ pub fn start_video_thread( MediaData::RecordScreen(start) => { let id = session.lc.read().unwrap().id.clone(); if let Some(handler) = video_handler.as_mut() { - handler.record_screen(start, id, video_service_name.clone()); + handler.record_screen(start, id, display, is_view_camera); } } _ => {} diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index c36b5844d..a8d51990b 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -993,6 +993,7 @@ pub fn main_get_env(key: String) -> SyncReturn { pub fn main_set_local_option(key: String, value: String) { let is_texture_render_key = key.eq(config::keys::OPTION_TEXTURE_RENDER); + let is_d3d_render_key = key.eq(config::keys::OPTION_ALLOW_D3D_RENDER); set_local_option(key, value.clone()); if is_texture_render_key { let session_event = [("v", &value)]; @@ -1002,6 +1003,11 @@ pub fn main_set_local_option(key: String, value: String) { session.ui_handler.update_use_texture_render(); } } + if is_d3d_render_key { + for session in sessions::get_sessions() { + session.update_supported_decodings(); + } + } } // We do use use `main_get_local_option` and `main_set_local_option`. @@ -1650,7 +1656,7 @@ pub fn session_alternative_codecs(session_id: SessionID) -> String { pub fn session_change_prefer_codec(session_id: SessionID) { if let Some(session) = sessions::get_session_by_session_id(&session_id) { - session.change_prefer_codec(); + session.update_supported_decodings(); } } diff --git a/src/lang/ar.rs b/src/lang/ar.rs index c96870b15..0cd8b3e6c 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/be.rs b/src/lang/be.rs index 039bc2e25..5c4907130 100644 --- a/src/lang/be.rs +++ b/src/lang/be.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/bg.rs b/src/lang/bg.rs index 3b6e3171e..b153b0358 100644 --- a/src/lang/bg.rs +++ b/src/lang/bg.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index 746b32e71..7a524f21c 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index bef8122a6..dd8d6d10a 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", "您的远程端不支持查看摄像头。"), ("Enable camera", "允许查看摄像头"), ("No cameras", "没有摄像头"), + ("d3d_render_tip", "当启用 D3D 渲染时,某些机器可能无法显示远程画面。"), + ("Use D3D rendering", "使用 D3D 渲染"), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index 941a8f035..f64a5df23 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 177c040ac..3f8f14cfb 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index 2589a826e..79c04d0a2 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index 13c0889c3..505a211c8 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/en.rs b/src/lang/en.rs index 3b20a5bf2..26754a0a5 100644 --- a/src/lang/en.rs +++ b/src/lang/en.rs @@ -240,5 +240,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("View camera", "View camera"), ("upgrade_remote_rustdesk_client_to_{}_tip", "Please upgrade the RustDesk client to version {} or newer on the remote side!"), ("view_camera_unsupported_tip", "The remote device does not support viewing the camera."), + ("d3d_render_tip", "When D3D rendering is enabled, the remote control screen may be black on some machines."), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 903dad827..22a6c73f5 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index 0c56f95cc..989fda64b 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/et.rs b/src/lang/et.rs index c0ccef343..f4db11cc3 100644 --- a/src/lang/et.rs +++ b/src/lang/et.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/eu.rs b/src/lang/eu.rs index 549399664..5d47f36c7 100644 --- a/src/lang/eu.rs +++ b/src/lang/eu.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index 5db84e9e6..9fc72dc75 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 456dd1d5c..0f01fcd73 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/he.rs b/src/lang/he.rs index acbeae980..b602d91ff 100644 --- a/src/lang/he.rs +++ b/src/lang/he.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hr.rs b/src/lang/hr.rs index b52dbb4db..d9ff9b481 100644 --- a/src/lang/hr.rs +++ b/src/lang/hr.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index 02e53c3a6..1ea2152b5 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index 8dc82ff25..f6fac7053 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index f3bf7b11f..ef5b4b260 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", "Il dispositivo remoto non supporta la visualizzazione della camera."), ("Enable camera", "Abilita camera"), ("No cameras", "Nessuna camera"), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 5daa909c5..bdd9b41b4 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index 2929fa28c..08e27f8af 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index ff5d756c4..b820e2f39 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 9929508c9..97b4a205c 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lv.rs b/src/lang/lv.rs index fe3dce7e8..48e3c2a7e 100644 --- a/src/lang/lv.rs +++ b/src/lang/lv.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nb.rs b/src/lang/nb.rs index 9fb020f4f..73dae6028 100644 --- a/src/lang/nb.rs +++ b/src/lang/nb.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 68b126c5c..a53bd3075 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index e54590818..37e634467 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index e5ef2ca0f..6246bce81 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index 71c8a4803..e7c0ee5d1 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index ae5283e5b..95040f109 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index b79dffe56..310a35ccf 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sc.rs b/src/lang/sc.rs index 4e5e8c76f..5ac42339c 100644 --- a/src/lang/sc.rs +++ b/src/lang/sc.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index eb8f53d81..531ccbf71 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index e4061caed..c3fb9ec4f 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index 5649130fb..3142b2317 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index f4ba4048f..90007d7eb 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index 3809373aa..4493f7ab4 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ta.rs b/src/lang/ta.rs index 2cf3f1c70..87ced6bf7 100644 --- a/src/lang/ta.rs +++ b/src/lang/ta.rs @@ -657,5 +657,12 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Untagged", ""), ("new-version-of-{}-tip", ""), ("Accessible devices", ""), + ("View camera", ""), + ("upgrade_remote_rustdesk_client_to_{}_tip", ""), + ("view_camera_unsupported_tip", ""), + ("Enable camera", ""), + ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index cc9197b5d..ccf3b9bcd 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index 7674d059d..c1b41d2df 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index f7ef7d327..e248898f9 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index b41f6c787..60a3696c9 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", "您的遠端設備不支援查看鏡頭"), ("Enable camera", "允許查看鏡頭"), ("No cameras", "沒有鏡頭"), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/uk.rs b/src/lang/uk.rs index f1f7e76f4..578e889e5 100644 --- a/src/lang/uk.rs +++ b/src/lang/uk.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index d1254960d..61a63f2af 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -662,5 +662,7 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("view_camera_unsupported_tip", ""), ("Enable camera", ""), ("No cameras", ""), + ("d3d_render_tip", ""), + ("Use D3D rendering", ""), ].iter().cloned().collect(); } diff --git a/src/server/video_service.rs b/src/server/video_service.rs index 04f63fe75..508316535 100644 --- a/src/server/video_service.rs +++ b/src/server/video_service.rs @@ -503,6 +503,7 @@ fn run(vs: VideoService) -> ResultType<()> { record_incoming, last_portable_service_running, vs.source, + display_idx, ) { Ok(result) => result, Err(err) => { @@ -522,6 +523,7 @@ fn run(vs: VideoService) -> ResultType<()> { record_incoming, last_portable_service_running, vs.source, + display_idx, )? } }; @@ -791,6 +793,7 @@ fn setup_encoder( record_incoming: bool, last_portable_service_running: bool, source: VideoSource, + display_idx: usize, ) -> ResultType<( Encoder, EncoderCfg, @@ -808,7 +811,7 @@ fn setup_encoder( ); Encoder::set_fallback(&encoder_cfg); let codec_format = Encoder::negotiated_codec(); - let recorder = get_recorder(record_incoming, name); + let recorder = get_recorder(record_incoming, display_idx, source == VideoSource::Camera); let use_i444 = Encoder::use_i444(&encoder_cfg); let encoder = Encoder::new(encoder_cfg.clone(), use_i444)?; Ok((encoder, encoder_cfg, codec_format, use_i444, recorder)) @@ -891,7 +894,11 @@ fn get_encoder_config( } } -fn get_recorder(record_incoming: bool, video_service_name: String) -> Arc>> { +fn get_recorder( + record_incoming: bool, + display_idx: usize, + camera: bool, +) -> Arc>> { #[cfg(windows)] let root = crate::platform::is_root(); #[cfg(not(windows))] @@ -910,7 +917,8 @@ fn get_recorder(record_incoming: bool, video_service_name: String) -> Arc Session { (vp8, av1, h264, h265) } - pub fn change_prefer_codec(&self) { + pub fn update_supported_decodings(&self) { let msg = self.lc.write().unwrap().update_supported_decodings(); self.send(Data::Message(msg)); } pub fn use_texture_render_changed(&self) { self.send(Data::ResetDecoder(None)); - self.change_prefer_codec(); + self.update_supported_decodings(); self.send(Data::Message(LoginConfigHandler::refresh())); }