fix qos and add auto_adjust_fps
Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
parent
28ef64cba1
commit
e70f3f2125
@ -663,6 +663,7 @@ message Misc {
|
|||||||
PluginRequest plugin_request = 25;
|
PluginRequest plugin_request = 25;
|
||||||
PluginFailure plugin_failure = 26;
|
PluginFailure plugin_failure = 26;
|
||||||
uint32 full_speed_fps = 27;
|
uint32 full_speed_fps = 27;
|
||||||
|
uint32 auto_adjust_fps = 28;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -535,11 +535,10 @@ pub fn codec_thread_num() -> usize {
|
|||||||
info = format!("cpu loadavg:{}", avg.one);
|
info = format!("cpu loadavg:{}", avg.one);
|
||||||
res = (((max as f64) - avg.one) * 0.5).round() as usize;
|
res = (((max as f64) - avg.one) * 0.5).round() as usize;
|
||||||
}
|
}
|
||||||
res = if res > 0 && res <= max / 2 {
|
res = std::cmp::min(res, max / 2);
|
||||||
res
|
if res == 0 {
|
||||||
} else {
|
res = 1;
|
||||||
std::cmp::max(1, max / 2)
|
}
|
||||||
};
|
|
||||||
// avoid frequent log
|
// avoid frequent log
|
||||||
let log = match THREAD_LOG_TIME.lock().unwrap().clone() {
|
let log = match THREAD_LOG_TIME.lock().unwrap().clone() {
|
||||||
Some(instant) => instant.elapsed().as_secs() > 1,
|
Some(instant) => instant.elapsed().as_secs() > 1,
|
||||||
|
@ -895,7 +895,9 @@ impl<T: InvokeUiSession> Remote<T> {
|
|||||||
}
|
}
|
||||||
// decrease judgement
|
// decrease judgement
|
||||||
let debounce = if decode_fps > 10 { decode_fps / 2 } else { 5 }; // 500ms
|
let debounce = if decode_fps > 10 { decode_fps / 2 } else { 5 }; // 500ms
|
||||||
let should_decrease = len >= debounce && len > ctl.last_queue_size + 5; // exceed debounce or still caching
|
let should_decrease = len >= debounce // exceed debounce
|
||||||
|
&& len > ctl.last_queue_size + 5 // still caching
|
||||||
|
&& !ctl.last_custom_fps.unwrap_or(i32::MAX) < limited_fps as i32; // NOT already set a smaller one
|
||||||
|
|
||||||
// increase judgement
|
// increase judgement
|
||||||
if len <= 1 {
|
if len <= 1 {
|
||||||
@ -919,10 +921,15 @@ impl<T: InvokeUiSession> Remote<T> {
|
|||||||
}
|
}
|
||||||
// send custom fps
|
// send custom fps
|
||||||
let mut misc = Misc::new();
|
let mut misc = Misc::new();
|
||||||
misc.set_option(OptionMessage {
|
if version > hbb_common::get_version_number("1.2.1") {
|
||||||
custom_fps,
|
// avoid confusion with custom image quality fps
|
||||||
..Default::default()
|
misc.set_auto_adjust_fps(custom_fps as _);
|
||||||
});
|
} else {
|
||||||
|
misc.set_option(OptionMessage {
|
||||||
|
custom_fps,
|
||||||
|
..Default::default()
|
||||||
|
});
|
||||||
|
}
|
||||||
let mut msg = Message::new();
|
let mut msg = Message::new();
|
||||||
msg.set_misc(misc);
|
msg.set_misc(misc);
|
||||||
self.sender.send(Data::Message(msg)).ok();
|
self.sender.send(Data::Message(msg)).ok();
|
||||||
|
@ -1940,6 +1940,10 @@ impl Connection {
|
|||||||
.lock()
|
.lock()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.user_full_speed_fps(self.inner.id(), fps),
|
.user_full_speed_fps(self.inner.id(), fps),
|
||||||
|
Some(misc::Union::AutoAdjustFps(fps)) => video_service::VIDEO_QOS
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.user_auto_adjust_fps(self.inner.id(), fps),
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
Some(message::Union::AudioFrame(frame)) => {
|
Some(message::Union::AudioFrame(frame)) => {
|
||||||
|
@ -31,6 +31,7 @@ struct Delay {
|
|||||||
#[derive(Default, Debug, Copy, Clone)]
|
#[derive(Default, Debug, Copy, Clone)]
|
||||||
struct UserData {
|
struct UserData {
|
||||||
full_speed_fps: Option<u32>,
|
full_speed_fps: Option<u32>,
|
||||||
|
auto_adjust_fps: Option<u32>,
|
||||||
custom_fps: Option<u32>,
|
custom_fps: Option<u32>,
|
||||||
quality: Option<(i64, Quality)>, // (time, quality)
|
quality: Option<(i64, Quality)>, // (time, quality)
|
||||||
delay: Option<Delay>,
|
delay: Option<Delay>,
|
||||||
@ -90,11 +91,15 @@ pub enum RefreshType {
|
|||||||
|
|
||||||
impl VideoQoS {
|
impl VideoQoS {
|
||||||
pub fn spf(&self) -> Duration {
|
pub fn spf(&self) -> Duration {
|
||||||
Duration::from_secs_f32(1. / (self.fps as f32))
|
Duration::from_secs_f32(1. / (self.fps() as f32))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fps(&self) -> u32 {
|
pub fn fps(&self) -> u32 {
|
||||||
self.fps
|
if self.fps >= MIN_FPS && self.fps <= MAX_FPS {
|
||||||
|
self.fps
|
||||||
|
} else {
|
||||||
|
FPS
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn store_bitrate(&mut self, bitrate: u32) {
|
pub fn store_bitrate(&mut self, bitrate: u32) {
|
||||||
@ -118,6 +123,12 @@ impl VideoQoS {
|
|||||||
let user_fps = |u: &UserData| {
|
let user_fps = |u: &UserData| {
|
||||||
// full_speed_fps
|
// full_speed_fps
|
||||||
let mut fps = u.full_speed_fps.unwrap_or_default() * 9 / 10;
|
let mut fps = u.full_speed_fps.unwrap_or_default() * 9 / 10;
|
||||||
|
// auto adjust fps
|
||||||
|
if let Some(auto_adjust_fps) = u.auto_adjust_fps {
|
||||||
|
if fps == 0 || auto_adjust_fps < fps {
|
||||||
|
fps = auto_adjust_fps;
|
||||||
|
}
|
||||||
|
}
|
||||||
// custom_fps
|
// custom_fps
|
||||||
if let Some(custom_fps) = u.custom_fps {
|
if let Some(custom_fps) = u.custom_fps {
|
||||||
if fps == 0 || custom_fps < fps {
|
if fps == 0 || custom_fps < fps {
|
||||||
@ -128,7 +139,7 @@ impl VideoQoS {
|
|||||||
if let Some(delay) = u.delay {
|
if let Some(delay) = u.delay {
|
||||||
fps = match delay.state {
|
fps = match delay.state {
|
||||||
DelayState::Normal => fps,
|
DelayState::Normal => fps,
|
||||||
DelayState::LowDelay => fps,
|
DelayState::LowDelay => fps * 3 / 4,
|
||||||
DelayState::HighDelay => fps / 2,
|
DelayState::HighDelay => fps / 2,
|
||||||
DelayState::Broken => fps / 4,
|
DelayState::Broken => fps / 4,
|
||||||
}
|
}
|
||||||
@ -181,7 +192,11 @@ impl VideoQoS {
|
|||||||
if delay != DelayState::Normal {
|
if delay != DelayState::Normal {
|
||||||
match self.quality {
|
match self.quality {
|
||||||
Quality::Best => {
|
Quality::Best => {
|
||||||
quality = Quality::Balanced;
|
quality = if delay == DelayState::Broken {
|
||||||
|
Quality::Low
|
||||||
|
} else {
|
||||||
|
Quality::Balanced
|
||||||
|
};
|
||||||
}
|
}
|
||||||
Quality::Balanced => {
|
Quality::Balanced => {
|
||||||
quality = Quality::Low;
|
quality = Quality::Low;
|
||||||
@ -259,6 +274,21 @@ impl VideoQoS {
|
|||||||
self.refresh(None);
|
self.refresh(None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn user_auto_adjust_fps(&mut self, id: i32, fps: u32) {
|
||||||
|
if let Some(user) = self.users.get_mut(&id) {
|
||||||
|
user.auto_adjust_fps = Some(fps);
|
||||||
|
} else {
|
||||||
|
self.users.insert(
|
||||||
|
id,
|
||||||
|
UserData {
|
||||||
|
auto_adjust_fps: Some(fps),
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
self.refresh(None);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn user_image_quality(&mut self, id: i32, image_quality: i32) {
|
pub fn user_image_quality(&mut self, id: i32, image_quality: i32) {
|
||||||
// https://github.com/rustdesk/rustdesk/blob/d716e2b40c38737f1aa3f16de0dec67394a6ac68/src/server/video_service.rs#L493
|
// https://github.com/rustdesk/rustdesk/blob/d716e2b40c38737f1aa3f16de0dec67394a6ac68/src/server/video_service.rs#L493
|
||||||
let convert_quality = |q: i32| {
|
let convert_quality = |q: i32| {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user