@@ -94,6 +94,8 @@ export type MediaKeySessionContext = {
9494 keyRequests : KeyRequests ;
9595 keyStatuses : KeyStatuses ;
9696 keyStatusTimeouts ?: KeyTimeouts ;
97+ createdFor : { levelKey : LevelKey ; reason : LicenseRequestReason } ;
98+ initialized : boolean ;
9799} ;
98100
99101export class EMEKeyError extends Error {
@@ -340,20 +342,32 @@ class EMEController extends Logger implements ComponentAPI {
340342 levelKey : LevelKey ,
341343 reason : LicenseRequestReason ,
342344 ) : MediaKeySessionContext {
343- this . log (
344- `Creating key-system session "${ keySystem } " keyId: ${ arrayToHex (
345- levelKey . keyId || ( [ ] as number [ ] ) ,
346- ) } keyUri: ${ levelKey . uri } for "${ reason } "`,
347- ) ;
345+ const { mediaKeySessions } = this ;
346+ const message = ` key-system session "${ keySystem } " keyId: ${ arrayToHex (
347+ levelKey . keyId || ( [ ] as number [ ] ) ,
348+ ) } keyUri: ${ levelKey . uri } for "${ reason } "`;
349+ for ( let i = 0 ; i < mediaKeySessions . length ; i ++ ) {
350+ const context = mediaKeySessions [ i ] ;
351+ if (
352+ ! context . initialized &&
353+ context . createdFor . levelKey . uri === levelKey . uri
354+ ) {
355+ this . log ( `Retrieved${ message } ` ) ;
356+ return context ;
357+ }
358+ }
359+ this . log ( `Creating${ message } ` ) ;
348360 const mediaKeysSession = mediaKeys . createSession ( ) ;
349361 const mediaKeySessionContext : MediaKeySessionContext = {
350362 keySystem,
351363 mediaKeys,
352364 mediaKeysSession,
353365 keyRequests : { } ,
354366 keyStatuses : { } ,
367+ createdFor : { levelKey, reason } ,
368+ initialized : false ,
355369 } ;
356- this . mediaKeySessions . push ( mediaKeySessionContext ) ;
370+ mediaKeySessions . push ( mediaKeySessionContext ) ;
357371 return mediaKeySessionContext ;
358372 }
359373
@@ -600,7 +614,7 @@ class EMEController extends Logger implements ComponentAPI {
600614 . then ( ( keySessionContext ) => {
601615 this . throwIfDestroyed ( ) ;
602616 // Create key-request, session message event listener, key-status listeners
603- const scheme = 'cenc' ;
617+ const scheme = levelKey . scheme || 'cenc' ;
604618 const initData = levelKey . pssh ? levelKey . pssh . buffer : null ;
605619 return this . generateRequestWithPreferredKeySession (
606620 keySessionContext ,
@@ -757,6 +771,7 @@ class EMEController extends Logger implements ComponentAPI {
757771 decryptdata . uri . replace ( / - / g, '' ) . indexOf ( keyIdHex ) !== - 1 )
758772 ) {
759773 if ( ! decryptdata . pssh ) {
774+ decryptdata . scheme = initDataType ;
760775 decryptdata . pssh = new Uint8Array ( initData ) ;
761776 decryptdata . keyId = keyId ;
762777 LevelKey . setKeyIdForUri ( decryptdata . uri , keyId ) ;
@@ -771,6 +786,7 @@ class EMEController extends Logger implements ComponentAPI {
771786 }
772787 if ( ! keySessionContextPromise ) {
773788 if ( levelKeys . length ) {
789+ levelKeys [ 0 ] . scheme ||= initDataType ;
774790 levelKeys [ 0 ] . pssh ||= new Uint8Array ( initData ) ;
775791 return this . getSessionForKey (
776792 levelKeys [ 0 ] ,
@@ -863,6 +879,9 @@ class EMEController extends Logger implements ComponentAPI {
863879 'Invalid response from configured generateRequest filter' ,
864880 ) ;
865881 }
882+ levelKey . scheme = mappedInitData . initDataType
883+ ? mappedInitData . initDataType
884+ : 'cenc' ;
866885 const pssh = mappedInitData . initData ? mappedInitData . initData : null ;
867886 levelKey . pssh = pssh ? new Uint8Array ( pssh ) : null ;
868887 return mappedInitData ;
@@ -894,6 +913,12 @@ class EMEController extends Logger implements ComponentAPI {
894913 initDataType = mappedInitData . initDataType ;
895914 }
896915
916+ if ( ! reason . startsWith ( 'encrypted-event' ) ) {
917+ this . log ( `Skipping key-session request for "${ reason } " (no initData)` ) ;
918+ // resolve key so that media is appended and initData is received in "encrypted" event
919+ return Promise . resolve ( context ) ;
920+ }
921+
897922 if ( initData === null ) {
898923 if ( reason . startsWith ( 'encrypted-event' ) ) {
899924 return Promise . reject (
@@ -1099,6 +1124,7 @@ class EMEController extends Logger implements ComponentAPI {
10991124 ) ;
11001125
11011126 requestEmitter . status = 'started' ;
1127+ context . initialized = true ;
11021128 return context . mediaKeysSession
11031129 . generateRequest ( initDataType , initData )
11041130 . then ( ( ) => {
0 commit comments