Skip to content

Commit 331a02e

Browse files
committed
Error handling for PlayReady key with no status change
#7508
1 parent 4a334e9 commit 331a02e

File tree

10 files changed

+444
-274
lines changed

10 files changed

+444
-274
lines changed

api-extractor/report/hls.js.api.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1170,6 +1170,8 @@ export class EMEController extends Logger implements ComponentAPI {
11701170
// (undocumented)
11711171
destroy(): void;
11721172
// (undocumented)
1173+
getKeyStatus(decryptdata: LevelKey): MediaKeyStatus | undefined;
1174+
// (undocumented)
11731175
getKeySystemAccess(keySystemsToAttempt: KeySystems[]): Promise<void>;
11741176
// (undocumented)
11751177
getSelectedKeySystemFormats(): KeySystemFormats[];
@@ -3379,6 +3381,8 @@ export class LevelKey implements DecryptData {
33793381
// (undocumented)
33803382
pssh: Uint8Array<ArrayBuffer> | null;
33813383
// (undocumented)
3384+
static setKeyIdForUri(uri: string, keyId: Uint8Array<ArrayBuffer>): void;
3385+
// (undocumented)
33823386
readonly uri: string;
33833387
}
33843388

@@ -3992,7 +3996,11 @@ export interface MediaKeySessionContext {
39923996
// (undocumented)
39933997
decryptdata: LevelKey;
39943998
// (undocumented)
3995-
keyStatus: MediaKeyStatus;
3999+
keyStatus?: MediaKeyStatus;
4000+
// (undocumented)
4001+
keyStatusTimeouts?: {
4002+
[keyId: string]: number;
4003+
};
39964004
// (undocumented)
39974005
keySystem: KeySystems;
39984006
// (undocumented)

src/controller/base-stream-controller.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ import {
2424
getAesModeFromFullSegmentMethod,
2525
isFullSegmentEncryption,
2626
} from '../utils/encryption-methods-util';
27-
import { getRetryDelay, offlineHttpStatus } from '../utils/error-helper';
27+
import {
28+
getRetryDelay,
29+
isUnusableKeyError,
30+
offlineHttpStatus,
31+
} from '../utils/error-helper';
2832
import {
2933
addEventListener,
3034
removeEventListener,
@@ -727,7 +731,9 @@ export default class BaseStreamController
727731
) {
728732
const media = this.media;
729733
const error = new Error(
730-
`Encrypted track with no key in ${this.fragInfo(frag)} (media ${media ? 'attached mediaKeys: ' + media.mediaKeys : 'detached'})`,
734+
__USE_EME_DRM__
735+
? `Encrypted track with no key in ${this.fragInfo(frag)} (media ${media ? 'attached mediaKeys: ' + media.mediaKeys : 'detached'})`
736+
: 'EME not supported (light build)',
731737
);
732738
this.warn(error.message);
733739
// Ignore if media is detached or mediaKeys are set
@@ -737,7 +743,7 @@ export default class BaseStreamController
737743
this.hls.trigger(Events.ERROR, {
738744
type: ErrorTypes.KEY_SYSTEM_ERROR,
739745
details: ErrorDetails.KEY_SYSTEM_NO_KEYS,
740-
fatal: false,
746+
fatal: !__USE_EME_DRM__,
741747
error,
742748
frag,
743749
});
@@ -1052,6 +1058,7 @@ export default class BaseStreamController
10521058
this.handleFragLoadAborted(data.frag, data.part);
10531059
} else if (data.frag && data.type === ErrorTypes.KEY_SYSTEM_ERROR) {
10541060
data.frag.abortRequests();
1061+
this.resetStartWhenNotLoaded();
10551062
this.resetFragmentLoading(data.frag);
10561063
} else {
10571064
this.hls.trigger(Events.ERROR, data as ErrorData);
@@ -1904,7 +1911,8 @@ export default class BaseStreamController
19041911
noAlternate &&
19051912
isMediaFragment(frag) &&
19061913
!frag.endList &&
1907-
live
1914+
live &&
1915+
!isUnusableKeyError(data)
19081916
) {
19091917
this.resetFragmentErrors(filterType);
19101918
this.treatAsGap(frag);

0 commit comments

Comments
 (0)