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