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 EnumerateDevices0_2(PP_Resource video_capture,
34                            PP_Resource* devices,
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()->EnumerateDevices0_2(devices,
41                                                             enter.callback()));
42}
43
44int32_t EnumerateDevices(PP_Resource video_capture,
45                         PP_ArrayOutput output,
46                         PP_CompletionCallback callback) {
47  EnterVideoCapture enter(video_capture, callback, true);
48  if (enter.failed())
49    return enter.retval();
50
51  return enter.SetResult(enter.object()->EnumerateDevices(output,
52                                                          enter.callback()));
53}
54
55int32_t MonitorDeviceChange(PP_Resource video_capture,
56                            PP_MonitorDeviceChangeCallback callback,
57                            void* user_data) {
58  EnterVideoCapture enter(video_capture, true);
59  if (enter.failed())
60    return enter.retval();
61  return enter.object()->MonitorDeviceChange(callback, user_data);
62}
63
64int32_t Open(PP_Resource video_capture,
65             PP_Resource device_ref,
66             const PP_VideoCaptureDeviceInfo_Dev* requested_info,
67             uint32_t buffer_count,
68             PP_CompletionCallback callback) {
69  EnterVideoCapture enter(video_capture, callback, true);
70  if (enter.failed())
71    return enter.retval();
72
73  std::string device_id;
74  // |device_id| remains empty if |device_ref| is 0, which means the default
75  // device.
76  if (device_ref != 0) {
77    EnterResourceNoLock<PPB_DeviceRef_API> enter_device_ref(device_ref, true);
78    if (enter_device_ref.failed())
79      return enter.SetResult(PP_ERROR_BADRESOURCE);
80    device_id = enter_device_ref.object()->GetDeviceRefData().id;
81  }
82
83  return enter.SetResult(enter.object()->Open(
84      device_id, *requested_info, buffer_count, enter.callback()));
85}
86
87int32_t StartCapture(PP_Resource video_capture) {
88  EnterVideoCapture enter(video_capture, true);
89  if (enter.failed())
90    return enter.retval();
91  return enter.object()->StartCapture();
92}
93
94int32_t ReuseBuffer(PP_Resource video_capture,
95                    uint32_t buffer) {
96  EnterVideoCapture enter(video_capture, true);
97  if (enter.failed())
98    return enter.retval();
99  return enter.object()->ReuseBuffer(buffer);
100}
101
102int32_t StopCapture(PP_Resource video_capture) {
103  EnterVideoCapture enter(video_capture, true);
104  if (enter.failed())
105    return enter.retval();
106  return enter.object()->StopCapture();
107}
108
109void Close(PP_Resource video_capture) {
110  EnterVideoCapture enter(video_capture, true);
111  if (enter.succeeded())
112    enter.object()->Close();
113}
114
115const PPB_VideoCapture_Dev_0_2 g_ppb_video_capture_0_2_thunk = {
116  &Create,
117  &IsVideoCapture,
118  &EnumerateDevices0_2,
119  &Open,
120  &StartCapture,
121  &ReuseBuffer,
122  &StopCapture,
123  &Close
124};
125
126const PPB_VideoCapture_Dev_0_3 g_ppb_video_capture_0_3_thunk = {
127  &Create,
128  &IsVideoCapture,
129  &EnumerateDevices,
130  &MonitorDeviceChange,
131  &Open,
132  &StartCapture,
133  &ReuseBuffer,
134  &StopCapture,
135  &Close
136};
137
138}  // namespace
139
140const PPB_VideoCapture_Dev_0_2* GetPPB_VideoCapture_Dev_0_2_Thunk() {
141  return &g_ppb_video_capture_0_2_thunk;
142}
143
144const PPB_VideoCapture_Dev_0_3* GetPPB_VideoCapture_Dev_0_3_Thunk() {
145  return &g_ppb_video_capture_0_3_thunk;
146}
147
148}  // namespace thunk
149}  // namespace ppapi
150