• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
14 namespace ppapi {
15 namespace thunk {
16 
17 namespace {
18 
19 typedef EnterResource<PPB_VideoCapture_API> EnterVideoCapture;
20 
Create(PP_Instance instance)21 PP_Resource Create(PP_Instance instance) {
22   EnterResourceCreation enter(instance);
23   if (enter.failed())
24     return 0;
25   return enter.functions()->CreateVideoCapture(instance);
26 }
27 
IsVideoCapture(PP_Resource resource)28 PP_Bool IsVideoCapture(PP_Resource resource) {
29   EnterVideoCapture enter(resource, false);
30   return PP_FromBool(enter.succeeded());
31 }
32 
EnumerateDevices0_2(PP_Resource video_capture,PP_Resource * devices,PP_CompletionCallback callback)33 int32_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 
EnumerateDevices(PP_Resource video_capture,PP_ArrayOutput output,PP_CompletionCallback callback)44 int32_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 
MonitorDeviceChange(PP_Resource video_capture,PP_MonitorDeviceChangeCallback callback,void * user_data)55 int32_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 
Open(PP_Resource video_capture,PP_Resource device_ref,const PP_VideoCaptureDeviceInfo_Dev * requested_info,uint32_t buffer_count,PP_CompletionCallback callback)64 int32_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 
StartCapture(PP_Resource video_capture)87 int32_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 
ReuseBuffer(PP_Resource video_capture,uint32_t buffer)94 int32_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 
StopCapture(PP_Resource video_capture)102 int32_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 
Close(PP_Resource video_capture)109 void Close(PP_Resource video_capture) {
110   EnterVideoCapture enter(video_capture, true);
111   if (enter.succeeded())
112     enter.object()->Close();
113 }
114 
115 const 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 
126 const 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 
GetPPB_VideoCapture_Dev_0_2_Thunk()140 const PPB_VideoCapture_Dev_0_2* GetPPB_VideoCapture_Dev_0_2_Thunk() {
141   return &g_ppb_video_capture_0_2_thunk;
142 }
143 
GetPPB_VideoCapture_Dev_0_3_Thunk()144 const 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