From 3d0f752c7d0677f750dbbd9bcd2895358358628f Mon Sep 17 00:00:00 2001 From: Jaeseok Lee Date: Tue, 4 Oct 2022 13:13:06 +0900 Subject: [PATCH] fix: Missing AES-128 key of last HLS segment (#4519) When fitting the segment references to the timeline, some properties were lost, including the AES-128 key. This fixes those missing properties. Closes #4517 --- AUTHORS | 1 + CONTRIBUTORS | 1 + lib/media/segment_index.js | 5 ++++- test/media/segment_index_unit.js | 30 ++++++++++++++++++++++++++++-- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index c8a4b3573e..a4a62e37cd 100644 --- a/AUTHORS +++ b/AUTHORS @@ -37,6 +37,7 @@ Giorgio Gamberoni Giuseppe Samela Google Inc. <*@google.com> Itay Kinnrot +Jaeseok Lee Jason Palmer Jesper Haug Karsrud Johan Sundström diff --git a/CONTRIBUTORS b/CONTRIBUTORS index f26f537c47..e0163d22e3 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -57,6 +57,7 @@ Hichem Taoufik Itay Kinnrot Isaac Ramirez Jacob Trimble +Jaeseok Lee Jason Palmer Jeffrey Swan Jesper Haug Karsrud diff --git a/lib/media/segment_index.js b/lib/media/segment_index.js index ee51b63374..f5db674682 100644 --- a/lib/media/segment_index.js +++ b/lib/media/segment_index.js @@ -364,7 +364,10 @@ shaka.media.SegmentIndex = class { lastReference.partialReferences, lastReference.tilesLayout, lastReference.tileDuration, - lastReference.syncTime); + lastReference.syncTime, + lastReference.status, + lastReference.hlsAes128Key, + ); } diff --git a/test/media/segment_index_unit.js b/test/media/segment_index_unit.js index 79fa98d83f..df8d492735 100644 --- a/test/media/segment_index_unit.js +++ b/test/media/segment_index_unit.js @@ -207,6 +207,25 @@ describe('SegmentIndex', /** @suppress {accessControls} */ () => { ]; expect(index.references).toEqual(newReferences); }); + + it('preserves hls key of the last reference', () => { + // The hls key of the last segment should be preserved. + const references = [ + makeReference(uri(0), 0, 5, [], + {method: 'AES-128', firstMediaSequenceNumber: 0}), + makeReference(uri(1), 5, 10, [], + {method: 'AES-128', firstMediaSequenceNumber: 0}), + makeReference(uri(2), 10, 15, [], + {method: 'AES-128', firstMediaSequenceNumber: 0}), + ]; + const index = new shaka.media.SegmentIndex(references); + expect(index.references).toEqual(references); + + index.fit(/* windowStart= */ 0, /* windowEnd= */ 10); + expect( + index.references[index.references.length - 1].hlsAes128Key, + ).toEqual({method: 'AES-128', firstMediaSequenceNumber: 0}); + }); }); describe('merge', () => { @@ -955,9 +974,11 @@ describe('SegmentIndex', /** @suppress {accessControls} */ () => { * @param {number} startTime * @param {number} endTime * @param {!Array.=} partialReferences + * @param {?shaka.extern.HlsAes128Key=} hlsAes128Key * @return {shaka.media.SegmentReference} */ - function makeReference(uri, startTime, endTime, partialReferences = []) { + function makeReference(uri, startTime, endTime, partialReferences = [], + hlsAes128Key = null) { return new shaka.media.SegmentReference( startTime, endTime, @@ -968,6 +989,11 @@ describe('SegmentIndex', /** @suppress {accessControls} */ () => { /* timestampOffset= */ 0, /* appendWindowStart= */ 0, /* appendWindowEnd= */ Infinity, - /* partialReferences= */ partialReferences); + /* partialReferences= */ partialReferences, + /* tilesLayout= */ undefined, + /* tileDuration= */ undefined, + /* syncTime= */ undefined, + /* status= */ undefined, + /* hlsAes128Key= */ hlsAes128Key); } });