Skip to content

Commit

Permalink
fix(HLS): Fix load of LL-HLS when the partial segment is not independ…
Browse files Browse the repository at this point in the history
  • Loading branch information
avelad committed Jun 12, 2023
1 parent 70823f9 commit ed5915e
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 6 deletions.
3 changes: 3 additions & 0 deletions lib/hls/hls_parser.js
Expand Up @@ -2895,6 +2895,9 @@ shaka.hls.HlsParser = class {
if (item.name == 'EXT-X-PRELOAD-HINT') {
partial.markAsPreload();
}
if (item.getAttributeValue('INDEPENDENT') != 'YES') {
partial.markAsNonIndependent();
}
partialSegmentRefs.push(partial);
} // for-loop of hlsSegment.partialSegments
}
Expand Down
22 changes: 22 additions & 0 deletions lib/media/segment_reference.js
Expand Up @@ -265,6 +265,9 @@ shaka.media.SegmentReference = class {
/** @type {boolean} */
this.preload = false;

/** @type {boolean} */
this.independent = true;

/** @type {?shaka.extern.HlsAes128Key} */
this.hlsAes128Key = hlsAes128Key;

Expand Down Expand Up @@ -407,6 +410,25 @@ shaka.media.SegmentReference = class {
return this.preload;
}

/**
* Mark the reference as non-independent.
*
* @export
*/
markAsNonIndependent() {
this.independent = false;
}

/**
* Returns true if the segment is independent.
*
* @return {boolean}
* @export
*/
isIndependent() {
return this.independent;
}

/**
* Set the segment's thumbnail sprite.
*
Expand Down
11 changes: 11 additions & 0 deletions lib/media/streaming_engine.js
Expand Up @@ -1262,6 +1262,17 @@ shaka.media.StreamingEngine = class {
mediaState.stream.segmentIndex.getIteratorForTime(presentationTime);
ref = mediaState.segmentIterator &&
mediaState.segmentIterator.next().value;
// For LL-HLS we need to find the nearest INDEPENDENT segment
let attempt = 0;
const maxAttempts = 5;
while (ref && !ref.isIndependent() && attempt < maxAttempts) {
const newTime = ref.startTime - 0.1;
mediaState.segmentIterator =
mediaState.stream.segmentIndex.getIteratorForTime(newTime);
ref = mediaState.segmentIterator &&
mediaState.segmentIterator.next().value;
attempt++;
}
}
if (ref == null) {
shaka.log.warning(logPrefix, 'cannot find segment',
Expand Down
13 changes: 9 additions & 4 deletions test/hls/hls_live_unit.js
Expand Up @@ -634,14 +634,17 @@ describe('HlsParser live', () => {
'#EXT-X-MEDIA-SEQUENCE:0\n',
// ref includes partialRef, partialRef2
// partialRef
'#EXT-X-PART:DURATION=2,URI="partial.mp4",BYTERANGE=200@0\n',
'#EXT-X-PART:DURATION=2,URI="partial.mp4",BYTERANGE=200@0,',
'INDEPENDENT=YES\n',
// partialRef2
'#EXT-X-PART:DURATION=2,URI="partial2.mp4",BYTERANGE=230@200\n',
'#EXT-X-PART:DURATION=2,URI="partial2.mp4",BYTERANGE=230@200,',
'INDEPENDENT=YES\n',
'#EXTINF:4,\n',
'main.mp4\n',
// ref2 includes partialRef3, preloadRef
// partialRef3
'#EXT-X-PART:DURATION=2,URI="partial.mp4",BYTERANGE=210@0\n',
'#EXT-X-PART:DURATION=2,URI="partial.mp4",BYTERANGE=210@0,',
'INDEPENDENT=YES\n',
// preloadRef
'#EXT-X-PRELOAD-HINT:TYPE=PART,URI="partial.mp4",BYTERANGE-START=210,',
'BYTERANGE-LENGTH=210\n',
Expand All @@ -668,6 +671,7 @@ describe('HlsParser live', () => {
'test:/partial.mp4', 6, 7.5, /* syncTime= */ null,
/* baseUri= */ '', /* startByte= */ 210, /* endByte= */ 419);
preloadRef.markAsPreload();
preloadRef.markAsNonIndependent();

// ref2 is not fully published yet, so it doesn't have a segment uri.
const ref2 = makeReference(
Expand All @@ -693,7 +697,8 @@ describe('HlsParser live', () => {
'main.mp4\n',
// ref2 includes partialRef, but not preloadRef
// partialRef
'#EXT-X-PART:DURATION=2,URI="partial.mp4",BYTERANGE=210@0\n',
'#EXT-X-PART:DURATION=2,URI="partial.mp4",BYTERANGE=210@0,',
'INDEPENDENT=YES\n',
// preloadRef
'#EXT-X-PRELOAD-HINT:TYPE=PART,URI="partial.mp4",BYTERANGE-START=210\n',
].join('');
Expand Down
4 changes: 2 additions & 2 deletions test/hls/hls_parser_unit.js
Expand Up @@ -2559,8 +2559,8 @@ describe('HlsParser', () => {
'#EXTINF:5,\n',
'main.mp4\n',
'#EXT-X-PROGRAM-DATE-TIME:2000-01-01T00:00:15.00Z\n',
'#EXT-X-PART:DURATION=2.5,URI="main.mp4"\n',
'#EXT-X-PART:DURATION=2.5,URI="main.mp4"\n',
'#EXT-X-PART:DURATION=2.5,URI="main.mp4",INDEPENDENT=YES\n',
'#EXT-X-PART:DURATION=2.5,URI="main.mp4",INDEPENDENT=YES\n',
'#EXTINF:5,\n',
'main.mp4\n',
'#EXT-X-PROGRAM-DATE-TIME:2000-01-01T00:00:20.00Z\n',
Expand Down

0 comments on commit ed5915e

Please sign in to comment.