Skip to content

Commit

Permalink
Fix AES-128 in streams with alt-audio tracks
Browse files Browse the repository at this point in the history
Fixes #3772 (v1.0 regression)
  • Loading branch information
Rob Walch committed Apr 15, 2021
1 parent ce0cba1 commit e0d1037
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 20 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

0 comments on commit e0d1037

Please sign in to comment.