From 6391fbb73e25d3f7af15213274c2a3bfe1bc7af5 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 17 Jun 2024 11:04:05 +0200 Subject: Merging upstream version 115.12.0esr. Signed-off-by: Daniel Baumann --- dom/media/MediaInfo.h | 27 ++++++++++++++++- dom/media/gmp/GMPVideoDecoderChild.cpp | 55 ++++++++++++++++++++++++++++------ dom/media/gmp/GMPVideoDecoderChild.h | 1 + dom/media/gmp/GMPVideoEncoderChild.cpp | 43 ++++++++++++++++---------- dom/media/gmp/GMPVideoEncoderChild.h | 1 + 5 files changed, 102 insertions(+), 25 deletions(-) (limited to 'dom/media') diff --git a/dom/media/MediaInfo.h b/dom/media/MediaInfo.h index c692b94d64..4dba606420 100644 --- a/dom/media/MediaInfo.h +++ b/dom/media/MediaInfo.h @@ -351,7 +351,32 @@ class VideoInfo : public TrackInfo { mExtraData(new MediaByteBuffer), mRotation(kDegree_0) {} - VideoInfo(const VideoInfo& aOther) = default; + VideoInfo(const VideoInfo& aOther) : TrackInfo(aOther) { + if (aOther.mCodecSpecificConfig) { + mCodecSpecificConfig = new MediaByteBuffer(); + mCodecSpecificConfig->AppendElements( + reinterpret_cast(aOther.mCodecSpecificConfig->Elements()), + aOther.mCodecSpecificConfig->Length()); + } + if (aOther.mExtraData) { + mExtraData = new MediaByteBuffer(); + mExtraData->AppendElements( + reinterpret_cast(aOther.mExtraData->Elements()), + aOther.mExtraData->Length()); + } + mDisplay = aOther.mDisplay; + mStereoMode = aOther.mStereoMode; + mImage = aOther.mImage; + mRotation = aOther.mRotation; + mColorDepth = aOther.mColorDepth; + mColorSpace = aOther.mColorSpace; + mColorPrimaries = aOther.mColorPrimaries; + mTransferFunction = aOther.mTransferFunction; + mColorRange = aOther.mColorRange; + mImageRect = aOther.mImageRect; + mAlphaPresent = aOther.mAlphaPresent; + mFrameRate = aOther.mFrameRate; + }; bool operator==(const VideoInfo& rhs) const; diff --git a/dom/media/gmp/GMPVideoDecoderChild.cpp b/dom/media/gmp/GMPVideoDecoderChild.cpp index 0f605cca9b..f60952ee51 100644 --- a/dom/media/gmp/GMPVideoDecoderChild.cpp +++ b/dom/media/gmp/GMPVideoDecoderChild.cpp @@ -36,12 +36,17 @@ void GMPVideoDecoderChild::Init(GMPVideoDecoder* aDecoder) { GMPVideoHostImpl& GMPVideoDecoderChild::Host() { return mVideoHost; } void GMPVideoDecoderChild::Decoded(GMPVideoi420Frame* aDecodedFrame) { - MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); - if (!aDecodedFrame) { MOZ_CRASH("Not given a decoded frame!"); } + if (NS_WARN_IF(!mPlugin)) { + aDecodedFrame->Destroy(); + return; + } + + MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); + auto df = static_cast(aDecodedFrame); GMPVideoi420FrameData frameData; @@ -53,36 +58,60 @@ void GMPVideoDecoderChild::Decoded(GMPVideoi420Frame* aDecodedFrame) { void GMPVideoDecoderChild::ReceivedDecodedReferenceFrame( const uint64_t aPictureId) { + if (NS_WARN_IF(!mPlugin)) { + return; + } + MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); SendReceivedDecodedReferenceFrame(aPictureId); } void GMPVideoDecoderChild::ReceivedDecodedFrame(const uint64_t aPictureId) { + if (NS_WARN_IF(!mPlugin)) { + return; + } + MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); SendReceivedDecodedFrame(aPictureId); } void GMPVideoDecoderChild::InputDataExhausted() { + if (NS_WARN_IF(!mPlugin)) { + return; + } + MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); SendInputDataExhausted(); } void GMPVideoDecoderChild::DrainComplete() { + if (NS_WARN_IF(!mPlugin)) { + return; + } + MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); SendDrainComplete(); } void GMPVideoDecoderChild::ResetComplete() { + if (NS_WARN_IF(!mPlugin)) { + return; + } + MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); SendResetComplete(); } void GMPVideoDecoderChild::Error(GMPErr aError) { + if (NS_WARN_IF(!mPlugin)) { + return; + } + MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); SendError(aError); @@ -121,9 +150,9 @@ mozilla::ipc::IPCResult GMPVideoDecoderChild::RecvDecode( mozilla::ipc::IPCResult GMPVideoDecoderChild::RecvChildShmemForPool( Shmem&& aFrameBuffer) { - if (aFrameBuffer.IsWritable()) { - mVideoHost.SharedMemMgr()->MgrDeallocShmem(GMPSharedMem::kGMPFrameData, - aFrameBuffer); + GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr(); + if (memMgr && aFrameBuffer.IsWritable()) { + memMgr->MgrDeallocShmem(GMPSharedMem::kGMPFrameData, aFrameBuffer); } return IPC_OK(); } @@ -153,6 +182,7 @@ mozilla::ipc::IPCResult GMPVideoDecoderChild::RecvDrain() { } mozilla::ipc::IPCResult GMPVideoDecoderChild::RecvDecodingComplete() { + MOZ_ASSERT(mPlugin); MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); if (mNeedShmemIntrCount) { @@ -163,6 +193,13 @@ mozilla::ipc::IPCResult GMPVideoDecoderChild::RecvDecodingComplete() { mPendingDecodeComplete = true; return IPC_OK(); } + + // This will call ActorDestroy. + Unused << Send__delete__(this); + return IPC_OK(); +} + +void GMPVideoDecoderChild::ActorDestroy(ActorDestroyReason why) { if (mVideoDecoder) { // Ignore any return code. It is OK for this to fail without killing the // process. @@ -173,13 +210,13 @@ mozilla::ipc::IPCResult GMPVideoDecoderChild::RecvDecodingComplete() { mVideoHost.DoneWithAPI(); mPlugin = nullptr; - - Unused << Send__delete__(this); - - return IPC_OK(); } bool GMPVideoDecoderChild::Alloc(size_t aSize, Shmem* aMem) { + if (NS_WARN_IF(!mPlugin)) { + return false; + } + MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); bool rv; diff --git a/dom/media/gmp/GMPVideoDecoderChild.h b/dom/media/gmp/GMPVideoDecoderChild.h index 3c74e5f02c..527d6cad44 100644 --- a/dom/media/gmp/GMPVideoDecoderChild.h +++ b/dom/media/gmp/GMPVideoDecoderChild.h @@ -59,6 +59,7 @@ class GMPVideoDecoderChild : public PGMPVideoDecoderChild, mozilla::ipc::IPCResult RecvReset(); mozilla::ipc::IPCResult RecvDrain(); mozilla::ipc::IPCResult RecvDecodingComplete(); + void ActorDestroy(ActorDestroyReason why) override; GMPContentChild* mPlugin; GMPVideoDecoder* mVideoDecoder; diff --git a/dom/media/gmp/GMPVideoEncoderChild.cpp b/dom/media/gmp/GMPVideoEncoderChild.cpp index 19a96b5efe..01a913f920 100644 --- a/dom/media/gmp/GMPVideoEncoderChild.cpp +++ b/dom/media/gmp/GMPVideoEncoderChild.cpp @@ -38,6 +38,11 @@ GMPVideoHostImpl& GMPVideoEncoderChild::Host() { return mVideoHost; } void GMPVideoEncoderChild::Encoded(GMPVideoEncodedFrame* aEncodedFrame, const uint8_t* aCodecSpecificInfo, uint32_t aCodecSpecificInfoLength) { + if (NS_WARN_IF(!mPlugin)) { + aEncodedFrame->Destroy(); + return; + } + MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); auto ef = static_cast(aEncodedFrame); @@ -53,6 +58,10 @@ void GMPVideoEncoderChild::Encoded(GMPVideoEncodedFrame* aEncodedFrame, } void GMPVideoEncoderChild::Error(GMPErr aError) { + if (NS_WARN_IF(!mPlugin)) { + return; + } + MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); SendError(aError); @@ -95,9 +104,9 @@ mozilla::ipc::IPCResult GMPVideoEncoderChild::RecvEncode( mozilla::ipc::IPCResult GMPVideoEncoderChild::RecvChildShmemForPool( Shmem&& aEncodedBuffer) { - if (aEncodedBuffer.IsWritable()) { - mVideoHost.SharedMemMgr()->MgrDeallocShmem(GMPSharedMem::kGMPEncodedData, - aEncodedBuffer); + GMPSharedMemManager* memMgr = mVideoHost.SharedMemMgr(); + if (memMgr && aEncodedBuffer.IsWritable()) { + memMgr->MgrDeallocShmem(GMPSharedMem::kGMPEncodedData, aEncodedBuffer); } return IPC_OK(); } @@ -142,6 +151,7 @@ mozilla::ipc::IPCResult GMPVideoEncoderChild::RecvSetPeriodicKeyFrames( } mozilla::ipc::IPCResult GMPVideoEncoderChild::RecvEncodingComplete() { + MOZ_ASSERT(mPlugin); MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); if (mNeedShmemIntrCount) { @@ -153,26 +163,29 @@ mozilla::ipc::IPCResult GMPVideoEncoderChild::RecvEncodingComplete() { return IPC_OK(); } - if (!mVideoEncoder) { - // There is not much to clean up anymore. - Unused << Send__delete__(this); - return IPC_OK(); - } + // This will call ActorDestroy. + Unused << Send__delete__(this); + return IPC_OK(); +} - // Ignore any return code. It is OK for this to fail without killing the - // process. - mVideoEncoder->EncodingComplete(); +void GMPVideoEncoderChild::ActorDestroy(ActorDestroyReason why) { + if (mVideoEncoder) { + // Ignore any return code. It is OK for this to fail without killing the + // process. + mVideoEncoder->EncodingComplete(); + mVideoEncoder = nullptr; + } mVideoHost.DoneWithAPI(); mPlugin = nullptr; - - Unused << Send__delete__(this); - - return IPC_OK(); } bool GMPVideoEncoderChild::Alloc(size_t aSize, Shmem* aMem) { + if (NS_WARN_IF(!mPlugin)) { + return false; + } + MOZ_ASSERT(mPlugin->GMPMessageLoop() == MessageLoop::current()); bool rv; diff --git a/dom/media/gmp/GMPVideoEncoderChild.h b/dom/media/gmp/GMPVideoEncoderChild.h index dd3c0fdf37..344a55b388 100644 --- a/dom/media/gmp/GMPVideoEncoderChild.h +++ b/dom/media/gmp/GMPVideoEncoderChild.h @@ -59,6 +59,7 @@ class GMPVideoEncoderChild : public PGMPVideoEncoderChild, const uint32_t& aFrameRate); mozilla::ipc::IPCResult RecvSetPeriodicKeyFrames(const bool& aEnable); mozilla::ipc::IPCResult RecvEncodingComplete(); + void ActorDestroy(ActorDestroyReason why) override; GMPContentChild* mPlugin; GMPVideoEncoder* mVideoEncoder; -- cgit v1.2.3