feat(media): add a video file layer that decodes into the scene
TASK 21's picker slice: the decoder, manager, pacing and loop mechanism were
already shipped but nothing ever acquired a session, so a media Source rendered
nothing. Adds "Video File" to the (+) menu (video-filtered OpenFileDialog),
one decode session per distinct path with a HasSession guard, release when the
last scene reference goes, and a post-load reconcile. Loop is a manager-level
per-path answer ("any live reference loops") applied before StartAsync and
updated live via SetLooping. Properties panel shows the file with Change… and
Loop. Volume stays unwired: media audio rides the desktop loopback, TRAX-style.
Reference: OBS's media source (file → decode → composite into the scene) is the
established answer for this feature; the lifecycle shape mirrors this repo's
WebView2/ScreenCapture registration rather than inventing a new one.
Test: ytLive.Tests/MediaSourceAcquisitionTests.cs — add starts one decoder and
frames reach the layer, loop flip reaches the decoder, remove stops it.
Docs: task-21 closed, TASKS row + Day-4 row + stale 3·17 row corrected,
frame-pipeline acquisition note, HANDOFF rewritten. verify.sh green.
This commit is contained in:
+11
-10
@@ -1,19 +1,18 @@
|
||||
# HANDOFF — 2026-11-04 (TASK 3·17 — static text layers)
|
||||
# HANDOFF — 2026-11-05 (TASK 21 — video file layer)
|
||||
|
||||
## State
|
||||
|
||||
- `main`; TASK 53 is complete and TASK 3·17 is complete in three commits: `60c4a00`, `58eb640`,
|
||||
and the final output/compositing phase.
|
||||
- Text layers persist independently, edit as static multiline text, and share one cached raster between
|
||||
preview and output. The frame pump only reads the raster cache; no WPF render occurs on its thread.
|
||||
- The app clean build has 0 warnings. 524 tests passed with the documented physical mouse-injection test
|
||||
and known audio test excluded; the new text renderer, preview/output, and pump-cache tests pass.
|
||||
- The four stray `Assets/llamacasty-*` exports were deleted 2026-11-04 — unreferenced by the csproj,
|
||||
XAML or scripts (recipe in `MyMistakes.md`).
|
||||
- `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.
|
||||
- Volume is deliberately unwired: media audio rides the desktop loopback, so a slider would do nothing.
|
||||
|
||||
## Next action
|
||||
|
||||
- Next action: select the next queued task from `TASKS.md`.
|
||||
- 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
|
||||
@@ -21,4 +20,6 @@
|
||||
- `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"`).
|
||||
|
||||
Reference in New Issue
Block a user