Home | History | Annotate | Download | only in dev
      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/cpp/dev/video_capture_dev.h"
      6 
      7 #include "ppapi/c/dev/ppb_video_capture_dev.h"
      8 #include "ppapi/c/pp_errors.h"
      9 #include "ppapi/cpp/dev/resource_array_dev.h"
     10 #include "ppapi/cpp/instance_handle.h"
     11 #include "ppapi/cpp/module_impl.h"
     12 
     13 namespace pp {
     14 
     15 namespace {
     16 
     17 template <> const char* interface_name<PPB_VideoCapture_Dev_0_2>() {
     18   return PPB_VIDEOCAPTURE_DEV_INTERFACE_0_2;
     19 }
     20 
     21 template <> const char* interface_name<PPB_VideoCapture_Dev_0_3>() {
     22   return PPB_VIDEOCAPTURE_DEV_INTERFACE_0_3;
     23 }
     24 
     25 }  // namespace
     26 
     27 VideoCapture_Dev::VideoCapture_Dev(const InstanceHandle& instance) {
     28   if (has_interface<PPB_VideoCapture_Dev_0_3>()) {
     29     PassRefFromConstructor(get_interface<PPB_VideoCapture_Dev_0_3>()->Create(
     30         instance.pp_instance()));
     31   } else if (has_interface<PPB_VideoCapture_Dev_0_2>()) {
     32     PassRefFromConstructor(get_interface<PPB_VideoCapture_Dev_0_2>()->Create(
     33         instance.pp_instance()));
     34   }
     35 }
     36 
     37 VideoCapture_Dev::VideoCapture_Dev(PP_Resource resource)
     38     : Resource(resource) {
     39 }
     40 
     41 VideoCapture_Dev::~VideoCapture_Dev() {
     42 }
     43 
     44 // static
     45 bool VideoCapture_Dev::IsAvailable() {
     46   return has_interface<PPB_VideoCapture_Dev_0_3>() ||
     47          has_interface<PPB_VideoCapture_Dev_0_2>();
     48 }
     49 
     50 int32_t VideoCapture_Dev::EnumerateDevices(
     51     const CompletionCallbackWithOutput<std::vector<DeviceRef_Dev> >& callback) {
     52   if (has_interface<PPB_VideoCapture_Dev_0_3>()) {
     53     return get_interface<PPB_VideoCapture_Dev_0_3>()->EnumerateDevices(
     54         pp_resource(), callback.output(), callback.pp_completion_callback());
     55   }
     56 
     57   if (has_interface<PPB_VideoCapture_Dev_0_2>()) {
     58     if (!callback.pp_completion_callback().func)
     59       return callback.MayForce(PP_ERROR_BLOCKS_MAIN_THREAD);
     60 
     61     // ArrayOutputCallbackConverter is responsible to delete it.
     62     ResourceArray_Dev::ArrayOutputCallbackData* data =
     63         new ResourceArray_Dev::ArrayOutputCallbackData(
     64             callback.output(), callback.pp_completion_callback());
     65     return get_interface<PPB_VideoCapture_Dev_0_2>()->EnumerateDevices(
     66         pp_resource(), &data->resource_array_output,
     67         PP_MakeCompletionCallback(
     68             &ResourceArray_Dev::ArrayOutputCallbackConverter, data));
     69   }
     70 
     71   return callback.MayForce(PP_ERROR_NOINTERFACE);
     72 }
     73 
     74 int32_t VideoCapture_Dev::MonitorDeviceChange(
     75     PP_MonitorDeviceChangeCallback callback,
     76     void* user_data) {
     77   if (has_interface<PPB_VideoCapture_Dev_0_3>()) {
     78     return get_interface<PPB_VideoCapture_Dev_0_3>()->MonitorDeviceChange(
     79         pp_resource(), callback, user_data);
     80   }
     81 
     82   return PP_ERROR_NOINTERFACE;
     83 }
     84 
     85 int32_t VideoCapture_Dev::Open(
     86     const DeviceRef_Dev& device_ref,
     87     const PP_VideoCaptureDeviceInfo_Dev& requested_info,
     88     uint32_t buffer_count,
     89     const CompletionCallback& callback) {
     90   if (has_interface<PPB_VideoCapture_Dev_0_3>()) {
     91     return get_interface<PPB_VideoCapture_Dev_0_3>()->Open(
     92         pp_resource(), device_ref.pp_resource(), &requested_info, buffer_count,
     93         callback.pp_completion_callback());
     94   }
     95   if (has_interface<PPB_VideoCapture_Dev_0_2>()) {
     96     return get_interface<PPB_VideoCapture_Dev_0_2>()->Open(
     97         pp_resource(), device_ref.pp_resource(), &requested_info, buffer_count,
     98         callback.pp_completion_callback());
     99   }
    100 
    101   return callback.MayForce(PP_ERROR_NOINTERFACE);
    102 }
    103 
    104 int32_t VideoCapture_Dev::StartCapture() {
    105   if (has_interface<PPB_VideoCapture_Dev_0_3>()) {
    106     return get_interface<PPB_VideoCapture_Dev_0_3>()->StartCapture(
    107         pp_resource());
    108   }
    109   if (has_interface<PPB_VideoCapture_Dev_0_2>()) {
    110     return get_interface<PPB_VideoCapture_Dev_0_2>()->StartCapture(
    111         pp_resource());
    112   }
    113 
    114   return PP_ERROR_NOINTERFACE;
    115 }
    116 
    117 int32_t VideoCapture_Dev::ReuseBuffer(uint32_t buffer) {
    118   if (has_interface<PPB_VideoCapture_Dev_0_3>()) {
    119     return get_interface<PPB_VideoCapture_Dev_0_3>()->ReuseBuffer(pp_resource(),
    120                                                                   buffer);
    121   }
    122   if (has_interface<PPB_VideoCapture_Dev_0_2>()) {
    123     return get_interface<PPB_VideoCapture_Dev_0_2>()->ReuseBuffer(pp_resource(),
    124                                                                   buffer);
    125   }
    126 
    127   return PP_ERROR_NOINTERFACE;
    128 }
    129 
    130 int32_t VideoCapture_Dev::StopCapture() {
    131   if (has_interface<PPB_VideoCapture_Dev_0_3>()) {
    132     return get_interface<PPB_VideoCapture_Dev_0_3>()->StopCapture(
    133         pp_resource());
    134   }
    135   if (has_interface<PPB_VideoCapture_Dev_0_2>()) {
    136     return get_interface<PPB_VideoCapture_Dev_0_2>()->StopCapture(
    137         pp_resource());
    138   }
    139 
    140   return PP_ERROR_NOINTERFACE;
    141 }
    142 
    143 void VideoCapture_Dev::Close() {
    144   if (has_interface<PPB_VideoCapture_Dev_0_3>()) {
    145     get_interface<PPB_VideoCapture_Dev_0_3>()->Close(pp_resource());
    146   } else if (has_interface<PPB_VideoCapture_Dev_0_2>()) {
    147     get_interface<PPB_VideoCapture_Dev_0_2>()->Close(pp_resource());
    148   }
    149 }
    150 
    151 }  // namespace pp
    152