log: add first-frame watchdog breadcrumbs

This commit is contained in:
Godnight1006 2026-01-02 23:10:04 +08:00
parent d41e384f69
commit 5e6ef28f33
3 changed files with 43 additions and 3 deletions

View file

@ -282,8 +282,18 @@ impl<T: InvokeUiSession> Remote<T> {
}
_ = status_timer.tick() => {
if self.watchdog.check(self.is_connected, self.first_frame, self.handler.is_default(), Instant::now()) {
log::warn!("No first video frame received, sending refresh");
let display = self.handler.lc.read().unwrap().peer_info.as_ref().map(|p| p.current_display).unwrap_or(0);
let (id, display) = {
let lch = self.handler.lc.read().unwrap();
let display = lch
.peer_info
.as_ref()
.map(|p| p.current_display)
.unwrap_or(0);
(lch.id.clone(), display)
};
log::warn!(
"No first video frame received, id={id}, display={display}, sending refresh"
);
self.handler.refresh_video(display as _);
}
@ -1292,8 +1302,14 @@ impl<T: InvokeUiSession> Remote<T> {
if let Ok(msg_in) = Message::parse_from_bytes(&data) {
match msg_in.union {
Some(message::Union::VideoFrame(vf)) => {
let display = vf.display as usize;
if !self.first_frame {
self.first_frame = true;
log::info!(
"First video frame received, id={}, display={}",
self.handler.get_id(),
display
);
self.handler.close_success();
self.handler.adapt_size();
self.send_toggle_virtual_display_msg(peer).await;
@ -1301,7 +1317,6 @@ impl<T: InvokeUiSession> Remote<T> {
}
self.video_format = CodecFormat::from(&vf);
let display = vf.display as usize;
if !self.video_threads.contains_key(&display) {
self.new_video_thread(display);
}

View file

@ -3406,6 +3406,12 @@ impl Connection {
}
fn refresh_video_display(&self, display: Option<usize>) {
log::debug!(
"refresh_video_display: conn_id={}, display={:?}, source={:?}",
self.inner.id,
display,
self.video_source()
);
video_service::refresh();
self.server.upgrade().map(|s| {
s.read().unwrap().set_video_service_opt(

View file

@ -650,6 +650,7 @@ fn run(vs: VideoService) -> ResultType<()> {
let repeat_encode_max = 10;
let mut encode_fail_counter = 0;
let mut first_frame = true;
let mut logged_invalid_frame = false;
let capture_width = c.width;
let capture_height = c.height;
let (mut second_instant, mut send_counter) = (Instant::now(), 0);
@ -722,6 +723,24 @@ fn run(vs: VideoService) -> ResultType<()> {
let res = match c.frame(spf) {
Ok(frame) => {
if !frame.valid() {
if !logged_invalid_frame {
logged_invalid_frame = true;
match &frame {
scrap::Frame::PixelBuffer(f) => {
log::debug!(
"capturer returned invalid frame (pixelbuffer), len={}, w={}, h={}, treating as WouldBlock",
f.data().len(),
f.width(),
f.height()
);
}
scrap::Frame::Texture((texture, _)) => {
log::debug!(
"capturer returned invalid frame (texture={texture:?}), treating as WouldBlock"
);
}
}
}
Err(std::io::Error::new(WouldBlock, "empty frame"))
} else {
repeat_encode_counter = 0;