12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/video_capture_resource.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/dev/ppp_video_capture_dev.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/dispatch_reply_message.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/plugin_dispatcher.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/plugin_globals.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/plugin_resource_tracker.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/ppb_buffer_proxy.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/resource_message_params.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/proxy_lock.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/tracked_callback.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace proxy { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VideoCaptureResource::VideoCaptureResource( 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Connection connection, 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Instance instance, 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginDispatcher* dispatcher) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : PluginResource(connection, instance), 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_state_(BEFORE_OPEN), 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enumeration_helper_(this) { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendCreate(RENDERER, PpapiHostMsg_VideoCapture_Create()); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppp_video_capture_impl_ = static_cast<const PPP_VideoCapture_Dev*>( 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dispatcher->local_get_interface()(PPP_VIDEO_CAPTURE_DEV_INTERFACE)); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)VideoCaptureResource::~VideoCaptureResource() { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::OnReplyReceived( 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::Message& msg) { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enumeration_helper_.HandleReply(params, msg)) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params.sequence()) { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginResource::OnReplyReceived(params, msg); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_BEGIN_MESSAGE_MAP(VideoCaptureResource, msg) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL( 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiPluginMsg_VideoCapture_OnDeviceInfo, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnPluginMsgOnDeviceInfo) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL( 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiPluginMsg_VideoCapture_OnStatus, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnPluginMsgOnStatus) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL( 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiPluginMsg_VideoCapture_OnError, 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnPluginMsgOnError) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL( 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiPluginMsg_VideoCapture_OnBufferReady, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnPluginMsgOnBufferReady) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL_UNHANDLED(NOTREACHED()) 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_END_MESSAGE_MAP() 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::EnumerateDevices( 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_ArrayOutput& output, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return enumeration_helper_.EnumerateDevices(output, callback); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::MonitorDeviceChange( 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_MonitorDeviceChangeCallback callback, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* user_data) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return enumeration_helper_.MonitorDeviceChange(callback, user_data); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::Open( 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_id, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_VideoCaptureDeviceInfo_Dev& requested_info, 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t buffer_count, 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_state_ != BEFORE_OPEN) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (TrackedCallback::IsPending(open_callback_)) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_INPROGRESS; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_callback_ = callback; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Call<PpapiPluginMsg_VideoCapture_OpenReply>( 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RENDERER, 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_VideoCapture_Open(device_id, requested_info, buffer_count), 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&VideoCaptureResource::OnPluginMsgOpenReply, this)); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::StartCapture() { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_state_ != OPENED) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(RENDERER, PpapiHostMsg_VideoCapture_StartCapture()); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::ReuseBuffer(uint32_t buffer) { 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (buffer >= buffer_in_use_.size() || !buffer_in_use_[buffer]) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_BADARGUMENT; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(RENDERER, PpapiHostMsg_VideoCapture_ReuseBuffer(buffer)); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::StopCapture() { 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_state_ != OPENED) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(RENDERER, PpapiHostMsg_VideoCapture_StopCapture()); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::Close() { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_state_ == CLOSED) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(RENDERER, PpapiHostMsg_VideoCapture_Close()); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_state_ = CLOSED; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (TrackedCallback::IsPending(open_callback_)) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_callback_->PostAbort(); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::EnumerateDevicesSync( 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_ArrayOutput& devices) { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return enumeration_helper_.EnumerateDevicesSync(devices); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::LastPluginRefWasDeleted() { 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enumeration_helper_.LastPluginRefWasDeleted(); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::OnPluginMsgOnDeviceInfo( 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params, 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const struct PP_VideoCaptureDeviceInfo_Dev& info, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<HostResource>& buffers, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t buffer_size) { 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ppp_video_capture_impl_) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<base::SharedMemoryHandle> handles; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.TakeAllSharedMemoryHandles(&handles); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(handles.size() == buffers.size()); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginResourceTracker* tracker = 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginGlobals::Get()->plugin_resource_tracker(); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<PP_Resource[]> resources(new PP_Resource[buffers.size()]); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < buffers.size(); ++i) { 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We assume that the browser created a new set of resources. 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!tracker->PluginResourceForHostResource(buffers[i])); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resources[i] = ppapi::proxy::PPB_Buffer_Proxy::AddProxyResource( 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffers[i], handles[i], buffer_size); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffer_in_use_ = std::vector<bool>(buffers.size()); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CallWhileUnlocked(ppp_video_capture_impl_->OnDeviceInfo, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_instance(), 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource(), 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &info, 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffers.size(), 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resources.get()); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < buffers.size(); ++i) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracker->ReleaseResource(resources[i]); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::OnPluginMsgOnStatus( 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params, 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t status) { 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (status) { 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_VIDEO_CAPTURE_STATUS_STARTING: 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_VIDEO_CAPTURE_STATUS_STOPPING: 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Those states are not sent by the browser. 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ppp_video_capture_impl_) { 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CallWhileUnlocked(ppp_video_capture_impl_->OnStatus, 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_instance(), 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource(), 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::OnPluginMsgOnError( 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params, 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t error_code) { 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_state_ = CLOSED; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ppp_video_capture_impl_) { 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CallWhileUnlocked(ppp_video_capture_impl_->OnError, 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_instance(), 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource(), 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_code); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::OnPluginMsgOnBufferReady( 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params, 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t buffer) { 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetBufferInUse(buffer); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ppp_video_capture_impl_) { 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CallWhileUnlocked(ppp_video_capture_impl_->OnBufferReady, 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_instance(), 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource(), 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffer); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::OnPluginMsgOpenReply( 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params) { 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_state_ == BEFORE_OPEN && params.result() == PP_OK) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_state_ = OPENED; 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The callback may have been aborted by Close(). 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (TrackedCallback::IsPending(open_callback_)) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_callback_->Run(params.result()); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::SetBufferInUse(uint32_t buffer_index) { 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(buffer_index < buffer_in_use_.size()); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffer_in_use_[buffer_index] = true; 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace proxy 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ppapi 235