mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-04-01 01:21:06 +03:00
view camera (#11040)
* view camera Signed-off-by: 21pages <sunboeasy@gmail.com> * `No cameras` prompt if no cameras available, `peerGetSessionsCount` use connType as parameter Signed-off-by: 21pages <sunboeasy@gmail.com> * fix, use video_service_name rather than display_idx as key in qos,etc Signed-off-by: 21pages <sunboeasy@gmail.com> --------- Signed-off-by: 21pages <sunboeasy@gmail.com> Co-authored-by: Adwin White <adwinw01@gmail.com> Co-authored-by: RustDesk <71636191+rustdesk@users.noreply.github.com>
This commit is contained in:
@@ -24,9 +24,11 @@ use hbb_common::{
|
||||
sodiumoxide::crypto::{box_, sign},
|
||||
timeout, tokio, ResultType, Stream,
|
||||
};
|
||||
use scrap::camera;
|
||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||
use service::ServiceTmpl;
|
||||
use service::{EmptyExtraFieldService, GenericService, Service, Subscriber};
|
||||
use video_service::VideoSource;
|
||||
|
||||
use crate::ipc::Data;
|
||||
|
||||
@@ -76,7 +78,6 @@ const CONFIG_SYNC_INTERVAL_SECS: f32 = 0.3;
|
||||
|
||||
lazy_static::lazy_static! {
|
||||
pub static ref CHILD_PROCESS: Childs = Default::default();
|
||||
pub static ref CONN_COUNT: Arc<Mutex<usize>> = Default::default();
|
||||
// A client server used to provide local services(audio, video, clipboard, etc.)
|
||||
// for all initiative connections.
|
||||
//
|
||||
@@ -279,22 +280,53 @@ async fn create_relay_connection_(
|
||||
|
||||
impl Server {
|
||||
fn is_video_service_name(name: &str) -> bool {
|
||||
name.starts_with(video_service::NAME)
|
||||
name.starts_with(VideoSource::Monitor.service_name_prefix())
|
||||
|| name.starts_with(VideoSource::Camera.service_name_prefix())
|
||||
}
|
||||
|
||||
pub fn try_add_primary_camera_service(&mut self) {
|
||||
if !camera::primary_camera_exists() {
|
||||
return;
|
||||
}
|
||||
let primary_camera_name =
|
||||
video_service::get_service_name(VideoSource::Camera, camera::PRIMARY_CAMERA_IDX);
|
||||
if !self.contains(&primary_camera_name) {
|
||||
self.add_service(Box::new(video_service::new(
|
||||
VideoSource::Camera,
|
||||
camera::PRIMARY_CAMERA_IDX,
|
||||
)));
|
||||
}
|
||||
}
|
||||
|
||||
pub fn try_add_primay_video_service(&mut self) {
|
||||
let primary_video_service_name =
|
||||
video_service::get_service_name(*display_service::PRIMARY_DISPLAY_IDX);
|
||||
let primary_video_service_name = video_service::get_service_name(
|
||||
VideoSource::Monitor,
|
||||
*display_service::PRIMARY_DISPLAY_IDX,
|
||||
);
|
||||
if !self.contains(&primary_video_service_name) {
|
||||
self.add_service(Box::new(video_service::new(
|
||||
VideoSource::Monitor,
|
||||
*display_service::PRIMARY_DISPLAY_IDX,
|
||||
)));
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_camera_connection(&mut self, conn: ConnInner) {
|
||||
if camera::primary_camera_exists() {
|
||||
let primary_camera_name =
|
||||
video_service::get_service_name(VideoSource::Camera, camera::PRIMARY_CAMERA_IDX);
|
||||
if let Some(s) = self.services.get(&primary_camera_name) {
|
||||
s.on_subscribe(conn.clone());
|
||||
}
|
||||
}
|
||||
self.connections.insert(conn.id(), conn);
|
||||
}
|
||||
|
||||
pub fn add_connection(&mut self, conn: ConnInner, noperms: &Vec<&'static str>) {
|
||||
let primary_video_service_name =
|
||||
video_service::get_service_name(*display_service::PRIMARY_DISPLAY_IDX);
|
||||
let primary_video_service_name = video_service::get_service_name(
|
||||
VideoSource::Monitor,
|
||||
*display_service::PRIMARY_DISPLAY_IDX,
|
||||
);
|
||||
for s in self.services.values() {
|
||||
let name = s.name();
|
||||
if Self::is_video_service_name(&name) && name != primary_video_service_name {
|
||||
@@ -307,7 +339,6 @@ impl Server {
|
||||
#[cfg(target_os = "macos")]
|
||||
self.update_enable_retina();
|
||||
self.connections.insert(conn.id(), conn);
|
||||
*CONN_COUNT.lock().unwrap() = self.connections.len();
|
||||
}
|
||||
|
||||
pub fn remove_connection(&mut self, conn: &ConnInner) {
|
||||
@@ -315,7 +346,6 @@ impl Server {
|
||||
s.on_unsubscribe(conn.id());
|
||||
}
|
||||
self.connections.remove(&conn.id());
|
||||
*CONN_COUNT.lock().unwrap() = self.connections.len();
|
||||
#[cfg(target_os = "macos")]
|
||||
self.update_enable_retina();
|
||||
}
|
||||
@@ -361,10 +391,15 @@ impl Server {
|
||||
self.id_count
|
||||
}
|
||||
|
||||
pub fn set_video_service_opt(&self, display: Option<usize>, opt: &str, value: &str) {
|
||||
pub fn set_video_service_opt(
|
||||
&self,
|
||||
display: Option<(VideoSource, usize)>,
|
||||
opt: &str,
|
||||
value: &str,
|
||||
) {
|
||||
for (k, v) in self.services.iter() {
|
||||
if let Some(display) = display {
|
||||
if k != &video_service::get_service_name(display) {
|
||||
if let Some((source, display)) = display {
|
||||
if k != &video_service::get_service_name(source, display) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -392,13 +427,14 @@ impl Server {
|
||||
fn capture_displays(
|
||||
&mut self,
|
||||
conn: ConnInner,
|
||||
source: VideoSource,
|
||||
displays: &[usize],
|
||||
include: bool,
|
||||
exclude: bool,
|
||||
) {
|
||||
let displays = displays
|
||||
.iter()
|
||||
.map(|d| video_service::get_service_name(*d))
|
||||
.map(|d| video_service::get_service_name(source, *d))
|
||||
.collect::<Vec<_>>();
|
||||
let keys = self.services.keys().cloned().collect::<Vec<_>>();
|
||||
for name in keys.iter() {
|
||||
|
||||
Reference in New Issue
Block a user