RUNE-1011: Story Rune Export Video Source Proposed
Summary
The legacy export-source adapter path is gone. Story export drives StoryPlayback directly and hands frames to IMediaEncoder through StoryRenderTrack, Story's IVideoTrack adapter over baked playback.
Architecture
StoryPlayback is the low-level seek + render adapter over a baked StoryScene/StoryBakedTimeline. It owns the RuneContext, owns the render surface only for offscreen playback it creates itself, can also bind to a caller-owned surface, submits baked snapshots, updates dynamic source-video sprite frames through StoryVideoRuntime, and renders requested story times. Export orchestration chooses frame times, seeks playback, renders, and packages each frame as a VideoSample backed by Rune.Image. Backends MAY still use StoryPlayback.ReadPixels internally when a CPU encode path is required.
Current Boundary
RuneStory.Bake(engine, StoryBakeOptions?)produces the bakedStorySceneandStoryBakedTimeline; playback does not execute actions or bake.StorySceneandStoryBakedTimelineown baked snapshot lifetime, andStoryExportRequest.EngineMUST be the same engine used during bake so snapshotResourceSlots remain valid.StoryPlayback.RenderFrame(time)updates live source-video textures throughStoryVideoRuntimeimmediately beforeengine.RenderFrame.StoryExportercreatesStoryRenderTrackand optionalAudioBufferTrack, then hands them to the caller-providedIMediaEncoder.story frame, cue export, preview, and live preview reuse the same bakedStoryPlaybackseek/render core with different orchestration.
Boundaries
The Story layer bakes scene snapshots and renders them on demand. It does not own container assembly or backend-specific transport details beyond producing timestamped frames for the media pipeline.
Rationale
The unified StoryPlayback model removes the older export-source duplication. Export and preview share one seek-and-render core; only orchestration and frame consumers differ.