Skip to content

Commit

Permalink
Bug 1862809. r=media-playback-reviewers,azebrowski
Browse files Browse the repository at this point in the history
  • Loading branch information
aosmond committed May 23, 2024
1 parent 4fe47f0 commit f74c126
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 24 deletions.
55 changes: 46 additions & 9 deletions dom/media/gmp/GMPVideoDecoderChild.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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) {
Expand All @@ -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.
Expand All @@ -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;
Expand Down
1 change: 1 addition & 0 deletions dom/media/gmp/GMPVideoDecoderChild.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
43 changes: 28 additions & 15 deletions dom/media/gmp/GMPVideoEncoderChild.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
Expand Down
1 change: 1 addition & 0 deletions dom/media/gmp/GMPVideoEncoderChild.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit f74c126

Please sign in to comment.