Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(647)

Side by Side Diff: webkit/plugins/ppapi/ppb_video_decoder_impl.cc

Issue 7260008: Implement proper synchronization between HW video decode IPC and CommandBuffer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixing compilation errors from bots. Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "webkit/plugins/ppapi/ppb_video_decoder_impl.h" 5 #include "webkit/plugins/ppapi/ppb_video_decoder_impl.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
11 #include "gpu/command_buffer/client/gles2_implementation.h"
11 #include "media/video/picture.h" 12 #include "media/video/picture.h"
12 #include "ppapi/c/dev/pp_video_dev.h" 13 #include "ppapi/c/dev/pp_video_dev.h"
13 #include "ppapi/c/dev/ppb_video_decoder_dev.h" 14 #include "ppapi/c/dev/ppb_video_decoder_dev.h"
14 #include "ppapi/c/dev/ppp_video_decoder_dev.h" 15 #include "ppapi/c/dev/ppp_video_decoder_dev.h"
15 #include "ppapi/c/pp_completion_callback.h" 16 #include "ppapi/c/pp_completion_callback.h"
16 #include "ppapi/c/pp_errors.h" 17 #include "ppapi/c/pp_errors.h"
17 #include "ppapi/thunk/enter.h" 18 #include "ppapi/thunk/enter.h"
18 #include "webkit/plugins/ppapi/common.h" 19 #include "webkit/plugins/ppapi/common.h"
19 #include "webkit/plugins/ppapi/plugin_module.h" 20 #include "webkit/plugins/ppapi/plugin_module.h"
20 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" 21 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 PPB_Context3D_Impl* context3d = 121 PPB_Context3D_Impl* context3d =
121 static_cast<PPB_Context3D_Impl*>(enter.object()); 122 static_cast<PPB_Context3D_Impl*>(enter.object());
122 123
123 int command_buffer_route_id = 124 int command_buffer_route_id =
124 context3d->platform_context()->GetCommandBufferRouteId(); 125 context3d->platform_context()->GetCommandBufferRouteId();
125 if (command_buffer_route_id == 0) 126 if (command_buffer_route_id == 0)
126 return PP_ERROR_FAILED; 127 return PP_ERROR_FAILED;
127 128
128 platform_video_decoder_.reset( 129 platform_video_decoder_.reset(
129 instance()->delegate()->CreateVideoDecoder( 130 instance()->delegate()->CreateVideoDecoder(
130 this, command_buffer_route_id)); 131 this, command_buffer_route_id, context3d->gles2_impl()->helper()));
131 132
132 if (!platform_video_decoder_.get()) 133 if (!platform_video_decoder_.get())
133 return PP_ERROR_FAILED; 134 return PP_ERROR_FAILED;
134 135
135 std::vector<uint32> copied; 136 std::vector<uint32> copied;
136 // TODO(vrk): Validate configs before copy. 137 // TODO(vrk): Validate configs before copy.
137 CopyToConfigList(decoder_config, &copied); 138 CopyToConfigList(decoder_config, &copied);
138 if (platform_video_decoder_->Initialize(copied)) { 139 if (platform_video_decoder_->Initialize(copied)) {
139 initialization_callback_ = callback; 140 initialization_callback_ = callback;
140 return PP_OK_COMPLETIONPENDING; 141 return PP_OK_COMPLETIONPENDING;
(...skipping 12 matching lines...) Expand all
153 if (enter.failed()) 154 if (enter.failed())
154 return PP_ERROR_FAILED; 155 return PP_ERROR_FAILED;
155 156
156 PPB_Buffer_Impl* buffer = static_cast<PPB_Buffer_Impl*>(enter.object()); 157 PPB_Buffer_Impl* buffer = static_cast<PPB_Buffer_Impl*>(enter.object());
157 media::BitstreamBuffer decode_buffer(bitstream_buffer->id, 158 media::BitstreamBuffer decode_buffer(bitstream_buffer->id,
158 buffer->shared_memory()->handle(), 159 buffer->shared_memory()->handle(),
159 static_cast<size_t>(buffer->size())); 160 static_cast<size_t>(buffer->size()));
160 CHECK(bitstream_buffer_callbacks_.insert(std::make_pair( 161 CHECK(bitstream_buffer_callbacks_.insert(std::make_pair(
161 bitstream_buffer->id, callback)).second); 162 bitstream_buffer->id, callback)).second);
162 163
163 if (platform_video_decoder_->Decode(decode_buffer)) 164 platform_video_decoder_->Decode(decode_buffer);
164 return PP_OK_COMPLETIONPENDING; 165 return PP_OK_COMPLETIONPENDING;
165 else
166 return PP_ERROR_FAILED;
167 } 166 }
168 167
169 void PPB_VideoDecoder_Impl::AssignGLESBuffers( 168 void PPB_VideoDecoder_Impl::AssignGLESBuffers(
170 uint32_t no_of_buffers, 169 uint32_t no_of_buffers,
171 const PP_GLESBuffer_Dev* buffers) { 170 const PP_GLESBuffer_Dev* buffers) {
172 if (!platform_video_decoder_.get()) 171 if (!platform_video_decoder_.get())
173 return; 172 return;
174 173
175 std::vector<media::GLESBuffer> wrapped_buffers; 174 std::vector<media::GLESBuffer> wrapped_buffers;
176 for (uint32 i = 0; i < no_of_buffers; i++) { 175 for (uint32 i = 0; i < no_of_buffers; i++) {
177 PP_GLESBuffer_Dev in_buf = buffers[i]; 176 PP_GLESBuffer_Dev in_buf = buffers[i];
178 media::GLESBuffer buffer(in_buf); 177 media::GLESBuffer buffer(
178 in_buf.info.id,
179 gfx::Size(in_buf.info.size.width, in_buf.info.size.height),
180 in_buf.texture_id);
179 wrapped_buffers.push_back(buffer); 181 wrapped_buffers.push_back(buffer);
180 } 182 }
181 platform_video_decoder_->AssignGLESBuffers(wrapped_buffers); 183 platform_video_decoder_->AssignGLESBuffers(wrapped_buffers);
182 } 184 }
183 185
184 void PPB_VideoDecoder_Impl::AssignSysmemBuffers( 186 void PPB_VideoDecoder_Impl::AssignSysmemBuffers(
185 uint32_t no_of_buffers, 187 uint32_t no_of_buffers,
186 const PP_SysmemBuffer_Dev* buffers) { 188 const PP_SysmemBuffer_Dev* buffers) {
187 if (!platform_video_decoder_.get()) 189 if (!platform_video_decoder_.get())
188 return; 190 return;
189 191
190 std::vector<media::SysmemBuffer> wrapped_buffers; 192 std::vector<media::SysmemBuffer> wrapped_buffers;
191 for (uint32 i = 0; i < no_of_buffers; i++) { 193 for (uint32 i = 0; i < no_of_buffers; i++) {
192 PP_SysmemBuffer_Dev in_buf = buffers[i]; 194 PP_SysmemBuffer_Dev in_buf = buffers[i];
193 media::SysmemBuffer buffer(in_buf); 195 // TODO(brettw) we should properly handle the errors here if the buffer
196 // isn't a valid image rather than CHECKing.
197 EnterResourceNoLock<PPB_Buffer_API> enter(in_buf.data, true);
198 CHECK(enter.succeeded());
199 webkit::ppapi::PPB_Buffer_Impl* pepper_buffer =
200 static_cast<webkit::ppapi::PPB_Buffer_Impl*>(enter.object());
201 CHECK(pepper_buffer->IsMapped());
202 media::SysmemBuffer buffer(
203 in_buf.info.id,
204 gfx::Size(in_buf.info.size.width, in_buf.info.size.height),
205 pepper_buffer->Map());
194 wrapped_buffers.push_back(buffer); 206 wrapped_buffers.push_back(buffer);
195 } 207 }
196 platform_video_decoder_->AssignSysmemBuffers(wrapped_buffers); 208 platform_video_decoder_->AssignSysmemBuffers(wrapped_buffers);
197 } 209 }
198 210
199 void PPB_VideoDecoder_Impl::ReusePictureBuffer(int32_t picture_buffer_id) { 211 void PPB_VideoDecoder_Impl::ReusePictureBuffer(int32_t picture_buffer_id) {
200 if (!platform_video_decoder_.get()) 212 if (!platform_video_decoder_.get())
201 return; 213 return;
202 platform_video_decoder_->ReusePictureBuffer(picture_buffer_id); 214 platform_video_decoder_->ReusePictureBuffer(picture_buffer_id);
203 } 215 }
204 216
205 int32_t PPB_VideoDecoder_Impl::Flush(PP_CompletionCallback callback) { 217 int32_t PPB_VideoDecoder_Impl::Flush(PP_CompletionCallback callback) {
206 if (!platform_video_decoder_.get()) 218 if (!platform_video_decoder_.get())
207 return PP_ERROR_BADRESOURCE; 219 return PP_ERROR_BADRESOURCE;
208 220
209 // Store the callback to be called when Flush() is done. 221 // Store the callback to be called when Flush() is done.
210 // TODO(vmr): Check for current flush/abort operations. 222 // TODO(vmr): Check for current flush/abort operations.
211 flush_callback_ = callback; 223 flush_callback_ = callback;
212 224
213 if (platform_video_decoder_->Flush()) 225 platform_video_decoder_->Flush();
214 return PP_OK_COMPLETIONPENDING; 226 return PP_OK_COMPLETIONPENDING;
215 else
216 return PP_ERROR_FAILED;
217 } 227 }
218 228
219 int32_t PPB_VideoDecoder_Impl::Abort(PP_CompletionCallback callback) { 229 int32_t PPB_VideoDecoder_Impl::Abort(PP_CompletionCallback callback) {
220 if (!platform_video_decoder_.get()) 230 if (!platform_video_decoder_.get())
221 return PP_ERROR_BADRESOURCE; 231 return PP_ERROR_BADRESOURCE;
222 232
223 // Store the callback to be called when Abort() is done. 233 // Store the callback to be called when Abort() is done.
224 // TODO(vmr): Check for current flush/abort operations. 234 // TODO(vmr): Check for current flush/abort operations.
225 abort_callback_ = callback; 235 abort_callback_ = callback;
226 236
227 if (platform_video_decoder_->Abort()) 237 platform_video_decoder_->Abort();
228 return PP_OK_COMPLETIONPENDING; 238 return PP_OK_COMPLETIONPENDING;
229 else
230 return PP_ERROR_FAILED;
231 } 239 }
232 240
233 void PPB_VideoDecoder_Impl::ProvidePictureBuffers( 241 void PPB_VideoDecoder_Impl::ProvidePictureBuffers(
234 uint32 requested_num_of_buffers, 242 uint32 requested_num_of_buffers,
235 const gfx::Size& dimensions, 243 const gfx::Size& dimensions,
236 media::VideoDecodeAccelerator::MemoryType type) { 244 media::VideoDecodeAccelerator::MemoryType type) {
237 if (!ppp_videodecoder_) 245 if (!ppp_videodecoder_)
238 return; 246 return;
239 247
240 // TODO(vrk): Compiler assert or use switch statement instead of making 248 // TODO(vrk): Compiler assert or use switch statement instead of making
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 326
319 void PPB_VideoDecoder_Impl::NotifyInitializeDone() { 327 void PPB_VideoDecoder_Impl::NotifyInitializeDone() {
320 if (initialization_callback_.func == NULL) 328 if (initialization_callback_.func == NULL)
321 return; 329 return;
322 330
323 PP_RunAndClearCompletionCallback(&initialization_callback_, PP_OK); 331 PP_RunAndClearCompletionCallback(&initialization_callback_, PP_OK);
324 } 332 }
325 333
326 } // namespace ppapi 334 } // namespace ppapi
327 } // namespace webkit 335 } // namespace webkit
328
329 // These functions are declared in picture.h but are defined here because of
330 // dependencies (we can't depend on ppapi types from media).
331 // TODO(fischman/vrk): Find a way to clean this up as it violates the spirit of
332 // checkdeps.
333 namespace media {
334 BaseBuffer::BaseBuffer(const PP_BufferInfo_Dev& info)
335 : id_(info.id),
336 size_(info.size.width, info.size.height) {
337 }
338
339 GLESBuffer::GLESBuffer(const PP_GLESBuffer_Dev& buffer)
340 : BaseBuffer(buffer.info),
341 texture_id_(buffer.texture_id) {
342 }
343
344 SysmemBuffer::SysmemBuffer(const PP_SysmemBuffer_Dev& buffer)
345 : BaseBuffer(buffer.info) {
346 // TODO(brettw) we should properly handle the errors here if the buffer
347 // isn't a valid image rather than CHECKing.
348 EnterResourceNoLock<PPB_Buffer_API> enter(buffer.data, true);
349 CHECK(enter.succeeded());
350 webkit::ppapi::PPB_Buffer_Impl* pepper_buffer =
351 static_cast<webkit::ppapi::PPB_Buffer_Impl*>(enter.object());
352 CHECK(pepper_buffer->IsMapped());
353 data_ = pepper_buffer->Map();
354 }
355
356 Picture::Picture(const PP_Picture_Dev& picture)
357 : picture_buffer_id_(picture.picture_buffer_id),
358 bitstream_buffer_id_(picture.bitstream_buffer_id),
359 visible_size_(picture.visible_size.width, picture.visible_size.height),
360 decoded_size_(picture.decoded_size.width, picture.decoded_size.height) {
361 }
362
363 } // namespace media
OLDNEW
« media/video/video_decode_accelerator.h ('K') | « webkit/plugins/ppapi/plugin_delegate.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698