Index: content/common/gpu/client/gpu_jpeg_decode_accelerator_host.cc |
diff --git a/content/common/gpu/client/gpu_jpeg_decode_accelerator_host.cc b/content/common/gpu/client/gpu_jpeg_decode_accelerator_host.cc |
index eac971b43b7eb51a3291ca5962b8379e7d754e24..154e71ab709dba35b9943a7d5f123073ee085a3b 100644 |
--- a/content/common/gpu/client/gpu_jpeg_decode_accelerator_host.cc |
+++ b/content/common/gpu/client/gpu_jpeg_decode_accelerator_host.cc |
@@ -15,61 +15,26 @@ |
#include "build/build_config.h" |
#include "content/common/gpu/client/gpu_channel_host.h" |
#include "content/common/gpu/gpu_messages.h" |
-#include "ipc/ipc_listener.h" |
-#include "ipc/ipc_message_macros.h" |
-#include "ipc/ipc_message_utils.h" |
+#include "content/common/gpu/jpeg_decode_params.h" |
namespace content { |
// Class to receive AcceleratedJpegDecoderHostMsg_DecodeAck IPC message on IO |
// thread. This does very similar what MessageFilter usually does. It is not |
// MessageFilter because GpuChannelHost doesn't support AddFilter. |
-class GpuJpegDecodeAcceleratorHost::Receiver : public IPC::Listener, |
- public base::NonThreadSafe { |
+class GpuJpegDecodeAcceleratorHost::Receiver |
+ : public GpuJpegDecodeAcceleratorHostIPCTransport::Client, |
+ public base::NonThreadSafe { |
public: |
- Receiver(Client* client, |
- const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner) |
- : client_(client), |
- io_task_runner_(io_task_runner), |
- weak_factory_for_io_(this) { |
+ Receiver(media::JpegDecodeAccelerator::Client* client) : client_(client) { |
DCHECK(CalledOnValidThread()); |
} |
~Receiver() override { DCHECK(CalledOnValidThread()); } |
- void InvalidateWeakPtr(base::WaitableEvent* event) { |
- DCHECK(io_task_runner_->BelongsToCurrentThread()); |
- weak_factory_for_io_.InvalidateWeakPtrs(); |
- event->Signal(); |
- } |
- |
- // IPC::Listener implementation. |
- void OnChannelError() override { |
- DCHECK(io_task_runner_->BelongsToCurrentThread()); |
- |
- OnDecodeAck(kInvalidBitstreamBufferId, PLATFORM_FAILURE); |
- } |
- |
- bool OnMessageReceived(const IPC::Message& msg) override { |
- DCHECK(io_task_runner_->BelongsToCurrentThread()); |
- |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(GpuJpegDecodeAcceleratorHost::Receiver, msg) |
- IPC_MESSAGE_HANDLER(AcceleratedJpegDecoderHostMsg_DecodeAck, OnDecodeAck) |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP() |
- DCHECK(handled); |
- return handled; |
- } |
- |
- base::WeakPtr<IPC::Listener> AsWeakPtrForIO() { |
- return weak_factory_for_io_.GetWeakPtr(); |
- } |
- |
private: |
- void OnDecodeAck(int32_t bitstream_buffer_id, Error error) { |
- DCHECK(io_task_runner_->BelongsToCurrentThread()); |
- |
+ void OnDecodeAck(int32_t bitstream_buffer_id, Error error) override { |
+ // TODO(fsamuel): Verify this is called on the IO thread. |
if (!client_) |
return; |
@@ -85,60 +50,29 @@ class GpuJpegDecodeAcceleratorHost::Receiver : public IPC::Listener, |
} |
} |
- Client* client_; |
- |
- // GPU IO task runner. |
- scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; |
- |
- // Weak pointers will be invalidated on IO thread. |
- base::WeakPtrFactory<Receiver> weak_factory_for_io_; |
+ media::JpegDecodeAccelerator::Client* client_; |
DISALLOW_COPY_AND_ASSIGN(Receiver); |
}; |
GpuJpegDecodeAcceleratorHost::GpuJpegDecodeAcceleratorHost( |
GpuChannelHost* channel, |
- int32_t route_id, |
- const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner) |
- : channel_(channel), |
- decoder_route_id_(route_id), |
- io_task_runner_(io_task_runner) { |
+ scoped_ptr<GpuJpegDecodeAcceleratorHostIPCTransport> transport) |
+ : channel_(channel), transport_(std::move(transport)) { |
DCHECK(channel_); |
- DCHECK_NE(decoder_route_id_, MSG_ROUTING_NONE); |
} |
GpuJpegDecodeAcceleratorHost::~GpuJpegDecodeAcceleratorHost() { |
DCHECK(CalledOnValidThread()); |
- Send(new AcceleratedJpegDecoderMsg_Destroy(decoder_route_id_)); |
- |
- if (receiver_) { |
- channel_->RemoveRoute(decoder_route_id_); |
- |
- // Invalidate weak ptr of |receiver_|. After that, no more messages will be |
- // routed to |receiver_| on IO thread. |
- base::WaitableEvent event(false, false); |
- io_task_runner_->PostTask(FROM_HERE, |
- base::Bind(&Receiver::InvalidateWeakPtr, |
- base::Unretained(receiver_.get()), |
- base::Unretained(&event))); |
- event.Wait(); |
- } |
+ transport_->Destroy(); |
} |
bool GpuJpegDecodeAcceleratorHost::Initialize( |
media::JpegDecodeAccelerator::Client* client) { |
DCHECK(CalledOnValidThread()); |
- bool succeeded = false; |
- // This cannot be on IO thread because the msg is synchronous. |
- Send(new GpuMsg_CreateJpegDecoder(decoder_route_id_, &succeeded)); |
- |
- if (!succeeded) { |
- DLOG(ERROR) << "Send(GpuMsg_CreateJpegDecoder()) failed"; |
- return false; |
- } |
- |
- receiver_.reset(new Receiver(client, io_task_runner_)); |
+ receiver_.reset(new Receiver(client)); |
+ transport_->SetClient(receiver_.get()); |
return true; |
} |
@@ -175,30 +109,18 @@ void GpuJpegDecodeAcceleratorHost::Decode( |
size_t output_buffer_size = media::VideoFrame::AllocationSize( |
video_frame->format(), video_frame->coded_size()); |
- AcceleratedJpegDecoderMsg_Decode_Params decode_params; |
+ JpegDecodeParams decode_params; |
decode_params.coded_size = video_frame->coded_size(); |
decode_params.input_buffer_id = bitstream_buffer.id(); |
decode_params.input_buffer_handle = input_handle; |
decode_params.input_buffer_size = bitstream_buffer.size(); |
decode_params.output_video_frame_handle = output_handle; |
decode_params.output_buffer_size = output_buffer_size; |
- Send(new AcceleratedJpegDecoderMsg_Decode(decoder_route_id_, decode_params)); |
+ transport_->Decode(decode_params); |
} |
bool GpuJpegDecodeAcceleratorHost::IsSupported() { |
return channel_->gpu_info().jpeg_decode_accelerator_supported; |
} |
-void GpuJpegDecodeAcceleratorHost::Send(IPC::Message* message) { |
- DCHECK(CalledOnValidThread()); |
- |
- if (!channel_->Send(message)) { |
- DLOG(ERROR) << "Send(" << message->type() << ") failed"; |
- } |
-} |
- |
-base::WeakPtr<IPC::Listener> GpuJpegDecodeAcceleratorHost::GetReceiver() { |
- return receiver_->AsWeakPtrForIO(); |
-} |
- |
} // namespace content |