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) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_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()) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_END_MESSAGE_MAP() 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::EnumerateDevices0_2( 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Resource* devices, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return enumeration_helper_.EnumerateDevices0_2(devices, callback); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::EnumerateDevices( 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_ArrayOutput& output, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return enumeration_helper_.EnumerateDevices(output, callback); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::MonitorDeviceChange( 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_MonitorDeviceChangeCallback callback, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* user_data) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return enumeration_helper_.MonitorDeviceChange(callback, user_data); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::Open( 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_id, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_VideoCaptureDeviceInfo_Dev& requested_info, 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t buffer_count, 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_state_ != BEFORE_OPEN) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (TrackedCallback::IsPending(open_callback_)) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_INPROGRESS; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_callback_ = callback; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Call<PpapiPluginMsg_VideoCapture_OpenReply>( 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RENDERER, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_VideoCapture_Open(device_id, requested_info, buffer_count), 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&VideoCaptureResource::OnPluginMsgOpenReply, this)); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::StartCapture() { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_state_ != OPENED) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(RENDERER, PpapiHostMsg_VideoCapture_StartCapture()); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::ReuseBuffer(uint32_t buffer) { 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (buffer >= buffer_in_use_.size() || !buffer_in_use_[buffer]) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_BADARGUMENT; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(RENDERER, PpapiHostMsg_VideoCapture_ReuseBuffer(buffer)); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::StopCapture() { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_state_ != OPENED) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(RENDERER, PpapiHostMsg_VideoCapture_StopCapture()); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::Close() { 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_state_ == CLOSED) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(RENDERER, PpapiHostMsg_VideoCapture_Close()); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_state_ = CLOSED; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (TrackedCallback::IsPending(open_callback_)) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_callback_->PostAbort(); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t VideoCaptureResource::EnumerateDevicesSync( 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_ArrayOutput& devices) { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return enumeration_helper_.EnumerateDevicesSync(devices); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::LastPluginRefWasDeleted() { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enumeration_helper_.LastPluginRefWasDeleted(); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::OnPluginMsgOnDeviceInfo( 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const struct PP_VideoCaptureDeviceInfo_Dev& info, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<HostResource>& buffers, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t buffer_size) { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ppp_video_capture_impl_) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<base::SharedMemoryHandle> handles; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.TakeAllSharedMemoryHandles(&handles); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(handles.size() == buffers.size()); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginResourceTracker* tracker = 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginGlobals::Get()->plugin_resource_tracker(); 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<PP_Resource[]> resources(new PP_Resource[buffers.size()]); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < buffers.size(); ++i) { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We assume that the browser created a new set of resources. 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!tracker->PluginResourceForHostResource(buffers[i])); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resources[i] = ppapi::proxy::PPB_Buffer_Proxy::AddProxyResource( 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffers[i], handles[i], buffer_size); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffer_in_use_ = std::vector<bool>(buffers.size()); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CallWhileUnlocked(ppp_video_capture_impl_->OnDeviceInfo, 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_instance(), 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource(), 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &info, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<uint32_t>(buffers.size()), 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const_cast<const PP_Resource*>(resources.get())); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < buffers.size(); ++i) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracker->ReleaseResource(resources[i]); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::OnPluginMsgOnStatus( 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params, 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t status) { 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (status) { 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_VIDEO_CAPTURE_STATUS_STARTING: 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_VIDEO_CAPTURE_STATUS_STOPPING: 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Those states are not sent by the browser. 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ppp_video_capture_impl_) { 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CallWhileUnlocked(ppp_video_capture_impl_->OnStatus, 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_instance(), 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource(), 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::OnPluginMsgOnError( 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params, 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t error_code) { 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_state_ = CLOSED; 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ppp_video_capture_impl_) { 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CallWhileUnlocked(ppp_video_capture_impl_->OnError, 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_instance(), 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource(), 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_code); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::OnPluginMsgOnBufferReady( 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params, 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t buffer) { 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetBufferInUse(buffer); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ppp_video_capture_impl_) { 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CallWhileUnlocked(ppp_video_capture_impl_->OnBufferReady, 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_instance(), 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pp_resource(), 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffer); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::OnPluginMsgOpenReply( 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params) { 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (open_state_ == BEFORE_OPEN && params.result() == PP_OK) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_state_ = OPENED; 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The callback may have been aborted by Close(). 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (TrackedCallback::IsPending(open_callback_)) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_callback_->Run(params.result()); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void VideoCaptureResource::SetBufferInUse(uint32_t buffer_index) { 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(buffer_index < buffer_in_use_.size()); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffer_in_use_[buffer_index] = true; 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace proxy 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ppapi 241