Skip to content

Commit

Permalink
feat: Preload AES key when the key is available in EXT-X-SESSION-KEY (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
avelad authored Apr 29, 2024
1 parent 3ce9e30 commit 57cb6ad
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 1 deletion.
14 changes: 13 additions & 1 deletion lib/hls/hls_parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -1379,7 +1379,19 @@ shaka.hls.HlsParser = class {
const keyFormat =
drmTag.getAttributeValue('KEYFORMAT') || 'identity';
let drmInfo = null;
if (method == 'NONE' || this.isAesMethod_(method)) {
if (method == 'NONE') {
continue;
} else if (this.isAesMethod_(method)) {
const keyUris = shaka.hls.Utils.constructSegmentUris(
getUris(), drmTag.getRequiredAttrValue('URI'), variables);
const keyMapKey = keyUris.sort().join('');
if (!this.aesKeyMap_.has(keyMapKey)) {
const requestType = shaka.net.NetworkingEngine.RequestType.KEY;
const request = shaka.net.NetworkingEngine.makeRequest(
keyUris, this.config_.retryParameters);
const keyResponse = this.makeNetworkRequest_(request, requestType);
this.aesKeyMap_.set(keyMapKey, keyResponse);
}
continue;
} else if (keyFormat == 'identity') {
// eslint-disable-next-line no-await-in-loop
Expand Down
32 changes: 32 additions & 0 deletions test/hls/hls_parser_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -4032,6 +4032,38 @@ describe('HlsParser', () => {
});
});

it('Preload AES key with EXT-X-SESSION-KEY', async () => {
const master = [
'#EXTM3U\n',
'#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="avc1.4d401f",',
'RESOLUTION=960x540,FRAME-RATE=30\n',
'video\n',
'#EXT-X-STREAM-INF:BANDWIDTH=300,CODECS="avc1.4d401f",',
'RESOLUTION=960x540,FRAME-RATE=60\n',
'video2\n',
'#EXT-X-SESSION-KEY:METHOD=AES-128,',
'URI="800k.key"\n',
].join('');

const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
manifest.anyTimeline();
manifest.addPartialVariant((variant) => {
variant.addPartialStream(ContentType.VIDEO);
});
manifest.addPartialVariant((variant) => {
variant.addPartialStream(ContentType.VIDEO);
});
manifest.sequenceMode = sequenceMode;
manifest.type = shaka.media.ManifestParser.HLS;
});

fakeNetEngine.setResponseText('test:/master', master)
.setResponseValue('test:/800k.key', aesKey);

const actual = await parser.start('test:/master', playerInterface);
expect(actual).toEqual(manifest);
});

it('falls back to mp4 if HEAD request fails', async () => {
const master = [
'#EXTM3U\n',
Expand Down

0 comments on commit 57cb6ad

Please sign in to comment.