Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 <!DOCTYPE html> | |
| 2 <html> | |
| 3 <head> | |
| 4 <title>Clear Key Playback with Multiple Sessions</title> | |
| 5 <script src="encrypted-media-utils.js"></script> | |
| 6 <script src="../w3c-media-utils.js"></script> | |
| 7 <script src="../../resources/testharness.js"></script> | |
| 8 <script src="../../resources/testharnessreport.js"></script> | |
| 9 </head> | |
| 10 <body> | |
| 11 <video id="testVideo"></video> | |
| 12 <div id="log"></div> | |
| 13 <p>Test playback of encrypted media using Clear Key key system with mult iple sessions.</p> | |
| 14 <script> | |
| 15 async_test(function(test) | |
| 16 { | |
| 17 var video = document.getElementById("testVideo"); | |
| 18 var mediaKeys = new MediaKeys("org.w3.clearkey"); | |
| 19 var mediaKeyAudioSession = null; | |
| 20 var mediaKeyVideoSession = null; | |
|
xhwang
2014/03/19 01:22:00
nit: audioMediaKeySession/videoMediaKeySession ?
jrummell
2014/03/20 22:55:33
Done.
| |
| 21 var audioSessionReadyReceived = false; | |
| 22 var videoSessionReadyReceived = false; | |
| 23 | |
| 24 // The 2 streams use different key ids, but the keys are the | |
| 25 // same. | |
| 26 var audioKeyId = "0123456789"; | |
| 27 var audioKey = new Uint8Array([0x7D, 0xE2, 0x6B, 0xE4, 0xD2, 0xC 2, 0x2F, 0xD7, | |
| 28 0xD7, 0x7A, 0x1F, 0x4C, 0xA5, 0xA 9, 0x97, 0x0F]); | |
| 29 var videoKeyId = "0123456789012345"; | |
| 30 var videoKey = audioKey; | |
| 31 | |
| 32 function onNeedKey(event) | |
| 33 { | |
| 34 assert_equals(event.target, video); | |
| 35 assert_true(event instanceof window.MediaKeyNeededEvent); | |
| 36 assert_equals(event.type, "needkey"); | |
| 37 | |
| 38 // Ideally we could just look at event.contentType, but it | |
| 39 // is used to specify the encoding format, not the stream | |
| 40 // (and both streams are webm). | |
| 41 var keyId = String.fromCharCode.apply(null, event.initData); | |
| 42 if (keyId == videoKeyId) { | |
| 43 assert_equals(mediaKeyVideoSession, null); | |
| 44 mediaKeyVideoSession = mediaKeys.createSession(event.con tentType, event.initData); | |
| 45 waitForEventAndRunStep("message", mediaKeyVideoSession, onVideoMessage, test); | |
| 46 } else { | |
| 47 assert_equals(keyId, audioKeyId); | |
| 48 assert_equals(mediaKeyAudioSession, null); | |
| 49 mediaKeyAudioSession = mediaKeys.createSession(event.con tentType, event.initData); | |
| 50 waitForEventAndRunStep("message", mediaKeyAudioSession, onAudioMessage, test); | |
| 51 } | |
| 52 } | |
| 53 | |
| 54 function onAudioMessage(event) | |
| 55 { | |
| 56 assert_true(event instanceof window.MediaKeyMessageEvent); | |
| 57 assert_equals(event.target, mediaKeyAudioSession); | |
| 58 assert_equals(event.type, "message"); | |
| 59 | |
| 60 var keyId = event.message; | |
| 61 assert_equals(String.fromCharCode.apply(null, keyId), audioK eyId); | |
| 62 var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId , audioKey))); | |
| 63 mediaKeyAudioSession.update(jwkSet); | |
| 64 waitForEventAndRunStep("ready", mediaKeyAudioSession, onAudi oReady, test); | |
| 65 } | |
| 66 | |
| 67 function onVideoMessage(event) | |
| 68 { | |
| 69 assert_true(event instanceof window.MediaKeyMessageEvent); | |
| 70 assert_equals(event.target, mediaKeyVideoSession); | |
| 71 assert_equals(event.type, "message"); | |
| 72 | |
| 73 var keyId = event.message; | |
| 74 assert_equals(String.fromCharCode.apply(null, keyId), videoK eyId); | |
| 75 var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId , videoKey))); | |
| 76 mediaKeyVideoSession.update(jwkSet); | |
| 77 waitForEventAndRunStep("ready", mediaKeyVideoSession, onVide oReady, test); | |
| 78 } | |
|
xhwang
2014/03/19 01:22:00
It seems we can combine onAudioMessage and onVideo
jrummell
2014/03/20 22:55:33
It doesn't really save that much duplication (most
| |
| 79 | |
| 80 function onAudioReady(event) | |
| 81 { | |
| 82 assert_true(event instanceof window.Event); | |
| 83 assert_equals(event.target, mediaKeyAudioSession); | |
| 84 assert_equals(event.type, "ready"); | |
| 85 audioSessionReadyReceived = true; | |
| 86 } | |
| 87 | |
| 88 function onVideoReady(event) | |
| 89 { | |
| 90 assert_true(event instanceof window.Event); | |
| 91 assert_equals(event.target, mediaKeyVideoSession); | |
| 92 assert_equals(event.type, "ready"); | |
| 93 videoSessionReadyReceived = true; | |
| 94 } | |
|
xhwang
2014/03/19 01:22:00
ditto for combining methods to reduce duplicate co
jrummell
2014/03/20 22:55:33
Done.
| |
| 95 | |
| 96 function onPlaying(event) | |
| 97 { | |
| 98 // Not using waitForEventAndRunStep() to avoid too many EVEN T(onTimeUpdate) logs. | |
| 99 video.addEventListener("timeupdate", onTimeUpdate, true); | |
| 100 } | |
| 101 | |
| 102 function onTimeUpdate(event) | |
| 103 { | |
| 104 if (!audioSessionReadyReceived || !videoSessionReadyReceived ) | |
| 105 return; | |
| 106 if (event.target.currentTime < 0.2) | |
| 107 return; | |
|
xhwang
2014/03/19 01:22:00
If audio key is provided but video key is not prov
jrummell
2014/03/20 22:55:33
If I change onVideoMessage() to do nothing, the Pl
| |
| 108 | |
| 109 test.done(); | |
| 110 } | |
| 111 | |
| 112 waitForEventAndRunStep("needkey", video, onNeedKey, test); | |
| 113 waitForEventAndRunStep("playing", video, onPlaying, test); | |
| 114 | |
| 115 video.src = "../content/test-encrypted-2-keys.webm"; | |
|
xhwang
2014/03/19 01:22:00
This file is a bit confusing. It's called 2-keys b
jrummell
2014/03/20 22:55:33
Done.
| |
| 116 video.setMediaKeys(mediaKeys); | |
| 117 video.play(); | |
| 118 }, "Playback using Clear Key key system with multiple sessions."); | |
| 119 </script> | |
| 120 </body> | |
| 121 </html> | |
| OLD | NEW |