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/c/pp_errors.h"
6#include "ppapi/shared_impl/ppb_device_ref_shared.h"
7#include "ppapi/shared_impl/tracked_callback.h"
8#include "ppapi/thunk/enter.h"
9#include "ppapi/thunk/ppb_device_ref_api.h"
10#include "ppapi/thunk/ppb_video_capture_api.h"
11#include "ppapi/thunk/resource_creation_api.h"
12#include "ppapi/thunk/thunk.h"
13
14namespace ppapi {
15namespace thunk {
16
17namespace {
18
19typedef EnterResource<PPB_VideoCapture_API> EnterVideoCapture;
20
21PP_Resource Create(PP_Instance instance) {
22  EnterResourceCreation enter(instance);
23  if (enter.failed())
24    return 0;
25  return enter.functions()->CreateVideoCapture(instance);
26}
27
28PP_Bool IsVideoCapture(PP_Resource resource) {
29  EnterVideoCapture enter(resource, false);
30  return PP_FromBool(enter.succeeded());
31}
32
33int32_t EnumerateDevices(PP_Resource video_capture,
34                         PP_ArrayOutput output,
35                         PP_CompletionCallback callback) {
36  EnterVideoCapture enter(video_capture, callback, true);
37  if (enter.failed())
38    return enter.retval();
39
40  return enter.SetResult(enter.object()->EnumerateDevices(output,
41                                                          enter.callback()));
42}
43
44int32_t MonitorDeviceChange(PP_Resource video_capture,
45                            PP_MonitorDeviceChangeCallback callback,
46                            void* user_data) {
47  EnterVideoCapture enter(video_capture, true);
48  if (enter.failed())
49    return enter.retval();
50  return enter.object()->MonitorDeviceChange(callback, user_data);
51}
52
53int32_t Open(PP_Resource video_capture,
54             PP_Resource device_ref,
55             const PP_VideoCaptureDeviceInfo_Dev* requested_info,
56             uint32_t buffer_count,
57             PP_CompletionCallback callback) {
58  EnterVideoCapture enter(video_capture, callback, true);
59  if (enter.failed())
60    return enter.retval();
61
62  std::string device_id;
63  // |device_id| remains empty if |device_ref| is 0, which means the default
64  // device.
65  if (device_ref != 0) {
66    EnterResourceNoLock<PPB_DeviceRef_API> enter_device_ref(device_ref, true);
67    if (enter_device_ref.failed())
68      return enter.SetResult(PP_ERROR_BADRESOURCE);
69    device_id = enter_device_ref.object()->GetDeviceRefData().id;
70  }
71
72  return enter.SetResult(enter.object()->Open(
73      device_id, *requested_info, buffer_count, enter.callback()));
74}
75
76int32_t StartCapture(PP_Resource video_capture) {
77  EnterVideoCapture enter(video_capture, true);
78  if (enter.failed())
79    return enter.retval();
80  return enter.object()->StartCapture();
81}
82
83int32_t ReuseBuffer(PP_Resource video_capture,
84                    uint32_t buffer) {
85  EnterVideoCapture enter(video_capture, true);
86  if (enter.failed())
87    return enter.retval();
88  return enter.object()->ReuseBuffer(buffer);
89}
90
91int32_t StopCapture(PP_Resource video_capture) {
92  EnterVideoCapture enter(video_capture, true);
93  if (enter.failed())
94    return enter.retval();
95  return enter.object()->StopCapture();
96}
97
98void Close(PP_Resource video_capture) {
99  EnterVideoCapture enter(video_capture, true);
100  if (enter.succeeded())
101    enter.object()->Close();
102}
103
104const PPB_VideoCapture_Dev_0_3 g_ppb_video_capture_0_3_thunk = {
105  &Create,
106  &IsVideoCapture,
107  &EnumerateDevices,
108  &MonitorDeviceChange,
109  &Open,
110  &StartCapture,
111  &ReuseBuffer,
112  &StopCapture,
113  &Close
114};
115
116}  // namespace
117
118const PPB_VideoCapture_Dev_0_3* GetPPB_VideoCapture_Dev_0_3_Thunk() {
119  return &g_ppb_video_capture_0_3_thunk;
120}
121
122}  // namespace thunk
123}  // namespace ppapi
124