Skip to content

Commit e61d1f4

Browse files
committed
Replay error handling repeated playlist key tags
Fix escalation of unresolved level removal to fatal
1 parent 5ed1ce8 commit e61d1f4

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

src/controller/eme-controller.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,8 @@ export interface MediaKeySessionContext {
6464
_onkeystatuseschange?: (this: MediaKeySession, ev: Event) => any;
6565
}
6666

67-
// TODO: move to config?
6867
export type MediaKeySessionContextAndLevelKey = {
69-
decryptdata: LevelKey; // soft-deprecated
68+
decryptdata: LevelKey; // soft-deprecated (replaced by levelKeys)
7069
keySystem: KeySystems;
7170
levelKeys: LevelKey[];
7271
mediaKeys: MediaKeys;
@@ -555,6 +554,16 @@ class EMEController extends Logger implements ComponentAPI {
555554
return keySessionContextPromise;
556555
}
557556

557+
// Re-emit error for playlist key loading
558+
keyContextPromise.catch((error) => {
559+
if (error instanceof EMEKeyError) {
560+
const errorData = { ...error.data };
561+
errorData.decryptdata = levelKey;
562+
const clonedError = new EMEKeyError(errorData, error.message);
563+
this.handleError(clonedError, data.frag);
564+
}
565+
});
566+
558567
return keyContextPromise;
559568
}
560569

src/controller/error-controller.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,8 @@ export default class ErrorController
528528
if (levelKey) {
529529
// Penalize all levels with key
530530
const levels = this.hls.levels;
531-
for (let i = levels.length; i--; ) {
531+
const levelCountWithError = levels.length;
532+
for (let i = levelCountWithError; i--; ) {
532533
if (this.variantHasKey(levels[i], levelKey)) {
533534
this.log(
534535
`Banned key found in level ${i} (${levels[i].bitrate}bps) or audio group "${levels[i].audioGroups?.join(',')}" (${data.frag?.type} fragment) ${arrayToHex(levelKey.keyId || [])}`,
@@ -539,7 +540,7 @@ export default class ErrorController
539540
this.hls.removeLevel(i);
540541
}
541542
}
542-
if (levels.length) {
543+
if (this.hls.levels.length < levelCountWithError) {
543544
errorAction.resolved = true;
544545
}
545546
}

0 commit comments

Comments
 (0)