зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1362440 - part1 : add timecode checking for parser r=kinetik
The spec [1] defines that "Timecode (e7) MUST appear before Block (a1) or SimpleBlock (a3)". [1] https://www.matroska.org/technical/specs/index.html MozReview-Commit-ID: 7g8lgckuNif --HG-- extra : rebase_source : 4945dc4b0ab4b7480bf9c6416f9776fd6313c1e1
This commit is contained in:
Родитель
bd50b9031f
Коммит
58382a8ca5
|
@ -113,6 +113,7 @@ bool WebMBufferedParser::Append(const unsigned char* aBuffer, uint32_t aLength,
|
|||
} else {
|
||||
mClusterEndOffset = -1;
|
||||
}
|
||||
mGotClusterTimecode = false;
|
||||
mState = READ_ELEMENT_ID;
|
||||
break;
|
||||
case BLOCKGROUP_ID:
|
||||
|
@ -121,6 +122,11 @@ bool WebMBufferedParser::Append(const unsigned char* aBuffer, uint32_t aLength,
|
|||
case SIMPLEBLOCK_ID:
|
||||
/* FALLTHROUGH */
|
||||
case BLOCK_ID:
|
||||
if (!mGotClusterTimecode) {
|
||||
WEBM_DEBUG("The Timecode element must appear before any Block or "
|
||||
"SimpleBlock elements in a Cluster");
|
||||
return false;
|
||||
}
|
||||
mBlockSize = mElement.mSize.mValue;
|
||||
mBlockTimecode = 0;
|
||||
mBlockTimecodeLength = BLOCK_TIMECODE_LENGTH;
|
||||
|
@ -164,6 +170,7 @@ bool WebMBufferedParser::Append(const unsigned char* aBuffer, uint32_t aLength,
|
|||
break;
|
||||
case READ_TIMECODESCALE:
|
||||
if (!mGotTimecodeScale) {
|
||||
WEBM_DEBUG("Should get the SegmentInfo first");
|
||||
return false;
|
||||
}
|
||||
mTimecodeScale = mVInt.mValue;
|
||||
|
@ -171,6 +178,7 @@ bool WebMBufferedParser::Append(const unsigned char* aBuffer, uint32_t aLength,
|
|||
break;
|
||||
case READ_CLUSTER_TIMECODE:
|
||||
mClusterTimecode = mVInt.mValue;
|
||||
mGotClusterTimecode = true;
|
||||
mState = READ_ELEMENT_ID;
|
||||
break;
|
||||
case READ_BLOCK_TIMECODE:
|
||||
|
@ -190,6 +198,7 @@ bool WebMBufferedParser::Append(const unsigned char* aBuffer, uint32_t aLength,
|
|||
// Don't insert invalid negative timecodes.
|
||||
if (mBlockTimecode >= 0 || mClusterTimecode >= uint16_t(abs(mBlockTimecode))) {
|
||||
if (!mGotTimecodeScale) {
|
||||
WEBM_DEBUG("Should get the TimecodeScale first");
|
||||
return false;
|
||||
}
|
||||
uint64_t absTimecode = mClusterTimecode + mBlockTimecode;
|
||||
|
|
|
@ -75,6 +75,7 @@ struct WebMBufferedParser
|
|||
, mSkipBytes(0)
|
||||
, mTimecodeScale(1000000)
|
||||
, mGotTimecodeScale(false)
|
||||
, mGotClusterTimecode(false)
|
||||
{
|
||||
if (mStartOffset != 0) {
|
||||
mState = FIND_CLUSTER_SYNC;
|
||||
|
@ -260,6 +261,9 @@ private:
|
|||
// True if we read the timecode scale from the segment info or have
|
||||
// confirmed that the default value is to be used.
|
||||
bool mGotTimecodeScale;
|
||||
|
||||
// True if we've read the cluster time code.
|
||||
bool mGotClusterTimecode;
|
||||
};
|
||||
|
||||
class WebMBufferedState final
|
||||
|
|
Загрузка…
Ссылка в новой задаче