From e0d103757a4b282dd3a91782ad1497676965b99a Mon Sep 17 00:00:00 2001 From: Rob Walch Date: Thu, 15 Apr 2021 13:44:44 -0400 Subject: [PATCH] Fix AES-128 in streams with alt-audio tracks Fixes #3772 (v1.0 regression) --- src/controller/audio-stream-controller.ts | 6 +---- src/controller/base-stream-controller.ts | 28 ++++++++++++++++++----- src/controller/stream-controller.ts | 13 ++++------- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/controller/audio-stream-controller.ts b/src/controller/audio-stream-controller.ts index 56e7e74c99b..936caf010d5 100644 --- a/src/controller/audio-stream-controller.ts +++ b/src/controller/audio-stream-controller.ts @@ -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); } diff --git a/src/controller/base-stream-controller.ts b/src/controller/base-stream-controller.ts index 647d9c6a1b3..b2a7dce316a 100644 --- a/src/controller/base-stream-controller.ts +++ b/src/controller/base-stream-controller.ts @@ -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); } } @@ -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, diff --git a/src/controller/stream-controller.ts b/src/controller/stream-controller.ts index 9cc7f920aa8..b0543fa4262 100644 --- a/src/controller/stream-controller.ts +++ b/src/controller/stream-controller.ts @@ -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, @@ -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(); }