From 96b8dc00956c8a1c097ac1dc194a4c43d997cb1b Mon Sep 17 00:00:00 2001 From: Amirhossein Akhlaghpour Date: Sat, 2 May 2026 14:11:59 +0330 Subject: [PATCH] fix: gate recording on decode success --- src/client.rs | 96 +++++++++++++++++++++++++-------------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/src/client.rs b/src/client.rs index c922d5908..be5c19ef3 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1617,58 +1617,57 @@ impl VideoHandler { chroma, ) }; - if res.as_ref().is_ok_and(|x| *x) { - self.fail_counter = 0; - } else { - if self.fail_counter < usize::MAX { - if self.first_frame && self.fail_counter < MAX_DECODE_FAIL_COUNTER { - log::error!("decode first frame failed"); - self.fail_counter = MAX_DECODE_FAIL_COUNTER; - } else { - self.fail_counter += 1; - } - log::error!( - "Failed to handle video frame, fail counter: {}", - self.fail_counter - ); - } - } - self.first_frame = false; - if self.record { - let (w, h) = if *pixelbuffer { - (self.rgb.w, self.rgb.h) - } else { - (self.texture.w, self.texture.h) - }; - if let Some(tx) = self.record_tx.as_ref() { - use std::sync::mpsc::TrySendError; - if let Some(frame) = vf.union.take() { - match tx.try_send(RecordTask::Frame { frame, w, h }) { - Ok(()) => {} - Err(TrySendError::Full(_task)) => { - // Drop frames if recorder can't keep up (e.g. slow network share). - if !self.record_drop_logged { - self.record_drop_logged = true; - log::warn!( - "recording is falling behind; dropping frames to keep rendering responsive" - ); - } - } - Err(TrySendError::Disconnected(_task)) => { - if !self.record_send_err_logged { - self.record_send_err_logged = true; - log::warn!( - "recording worker disconnected, stop recording frames" - ); - } - self.record = false; - self.record_tx = None; - } + let decode_ok = res.as_ref().is_ok_and(|x| *x); + if decode_ok { + self.fail_counter = 0; + } else if self.fail_counter < usize::MAX { + if self.first_frame && self.fail_counter < MAX_DECODE_FAIL_COUNTER { + log::error!("decode first frame failed"); + self.fail_counter = MAX_DECODE_FAIL_COUNTER; + } else { + self.fail_counter += 1; + } + log::error!( + "Failed to handle video frame, fail counter: {}", + self.fail_counter + ); + } + self.first_frame = false; + if decode_ok && self.record { + let (w, h) = if *pixelbuffer { + (self.rgb.w, self.rgb.h) + } else { + (self.texture.w, self.texture.h) + }; + if let Some(tx) = self.record_tx.as_ref() { + use std::sync::mpsc::TrySendError; + if let Some(frame) = vf.union.take() { + match tx.try_send(RecordTask::Frame { frame, w, h }) { + Ok(()) => {} + Err(TrySendError::Full(_task)) => { + // Drop frames if recorder can't keep up (e.g. slow network share). + if !self.record_drop_logged { + self.record_drop_logged = true; + log::warn!( + "recording is falling behind; dropping frames to keep rendering responsive" + ); } } + Err(TrySendError::Disconnected(_task)) => { + if !self.record_send_err_logged { + self.record_send_err_logged = true; + log::warn!( + "recording worker disconnected, stop recording frames" + ); + } + self.record = false; + self.record_tx = None; + } } } - res + } + } + res } /// Reset the decoder, change format if it is Some @@ -1715,6 +1714,7 @@ impl VideoHandler { RecordTask::Frame { frame, w, h } => { if let Err(e) = recorder.write_frame(&frame, w, h) { log::error!("recording write_frame failed: {e}"); + break; } } }