| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "content/renderer/gpu_video_decode_accelerator_host.h" | |
| 6 | |
| 7 #include "base/logging.h" | |
| 8 #include "base/shared_memory.h" | |
| 9 #include "base/task.h" | |
| 10 #include "content/common/gpu/gpu_messages.h" | |
| 11 #include "content/common/view_messages.h" | |
| 12 #include "content/renderer/render_thread.h" | |
| 13 #include "ipc/ipc_message_macros.h" | |
| 14 #include "ipc/ipc_message_utils.h" | |
| 15 | |
| 16 using media::VideoDecodeAccelerator; | |
| 17 using media::VideoDecodeAcceleratorCallback; | |
| 18 | |
| 19 GpuVideoDecodeAcceleratorHost::GpuVideoDecodeAcceleratorHost( | |
| 20 MessageRouter* router, | |
| 21 IPC::Message::Sender* ipc_sender, | |
| 22 int32 decoder_host_id, | |
| 23 VideoDecodeAccelerator::Client* client) | |
| 24 : router_(router), | |
| 25 ipc_sender_(ipc_sender), | |
| 26 decoder_host_id_(decoder_host_id), | |
| 27 decoder_id_(0), | |
| 28 client_(client) { | |
| 29 } | |
| 30 | |
| 31 GpuVideoDecodeAcceleratorHost::~GpuVideoDecodeAcceleratorHost() {} | |
| 32 | |
| 33 void GpuVideoDecodeAcceleratorHost::OnChannelConnected(int32 peer_pid) { | |
| 34 } | |
| 35 | |
| 36 void GpuVideoDecodeAcceleratorHost::OnChannelError() { | |
| 37 ipc_sender_ = NULL; | |
| 38 } | |
| 39 | |
| 40 bool GpuVideoDecodeAcceleratorHost::OnMessageReceived(const IPC::Message& msg) { | |
| 41 bool handled = true; | |
| 42 IPC_BEGIN_MESSAGE_MAP(GpuVideoDecodeAcceleratorHost, msg) | |
| 43 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_BitstreamBufferProcessed, | |
| 44 OnBitstreamBufferProcessed) | |
| 45 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_ProvidePictureBuffers, | |
| 46 OnProvidePictureBuffer) | |
| 47 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_CreateDone, | |
| 48 OnCreateDone) | |
| 49 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_PictureReady, | |
| 50 OnPictureReady) | |
| 51 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_FlushDone, | |
| 52 OnFlushDone) | |
| 53 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_AbortDone, | |
| 54 OnAbortDone) | |
| 55 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_EndOfStream, | |
| 56 OnEndOfStream) | |
| 57 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_ErrorNotification, | |
| 58 OnErrorNotification) | |
| 59 IPC_MESSAGE_UNHANDLED(handled = false) | |
| 60 IPC_END_MESSAGE_MAP() | |
| 61 DCHECK(handled); | |
| 62 return handled; | |
| 63 } | |
| 64 | |
| 65 void GpuVideoDecodeAcceleratorHost::GetConfigs( | |
| 66 const std::vector<uint32>& requested_configs, | |
| 67 std::vector<uint32>* matched_configs) { | |
| 68 // TODO(vrk): Need to rethink GetConfigs. | |
| 69 NOTIMPLEMENTED(); | |
| 70 } | |
| 71 | |
| 72 bool GpuVideoDecodeAcceleratorHost::Initialize( | |
| 73 const std::vector<uint32>& configs) { | |
| 74 router_->AddRoute(decoder_host_id_, this); | |
| 75 | |
| 76 // Temporarily save configs for after create is done and we're | |
| 77 // ready to initialize. | |
| 78 configs_ = configs; | |
| 79 | |
| 80 if (!ipc_sender_->Send(new GpuChannelMsg_CreateVideoDecoder( | |
| 81 decoder_id_, configs))) { | |
| 82 LOG(ERROR) << "Send(GpuChannelMsg_CreateVideoDecoder) failed"; | |
| 83 return false; | |
| 84 } | |
| 85 return true; | |
| 86 } | |
| 87 | |
| 88 bool GpuVideoDecodeAcceleratorHost::Decode( | |
| 89 const media::BitstreamBuffer& bitstream_buffer) { | |
| 90 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Decode( | |
| 91 decoder_id_, bitstream_buffer.id(), | |
| 92 bitstream_buffer.handle(), bitstream_buffer.size()))) { | |
| 93 DLOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Decode) failed"; | |
| 94 return false; | |
| 95 } | |
| 96 | |
| 97 return true; | |
| 98 } | |
| 99 | |
| 100 void GpuVideoDecodeAcceleratorHost::AssignGLESBuffers( | |
| 101 const std::vector<media::GLESBuffer>& buffers) { | |
| 102 // Rearrange data for IPC command. | |
| 103 std::vector<int32> buffer_ids; | |
| 104 std::vector<uint32> texture_ids; | |
| 105 std::vector<uint32> context_ids; | |
| 106 std::vector<gfx::Size> sizes; | |
| 107 for (uint32 i = 0; i < buffers.size(); i++) { | |
| 108 const media::BufferInfo& info = buffers[i].buffer_info(); | |
| 109 texture_ids.push_back(buffers[i].texture_id()); | |
| 110 context_ids.push_back(buffers[i].context_id()); | |
| 111 buffer_ids.push_back(info.id()); | |
| 112 sizes.push_back(info.size()); | |
| 113 } | |
| 114 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_AssignGLESBuffers( | |
| 115 decoder_id_, buffer_ids, texture_ids, context_ids, sizes))) { | |
| 116 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_AssignGLESBuffers) failed"; | |
| 117 } | |
| 118 } | |
| 119 | |
| 120 void GpuVideoDecodeAcceleratorHost::AssignSysmemBuffers( | |
| 121 const std::vector<media::SysmemBuffer>& buffers) { | |
| 122 // TODO(vrk): Implement. | |
| 123 NOTIMPLEMENTED(); | |
| 124 } | |
| 125 | |
| 126 void GpuVideoDecodeAcceleratorHost::ReusePictureBuffer( | |
| 127 int32 picture_buffer_id) { | |
| 128 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_ReusePictureBuffer( | |
| 129 decoder_id_, picture_buffer_id))) { | |
| 130 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_ReusePictureBuffer) failed"; | |
| 131 } | |
| 132 } | |
| 133 | |
| 134 bool GpuVideoDecodeAcceleratorHost::Flush() { | |
| 135 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Flush(decoder_id_))) { | |
| 136 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Flush) failed"; | |
| 137 return false; | |
| 138 } | |
| 139 return true; | |
| 140 } | |
| 141 | |
| 142 bool GpuVideoDecodeAcceleratorHost::Abort() { | |
| 143 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Abort(decoder_id_))) { | |
| 144 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Abort) failed"; | |
| 145 return false; | |
| 146 } | |
| 147 return true; | |
| 148 } | |
| 149 | |
| 150 void GpuVideoDecodeAcceleratorHost::OnBitstreamBufferProcessed( | |
| 151 int32 bitstream_buffer_id) { | |
| 152 client_->NotifyEndOfBitstreamBuffer(bitstream_buffer_id); | |
| 153 } | |
| 154 | |
| 155 void GpuVideoDecodeAcceleratorHost::OnProvidePictureBuffer( | |
| 156 uint32 num_requested_buffers, | |
| 157 const gfx::Size& buffer_size, | |
| 158 int32 mem_type) { | |
| 159 media::VideoDecodeAccelerator::MemoryType converted_mem_type = | |
| 160 static_cast<media::VideoDecodeAccelerator::MemoryType>(mem_type); | |
| 161 client_->ProvidePictureBuffers( | |
| 162 num_requested_buffers, buffer_size, converted_mem_type); | |
| 163 } | |
| 164 | |
| 165 void GpuVideoDecodeAcceleratorHost::OnDismissPictureBuffer( | |
| 166 int32 picture_buffer_id) { | |
| 167 client_->DismissPictureBuffer(picture_buffer_id); | |
| 168 } | |
| 169 | |
| 170 void GpuVideoDecodeAcceleratorHost::OnCreateDone(int32 decoder_id) { | |
| 171 decoder_id_ = decoder_id; | |
| 172 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Initialize( | |
| 173 decoder_id_, configs_))) { | |
| 174 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Initialize) failed"; | |
| 175 } | |
| 176 } | |
| 177 | |
| 178 void GpuVideoDecodeAcceleratorHost::OnPictureReady( | |
| 179 int32 picture_buffer_id, int32 bitstream_buffer_id, | |
| 180 const gfx::Size& visible_size, const gfx::Size& decoded_size) { | |
| 181 media::Picture picture( | |
| 182 picture_buffer_id, bitstream_buffer_id, visible_size, decoded_size); | |
| 183 client_->PictureReady(picture); | |
| 184 } | |
| 185 | |
| 186 void GpuVideoDecodeAcceleratorHost::OnFlushDone() { | |
| 187 client_->NotifyFlushDone(); | |
| 188 } | |
| 189 | |
| 190 void GpuVideoDecodeAcceleratorHost::OnAbortDone() { | |
| 191 client_->NotifyAbortDone(); | |
| 192 } | |
| 193 | |
| 194 void GpuVideoDecodeAcceleratorHost::OnEndOfStream() { | |
| 195 client_->NotifyEndOfStream(); | |
| 196 } | |
| 197 | |
| 198 void GpuVideoDecodeAcceleratorHost::OnErrorNotification(uint32 error) { | |
| 199 client_->NotifyError( | |
| 200 static_cast<media::VideoDecodeAccelerator::Error>(error)); | |
| 201 } | |
| OLD | NEW |