Skip to main content

Preview & Transport

Locations: src/MovieMakerCore/Preview/ and src/MovieMakerCore/StoryboardManager/Transport/

Two cooperating subsystems turn the project model into moving pictures: the transport decides what plays and when, and the preview renders it.

Preview​

FileRole
PreviewPresenter.cpp/.hOwns the preview surface: D3D11 swap chain management, frame pacing, aspect-ratio-correct presentation
PreviewDataContext.cpp/.hIDispatch data binding for preview UI (transport buttons, time display)

The presenter receives frames from HMRAVSource's TextureInterop (shared D3D11 textures) and composites them through HMREngine's scene graph — overlays (captions, effects) are scene nodes, not separate draws.

A separate module, MovieMakerPreviewClient.dll (src/MovieMakerPreviewClient/), exposes the preview-window communication interface used by the application to interact with an embedded preview pane: window creation/lifecycle, seek + render-single-frame requests, transport control, resize/aspect handling, and snapshot capture. See its module page.

Transport​

Location: src/MovieMakerCore/StoryboardManager/Transport/

ComponentRole
TransportBasePlayback state machine: stopped/playing/paused/scrubbing, rate, position
CommandBinQueue of transport commands (play, pause, seek, rate change) processed in order — enables scrubbing while a seek is in flight
Playback plumbingClock ownership, end-of-media behavior, loop points

The UI's PlaybackController (SundanceApp) issues transport commands; the transport owns the authoritative timeline position and notifies the preview and audio subsystems.

Preserved quirk​

The original contains a null-pointer dereference path in the transport controls (reachable through a specific seek-while-stopped sequence): Quirk #22. It is reproduced faithfully; the contract suite pins the non-crashing paths around it.

Frame flow​