Bug 1307019 - Testcase for encrypted MP4 without PSSH and MDSM waiting-for-CDM. r=jya draft
authorChris Pearce <cpearce@mozilla.com>
Mon, 03 Oct 2016 16:35:27 +1300
changeset 420249 b03910c96c8f61622ce7bc9fb7b53adc209526a4
parent 420248 85b303597a401a69f7e4ac63a267d8c8eb52ffa5
child 420254 fa95bc0632f02016ab35ae101e8161259c701cfd
push id31145
push usercpearce@mozilla.com
push dateMon, 03 Oct 2016 20:16:28 +0000
reviewersjya
bugs1307019, 1300069
milestone52.0a1
Bug 1307019 - Testcase for encrypted MP4 without PSSH and MDSM waiting-for-CDM. r=jya Tests that a fragmented MP4 file without a PSSH, but with encrypted valid tracks with valid TENC boxes, is able to load with EME. This is a test for the code path added in bug 1300069. We setup MSE before starting up EME, so that we exercise the "waiting for cdm" step in the MediaDecoderStateMachine, which was regressed in bug 1300069. MozReview-Commit-ID: BXgdzAikWoH
dom/media/test/eme.js
dom/media/test/mochitest.ini
dom/media/test/short-audio-fragmented-cenc-without-pssh.mp4
dom/media/test/short-audio-fragmented-cenc-without-pssh.mp4^headers^
dom/media/test/test_eme_missing_pssh.html
--- a/dom/media/test/eme.js
+++ b/dom/media/test/eme.js
@@ -456,8 +456,40 @@ function SetupEMEPref(callback) {
   if (SpecialPowers.Services.appinfo.name == "B2G" ||
       !manifestVideo().canPlayType("video/mp4")) {
     // XXX remove once we have mp4 PlatformDecoderModules on all platforms.
     prefs.push([ "media.use-blank-decoder", true ]);
   }
 
   SpecialPowers.pushPrefEnv({ "set" : prefs }, callback);
 }
+
+function fetchWithXHR(uri, onLoadFunction) {
+  var p = new Promise(function(resolve, reject) {
+    var xhr = new XMLHttpRequest();
+    xhr.open("GET", uri, true);
+    xhr.responseType = "arraybuffer";
+    xhr.addEventListener("load", function () {
+      is(xhr.status, 200, "fetchWithXHR load uri='" + uri + "' status=" + xhr.status);
+      resolve(xhr.response);
+    });
+    xhr.send();
+  });
+
+  if (onLoadFunction) {
+    p.then(onLoadFunction);
+  }
+
+  return p;
+};
+
+function once(target, name, cb) {
+  var p = new Promise(function(resolve, reject) {
+    target.addEventListener(name, function onceEvent(arg) {
+      target.removeEventListener(name, onceEvent);
+      resolve(arg);
+    });
+  });
+  if (cb) {
+    p.then(cb);
+  }
+  return p;
+}
--- a/dom/media/test/mochitest.ini
+++ b/dom/media/test/mochitest.ini
@@ -535,16 +535,18 @@ support-files =
   seekLies.sjs
   seek_with_sound.ogg^headers^
   sequential.vtt
   short-cenc.mp4
   sine.webm
   sine.webm^headers^
   short.mp4
   short.mp4^headers^
+  short-audio-fragmented-cenc-without-pssh.mp4
+  short-audio-fragmented-cenc-without-pssh.mp4^headers^
   short-video.ogv
   short-video.ogv^headers^
   small-shot-mp3.mp4
   small-shot-mp3.mp4^headers^
   small-shot.m4a
   small-shot.mp3
   small-shot.mp3^headers^
   small-shot.ogg
@@ -683,16 +685,18 @@ skip-if = buildapp == 'b2g' && toolkit !
 skip-if = (os == 'win' && os_version == '5.1') || (os != 'win' && toolkit != 'gonk')
 [test_eme_session_callable_value.html]
 [test_eme_canvas_blocked.html]
 skip-if = toolkit == 'android' # bug 1149374
 [test_eme_detach_media_keys.html]
 skip-if = toolkit == 'android' # bug 1149374
 [test_eme_initDataTypes.html]
 skip-if = toolkit == 'android' # bug 1149374
+[test_eme_missing_pssh.html]
+skip-if = toolkit == 'android' # bug 1149374
 [test_eme_non_mse_fails.html]
 skip-if = toolkit == 'android' # bug 1149374
 [test_eme_request_notifications.html]
 skip-if = toolkit == 'android' # bug 1149374
 [test_eme_persistent_sessions.html]
 skip-if = toolkit == 'android' # bug 1149374
 [test_eme_playback.html]
 skip-if = toolkit == 'android' || toolkit == 'gonk' # android: bug 1149374; gonk: bug 1193351
new file mode 100644
index 0000000000000000000000000000000000000000..bc58623999f9779a9fcd85a71793cb17646ec547
GIT binary patch
literal 9261
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
new file mode 100644
--- /dev/null
+++ b/dom/media/test/short-audio-fragmented-cenc-without-pssh.mp4^headers^
@@ -0,0 +1,1 @@
+Cache-Control: no-store
new file mode 100644
--- /dev/null
+++ b/dom/media/test/test_eme_missing_pssh.html
@@ -0,0 +1,92 @@
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <title>Test Encrypted Media Extensions</title>
+    <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+    <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+    <script type="text/javascript" src="manifest.js"></script>
+    <script type="text/javascript" src="eme.js"></script>
+  </head>
+  <body>
+    <audio controls id="audio"></audio>
+    <pre id="test">
+    <script class="testbody" type="text/javascript">
+
+      // Tests that a fragmented MP4 file without a PSSH, but with valid encrypted
+      // tracks with valid TENC boxes, is able to load with EME.
+      // We setup MSE before starting up EME, so that we exercise the "waiting for
+      // cdm" step in the MediaDecoderStateMachine.
+
+      SimpleTest.waitForExplicitFinish();
+
+      var pssh = [
+        0x00, 0x00, 0x00, 0x00,
+        0x70, 0x73, 0x73, 0x68, // BMFF box header (76 bytes, 'pssh')
+        0x01, 0x00, 0x00, 0x00,                         // Full box header (version = 1, flags = 0)
+        0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02, // SystemID
+        0xac, 0xe3, 0x3c, 0x1e, 0x52, 0xe2, 0xfb, 0x4b,
+        0x00, 0x00, 0x00, 0x01,                         // KID_count (1)
+        0x2f, 0xef, 0x8a, 0xd8, 0x12, 0xdf, 0x42, 0x97,
+        0x83, 0xe9, 0xbf, 0x6e, 0x5e, 0x49, 0x3e, 0x53,
+        0x00, 0x00, 0x00, 0x00                         // Size of Data (0)
+      ];
+
+      var audio = document.getElementById("audio");
+
+      function LoadEME() {
+        var options = [{
+          initDataType: 'cenc',
+          audioType: 'audio/mp4; codecs="mp4a.40.2"',
+        }];
+        navigator.requestMediaKeySystemAccess("org.w3.clearkey", options)
+          .then((keySystemAccess) => {
+            return keySystemAccess.createMediaKeys();
+          }, bail("Failed to request key system access."))
+
+          .then((mediaKeys) => {
+            audio.setMediaKeys(mediaKeys);
+            var session = mediaKeys.createSession();
+            once(session, "message", (message) => {
+              is(message.messageType, 'license-request', "Expected a license-request");
+              var license = new TextEncoder().encode(JSON.stringify({
+                'keys': [{
+                  'kty':'oct',
+                  'kid':'L--K2BLfQpeD6b9uXkk-Uw',
+                  'k':HexToBase64('7f412f0575f44f718259beef56ec7771')
+                 }],
+                 'type': 'temporary'
+              }));
+              session.update(license);
+            });
+            session.generateRequest('cenc', new Uint8Array(pssh));
+          });
+      }
+
+      function DownloadMedia(url, type, mediaSource) {
+        return new Promise(function(resolve, reject) {
+          var sourceBuffer = mediaSource.addSourceBuffer(type);
+          fetchWithXHR(url, (response) => {
+            once(sourceBuffer, "updateend", resolve);
+            sourceBuffer.appendBuffer(new Uint8Array(response));
+          });
+        });
+      }
+
+      function LoadMSE() {
+        var ms = new MediaSource();
+        audio.src = URL.createObjectURL(ms);
+
+        once(ms, "sourceopen", ()=>{
+          DownloadMedia('short-audio-fragmented-cenc-without-pssh.mp4', 'audio/mp4; codecs="mp4a.40.2"', ms)
+            .then(() => { ms.endOfStream(); LoadEME();});
+        });
+
+        audio.addEventListener("loadeddata", SimpleTest.finish);
+      }
+
+      SetupEMEPref(LoadMSE);
+
+  </script>
+  </pre>
+  </body>
+</html>