From 3ae4c8810c3dd67d95a2279a8609aaec5469097f Mon Sep 17 00:00:00 2001 From: Yukino Song Date: Mon, 3 Mar 2025 00:44:09 +0800 Subject: [PATCH] Even better frame pacing --- src/rtsp.cpp | 4 +-- src/video.cpp | 23 +++++++++--------- .../windows/drivers/sudovda/SudoVDA.inf | Bin 3648 -> 3648 bytes .../windows/drivers/sudovda/sudovda.cat | Bin 2439 -> 2439 bytes 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/rtsp.cpp b/src/rtsp.cpp index 044de62a..bff8f82a 100644 --- a/src/rtsp.cpp +++ b/src/rtsp.cpp @@ -1005,9 +1005,9 @@ namespace rtsp_stream { config.monitor.enableIntraRefresh = util::from_view(args.at("x-ss-video[0].intraRefresh"sv)); if (config::video.limit_framerate) { - config.monitor.encodingFramerate = (int)ceil(session.fps / 1000); + config.monitor.encodingFramerate = session.fps; } else { - config.monitor.encodingFramerate = config.monitor.framerate; + config.monitor.encodingFramerate = config.monitor.framerate * 1000; } config.monitor.input_only = session.input_only; diff --git a/src/video.cpp b/src/video.cpp index 87e30414..1ccf72a5 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -1901,7 +1901,7 @@ namespace video { // set minimum frame time, avoiding violation of client-requested target framerate auto minimum_frame_time = std::chrono::milliseconds(1000 / std::min(config.framerate, (config::video.min_fps_factor * 10))); - auto frame_threshold = std::chrono::milliseconds(1000 / config.encodingFramerate); + auto frame_threshold = std::chrono::microseconds(1000ms * 1000 / config.encodingFramerate); BOOST_LOG(debug) << "Minimum frame time set to "sv << minimum_frame_time.count() << "ms, based on min fps factor of "sv << config::video.min_fps_factor << "."sv; BOOST_LOG(info) << "Frame threshold: "sv << frame_threshold; @@ -1983,19 +1983,18 @@ namespace video { } else if (!images->running()) { break; } - } - if (frame_timestamp) { - auto frame_diff = *frame_timestamp - next_frame_start; - if (frame_diff < 2ms) { - auto this_frame_timestamp = next_frame_start; - next_frame_start = *frame_timestamp; - frame_timestamp = this_frame_timestamp; - } else if (frame_diff > frame_threshold) { - next_frame_start = *frame_timestamp - frame_threshold / 2; + if (frame_timestamp) { + auto frame_diff = *frame_timestamp - next_frame_start; + + if (frame_diff > frame_threshold) { + next_frame_start = *frame_timestamp - frame_threshold / 2; + } + + frame_timestamp = next_frame_start; + + next_frame_start += frame_threshold; } - - next_frame_start += frame_threshold; } if (encode(frame_nr++, *session, packets, channel_data, frame_timestamp)) { diff --git a/src_assets/windows/drivers/sudovda/SudoVDA.inf b/src_assets/windows/drivers/sudovda/SudoVDA.inf index aee43d78dc37cdef21ce48fcd7a3a0ee9bf40e62..ad3c7d197135f386e9ecc6c0be2582814f43e1ef 100644 GIT binary patch delta 56 zcmX>gb3kUp2}W&W27Lwt1|uM81g1?Hbigb<24f(t$6yMCdJJYjIn&Lb8GU&GEL;hj delta 56 zcmX>gb3kUp2}W%r27Lx21~V{e0A!gm=r9;Em^0`B*_J@k7|gb0Fk!IR{F%|02LLXJ B3AO+L diff --git a/src_assets/windows/drivers/sudovda/sudovda.cat b/src_assets/windows/drivers/sudovda/sudovda.cat index f2af72932b1cc477ded3737b51bc3ac90d7f876f..e985d80f661798095d29da39df7652124e5c84dc 100644 GIT binary patch delta 571 zcmZn{ZWo>qBzN6NNLk^Ak8k Sr;Z%hrqY8krgx8yFcH85y8ZW%(tvs*#dxNJ!VUj?dLvm_h>103Vc1?pOMg|sz z%@(hZ#jSrj^NZ)%4%^T__Q!gB%^2^Wm$|DGHRaPI=~IS{wxtu~Lg@4SqRjI0bS zKxd@inJjay<8|o@k7#uj14R$@Nly|lhnAfDFn?jsxorp51sI+>R`;^9z!>kVDGY@g;6{~4S9^-l8mA@OUs@a62d#eE&d zPo^>XI%~hSh&j3ciuBg)y_TP{A8;!cxtUemVz}VQ#}(E%LS^G2?zoJiJlCU delta 571 zcmZn{ZWo>qB**2>&3(jQ%Wv1uc*Ec}voLX9BU1w-BQpa_BTEybi3MUBO^ggI3S15; zArb%enNqGeFSE3p{VR$yd|l5x|2dKT(-<3zC-fOM-k!Lyb#gtknHwRc22G3{EDGXA zKX1>Sl+!BoDOlulPx|%U^SypaZpqjbzUIi%j0uLelf4;_SrSrY&^VVxq^vd2BW?G^ zrM@4JX|^t(!H{rBUTfmK4r!2F)89DHD6iEOZ#$Okh=1|N#3%BYg<)gMWIx81%~zT0 zS?Zr2WrHI#a{< zjMT@ohox-8GV_?0zHw@GlE0SZ%(T4d&_vx`GcG^OP1xr2w@{9=SZhZt|Dr92mQ47u z)i=O}_4zZQR_|iBte0IGafr