author | Attila Craciun <acraciun@mozilla.com> |
Mon, 30 Oct 2017 12:24:16 +0200 | |
changeset 389009 | 099c04652fa5523df2f981946116b63abdf58403 |
parent 389008 | 28fabecbafb2e88d983a1d13c71d98bdaa35fc56 (diff) |
parent 388986 | 515407ebfa1433c31144374313bbfd8b942af41c (current diff) |
child 389010 | 93d170c6bbbc52634bd42a2d5c99e9b402daf0d9 |
push id | 32777 |
push user | archaeopteryx@coole-files.de |
push date | Mon, 30 Oct 2017 22:44:45 +0000 |
treeherder | mozilla-central@dd0f265a1300 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | merge, merge |
milestone | 58.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/media/mediasource/ContainerParser.cpp +++ b/dom/media/mediasource/ContainerParser.cpp @@ -128,68 +128,48 @@ 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); - // 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; + + WebMBufferedParser parser(0); + nsTArray<WebMTimeDataOffset> 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")); } - // 0x1c53bb6b // Cues - if ((*aData)[0] == 0x1c && (*aData)[1] == 0x53 && (*aData)[2] == 0xbb && - (*aData)[3] == 0x6b) { - return NS_OK; - } - return MediaResult(NS_ERROR_FAILURE, RESULT_DETAIL("Invalid webm content")); + return parser.GetClusterOffset() >= 0 ? NS_OK : NS_ERROR_NOT_AVAILABLE; } MediaResult ParseStartAndEndTimestamps(MediaByteBuffer* aData, int64_t& aStart, int64_t& aEnd) override { bool initSegment = NS_SUCCEEDED(IsInitSegmentPresent(aData));
--- a/dom/media/mediasource/test/mochitest.ini +++ b/dom/media/mediasource/test/mochitest.ini @@ -40,17 +40,20 @@ support-files = aac51-48000-128000-1.m4s aac51-48000-128000-1.m4s^headers^ aac51-48000-128000-2.m4s aac51-48000-128000-2.m4s^headers^ bipbop/bipbop_480_624kbps-videoinit.mp4 bipbop/bipbop_480_624kbps-videoinit.mp4^headers^ bipbop/bipbop_480_624kbps-video1.m4s bipbop/bipbop_480_624kbps-video1.m4s^headers^ bipbop/bipbop_480_624kbps-video2.m4s bipbop/bipbop_480_624kbps-video2.m4s^headers^ flac/IS.mp4 flac/IS.mp4^headers^ flac/00001.m4s flac/00001.m4s^headers^ flac/00002.m4s flac/00002.m4s^headers^ flac/00003.m4s flac/00003.m4s^headers^ avc3/init.mp4 avc3/init.mp4^headers^ avc3/segment1.m4s avc3/segment1.m4s^headers^ + tags_before_cluster.webm + tags_before_cluster.webm^header^ +[test_AppendPartialInitSegment.html] [test_AVC3_mp4.html] skip-if = toolkit == 'android' # Not supported on android [test_AudioChange_mp4.html] skip-if = toolkit == 'android' # Not supported on android [test_AutoRevocation.html] tags = firstpartyisolation [test_BufferedSeek.html] skip-if = android_version == '22' # bug 1329532 bug 1066090 @@ -150,9 +153,9 @@ skip-if = toolkit == 'android' # Not sup [test_WaitingOnMissingData.html] skip-if = (toolkit == 'android') #timeout android only bug 1101187 [test_WaitingOnMissingData_mp4.html] skip-if = toolkit == 'android' # Not supported on android [test_WaitingOnMissingDataEnded_mp4.html] skip-if = toolkit == 'android' # Not supported on android [test_WaitingToEndedTransition_mp4.html] skip-if = toolkit == 'android' # Not supported on android - +[test_WebMTagsBeforeCluster.html]
new file mode 100644 index 0000000000000000000000000000000000000000..cf7d596b0ec7020766c8d21cdc5627d3f146dffc GIT binary patch literal 111714 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	<x;jqvcxwW!O-=%ctTPU!qpY5T*VYuG5S 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%0D+_HEO{fI8EcjMdwt&nut|9ees>rB%o~@s}3P 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 F{|AiQ%ntwn
new file mode 100644 --- /dev/null +++ b/dom/media/mediasource/test/tags_before_cluster.webm^header^ @@ -0,0 +1,1 @@ +Cache-Control: no-store
new file mode 100644 --- /dev/null +++ b/dom/media/mediasource/test/test_AppendPartialInitSegment.html @@ -0,0 +1,45 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>MSE: split init segment and append them separately </title> + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <script type="text/javascript" src="mediasource.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> +</head> +<body> +<pre id="test"> +<script class="testbody" type="text/javascript"> + +SimpleTest.waitForExplicitFinish(); + +runWithMSE(function (ms, v) { + ms.addEventListener("sourceopen", function () { + var sb = ms.addSourceBuffer("video/webm"); + + fetchWithXHR("seek.webm", async function (arrayBuffer) { + // init segment is total 236 bytes. + info("- append partial init segment -"); + sb.appendBuffer(new Uint8Array(arrayBuffer, 0, 100)); + + info("- wait for updateend -"); + await once(sb, "updateend"); + + info("- append remaining init segment -"); + sb.appendBuffer(new Uint8Array(arrayBuffer, 100, 136)); + + info("- wait for metadata -"); + await once(v, "loadedmetadata"); + is(v.videoWidth, 320, "videoWidth has correct initial value"); + is(v.videoHeight, 240, "videoHeight has correct initial value"); + + info("- wait for updateend -"); + await once(sb, "updateend"); + SimpleTest.finish(); + }); + }); +}); + +</script> +</pre> +</body> +</html>
new file mode 100644 --- /dev/null +++ b/dom/media/mediasource/test/test_WebMTagsBeforeCluster.html @@ -0,0 +1,49 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>MSE: WebM tags element before cluster element</title> + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <script type="text/javascript" src="mediasource.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> +</head> +<body> +<pre id="test"> +<script class="testbody" type="text/javascript"> + +SimpleTest.waitForExplicitFinish(); + +addMSEPrefs(["media.mediasource.webm.enabled", true]); + +runWithMSE(function (ms, v) { + ms.addEventListener("sourceopen", function () { + var sb = ms.addSourceBuffer("video/webm"); + + fetchWithXHR("tags_before_cluster.webm", async function (arrayBuffer) { + info("- append buffer -"); + sb.appendBuffer(new Uint8Array(arrayBuffer)); + + info("- wait for metadata -"); + await once(v, "loadedmetadata"); + + info("- wait for updateend -"); + await once(sb, "updateend"); + + info("- call end of stream -"); + ms.endOfStream(); + await once(ms, "sourceended"); + + info("- check buffered range -"); + is(sb.buffered.length, 1, "buffered range is not empty."); + + info("- video is playing -"); + v.play(); + await once(v, "timeupdate"); + SimpleTest.finish(); + }); + }); +}); + +</script> +</pre> +</body> +</html>
--- a/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp +++ b/dom/media/platforms/ffmpeg/FFmpegLibWrapper.cpp @@ -6,16 +6,17 @@ #include "FFmpegLog.h" #include "MediaPrefs.h" #include "mozilla/PodOperations.h" #include "mozilla/Types.h" #include "PlatformDecoderModule.h" #include "prlink.h" #define AV_LOG_DEBUG 48 +#define AV_LOG_INFO 32 namespace mozilla { FFmpegLibWrapper::LinkResult FFmpegLibWrapper::Link() { if (!mAVCodecLib || !mAVUtilLib) { @@ -136,20 +137,23 @@ FFmpegLibWrapper::Link() AV_FUNC(av_frame_alloc, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57)) AV_FUNC(av_frame_free, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57)) AV_FUNC(av_frame_unref, (AV_FUNC_AVUTIL_55 | AV_FUNC_AVUTIL_56 | AV_FUNC_AVUTIL_57)) AV_FUNC_OPTION(av_frame_get_colorspace, AV_FUNC_AVUTIL_ALL) #undef AV_FUNC #undef AV_FUNC_OPTION avcodec_register_all(); -#ifdef DEBUG - av_log_set_level(AV_LOG_DEBUG); -#endif - + if (MOZ_LOG_TEST(sPDMLog, LogLevel::Debug)) { + av_log_set_level(AV_LOG_DEBUG); + } else if (MOZ_LOG_TEST(sPDMLog, LogLevel::Info)) { + av_log_set_level(AV_LOG_INFO); + } else { + av_log_set_level(0); + } return LinkResult::Success; } void FFmpegLibWrapper::Unlink() { if (av_lockmgr_register) { // Registering a null lockmgr cause the destruction of libav* global mutexes
--- a/dom/media/platforms/wrappers/H264Converter.cpp +++ b/dom/media/platforms/wrappers/H264Converter.cpp @@ -116,17 +116,17 @@ H264Converter::Decode(MediaRawData* aSam return DecodePromise::CreateAndReject(rv, __func__); } if (mNeedKeyframe && !aSample->mKeyframe) { return DecodePromise::CreateAndResolve(DecodedData(), __func__); } if (!*mNeedAVCC && - !mp4_demuxer::AnnexB::ConvertSampleToAnnexB(aSample, mNeedKeyframe)) { + mp4_demuxer::AnnexB::ConvertSampleToAnnexB(aSample, mNeedKeyframe).isErr()) { return DecodePromise::CreateAndReject( MediaResult(NS_ERROR_OUT_OF_MEMORY, RESULT_DETAIL("ConvertSampleToAnnexB")), __func__); } mNeedKeyframe = false; @@ -370,17 +370,17 @@ H264Converter::DecodeFirstSample(MediaRa { if (mNeedKeyframe && !aSample->mKeyframe) { mDecodePromise.Resolve(mPendingFrames, __func__); mPendingFrames.Clear(); return; } if (!*mNeedAVCC && - !mp4_demuxer::AnnexB::ConvertSampleToAnnexB(aSample, mNeedKeyframe)) { + mp4_demuxer::AnnexB::ConvertSampleToAnnexB(aSample, mNeedKeyframe).isErr()) { mDecodePromise.Reject(MediaResult(NS_ERROR_OUT_OF_MEMORY, RESULT_DETAIL("ConvertSampleToAnnexB")), __func__); return; } mNeedKeyframe = false;
--- a/dom/media/webm/WebMBufferedParser.cpp +++ b/dom/media/webm/WebMBufferedParser.cpp @@ -108,24 +108,30 @@ bool WebMBufferedParser::Append(const un mClusterOffset = mCurrentOffset + (p - aBuffer) - (mElement.mID.mLength + mElement.mSize.mLength); // Handle "unknown" length; if (mElement.mSize.mValue + 1 != uint64_t(1) << (mElement.mSize.mLength * 7)) { mClusterEndOffset = mClusterOffset + mElement.mID.mLength + mElement.mSize.mLength + mElement.mSize.mValue; } else { mClusterEndOffset = -1; } + mGotClusterTimecode = false; mState = READ_ELEMENT_ID; break; case BLOCKGROUP_ID: mState = READ_ELEMENT_ID; break; 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; mBlockOffset = mCurrentOffset + (p - aBuffer) - (mElement.mID.mLength + mElement.mSize.mLength); mState = READ_VINT; mNextState = READ_BLOCK_TIMECODE; break; @@ -159,23 +165,25 @@ bool WebMBufferedParser::Append(const un mVInt.mValue |= *p++; mVIntLeft -= 1; } else { mState = mNextState; } break; case READ_TIMECODESCALE: if (!mGotTimecodeScale) { + WEBM_DEBUG("Should get the SegmentInfo first"); return false; } mTimecodeScale = mVInt.mValue; mState = READ_ELEMENT_ID; break; case READ_CLUSTER_TIMECODE: mClusterTimecode = mVInt.mValue; + mGotClusterTimecode = true; mState = READ_ELEMENT_ID; break; case READ_BLOCK_TIMECODE: if (mBlockTimecodeLength) { mBlockTimecode <<= 8; mBlockTimecode |= *p++; mBlockTimecodeLength -= 1; } else { @@ -185,16 +193,17 @@ bool WebMBufferedParser::Append(const un ReentrantMonitorAutoEnter mon(aReentrantMonitor); int64_t endOffset = mBlockOffset + mBlockSize + mElement.mID.mLength + mElement.mSize.mLength; uint32_t idx = aMapping.IndexOfFirstElementGt(endOffset); if (idx == 0 || aMapping[idx - 1] != endOffset) { // 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; absTimecode *= mTimecodeScale; // Avoid creating an entry if the timecode is out of order // (invalid according to the WebM specification) so that // ordering invariants of aMapping are not violated. if (idx == 0 || @@ -261,16 +270,22 @@ WebMBufferedParser::EndSegmentOffset(int { if (mLastInitStartOffset > aOffset || mClusterOffset > aOffset) { return std::min(mLastInitStartOffset >= 0 ? mLastInitStartOffset : INT64_MAX, mClusterOffset >= 0 ? mClusterOffset : INT64_MAX); } 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. // This is only valid because timecodes are required to be monotonically // increasing within a file (thus establishing an ordering relationship with // mTimecode), and mEndOffset is derived from mSyncOffset. struct SyncOffsetComparator { bool Equals(const WebMTimeDataOffset& a, const int64_t& b) const {
--- a/dom/media/webm/WebMBufferedParser.h +++ b/dom/media/webm/WebMBufferedParser.h @@ -62,35 +62,42 @@ struct WebMBufferedParser , mState(READ_ELEMENT_ID) , mNextState(READ_ELEMENT_ID) , mVIntRaw(false) , mLastInitStartOffset(-1) , mClusterSyncPos(0) , mVIntLeft(0) , mBlockSize(0) , mClusterTimecode(0) - , mClusterOffset(0) + , mClusterOffset(-1) , mClusterEndOffset(-1) , mBlockOffset(0) , mBlockTimecode(0) , mBlockTimecodeLength(0) , mSkipBytes(0) , mTimecodeScale(1000000) , mGotTimecodeScale(false) + , mGotClusterTimecode(false) { if (mStartOffset != 0) { mState = FIND_CLUSTER_SYNC; } } uint32_t GetTimecodeScale() { MOZ_ASSERT(mGotTimecodeScale); 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) { mTimecodeScale = aTimecodeScale; mGotTimecodeScale = true; } // Steps the parser through aLength bytes of data. Always consumes @@ -109,16 +116,19 @@ struct WebMBufferedParser return mCurrentOffset < aOffset; } // Returns the start offset of the init (EBML) or media segment (Cluster) // following the aOffset position. If none were found, returns mBlockEndOffset. // 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. int64_t mStartOffset; // Current offset within the stream. Updated in chunks as Append() consumes // data. int64_t mCurrentOffset; @@ -226,17 +236,17 @@ private: // block is skipped once the block timecode has been parsed. uint64_t mBlockSize; // Cluster-level timecode. uint64_t mClusterTimecode; // 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. int64_t mClusterEndOffset; // Start offset of the block currently being parsed. Used as the byte // offset for the offset-to-time mapping once the block timecode has been // parsed. @@ -255,16 +265,19 @@ private: // Timecode scale read from the segment info and used to scale absolute // timecodes. uint32_t mTimecodeScale; // 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 { NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WebMBufferedState) public: WebMBufferedState()
--- a/dom/vr/VRServiceTest.cpp +++ b/dom/vr/VRServiceTest.cpp @@ -25,16 +25,17 @@ NS_INTERFACE_MAP_END_INHERITING(DOMEvent NS_IMPL_ADDREF_INHERITED(VRMockDisplay, DOMEventTargetHelper) NS_IMPL_RELEASE_INHERITED(VRMockDisplay, DOMEventTargetHelper) VRMockDisplay::VRMockDisplay(const nsCString& aID, uint32_t aDeviceID) : mDeviceID(aDeviceID) , mTimestamp(TimeStamp::Now()) { + memset(&mDisplayInfo, 0, sizeof(mDisplayInfo)); mDisplayInfo.mDisplayName = aID; mDisplayInfo.mType = VRDeviceType::Puppet; mDisplayInfo.mIsConnected = true; mDisplayInfo.mIsMounted = false; mDisplayInfo.mCapabilityFlags = VRDisplayCapabilityFlags::Cap_None | VRDisplayCapabilityFlags::Cap_Orientation | VRDisplayCapabilityFlags::Cap_AngularAcceleration | VRDisplayCapabilityFlags::Cap_Position |
--- a/editor/libeditor/EditorBase.cpp +++ b/editor/libeditor/EditorBase.cpp @@ -3538,54 +3538,54 @@ EditorBase::IsBlockNode(nsINode* aNode) // screwing around with the class hierarchy here in order // to not duplicate the code in GetNextNode/GetPrevNode // across both EditorBase/HTMLEditor. return false; } bool EditorBase::CanContain(nsINode& aParent, - nsIContent& aChild) + nsIContent& aChild) const { switch (aParent.NodeType()) { case nsIDOMNode::ELEMENT_NODE: case nsIDOMNode::DOCUMENT_FRAGMENT_NODE: return TagCanContain(*aParent.NodeInfo()->NameAtom(), aChild); } return false; } bool EditorBase::CanContainTag(nsINode& aParent, - nsAtom& aChildTag) + nsAtom& aChildTag) const { switch (aParent.NodeType()) { case nsIDOMNode::ELEMENT_NODE: case nsIDOMNode::DOCUMENT_FRAGMENT_NODE: return TagCanContainTag(*aParent.NodeInfo()->NameAtom(), aChildTag); } return false; } bool EditorBase::TagCanContain(nsAtom& aParentTag, - nsIContent& aChild) + nsIContent& aChild) const { switch (aChild.NodeType()) { case nsIDOMNode::TEXT_NODE: case nsIDOMNode::ELEMENT_NODE: case nsIDOMNode::DOCUMENT_FRAGMENT_NODE: return TagCanContainTag(aParentTag, *aChild.NodeInfo()->NameAtom()); } return false; } bool EditorBase::TagCanContainTag(nsAtom& aParentTag, - nsAtom& aChildTag) + nsAtom& aChildTag) const { return true; } bool EditorBase::IsRoot(nsIDOMNode* inNode) { NS_ENSURE_TRUE(inNode, false);
--- a/editor/libeditor/EditorBase.h +++ b/editor/libeditor/EditorBase.h @@ -765,20 +765,20 @@ public: static inline bool NodeIsType(nsIDOMNode* aNode, nsAtom* aTag) { return GetTag(aNode) == aTag; } /** * Returns true if aParent can contain a child of type aTag. */ - bool CanContain(nsINode& aParent, nsIContent& aChild); - bool CanContainTag(nsINode& aParent, nsAtom& aTag); - bool TagCanContain(nsAtom& aParentTag, nsIContent& aChild); - virtual bool TagCanContainTag(nsAtom& aParentTag, nsAtom& aChildTag); + bool CanContain(nsINode& aParent, nsIContent& aChild) const; + bool CanContainTag(nsINode& aParent, nsAtom& aTag) const; + bool TagCanContain(nsAtom& aParentTag, nsIContent& aChild) const; + virtual bool TagCanContainTag(nsAtom& aParentTag, nsAtom& aChildTag) const; /** * Returns true if aNode is our root node. */ bool IsRoot(nsIDOMNode* inNode); bool IsRoot(nsINode* inNode); bool IsEditorRoot(nsINode* aNode);
--- a/editor/libeditor/HTMLEditRules.cpp +++ b/editor/libeditor/HTMLEditRules.cpp @@ -1532,16 +1532,45 @@ HTMLEditRules::WillLoadHTML(Selection* a } mHTMLEditor->DeleteNode(mBogusNode); mBogusNode = nullptr; } return NS_OK; } +bool +HTMLEditRules::CanContainParagraph(Element& aElement) const +{ + if (NS_WARN_IF(!mHTMLEditor)) { + return false; + } + + if (mHTMLEditor->CanContainTag(aElement, *nsGkAtoms::p)) { + return true; + } + + // Even if the element cannot have a <p> element as a child, it can contain + // <p> element as a descendant if it's one of the following elements. + if (aElement.IsAnyOfHTMLElements(nsGkAtoms::ol, + nsGkAtoms::ul, + nsGkAtoms::dl, + nsGkAtoms::table, + nsGkAtoms::thead, + nsGkAtoms::tbody, + nsGkAtoms::tfoot, + nsGkAtoms::tr)) { + return true; + } + + // XXX Otherwise, Chromium checks the CSS box is a block, but we don't do it + // for now. + return false; +} + nsresult HTMLEditRules::WillInsertBreak(Selection& aSelection, bool* aCancel, bool* aHandled) { MOZ_ASSERT(aCancel && aHandled); *aCancel = false; *aHandled = false; @@ -1580,64 +1609,91 @@ HTMLEditRules::WillInsertBreak(Selection int32_t offset = aSelection.GetRangeAt(0)->StartOffset(); // Do nothing if the node is read-only if (!htmlEditor->IsModifiableNode(node)) { *aCancel = true; return NS_OK; } - // Identify the block - nsCOMPtr<Element> blockParent = htmlEditor->GetBlock(node); - NS_ENSURE_TRUE(blockParent, NS_ERROR_FAILURE); - // If the active editing host is an inline element, or if the active editing // host is the block parent itself and we're configured to use <br> as a // paragraph separator, just append a <br>. nsCOMPtr<Element> host = htmlEditor->GetActiveEditingHost(); if (NS_WARN_IF(!host)) { return NS_ERROR_FAILURE; } - ParagraphSeparator separator = mHTMLEditor->GetDefaultParagraphSeparator(); - if (!IsBlockNode(*host) || - // The nodes that can contain p and div are the same. If the editing - // host is a <p> or similar, we have to just insert a newline. - (!mHTMLEditor->CanContainTag(*host, *nsGkAtoms::p) && - // These can't contain <p> as a child, but can as a descendant, so we - // don't have to fall back to inserting a newline. - !host->IsAnyOfHTMLElements(nsGkAtoms::ol, nsGkAtoms::ul, nsGkAtoms::dl, - nsGkAtoms::table, nsGkAtoms::thead, - nsGkAtoms::tbody, nsGkAtoms::tfoot, - nsGkAtoms::tr)) || - (host == blockParent && separator == ParagraphSeparator::br)) { + + // Look for the nearest parent block. However, don't return error even if + // there is no block parent here because in such case, i.e., editing host + // is an inline element, we should insert <br> simply. + RefPtr<Element> blockParent = HTMLEditor::GetBlock(node, host); + + ParagraphSeparator separator = htmlEditor->GetDefaultParagraphSeparator(); + bool insertBRElement; + // If there is no block parent in the editing host, i.e., the editing host + // itself is also a non-block element, we should insert a <br> element. + if (!blockParent) { + // XXX Chromium checks if the CSS box of the editing host is block. + insertBRElement = true; + } + // If only the editing host is block, and the default paragraph separator + // is <br> or the editing host cannot contain a <p> element, we should + // insert a <br> element. + else if (host == blockParent) { + insertBRElement = + separator == ParagraphSeparator::br || !CanContainParagraph(*host); + } + // If the nearest block parent is a single-line container declared in + // the execCommand spec and not the editing host, we should separate the + // block even if the default paragraph separator is <br> element. + else if (HTMLEditUtils::IsSingleLineContainer(*blockParent)) { + insertBRElement = false; + } + // Otherwise, unless there is no block ancestor which can contain <p> + // element, we shouldn't insert a <br> element here. + else { + insertBRElement = true; + for (Element* blockAncestor = blockParent; + blockAncestor && insertBRElement; + blockAncestor = HTMLEditor::GetBlockNodeParent(blockAncestor, host)) { + insertBRElement = !CanContainParagraph(*blockAncestor); + } + } + + // If we cannot insert a <p>/<div> element at the selection, we should insert + // a <br> element instead. + if (insertBRElement) { nsresult rv = StandardBreakImpl(node, offset, aSelection); NS_ENSURE_SUCCESS(rv, rv); *aHandled = true; return NS_OK; } + if (host == blockParent && separator != ParagraphSeparator::br) { // Insert a new block first MOZ_ASSERT(separator == ParagraphSeparator::div || separator == ParagraphSeparator::p); nsresult rv = MakeBasicBlock(aSelection, ParagraphSeparatorElement(separator)); // We warn on failure, but don't handle it, because it might be harmless. // Instead we just check that a new block was actually created. - Unused << NS_WARN_IF(NS_FAILED(rv)); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), + "HTMLEditRules::MakeBasicBlock() failed"); // Reinitialize node/offset in case they're not inside the new block if (NS_WARN_IF(!aSelection.GetRangeAt(0) || !aSelection.GetRangeAt(0)->GetStartContainer())) { return NS_ERROR_FAILURE; } node = *aSelection.GetRangeAt(0)->GetStartContainer(); child = aSelection.GetRangeAt(0)->GetChildAtStartOffset(); offset = aSelection.GetRangeAt(0)->StartOffset(); - blockParent = mHTMLEditor->GetBlock(node); + blockParent = mHTMLEditor->GetBlock(node, host); if (NS_WARN_IF(!blockParent)) { return NS_ERROR_UNEXPECTED; } if (NS_WARN_IF(blockParent == host)) { // Didn't create a new block for some reason, fall back to <br> rv = StandardBreakImpl(node, offset, aSelection); if (NS_WARN_IF(NS_FAILED(rv))) { return rv;
--- a/editor/libeditor/HTMLEditRules.h +++ b/editor/libeditor/HTMLEditRules.h @@ -168,16 +168,22 @@ protected: nsIEditor::EStripWrappers aStripWrappers, bool* aCancel, bool* aHandled); nsresult DidDeleteSelection(Selection* aSelection, nsIEditor::EDirection aDir, nsresult aResult); nsresult InsertBRIfNeeded(Selection* aSelection); /** + * CanContainParagraph() returns true if aElement can have a <p> element as + * its child or its descendant. + */ + bool CanContainParagraph(Element& aElement) const; + + /** * Insert a normal <br> element or a moz-<br> element to aNode when * aNode is a block and it has no children. * * @param aNode Reference to a block parent. * @param aInsertMozBR true if this should insert a moz-<br> element. * Otherwise, i.e., this should insert a normal <br> * element, false. */
--- a/editor/libeditor/HTMLEditUtils.cpp +++ b/editor/libeditor/HTMLEditUtils.cpp @@ -829,9 +829,35 @@ bool HTMLEditUtils::IsContainer(int32_t aTag) { NS_ASSERTION(aTag > eHTMLTag_unknown && aTag <= eHTMLTag_userdefined, "aTag out of range!"); return kElements[aTag - 1].mIsContainer; } +bool +HTMLEditUtils::IsNonListSingleLineContainer(nsINode& aNode) +{ + return aNode.IsAnyOfHTMLElements(nsGkAtoms::address, + nsGkAtoms::div, + nsGkAtoms::h1, + nsGkAtoms::h2, + nsGkAtoms::h3, + nsGkAtoms::h4, + nsGkAtoms::h5, + nsGkAtoms::h6, + nsGkAtoms::listing, + nsGkAtoms::p, + nsGkAtoms::pre, + nsGkAtoms::xmp); +} + +bool +HTMLEditUtils::IsSingleLineContainer(nsINode& aNode) +{ + return IsNonListSingleLineContainer(aNode) || + aNode.IsAnyOfHTMLElements(nsGkAtoms::li, + nsGkAtoms::dt, + nsGkAtoms::dd); +} + } // namespace mozilla
--- a/editor/libeditor/HTMLEditUtils.h +++ b/editor/libeditor/HTMLEditUtils.h @@ -11,17 +11,16 @@ class nsIDOMNode; class nsINode; namespace mozilla { class HTMLEditUtils final { public: - // from nsHTMLEditRules: static bool IsInlineStyle(nsINode* aNode); static bool IsInlineStyle(nsIDOMNode *aNode); static bool IsFormatNode(nsINode* aNode); static bool IsFormatNode(nsIDOMNode* aNode); static bool IsNodeThatCanOutdent(nsIDOMNode* aNode); static bool IsHeader(nsINode& aNode); static bool IsHeader(nsIDOMNode* aNode); static bool IsParagraph(nsIDOMNode* aNode); @@ -55,14 +54,22 @@ public: static bool IsMozDiv(nsIDOMNode* aNode); static bool IsMailCite(nsINode* aNode); static bool IsMailCite(nsIDOMNode* aNode); static bool IsFormWidget(nsINode* aNode); static bool IsFormWidget(nsIDOMNode* aNode); static bool SupportsAlignAttr(nsINode& aNode); static bool CanContain(int32_t aParent, int32_t aChild); static bool IsContainer(int32_t aTag); + + /** + * See execCommand spec: + * https://w3c.github.io/editing/execCommand.html#non-list-single-line-container + * https://w3c.github.io/editing/execCommand.html#single-line-container + */ + static bool IsNonListSingleLineContainer(nsINode& aNode); + static bool IsSingleLineContainer(nsINode& aNode); }; } // namespace mozilla #endif // #ifndef HTMLEditUtils_h
--- a/editor/libeditor/HTMLEditor.cpp +++ b/editor/libeditor/HTMLEditor.cpp @@ -743,51 +743,58 @@ HTMLEditor::IsBlockNode(nsINode* aNode) { return aNode && NodeIsBlockStatic(aNode); } /** * GetBlockNodeParent returns enclosing block level ancestor, if any. */ Element* -HTMLEditor::GetBlockNodeParent(nsINode* aNode) +HTMLEditor::GetBlockNodeParent(nsINode* aNode, + nsINode* aAncestorLimiter) { MOZ_ASSERT(aNode); + MOZ_ASSERT(!aAncestorLimiter || + aNode == aAncestorLimiter || + EditorUtils::IsDescendantOf(aNode, aAncestorLimiter), + "aNode isn't in aAncestorLimiter"); + + // The caller has already reached the limiter. + if (aNode == aAncestorLimiter) { + return nullptr; + } nsCOMPtr<nsINode> p = aNode->GetParentNode(); while (p) { if (NodeIsBlockStatic(p)) { return p->AsElement(); } + // Now, we have reached the limiter, there is no block in its ancestors. + if (p == aAncestorLimiter) { + return nullptr; + } p = p->GetParentNode(); } return nullptr; } -nsIDOMNode* -HTMLEditor::GetBlockNodeParent(nsIDOMNode* aNode) -{ - nsCOMPtr<nsINode> node = do_QueryInterface(aNode); - - if (!node) { - NS_NOTREACHED("null node passed to GetBlockNodeParent()"); - return nullptr; - } - - return GetAsDOMNode(GetBlockNodeParent(node)); -} - /** * Returns the node if it's a block, otherwise GetBlockNodeParent */ Element* -HTMLEditor::GetBlock(nsINode& aNode) +HTMLEditor::GetBlock(nsINode& aNode, + nsINode* aAncestorLimiter) { + MOZ_ASSERT(!aAncestorLimiter || + &aNode == aAncestorLimiter || + EditorUtils::IsDescendantOf(&aNode, aAncestorLimiter), + "aNode isn't in aAncestorLimiter"); + if (NodeIsBlockStatic(&aNode)) { return aNode.AsElement(); } return GetBlockNodeParent(&aNode); } /** * IsNextCharInNodeWhitespace() checks the adjacent content in the same node to @@ -3459,17 +3466,17 @@ HTMLEditor::EndOperation() // post processing nsresult rv = rules ? rules->AfterEdit(mAction, mDirection) : NS_OK; EditorBase::EndOperation(); // will clear mAction, mDirection return rv; } bool HTMLEditor::TagCanContainTag(nsAtom& aParentTag, - nsAtom& aChildTag) + nsAtom& aChildTag) const { int32_t childTagEnum; // XXX Should this handle #cdata-section too? if (&aChildTag == nsGkAtoms::textTagName) { childTagEnum = eHTMLTag_text; } else { childTagEnum = nsHTMLTags::AtomTagToId(&aChildTag); }
--- a/editor/libeditor/HTMLEditor.h +++ b/editor/libeditor/HTMLEditor.h @@ -180,20 +180,30 @@ public: /** * This sets background on the appropriate container element (table, cell,) * or calls into nsTextEditor to set the page background. */ nsresult SetCSSBackgroundColor(const nsAString& aColor); nsresult SetHTMLBackgroundColor(const nsAString& aColor); - // Block methods moved from EditorBase - static Element* GetBlockNodeParent(nsINode* aNode); - static nsIDOMNode* GetBlockNodeParent(nsIDOMNode* aNode); - static Element* GetBlock(nsINode& aNode); + /** + * GetBlockNodeParent() returns parent or nearest ancestor of aNode if + * there is a block parent. If aAncestorLimiter is not nullptr, + * this stops looking for the result. + */ + static Element* GetBlockNodeParent(nsINode* aNode, + nsINode* aAncestorLimiter = nullptr); + /** + * GetBlock() returns aNode itself, or parent or nearest ancestor of aNode + * if there is a block parent. If aAncestorLimiter is not nullptr, + * this stops looking for the result. + */ + static Element* GetBlock(nsINode& aNode, + nsINode* aAncestorLimiter = nullptr); void IsNextCharInNodeWhitespace(nsIContent* aContent, int32_t aOffset, bool* outIsSpace, bool* outIsNBSP, nsIContent** outNode = nullptr, int32_t* outOffset = 0); void IsPrevCharInNodeWhitespace(nsIContent* aContent, @@ -279,17 +289,17 @@ public: * with a call to EndOperation. */ NS_IMETHOD EndOperation() override; /** * returns true if aParentTag can contain a child of type aChildTag. */ virtual bool TagCanContainTag(nsAtom& aParentTag, - nsAtom& aChildTag) override; + nsAtom& aChildTag) const override; /** * Returns true if aNode is a container. */ virtual bool IsContainer(nsINode* aNode) override; virtual bool IsContainer(nsIDOMNode* aNode) override; /**
--- a/editor/libeditor/HTMLEditorDataTransfer.cpp +++ b/editor/libeditor/HTMLEditorDataTransfer.cpp @@ -421,18 +421,18 @@ HTMLEditor::DoInsertHTMLWithContext(cons } // Loop over the node list and paste the nodes: nsCOMPtr<nsIDOMNode> parentBlock, lastInsertNode, insertedContextParent; nsCOMPtr<nsINode> parentNodeNode = do_QueryInterface(parentNode); NS_ENSURE_STATE(parentNodeNode || !parentNode); if (IsBlockNode(parentNodeNode)) { parentBlock = parentNode; - } else { - parentBlock = GetBlockNodeParent(parentNode); + } else if (parentNodeNode) { + parentBlock = GetAsDOMNode(GetBlockNodeParent(parentNodeNode)); } int32_t listCount = nodeList.Length(); for (int32_t j = 0; j < listCount; j++) { bool bDidInsert = false; nsCOMPtr<nsIDOMNode> curNode = nodeList[j]->AsDOMNode(); NS_ENSURE_TRUE(curNode, NS_ERROR_FAILURE);
--- a/gfx/vr/VRDisplayHost.cpp +++ b/gfx/vr/VRDisplayHost.cpp @@ -60,16 +60,18 @@ VRDisplayHost::AutoRestoreRenderState::I { return mSuccess; } VRDisplayHost::VRDisplayHost(VRDeviceType aType) : mFrameStarted(false) { MOZ_COUNT_CTOR(VRDisplayHost); + memset(&mDisplayInfo, 0, sizeof(VRDisplayInfo)); + memset(&mLastUpdateDisplayInfo, 0, sizeof(VRDisplayInfo)); mDisplayInfo.mType = aType; mDisplayInfo.mDisplayID = VRSystemManager::AllocateDisplayID(); mDisplayInfo.mPresentingGroups = 0; mDisplayInfo.mGroupMask = kVRGroupContent; mDisplayInfo.mFrameId = 0; } VRDisplayHost::~VRDisplayHost()
--- a/gfx/vr/gfxVR.h +++ b/gfx/vr/gfxVR.h @@ -128,20 +128,16 @@ struct VRFieldOfView { double upDegrees; double rightDegrees; double downDegrees; double leftDegrees; }; struct VRHMDSensorState { - VRHMDSensorState() - { - Clear(); - } int64_t inputFrameID; double timestamp; VRDisplayCapabilityFlags flags; // These members will only change with inputFrameID: float orientation[4]; float position[3]; float angularVelocity[3];
--- a/gfx/vr/gfxVROSVR.cpp +++ b/gfx/vr/gfxVROSVR.cpp @@ -282,17 +282,17 @@ VRDisplayOSVR::ZeroSensor() VRHMDSensorState VRDisplayOSVR::GetSensorState() { //update client context before anything //this usually goes into app's mainloop osvr_ClientUpdate(*m_ctx); - VRHMDSensorState result; + VRHMDSensorState result{}; OSVR_TimeValue timestamp; OSVR_OrientationState orientation; OSVR_ReturnCode ret = osvr_GetOrientationState(*m_iface, ×tamp, &orientation); result.timestamp = timestamp.seconds;
--- a/gfx/vr/gfxVROculus.cpp +++ b/gfx/vr/gfxVROculus.cpp @@ -858,17 +858,17 @@ VRDisplayOculus::ZeroSensor() } ovr_RecenterTrackingOrigin(mSession->Get()); UpdateStageParameters(); } VRHMDSensorState VRDisplayOculus::GetSensorState() { - VRHMDSensorState result; + VRHMDSensorState result{}; if (mSession->IsTrackingReady()) { double predictedFrameTime = 0.0f; if (gfxPrefs::VRPosePredictionEnabled()) { // XXX We might need to call ovr_GetPredictedDisplayTime even if we don't use the result. // If we don't call it, the Oculus driver will spew out many warnings... predictedFrameTime = ovr_GetPredictedDisplayTime(mSession->Get(), 0); } result = GetSensorState(predictedFrameTime); @@ -877,31 +877,31 @@ VRDisplayOculus::GetSensorState() result.position[1] -= mEyeHeight; mDisplayInfo.mLastSensorState[result.inputFrameID % kVRMaxLatencyFrames] = result; return result; } VRHMDSensorState VRDisplayOculus::GetSensorState(double absTime) { - VRHMDSensorState result; + VRHMDSensorState result{}; ovrTrackingState state = ovr_GetTrackingState(mSession->Get(), absTime, true); ovrPoseStatef& pose(state.HeadPose); result.timestamp = pose.TimeInSeconds; if (state.StatusFlags & ovrStatus_OrientationTracked) { result.flags |= VRDisplayCapabilityFlags::Cap_Orientation; result.orientation[0] = pose.ThePose.Orientation.x; result.orientation[1] = pose.ThePose.Orientation.y; result.orientation[2] = pose.ThePose.Orientation.z; result.orientation[3] = pose.ThePose.Orientation.w; - + result.angularVelocity[0] = pose.AngularVelocity.x; result.angularVelocity[1] = pose.AngularVelocity.y; result.angularVelocity[2] = pose.AngularVelocity.z; result.flags |= VRDisplayCapabilityFlags::Cap_AngularAcceleration; result.angularAcceleration[0] = pose.AngularAcceleration.x; result.angularAcceleration[1] = pose.AngularAcceleration.y; @@ -909,17 +909,17 @@ VRDisplayOculus::GetSensorState(double a } if (state.StatusFlags & ovrStatus_PositionTracked) { result.flags |= VRDisplayCapabilityFlags::Cap_Position; result.position[0] = pose.ThePose.Position.x; result.position[1] = pose.ThePose.Position.y; result.position[2] = pose.ThePose.Position.z; - + result.linearVelocity[0] = pose.LinearVelocity.x; result.linearVelocity[1] = pose.LinearVelocity.y; result.linearVelocity[2] = pose.LinearVelocity.z; result.flags |= VRDisplayCapabilityFlags::Cap_LinearAcceleration; result.linearAcceleration[0] = pose.LinearAcceleration.x; result.linearAcceleration[1] = pose.LinearAcceleration.y;
--- a/gfx/vr/gfxVROpenVR.cpp +++ b/gfx/vr/gfxVROpenVR.cpp @@ -226,17 +226,17 @@ VRDisplayOpenVR::GetSensorState() { PollEvents(); const uint32_t posesSize = ::vr::k_unTrackedDeviceIndex_Hmd + 1; ::vr::TrackedDevicePose_t poses[posesSize]; // Note: We *must* call WaitGetPoses in order for any rendering to happen at all. mVRCompositor->WaitGetPoses(nullptr, 0, poses, posesSize); - VRHMDSensorState result; + VRHMDSensorState result{}; ::vr::Compositor_FrameTiming timing; timing.m_nSize = sizeof(::vr::Compositor_FrameTiming); if (mVRCompositor->GetFrameTiming(&timing)) { result.timestamp = timing.m_flSystemTimeInSeconds; } else { // This should not happen, but log it just in case NS_WARNING("OpenVR - IVRCompositor::GetFrameTiming failed");
--- a/gfx/vr/gfxVRPuppet.cpp +++ b/gfx/vr/gfxVRPuppet.cpp @@ -46,16 +46,17 @@ static const uint64_t kPuppetButtonMask[ static const uint32_t kNumPuppetButtonMask = sizeof(kPuppetButtonMask) / sizeof(uint64_t); static const uint32_t kNumPuppetAxis = 3; static const uint32_t kNumPuppetHaptcs = 1; VRDisplayPuppet::VRDisplayPuppet() : VRDisplayHost(VRDeviceType::Puppet) , mIsPresenting(false) + , mSensorState{} { MOZ_COUNT_CTOR_INHERITED(VRDisplayPuppet, VRDisplayHost); mDisplayInfo.mDisplayName.AssignLiteral("Puppet HMD"); mDisplayInfo.mIsConnected = true; mDisplayInfo.mIsMounted = false; mDisplayInfo.mCapabilityFlags = VRDisplayCapabilityFlags::Cap_None | VRDisplayCapabilityFlags::Cap_Orientation |
--- a/media/ffvpx/config_unix64.asm +++ b/media/ffvpx/config_unix64.asm @@ -35,17 +35,17 @@ %define HAVE_LDBRX 0 %define HAVE_POWER8 0 %define HAVE_PPC4XX 0 %define HAVE_VSX 0 %define HAVE_AESNI 1 %define HAVE_AMD3DNOW 1 %define HAVE_AMD3DNOWEXT 1 %define HAVE_AVX 1 -%define HAVE_AVX2 0 +%define HAVE_AVX2 1 %define HAVE_FMA3 1 %define HAVE_FMA4 1 %define HAVE_MMX 1 %define HAVE_MMXEXT 1 %define HAVE_SSE 1 %define HAVE_SSE2 1 %define HAVE_SSE3 1 %define HAVE_SSE4 1 @@ -79,17 +79,17 @@ %define HAVE_LDBRX_EXTERNAL 0 %define HAVE_POWER8_EXTERNAL 0 %define HAVE_PPC4XX_EXTERNAL 0 %define HAVE_VSX_EXTERNAL 0 %define HAVE_AESNI_EXTERNAL 1 %define HAVE_AMD3DNOW_EXTERNAL 1 %define HAVE_AMD3DNOWEXT_EXTERNAL 1 %define HAVE_AVX_EXTERNAL 1 -%define HAVE_AVX2_EXTERNAL 0 +%define HAVE_AVX2_EXTERNAL 1 %define HAVE_FMA3_EXTERNAL 1 %define HAVE_FMA4_EXTERNAL 1 %define HAVE_MMX_EXTERNAL 1 %define HAVE_MMXEXT_EXTERNAL 1 %define HAVE_SSE_EXTERNAL 1 %define HAVE_SSE2_EXTERNAL 1 %define HAVE_SSE3_EXTERNAL 1 %define HAVE_SSE4_EXTERNAL 1 @@ -123,17 +123,17 @@ %define HAVE_LDBRX_INLINE 0 %define HAVE_POWER8_INLINE 0 %define HAVE_PPC4XX_INLINE 0 %define HAVE_VSX_INLINE 0 %define HAVE_AESNI_INLINE 1 %define HAVE_AMD3DNOW_INLINE 1 %define HAVE_AMD3DNOWEXT_INLINE 1 %define HAVE_AVX_INLINE 1 -%define HAVE_AVX2_INLINE 0 +%define HAVE_AVX2_INLINE 1 %define HAVE_FMA3_INLINE 1 %define HAVE_FMA4_INLINE 1 %define HAVE_MMX_INLINE 1 %define HAVE_MMXEXT_INLINE 1 %define HAVE_SSE_INLINE 1 %define HAVE_SSE2_INLINE 1 %define HAVE_SSE3_INLINE 1 %define HAVE_SSE4_INLINE 1
--- a/media/ffvpx/config_unix64.h +++ b/media/ffvpx/config_unix64.h @@ -51,17 +51,17 @@ #define HAVE_LDBRX 0 #define HAVE_POWER8 0 #define HAVE_PPC4XX 0 #define HAVE_VSX 0 #define HAVE_AESNI 1 #define HAVE_AMD3DNOW 1 #define HAVE_AMD3DNOWEXT 1 #define HAVE_AVX 1 -#define HAVE_AVX2 0 +#define HAVE_AVX2 1 #define HAVE_FMA3 1 #define HAVE_FMA4 1 #define HAVE_MMX 1 #define HAVE_MMXEXT 1 #define HAVE_SSE 1 #define HAVE_SSE2 1 #define HAVE_SSE3 1 #define HAVE_SSE4 1 @@ -95,17 +95,17 @@ #define HAVE_LDBRX_EXTERNAL 0 #define HAVE_POWER8_EXTERNAL 0 #define HAVE_PPC4XX_EXTERNAL 0 #define HAVE_VSX_EXTERNAL 0 #define HAVE_AESNI_EXTERNAL 1 #define HAVE_AMD3DNOW_EXTERNAL 1 #define HAVE_AMD3DNOWEXT_EXTERNAL 1 #define HAVE_AVX_EXTERNAL 1 -#define HAVE_AVX2_EXTERNAL 0 +#define HAVE_AVX2_EXTERNAL 1 #define HAVE_FMA3_EXTERNAL 1 #define HAVE_FMA4_EXTERNAL 1 #define HAVE_MMX_EXTERNAL 1 #define HAVE_MMXEXT_EXTERNAL 1 #define HAVE_SSE_EXTERNAL 1 #define HAVE_SSE2_EXTERNAL 1 #define HAVE_SSE3_EXTERNAL 1 #define HAVE_SSE4_EXTERNAL 1 @@ -139,17 +139,17 @@ #define HAVE_LDBRX_INLINE 0 #define HAVE_POWER8_INLINE 0 #define HAVE_PPC4XX_INLINE 0 #define HAVE_VSX_INLINE 0 #define HAVE_AESNI_INLINE 1 #define HAVE_AMD3DNOW_INLINE 1 #define HAVE_AMD3DNOWEXT_INLINE 1 #define HAVE_AVX_INLINE 1 -#define HAVE_AVX2_INLINE 0 +#define HAVE_AVX2_INLINE 1 #define HAVE_FMA3_INLINE 1 #define HAVE_FMA4_INLINE 1 #define HAVE_MMX_INLINE 1 #define HAVE_MMXEXT_INLINE 1 #define HAVE_SSE_INLINE 1 #define HAVE_SSE2_INLINE 1 #define HAVE_SSE3_INLINE 1 #define HAVE_SSE4_INLINE 1
--- a/media/libstagefright/binding/AnnexB.cpp +++ b/media/libstagefright/binding/AnnexB.cpp @@ -1,91 +1,92 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "mozilla/ArrayUtils.h" #include "mozilla/EndianUtils.h" +#include "mozilla/ResultExtensions.h" +#include "mozilla/Unused.h" #include "mp4_demuxer/AnnexB.h" -#include "mp4_demuxer/ByteReader.h" +#include "mp4_demuxer/BufferReader.h" #include "mp4_demuxer/ByteWriter.h" #include "MediaData.h" #include "nsAutoPtr.h" using namespace mozilla; namespace mp4_demuxer { static const uint8_t kAnnexBDelimiter[] = { 0, 0, 0, 1 }; -bool +Result<Ok, nsresult> AnnexB::ConvertSampleToAnnexB(mozilla::MediaRawData* aSample, bool aAddSPS) { MOZ_ASSERT(aSample); if (!IsAVCC(aSample)) { - return true; + return Ok(); } MOZ_ASSERT(aSample->Data()); - if (!ConvertSampleTo4BytesAVCC(aSample)) { - return false; - } + MOZ_TRY(ConvertSampleTo4BytesAVCC(aSample)); if (aSample->Size() < 4) { // Nothing to do, it's corrupted anyway. - return true; + return Ok(); } - ByteReader reader(aSample->Data(), aSample->Size()); + BufferReader reader(aSample->Data(), aSample->Size()); nsTArray<uint8_t> tmp; ByteWriter writer(tmp); while (reader.Remaining() >= 4) { - uint32_t nalLen = reader.ReadU32(); + uint32_t nalLen; + MOZ_TRY_VAR(nalLen, reader.ReadU32()); const uint8_t* p = reader.Read(nalLen); if (!writer.Write(kAnnexBDelimiter, ArrayLength(kAnnexBDelimiter))) { - return false; + return Err(NS_ERROR_FAILURE); } if (!p) { break; } if (!writer.Write(p, nalLen)) { - return false; + return Err(NS_ERROR_FAILURE); } } nsAutoPtr<MediaRawDataWriter> samplewriter(aSample->CreateWriter()); if (!samplewriter->Replace(tmp.Elements(), tmp.Length())) { - return false; + return Err(NS_ERROR_FAILURE); } // Prepend the Annex B NAL with SPS and PPS tables to keyframes. if (aAddSPS && aSample->mKeyframe) { RefPtr<MediaByteBuffer> annexB = ConvertExtraDataToAnnexB(aSample->mExtraData); if (!samplewriter->Prepend(annexB->Elements(), annexB->Length())) { - return false; + return Err(NS_ERROR_FAILURE); } // Prepending the NAL with SPS/PPS will mess up the encryption subsample // offsets. So we need to account for the extra bytes by increasing // the length of the first clear data subsample. Otherwise decryption // will fail. if (aSample->mCrypto.mValid) { MOZ_ASSERT(samplewriter->mCrypto.mPlainSizes.Length() > 0); samplewriter->mCrypto.mPlainSizes[0] += annexB->Length(); } } - return true; + return Ok(); } already_AddRefed<mozilla::MediaByteBuffer> AnnexB::ConvertExtraDataToAnnexB(const mozilla::MediaByteBuffer* aExtraData) { // AVCC 6 byte header looks like: // +------+------+------+------+------+------+------+------+ // [0] | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | @@ -98,160 +99,166 @@ AnnexB::ConvertExtraDataToAnnexB(const m // +------+------+------+------+------+------+------+------+ // [4] | unused | nalLenSiz-1 | // +------+------+------+------+------+------+------+------+ // [5] | unused | numSps | // +------+------+------+------+------+------+------+------+ RefPtr<mozilla::MediaByteBuffer> annexB = new mozilla::MediaByteBuffer; - ByteReader reader(*aExtraData); + BufferReader reader(*aExtraData); const uint8_t* ptr = reader.Read(5); if (ptr && ptr[0] == 1) { // Append SPS then PPS - ConvertSPSOrPPS(reader, reader.ReadU8() & 31, annexB); - ConvertSPSOrPPS(reader, reader.ReadU8(), annexB); - + Unused << reader.ReadU8().map([&] (uint8_t x) { return ConvertSPSOrPPS(reader, x & 31, annexB); }); + Unused << reader.ReadU8().map([&] (uint8_t x) { return ConvertSPSOrPPS(reader, x, annexB); }); // MP4Box adds extra bytes that we ignore. I don't know what they do. } return annexB.forget(); } -void -AnnexB::ConvertSPSOrPPS(ByteReader& aReader, uint8_t aCount, +Result<mozilla::Ok, nsresult> +AnnexB::ConvertSPSOrPPS(BufferReader& aReader, uint8_t aCount, mozilla::MediaByteBuffer* aAnnexB) { for (int i = 0; i < aCount; i++) { - uint16_t length = aReader.ReadU16(); + uint16_t length; + MOZ_TRY_VAR(length, aReader.ReadU16()); const uint8_t* ptr = aReader.Read(length); if (!ptr) { - MOZ_ASSERT(false); - return; + return Err(NS_ERROR_FAILURE); } aAnnexB->AppendElements(kAnnexBDelimiter, ArrayLength(kAnnexBDelimiter)); aAnnexB->AppendElements(ptr, length); } + return Ok(); } -static bool -FindStartCodeInternal(ByteReader& aBr) { +static Result<Ok, nsresult> +FindStartCodeInternal(BufferReader& aBr) { size_t offset = aBr.Offset(); for (uint32_t i = 0; i < aBr.Align() && aBr.Remaining() >= 3; i++) { - if (aBr.PeekU24() == 0x000001) { - return true; + auto res = aBr.PeekU24(); + if (res.isOk() && (res.unwrap() == 0x000001)) { + return Ok(); } - aBr.Read(1); + mozilla::Unused << aBr.Read(1); } while (aBr.Remaining() >= 6) { - uint32_t x32 = aBr.PeekU32(); + uint32_t x32; + MOZ_TRY_VAR(x32, aBr.PeekU32()); if ((x32 - 0x01010101) & (~x32) & 0x80808080) { if ((x32 >> 8) == 0x000001) { - return true; + return Ok(); } if (x32 == 0x000001) { - aBr.Read(1); - return true; + mozilla::Unused << aBr.Read(1); + return Ok(); } if ((x32 & 0xff) == 0) { const uint8_t* p = aBr.Peek(1); if ((x32 & 0xff00) == 0 && p[4] == 1) { - aBr.Read(2); - return true; + mozilla::Unused << aBr.Read(2); + return Ok(); } if (p[4] == 0 && p[5] == 1) { - aBr.Read(3); - return true; + mozilla::Unused << aBr.Read(3); + return Ok(); } } } - aBr.Read(4); + mozilla::Unused << aBr.Read(4); } while (aBr.Remaining() >= 3) { - if (aBr.PeekU24() == 0x000001) { - return true; + uint32_t data; + MOZ_TRY_VAR(data, aBr.PeekU24()); + if (data == 0x000001) { + return Ok(); } - aBr.Read(1); + mozilla::Unused << aBr.Read(1); } // No start code were found; Go back to the beginning. - aBr.Seek(offset); - return false; + mozilla::Unused << aBr.Seek(offset); + return Err(NS_ERROR_FAILURE); } -static bool -FindStartCode(ByteReader& aBr, size_t& aStartSize) +static Result<Ok, nsresult> +FindStartCode(BufferReader& aBr, size_t& aStartSize) { - if (!FindStartCodeInternal(aBr)) { + if (FindStartCodeInternal(aBr).isErr()) { aStartSize = 0; - return false; + return Err(NS_ERROR_FAILURE); } aStartSize = 3; if (aBr.Offset()) { // Check if it's 4-bytes start code aBr.Rewind(1); - if (aBr.ReadU8() == 0) { + uint8_t data; + MOZ_TRY_VAR(data, aBr.ReadU8()); + if (data == 0) { aStartSize = 4; } } - aBr.Read(3); - return true; + mozilla::Unused << aBr.Read(3); + return Ok(); } -static bool -ParseNALUnits(ByteWriter& aBw, ByteReader& aBr) +static Result<mozilla::Ok, nsresult> +ParseNALUnits(ByteWriter& aBw, BufferReader& aBr) { size_t startSize; - bool rv = FindStartCode(aBr, startSize); - if (rv) { + auto rv = FindStartCode(aBr, startSize); + if (rv.isOk()) { size_t startOffset = aBr.Offset(); - while (FindStartCode(aBr, startSize)) { + while (FindStartCode(aBr, startSize).isOk()) { size_t offset = aBr.Offset(); size_t sizeNAL = offset - startOffset - startSize; aBr.Seek(startOffset); if (!aBw.WriteU32(sizeNAL) || !aBw.Write(aBr.Read(sizeNAL), sizeNAL)) { - return false; + return Err(NS_ERROR_FAILURE); } aBr.Read(startSize); startOffset = offset; } } size_t sizeNAL = aBr.Remaining(); if (sizeNAL) { if (!aBw.WriteU32(sizeNAL) || !aBw.Write(aBr.Read(sizeNAL), sizeNAL)) { - return false; + return Err(NS_ERROR_FAILURE); } } - return true; + return Ok(); } bool AnnexB::ConvertSampleToAVCC(mozilla::MediaRawData* aSample) { if (IsAVCC(aSample)) { - return ConvertSampleTo4BytesAVCC(aSample); + return ConvertSampleTo4BytesAVCC(aSample).isOk(); } if (!IsAnnexB(aSample)) { // Not AnnexB, nothing to convert. return true; } nsTArray<uint8_t> nalu; ByteWriter writer(nalu); - ByteReader reader(aSample->Data(), aSample->Size()); + BufferReader reader(aSample->Data(), aSample->Size()); - if (!ParseNALUnits(writer, reader)) { + if (ParseNALUnits(writer, reader).isErr()) { return false; } nsAutoPtr<MediaRawDataWriter> samplewriter(aSample->CreateWriter()); if (!samplewriter->Replace(nalu.Elements(), nalu.Length())) { return false; } // Create the AVCC header. RefPtr<mozilla::MediaByteBuffer> extradata = new mozilla::MediaByteBuffer; @@ -266,48 +273,51 @@ AnnexB::ConvertSampleToAVCC(mozilla::Med }; if (!extradata->AppendElements(kFakeExtraData, ArrayLength(kFakeExtraData))) { return false; } aSample->mExtraData = extradata; return true; } -bool +Result<mozilla::Ok, nsresult> AnnexB::ConvertSampleTo4BytesAVCC(mozilla::MediaRawData* aSample) { MOZ_ASSERT(IsAVCC(aSample)); int nalLenSize = ((*aSample->mExtraData)[4] & 3) + 1; if (nalLenSize == 4) { - return true; + return Ok(); } nsTArray<uint8_t> dest; ByteWriter writer(dest); - ByteReader reader(aSample->Data(), aSample->Size()); + BufferReader reader(aSample->Data(), aSample->Size()); while (reader.Remaining() > nalLenSize) { uint32_t nalLen; switch (nalLenSize) { - case 1: nalLen = reader.ReadU8(); break; - case 2: nalLen = reader.ReadU16(); break; - case 3: nalLen = reader.ReadU24(); break; - case 4: nalLen = reader.ReadU32(); break; + case 1: MOZ_TRY_VAR(nalLen, reader.ReadU8()); break; + case 2: MOZ_TRY_VAR(nalLen, reader.ReadU16()); break; + case 3: MOZ_TRY_VAR(nalLen, reader.ReadU24()); break; + case 4: MOZ_TRY_VAR(nalLen, reader.ReadU32()); break; } const uint8_t* p = reader.Read(nalLen); if (!p) { - return true; + return Ok(); } if (!writer.WriteU32(nalLen) || !writer.Write(p, nalLen)) { - return false; + return Err(NS_ERROR_FAILURE); } } nsAutoPtr<MediaRawDataWriter> samplewriter(aSample->CreateWriter()); - return samplewriter->Replace(dest.Elements(), dest.Length()); + if (!samplewriter->Replace(dest.Elements(), dest.Length())) { + return Err(NS_ERROR_FAILURE); + } + return Ok(); } bool AnnexB::IsAVCC(const mozilla::MediaRawData* aSample) { return aSample->Size() >= 3 && aSample->mExtraData && aSample->mExtraData->Length() >= 7 && (*aSample->mExtraData)[0] == 1; }
--- a/media/libstagefright/binding/DecoderData.cpp +++ b/media/libstagefright/binding/DecoderData.cpp @@ -1,15 +1,15 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "mp4_demuxer/Adts.h" #include "mp4_demuxer/AnnexB.h" -#include "mp4_demuxer/ByteReader.h" +#include "mp4_demuxer/BufferReader.h" #include "mp4_demuxer/DecoderData.h" #include <media/stagefright/foundation/ABitReader.h> #include "media/stagefright/MetaData.h" #include "media/stagefright/MediaDefs.h" #include "media/stagefright/Utils.h" #include "mozilla/ArrayUtils.h" #include "mozilla/EndianUtils.h" #include "include/ESDS.h" @@ -82,37 +82,37 @@ FindData(const MetaData* aMetaData, uint } static bool FindData(const MetaData* aMetaData, uint32_t aKey, mozilla::MediaByteBuffer* aDest) { return FindData(aMetaData, aKey, static_cast<nsTArray<uint8_t>*>(aDest)); } -bool +Result<Ok, nsresult> CryptoFile::DoUpdate(const uint8_t* aData, size_t aLength) { - ByteReader reader(aData, aLength); + BufferReader reader(aData, aLength); while (reader.Remaining()) { PsshInfo psshInfo; if (!reader.ReadArray(psshInfo.uuid, 16)) { - return false; + return Err(NS_ERROR_FAILURE); } if (!reader.CanReadType<uint32_t>()) { - return false; + return Err(NS_ERROR_FAILURE); } auto length = reader.ReadType<uint32_t>(); if (!reader.ReadArray(psshInfo.data, length)) { - return false; + return Err(NS_ERROR_FAILURE); } pssh.AppendElement(psshInfo); } - return true; + return Ok(); } static void UpdateTrackInfo(mozilla::TrackInfo& aConfig, const MetaData* aMetaData, const char* aMimeType) { mozilla::CryptoTrack& crypto = aConfig.mCrypto;
--- a/media/libstagefright/binding/H264.cpp +++ b/media/libstagefright/binding/H264.cpp @@ -1,17 +1,17 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "mozilla/ArrayUtils.h" #include "mozilla/PodOperations.h" #include "mp4_demuxer/AnnexB.h" #include "mp4_demuxer/BitReader.h" -#include "mp4_demuxer/ByteReader.h" +#include "mp4_demuxer/BufferReader.h" #include "mp4_demuxer/ByteWriter.h" #include "mp4_demuxer/H264.h" #include <media/stagefright/foundation/ABitReader.h> #include <limits> #include <cmath> #define READSE(var, min, max) \ { \ @@ -272,100 +272,120 @@ public: explicit SPSNALIterator(const mozilla::MediaByteBuffer* aExtraData) : mExtraDataPtr(aExtraData->Elements()) , mReader(aExtraData) { if (!mReader.Read(5)) { return; } - mNumSPS = mReader.ReadU8() & 0x1f; + auto res = mReader.ReadU8(); + mNumSPS = res.isOk() ? res.unwrap() & 0x1f : 0; if (mNumSPS == 0) { return; } mValid = true; } SPSNALIterator& operator++() { if (mEOS || !mValid) { return *this; } if (--mNumSPS == 0) { mEOS = true; } - uint16_t length = mReader.ReadU16(); + auto res = mReader.ReadU16(); + uint16_t length = res.isOk() ? res.unwrap() : 0; if (length == 0 || !mReader.Read(length)) { mEOS = true; } return *this; } explicit operator bool() const { return mValid && !mEOS; } SPSNAL operator*() const { MOZ_ASSERT(bool(*this)); - ByteReader reader(mExtraDataPtr + mReader.Offset(), mReader.Remaining()); - uint16_t length = reader.ReadU16(); + BufferReader reader(mExtraDataPtr + mReader.Offset(), mReader.Remaining()); + + auto res = reader.ReadU16(); + uint16_t length = res.isOk() ? res.unwrap() : 0; const uint8_t* ptr = reader.Read(length); - if (!ptr) { + if (!ptr || !length) { return SPSNAL(); } return SPSNAL(ptr, length); } private: const uint8_t* mExtraDataPtr; - ByteReader mReader; + BufferReader mReader; bool mValid = false; bool mEOS = false; uint8_t mNumSPS = 0; }; /* static */ already_AddRefed<mozilla::MediaByteBuffer> H264::DecodeNALUnit(const uint8_t* aNAL, size_t aLength) { MOZ_ASSERT(aNAL); if (aLength < 4) { return nullptr; } RefPtr<mozilla::MediaByteBuffer> rbsp = new mozilla::MediaByteBuffer; - ByteReader reader(aNAL, aLength); - uint8_t nal_unit_type = reader.ReadU8() & 0x1f; + BufferReader reader(aNAL, aLength); + auto res = reader.ReadU8(); + if (res.isErr()) { + return nullptr; + } + uint8_t nal_unit_type = res.unwrap() & 0x1f; uint32_t nalUnitHeaderBytes = 1; if (nal_unit_type == H264_NAL_PREFIX || nal_unit_type == H264_NAL_SLICE_EXT || nal_unit_type == H264_NAL_SLICE_EXT_DVC) { bool svc_extension_flag = false; bool avc_3d_extension_flag = false; if (nal_unit_type != H264_NAL_SLICE_EXT_DVC) { - svc_extension_flag = reader.PeekU8() & 0x80; + res = reader.PeekU8(); + if (res.isErr()) { + return nullptr; + } + svc_extension_flag = res.unwrap() & 0x80; } else { - avc_3d_extension_flag = reader.PeekU8() & 0x80; + res = reader.PeekU8(); + if (res.isErr()) { + return nullptr; + } + avc_3d_extension_flag = res.unwrap() & 0x80; } if (svc_extension_flag) { nalUnitHeaderBytes += 3; } else if (avc_3d_extension_flag) { nalUnitHeaderBytes += 2; } else { nalUnitHeaderBytes += 3; } } if (!reader.Read(nalUnitHeaderBytes - 1)) { return nullptr; } uint32_t lastbytes = 0xffff; while (reader.Remaining()) { - uint8_t byte = reader.ReadU8(); + auto res = reader.ReadU8(); + if (res.isErr()) { + return nullptr; + } + uint8_t byte = res.unwrap(); if ((lastbytes & 0xffff) == 0 && byte == 0x03) { // reset last two bytes, to detect the 0x000003 sequence again. lastbytes = 0xffff; } else { rbsp->AppendElement(byte); } lastbytes = (lastbytes << 8) | byte; } @@ -783,25 +803,25 @@ H264::GetFrameType(const mozilla::MediaR if (!AnnexB::IsAVCC(aSample)) { // We must have a valid AVCC frame with extradata. return FrameType::INVALID; } MOZ_ASSERT(aSample->Data()); int nalLenSize = ((*aSample->mExtraData)[4] & 3) + 1; - ByteReader reader(aSample->Data(), aSample->Size()); + BufferReader reader(aSample->Data(), aSample->Size()); while (reader.Remaining() >= nalLenSize) { - uint32_t nalLen; + uint32_t nalLen = 0; switch (nalLenSize) { - case 1: nalLen = reader.ReadU8(); break; - case 2: nalLen = reader.ReadU16(); break; - case 3: nalLen = reader.ReadU24(); break; - case 4: nalLen = reader.ReadU32(); break; + case 1: Unused << reader.ReadU8().map([&] (uint8_t x) mutable { return nalLen = x; }); break; + case 2: Unused << reader.ReadU16().map([&] (uint16_t x) mutable { return nalLen = x; }); break; + case 3: Unused << reader.ReadU24().map([&] (uint32_t x) mutable { return nalLen = x; }); break; + case 4: Unused << reader.ReadU32().map([&] (uint32_t x) mutable { return nalLen = x; }); break; } if (!nalLen) { continue; } const uint8_t* p = reader.Read(nalLen); if (!p) { return FrameType::INVALID; } @@ -846,31 +866,31 @@ H264::ExtractExtraData(const mozilla::Me if (aSample->mCrypto.mPlainSizes.Length() == 0 || aSample->mCrypto.mPlainSizes[0] > sampleSize) { // This is invalid content. return nullptr; } sampleSize = aSample->mCrypto.mPlainSizes[0]; } - ByteReader reader(aSample->Data(), sampleSize); + BufferReader reader(aSample->Data(), sampleSize); nsTArray<SPSData> SPSTable; // If we encounter SPS with the same id but different content, we will stop // attempting to detect duplicates. bool checkDuplicate = true; // Find SPS and PPS NALUs in AVCC data while (reader.Remaining() > nalLenSize) { - uint32_t nalLen; + uint32_t nalLen = 0; switch (nalLenSize) { - case 1: nalLen = reader.ReadU8(); break; - case 2: nalLen = reader.ReadU16(); break; - case 3: nalLen = reader.ReadU24(); break; - case 4: nalLen = reader.ReadU32(); break; + case 1: Unused << reader.ReadU8().map([&] (uint8_t x) mutable { return nalLen = x; }); break; + case 2: Unused << reader.ReadU16().map([&] (uint16_t x) mutable { return nalLen = x; }); break; + case 3: Unused << reader.ReadU24().map([&] (uint32_t x) mutable { return nalLen = x; }); break; + case 4: Unused << reader.ReadU32().map([&] (uint32_t x) mutable { return nalLen = x; }); break; } const uint8_t* p = reader.Read(nalLen); if (!p) { return extradata.forget(); } uint8_t nalType = *p & 0x1f; if (nalType == H264_NAL_SPS) { @@ -941,22 +961,23 @@ H264::HasSPS(const mozilla::MediaByteBuf /* static */ uint8_t H264::NumSPS(const mozilla::MediaByteBuffer* aExtraData) { if (!aExtraData) { return 0; } - ByteReader reader(aExtraData); + BufferReader reader(aExtraData); const uint8_t* ptr = reader.Read(5); - if (!ptr || !reader.CanRead8()) { + auto res = reader.ReadU8(); + if (!ptr || res.isErr()) { return 0; } - return reader.ReadU8() & 0x1f; + return res.unwrap() & 0x1f; } /* static */ bool H264::CompareExtraData(const mozilla::MediaByteBuffer* aExtraData1, const mozilla::MediaByteBuffer* aExtraData2) { if (aExtraData1 == aExtraData2) { return true; @@ -977,57 +998,51 @@ H264::CompareExtraData(const mozilla::Me return false; } ++it1; ++it2; } return true; } -static inline bool -ReadSEIInt(ByteReader& aBr, uint32_t& aOutput) +static inline Result<Ok, nsresult> +ReadSEIInt(BufferReader& aBr, uint32_t& aOutput) { uint8_t tmpByte; aOutput = 0; - if (!aBr.CanRead8()) { - return false; - } - tmpByte = aBr.ReadU8(); + MOZ_TRY_VAR(tmpByte, aBr.ReadU8()); while (tmpByte == 0xFF) { aOutput += 255; - if (!aBr.CanRead8()) { - return false; - } - tmpByte = aBr.ReadU8(); + MOZ_TRY_VAR(tmpByte, aBr.ReadU8()); } aOutput += tmpByte; // this is the last byte - return true; + return Ok(); } /* static */ bool H264::DecodeRecoverySEI(const mozilla::MediaByteBuffer* aSEI, SEIRecoveryData& aDest) { if (!aSEI) { return false; } // sei_rbsp() as per 7.3.2.3 Supplemental enhancement information RBSP syntax - ByteReader br(aSEI); + BufferReader br(aSEI); do { // sei_message() as per // 7.3.2.3.1 Supplemental enhancement information message syntax uint32_t payloadType = 0; - if (!ReadSEIInt(br, payloadType)) { + if (ReadSEIInt(br, payloadType).isErr()) { return false; } uint32_t payloadSize = 0; - if (!ReadSEIInt(br, payloadSize)) { + if (ReadSEIInt(br, payloadSize).isErr()) { return false; } // sei_payload(payloadType, payloadSize) as per // D.1 SEI payload syntax. const uint8_t* p = br.Read(payloadSize); if (!p) { return false; @@ -1040,17 +1055,17 @@ H264::DecodeRecoverySEI(const mozilla::M // D.1.7 Recovery point SEI message syntax BitReader br(p, payloadSize * 8); aDest.recovery_frame_cnt = br.ReadUE(); aDest.exact_match_flag = br.ReadBit(); aDest.broken_link_flag = br.ReadBit(); aDest.changing_slice_group_idc = br.ReadBits(2); return true; } - } while(br.CanRead8() && br.PeekU8() != 0x80); // more_rbsp_data() msg[offset] != 0x80 + } while(br.PeekU8().isOk() && br.PeekU8().unwrap() != 0x80); // more_rbsp_data() msg[offset] != 0x80 // ignore the trailing bits rbsp_trailing_bits(); return false; } #undef READUE #undef READSE } // namespace mp4_demuxer
--- a/media/libstagefright/binding/Index.cpp +++ b/media/libstagefright/binding/Index.cpp @@ -1,13 +1,13 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "mp4_demuxer/ByteReader.h" +#include "mp4_demuxer/BufferReader.h" #include "mp4_demuxer/Index.h" #include "mp4_demuxer/Interval.h" #include "mp4_demuxer/MP4Metadata.h" #include "mp4_demuxer/SinfParser.h" #include "nsAutoPtr.h" #include "mozilla/RefPtr.h" #include <algorithm> @@ -149,39 +149,45 @@ already_AddRefed<MediaRawData> SampleIte // The size comes from an 8 bit field AutoTArray<uint8_t, 256> cenc; cenc.SetLength(s->mCencRange.Length()); if (!mIndex->mSource->ReadAt(s->mCencRange.mStart, cenc.Elements(), cenc.Length(), &bytesRead) || bytesRead != cenc.Length()) { return nullptr; } - ByteReader reader(cenc); + BufferReader reader(cenc); writer->mCrypto.mValid = true; writer->mCrypto.mIVSize = ivSize; CencSampleEncryptionInfoEntry* sampleInfo = GetSampleEncryptionEntry(); if (sampleInfo) { writer->mCrypto.mKeyId.AppendElements(sampleInfo->mKeyId); } if (!reader.ReadArray(writer->mCrypto.mIV, ivSize)) { return nullptr; } - if (reader.CanRead16()) { - uint16_t count = reader.ReadU16(); + auto res = reader.ReadU16(); + if (res.isOk()) { + uint16_t count = res.unwrap(); if (reader.Remaining() < count * 6) { return nullptr; } for (size_t i = 0; i < count; i++) { - writer->mCrypto.mPlainSizes.AppendElement(reader.ReadU16()); - writer->mCrypto.mEncryptedSizes.AppendElement(reader.ReadU32()); + auto res_16 = reader.ReadU16(); + auto res_32 = reader.ReadU32(); + if (res_16.isErr() || res_32.isErr()) { + return nullptr; + } + writer->mCrypto.mPlainSizes.AppendElement(res_16.unwrap()); + writer->mCrypto.mEncryptedSizes.AppendElement(res_32.unwrap()); } } else { // No subsample information means the entire sample is encrypted. writer->mCrypto.mPlainSizes.AppendElement(0); writer->mCrypto.mEncryptedSizes.AppendElement(sample->Size()); } }
--- a/media/libstagefright/binding/include/mp4_demuxer/AnnexB.h +++ b/media/libstagefright/binding/include/mp4_demuxer/AnnexB.h @@ -6,40 +6,42 @@ #define MP4_DEMUXER_ANNEX_B_H_ template <class T> struct already_AddRefed; namespace mozilla { class MediaRawData; class MediaByteBuffer; } + namespace mp4_demuxer { -class ByteReader; +class BufferReader; class AnnexB { public: // All conversions assume size of NAL length field is 4 bytes. // Convert a sample from AVCC format to Annex B. - static bool ConvertSampleToAnnexB(mozilla::MediaRawData* aSample, bool aAddSPS = true); + static mozilla::Result<mozilla::Ok, nsresult> + ConvertSampleToAnnexB(mozilla::MediaRawData* aSample, bool aAddSPS = true); // Convert a sample from Annex B to AVCC. // an AVCC extradata must not be set. static bool ConvertSampleToAVCC(mozilla::MediaRawData* aSample); - static bool ConvertSampleTo4BytesAVCC(mozilla::MediaRawData* aSample); + static mozilla::Result<mozilla::Ok, nsresult> ConvertSampleTo4BytesAVCC(mozilla::MediaRawData* aSample); // Parse an AVCC extradata and construct the Annex B sample header. static already_AddRefed<mozilla::MediaByteBuffer> ConvertExtraDataToAnnexB( const mozilla::MediaByteBuffer* aExtraData); // Returns true if format is AVCC and sample has valid extradata. static bool IsAVCC(const mozilla::MediaRawData* aSample); // Returns true if format is AnnexB. static bool IsAnnexB(const mozilla::MediaRawData* aSample); private: // AVCC box parser helper. - static void ConvertSPSOrPPS(ByteReader& aReader, uint8_t aCount, - mozilla::MediaByteBuffer* aAnnexB); + static mozilla::Result<mozilla::Ok, nsresult> + ConvertSPSOrPPS(BufferReader& aReader, uint8_t aCount, mozilla::MediaByteBuffer* aAnnexB); }; } // namespace mp4_demuxer #endif // MP4_DEMUXER_ANNEX_B_H_
--- a/media/libstagefright/binding/include/mp4_demuxer/BufferReader.h +++ b/media/libstagefright/binding/include/mp4_demuxer/BufferReader.h @@ -90,21 +90,17 @@ public: NS_WARNING("Failed to read data"); return mozilla::Err(NS_ERROR_FAILURE); } return ptr[0] << 16 | ptr[1] << 8 | ptr[2]; } mozilla::Result<int32_t, nsresult> Read24() { - auto res = ReadU24(); - if (res.isErr()) { - return mozilla::Err(NS_ERROR_FAILURE); - } - return (int32_t)res.unwrap(); + return ReadU24().map([] (uint32_t x) { return (int32_t)x; }); } mozilla::Result<int32_t, nsresult> ReadLE24() { auto ptr = Read(3); if (!ptr) { NS_WARNING("Failed to read data"); return mozilla::Err(NS_ERROR_FAILURE); @@ -177,49 +173,49 @@ public: if (aCount < rewind) { rewind = aCount; } mRemaining += rewind; mPtr -= rewind; return mPtr; } - uint8_t PeekU8() const + mozilla::Result<uint8_t, nsresult> PeekU8() const { auto ptr = Peek(1); if (!ptr) { NS_WARNING("Failed to peek data"); - return 0; + return mozilla::Err(NS_ERROR_FAILURE); } return *ptr; } mozilla::Result<uint16_t, nsresult> PeekU16() const { auto ptr = Peek(2); if (!ptr) { NS_WARNING("Failed to peek data"); return mozilla::Err(NS_ERROR_FAILURE); } return mozilla::BigEndian::readUint16(ptr); } - uint32_t PeekU24() const + mozilla::Result<uint32_t, nsresult> PeekU24() const { auto ptr = Peek(3); if (!ptr) { NS_WARNING("Failed to peek data"); - return 0; + return mozilla::Err(NS_ERROR_FAILURE); } return ptr[0] << 16 | ptr[1] << 8 | ptr[2]; } - uint32_t Peek24() const + mozilla::Result<int32_t, nsresult> Peek24() const { - return (uint32_t)PeekU24(); + return PeekU24().map([] (uint32_t x) { return (int32_t)x; }); } mozilla::Result<uint32_t, nsresult> PeekU32() { auto ptr = Peek(4); if (!ptr) { NS_WARNING("Failed to peek data"); return mozilla::Err(NS_ERROR_FAILURE);
--- a/media/libstagefright/binding/include/mp4_demuxer/DecoderData.h +++ b/media/libstagefright/binding/include/mp4_demuxer/DecoderData.h @@ -48,24 +48,24 @@ public: CryptoFile() : valid(false) {} CryptoFile(const CryptoFile& aCryptoFile) : valid(aCryptoFile.valid) { pssh.AppendElements(aCryptoFile.pssh); } void Update(const uint8_t* aData, size_t aLength) { - valid = DoUpdate(aData, aLength); + valid = DoUpdate(aData, aLength).isOk(); } bool valid; nsTArray<PsshInfo> pssh; private: - bool DoUpdate(const uint8_t* aData, size_t aLength); + mozilla::Result<mozilla::Ok, nsresult> DoUpdate(const uint8_t* aData, size_t aLength); }; class MP4AudioInfo : public mozilla::AudioInfo { public: MP4AudioInfo() = default; void Update(const stagefright::MetaData* aMetaData,
--- a/memory/build/mozjemalloc.cpp +++ b/memory/build/mozjemalloc.cpp @@ -502,17 +502,17 @@ struct MOZ_RAII MutexAutoLock ~MutexAutoLock() { mMutex.Unlock(); } private: MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER; Mutex& mMutex; }; // Set to true once the allocator has been initialized. -static bool malloc_initialized = false; +static mozilla::Atomic<bool> malloc_initialized(false); #if defined(XP_WIN) // No init lock for Windows. #elif defined(XP_DARWIN) static Mutex gInitLock = { OS_SPINLOCK_INIT }; #elif defined(XP_LINUX) && !defined(ANDROID) static Mutex gInitLock = { PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP }; #else
--- a/servo/components/style/properties/longhand/ui.mako.rs +++ b/servo/components/style/properties/longhand/ui.mako.rs @@ -35,16 +35,22 @@ ${helpers.single_keyword("-moz-window-shadow", "none default menu tooltip sheet", products="gecko", gecko_ffi_name="mWindowShadow", gecko_constant_prefix="NS_STYLE_WINDOW_SHADOW", animation_value_type="discrete", internal=True, spec="None (Nonstandard internal property)")} +${helpers.predefined_type("-moz-window-opacity", "Opacity", "1.0", products="gecko", + gecko_ffi_name="mWindowOpacity", + animation_value_type="ComputedValue", + internal=True, + spec="None (Nonstandard internal property)")} + <%helpers:longhand name="-moz-force-broken-image-icon" products="gecko" animation_value_type="discrete" spec="None (Nonstandard Firefox-only property)"> use std::fmt; use style_traits::ToCss; pub mod computed_value {
--- a/testing/web-platform/meta/MANIFEST.json +++ b/testing/web-platform/meta/MANIFEST.json @@ -535905,17 +535905,17 @@ "ba0a0f2eda2703c742dd71b3106a3c78da27e677", "support" ], "editing/data/insertorderedlist.js": [ "9387d479a52fd5146d5d708eb1244250f3dd02b6", "support" ], "editing/data/insertparagraph.js": [ - "5cc4cee5d1ba32775a3a940e11ce46215b276466", + "7e5061611c18e53d67329ebd32bc078bcce4c73d", "support" ], "editing/data/inserttext.js": [ "be6f17c7af88382808ee574d9291fbc606ab7ec4", "support" ], "editing/data/insertunorderedlist.js": [ "ed8c92ce7bc902a5125e082798ad9abfef469f18",
--- a/testing/web-platform/tests/editing/data/insertparagraph.js +++ b/testing/web-platform/tests/editing/data/insertparagraph.js @@ -1594,10 +1594,30 @@ var browserTests = [ [["defaultparagraphseparator","div"],["insertparagraph",""]], "<div class=\"a\" id=\"x\"><p class=\"b\" id=\"y\">foo</p><p class=\"b\">{}bar</p></div>", [true,true], {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"insertparagraph":[false,false,"",false,false,""]}], ["<div class=a id=x><p class=b id=y>foo[]bar</div>", [["defaultparagraphseparator","p"],["insertparagraph",""]], "<div class=\"a\" id=\"x\"><p class=\"b\" id=\"y\">foo</p><p class=\"b\">{}bar</p></div>", [true,true], - {"defaultparagraphseparator":[false,false,"div",false,false,"p"],"insertparagraph":[false,false,"",false,false,""]}] + {"defaultparagraphseparator":[false,false,"div",false,false,"p"],"insertparagraph":[false,false,"",false,false,""]}], +["<div contenteditable=false><foo-bar contenteditable><p>foo[]bar</p></foo-bar></div>", + [["defaultparagraphseparator","div"],["insertparagraph",""]], + "<div contenteditable=\"false\"><foo-bar contenteditable=\"\"><p>foo</p><p>bar</p></foo-bar></div>", + [true,true], + {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"insertparagraph":[false,false,"",false,false,""]}], +["<div contenteditable=false><foo-bar contenteditable><p>foo[]bar</p></foo-bar></div>", + [["defaultparagraphseparator","p"],["insertparagraph",""]], + "<div contenteditable=\"false\"><foo-bar contenteditable=\"\"><p>foo</p><p>bar</p></foo-bar></div>", + [true,true], + {"defaultparagraphseparator":[false,false,"div",false,false,"p"],"insertparagraph":[false,false,"",false,false,""]}], +["<div contenteditable=false><foo-bar contenteditable><div>foo[]bar</div></foo-bar></div>", + [["defaultparagraphseparator","div"],["insertparagraph",""]], + "<div contenteditable=\"false\"><foo-bar contenteditable=\"\"><div>foo</div><div>bar</div></foo-bar></div>", + [true,true], + {"defaultparagraphseparator":[false,false,"p",false,false,"div"],"insertparagraph":[false,false,"",false,false,""]}], +["<div contenteditable=false><foo-bar contenteditable><div>foo[]bar</div></foo-bar></div>", + [["defaultparagraphseparator","p"],["insertparagraph",""]], + "<div contenteditable=\"false\"><foo-bar contenteditable=\"\"><div>foo</div><div>bar</div></foo-bar></div>", + [true,true], + {"defaultparagraphseparator":[false,false,"div",false,false,"p"],"insertparagraph":[false,false,"",false,false,""]}], ]