OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/gpu/gpu_video_decode_accelerator_host.h" | 5 #include "content/renderer/gpu/gpu_video_decode_accelerator_host.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/shared_memory.h" | 10 #include "base/shared_memory.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 GpuVideoDecodeAcceleratorHost::GpuVideoDecodeAcceleratorHost( | 23 GpuVideoDecodeAcceleratorHost::GpuVideoDecodeAcceleratorHost( |
24 MessageRouter* router, | 24 MessageRouter* router, |
25 IPC::Message::Sender* ipc_sender, | 25 IPC::Message::Sender* ipc_sender, |
26 int32 decoder_host_id, | 26 int32 decoder_host_id, |
27 int32 command_buffer_route_id, | 27 int32 command_buffer_route_id, |
28 gpu::CommandBufferHelper* cmd_buffer_helper, | 28 gpu::CommandBufferHelper* cmd_buffer_helper, |
29 VideoDecodeAccelerator::Client* client) | 29 VideoDecodeAccelerator::Client* client) |
30 : router_(router), | 30 : router_(router), |
31 ipc_sender_(ipc_sender), | 31 ipc_sender_(ipc_sender), |
32 decoder_host_id_(decoder_host_id), | 32 decoder_host_id_(decoder_host_id), |
33 decoder_id_(-1), | |
34 command_buffer_route_id_(command_buffer_route_id), | 33 command_buffer_route_id_(command_buffer_route_id), |
35 cmd_buffer_helper_(cmd_buffer_helper), | 34 cmd_buffer_helper_(cmd_buffer_helper), |
36 client_(client) { | 35 client_(client) { |
37 DCHECK(RenderThread::current()); | 36 DCHECK(RenderThread::current()); |
38 DCHECK_EQ(RenderThread::current()->message_loop(), MessageLoop::current()); | 37 DCHECK_EQ(RenderThread::current()->message_loop(), MessageLoop::current()); |
39 } | 38 } |
40 | 39 |
41 GpuVideoDecodeAcceleratorHost::~GpuVideoDecodeAcceleratorHost() {} | 40 GpuVideoDecodeAcceleratorHost::~GpuVideoDecodeAcceleratorHost() {} |
42 | 41 |
43 void GpuVideoDecodeAcceleratorHost::OnChannelConnected(int32 peer_pid) { | 42 void GpuVideoDecodeAcceleratorHost::OnChannelConnected(int32 peer_pid) { |
44 } | 43 } |
45 | 44 |
46 void GpuVideoDecodeAcceleratorHost::OnChannelError() { | 45 void GpuVideoDecodeAcceleratorHost::OnChannelError() { |
47 ipc_sender_ = NULL; | 46 ipc_sender_ = NULL; |
48 } | 47 } |
49 | 48 |
50 bool GpuVideoDecodeAcceleratorHost::OnMessageReceived(const IPC::Message& msg) { | 49 bool GpuVideoDecodeAcceleratorHost::OnMessageReceived(const IPC::Message& msg) { |
51 DCHECK(CalledOnValidThread()); | 50 DCHECK(CalledOnValidThread()); |
52 bool handled = true; | 51 bool handled = true; |
53 IPC_BEGIN_MESSAGE_MAP(GpuVideoDecodeAcceleratorHost, msg) | 52 IPC_BEGIN_MESSAGE_MAP(GpuVideoDecodeAcceleratorHost, msg) |
54 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_BitstreamBufferProcessed, | 53 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_BitstreamBufferProcessed, |
55 OnBitstreamBufferProcessed) | 54 OnBitstreamBufferProcessed) |
56 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_ProvidePictureBuffers, | 55 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_ProvidePictureBuffers, |
57 OnProvidePictureBuffer) | 56 OnProvidePictureBuffer) |
58 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_CreateDone, | |
59 OnCreateDone) | |
60 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_InitializeDone, | 57 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_InitializeDone, |
61 OnInitializeDone) | 58 OnInitializeDone) |
62 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_PictureReady, | 59 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_PictureReady, |
63 OnPictureReady) | 60 OnPictureReady) |
64 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_FlushDone, | 61 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_FlushDone, |
65 OnFlushDone) | 62 OnFlushDone) |
66 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_AbortDone, | 63 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_AbortDone, |
67 OnAbortDone) | 64 OnAbortDone) |
68 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_EndOfStream, | 65 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_EndOfStream, |
69 OnEndOfStream) | 66 OnEndOfStream) |
(...skipping 21 matching lines...) Expand all Loading... |
91 // TODO(vrk): Need to rethink GetConfigs. | 88 // TODO(vrk): Need to rethink GetConfigs. |
92 NOTIMPLEMENTED(); | 89 NOTIMPLEMENTED(); |
93 return true; | 90 return true; |
94 } | 91 } |
95 | 92 |
96 bool GpuVideoDecodeAcceleratorHost::Initialize( | 93 bool GpuVideoDecodeAcceleratorHost::Initialize( |
97 const std::vector<uint32>& configs) { | 94 const std::vector<uint32>& configs) { |
98 DCHECK(CalledOnValidThread()); | 95 DCHECK(CalledOnValidThread()); |
99 router_->AddRoute(decoder_host_id_, this); | 96 router_->AddRoute(decoder_host_id_, this); |
100 | 97 |
101 // Temporarily save configs for after create is done and we're | 98 // Tell GPU Channel to create and initialize a video decoder. |
102 // ready to initialize. | 99 if (!ipc_sender_->Send(new GpuCommandBufferMsg_CreateVideoDecoder( |
103 configs_ = configs; | 100 command_buffer_route_id_, decoder_host_id_, configs))) { |
104 if (!ipc_sender_->Send(new GpuChannelMsg_CreateVideoDecoder( | |
105 decoder_host_id_, command_buffer_route_id_, configs))) { | |
106 LOG(ERROR) << "Send(GpuChannelMsg_CreateVideoDecoder) failed"; | 101 LOG(ERROR) << "Send(GpuChannelMsg_CreateVideoDecoder) failed"; |
107 return false; | 102 return false; |
108 } | 103 } |
109 return true; | 104 return true; |
110 } | 105 } |
111 | 106 |
112 void GpuVideoDecodeAcceleratorHost::Decode( | 107 void GpuVideoDecodeAcceleratorHost::Decode( |
113 const media::BitstreamBuffer& bitstream_buffer) { | 108 const media::BitstreamBuffer& bitstream_buffer) { |
114 DCHECK(CalledOnValidThread()); | 109 DCHECK(CalledOnValidThread()); |
115 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Decode( | 110 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Decode( |
116 decoder_id_, SyncTokens(), bitstream_buffer.handle(), | 111 command_buffer_route_id_, SyncTokens(), bitstream_buffer.handle(), |
117 bitstream_buffer.id(), bitstream_buffer.size()))) { | 112 bitstream_buffer.id(), bitstream_buffer.size()))) { |
118 DLOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Decode) failed"; | 113 DLOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Decode) failed"; |
119 // TODO(fischman/vrk): signal error to client. | 114 // TODO(fischman/vrk): signal error to client. |
120 return; | 115 return; |
121 } | 116 } |
122 } | 117 } |
123 | 118 |
124 void GpuVideoDecodeAcceleratorHost::AssignGLESBuffers( | 119 void GpuVideoDecodeAcceleratorHost::AssignGLESBuffers( |
125 const std::vector<media::GLESBuffer>& buffers) { | 120 const std::vector<media::GLESBuffer>& buffers) { |
126 DCHECK(CalledOnValidThread()); | 121 DCHECK(CalledOnValidThread()); |
127 // Rearrange data for IPC command. | 122 // Rearrange data for IPC command. |
128 std::vector<int32> buffer_ids; | 123 std::vector<int32> buffer_ids; |
129 std::vector<uint32> texture_ids; | 124 std::vector<uint32> texture_ids; |
130 std::vector<gfx::Size> sizes; | 125 std::vector<gfx::Size> sizes; |
131 for (uint32 i = 0; i < buffers.size(); i++) { | 126 for (uint32 i = 0; i < buffers.size(); i++) { |
132 const media::GLESBuffer& buffer = buffers[i]; | 127 const media::GLESBuffer& buffer = buffers[i]; |
133 texture_ids.push_back(buffer.texture_id()); | 128 texture_ids.push_back(buffer.texture_id()); |
134 buffer_ids.push_back(buffer.id()); | 129 buffer_ids.push_back(buffer.id()); |
135 sizes.push_back(buffer.size()); | 130 sizes.push_back(buffer.size()); |
136 } | 131 } |
137 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_AssignTextures( | 132 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_AssignGLESBuffers( |
138 decoder_id_, SyncTokens(), buffer_ids, texture_ids, sizes))) { | 133 command_buffer_route_id_, SyncTokens(), buffer_ids, texture_ids, |
| 134 sizes))) { |
139 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_AssignGLESBuffers) failed"; | 135 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_AssignGLESBuffers) failed"; |
140 } | 136 } |
141 } | 137 } |
142 | 138 |
143 void GpuVideoDecodeAcceleratorHost::AssignSysmemBuffers( | 139 void GpuVideoDecodeAcceleratorHost::AssignSysmemBuffers( |
144 const std::vector<media::SysmemBuffer>& buffers) { | 140 const std::vector<media::SysmemBuffer>& buffers) { |
145 DCHECK(CalledOnValidThread()); | 141 DCHECK(CalledOnValidThread()); |
146 // TODO(vrk): Implement. | 142 // TODO(vrk): Implement. |
147 NOTIMPLEMENTED(); | 143 NOTIMPLEMENTED(); |
148 } | 144 } |
149 | 145 |
150 void GpuVideoDecodeAcceleratorHost::ReusePictureBuffer( | 146 void GpuVideoDecodeAcceleratorHost::ReusePictureBuffer( |
151 int32 picture_buffer_id) { | 147 int32 picture_buffer_id) { |
152 DCHECK(CalledOnValidThread()); | 148 DCHECK(CalledOnValidThread()); |
153 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_ReusePictureBuffer( | 149 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_ReusePictureBuffer( |
154 decoder_id_, SyncTokens(), picture_buffer_id))) { | 150 command_buffer_route_id_, SyncTokens(), picture_buffer_id))) { |
155 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_ReusePictureBuffer) failed"; | 151 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_ReusePictureBuffer) failed"; |
156 } | 152 } |
157 } | 153 } |
158 | 154 |
159 void GpuVideoDecodeAcceleratorHost::Flush() { | 155 void GpuVideoDecodeAcceleratorHost::Flush() { |
160 DCHECK(CalledOnValidThread()); | 156 DCHECK(CalledOnValidThread()); |
161 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Flush( | 157 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Flush( |
162 decoder_id_, SyncTokens()))) { | 158 command_buffer_route_id_, SyncTokens()))) { |
163 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Flush) failed"; | 159 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Flush) failed"; |
164 // TODO(fischman/vrk): signal error to client. | 160 // TODO(fischman/vrk): signal error to client. |
165 return; | 161 return; |
166 } | 162 } |
167 } | 163 } |
168 | 164 |
169 void GpuVideoDecodeAcceleratorHost::Abort() { | 165 void GpuVideoDecodeAcceleratorHost::Abort() { |
170 DCHECK(CalledOnValidThread()); | 166 DCHECK(CalledOnValidThread()); |
171 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Abort( | 167 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Abort( |
172 decoder_id_, SyncTokens()))) { | 168 command_buffer_route_id_, SyncTokens()))) { |
173 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Abort) failed"; | 169 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Abort) failed"; |
174 // TODO(fischman/vrk): signal error to client. | 170 // TODO(fischman/vrk): signal error to client. |
175 return; | 171 return; |
176 } | 172 } |
177 } | 173 } |
178 | 174 |
179 void GpuVideoDecodeAcceleratorHost::OnBitstreamBufferProcessed( | 175 void GpuVideoDecodeAcceleratorHost::OnBitstreamBufferProcessed( |
180 int32 bitstream_buffer_id) { | 176 int32 bitstream_buffer_id) { |
181 DCHECK(CalledOnValidThread()); | 177 DCHECK(CalledOnValidThread()); |
182 client_->NotifyEndOfBitstreamBuffer(bitstream_buffer_id); | 178 client_->NotifyEndOfBitstreamBuffer(bitstream_buffer_id); |
183 } | 179 } |
184 | 180 |
185 void GpuVideoDecodeAcceleratorHost::OnProvidePictureBuffer( | 181 void GpuVideoDecodeAcceleratorHost::OnProvidePictureBuffer( |
186 uint32 num_requested_buffers, | 182 uint32 num_requested_buffers, |
187 const gfx::Size& buffer_size, | 183 const gfx::Size& buffer_size, |
188 int32 mem_type) { | 184 int32 mem_type) { |
189 DCHECK(CalledOnValidThread()); | 185 DCHECK(CalledOnValidThread()); |
190 media::VideoDecodeAccelerator::MemoryType converted_mem_type = | 186 media::VideoDecodeAccelerator::MemoryType converted_mem_type = |
191 static_cast<media::VideoDecodeAccelerator::MemoryType>(mem_type); | 187 static_cast<media::VideoDecodeAccelerator::MemoryType>(mem_type); |
192 client_->ProvidePictureBuffers( | 188 client_->ProvidePictureBuffers( |
193 num_requested_buffers, buffer_size, converted_mem_type); | 189 num_requested_buffers, buffer_size, converted_mem_type); |
194 } | 190 } |
195 | 191 |
196 void GpuVideoDecodeAcceleratorHost::OnDismissPictureBuffer( | 192 void GpuVideoDecodeAcceleratorHost::OnDismissPictureBuffer( |
197 int32 picture_buffer_id) { | 193 int32 picture_buffer_id) { |
198 DCHECK(CalledOnValidThread()); | 194 DCHECK(CalledOnValidThread()); |
199 client_->DismissPictureBuffer(picture_buffer_id); | 195 client_->DismissPictureBuffer(picture_buffer_id); |
200 } | 196 } |
201 | 197 |
202 void GpuVideoDecodeAcceleratorHost::OnCreateDone(int32 decoder_id) { | |
203 DCHECK(CalledOnValidThread()); | |
204 decoder_id_ = decoder_id; | |
205 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Initialize( | |
206 decoder_id_, SyncTokens(), configs_))) { | |
207 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Initialize) failed"; | |
208 } | |
209 } | |
210 | |
211 void GpuVideoDecodeAcceleratorHost::OnInitializeDone() { | 198 void GpuVideoDecodeAcceleratorHost::OnInitializeDone() { |
212 DCHECK(CalledOnValidThread()); | 199 DCHECK(CalledOnValidThread()); |
213 client_->NotifyInitializeDone(); | 200 client_->NotifyInitializeDone(); |
214 } | 201 } |
215 | 202 |
216 void GpuVideoDecodeAcceleratorHost::OnPictureReady( | 203 void GpuVideoDecodeAcceleratorHost::OnPictureReady( |
217 int32 picture_buffer_id, int32 bitstream_buffer_id, | 204 int32 picture_buffer_id, int32 bitstream_buffer_id, |
218 const gfx::Size& visible_size, const gfx::Size& decoded_size) { | 205 const gfx::Size& visible_size, const gfx::Size& decoded_size) { |
219 DCHECK(CalledOnValidThread()); | 206 DCHECK(CalledOnValidThread()); |
220 media::Picture picture( | 207 media::Picture picture( |
(...skipping 14 matching lines...) Expand all Loading... |
235 void GpuVideoDecodeAcceleratorHost::OnEndOfStream() { | 222 void GpuVideoDecodeAcceleratorHost::OnEndOfStream() { |
236 DCHECK(CalledOnValidThread()); | 223 DCHECK(CalledOnValidThread()); |
237 client_->NotifyEndOfStream(); | 224 client_->NotifyEndOfStream(); |
238 } | 225 } |
239 | 226 |
240 void GpuVideoDecodeAcceleratorHost::OnErrorNotification(uint32 error) { | 227 void GpuVideoDecodeAcceleratorHost::OnErrorNotification(uint32 error) { |
241 DCHECK(CalledOnValidThread()); | 228 DCHECK(CalledOnValidThread()); |
242 client_->NotifyError( | 229 client_->NotifyError( |
243 static_cast<media::VideoDecodeAccelerator::Error>(error)); | 230 static_cast<media::VideoDecodeAccelerator::Error>(error)); |
244 } | 231 } |
OLD | NEW |