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

Side by Side Diff: ppapi/proxy/ppb_video_capture_proxy.cc

Issue 11274036: Refactor video capture to new design (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 1 month 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
OLDNEW
(Empty)
1 // Copyright (c) 2012 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 "ppapi/proxy/ppb_video_capture_proxy.h"
6
7 #include "base/compiler_specific.h"
8 #include "base/logging.h"
9 #include "build/build_config.h"
10 #include "ppapi/c/pp_errors.h"
11 #include "ppapi/c/pp_resource.h"
12 #include "ppapi/c/ppb_core.h"
13 #include "ppapi/c/dev/ppb_video_capture_dev.h"
14 #include "ppapi/proxy/enter_proxy.h"
15 #include "ppapi/proxy/host_dispatcher.h"
16 #include "ppapi/proxy/plugin_dispatcher.h"
17 #include "ppapi/proxy/ppapi_messages.h"
18 #include "ppapi/proxy/ppb_buffer_proxy.h"
19 #include "ppapi/shared_impl/ppapi_globals.h"
20 #include "ppapi/shared_impl/ppb_video_capture_shared.h"
21 #include "ppapi/shared_impl/resource_tracker.h"
22 #include "ppapi/shared_impl/tracked_callback.h"
23 #include "ppapi/thunk/ppb_buffer_api.h"
24 #include "ppapi/thunk/ppb_buffer_trusted_api.h"
25 #include "ppapi/thunk/ppb_video_capture_api.h"
26 #include "ppapi/thunk/resource_creation_api.h"
27 #include "ppapi/thunk/thunk.h"
28
29 using ppapi::thunk::EnterResourceNoLock;
30 using ppapi::thunk::PPB_Buffer_API;
31 using ppapi::thunk::PPB_BufferTrusted_API;
32 using ppapi::thunk::PPB_VideoCapture_API;
33
34 namespace ppapi {
35 namespace proxy {
36
37 namespace {
38
39 InterfaceProxy* CreatePPPVideoCaptureProxy(Dispatcher* dispatcher) {
40 return new PPP_VideoCapture_Proxy(dispatcher);
41 }
42
43 void OnDeviceInfo(PP_Instance instance,
44 PP_Resource resource,
45 const PP_VideoCaptureDeviceInfo_Dev* info,
46 uint32_t buffer_count,
47 const PP_Resource resources[]) {
48 HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
49 if (!dispatcher) {
50 NOTREACHED();
51 return;
52 }
53 HostResource host_resource;
54 host_resource.SetHostResource(instance, resource);
55 std::vector<PPPVideoCapture_Buffer> buffers(buffer_count);
56 const PPB_Core* core = static_cast<const PPB_Core*>(
57 dispatcher->local_get_interface()(PPB_CORE_INTERFACE));
58 DCHECK(core);
59 for (uint32_t i = 0; i < buffer_count; ++i) {
60 // We need to take a ref on the resource now. The browser may drop
61 // references once we return from here, but we're sending an asynchronous
62 // message. The plugin side takes ownership of that reference.
63 core->AddRefResource(resources[i]);
64 buffers[i].resource.SetHostResource(instance, resources[i]);
65 {
66 EnterResourceNoLock<PPB_Buffer_API> enter(resources[i], true);
67 DCHECK(enter.succeeded());
68 PP_Bool result = enter.object()->Describe(&buffers[i].size);
69 DCHECK(result);
70 }
71 {
72 EnterResourceNoLock<PPB_BufferTrusted_API> enter(resources[i], true);
73 DCHECK(enter.succeeded());
74 int handle;
75 int32_t result = enter.object()->GetSharedMemory(&handle);
76 DCHECK(result == PP_OK);
77 // TODO(piman/brettw): Change trusted interface to return a PP_FileHandle,
78 // those casts are ugly.
79 base::PlatformFile platform_file =
80 #if defined(OS_WIN)
81 reinterpret_cast<HANDLE>(static_cast<intptr_t>(handle));
82 #elif defined(OS_POSIX)
83 handle;
84 #else
85 #error Not implemented.
86 #endif
87 buffers[i].handle =
88 dispatcher->ShareHandleWithRemote(platform_file, false);
89 }
90 }
91 dispatcher->Send(new PpapiMsg_PPPVideoCapture_OnDeviceInfo(
92 API_ID_PPP_VIDEO_CAPTURE_DEV, host_resource, *info, buffers));
93 }
94
95 void OnStatus(PP_Instance instance, PP_Resource resource, uint32_t status) {
96 HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
97 if (!dispatcher) {
98 NOTREACHED();
99 return;
100 }
101 HostResource host_resource;
102 host_resource.SetHostResource(instance, resource);
103 dispatcher->Send(new PpapiMsg_PPPVideoCapture_OnStatus(
104 API_ID_PPP_VIDEO_CAPTURE_DEV, host_resource, status));
105 }
106
107 void OnError(PP_Instance instance, PP_Resource resource, uint32_t error_code) {
108 HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
109 if (!dispatcher) {
110 NOTREACHED();
111 return;
112 }
113 HostResource host_resource;
114 host_resource.SetHostResource(instance, resource);
115 dispatcher->Send(new PpapiMsg_PPPVideoCapture_OnError(
116 API_ID_PPP_VIDEO_CAPTURE_DEV, host_resource, error_code));
117 }
118
119 void OnBufferReady(PP_Instance instance,
120 PP_Resource resource,
121 uint32_t buffer) {
122 HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
123 if (!dispatcher) {
124 NOTREACHED();
125 return;
126 }
127 HostResource host_resource;
128 host_resource.SetHostResource(instance, resource);
129 dispatcher->Send(new PpapiMsg_PPPVideoCapture_OnBufferReady(
130 API_ID_PPP_VIDEO_CAPTURE_DEV, host_resource, buffer));
131 }
132
133 PPP_VideoCapture_Dev ppp_video_capture = {
134 OnDeviceInfo,
135 OnStatus,
136 OnError,
137 OnBufferReady
138 };
139
140 } // namespace
141
142 class VideoCapture : public PPB_VideoCapture_Shared {
143 public:
144 explicit VideoCapture(const HostResource& resource);
145 virtual ~VideoCapture();
146
147 bool OnStatus(PP_VideoCaptureStatus_Dev status);
148
149 void set_status(PP_VideoCaptureStatus_Dev status) {
150 SetStatus(status, true);
151 }
152
153 void SetBufferCount(size_t count) {
154 buffer_in_use_ = std::vector<bool>(count);
155 }
156
157 void SetBufferInUse(uint32_t buffer) {
158 DCHECK(buffer < buffer_in_use_.size());
159 buffer_in_use_[buffer] = true;
160 }
161
162 private:
163 // PPB_VideoCapture_Shared implementation.
164 virtual int32_t InternalEnumerateDevices(
165 PP_Resource* devices,
166 scoped_refptr<TrackedCallback> callback) OVERRIDE;
167 virtual int32_t InternalOpen(
168 const std::string& device_id,
169 const PP_VideoCaptureDeviceInfo_Dev& requested_info,
170 uint32_t buffer_count,
171 scoped_refptr<TrackedCallback> callback) OVERRIDE;
172 virtual int32_t InternalStartCapture() OVERRIDE;
173 virtual int32_t InternalReuseBuffer(uint32_t buffer) OVERRIDE;
174 virtual int32_t InternalStopCapture() OVERRIDE;
175 virtual void InternalClose() OVERRIDE;
176 virtual int32_t InternalStartCapture0_1(
177 const PP_VideoCaptureDeviceInfo_Dev& requested_info,
178 uint32_t buffer_count) OVERRIDE;
179 virtual const std::vector<DeviceRefData>&
180 InternalGetDeviceRefData() const OVERRIDE;
181
182 PluginDispatcher* GetDispatcher() const {
183 return PluginDispatcher::GetForResource(this);
184 }
185
186 std::vector<bool> buffer_in_use_;
187
188 DISALLOW_COPY_AND_ASSIGN(VideoCapture);
189 };
190
191 VideoCapture::VideoCapture(const HostResource& resource)
192 : PPB_VideoCapture_Shared(resource) {
193 }
194
195 VideoCapture::~VideoCapture() {
196 Close();
197 }
198
199 bool VideoCapture::OnStatus(PP_VideoCaptureStatus_Dev status) {
200 switch (status) {
201 case PP_VIDEO_CAPTURE_STATUS_STARTED:
202 case PP_VIDEO_CAPTURE_STATUS_PAUSED:
203 case PP_VIDEO_CAPTURE_STATUS_STOPPED:
204 return SetStatus(status, false);
205 case PP_VIDEO_CAPTURE_STATUS_STARTING:
206 case PP_VIDEO_CAPTURE_STATUS_STOPPING:
207 // Those states are not sent by the browser.
208 break;
209 }
210
211 NOTREACHED();
212 return false;
213 }
214
215 int32_t VideoCapture::InternalEnumerateDevices(
216 PP_Resource* devices,
217 scoped_refptr<TrackedCallback> callback) {
218 devices_ = devices;
219 enumerate_devices_callback_ = callback;
220 GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_EnumerateDevices(
221 API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource()));
222 return PP_OK_COMPLETIONPENDING;
223 }
224
225 int32_t VideoCapture::InternalOpen(
226 const std::string& device_id,
227 const PP_VideoCaptureDeviceInfo_Dev& requested_info,
228 uint32_t buffer_count,
229 scoped_refptr<TrackedCallback> callback) {
230 open_callback_ = callback;
231 GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_Open(
232 API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource(), device_id, requested_info,
233 buffer_count));
234 return PP_OK_COMPLETIONPENDING;
235 }
236
237 int32_t VideoCapture::InternalStartCapture() {
238 buffer_in_use_.clear();
239 GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_StartCapture(
240 API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource()));
241 return PP_OK;
242 }
243
244 int32_t VideoCapture::InternalReuseBuffer(uint32_t buffer) {
245 if (buffer >= buffer_in_use_.size() || !buffer_in_use_[buffer])
246 return PP_ERROR_BADARGUMENT;
247 GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_ReuseBuffer(
248 API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource(), buffer));
249 return PP_OK;
250 }
251
252 int32_t VideoCapture::InternalStopCapture() {
253 GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_StopCapture(
254 API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource()));
255 return PP_OK;
256 }
257
258 void VideoCapture::InternalClose() {
259 GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_Close(
260 API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource()));
261 }
262
263 int32_t VideoCapture::InternalStartCapture0_1(
264 const PP_VideoCaptureDeviceInfo_Dev& requested_info,
265 uint32_t buffer_count) {
266 buffer_in_use_.clear();
267 GetDispatcher()->Send(new PpapiHostMsg_PPBVideoCapture_StartCapture0_1(
268 API_ID_PPB_VIDEO_CAPTURE_DEV, host_resource(), requested_info,
269 buffer_count));
270 return PP_OK;
271 }
272
273 const std::vector<DeviceRefData>&
274 VideoCapture::InternalGetDeviceRefData() const {
275 // This should never be called at the plugin side.
276 NOTREACHED();
277 static std::vector<DeviceRefData> result;
278 return result;
279 }
280
281 PPB_VideoCapture_Proxy::PPB_VideoCapture_Proxy(Dispatcher* dispatcher)
282 : InterfaceProxy(dispatcher),
283 ALLOW_THIS_IN_INITIALIZER_LIST(callback_factory_(this)) {
284 }
285
286 PPB_VideoCapture_Proxy::~PPB_VideoCapture_Proxy() {
287 }
288
289 // static
290 PP_Resource PPB_VideoCapture_Proxy::CreateProxyResource(PP_Instance instance) {
291 PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
292 if (!dispatcher)
293 return 0;
294
295 HostResource result;
296 dispatcher->Send(new PpapiHostMsg_PPBVideoCapture_Create(
297 API_ID_PPB_VIDEO_CAPTURE_DEV, instance, &result));
298 if (result.is_null())
299 return 0;
300 return (new VideoCapture(result))->GetReference();
301 }
302
303 bool PPB_VideoCapture_Proxy::OnMessageReceived(const IPC::Message& msg) {
304 bool handled = true;
305 IPC_BEGIN_MESSAGE_MAP(PPB_VideoCapture_Proxy, msg)
306 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_Create, OnMsgCreate)
307 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_EnumerateDevices,
308 OnMsgEnumerateDevices)
309 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_Open, OnMsgOpen)
310 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_StartCapture,
311 OnMsgStartCapture)
312 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_ReuseBuffer,
313 OnMsgReuseBuffer)
314 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_StopCapture,
315 OnMsgStopCapture)
316 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_Close, OnMsgClose)
317 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBVideoCapture_StartCapture0_1,
318 OnMsgStartCapture0_1)
319
320 IPC_MESSAGE_HANDLER(PpapiMsg_PPBVideoCapture_EnumerateDevicesACK,
321 OnMsgEnumerateDevicesACK)
322 IPC_MESSAGE_HANDLER(PpapiMsg_PPBVideoCapture_OpenACK,
323 OnMsgOpenACK)
324 IPC_MESSAGE_UNHANDLED(handled = false)
325 IPC_END_MESSAGE_MAP()
326 // TODO(brettw) handle bad messages!
327 return handled;
328 }
329
330 void PPB_VideoCapture_Proxy::OnMsgCreate(PP_Instance instance,
331 HostResource* result_resource) {
332 thunk::EnterResourceCreation enter(instance);
333 if (enter.succeeded()) {
334 result_resource->SetHostResource(
335 instance,
336 enter.functions()->CreateVideoCapture(instance));
337 }
338 }
339
340 void PPB_VideoCapture_Proxy::OnMsgEnumerateDevices(
341 const HostResource& resource) {
342 EnterHostFromHostResourceForceCallback<PPB_VideoCapture_API> enter(
343 resource, callback_factory_,
344 &PPB_VideoCapture_Proxy::EnumerateDevicesACKInHost, resource);
345
346 if (enter.succeeded())
347 enter.SetResult(enter.object()->EnumerateDevices(NULL, enter.callback()));
348 }
349
350 void PPB_VideoCapture_Proxy::OnMsgOpen(
351 const ppapi::HostResource& resource,
352 const std::string& device_id,
353 const PP_VideoCaptureDeviceInfo_Dev& info,
354 uint32_t buffers) {
355 EnterHostFromHostResourceForceCallback<PPB_VideoCapture_API> enter(
356 resource, callback_factory_, &PPB_VideoCapture_Proxy::OpenACKInHost,
357 resource);
358
359 if (enter.succeeded()) {
360 enter.SetResult(enter.object()->Open(device_id, info, buffers,
361 enter.callback()));
362 }
363 }
364
365 void PPB_VideoCapture_Proxy::OnMsgStartCapture(const HostResource& resource) {
366 EnterHostFromHostResource<PPB_VideoCapture_API> enter(resource);
367 if (enter.succeeded())
368 enter.object()->StartCapture();
369 }
370
371 void PPB_VideoCapture_Proxy::OnMsgReuseBuffer(const HostResource& resource,
372 uint32_t buffer) {
373 EnterHostFromHostResource<PPB_VideoCapture_API> enter(resource);
374 if (enter.succeeded())
375 enter.object()->ReuseBuffer(buffer);
376 }
377
378 void PPB_VideoCapture_Proxy::OnMsgStopCapture(const HostResource& resource) {
379 EnterHostFromHostResource<PPB_VideoCapture_API> enter(resource);
380 if (enter.succeeded())
381 enter.object()->StopCapture();
382 }
383
384 void PPB_VideoCapture_Proxy::OnMsgClose(const HostResource& resource) {
385 EnterHostFromHostResource<PPB_VideoCapture_API> enter(resource);
386 if (enter.succeeded())
387 enter.object()->Close();
388 }
389
390 void PPB_VideoCapture_Proxy::OnMsgStartCapture0_1(
391 const HostResource& resource,
392 const PP_VideoCaptureDeviceInfo_Dev& info,
393 uint32_t buffers) {
394 EnterHostFromHostResource<PPB_VideoCapture_API> enter(resource);
395 if (enter.succeeded())
396 enter.object()->StartCapture0_1(info, buffers);
397 }
398
399 void PPB_VideoCapture_Proxy::OnMsgEnumerateDevicesACK(
400 const HostResource& resource,
401 int32_t result,
402 const std::vector<ppapi::DeviceRefData>& devices) {
403 EnterPluginFromHostResource<PPB_VideoCapture_API> enter(resource);
404 if (enter.succeeded()) {
405 static_cast<VideoCapture*>(enter.object())->OnEnumerateDevicesComplete(
406 result, devices);
407 }
408 }
409
410 void PPB_VideoCapture_Proxy::OnMsgOpenACK(
411 const HostResource& resource,
412 int32_t result) {
413 EnterPluginFromHostResource<PPB_VideoCapture_API> enter(resource);
414 if (enter.succeeded())
415 static_cast<VideoCapture*>(enter.object())->OnOpenComplete(result);
416 }
417
418 void PPB_VideoCapture_Proxy::EnumerateDevicesACKInHost(
419 int32_t result,
420 const HostResource& resource) {
421 EnterHostFromHostResource<PPB_VideoCapture_API> enter(resource);
422 dispatcher()->Send(new PpapiMsg_PPBVideoCapture_EnumerateDevicesACK(
423 API_ID_PPB_VIDEO_CAPTURE_DEV, resource, result,
424 enter.succeeded() && result == PP_OK ?
425 enter.object()->GetDeviceRefData() : std::vector<DeviceRefData>()));
426 }
427
428 void PPB_VideoCapture_Proxy::OpenACKInHost(int32_t result,
429 const HostResource& resource) {
430 dispatcher()->Send(new PpapiMsg_PPBVideoCapture_OpenACK(
431 API_ID_PPB_VIDEO_CAPTURE_DEV, resource, result));
432 }
433
434 PPP_VideoCapture_Proxy::PPP_VideoCapture_Proxy(Dispatcher* dispatcher)
435 : InterfaceProxy(dispatcher),
436 ppp_video_capture_impl_(NULL) {
437 if (dispatcher->IsPlugin()) {
438 ppp_video_capture_impl_ = static_cast<const PPP_VideoCapture_Dev*>(
439 dispatcher->local_get_interface()(PPP_VIDEO_CAPTURE_DEV_INTERFACE));
440 }
441 }
442
443 PPP_VideoCapture_Proxy::~PPP_VideoCapture_Proxy() {
444 }
445
446 // static
447 const InterfaceProxy::Info* PPP_VideoCapture_Proxy::GetInfo() {
448 static const Info info = {
449 &ppp_video_capture,
450 PPP_VIDEO_CAPTURE_DEV_INTERFACE,
451 API_ID_PPP_VIDEO_CAPTURE_DEV,
452 false,
453 &CreatePPPVideoCaptureProxy,
454 };
455 return &info;
456 }
457
458 bool PPP_VideoCapture_Proxy::OnMessageReceived(const IPC::Message& msg) {
459 bool handled = true;
460 IPC_BEGIN_MESSAGE_MAP(PPP_VideoCapture_Proxy, msg)
461 IPC_MESSAGE_HANDLER(PpapiMsg_PPPVideoCapture_OnDeviceInfo,
462 OnMsgOnDeviceInfo)
463 IPC_MESSAGE_HANDLER(PpapiMsg_PPPVideoCapture_OnStatus, OnMsgOnStatus)
464 IPC_MESSAGE_HANDLER(PpapiMsg_PPPVideoCapture_OnError, OnMsgOnError)
465 IPC_MESSAGE_HANDLER(PpapiMsg_PPPVideoCapture_OnBufferReady,
466 OnMsgOnBufferReady)
467 IPC_MESSAGE_UNHANDLED(handled = false)
468 IPC_END_MESSAGE_MAP()
469 // TODO(brettw) handle bad messages!
470 return handled;
471 }
472
473 void PPP_VideoCapture_Proxy::OnMsgOnDeviceInfo(
474 const HostResource& host_resource,
475 const PP_VideoCaptureDeviceInfo_Dev& info,
476 const std::vector<PPPVideoCapture_Buffer>& buffers) {
477 EnterPluginFromHostResource<PPB_VideoCapture_API> enter(host_resource);
478 if (enter.failed() || !ppp_video_capture_impl_)
479 return;
480
481 PluginResourceTracker* tracker =
482 PluginGlobals::Get()->plugin_resource_tracker();
483 scoped_array<PP_Resource> resources(new PP_Resource[buffers.size()]);
484 for (size_t i = 0; i < buffers.size(); ++i) {
485 // We assume that the browser created a new set of resources.
486 DCHECK(!tracker->PluginResourceForHostResource(buffers[i].resource));
487 resources[i] = PPB_Buffer_Proxy::AddProxyResource(buffers[i].resource,
488 buffers[i].handle,
489 buffers[i].size);
490 }
491
492 VideoCapture* capture = static_cast<VideoCapture*>(enter.object());
493 capture->SetBufferCount(buffers.size());
494 ppp_video_capture_impl_->OnDeviceInfo(
495 host_resource.instance(),
496 capture->pp_resource(),
497 &info,
498 buffers.size(),
499 resources.get());
500 for (size_t i = 0; i < buffers.size(); ++i)
501 tracker->ReleaseResource(resources[i]);
502 }
503
504 void PPP_VideoCapture_Proxy::OnMsgOnStatus(const HostResource& host_resource,
505 uint32_t status) {
506 EnterPluginFromHostResource<PPB_VideoCapture_API> enter(host_resource);
507 if (enter.failed() || !ppp_video_capture_impl_)
508 return;
509
510 VideoCapture* capture = static_cast<VideoCapture*>(enter.object());
511 if (!capture->OnStatus(static_cast<PP_VideoCaptureStatus_Dev>(status)))
512 return;
513 ppp_video_capture_impl_->OnStatus(
514 host_resource.instance(), capture->pp_resource(), status);
515 }
516
517 void PPP_VideoCapture_Proxy::OnMsgOnError(const HostResource& host_resource,
518 uint32_t error_code) {
519 EnterPluginFromHostResource<PPB_VideoCapture_API> enter(host_resource);
520 if (enter.failed() || !ppp_video_capture_impl_)
521 return;
522
523 VideoCapture* capture = static_cast<VideoCapture*>(enter.object());
524 capture->set_status(PP_VIDEO_CAPTURE_STATUS_STOPPED);
525 ppp_video_capture_impl_->OnError(
526 host_resource.instance(), capture->pp_resource(), error_code);
527 }
528
529 void PPP_VideoCapture_Proxy::OnMsgOnBufferReady(
530 const HostResource& host_resource, uint32_t buffer) {
531 EnterPluginFromHostResource<PPB_VideoCapture_API> enter(host_resource);
532 if (enter.failed() || !ppp_video_capture_impl_)
533 return;
534
535 VideoCapture* capture = static_cast<VideoCapture*>(enter.object());
536 capture->SetBufferInUse(buffer);
537 ppp_video_capture_impl_->OnBufferReady(
538 host_resource.instance(), capture->pp_resource(), buffer);
539 }
540
541 } // namespace proxy
542 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698