28 lines
1.5 KiB
Markdown
28 lines
1.5 KiB
Markdown
# HANDOFF — 2026-11-05 (TASK 21 — video file layer)
|
|
|
|
## State
|
|
|
|
- `main`; TASK 21 is complete: a video file added from the (+) menu decodes, composites into preview
|
|
and stream, loops on toggle, and stops with its last scene reference. 3·17 (text layers) completed
|
|
2026-11-04.
|
|
- New test `MediaSourceAcquisitionTests` (add → one decoder starts + frames reach the layer + loop flip
|
|
reaches the decoder + remove → stops). App build is 0 warnings.
|
|
- **Media is picture-only:** `MediaVideoSource` decodes with `-an`, so a video file's own soundtrack
|
|
is silent on stream — the loopback does not carry it because nothing plays it. Two routes recorded
|
|
in `task-21` item 10 (alert-style mixer feed vs TRAX-style local play); no volume slider until one exists.
|
|
|
|
## Next action
|
|
|
|
- Next queued unit: TASK 49 (chat profanity filter). Day 3's TASK 32/33 resilience slices are still
|
|
outstanding — 32·4 (fragmented MP4) is the smallest.
|
|
- Do not push absent a checkpoint request.
|
|
|
|
## Landmines
|
|
|
|
- `LayerReorderPersistenceTests.RealMouseDrag_OnTheLayerList_PersistsTheReorder` injects physical
|
|
mouse input. Do not run it while the desktop is in use.
|
|
- Integration tests constructing `MainWindow` must set a temporary `LayoutPathOverride` and clear it in `finally`.
|
|
- Media sessions are keyed per **path**, not per layer: acquire through `EnsureMediaSession`, release
|
|
through `ReleaseMediaIfUnused`, never `AcquireAsync` twice for one path.
|
|
- Bundled FFmpeg stays outside the single-file exe (`ExcludeFromSingleFile="true"`).
|