Skip to content

Commit

Permalink
Loosley align live subtitle playlists and increase range of loaded su…
Browse files Browse the repository at this point in the history
…bs to make up for playlist misalignment

Resolves #3987
  • Loading branch information
Rob Walch committed Jun 3, 2021
1 parent 5e8468a commit faf4472
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 14 deletions.
17 changes: 10 additions & 7 deletions src/controller/level-helper.ts
Expand Up @@ -372,17 +372,20 @@ export function adjustSliding(
const delta =
newDetails.startSN + newDetails.skippedSegments - oldDetails.startSN;
const oldFragments = oldDetails.fragments;
const newFragments = newDetails.fragments;
if (delta < 0 || delta >= oldFragments.length) {
return;
}
const playlistStartOffset = oldFragments[delta].start;
if (playlistStartOffset) {
for (let i = newDetails.skippedSegments; i < newFragments.length; i++) {
newFragments[i].start += playlistStartOffset;
addSliding(newDetails, oldFragments[delta].start);
}

export function addSliding(details: LevelDetails, start: number) {
if (start) {
const fragments = details.fragments;
for (let i = details.skippedSegments; i < fragments.length; i++) {
fragments[i].start += start;
}
if (newDetails.fragmentHint) {
newDetails.fragmentHint.start += playlistStartOffset;
if (details.fragmentHint) {
details.fragmentHint.start += start;
}
}
}
Expand Down
16 changes: 9 additions & 7 deletions src/controller/subtitle-stream-controller.ts
Expand Up @@ -3,7 +3,7 @@ import { logger } from '../utils/logger';
import { BufferHelper } from '../utils/buffer-helper';
import { findFragmentByPDT, findFragmentByPTS } from './fragment-finders';
import { alignPDT } from '../utils/discontinuities';
import { adjustSliding } from './level-helper';
import { addSliding } from './level-helper';
import { FragmentState } from './fragment-tracker';
import BaseStreamController, { State } from './base-stream-controller';
import { PlaylistLevelType } from '../types/loader';
Expand Down Expand Up @@ -250,9 +250,9 @@ export class SubtitleStreamController
if (mainDetails) {
if (newDetails.hasProgramDateTime && mainDetails.hasProgramDateTime) {
alignPDT(newDetails, mainDetails);
} else {
// try aligning on SN
adjustSliding(mainDetails, newDetails);
} else if (mainDetails.fragments[0]) {
// line up live playlist with main so that fragments in range are loaded
addSliding(newDetails, mainDetails.fragments[0].start);
}
}
} else {
Expand Down Expand Up @@ -321,21 +321,23 @@ export class SubtitleStreamController
return;
}

// Expand range of subs loaded by one target-duration in either direction to make up for misaligned playlists
const trackDetails = levels[currentTrackId].details as LevelDetails;
const targetDuration = trackDetails.targetduration;
const { config, media } = this;
const bufferedInfo = BufferHelper.bufferedInfo(
this.mediaBufferTimeRanges,
media.currentTime,
media.currentTime - targetDuration,
config.maxBufferHole
);
const { end: targetBufferTime, len: bufferLen } = bufferedInfo;

const maxBufLen = this.getMaxBufferLength();
const maxBufLen = this.getMaxBufferLength() + targetDuration;

if (bufferLen > maxBufLen) {
return;
}

const trackDetails = levels[currentTrackId].details as LevelDetails;
console.assert(
trackDetails,
'Subtitle track details are defined on idle subtitle stream controller tick'
Expand Down

0 comments on commit faf4472

Please sign in to comment.