Skip to content

Commit d111f73

Browse files
committed
Get KEYID from init segment 'tenc' when not found elsewhere
Fixes #7541
1 parent 82b8fa4 commit d111f73

File tree

2 files changed

+12
-22
lines changed

2 files changed

+12
-22
lines changed

src/controller/eme-controller.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -803,10 +803,9 @@ class EMEController extends Logger implements ComponentAPI {
803803
const generateRequestFilter =
804804
this.config.drmSystems?.[context.keySystem]?.generateRequest;
805805
if (generateRequestFilter) {
806-
const contextWithLevelKey: MediaKeySessionContextAndLevelKey = {
806+
const contextWithLevelKey = Object.assign({}, context, {
807807
decryptdata: levelKey,
808-
...context,
809-
};
808+
});
810809
try {
811810
const mappedInitData: ReturnType<typeof generateRequestFilter> =
812811
generateRequestFilter.call(
@@ -1173,10 +1172,9 @@ class EMEController extends Logger implements ComponentAPI {
11731172
levelKey: LevelKey,
11741173
keyMessage: ArrayBuffer,
11751174
): Promise<void> {
1176-
const contextWithLevelKey: MediaKeySessionContextAndLevelKey = {
1175+
const contextWithLevelKey = Object.assign({}, context, {
11771176
decryptdata: levelKey,
1178-
...context,
1179-
};
1177+
});
11801178
return this.requestLicense(
11811179
contextWithLevelKey,
11821180
new Uint8Array(keyMessage),

src/loader/level-key.ts

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,6 @@ export class LevelKey implements DecryptData {
178178
}
179179
if (!this.keyId) {
180180
this.keyId = getKeyIdFromPlayReadyKey(levelKeys);
181-
if (!this.keyId) {
182-
const offset = keyBytes.length - 22;
183-
this.keyId = keyBytes.subarray(offset, offset + 16);
184-
}
185181
}
186182
break;
187183
case KeySystemFormats.PLAYREADY: {
@@ -211,22 +207,18 @@ export class LevelKey implements DecryptData {
211207
}
212208
}
213209

214-
// Default behavior: assign a new keyId for each uri
210+
// Default behavior: get keyId from other KEY tag or URI lookup
215211
if (!this.keyId || this.keyId.byteLength !== 16) {
216-
let keyId: Uint8Array<ArrayBuffer> | null | undefined =
217-
keyUriToKeyIdMap[this.uri];
212+
let keyId: Uint8Array<ArrayBuffer> | null | undefined;
213+
keyId = getKeyIdFromWidevineKey(levelKeys);
218214
if (!keyId) {
219-
keyId = getKeyIdFromWidevineKey(levelKeys);
215+
keyId = getKeyIdFromPlayReadyKey(levelKeys);
220216
if (!keyId) {
221-
keyId = getKeyIdFromPlayReadyKey(levelKeys);
222-
if (!keyId) {
223-
const val =
224-
Object.keys(keyUriToKeyIdMap).length % Number.MAX_SAFE_INTEGER;
225-
keyId = new Uint8Array(16);
226-
const dv = new DataView(keyId.buffer, 12, 4); // Just set the last 4 bytes
227-
dv.setUint32(0, val);
228-
}
217+
keyId = keyUriToKeyIdMap[this.uri];
229218
}
219+
}
220+
if (keyId) {
221+
this.keyId = keyId;
230222
LevelKey.setKeyIdForUri(this.uri, keyId);
231223
}
232224
}

0 commit comments

Comments
 (0)