summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjrummell <jrummell@chromium.org>2016-03-17 14:28:52 -0700
committerCommit bot <commit-bot@chromium.org>2016-03-17 21:31:24 +0000
commit97f461e96d8f6b733993d98b1df40cfe6f075063 (patch)
tree8109c4e3e108b002398d00fca8e1977471067651
parent823b7378c01290d0a29e2052554d497e87530490 (diff)
downloadchromium_src-97f461e96d8f6b733993d98b1df40cfe6f075063.zip
chromium_src-97f461e96d8f6b733993d98b1df40cfe6f075063.tar.gz
chromium_src-97f461e96d8f6b733993d98b1df40cfe6f075063.tar.bz2
Reland "Update mojo Decryptor interface to support reusing shared memory"
Now that VideoFrames are transported across mojo using shared memory, the original needs to stay around until the other side is no longer using it, after which the shared memory can be reused for a subsequent VideoFrame. BUG=510153 TEST=compiles on Windows Review URL: https://codereview.chromium.org/1809903002 Cr-Commit-Position: refs/heads/master@{#381800}
-rw-r--r--media/mojo/common/mojo_shared_buffer_video_frame.h1
-rw-r--r--media/mojo/interfaces/decryptor.mojom9
-rw-r--r--media/mojo/services/mojo_decryptor.cc19
-rw-r--r--media/mojo/services/mojo_decryptor.h4
-rw-r--r--media/mojo/services/mojo_decryptor_service.cc18
-rw-r--r--media/mojo/services/mojo_decryptor_service.h12
6 files changed, 59 insertions, 4 deletions
diff --git a/media/mojo/common/mojo_shared_buffer_video_frame.h b/media/mojo/common/mojo_shared_buffer_video_frame.h
index 69562c8..11f96f7 100644
--- a/media/mojo/common/mojo_shared_buffer_video_frame.h
+++ b/media/mojo/common/mojo_shared_buffer_video_frame.h
@@ -82,6 +82,7 @@ class MojoSharedBufferVideoFrame : public VideoFrame {
// can be transferred across a mojo connection.
friend struct mojo::TypeConverter<mojo::StructPtr<interfaces::VideoFrame>,
scoped_refptr<VideoFrame>>;
+ friend class MojoDecryptorService;
MojoSharedBufferVideoFrame(VideoPixelFormat format,
const gfx::Size& coded_size,
diff --git a/media/mojo/interfaces/decryptor.mojom b/media/mojo/interfaces/decryptor.mojom
index d063e6b..84f16dd 100644
--- a/media/mojo/interfaces/decryptor.mojom
+++ b/media/mojo/interfaces/decryptor.mojom
@@ -51,10 +51,12 @@ interface Decryptor {
// been successfully initialized.
// At most one decrypt-and-decode call is allowed at any time for a
// |stream_type|.
+ // For video, ReleaseSharedBuffer() must be called when the VideoFrame
+ // is shared memory based and the memory is no longer needed.
DecryptAndDecodeAudio(DecoderBuffer encrypted)
=> (Status status, array<AudioBuffer>? audio_buffers);
- DecryptAndDecodeVideo(
- DecoderBuffer encrypted) => (Status status, VideoFrame? video_frame);
+ DecryptAndDecodeVideo(DecoderBuffer encrypted)
+ => (Status status, VideoFrame? video_frame);
// Resets the decoder for |stream_type| to a clean initialized state and
// cancels any pending decrypt-and-decode operations immediately with ERROR.
@@ -70,4 +72,7 @@ interface Decryptor {
// After this operation, the decoder is set to an uninitialized state.
// The decoder can be reinitialized after it is deinitialized.
DeinitializeDecoder(DemuxerStream.Type stream_type);
+
+ // Releases the shared memory.
+ ReleaseSharedBuffer(handle<shared_buffer> buffer, uint64 buffer_size);
};
diff --git a/media/mojo/services/mojo_decryptor.cc b/media/mojo/services/mojo_decryptor.cc
index 38f694e..838f623 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%
diff --git a/media/mojo/services/mojo_decryptor.h b/media/mojo/services/mojo_decryptor.h
index 131c0d0..b8c0dab7 100644
--- a/media/mojo/services/mojo_decryptor.h
+++ b/media/mojo/services/mojo_decryptor.h
@@ -57,6 +57,10 @@ class MojoDecryptor : public Decryptor {
interfaces::Decryptor::Status status,
interfaces::VideoFramePtr video_frame);
+ // Called when done with a VideoFrame in order to reuse the shared memory.
+ void ReleaseSharedBuffer(mojo::ScopedSharedBufferHandle buffer,
+ size_t buffer_size);
+
// To pass DecoderBuffers to and from the MojoDecryptorService, 2 data pipes
// are required (one each way). At initialization both pipes are created,
// and then the handles are passed to the MojoDecryptorService.
diff --git a/media/mojo/services/mojo_decryptor_service.cc b/media/mojo/services/mojo_decryptor_service.cc
index 07cb1cc..89c87bf 100644
--- a/media/mojo/services/mojo_decryptor_service.cc
+++ b/media/mojo/services/mojo_decryptor_service.cc
@@ -4,8 +4,6 @@
#include "media/mojo/services/mojo_decryptor_service.h"
-#include <stdint.h>
-
#include <utility>
#include "base/bind.h"
@@ -18,6 +16,7 @@
#include "media/base/video_decoder_config.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/demuxer_stream.mojom.h"
namespace media {
@@ -112,6 +111,12 @@ void MojoDecryptorService::DeinitializeDecoder(
static_cast<media::Decryptor::StreamType>(stream_type));
}
+void MojoDecryptorService::ReleaseSharedBuffer(
+ mojo::ScopedSharedBufferHandle buffer,
+ uint64_t buffer_size) {
+ in_use_video_frames_.erase(buffer.get().value());
+}
+
void MojoDecryptorService::OnDecryptDone(
const DecryptCallback& callback,
media::Decryptor::Status status,
@@ -174,6 +179,15 @@ void MojoDecryptorService::OnVideoDecoded(
return;
}
+ // If |frame| has shared memory that will be passed back, keep a reference
+ // to it until the other side is done with the memory.
+ if (frame->storage_type() == VideoFrame::STORAGE_MOJO_SHARED_BUFFER) {
+ MojoSharedBufferVideoFrame* mojo_frame =
+ static_cast<MojoSharedBufferVideoFrame*>(frame.get());
+ in_use_video_frames_.insert(
+ std::make_pair(mojo_frame->Handle().value(), frame));
+ }
+
callback.Run(static_cast<Decryptor::Status>(status),
interfaces::VideoFrame::From(frame));
}
diff --git a/media/mojo/services/mojo_decryptor_service.h b/media/mojo/services/mojo_decryptor_service.h
index b5bf2ff..23ddc54 100644
--- a/media/mojo/services/mojo_decryptor_service.h
+++ b/media/mojo/services/mojo_decryptor_service.h
@@ -5,6 +5,11 @@
#ifndef MEDIA_MOJO_SERVICES_MOJO_DECRYPTOR_SERVICE_H_
#define MEDIA_MOJO_SERVICES_MOJO_DECRYPTOR_SERVICE_H_
+#include <stddef.h>
+#include <stdint.h>
+
+#include <unordered_map>
+
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
@@ -53,6 +58,8 @@ class MojoDecryptorService : public interfaces::Decryptor {
const DecryptAndDecodeVideoCallback& callback) final;
void ResetDecoder(interfaces::DemuxerStream::Type stream_type) final;
void DeinitializeDecoder(interfaces::DemuxerStream::Type stream_type) final;
+ void ReleaseSharedBuffer(mojo::ScopedSharedBufferHandle buffer,
+ uint64_t buffer_size) final;
private:
// Callback executed once Decrypt() is done.
@@ -92,6 +99,11 @@ class MojoDecryptorService : public interfaces::Decryptor {
scoped_refptr<MediaKeys> cdm_;
media::Decryptor* decryptor_;
+ // Keep a reference to VideoFrames until ReleaseSharedBuffer() is called
+ // to release it.
+ std::unordered_map<MojoHandle, scoped_refptr<VideoFrame>>
+ in_use_video_frames_;
+
base::WeakPtr<MojoDecryptorService> weak_this_;
base::WeakPtrFactory<MojoDecryptorService> weak_factory_;