| 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()) {
|
| + 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;
|
|
|