Index: content/common/gpu/media/android_video_encode_accelerator.cc |
diff --git a/content/common/gpu/media/android_video_encode_accelerator.cc b/content/common/gpu/media/android_video_encode_accelerator.cc |
index 05f18b6b12513c318a1753885b416710447f41ca..9e0aefcad3b1f8ff83e0e303cd79895e309280b0 100644 |
--- a/content/common/gpu/media/android_video_encode_accelerator.cc |
+++ b/content/common/gpu/media/android_video_encode_accelerator.cc |
@@ -33,16 +33,16 @@ enum { |
// Helper macros for dealing with failure. If |result| evaluates false, emit |
// |log| to DLOG(ERROR), register |error| with the client, and return. |
-#define RETURN_ON_FAILURE(result, log, error) \ |
- do { \ |
- if (!(result)) { \ |
- DLOG(ERROR) << log; \ |
- if (client_ptr_factory_.GetWeakPtr()) { \ |
- client_ptr_factory_.GetWeakPtr()->NotifyError(error); \ |
- client_ptr_factory_.InvalidateWeakPtrs(); \ |
- } \ |
- return; \ |
- } \ |
+#define RETURN_ON_FAILURE(result, log, error) \ |
+ do { \ |
+ if (!(result)) { \ |
+ DLOG(ERROR) << log; \ |
+ if (client_ptr_factory_->GetWeakPtr()) { \ |
+ client_ptr_factory_->GetWeakPtr()->NotifyError(error); \ |
+ client_ptr_factory_.reset(); \ |
+ } \ |
+ return; \ |
+ } \ |
} while (0) |
// Because MediaCodec is thread-hostile (must be poked on a single thread) and |
@@ -67,10 +67,8 @@ static inline const base::TimeDelta NoWaitTimeOut() { |
return base::TimeDelta::FromMicroseconds(0); |
} |
-AndroidVideoEncodeAccelerator::AndroidVideoEncodeAccelerator( |
- media::VideoEncodeAccelerator::Client* client) |
- : client_ptr_factory_(client), |
- num_buffers_at_codec_(0), |
+AndroidVideoEncodeAccelerator::AndroidVideoEncodeAccelerator() |
+ : num_buffers_at_codec_(0), |
num_output_buffers_(-1), |
output_buffers_capacity_(0), |
last_set_bitrate_(0) {} |
@@ -118,7 +116,8 @@ void AndroidVideoEncodeAccelerator::Initialize( |
VideoFrame::Format format, |
const gfx::Size& input_visible_size, |
media::VideoCodecProfile output_profile, |
- uint32 initial_bitrate) { |
+ uint32 initial_bitrate, |
+ Client* client) { |
DVLOG(3) << __PRETTY_FUNCTION__ << " format: " << format |
<< ", input_visible_size: " << input_visible_size.ToString() |
<< ", output_profile: " << output_profile |
@@ -126,6 +125,8 @@ void AndroidVideoEncodeAccelerator::Initialize( |
DCHECK(!media_codec_); |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ client_ptr_factory_.reset(new base::WeakPtrFactory<Client>(client)); |
+ |
RETURN_ON_FAILURE(media::MediaCodecBridge::IsAvailable() && |
media::MediaCodecBridge::SupportsSetParameters() && |
format == VideoFrame::I420 && |
@@ -161,14 +162,14 @@ void AndroidVideoEncodeAccelerator::Initialize( |
base::MessageLoop::current()->PostTask( |
FROM_HERE, |
base::Bind(&VideoEncodeAccelerator::Client::NotifyInitializeDone, |
- client_ptr_factory_.GetWeakPtr())); |
+ client_ptr_factory_->GetWeakPtr())); |
num_output_buffers_ = media_codec_->GetOutputBuffersCount(); |
output_buffers_capacity_ = media_codec_->GetOutputBuffersCapacity(); |
base::MessageLoop::current()->PostTask( |
FROM_HERE, |
base::Bind(&VideoEncodeAccelerator::Client::RequireBitstreamBuffers, |
- client_ptr_factory_.GetWeakPtr(), |
+ client_ptr_factory_->GetWeakPtr(), |
num_output_buffers_, |
input_visible_size, |
output_buffers_capacity_)); |
@@ -246,7 +247,7 @@ void AndroidVideoEncodeAccelerator::RequestEncodingParametersChange( |
void AndroidVideoEncodeAccelerator::Destroy() { |
DVLOG(3) << __PRETTY_FUNCTION__; |
DCHECK(thread_checker_.CalledOnValidThread()); |
- client_ptr_factory_.InvalidateWeakPtrs(); |
+ client_ptr_factory_.reset(); |
if (media_codec_) { |
if (io_timer_.IsRunning()) |
io_timer_.Stop(); |
@@ -263,7 +264,7 @@ void AndroidVideoEncodeAccelerator::DoIOTask() { |
} |
void AndroidVideoEncodeAccelerator::QueueInput() { |
- if (!client_ptr_factory_.GetWeakPtr() || pending_frames_.empty()) |
+ if (!client_ptr_factory_->GetWeakPtr() || pending_frames_.empty()) |
return; |
int input_buf_index = 0; |
@@ -347,7 +348,7 @@ bool AndroidVideoEncodeAccelerator::DoOutputBuffersSuffice() { |
} |
void AndroidVideoEncodeAccelerator::DequeueOutput() { |
- if (!client_ptr_factory_.GetWeakPtr() || |
+ if (!client_ptr_factory_->GetWeakPtr() || |
available_bitstream_buffers_.empty() || num_buffers_at_codec_ == 0) { |
return; |
} |
@@ -405,7 +406,7 @@ void AndroidVideoEncodeAccelerator::DequeueOutput() { |
base::MessageLoop::current()->PostTask( |
FROM_HERE, |
base::Bind(&VideoEncodeAccelerator::Client::BitstreamBufferReady, |
- client_ptr_factory_.GetWeakPtr(), |
+ client_ptr_factory_->GetWeakPtr(), |
bitstream_buffer.id(), |
size, |
key_frame)); |