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