Index: media/mojo/clients/mojo_video_decoder.cc |
diff --git a/media/mojo/clients/mojo_video_decoder.cc b/media/mojo/clients/mojo_video_decoder.cc |
index 04e8439ac84dfe1a9158de0e835171bdee057aaa..89607a6a07d45b4eb60d0ae0daa6887e3b6c84a6 100644 |
--- a/media/mojo/clients/mojo_video_decoder.cc |
+++ b/media/mojo/clients/mojo_video_decoder.cc |
@@ -11,6 +11,7 @@ |
#include "base/logging.h" |
#include "base/single_thread_task_runner.h" |
#include "base/unguessable_token.h" |
+#include "media/base/bind_to_current_loop.h" |
#include "media/base/decoder_buffer.h" |
#include "media/base/demuxer_stream.h" |
#include "media/base/video_frame.h" |
@@ -28,7 +29,8 @@ MojoVideoDecoder::MojoVideoDecoder( |
: task_runner_(task_runner), |
remote_decoder_info_(remote_decoder.PassInterface()), |
gpu_factories_(gpu_factories), |
- client_binding_(this) { |
+ client_binding_(this), |
+ weak_factory_(this) { |
DVLOG(1) << __func__; |
} |
@@ -51,6 +53,9 @@ void MojoVideoDecoder::Initialize(const VideoDecoderConfig& config, |
DCHECK(task_runner_->BelongsToCurrentThread()); |
DCHECK(!cdm_context); |
+ if (!weak_this_) |
+ weak_this_ = weak_factory_.GetWeakPtr(); |
+ |
if (!remote_decoder_bound_) |
BindRemoteDecoder(); |
@@ -104,10 +109,26 @@ void MojoVideoDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer, |
base::Unretained(this), decode_id)); |
} |
-void MojoVideoDecoder::OnVideoFrameDecoded(mojom::VideoFramePtr frame) { |
+void MojoVideoDecoder::OnVideoFrameDecoded( |
+ mojom::VideoFramePtr frame, |
+ const base::Optional<base::UnguessableToken>& release_token) { |
DVLOG(2) << __func__; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- output_cb_.Run(frame.To<scoped_refptr<VideoFrame>>()); |
+ |
+ scoped_refptr<VideoFrame> video_frame = frame.To<scoped_refptr<VideoFrame>>(); |
+ if (release_token) { |
+ video_frame->SetReleaseMailboxCB( |
+ BindToCurrentLoop(base::Bind(&MojoVideoDecoder::OnReleaseMailbox, |
+ weak_this_, release_token.value()))); |
+ } |
+ output_cb_.Run(std::move(video_frame)); |
+} |
+ |
+void MojoVideoDecoder::OnReleaseMailbox( |
+ const base::UnguessableToken& release_token, |
+ const gpu::SyncToken& release_sync_token) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ remote_decoder_->OnReleaseMailbox(release_token, release_sync_token); |
} |
void MojoVideoDecoder::OnDecodeDone(uint64_t decode_id, DecodeStatus status) { |