mirror of
https://github.com/weyne85/rustdesk.git
synced 2025-10-29 17:00:05 +00:00
@@ -1,5 +1,5 @@
|
||||
use crate::client::*;
|
||||
use flutter_rust_bridge::StreamSink;
|
||||
use flutter_rust_bridge::{StreamSink, ZeroCopyBuffer};
|
||||
use hbb_common::{
|
||||
allow_err,
|
||||
compress::decompress,
|
||||
@@ -24,7 +24,8 @@ use std::{
|
||||
|
||||
lazy_static::lazy_static! {
|
||||
static ref SESSION: Arc<RwLock<Option<Session>>> = Default::default();
|
||||
pub static ref EVENT_STREAM: RwLock<Option<StreamSink<String>>> = Default::default(); // rust to dart channel
|
||||
pub static ref EVENT_STREAM: RwLock<Option<StreamSink<String>>> = Default::default(); // rust to dart event channel
|
||||
pub static ref RGBA_STREAM: RwLock<Option<StreamSink<ZeroCopyBuffer<Vec<u8>>>>> = Default::default(); // rust to dart rgba (big u8 list) channel
|
||||
}
|
||||
|
||||
#[derive(Clone, Default)]
|
||||
@@ -33,7 +34,6 @@ pub struct Session {
|
||||
sender: Arc<RwLock<Option<mpsc::UnboundedSender<Data>>>>,
|
||||
lc: Arc<RwLock<LoginConfigHandler>>,
|
||||
events2ui: Arc<RwLock<VecDeque<String>>>,
|
||||
rgba: Arc<RwLock<Option<Vec<u8>>>>,
|
||||
}
|
||||
|
||||
impl Session {
|
||||
@@ -89,14 +89,6 @@ impl Session {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn rgba() -> Option<Vec<u8>> {
|
||||
if let Some(session) = SESSION.read().unwrap().as_ref() {
|
||||
session.rgba.write().unwrap().take()
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub fn pop_event() -> Option<String> {
|
||||
if let Some(session) = SESSION.read().unwrap().as_ref() {
|
||||
session.events2ui.write().unwrap().pop_front()
|
||||
@@ -607,8 +599,11 @@ impl Connection {
|
||||
if !self.first_frame {
|
||||
self.first_frame = true;
|
||||
}
|
||||
if let Ok(true) = self.video_handler.handle_frame(vf) {
|
||||
*self.session.rgba.write().unwrap() = Some(self.video_handler.rgb.clone());
|
||||
if let (Ok(true), Some(s)) = (
|
||||
self.video_handler.handle_frame(vf),
|
||||
RGBA_STREAM.read().unwrap().as_ref(),
|
||||
) {
|
||||
s.add(ZeroCopyBuffer(self.video_handler.rgb.clone()));
|
||||
}
|
||||
}
|
||||
Some(message::Union::hash(hash)) => {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use crate::client::file_trait::FileManager;
|
||||
use crate::mobile::connection_manager::{self, get_clients_length, get_clients_state};
|
||||
use crate::mobile::{self, make_fd_to_json, Session};
|
||||
use flutter_rust_bridge::StreamSink;
|
||||
use flutter_rust_bridge::{StreamSink, ZeroCopyBuffer};
|
||||
use hbb_common::ResultType;
|
||||
use hbb_common::{
|
||||
config::{self, Config, LocalConfig, PeerConfig, ONLINE},
|
||||
@@ -40,6 +40,11 @@ pub fn start_event_stream(s: StreamSink<String>) -> ResultType<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn start_rgba_stream(s: StreamSink<ZeroCopyBuffer<Vec<u8>>>) -> ResultType<()> {
|
||||
let _ = mobile::RGBA_STREAM.write().unwrap().insert(s);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn get_by_name(name: *const c_char, arg: *const c_char) -> *const c_char {
|
||||
let mut res = "".to_owned();
|
||||
@@ -359,7 +364,7 @@ unsafe extern "C" fn set_by_name(name: *const c_char, value: *const c_char) {
|
||||
m.get("file_num"),
|
||||
m.get("need_override"),
|
||||
m.get("remember"),
|
||||
m.get("is_upload")
|
||||
m.get("is_upload"),
|
||||
) {
|
||||
Session::set_confirm_override_file(
|
||||
id.parse().unwrap_or(0),
|
||||
@@ -507,44 +512,6 @@ unsafe extern "C" fn set_by_name(name: *const c_char, value: *const c_char) {
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
struct RgbaFrame {
|
||||
len: u32,
|
||||
data: *mut u8,
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn get_rgba() -> *mut RgbaFrame {
|
||||
if let Some(mut vec) = Session::rgba() {
|
||||
if vec.is_empty() {
|
||||
return std::ptr::null_mut();
|
||||
}
|
||||
assert!(vec.len() == vec.capacity());
|
||||
vec.shrink_to_fit();
|
||||
let data = vec.as_mut_ptr();
|
||||
let len = vec.len();
|
||||
std::mem::forget(vec);
|
||||
Box::into_raw(Box::new(RgbaFrame {
|
||||
len: len as _,
|
||||
data,
|
||||
}))
|
||||
} else {
|
||||
std::ptr::null_mut()
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn free_rgba(f: *mut RgbaFrame) {
|
||||
if f.is_null() {
|
||||
return;
|
||||
}
|
||||
unsafe {
|
||||
let len = (*f).len as usize;
|
||||
drop(Vec::from_raw_parts((*f).data, len, len));
|
||||
Box::from_raw(f);
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "android")]
|
||||
pub mod server_side {
|
||||
use hbb_common::{config::Config, log};
|
||||
|
||||
Reference in New Issue
Block a user