Repository navigation
Conversation
A live source that paused left the software host's phase at `.playing` over a standing picture: the feeder parked the synchronizer to refill but published nothing, and only the reader's own stall timeout, 20 s later, promoted the source to `.stalled`. A host app watching the clock reloaded the session after 2 s; each fresh join landed the lead behind the same frozen connect burst, so the viewer saw the last four seconds again, three times over, before the feed came back. `SoftwarePlaybackHost.isRebuffering` now follows the pumps' hold (the live feeder's dry ring, the on-demand loop's exhausted audio lead) and the engine folds it into `isBuffering` as it does the audio host's wait, so `playbackPhase` reads `.rebuffering` from the moment the clock stops. A source that resumes by handing its whole backlog over at once also left the picture the length of the pause behind the newest media, on a path that never catches up. The feeder now watches a resume with the join's own rule (`SoftwareLiveJoinPolicy`, from the clock) and, once the backlog has landed, moves the picture up to the join lead behind the newest media through the engine's `.liveRejoin` seek; a source that skipped what it missed is left where it resumed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A live source that pauses for a while no longer leaves the software host's
playbackPhaseat.playingover a standing picture, and a source that comes back by handing its whole backlog over at once no longer leaves the picture the length of the pause behind the newest media.What changed
SoftwarePlaybackHost.isRebuffering(new, published) follows the pumps' hold: the live feeder's dry ring at the edge (AU live tv #107) and the on-demand loop's exhausted audio lead. The engine folds it intoisBufferingexactly as it folds the audio host's wait, soplaybackPhasereads.rebufferingfrom the moment the clock stops. Before, the phase stayed.playinguntil the reader's own stall timeout promoted the source to.stalled, 20 s later. Measured with a host app that tears a session down on a frozen clock: it reloaded after 2 s, and each fresh join landed 4 s behind the same frozen connect burst, so the viewer saw the last seconds again three times over before the feed came back. With the phase published, the host can tell a paused source from a dead session.SoftwareLiveJoinPolicy(from the clock instead of the ring's first packet). A backlog worth skipping moves the picture up to the join lead behind the newest media through the engine's own.liveRejoinseek (SoftwarePlaybackHost.liveResumeCatchUp); a source that skipped what it missed is left where it resumed.architecture.md(playback status, live audio look-ahead),api.md($playbackPhaserow). CHANGELOG under Unreleased › Fixed.Test plan
SoftwareLiveJoinPlacementTests: a backlog handed over at once after a pause is caught up the lead behind the newest media; a source that skipped its backlog stays put.Scripts/check-doc-links.pypasses.Checklist
Scripts/check-doc-links.pypasses