diff options
Diffstat (limited to 'dom/media/gmp')
-rw-r--r-- | dom/media/gmp/CDMStorageIdProvider.cpp | 2 | ||||
-rw-r--r-- | dom/media/gmp/ChromiumCDMChild.h | 2 | ||||
-rw-r--r-- | dom/media/gmp/GMPVideoDecoderChild.cpp | 55 | ||||
-rw-r--r-- | dom/media/gmp/GMPVideoDecoderChild.h | 1 | ||||
-rw-r--r-- | dom/media/gmp/GMPVideoEncoderChild.cpp | 43 | ||||
-rw-r--r-- | dom/media/gmp/GMPVideoEncoderChild.h | 1 | ||||
-rw-r--r-- | dom/media/gmp/mozIGeckoMediaPluginService.idl | 2 |
7 files changed, 79 insertions, 27 deletions
diff --git a/dom/media/gmp/CDMStorageIdProvider.cpp b/dom/media/gmp/CDMStorageIdProvider.cpp index 52255879b3..9af4580d9e 100644 --- a/dom/media/gmp/CDMStorageIdProvider.cpp +++ b/dom/media/gmp/CDMStorageIdProvider.cpp @@ -6,7 +6,7 @@ #include "CDMStorageIdProvider.h" #include "GMPLog.h" #include "nsCOMPtr.h" -#include "nsComponentManagerUtils.h" +#include "mozilla/IntegerPrintfMacros.h" #include "nsICryptoHash.h" #ifdef SUPPORT_STORAGE_ID diff --git a/dom/media/gmp/ChromiumCDMChild.h b/dom/media/gmp/ChromiumCDMChild.h index 1bf153a5d5..fae54bbb5c 100644 --- a/dom/media/gmp/ChromiumCDMChild.h +++ b/dom/media/gmp/ChromiumCDMChild.h @@ -125,7 +125,7 @@ class ChromiumCDMChild : public PChromiumCDMChild, public cdm::Host_10 { GMPContentChild* mPlugin = nullptr; cdm::ContentDecryptionModule_10* mCDM = nullptr; - typedef SimpleMap<uint64_t> DurationMap; + typedef SimpleMap<int64_t, uint64_t, ThreadSafePolicy> DurationMap; DurationMap mFrameDurations; nsTArray<uint32_t> mLoadSessionPromiseIds; 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<GMPVideoi420FrameImpl*>(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<GMPVideoEncodedFrameImpl*>(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; diff --git a/dom/media/gmp/mozIGeckoMediaPluginService.idl b/dom/media/gmp/mozIGeckoMediaPluginService.idl index 000cfef2f5..a4e3253cba 100644 --- a/dom/media/gmp/mozIGeckoMediaPluginService.idl +++ b/dom/media/gmp/mozIGeckoMediaPluginService.idl @@ -57,7 +57,7 @@ native GetGMPVideoEncoderCallback(mozilla::UniquePtr<GetGMPVideoEncoderCallback> native GetNodeIdCallback(mozilla::UniquePtr<GetNodeIdCallback>&&); native GMPCrashHelperPtr(mozilla::GMPCrashHelper*); -[scriptable, uuid(44d362ae-937a-4803-bee6-f2512a0149d1)] +[scriptable, builtinclass, uuid(44d362ae-937a-4803-bee6-f2512a0149d1)] interface mozIGeckoMediaPluginService : nsISupports { |