From 9007e46b9f5288aff42bd7a34fe96787d38b8f78 Mon Sep 17 00:00:00 2001 From: Accusys Date: Thu, 14 May 2026 00:14:52 +0800 Subject: [PATCH] fix: trace video bbox no longer extends beyond last detection --- src/api/media_api.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/api/media_api.rs b/src/api/media_api.rs index b37a147..2b50033 100644 --- a/src/api/media_api.rs +++ b/src/api/media_api.rs @@ -305,17 +305,19 @@ async fn trace_video( .unwrap_or(2.0); let duration = (last_frame - first_frame) as f64 / fps + padding * 2.0; let seek = (start_sec - padding).max(0.0); + let total_frames = (duration * fps).round() as i32; + let pad_frames = (padding * fps) as i32; // Build filters: bbox+drawtext (1 filter + 1 drawtext per detection) let mut parts: Vec = Vec::new(); for (i, (frame, x, y, w, h)) in rows.iter().enumerate() { - let next_frame = if i + 1 < rows.len() { - rows[i + 1].0 + let start_off = frame - first_frame + pad_frames; + // End at next detection, or at the last frame of the video (not beyond) + let end_off = if i + 1 < rows.len() { + rows[i + 1].0 - first_frame + pad_frames } else { - last_frame + (padding * fps) as i32 + total_frames // last bbox ends with video, no extra padding }; - let start_offset = frame - first_frame + (padding * fps) as i32; - let end_offset = next_frame - first_frame + (padding * fps) as i32; // Bbox parts.push(format!( "drawbox=x={}:y={}:w={}:h={}:color=red@0.8:thickness=8:enable='between(n,{},{})'", @@ -323,13 +325,13 @@ async fn trace_video( y, w, h, - start_offset, - end_offset - 1 + start_off, + end_off - 1 )); // Text label (drawtext, 1 filter vs ~175 bitmap drawboxes) parts.push(format!( "drawtext=text='{}':x={}:y={}:fontsize=20:fontcolor=white:box=1:boxcolor=red@0.8:enable='between(n,{},{})'", - trace_id, x + 4, y + 4, start_offset, end_offset - 1 + trace_id, x + 4, y + 4, start_off, end_off - 1 )); }