diff options
Diffstat (limited to 'chromium/content/common/gpu/media/android_video_decode_accelerator.cc')
-rw-r--r-- | chromium/content/common/gpu/media/android_video_decode_accelerator.cc | 103 |
1 files changed, 59 insertions, 44 deletions
diff --git a/chromium/content/common/gpu/media/android_video_decode_accelerator.cc b/chromium/content/common/gpu/media/android_video_decode_accelerator.cc index b0bfe0c6a51..f72e1b257d7 100644 --- a/chromium/content/common/gpu/media/android_video_decode_accelerator.cc +++ b/chromium/content/common/gpu/media/android_video_decode_accelerator.cc @@ -14,22 +14,25 @@ #include "media/base/limits.h" #include "media/video/picture.h" #include "ui/gl/android/scoped_java_surface.h" +#include "ui/gl/android/surface_texture.h" #include "ui/gl/gl_bindings.h" namespace content { // Helper macros for dealing with failure. If |result| evaluates false, emit // |log| to ERROR, register |error| with the decoder, and return. -#define RETURN_ON_FAILURE(result, log, error) \ - do { \ - if (!(result)) { \ - DLOG(ERROR) << log; \ - base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( \ - &AndroidVideoDecodeAccelerator::NotifyError, \ - base::AsWeakPtr(this), error)); \ - state_ = ERROR; \ - return; \ - } \ +#define RETURN_ON_FAILURE(result, log, error) \ + do { \ + if (!(result)) { \ + DLOG(ERROR) << log; \ + base::MessageLoop::current()->PostTask( \ + FROM_HERE, \ + base::Bind(&AndroidVideoDecodeAccelerator::NotifyError, \ + weak_this_factory_.GetWeakPtr(), \ + error)); \ + state_ = ERROR; \ + return; \ + } \ } while (0) // TODO(dwkang): We only need kMaxVideoFrames to pass media stack's prerolling @@ -64,29 +67,27 @@ static inline const base::TimeDelta NoWaitTimeOut() { } AndroidVideoDecodeAccelerator::AndroidVideoDecodeAccelerator( - media::VideoDecodeAccelerator::Client* client, const base::WeakPtr<gpu::gles2::GLES2Decoder> decoder, const base::Callback<bool(void)>& make_context_current) - : client_(client), + : client_(NULL), make_context_current_(make_context_current), codec_(media::kCodecH264), state_(NO_ERROR), surface_texture_id_(0), picturebuffers_requested_(false), - gl_decoder_(decoder) { -} + gl_decoder_(decoder), + weak_this_factory_(this) {} AndroidVideoDecodeAccelerator::~AndroidVideoDecodeAccelerator() { DCHECK(thread_checker_.CalledOnValidThread()); } -bool AndroidVideoDecodeAccelerator::Initialize( - media::VideoCodecProfile profile) { +bool AndroidVideoDecodeAccelerator::Initialize(media::VideoCodecProfile profile, + Client* client) { DCHECK(!media_codec_); DCHECK(thread_checker_.CalledOnValidThread()); - if (!media::MediaCodecBridge::IsAvailable()) - return false; + client_ = client; if (profile == media::VP8PROFILE_MAIN) { codec_ = media::kCodecVP8; @@ -124,20 +125,18 @@ bool AndroidVideoDecodeAccelerator::Initialize( gl_decoder_->RestoreTextureUnitBindings(0); gl_decoder_->RestoreActiveTexture(); - surface_texture_ = new gfx::SurfaceTexture(surface_texture_id_); + surface_texture_ = gfx::SurfaceTexture::Create(surface_texture_id_); if (!ConfigureMediaCodec()) { LOG(ERROR) << "Failed to create MediaCodec instance."; return false; } - base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( - &AndroidVideoDecodeAccelerator::NotifyInitializeDone, - base::AsWeakPtr(this))); return true; } void AndroidVideoDecodeAccelerator::DoIOTask() { + DCHECK(thread_checker_.CalledOnValidThread()); if (state_ == ERROR) { return; } @@ -147,6 +146,7 @@ void AndroidVideoDecodeAccelerator::DoIOTask() { } void AndroidVideoDecodeAccelerator::QueueInput() { + DCHECK(thread_checker_.CalledOnValidThread()); if (bitstreams_notified_in_advance_.size() > kMaxBitstreamsNotifiedInAdvance) return; if (pending_bitstream_buffers_.empty()) @@ -202,13 +202,16 @@ void AndroidVideoDecodeAccelerator::QueueInput() { // keep getting more bitstreams from the client, and throttle them by using // |bitstreams_notified_in_advance_|. // TODO(dwkang): check if there is a way to remove this workaround. - base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( - &AndroidVideoDecodeAccelerator::NotifyEndOfBitstreamBuffer, - base::AsWeakPtr(this), bitstream_buffer.id())); + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&AndroidVideoDecodeAccelerator::NotifyEndOfBitstreamBuffer, + weak_this_factory_.GetWeakPtr(), + bitstream_buffer.id())); bitstreams_notified_in_advance_.push_back(bitstream_buffer.id()); } void AndroidVideoDecodeAccelerator::DequeueOutput() { + DCHECK(thread_checker_.CalledOnValidThread()); if (picturebuffers_requested_ && output_picture_buffers_.empty()) return; @@ -238,9 +241,10 @@ void AndroidVideoDecodeAccelerator::DequeueOutput() { if (!picturebuffers_requested_) { picturebuffers_requested_ = true; size_ = gfx::Size(width, height); - base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( - &AndroidVideoDecodeAccelerator::RequestPictureBuffers, - base::AsWeakPtr(this))); + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&AndroidVideoDecodeAccelerator::RequestPictureBuffers, + weak_this_factory_.GetWeakPtr())); } else { // Dynamic resolution change support is not specified by the Android // platform at and before JB-MR1, so it's not possible to smoothly @@ -287,9 +291,10 @@ void AndroidVideoDecodeAccelerator::DequeueOutput() { media_codec_->ReleaseOutputBuffer(buf_index, true); if (eos) { - base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( - &AndroidVideoDecodeAccelerator::NotifyFlushDone, - base::AsWeakPtr(this))); + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&AndroidVideoDecodeAccelerator::NotifyFlushDone, + weak_this_factory_.GetWeakPtr())); } else { int64 bitstream_buffer_id = timestamp.InMicroseconds(); SendCurrentSurfaceToClient(static_cast<int32>(bitstream_buffer_id)); @@ -357,18 +362,22 @@ void AndroidVideoDecodeAccelerator::SendCurrentSurfaceToClient( picture_buffer_texture_id, 0, size_.width(), size_.height(), false, false, false); - base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( - &AndroidVideoDecodeAccelerator::NotifyPictureReady, - base::AsWeakPtr(this), media::Picture(picture_buffer_id, bitstream_id))); + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&AndroidVideoDecodeAccelerator::NotifyPictureReady, + weak_this_factory_.GetWeakPtr(), + media::Picture(picture_buffer_id, bitstream_id))); } void AndroidVideoDecodeAccelerator::Decode( const media::BitstreamBuffer& bitstream_buffer) { DCHECK(thread_checker_.CalledOnValidThread()); if (bitstream_buffer.id() != -1 && bitstream_buffer.size() == 0) { - base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( - &AndroidVideoDecodeAccelerator::NotifyEndOfBitstreamBuffer, - base::AsWeakPtr(this), bitstream_buffer.id())); + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&AndroidVideoDecodeAccelerator::NotifyEndOfBitstreamBuffer, + weak_this_factory_.GetWeakPtr(), + bitstream_buffer.id())); return; } @@ -427,6 +436,7 @@ void AndroidVideoDecodeAccelerator::Flush() { } bool AndroidVideoDecodeAccelerator::ConfigureMediaCodec() { + DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(surface_texture_.get()); gfx::ScopedJavaSurface surface(surface_texture_.get()); @@ -453,9 +463,11 @@ void AndroidVideoDecodeAccelerator::Reset() { pending_bitstream_buffers_.pop(); if (bitstream_buffer_id != -1) { - base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( - &AndroidVideoDecodeAccelerator::NotifyEndOfBitstreamBuffer, - base::AsWeakPtr(this), bitstream_buffer_id)); + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&AndroidVideoDecodeAccelerator::NotifyEndOfBitstreamBuffer, + weak_this_factory_.GetWeakPtr(), + bitstream_buffer_id)); } } bitstreams_notified_in_advance_.clear(); @@ -481,13 +493,16 @@ void AndroidVideoDecodeAccelerator::Reset() { ConfigureMediaCodec(); state_ = NO_ERROR; - base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( - &AndroidVideoDecodeAccelerator::NotifyResetDone, base::AsWeakPtr(this))); + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&AndroidVideoDecodeAccelerator::NotifyResetDone, + weak_this_factory_.GetWeakPtr())); } void AndroidVideoDecodeAccelerator::Destroy() { DCHECK(thread_checker_.CalledOnValidThread()); + weak_this_factory_.InvalidateWeakPtrs(); if (media_codec_) { io_timer_.Stop(); media_codec_->Stop(); @@ -499,8 +514,8 @@ void AndroidVideoDecodeAccelerator::Destroy() { delete this; } -void AndroidVideoDecodeAccelerator::NotifyInitializeDone() { - client_->NotifyInitializeDone(); +bool AndroidVideoDecodeAccelerator::CanDecodeOnIOThread() { + return false; } void AndroidVideoDecodeAccelerator::RequestPictureBuffers() { |