Index: media/mojo/services/mojo_decryptor.cc |
diff --git a/media/mojo/services/mojo_decryptor.cc b/media/mojo/services/mojo_decryptor.cc |
index 38f694ed55b8031a6e0502ea9831df631f9e2b1e..838f62340ca1a52f7e43a0675bc0d88724cd68cb 100644 |
--- a/media/mojo/services/mojo_decryptor.cc |
+++ b/media/mojo/services/mojo_decryptor.cc |
@@ -15,6 +15,7 @@ |
#include "media/base/decoder_buffer.h" |
#include "media/base/video_frame.h" |
#include "media/mojo/common/media_type_converters.h" |
+#include "media/mojo/common/mojo_shared_buffer_video_frame.h" |
#include "media/mojo/interfaces/decryptor.mojom.h" |
#include "mojo/shell/public/cpp/connect.h" |
@@ -183,9 +184,27 @@ void MojoDecryptor::OnVideoDecoded(const VideoDecodeCB& video_decode_cb, |
} |
scoped_refptr<VideoFrame> frame(video_frame.To<scoped_refptr<VideoFrame>>()); |
+ |
+ // If using shared memory, ensure that ReleaseSharedBuffer() is called when |
+ // |frame| is destroyed. |
+ if (frame->storage_type() == VideoFrame::STORAGE_MOJO_SHARED_BUFFER) { |
+ MojoSharedBufferVideoFrame* mojo_frame = |
+ static_cast<MojoSharedBufferVideoFrame*>(frame.get()); |
+ mojo_frame->SetMojoSharedBufferDoneCB(base::Bind( |
+ &MojoDecryptor::ReleaseSharedBuffer, weak_factory_.GetWeakPtr())); |
+ } |
+ |
video_decode_cb.Run(static_cast<Decryptor::Status>(status), frame); |
} |
+void MojoDecryptor::ReleaseSharedBuffer(mojo::ScopedSharedBufferHandle buffer, |
+ size_t buffer_size) { |
+ DVLOG(1) << __FUNCTION__; |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ remote_decryptor_->ReleaseSharedBuffer(std::move(buffer), buffer_size); |
+} |
+ |
void MojoDecryptor::CreateDataPipes() { |
// Allocate DataPipe size based on video content. Video can get quite large; |
// at 4K, VP9 delivers packets which are ~1MB in size; so allow for 50% |