| 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..98444155b4dc97f004c9e3b35ad04be38b976fd5 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
|
| -// 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.
|
| @@ -158,13 +52,10 @@ GpuVideoDecoder::BufferData::BufferData(
|
|
|
| GpuVideoDecoder::BufferData::~BufferData() {}
|
|
|
| -GpuVideoDecoder::GpuVideoDecoder(
|
| - const scoped_refptr<base::MessageLoopProxy>& message_loop,
|
| - const scoped_refptr<Factories>& factories)
|
| +GpuVideoDecoder::GpuVideoDecoder(const scoped_refptr<Factories>& factories)
|
| : needs_bitstream_conversion_(false),
|
| - gvd_loop_proxy_(message_loop),
|
| + gvd_loop_proxy_(factories->GetMessageLoop()),
|
| weak_factory_(this),
|
| - vda_loop_proxy_(factories->GetMessageLoop()),
|
| factories_(factories),
|
| state_(kNormal),
|
| decoder_texture_target_(0),
|
| @@ -202,8 +93,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 +149,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);
|
| if (!vda) {
|
| status_cb.Run(DECODER_ERROR_NOT_SUPPORTED);
|
| return;
|
| @@ -271,21 +160,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 +180,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 +225,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 +247,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 +350,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 +477,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) {
|
|
|