fix: trace video bbox no longer extends beyond last detection
This commit is contained in:
@@ -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<String> = 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
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user