Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(337)

Unified Diff: media/filters/gpu_video_decoder.cc

Issue 19534002: Make RendererGpuVideoDecoderFactories live on arbitrary threads. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address review comments Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/filters/gpu_video_decoder.cc
diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc
index 940bec1c52dc7c9a518590682fc5ce5e3f91402d..16619b240197d11c92e7b73a8cbd3d745817fc2b 100644
--- a/media/filters/gpu_video_decoder.cc
+++ b/media/filters/gpu_video_decoder.cc
@@ -20,112 +20,6 @@
namespace media {
-// Proxies calls to a VideoDecodeAccelerator::Client from the calling thread to
Ami GONE FROM CHROMIUM 2013/07/22 19:46:21 This makes me ever so happy!
-// the client's thread.
-//
-// TODO(scherkus): VDAClientProxy should hold onto GpuVideoDecoder::Factories
-// and take care of some of the work that GpuVideoDecoder does to minimize
-// thread hopping. See following for discussion:
-//
-// https://codereview.chromium.org/12989009/diff/27035/media/filters/gpu_video_decoder.cc#newcode23
-class VDAClientProxy
- : public base::RefCountedThreadSafe<VDAClientProxy>,
- public VideoDecodeAccelerator::Client {
- public:
- explicit VDAClientProxy(VideoDecodeAccelerator::Client* client);
-
- // Detaches the proxy. |weak_client_| will no longer be called and can be
- // safely deleted. Any pending/future calls will be discarded.
- //
- // Must be called on |client_loop_|.
- void Detach();
-
- // VideoDecodeAccelerator::Client implementation.
- virtual void NotifyInitializeDone() OVERRIDE;
- virtual void ProvidePictureBuffers(uint32 count,
- const gfx::Size& size,
- uint32 texture_target) OVERRIDE;
- virtual void DismissPictureBuffer(int32 id) OVERRIDE;
- virtual void PictureReady(const media::Picture& picture) OVERRIDE;
- virtual void NotifyEndOfBitstreamBuffer(int32 id) OVERRIDE;
- virtual void NotifyFlushDone() OVERRIDE;
- virtual void NotifyResetDone() OVERRIDE;
- virtual void NotifyError(media::VideoDecodeAccelerator::Error error) OVERRIDE;
-
- private:
- friend class base::RefCountedThreadSafe<VDAClientProxy>;
- virtual ~VDAClientProxy();
-
- scoped_refptr<base::MessageLoopProxy> client_loop_;
-
- // Weak pointers are used to invalidate tasks posted to |client_loop_| after
- // Detach() has been called.
- base::WeakPtrFactory<VideoDecodeAccelerator::Client> weak_client_factory_;
- base::WeakPtr<VideoDecodeAccelerator::Client> weak_client_;
-
- DISALLOW_COPY_AND_ASSIGN(VDAClientProxy);
-};
-
-VDAClientProxy::VDAClientProxy(VideoDecodeAccelerator::Client* client)
- : client_loop_(base::MessageLoopProxy::current()),
- weak_client_factory_(client),
- weak_client_(weak_client_factory_.GetWeakPtr()) {
- DCHECK(weak_client_.get());
-}
-
-VDAClientProxy::~VDAClientProxy() {}
-
-void VDAClientProxy::Detach() {
- DCHECK(client_loop_->BelongsToCurrentThread());
- DCHECK(weak_client_.get()) << "Detach() already called";
- weak_client_factory_.InvalidateWeakPtrs();
-}
-
-void VDAClientProxy::NotifyInitializeDone() {
- client_loop_->PostTask(FROM_HERE, base::Bind(
- &VideoDecodeAccelerator::Client::NotifyInitializeDone, weak_client_));
-}
-
-void VDAClientProxy::ProvidePictureBuffers(uint32 count,
- const gfx::Size& size,
- uint32 texture_target) {
- client_loop_->PostTask(FROM_HERE, base::Bind(
- &VideoDecodeAccelerator::Client::ProvidePictureBuffers, weak_client_,
- count, size, texture_target));
-}
-
-void VDAClientProxy::DismissPictureBuffer(int32 id) {
- client_loop_->PostTask(FROM_HERE, base::Bind(
- &VideoDecodeAccelerator::Client::DismissPictureBuffer, weak_client_, id));
-}
-
-void VDAClientProxy::PictureReady(const media::Picture& picture) {
- client_loop_->PostTask(FROM_HERE, base::Bind(
- &VideoDecodeAccelerator::Client::PictureReady, weak_client_, picture));
-}
-
-void VDAClientProxy::NotifyEndOfBitstreamBuffer(int32 id) {
- client_loop_->PostTask(FROM_HERE, base::Bind(
- &VideoDecodeAccelerator::Client::NotifyEndOfBitstreamBuffer, weak_client_,
- id));
-}
-
-void VDAClientProxy::NotifyFlushDone() {
- client_loop_->PostTask(FROM_HERE, base::Bind(
- &VideoDecodeAccelerator::Client::NotifyFlushDone, weak_client_));
-}
-
-void VDAClientProxy::NotifyResetDone() {
- client_loop_->PostTask(FROM_HERE, base::Bind(
- &VideoDecodeAccelerator::Client::NotifyResetDone, weak_client_));
-}
-
-void VDAClientProxy::NotifyError(media::VideoDecodeAccelerator::Error error) {
- client_loop_->PostTask(FROM_HERE, base::Bind(
- &VideoDecodeAccelerator::Client::NotifyError, weak_client_, error));
-}
-
-
// Maximum number of concurrent VDA::Decode() operations GVD will maintain.
// Higher values allow better pipelining in the GPU, but also require more
// resources.
@@ -164,7 +58,6 @@ GpuVideoDecoder::GpuVideoDecoder(
: needs_bitstream_conversion_(false),
gvd_loop_proxy_(message_loop),
weak_factory_(this),
- vda_loop_proxy_(factories->GetMessageLoop()),
factories_(factories),
state_(kNormal),
decoder_texture_target_(0),
@@ -172,6 +65,7 @@ GpuVideoDecoder::GpuVideoDecoder(
next_bitstream_buffer_id_(0),
available_pictures_(0) {
DCHECK(factories_.get());
+ DCHECK_EQ(message_loop.get(), factories->GetMessageLoop().get());
}
void GpuVideoDecoder::Reset(const base::Closure& closure) {
@@ -202,8 +96,7 @@ void GpuVideoDecoder::Reset(const base::Closure& closure) {
DCHECK(pending_reset_cb_.is_null());
pending_reset_cb_ = BindToCurrentLoop(closure);
- vda_loop_proxy_->PostTask(FROM_HERE, base::Bind(
- &VideoDecodeAccelerator::Reset, weak_vda_));
+ vda_->Reset();
}
void GpuVideoDecoder::Stop(const base::Closure& closure) {
@@ -259,9 +152,8 @@ void GpuVideoDecoder::Initialize(const VideoDecoderConfig& config,
return;
}
- client_proxy_ = new VDAClientProxy(this);
- VideoDecodeAccelerator* vda = factories_->CreateVideoDecodeAccelerator(
- config.profile(), client_proxy_.get());
+ VideoDecodeAccelerator* vda =
+ factories_->CreateVideoDecodeAccelerator(config.profile(), this);
Ami GONE FROM CHROMIUM 2013/07/22 19:46:21 nit: you don't need this intermediate variable; yo
wuchengli 2013/07/23 16:29:28 Done.
if (!vda) {
status_cb.Run(DECODER_ERROR_NOT_SUPPORTED);
return;
@@ -271,21 +163,7 @@ void GpuVideoDecoder::Initialize(const VideoDecoderConfig& config,
needs_bitstream_conversion_ = (config.codec() == kCodecH264);
DVLOG(3) << "GpuVideoDecoder::Initialize() succeeded.";
- PostTaskAndReplyWithResult(
- vda_loop_proxy_.get(),
- FROM_HERE,
- base::Bind(&VideoDecodeAccelerator::AsWeakPtr, base::Unretained(vda)),
- base::Bind(&GpuVideoDecoder::SetVDA, weak_this_, status_cb, vda));
-}
-
-void GpuVideoDecoder::SetVDA(
- const PipelineStatusCB& status_cb,
- VideoDecodeAccelerator* vda,
- base::WeakPtr<VideoDecodeAccelerator> weak_vda) {
- DCHECK(gvd_loop_proxy_->BelongsToCurrentThread());
- DCHECK(!vda_.get());
vda_.reset(vda);
- weak_vda_ = weak_vda;
status_cb.Run(PIPELINE_OK);
}
@@ -305,25 +183,11 @@ void GpuVideoDecoder::DestroyTextures() {
dismissed_picture_buffers_.clear();
}
-static void DestroyVDAWithClientProxy(
- const scoped_refptr<VDAClientProxy>& client_proxy,
- base::WeakPtr<VideoDecodeAccelerator> weak_vda) {
- if (weak_vda.get()) {
- weak_vda->Destroy();
- DCHECK(!weak_vda.get()); // Check VDA::Destroy() contract.
- }
-}
-
void GpuVideoDecoder::DestroyVDA() {
DCHECK(gvd_loop_proxy_->BelongsToCurrentThread());
- // |client_proxy| must stay alive until |weak_vda_| has been destroyed.
- vda_loop_proxy_->PostTask(FROM_HERE, base::Bind(
- &DestroyVDAWithClientProxy, client_proxy_, weak_vda_));
-
- VideoDecodeAccelerator* vda ALLOW_UNUSED = vda_.release();
- client_proxy_->Detach();
- client_proxy_ = NULL;
+ if (vda_)
+ vda_.release()->Destroy();
DestroyTextures();
}
@@ -364,8 +228,7 @@ void GpuVideoDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer,
if (buffer->IsEndOfStream()) {
if (state_ == kNormal) {
state_ = kDrainingDecoder;
- vda_loop_proxy_->PostTask(FROM_HERE, base::Bind(
- &VideoDecodeAccelerator::Flush, weak_vda_));
+ vda_->Flush();
}
return;
}
@@ -387,8 +250,7 @@ void GpuVideoDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer,
DCHECK(inserted);
RecordBufferData(bitstream_buffer, *buffer.get());
- vda_loop_proxy_->PostTask(FROM_HERE, base::Bind(
- &VideoDecodeAccelerator::Decode, weak_vda_, bitstream_buffer));
+ vda_->Decode(bitstream_buffer);
if (!ready_video_frames_.empty()) {
EnqueueFrameAndTriggerFrameDelivery(NULL);
@@ -491,9 +353,7 @@ void GpuVideoDecoder::ProvidePictureBuffers(uint32 count,
available_pictures_ += count;
- vda_loop_proxy_->PostTask(FROM_HERE, base::Bind(
- &VideoDecodeAccelerator::AssignPictureBuffers, weak_vda_,
- picture_buffers));
+ vda_->AssignPictureBuffers(picture_buffers);
}
void GpuVideoDecoder::DismissPictureBuffer(int32 id) {
@@ -620,9 +480,7 @@ void GpuVideoDecoder::ReusePictureBuffer(int64 picture_buffer_id,
factories_->WaitSyncPoint(sync_point);
++available_pictures_;
- vda_loop_proxy_->PostTask(FROM_HERE, base::Bind(
- &VideoDecodeAccelerator::ReusePictureBuffer, weak_vda_,
- picture_buffer_id));
+ vda_->ReusePictureBuffer(picture_buffer_id);
}
GpuVideoDecoder::SHMBuffer* GpuVideoDecoder::GetSHM(size_t min_size) {

Powered by Google App Engine
This is Rietveld 408576698