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

Unified Diff: content/common/gpu/media/android_video_decode_accelerator.cc

Issue 185403020: Make VEA client of command buffer; move sync. IPC to VDA/VEA::Initialize() (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 7da5b6ec Rebase. Created 6 years, 9 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: content/common/gpu/media/android_video_decode_accelerator.cc
diff --git a/content/common/gpu/media/android_video_decode_accelerator.cc b/content/common/gpu/media/android_video_decode_accelerator.cc
index 41d55c86b8f4fcb8a8fef014afc5bd789e562c73..d84c28fb5b1c5ff11a063b0ffbe91840a7973452 100644
--- a/content/common/gpu/media/android_video_decode_accelerator.cc
+++ b/content/common/gpu/media/android_video_decode_accelerator.cc
@@ -21,16 +21,18 @@ 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
@@ -73,7 +75,8 @@ AndroidVideoDecodeAccelerator::AndroidVideoDecodeAccelerator(
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());
@@ -129,13 +132,11 @@ bool AndroidVideoDecodeAccelerator::Initialize(media::VideoCodecProfile profile,
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;
}
@@ -145,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())
@@ -200,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;
@@ -236,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
@@ -285,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));
@@ -355,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;
}
@@ -425,6 +436,7 @@ void AndroidVideoDecodeAccelerator::Flush() {
}
bool AndroidVideoDecodeAccelerator::ConfigureMediaCodec() {
+ DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(surface_texture_.get());
gfx::ScopedJavaSurface surface(surface_texture_.get());
@@ -451,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();
@@ -479,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();
@@ -497,10 +514,6 @@ void AndroidVideoDecodeAccelerator::Destroy() {
delete this;
}
-void AndroidVideoDecodeAccelerator::NotifyInitializeDone() {
- client_->NotifyInitializeDone();
-}
-
void AndroidVideoDecodeAccelerator::RequestPictureBuffers() {
client_->ProvidePictureBuffers(kNumPictureBuffers, size_, GL_TEXTURE_2D);
}

Powered by Google App Engine
This is Rietveld 408576698