Forward playback-rate range the engine accepts. Reverse playback needs a
backwards decode strategy the runtime does not have, so zero and negative
rates are refused rather than approximated.
MAX is an API bound, not a promise that every source plays smoothly there.
Sustaining rate r means decoding r x nativeFps frames a second, and the
decode-ahead cushion is fixed at PLAYBACK.READ_AHEAD_CANVAS frames (raising it
would outrun the CanvasSink pool and tear), so how high a given source really
goes is a property of that source's frame size and encode. The engine measures
it instead of guessing: DiagnosticsSnapshot carries the commanded rate beside
the presented one, and PLAYBACK_RATE_NOT_SUSTAINED fires when they diverge.
SUSTAINED_SHORTFALL is the share of the commanded rate the presented one has
to hold to count as sustained.
Forward playback-rate range the engine accepts. Reverse playback needs a backwards decode strategy the runtime does not have, so zero and negative rates are refused rather than approximated.
MAX is an API bound, not a promise that every source plays smoothly there. Sustaining rate r means decoding r x nativeFps frames a second, and the decode-ahead cushion is fixed at PLAYBACK.READ_AHEAD_CANVAS frames (raising it would outrun the CanvasSink pool and tear), so how high a given source really goes is a property of that source's frame size and encode. The engine measures it instead of guessing: DiagnosticsSnapshot carries the commanded rate beside the presented one, and PLAYBACK_RATE_NOT_SUSTAINED fires when they diverge. SUSTAINED_SHORTFALL is the share of the commanded rate the presented one has to hold to count as sustained.