Bug 1362440 - part4 : parsing entire content to decide whether it's init segment. draft
authorAlastor Wu <alwu@mozilla.com>
Mon, 30 Oct 2017 17:48:43 +0800
changeset 688590 baa1314a7df0dc9a58c33da928eeb71e8d3161e9
parent 688589 b3298bc1c3e26948a94143586b3ac4c20ef2a2b3
child 738111 4d8e28f1fa1e935d78f3b215b5aefb9781852254
push id86795
push useralwu@mozilla.com
push dateMon, 30 Oct 2017 09:49:00 +0000
bugs1362440
milestone58.0a1
Bug 1362440 - part4 : parsing entire content to decide whether it's init segment. The spec [1] defines what's the init segment, and the parser would return error if the format is not correct. [1] https://w3c.github.io/media-source/webm-byte-stream-format.html MozReview-Commit-ID: 3nFHHdn5b89
dom/media/mediasource/ContainerParser.cpp
--- a/dom/media/mediasource/ContainerParser.cpp
+++ b/dom/media/mediasource/ContainerParser.cpp
@@ -128,38 +128,29 @@ public:
   }
 
   static const unsigned NS_PER_USEC = 1000;
   static const unsigned USEC_PER_SEC = 1000000;
 
   MediaResult IsInitSegmentPresent(MediaByteBuffer* aData) override
   {
     ContainerParser::IsInitSegmentPresent(aData);
-    // XXX: This is overly primitive, needs to collect data as it's appended
-    // to the SB and handle, rather than assuming everything is present in a
-    // single aData segment.
-    // 0x1a45dfa3 // EBML
-    // ...
-    // DocType == "webm"
-    // ...
-    // 0x18538067 // Segment (must be "unknown" size or contain a value large
-                  // enough to include the Segment Information and Tracks
-                  // elements that follow)
-    // 0x1549a966 // -> Segment Info
-    // 0x1654ae6b // -> One or more Tracks
-
-    // 0x1a45dfa3 // EBML
     if (aData->Length() < 4) {
       return NS_ERROR_NOT_AVAILABLE;
     }
-    if ((*aData)[0] == 0x1a && (*aData)[1] == 0x45 && (*aData)[2] == 0xdf &&
-        (*aData)[3] == 0xa3) {
-      return NS_OK;
+
+    WebMBufferedParser parser(0);
+    nsTArray<WebMTimeDataOffset> mapping;
+    ReentrantMonitor dummy("dummy");
+    bool result = parser.Append(aData->Elements(), aData->Length(), mapping,
+                                dummy);
+    if (!result) {
+      return MediaResult(NS_ERROR_FAILURE, RESULT_DETAIL("Invalid webm content"));
     }
-    return MediaResult(NS_ERROR_FAILURE, RESULT_DETAIL("Invalid webm content"));
+    return parser.mInitEndOffset > 0 ? NS_OK : NS_ERROR_NOT_AVAILABLE;
   }
 
   MediaResult IsMediaSegmentPresent(MediaByteBuffer* aData) override
   {
     ContainerParser::IsMediaSegmentPresent(aData);
     if (aData->Length() < 4) {
       return NS_ERROR_NOT_AVAILABLE;
     }