Skip to content

Commit

Permalink
Merge pull request #3965 from video-dev/bugfix/live-removed-fragment-…
Browse files Browse the repository at this point in the history
…context

Fix last segment in live removed "context changed" error
  • Loading branch information
robwalch committed May 28, 2021
2 parents dd8f019 + 466fbad commit 90321c4
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 10 deletions.
5 changes: 2 additions & 3 deletions src/controller/base-playlist-controller.ts
@@ -1,7 +1,7 @@
import type Hls from '../hls';
import type { NetworkComponentAPI } from '../types/component-api';
import { getSkipValue, HlsSkip, HlsUrlParameters } from '../types/level';
import { computeReloadInterval } from './level-helper';
import { computeReloadInterval, mergeDetails } from './level-helper';
import { logger } from '../utils/logger';
import type { LevelDetails } from '../loader/level-details';
import type { MediaPlaylist } from '../types/media-playlist';
Expand All @@ -11,7 +11,6 @@ import type {
TrackLoadedData,
} from '../types/events';
import { ErrorData } from '../types/events';
import * as LevelHelper from './level-helper';
import { Events } from '../events';
import { ErrorTypes } from '../errors';

Expand Down Expand Up @@ -128,7 +127,7 @@ export default class BasePlaylistController implements NetworkComponentAPI {
}
// Merge live playlists to adjust fragment starts and fill in delta playlist skipped segments
if (previousDetails && details.fragments.length > 0) {
LevelHelper.mergeDetails(previousDetails, details);
mergeDetails(previousDetails, details);
}
if (!this.canLoad || !details.live) {
return;
Expand Down
15 changes: 9 additions & 6 deletions src/controller/base-stream-controller.ts
Expand Up @@ -4,7 +4,6 @@ import { Bufferable, BufferHelper } from '../utils/buffer-helper';
import { logger } from '../utils/logger';
import { Events } from '../events';
import { ErrorDetails } from '../errors';
import * as LevelHelper from './level-helper';
import { ChunkMetadata } from '../types/transmuxer';
import { appendUint8Array } from '../utils/mp4-tools';
import { alignStream } from '../utils/discontinuities';
Expand All @@ -13,6 +12,11 @@ import {
findFragmentByPTS,
findFragWithCC,
} from './fragment-finders';
import {
getFragmentWithSN,
getPartWith,
updateFragPTSDTS,
} from './level-helper';
import TransmuxerInterface from '../demux/transmuxer-interface';
import { Fragment, Part } from '../loader/fragment';
import FragmentLoader, {
Expand Down Expand Up @@ -654,11 +658,10 @@ export default class BaseStreamController
return null;
}
const level = levels[levelIndex];
const part =
partIndex > -1 ? LevelHelper.getPartWith(level, sn, partIndex) : null;
const part = partIndex > -1 ? getPartWith(level, sn, partIndex) : null;
const frag = part
? part.fragment
: LevelHelper.getFragmentWithSN(level, sn);
: getFragmentWithSN(level, sn, this.fragCurrent);
if (!frag) {
return null;
}
Expand Down Expand Up @@ -1088,7 +1091,7 @@ export default class BaseStreamController
levelLastLoaded !== null ? levels![levelLastLoaded] : null;

// FIXME: If not for `shouldAlignOnDiscontinuities` requiring fragPrevious.cc,
// this could all go in LevelHelper.mergeDetails
// this could all go in level-helper mergeDetails()
let sliding = 0;
if (previousDetails && details.fragments.length > 0) {
sliding = details.fragments[0].start;
Expand Down Expand Up @@ -1310,7 +1313,7 @@ export default class BaseStreamController
}
const drift = partial
? 0
: LevelHelper.updateFragPTSDTS(
: updateFragPTSDTS(
details,
frag,
info.startPTS,
Expand Down
9 changes: 8 additions & 1 deletion src/controller/level-helper.ts
Expand Up @@ -446,7 +446,11 @@ export function computeReloadInterval(
return Math.round(estimatedTimeUntilUpdate);
}

export function getFragmentWithSN(level: Level, sn: number): Fragment | null {
export function getFragmentWithSN(
level: Level,
sn: number,
fragCurrent: Fragment | null
): Fragment | null {
if (!level || !level.details) {
return null;
}
Expand All @@ -460,6 +464,9 @@ export function getFragmentWithSN(level: Level, sn: number): Fragment | null {
if (fragment && fragment.sn === sn) {
return fragment;
}
if (sn < levelDetails.startSN && fragCurrent && fragCurrent.sn === sn) {
return fragCurrent;
}
return null;
}

Expand Down

0 comments on commit 90321c4

Please sign in to comment.