diff --git a/src/controller/base-playlist-controller.ts b/src/controller/base-playlist-controller.ts index 4028a9d37d4..e41297cfcf6 100644 --- a/src/controller/base-playlist-controller.ts +++ b/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'; @@ -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'; @@ -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; diff --git a/src/controller/base-stream-controller.ts b/src/controller/base-stream-controller.ts index 1a84567ee13..256b3c3ebd4 100644 --- a/src/controller/base-stream-controller.ts +++ b/src/controller/base-stream-controller.ts @@ -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'; @@ -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, { @@ -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; } @@ -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; @@ -1310,7 +1313,7 @@ export default class BaseStreamController } const drift = partial ? 0 - : LevelHelper.updateFragPTSDTS( + : updateFragPTSDTS( details, frag, info.startPTS, diff --git a/src/controller/level-helper.ts b/src/controller/level-helper.ts index f43a7f56611..697b9a7d2a4 100644 --- a/src/controller/level-helper.ts +++ b/src/controller/level-helper.ts @@ -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; } @@ -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; }