From b123e549151fe3d54d2cb5b8ed8992031304e54e Mon Sep 17 00:00:00 2001 From: Alastor Wu Date: Mon, 30 Oct 2017 17:48:43 +0800 Subject: [PATCH] Bug 1362440 - part4 : parsing entire content to decide whether it's init segment. r=jya 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 | 27 ++++++++--------------- 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/dom/media/mediasource/ContainerParser.cpp b/dom/media/mediasource/ContainerParser.cpp index 2093835d6a6df..4060ee23898b9 100644 --- a/dom/media/mediasource/ContainerParser.cpp +++ b/dom/media/mediasource/ContainerParser.cpp @@ -133,28 +133,19 @@ class WebMContainerParser : public ContainerParser 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 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