feat(player): add ASR/YOLO overlays, zoom, and text rendering

- Add TTF text rendering for subtitles and YOLO labels
- Implement ASR subtitle display with background
- Add YOLO bbox rendering with class labels
- Add zoom in/out (+/-) and reset (Backquote)
- Add frame/time info display
- Fix YOLO metadata parsing for actual file format
- Add Shift+Arrow for 1-second seek
This commit is contained in:
accusys
2026-03-19 01:33:46 +08:00
parent 0b75987fd0
commit 5587e6a67a
5272 changed files with 103480 additions and 45 deletions

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[]","declared_features":"[]","target":7696406708411863926,"profile":2040997289075261528,"path":10763286916239946207,"deps":[[1479280278558536779,"lru",false,8280055652816195212],[1528297757488249563,"url",false,3789275553791934123],[1935224974094585350,"pulldown_cmark",false,14639571717026889242],[2448563160050429386,"thiserror",false,4225720222042795697],[3715546460119507043,"ffmpeg_sidecar",false,10730071557099294504],[3856126590694406759,"chrono",false,8072339544847677361],[9090870968757484992,"wry",false,2716196519636369841],[10630857666389190470,"log",false,15942340297666847842],[11011321726415696650,"tao",false,15272901693786647509],[12478428894219133322,"anyhow",false,7905132487598833501],[13298363700532491723,"tokio",false,9244217986007907521],[13548984313718623784,"serde",false,6727429238616070922],[13795362694956882968,"serde_json",false,9603251600396073136],[15747444352248327493,"sdl2",false,6730511942152154189],[16891682993831069510,"clap",false,401018388312077705],[16928111194414003569,"dirs",false,917134473047088935],[17325453097244291330,"reqwest",false,8952964505210018466],[17494391072902567403,"env_logger",false,25924056559644562]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/momentry_playground-f7686bde04eb7bb7/dep-lib-momentry_playground","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1,3 @@
{"$message_type":"diagnostic","message":"unused import: `sdl2::pixels::PixelFormatEnum`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/player/renderer.rs","byte_start":50,"byte_end":79,"line_start":4,"line_end":4,"column_start":5,"column_end":34,"is_primary":true,"text":[{"text":"use sdl2::pixels::PixelFormatEnum;","highlight_start":5,"highlight_end":34}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"remove the whole `use` item","code":null,"level":"help","spans":[{"file_name":"src/player/renderer.rs","byte_start":46,"byte_end":81,"line_start":4,"line_end":5,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"use sdl2::pixels::PixelFormatEnum;","highlight_start":1,"highlight_end":35},{"text":"use sdl2::rect::Rect;","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: unused import: `sdl2::pixels::PixelFormatEnum`\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/player/renderer.rs:4:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m4\u001b[0m \u001b[1m\u001b[94m|\u001b[0m use sdl2::pixels::PixelFormatEnum;\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m\n \u001b[1m\u001b[94m= \u001b[0m\u001b[1mnote\u001b[0m: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default\n\n"}
{"$message_type":"diagnostic","message":"field `frame_buffer` is never read","code":{"code":"dead_code","explanation":null},"level":"warning","spans":[{"file_name":"src/player/video.rs","byte_start":445,"byte_end":456,"line_start":25,"line_end":25,"column_start":12,"column_end":23,"is_primary":false,"text":[{"text":"pub struct VideoPlayer {","highlight_start":12,"highlight_end":23}],"label":"field in this struct","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/player/video.rs","byte_start":574,"byte_end":586,"line_start":30,"line_end":30,"column_start":5,"column_end":17,"is_primary":true,"text":[{"text":" frame_buffer: Arc<Mutex<VecDeque<Frame>>>,","highlight_start":5,"highlight_end":17}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null}],"rendered":"\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: field `frame_buffer` is never read\u001b[0m\n \u001b[1m\u001b[94m--> \u001b[0msrc/player/video.rs:30:5\n \u001b[1m\u001b[94m|\u001b[0m\n\u001b[1m\u001b[94m25\u001b[0m \u001b[1m\u001b[94m|\u001b[0m pub struct VideoPlayer {\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[94m-----------\u001b[0m \u001b[1m\u001b[94mfield in this struct\u001b[0m\n\u001b[1m\u001b[94m...\u001b[0m\n\u001b[1m\u001b[94m30\u001b[0m \u001b[1m\u001b[94m|\u001b[0m frame_buffer: Arc<Mutex<VecDeque<Frame>>>,\n \u001b[1m\u001b[94m|\u001b[0m \u001b[1m\u001b[33m^^^^^^^^^^^^\u001b[0m\n \u001b[1m\u001b[94m|\u001b[0m\n \u001b[1m\u001b[94m= \u001b[0m\u001b[1mnote\u001b[0m: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default\n\n"}
{"$message_type":"diagnostic","message":"2 warnings emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"\u001b[1m\u001b[33mwarning\u001b[0m\u001b[1m: 2 warnings emitted\u001b[0m\n\n"}