Skip to content

Commit

Permalink
Merge pull request #3782 from video-dev/bugfix/aes-in-audio-stream-co…
Browse files Browse the repository at this point in the history
…ntroller

Fix AES-128 in streams with alt-audio tracks
  • Loading branch information
robwalch committed Apr 16, 2021
2 parents 2274d91 + 590e1b2 commit c1da9cb
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 21 deletions.
6 changes: 1 addition & 5 deletions src/controller/audio-stream-controller.ts
Expand Up @@ -344,11 +344,7 @@ class AudioStreamController
}

if (frag.decryptdata?.keyFormat === 'identity' && !frag.decryptdata?.key) {
this.log(
`Loading key for ${frag.sn} of [${trackDetails.startSN} ,${trackDetails.endSN}],track ${trackId}`
);
this.state = State.KEY_LOADING;
hls.trigger(Events.KEY_LOADING, { frag });
this.loadKey(frag, trackDetails);
} else {
this.loadFragment(frag, trackDetails, targetBufferTime);
}
Expand Down
28 changes: 22 additions & 6 deletions src/controller/base-stream-controller.ts
Expand Up @@ -236,12 +236,17 @@ export default class BaseStreamController
}

onKeyLoaded(event: Events.KEY_LOADED, data: KeyLoadedData) {
if (this.state === State.KEY_LOADING && this.levels) {
this.state = State.IDLE;
const levelDetails = this.levels[data.frag.level].details;
if (levelDetails) {
this.loadFragment(data.frag, levelDetails, data.frag.start);
}
if (
this.state !== State.KEY_LOADING ||
data.frag !== this.fragCurrent ||
!this.levels
) {
return;
}
this.state = State.IDLE;
const levelDetails = this.levels[data.frag.level].details;
if (levelDetails) {
this.loadFragment(data.frag, levelDetails, data.frag.start);
}
}

Expand All @@ -264,6 +269,17 @@ export default class BaseStreamController
super.onHandlerDestroyed();
}

protected loadKey(frag: Fragment, details: LevelDetails) {
this.log(
`Loading key for ${frag.sn} of [${details.startSN}-${details.endSN}], ${
this.logPrefix === '[stream-controller]' ? 'level' : 'track'
} ${frag.level}`
);
this.state = State.KEY_LOADING;
this.fragCurrent = frag;
this.hls.trigger(Events.KEY_LOADING, { frag });
}

protected loadFragment(
frag: Fragment,
levelDetails: LevelDetails,
Expand Down
13 changes: 4 additions & 9 deletions src/controller/stream-controller.ts
Expand Up @@ -306,20 +306,12 @@ export default class StreamController
// We want to load the key if we're dealing with an identity key, because we will decrypt
// this content using the key we fetch. Other keys will be handled by the DRM CDM via EME.
if (frag.decryptdata?.keyFormat === 'identity' && !frag.decryptdata?.key) {
this.log(
`Loading key for ${frag.sn} of [${levelDetails.startSN}-${levelDetails.endSN}], level ${level}`
);
this.loadKey(frag);
this.loadKey(frag, levelDetails);
} else {
this.loadFragment(frag, levelDetails, targetBufferTime);
}
}

private loadKey(frag: Fragment) {
this.state = State.KEY_LOADING;
this.hls.trigger(Events.KEY_LOADING, { frag });
}

protected loadFragment(
frag: Fragment,
levelDetails: LevelDetails,
Expand Down Expand Up @@ -473,6 +465,9 @@ export default class StreamController
if (fragCurrent?.loader) {
fragCurrent.loader.abort();
}
if (this.state === State.KEY_LOADING) {
this.state = State.IDLE;
}
this.nextLoadPosition = this.getLoadPosition();
}

Expand Down
8 changes: 7 additions & 1 deletion tests/test-streams.js
Expand Up @@ -98,9 +98,15 @@ module.exports = {
oceansAES: {
url:
'https://playertest.longtailvideo.com/adaptive/oceans_aes/oceans_aes.m3u8',
description: 'AES encrypted,ABR',
description: 'AES-128 encrypted, ABR',
abr: true,
},
tracksWithAES: {
url:
'https://playertest.longtailvideo.com/adaptive/aes-with-tracks/master.m3u8',
description: 'AES-128 encrypted, TS main with AAC audio track',
abr: false,
},
mp3Audio: {
url:
'https://playertest.longtailvideo.com/adaptive/vod-with-mp3/manifest.m3u8',
Expand Down

0 comments on commit c1da9cb

Please sign in to comment.