Skip to content

Commit

Permalink
Load segments in order even when first playlist segment duration is i…
Browse files Browse the repository at this point in the history
…ncorrect or is greater than media segment duration

#4828
  • Loading branch information
robwalch committed Aug 27, 2022
1 parent 9859211 commit b31b0e4
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 10 deletions.
14 changes: 12 additions & 2 deletions src/controller/base-stream-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,16 @@ export default class BaseStreamController
}`
);
this.state = State.IDLE;
if (!media) {
return;
}
if (
!this.loadedmetadata &&
media.buffered.length &&
this.fragCurrent === this.fragPrevious
) {
this.loadedmetadata = true;
}
this.tick();
}

Expand Down Expand Up @@ -1015,12 +1025,12 @@ export default class BaseStreamController

if (frag) {
const curSNIdx = frag.sn - levelDetails.startSN;
const sameLevel = fragPrevious && frag.level === fragPrevious.level;
const nextFrag = fragments[curSNIdx + 1];
if (fragPrevious && frag.sn === fragPrevious.sn && !loadingParts) {
// Force the next fragment to load if the previous one was already selected. This can occasionally happen with
// non-uniform fragment durations
const sameLevel = fragPrevious && frag.level === fragPrevious.level;
if (sameLevel) {
const nextFrag = fragments[curSNIdx + 1];
if (
frag.sn < endSN &&
this.fragmentTracker.getState(nextFrag) !== FragmentState.OK
Expand Down
14 changes: 6 additions & 8 deletions src/remux/passthrough-remuxer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,16 +159,17 @@ class PassThroughRemuxer implements Remuxer {
this.emitInitSegment = false;
}

const startDTS = getStartDTS(initData, data);
if (!Number.isFinite(initPTS!)) {
this.initPTS =
initSegment.initPTS =
initPTS =
computeInitPTS(initData, data, lastEndDTS);
startDTS - (lastEndDTS as number);
}

const duration = getDuration(data, initData);
const startDTS = lastEndDTS as number;
const endDTS = duration + startDTS;
const start = audioTrack ? startDTS : (lastEndDTS as number);
const endDTS = duration + start;
offsetStartDTS(initData, data, initPTS as number);

if (duration > 0) {
Expand All @@ -192,8 +193,8 @@ class PassThroughRemuxer implements Remuxer {

const track: RemuxedTrack = {
data1: data,
startPTS: startDTS,
startDTS,
startPTS: start,
startDTS: start,
endPTS: endDTS,
endDTS,
type,
Expand Down Expand Up @@ -226,9 +227,6 @@ class PassThroughRemuxer implements Remuxer {
}
}

const computeInitPTS = (initData, data, timeOffset) =>
getStartDTS(initData, data) - timeOffset;

function getParsedTrackCodec(
track: InitDataTrack | undefined,
type: ElementaryStreamTypes.AUDIO | ElementaryStreamTypes.VIDEO
Expand Down

0 comments on commit b31b0e4

Please sign in to comment.