Chromium Code Reviews| Index: media/gpu/v4l2_video_encode_accelerator.cc |
| diff --git a/media/gpu/v4l2_video_encode_accelerator.cc b/media/gpu/v4l2_video_encode_accelerator.cc |
| index 19db6d94dd2aa5b20fa380642ca1ccfdfb2772dc..aec303915da292efbfdfd6dee83bc065a22d96cf 100644 |
| --- a/media/gpu/v4l2_video_encode_accelerator.cc |
| +++ b/media/gpu/v4l2_video_encode_accelerator.cc |
| @@ -18,6 +18,7 @@ |
| #include "base/command_line.h" |
| #include "base/macros.h" |
| #include "base/numerics/safe_conversions.h" |
| +#include "base/single_thread_task_runner.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| #include "base/trace_event/trace_event.h" |
| #include "media/base/bind_to_current_loop.h" |
| @@ -242,7 +243,7 @@ void V4L2VideoEncodeAccelerator::Encode(const scoped_refptr<VideoFrame>& frame, |
| image_processor_input_queue_.push(record); |
| } |
| } else { |
| - encoder_thread_.message_loop()->PostTask( |
| + encoder_thread_.task_runner()->PostTask( |
| FROM_HERE, base::Bind(&V4L2VideoEncodeAccelerator::EncodeTask, |
| base::Unretained(this), frame, force_keyframe)); |
| } |
| @@ -267,7 +268,7 @@ void V4L2VideoEncodeAccelerator::UseOutputBitstreamBuffer( |
| std::unique_ptr<BitstreamBufferRef> buffer_ref( |
| new BitstreamBufferRef(buffer.id(), std::move(shm))); |
| - encoder_thread_.message_loop()->PostTask( |
| + encoder_thread_.task_runner()->PostTask( |
| FROM_HERE, |
| base::Bind(&V4L2VideoEncodeAccelerator::UseOutputBitstreamBufferTask, |
| base::Unretained(this), base::Passed(&buffer_ref))); |
| @@ -280,7 +281,7 @@ void V4L2VideoEncodeAccelerator::RequestEncodingParametersChange( |
| << ", framerate=" << framerate; |
| DCHECK(child_task_runner_->BelongsToCurrentThread()); |
| - encoder_thread_.message_loop()->PostTask( |
| + encoder_thread_.task_runner()->PostTask( |
| FROM_HERE, |
| base::Bind( |
| &V4L2VideoEncodeAccelerator::RequestEncodingParametersChangeTask, |
| @@ -300,7 +301,7 @@ void V4L2VideoEncodeAccelerator::Destroy() { |
| // If the encoder thread is running, destroy using posted task. |
| if (encoder_thread_.IsRunning()) { |
| - encoder_thread_.message_loop()->PostTask( |
| + encoder_thread_.task_runner()->PostTask( |
| FROM_HERE, base::Bind(&V4L2VideoEncodeAccelerator::DestroyTask, |
| base::Unretained(this))); |
| // DestroyTask() will put the encoder into kError state and cause all tasks |
| @@ -383,7 +384,7 @@ void V4L2VideoEncodeAccelerator::FrameProcessed(bool force_keyframe, |
| base::Bind(&V4L2VideoEncodeAccelerator::ReuseImageProcessorOutputBuffer, |
| weak_this_, output_buffer_index))); |
| - encoder_thread_.message_loop()->PostTask( |
| + encoder_thread_.task_runner()->PostTask( |
| FROM_HERE, |
| base::Bind(&V4L2VideoEncodeAccelerator::EncodeTask, |
| base::Unretained(this), output_frame, force_keyframe)); |
| @@ -405,7 +406,7 @@ void V4L2VideoEncodeAccelerator::EncodeTask( |
| const scoped_refptr<VideoFrame>& frame, |
| bool force_keyframe) { |
| DVLOG(3) << "EncodeTask(): force_keyframe=" << force_keyframe; |
| - DCHECK_EQ(encoder_thread_.message_loop(), base::MessageLoop::current()); |
| + DCHECK(encoder_thread_.task_runner()->BelongsToCurrentThread()); |
| DCHECK_NE(encoder_state_, kUninitialized); |
| if (encoder_state_ == kError) { |
| @@ -448,7 +449,7 @@ void V4L2VideoEncodeAccelerator::EncodeTask( |
| void V4L2VideoEncodeAccelerator::UseOutputBitstreamBufferTask( |
| std::unique_ptr<BitstreamBufferRef> buffer_ref) { |
| DVLOG(3) << "UseOutputBitstreamBufferTask(): id=" << buffer_ref->id; |
| - DCHECK_EQ(encoder_thread_.message_loop(), base::MessageLoop::current()); |
| + DCHECK(encoder_thread_.task_runner()->BelongsToCurrentThread()); |
| encoder_output_queue_.push_back( |
| linked_ptr<BitstreamBufferRef>(buffer_ref.release())); |
| @@ -479,7 +480,7 @@ void V4L2VideoEncodeAccelerator::DestroyTask() { |
| void V4L2VideoEncodeAccelerator::ServiceDeviceTask() { |
| DVLOG(3) << "ServiceDeviceTask()"; |
| - DCHECK_EQ(encoder_thread_.message_loop(), base::MessageLoop::current()); |
| + DCHECK(encoder_thread_.task_runner()->BelongsToCurrentThread()); |
| DCHECK_NE(encoder_state_, kUninitialized); |
| DCHECK_NE(encoder_state_, kInitialized); |
| @@ -507,7 +508,7 @@ void V4L2VideoEncodeAccelerator::ServiceDeviceTask() { |
| // already. |
| DCHECK(device_poll_thread_.message_loop()); |
| // Queue the DevicePollTask() now. |
| - device_poll_thread_.message_loop()->PostTask( |
| + device_poll_thread_.task_runner()->PostTask( |
| FROM_HERE, base::Bind(&V4L2VideoEncodeAccelerator::DevicePollTask, |
| base::Unretained(this), poll_device)); |
| @@ -523,7 +524,7 @@ void V4L2VideoEncodeAccelerator::ServiceDeviceTask() { |
| } |
| void V4L2VideoEncodeAccelerator::Enqueue() { |
| - DCHECK_EQ(encoder_thread_.message_loop(), base::MessageLoop::current()); |
| + DCHECK(encoder_thread_.task_runner()->BelongsToCurrentThread()); |
| DVLOG(3) << "Enqueue() " |
| << "free_input_buffers: " << free_input_buffers_.size() |
| @@ -571,7 +572,7 @@ void V4L2VideoEncodeAccelerator::Enqueue() { |
| void V4L2VideoEncodeAccelerator::Dequeue() { |
| DVLOG(3) << "Dequeue()"; |
| - DCHECK_EQ(encoder_thread_.message_loop(), base::MessageLoop::current()); |
| + DCHECK(encoder_thread_.task_runner()->BelongsToCurrentThread()); |
| // Dequeue completed input (VIDEO_OUTPUT) buffers, and recycle to the free |
| // list. |
| @@ -766,7 +767,7 @@ bool V4L2VideoEncodeAccelerator::EnqueueOutputRecord() { |
| bool V4L2VideoEncodeAccelerator::StartDevicePoll() { |
| DVLOG(3) << "StartDevicePoll()"; |
| - DCHECK_EQ(encoder_thread_.message_loop(), base::MessageLoop::current()); |
| + DCHECK(encoder_thread_.task_runner()->BelongsToCurrentThread()); |
| DCHECK(!device_poll_thread_.IsRunning()); |
| // Start up the device poll thread and schedule its first DevicePollTask(). |
| @@ -777,7 +778,7 @@ bool V4L2VideoEncodeAccelerator::StartDevicePoll() { |
| } |
| // Enqueue a poll task with no devices to poll on -- it will wait only on the |
| // interrupt fd. |
| - device_poll_thread_.message_loop()->PostTask( |
| + device_poll_thread_.task_runner()->PostTask( |
| FROM_HERE, base::Bind(&V4L2VideoEncodeAccelerator::DevicePollTask, |
| base::Unretained(this), false)); |
| @@ -836,7 +837,7 @@ bool V4L2VideoEncodeAccelerator::StopDevicePoll() { |
| void V4L2VideoEncodeAccelerator::DevicePollTask(bool poll_device) { |
| DVLOG(3) << "DevicePollTask()"; |
| - DCHECK_EQ(device_poll_thread_.message_loop(), base::MessageLoop::current()); |
| + DCHECK(device_poll_thread_.task_runner()->BelongsToCurrentThread()); |
| bool event_pending; |
| if (!device_->Poll(poll_device, &event_pending)) { |
| @@ -846,7 +847,7 @@ void V4L2VideoEncodeAccelerator::DevicePollTask(bool poll_device) { |
| // All processing should happen on ServiceDeviceTask(), since we shouldn't |
| // touch encoder state from this thread. |
| - encoder_thread_.message_loop()->PostTask( |
| + encoder_thread_.task_runner()->PostTask( |
| FROM_HERE, base::Bind(&V4L2VideoEncodeAccelerator::ServiceDeviceTask, |
| base::Unretained(this))); |
| } |
| @@ -870,11 +871,12 @@ void V4L2VideoEncodeAccelerator::NotifyError(Error error) { |
| void V4L2VideoEncodeAccelerator::SetErrorState(Error error) { |
| // We can touch encoder_state_ only if this is the encoder thread or the |
| // encoder thread isn't running. |
| - if (encoder_thread_.message_loop() != NULL && |
| - encoder_thread_.message_loop() != base::MessageLoop::current()) { |
| - encoder_thread_.message_loop()->PostTask( |
| - FROM_HERE, base::Bind(&V4L2VideoEncodeAccelerator::SetErrorState, |
| - base::Unretained(this), error)); |
| + scoped_refptr<base::SingleThreadTaskRunner> task_runner = |
| + encoder_thread_.task_runner(); |
| + if (task_runner && !task_runner->BelongsToCurrentThread()) { |
|
chcunningham
2016/06/29 18:10:04
ditto about the null check. why here and not elsew
fdoray
2016/06/29 18:20:18
ditto
|
| + task_runner->PostTask(FROM_HERE, |
| + base::Bind(&V4L2VideoEncodeAccelerator::SetErrorState, |
| + base::Unretained(this), error)); |
| return; |
| } |
| @@ -891,7 +893,7 @@ void V4L2VideoEncodeAccelerator::RequestEncodingParametersChangeTask( |
| uint32_t framerate) { |
| DVLOG(3) << "RequestEncodingParametersChangeTask(): bitrate=" << bitrate |
| << ", framerate=" << framerate; |
| - DCHECK_EQ(encoder_thread_.message_loop(), base::MessageLoop::current()); |
| + DCHECK(encoder_thread_.task_runner()->BelongsToCurrentThread()); |
| if (bitrate < 1) |
| bitrate = 1; |
| @@ -1146,7 +1148,7 @@ bool V4L2VideoEncodeAccelerator::CreateInputBuffers() { |
| DVLOG(3) << "CreateInputBuffers()"; |
| // This function runs on encoder_thread_ after output buffers have been |
| // provided by the client. |
| - DCHECK_EQ(encoder_thread_.message_loop(), base::MessageLoop::current()); |
| + DCHECK(encoder_thread_.task_runner()->BelongsToCurrentThread()); |
| DCHECK(!input_streamon_); |
| struct v4l2_requestbuffers reqbufs; |