Skip to content

Commit

Permalink
Fix repeated requests for initSegment
Browse files Browse the repository at this point in the history
Fixes #4450
For live video, merging playlists did not updated non-overlapping
fragments. Now, the level-helper will update any non-overlapping
fragmentHint or fragments to reference existing initSegment
fragments.
  • Loading branch information
erkreutzer committed Dec 3, 2021
1 parent 3c3c27c commit 474b632
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
14 changes: 14 additions & 0 deletions src/controller/level-helper.ts
Expand Up @@ -232,6 +232,20 @@ export function mergeDetails(
}
);

if (currentInitSegment) {
const fragmentsToCheck = newDetails.fragmentHint
? newDetails.fragments.concat(newDetails.fragmentHint)
: newDetails.fragments;
fragmentsToCheck.forEach((frag) => {
if (
!frag.initSegment ||
frag.initSegment.relurl === currentInitSegment?.relurl
) {
frag.initSegment = currentInitSegment;
}
});
}

if (newDetails.skippedSegments) {
newDetails.deltaUpdateFailed = newDetails.fragments.some((frag) => !frag);
if (newDetails.deltaUpdateFailed) {
Expand Down
37 changes: 37 additions & 0 deletions tests/unit/controller/level-helper.ts
Expand Up @@ -225,6 +225,43 @@ expect: ${JSON.stringify(merged.fragments[i])}`
).to.deep.equal(merged.fragments[i]);
});
});

it('merges initSegments', function () {
const oldPlaylist = generatePlaylist([1, 2, 3]);
const oldInitSegment = new Fragment(PlaylistLevelType.MAIN, '');
oldInitSegment.sn = 'initSegment';
oldInitSegment.relurl = 'init.mp4';
oldPlaylist.fragments.forEach((frag) => {
frag.initSegment = oldInitSegment;
});
oldPlaylist.fragmentHint = new Fragment(PlaylistLevelType.MAIN, '');
oldPlaylist.fragmentHint.sn = 4;
oldPlaylist.fragmentHint.initSegment = oldInitSegment;

const newPlaylist = generatePlaylist([2, 3, 4]);
const newInitSegment = new Fragment(PlaylistLevelType.MAIN, '');
newInitSegment.sn = 'initSegment';
newInitSegment.relurl = 'init.mp4';
newPlaylist.fragments.forEach((frag) => {
frag.initSegment = newInitSegment;
});
newPlaylist.fragmentHint = new Fragment(PlaylistLevelType.MAIN, '');
newPlaylist.fragmentHint.sn = 5;
newPlaylist.fragmentHint.initSegment = newInitSegment;

mergeDetails(oldPlaylist, newPlaylist);

newPlaylist.fragments.forEach((frag, i) => {
expect(
frag.initSegment,
`Fragment sn: ${frag.sn} does not have correct initSegment`
).to.equal(oldInitSegment);
});
expect(
newPlaylist.fragmentHint.initSegment,
'fragmentHint does not have correct initSegment'
).to.equal(oldInitSegment);
});
});

describe('computeReloadInterval', function () {
Expand Down

0 comments on commit 474b632

Please sign in to comment.