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

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: . Created 9 years, 5 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 output->push_back(static_cast<uint32>(*configs)); 59 output->push_back(static_cast<uint32>(*configs));
59 current++; 60 current++;
60 } 61 }
61 } 62 }
62 63
63 } // namespace 64 } // namespace
64 65
65 PPB_VideoDecoder_Impl::PPB_VideoDecoder_Impl(PluginInstance* instance) 66 PPB_VideoDecoder_Impl::PPB_VideoDecoder_Impl(PluginInstance* instance)
66 : Resource(instance), 67 : Resource(instance),
67 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 68 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
69 context3d_id_(0),
68 abort_callback_(PP_BlockUntilComplete()), 70 abort_callback_(PP_BlockUntilComplete()),
69 flush_callback_(PP_BlockUntilComplete()) { 71 flush_callback_(PP_BlockUntilComplete()) {
70 ppp_videodecoder_ = 72 ppp_videodecoder_ =
71 static_cast<const PPP_VideoDecoder_Dev*>(instance->module()-> 73 static_cast<const PPP_VideoDecoder_Dev*>(instance->module()->
72 GetPluginInterface(PPP_VIDEODECODER_DEV_INTERFACE)); 74 GetPluginInterface(PPP_VIDEODECODER_DEV_INTERFACE));
73 } 75 }
74 76
75 PPB_VideoDecoder_Impl::~PPB_VideoDecoder_Impl() { 77 PPB_VideoDecoder_Impl::~PPB_VideoDecoder_Impl() {
78 if (context3d_id_)
79 ResourceTracker::Get()->UnrefResource(context3d_id_);
76 } 80 }
77 81
78 PPB_VideoDecoder_API* PPB_VideoDecoder_Impl::AsPPB_VideoDecoder_API() { 82 PPB_VideoDecoder_API* PPB_VideoDecoder_Impl::AsPPB_VideoDecoder_API() {
79 return this; 83 return this;
80 } 84 }
81 85
82 PP_Bool PPB_VideoDecoder_Impl::GetConfigs( 86 PP_Bool PPB_VideoDecoder_Impl::GetConfigs(
83 const PP_VideoConfigElement* requested_configs, 87 const PP_VideoConfigElement* requested_configs,
84 PP_VideoConfigElement* matching_configs, 88 PP_VideoConfigElement* matching_configs,
85 uint32_t matching_configs_size, 89 uint32_t matching_configs_size,
(...skipping 27 matching lines...) Expand all
113 117
114 if (!instance()) 118 if (!instance())
115 return PP_ERROR_FAILED; 119 return PP_ERROR_FAILED;
116 120
117 EnterResourceNoLock<PPB_Context3D_API> enter(context_id, true); 121 EnterResourceNoLock<PPB_Context3D_API> enter(context_id, true);
118 if (enter.failed()) 122 if (enter.failed())
119 return PP_ERROR_BADRESOURCE; 123 return PP_ERROR_BADRESOURCE;
120 PPB_Context3D_Impl* context3d = 124 PPB_Context3D_Impl* context3d =
121 static_cast<PPB_Context3D_Impl*>(enter.object()); 125 static_cast<PPB_Context3D_Impl*>(enter.object());
122 126
127 context3d_id_ = context_id;
128 ResourceTracker::Get()->AddRefResource(context3d_id_);
123 int command_buffer_route_id = 129 int command_buffer_route_id =
124 context3d->platform_context()->GetCommandBufferRouteId(); 130 context3d->platform_context()->GetCommandBufferRouteId();
125 if (command_buffer_route_id == 0) 131 if (command_buffer_route_id == 0)
126 return PP_ERROR_FAILED; 132 return PP_ERROR_FAILED;
127 133
128 platform_video_decoder_.reset( 134 platform_video_decoder_.reset(
129 instance()->delegate()->CreateVideoDecoder( 135 instance()->delegate()->CreateVideoDecoder(
130 this, command_buffer_route_id)); 136 this, command_buffer_route_id, context3d->gles2_impl()->helper()));
131 137
132 if (!platform_video_decoder_.get()) 138 if (!platform_video_decoder_.get())
133 return PP_ERROR_FAILED; 139 return PP_ERROR_FAILED;
134 140
135 std::vector<uint32> copied; 141 std::vector<uint32> copied;
136 // TODO(vrk): Validate configs before copy. 142 // TODO(vrk): Validate configs before copy.
137 CopyToConfigList(decoder_config, &copied); 143 CopyToConfigList(decoder_config, &copied);
138 if (platform_video_decoder_->Initialize(copied)) { 144 if (platform_video_decoder_->Initialize(copied)) {
139 initialization_callback_ = callback; 145 initialization_callback_ = callback;
140 return PP_OK_COMPLETIONPENDING; 146 return PP_OK_COMPLETIONPENDING;
(...skipping 12 matching lines...) Expand all
153 if (enter.failed()) 159 if (enter.failed())
154 return PP_ERROR_FAILED; 160 return PP_ERROR_FAILED;
155 161
156 PPB_Buffer_Impl* buffer = static_cast<PPB_Buffer_Impl*>(enter.object()); 162 PPB_Buffer_Impl* buffer = static_cast<PPB_Buffer_Impl*>(enter.object());
157 media::BitstreamBuffer decode_buffer(bitstream_buffer->id, 163 media::BitstreamBuffer decode_buffer(bitstream_buffer->id,
158 buffer->shared_memory()->handle(), 164 buffer->shared_memory()->handle(),
159 static_cast<size_t>(buffer->size())); 165 static_cast<size_t>(buffer->size()));
160 CHECK(bitstream_buffer_callbacks_.insert(std::make_pair( 166 CHECK(bitstream_buffer_callbacks_.insert(std::make_pair(
161 bitstream_buffer->id, callback)).second); 167 bitstream_buffer->id, callback)).second);
162 168
163 if (platform_video_decoder_->Decode(decode_buffer)) 169 platform_video_decoder_->Decode(decode_buffer);
164 return PP_OK_COMPLETIONPENDING; 170 return PP_OK_COMPLETIONPENDING;
165 else
166 return PP_ERROR_FAILED;
167 } 171 }
168 172
169 void PPB_VideoDecoder_Impl::AssignGLESBuffers( 173 void PPB_VideoDecoder_Impl::AssignGLESBuffers(
170 uint32_t no_of_buffers, 174 uint32_t no_of_buffers,
171 const PP_GLESBuffer_Dev* buffers) { 175 const PP_GLESBuffer_Dev* buffers) {
172 if (!platform_video_decoder_.get()) 176 if (!platform_video_decoder_.get())
173 return; 177 return;
174 178
175 std::vector<media::GLESBuffer> wrapped_buffers; 179 std::vector<media::GLESBuffer> wrapped_buffers;
176 for (uint32 i = 0; i < no_of_buffers; i++) { 180 for (uint32 i = 0; i < no_of_buffers; i++) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 } 220 }
217 221
218 int32_t PPB_VideoDecoder_Impl::Flush(PP_CompletionCallback callback) { 222 int32_t PPB_VideoDecoder_Impl::Flush(PP_CompletionCallback callback) {
219 if (!platform_video_decoder_.get()) 223 if (!platform_video_decoder_.get())
220 return PP_ERROR_BADRESOURCE; 224 return PP_ERROR_BADRESOURCE;
221 225
222 // Store the callback to be called when Flush() is done. 226 // Store the callback to be called when Flush() is done.
223 // TODO(vmr): Check for current flush/abort operations. 227 // TODO(vmr): Check for current flush/abort operations.
224 flush_callback_ = callback; 228 flush_callback_ = callback;
225 229
226 if (platform_video_decoder_->Flush()) 230 platform_video_decoder_->Flush();
227 return PP_OK_COMPLETIONPENDING; 231 return PP_OK_COMPLETIONPENDING;
228 else
229 return PP_ERROR_FAILED;
230 } 232 }
231 233
232 int32_t PPB_VideoDecoder_Impl::Abort(PP_CompletionCallback callback) { 234 int32_t PPB_VideoDecoder_Impl::Abort(PP_CompletionCallback callback) {
233 if (!platform_video_decoder_.get()) 235 if (!platform_video_decoder_.get())
234 return PP_ERROR_BADRESOURCE; 236 return PP_ERROR_BADRESOURCE;
235 237
236 // Store the callback to be called when Abort() is done. 238 // Store the callback to be called when Abort() is done.
237 // TODO(vmr): Check for current flush/abort operations. 239 // TODO(vmr): Check for current flush/abort operations.
238 abort_callback_ = callback; 240 abort_callback_ = callback;
239 241
240 if (platform_video_decoder_->Abort()) 242 platform_video_decoder_->Abort();
241 return PP_OK_COMPLETIONPENDING; 243 return PP_OK_COMPLETIONPENDING;
242 else
243 return PP_ERROR_FAILED;
244 } 244 }
245 245
246 void PPB_VideoDecoder_Impl::ProvidePictureBuffers( 246 void PPB_VideoDecoder_Impl::ProvidePictureBuffers(
247 uint32 requested_num_of_buffers, 247 uint32 requested_num_of_buffers,
248 const gfx::Size& dimensions, 248 const gfx::Size& dimensions,
249 media::VideoDecodeAccelerator::MemoryType type) { 249 media::VideoDecodeAccelerator::MemoryType type) {
250 if (!ppp_videodecoder_) 250 if (!ppp_videodecoder_)
251 return; 251 return;
252 252
253 // TODO(vrk): Compiler assert or use switch statement instead of making 253 // TODO(vrk): Compiler assert or use switch statement instead of making
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 331
332 void PPB_VideoDecoder_Impl::NotifyInitializeDone() { 332 void PPB_VideoDecoder_Impl::NotifyInitializeDone() {
333 if (initialization_callback_.func == NULL) 333 if (initialization_callback_.func == NULL)
334 return; 334 return;
335 335
336 PP_RunAndClearCompletionCallback(&initialization_callback_, PP_OK); 336 PP_RunAndClearCompletionCallback(&initialization_callback_, PP_OK);
337 } 337 }
338 338
339 } // namespace ppapi 339 } // namespace ppapi
340 } // namespace webkit 340 } // namespace webkit
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698