diff --git a/src/api/media_api.rs b/src/api/media_api.rs index 1a4ff99..653f3b6 100644 --- a/src/api/media_api.rs +++ b/src/api/media_api.rs @@ -371,22 +371,24 @@ async fn trace_video( // Build drawtext entries let mut parts: Vec = Vec::new(); + let bh = _height as i32; - // Static header + // Bottom-left info panel (y=h-N positions from bottom up) + // Frame/time at the very bottom parts.push(format!( - "drawtext=text='File UUID: {}':fontsize=14:fontcolor=white:box=1:boxcolor=black@0.6:x=10:y=12", file_uuid + "drawtext=text='Frame: %{{eif:n+{}:d}} Time: %{{eif:(n+{})*100/{}:d}}s':fontsize=14:fontcolor=white:box=1:boxcolor=black@0.6:x=10:y={}", + frame_offset, frame_offset, fps_str, bh - 30 )); parts.push(format!( - "drawtext=text='Cut: {}':fontsize=14:fontcolor=white:box=1:boxcolor=black@0.6:x=10:y=34", cut_id + "drawtext=text='Cut: {}':fontsize=14:fontcolor=white:box=1:boxcolor=black@0.6:x=10:y={}", cut_id, bh - 52 )); parts.push(format!( - "drawtext=text='Frame: %{{eif:n+{}:d}} Time: %{{eif:(n+{})*100/{}:d}}s':fontsize=14:fontcolor=white:box=1:boxcolor=black@0.6:x=10:y=56", - frame_offset, frame_offset, fps_str + "drawtext=text='{}':fontsize=14:fontcolor=white:box=1:boxcolor=black@0.6:x=10:y={}", file_uuid, bh - 74 )); // Per-trace entries: show trace_id, start_frame, identity name - // Position starts at y=78, increments by 22 per trace - let mut y_pos = 78; + // Stack upward from y=bh-96 + let mut y_pos = bh - 96; for (tid, frames) in &sorted_traces { let start = frames.iter().min().unwrap_or(&first_frame); let identity = trace_identity.get(tid).map(|s| s.as_str()).unwrap_or("unknown"); @@ -399,7 +401,7 @@ async fn trace_video( "drawtext=text='{}':fontsize=14:fontcolor=white:box=1:boxcolor=black@0.6:x=10:y={}:enable='{}'", label, y_pos, enable )); - y_pos += 22; + y_pos -= 22; } // Green thin bounding boxes with trace_id label for each face detection