From 6b7997abbe7acb25d77266633db03680f80cb8eb Mon Sep 17 00:00:00 2001 From: wolfbeast Date: Thu, 7 May 2020 13:40:21 +0200 Subject: Issue #1536 - Part 2: Parse content to decide whether it's a media segment. --- dom/media/mediasource/ContainerParser.cpp | 31 ++++++++++--------------------- dom/media/webm/WebMBufferedParser.cpp | 6 ++++++ dom/media/webm/WebMBufferedParser.h | 13 +++++++++++-- 3 files changed, 27 insertions(+), 23 deletions(-) (limited to 'dom') diff --git a/dom/media/mediasource/ContainerParser.cpp b/dom/media/mediasource/ContainerParser.cpp index b4dcfde8a..628f8d7cd 100644 --- a/dom/media/mediasource/ContainerParser.cpp +++ b/dom/media/mediasource/ContainerParser.cpp @@ -154,31 +154,20 @@ public: MediaResult IsMediaSegmentPresent(MediaByteBuffer* aData) override { ContainerParser::IsMediaSegmentPresent(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) - // 0x1549a966 // -> Segment Info - // 0x1654ae6b // -> One or more Tracks - - // 0x1f43b675 // Cluster if (aData->Length() < 4) { return NS_ERROR_NOT_AVAILABLE; } - if ((*aData)[0] == 0x1f && (*aData)[1] == 0x43 && (*aData)[2] == 0xb6 && - (*aData)[3] == 0x75) { - return NS_OK; - } - // 0x1c53bb6b // Cues - if ((*aData)[0] == 0x1c && (*aData)[1] == 0x53 && (*aData)[2] == 0xbb && - (*aData)[3] == 0x6b) { - return NS_OK; + + WebMBufferedParser parser(0); + nsTArray mapping; + ReentrantMonitor dummy("dummy"); + parser.AppendMediaSegmentOnly(); + 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.GetClusterOffset() >= 0 ? NS_OK : NS_ERROR_NOT_AVAILABLE; } MediaResult ParseStartAndEndTimestamps(MediaByteBuffer* aData, diff --git a/dom/media/webm/WebMBufferedParser.cpp b/dom/media/webm/WebMBufferedParser.cpp index 0f6b0cd54..979308cf0 100644 --- a/dom/media/webm/WebMBufferedParser.cpp +++ b/dom/media/webm/WebMBufferedParser.cpp @@ -275,6 +275,12 @@ WebMBufferedParser::EndSegmentOffset(int64_t aOffset) return mBlockEndOffset; } +int64_t +WebMBufferedParser::GetClusterOffset() const +{ + return mClusterOffset; +} + // SyncOffsetComparator and TimeComparator are slightly confusing, in that // the nsTArray they're used with (mTimeMapping) is sorted by mEndOffset and // these comparators are used on the other fields of WebMTimeDataOffset. diff --git a/dom/media/webm/WebMBufferedParser.h b/dom/media/webm/WebMBufferedParser.h index 858653fc1..4245561fc 100644 --- a/dom/media/webm/WebMBufferedParser.h +++ b/dom/media/webm/WebMBufferedParser.h @@ -67,7 +67,7 @@ struct WebMBufferedParser , mVIntLeft(0) , mBlockSize(0) , mClusterTimecode(0) - , mClusterOffset(0) + , mClusterOffset(-1) , mClusterEndOffset(-1) , mBlockOffset(0) , mBlockTimecode(0) @@ -87,6 +87,12 @@ struct WebMBufferedParser return mTimecodeScale; } + // Use this function when we would only feed media segment for the parser. + void AppendMediaSegmentOnly() + { + mGotTimecodeScale = true; + } + // If this parser is not expected to parse a segment info, it must be told // the appropriate timecode scale to use from elsewhere. void SetTimecodeScale(uint32_t aTimecodeScale) { @@ -115,6 +121,9 @@ struct WebMBufferedParser // This allows to determine the end of the interval containg aOffset. int64_t EndSegmentOffset(int64_t aOffset); + // Return the Cluster offset, return -1 if we can't find the Cluster. + int64_t GetClusterOffset() const; + // The offset at which this parser started parsing. Used to merge // adjacent parsers, in which case the later parser adopts the earlier // parser's mStartOffset. @@ -232,7 +241,7 @@ private: // Start offset of the cluster currently being parsed. Used as the sync // point offset for the offset-to-time mapping as each block timecode is - // been parsed. + // been parsed. -1 if unknown. int64_t mClusterOffset; // End offset of the cluster currently being parsed. -1 if unknown. -- cgit v1.2.3