test_eme_pssh_in_moof.html (4915B)
1 <!DOCTYPE HTML> 2 <html> 3 4 <head> 5 <title>Test Encrypted Media Extensions</title> 6 <script src="/tests/SimpleTest/SimpleTest.js"></script> 7 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 8 <script type="text/javascript" src="manifest.js"></script> 9 <script type="text/javascript" src="eme.js"></script> 10 </head> 11 12 <body> 13 <script class="testbody" type="text/javascript"> 14 let manager = new MediaTestManager; 15 16 let psshTests = [ 17 { name: "bear-640x360-cenc-key-rotation", 18 tracks : [ 19 { 20 name: "video", 21 type: "video/mp4; codecs=\"avc1.64000d\"", 22 fragments: ["bear-640x360-v_frag-cenc-key_rotation.mp4"], 23 initDatas: 6 24 }, 25 { 26 name: "audio", 27 type: "audio/mp4; codecs=\"mp4a.40.2\"", 28 fragments: ["bear-640x360-a_frag-cenc-key_rotation.mp4"], 29 initDatas: 7 30 } 31 ], 32 keys : { 33 "30313233343536373839303132333435" : 34 "ebdd62f16814d27b68ef122afce4ae3c" 35 } 36 }, 37 { name: "bipbop-clearkey-keyrotation-clear-lead", 38 tracks : [ 39 { 40 name: "video", 41 type: "video/mp4; codecs=\"avc1.4d4015\"", 42 fragments: ["bipbop-clearkey-keyrotation-clear-lead-video.mp4"], 43 initDatas: 3 44 }, 45 { 46 name: "audio", 47 type: "audio/mp4; codecs=\"mp4a.40.2\"", 48 fragments: ["bipbop-clearkey-keyrotation-clear-lead-audio.mp4"], 49 initDatas: 3 50 } 51 ], 52 keys : { 53 "00112233445566778899aabbccddeeff" : 54 "00112233445566778899aabbccddeeff", 55 "112233445566778899aabbccddeeff00" : 56 "112233445566778899aabbccddeeff00" 57 } 58 } 59 ]; 60 61 // Specialized create media keys function, since the one in eme.js relies 62 // on listening for encrypted events, and we want to manage those 63 // ourselves within this test. 64 async function createAndSetMediaKeys(video, test) { 65 function streamType(type) { 66 var x = test.tracks.find(o => o.name == type); 67 return x ? x.type : undefined; 68 } 69 70 var configuration = { initDataTypes: ["cenc"] }; 71 if (streamType("video")) { 72 configuration.videoCapabilities = [{contentType: streamType("video")}]; 73 } 74 if (streamType("audio")) { 75 configuration.audioCapabilities = [{contentType: streamType("audio")}]; 76 } 77 let keySystemAccess = await navigator.requestMediaKeySystemAccess( 78 "org.w3.clearkey", [configuration]); 79 let mediaKeys = await keySystemAccess.createMediaKeys(); 80 return video.setMediaKeys(mediaKeys); 81 } 82 83 function startTest(test, token) { 84 manager.started(token); 85 let video = document.createElement("video"); 86 document.body.appendChild(video); 87 88 let encryptedEventCount = 0; 89 90 let initDatas = new Map(); 91 92 function handleEncrypted(event) { 93 // We get one 'encrypted' event for every run of contiguous PSSH boxes 94 // in each stream. Note that some of the PSSH boxes contained in the 95 // "bear" streams aren't in the Common Open PSSH box format, so our 96 // ClearKey CDM will reject those license requests. Some of the init 97 // data is also repeated. 98 encryptedEventCount++; 99 100 let hexStr = StringToHex(new TextDecoder().decode(event.initData)); 101 if (initDatas.has(hexStr)) { 102 // Already have a session for this. 103 return; 104 } 105 106 let initData = new Uint8Array(event.initData); 107 is(event.initDataType, "cenc", "'encrypted' event should have 'cenc' " + 108 "initDataType"); 109 Log(token, "encrypted event => len=" + initData.length + " " + hexStr); 110 let session = event.target.mediaKeys.createSession(); 111 initDatas.set(hexStr, session); 112 session.addEventListener("message", e => { 113 e.target.update( 114 GenerateClearKeyLicense(e.message, test.keys)); 115 }); 116 117 session.generateRequest(event.initDataType, event.initData); 118 } 119 120 video.addEventListener("encrypted", handleEncrypted); 121 122 video.addEventListener("ended", () => { 123 let expectedEncryptedEvents = 124 test.tracks.reduce((sum, track) => sum += track.initDatas, 0); 125 is(encryptedEventCount, expectedEncryptedEvents, 126 "Should get one 'encrypted' event per run of contiguous PSSH " + 127 "boxes in media."); 128 manager.finished(token); 129 }); 130 131 video.autoplay = true; 132 133 createAndSetMediaKeys(video, test, token) 134 .then(() => LoadTest(test, video, token)) 135 } 136 137 manager.runTests(psshTests, startTest); 138 139 </script> 140 </body> 141 </html>