Skip to content

Commit

Permalink
Align live audio and subtitle playlists with main playlist after main…
Browse files Browse the repository at this point in the history
… is loaded

Resync subs when there no fragment can be found to load in live
#3987
  • Loading branch information
Rob Walch committed Jun 4, 2021
1 parent 79b8714 commit d7e26ec
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 47 deletions.
26 changes: 5 additions & 21 deletions src/controller/audio-stream-controller.ts
Expand Up @@ -411,24 +411,7 @@ class AudioStreamController
}

onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData) {
if (this.mainDetails === null) {
const mainDetails = (this.mainDetails = data.details);
// compute start position if we haven't already
const trackId = this.levelLastLoaded;
if (
trackId !== null &&
this.levels &&
this.startPosition === -1 &&
mainDetails.live
) {
const track = this.levels[trackId];
if (!track.details || !track.details.fragments[0]) {
return;
}
alignPDT(track.details, mainDetails);
this.setStartPosition(track.details, track.details.fragments[0].start);
}
}
this.mainDetails = data.details;
}

onAudioTrackLoaded(event: Events.AUDIO_TRACK_LOADED, data: TrackLoadedData) {
Expand All @@ -445,18 +428,19 @@ class AudioStreamController
const track = levels[trackId];
let sliding = 0;
if (newDetails.live || track.details?.live) {
const mainDetails = this.mainDetails;
if (!newDetails.fragments[0]) {
newDetails.deltaUpdateFailed = true;
}
if (newDetails.deltaUpdateFailed) {
if (newDetails.deltaUpdateFailed || !mainDetails) {
return;
}
if (
!track.details &&
newDetails.hasProgramDateTime &&
this.mainDetails?.hasProgramDateTime
mainDetails.hasProgramDateTime
) {
alignPDT(newDetails, this.mainDetails);
alignPDT(newDetails, mainDetails);
sliding = newDetails.fragments[0].start;
} else {
sliding = this.alignPlaylists(newDetails, track.details);
Expand Down
55 changes: 29 additions & 26 deletions src/controller/subtitle-stream-controller.ts
Expand Up @@ -93,18 +93,7 @@ export class SubtitleStreamController
}

onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData) {
const mainDetails = data.details;
if (this.mainDetails === null) {
const trackId = this.levelLastLoaded;
if (trackId !== null && this.levels && mainDetails.live) {
const track = this.levels[trackId];
if (!track.details || !track.details.fragments[0]) {
return;
}
alignPDT(track.details, mainDetails);
}
}
this.mainDetails = mainDetails;
this.mainDetails = data.details;
}

onSubtitleFragProcessed(
Expand Down Expand Up @@ -255,21 +244,17 @@ export class SubtitleStreamController
}
this.mediaBuffer = this.mediaBufferTimeRanges;
if (newDetails.live || track.details?.live) {
if (newDetails.deltaUpdateFailed) {
const mainDetails = this.mainDetails;
if (newDetails.deltaUpdateFailed || !mainDetails) {
return;
}
const mainDetails = this.mainDetails;
const mainSlidingStartFragment = mainDetails
? mainDetails.fragments[0]
: null;
const mainSlidingStartFragment = mainDetails.fragments[0];
if (!track.details) {
if (mainDetails) {
if (newDetails.hasProgramDateTime && mainDetails.hasProgramDateTime) {
alignPDT(newDetails, mainDetails);
} else if (mainSlidingStartFragment) {
// line up live playlist with main so that fragments in range are loaded
addSliding(newDetails, mainSlidingStartFragment.start);
}
if (newDetails.hasProgramDateTime && mainDetails.hasProgramDateTime) {
alignPDT(newDetails, mainDetails);
} else if (mainSlidingStartFragment) {
// line up live playlist with main so that fragments in range are loaded
addSliding(newDetails, mainSlidingStartFragment.start);
}
} else {
const sliding = this.alignPlaylists(newDetails, track.details);
Expand All @@ -284,6 +269,25 @@ export class SubtitleStreamController

// trigger handler right now
this.tick();

// If playlist is misaligned because of bad PDT or drift, delete details to resync with main on reload
if (
newDetails.live &&
!this.fragCurrent &&
this.media &&
this.state === State.IDLE
) {
const foundFrag = findFragmentByPTS(
null,
newDetails.fragments,
this.media.currentTime,
0
);
if (!foundFrag) {
console.warn('Subtitle playlist not aligned with playback');
track.details = undefined;
}
}
}

_handleFragmentLoadComplete(fragLoadedData: FragLoadedData) {
Expand Down Expand Up @@ -364,8 +368,7 @@ export class SubtitleStreamController
);
const fragments = trackDetails.fragments;
const fragLen = fragments.length;
const end =
fragments[fragLen - 1].start + fragments[fragLen - 1].duration;
const end = trackDetails.edge;

let foundFrag;
const fragPrevious = this.fragPrevious;
Expand Down

0 comments on commit d7e26ec

Please sign in to comment.