1 /*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 //#define LOG_NDEBUG 0
18 #define LOG_TAG "NdkCameraDevice"
19 #define ATRACE_TAG ATRACE_TAG_CAMERA
20
21 #include <utils/Log.h>
22 #include <utils/Trace.h>
23
24 #include <camera/NdkCameraDevice.h>
25
26 #include "impl/ACameraCaptureSession.h"
27
28 using namespace android::acam;
29
30 EXPORT
ACameraDevice_close(ACameraDevice * device)31 camera_status_t ACameraDevice_close(ACameraDevice* device) {
32 ATRACE_CALL();
33 if (device == nullptr) {
34 ALOGE("%s: invalid argument! device is null", __FUNCTION__);
35 return ACAMERA_ERROR_INVALID_PARAMETER;
36 }
37 delete device;
38 return ACAMERA_OK;
39 }
40
41 EXPORT
ACameraDevice_getId(const ACameraDevice * device)42 const char* ACameraDevice_getId(const ACameraDevice* device) {
43 ATRACE_CALL();
44 if (device == nullptr) {
45 ALOGE("%s: invalid argument! device is null", __FUNCTION__);
46 return nullptr;
47 }
48 return device->getId();
49 }
50
51 EXPORT
ACameraDevice_createCaptureRequest(const ACameraDevice * device,ACameraDevice_request_template templateId,ACaptureRequest ** request)52 camera_status_t ACameraDevice_createCaptureRequest(
53 const ACameraDevice* device,
54 ACameraDevice_request_template templateId,
55 ACaptureRequest** request) {
56 ATRACE_CALL();
57 if (device == nullptr || request == nullptr) {
58 ALOGE("%s: invalid argument! device %p request %p",
59 __FUNCTION__, device, request);
60 return ACAMERA_ERROR_INVALID_PARAMETER;
61 }
62 if (device->isSharedMode() && !device->isPrimaryClient()) {
63 return ACAMERA_ERROR_UNSUPPORTED_OPERATION;
64 }
65 switch (templateId) {
66 case TEMPLATE_PREVIEW:
67 case TEMPLATE_STILL_CAPTURE:
68 case TEMPLATE_RECORD:
69 case TEMPLATE_VIDEO_SNAPSHOT:
70 case TEMPLATE_ZERO_SHUTTER_LAG:
71 case TEMPLATE_MANUAL:
72 break;
73 default:
74 ALOGE("%s: unknown template ID %d", __FUNCTION__, templateId);
75 return ACAMERA_ERROR_INVALID_PARAMETER;
76 }
77 return device->createCaptureRequest(templateId, nullptr /*physicalIdList*/, request);
78 }
79
80 EXPORT
ACameraDevice_createCaptureRequest_withPhysicalIds(const ACameraDevice * device,ACameraDevice_request_template templateId,const ACameraIdList * physicalCameraIdList,ACaptureRequest ** request)81 camera_status_t ACameraDevice_createCaptureRequest_withPhysicalIds(
82 const ACameraDevice* device,
83 ACameraDevice_request_template templateId,
84 const ACameraIdList* physicalCameraIdList,
85 ACaptureRequest** request) {
86 ATRACE_CALL();
87 if (device == nullptr || request == nullptr || physicalCameraIdList == nullptr) {
88 ALOGE("%s: invalid argument! device %p request %p, physicalCameraIdList %p",
89 __FUNCTION__, device, request, physicalCameraIdList);
90 return ACAMERA_ERROR_INVALID_PARAMETER;
91 }
92 if (device->isSharedMode() && !device->isPrimaryClient()) {
93 return ACAMERA_ERROR_UNSUPPORTED_OPERATION;
94 }
95 switch (templateId) {
96 case TEMPLATE_PREVIEW:
97 case TEMPLATE_STILL_CAPTURE:
98 case TEMPLATE_RECORD:
99 case TEMPLATE_VIDEO_SNAPSHOT:
100 case TEMPLATE_ZERO_SHUTTER_LAG:
101 case TEMPLATE_MANUAL:
102 break;
103 default:
104 ALOGE("%s: unknown template ID %d", __FUNCTION__, templateId);
105 return ACAMERA_ERROR_INVALID_PARAMETER;
106 }
107 return device->createCaptureRequest(templateId, physicalCameraIdList, request);
108 }
109
110 EXPORT
ACaptureSessionOutputContainer_create(ACaptureSessionOutputContainer ** out)111 camera_status_t ACaptureSessionOutputContainer_create(
112 /*out*/ACaptureSessionOutputContainer** out) {
113 ATRACE_CALL();
114 if (out == nullptr) {
115 ALOGE("%s: Error: out null", __FUNCTION__);
116 return ACAMERA_ERROR_INVALID_PARAMETER;
117 }
118 *out = new ACaptureSessionOutputContainer();
119 return ACAMERA_OK;
120 }
121
122 EXPORT
ACaptureSessionOutputContainer_free(ACaptureSessionOutputContainer * container)123 void ACaptureSessionOutputContainer_free(ACaptureSessionOutputContainer* container) {
124 ATRACE_CALL();
125 if (container != nullptr) {
126 delete container;
127 }
128 return;
129 }
130
131 EXPORT
ACaptureSessionOutput_create(ANativeWindow * window,ACaptureSessionOutput ** out)132 camera_status_t ACaptureSessionOutput_create(
133 ANativeWindow* window, /*out*/ACaptureSessionOutput** out) {
134 ATRACE_CALL();
135 if (window == nullptr || out == nullptr) {
136 ALOGE("%s: Error: bad argument. window %p, out %p",
137 __FUNCTION__, window, out);
138 return ACAMERA_ERROR_INVALID_PARAMETER;
139 }
140 *out = new ACaptureSessionOutput(window, false);
141 return ACAMERA_OK;
142 }
143
144 EXPORT
ACaptureSessionSharedOutput_create(ANativeWindow * window,ACaptureSessionOutput ** out)145 camera_status_t ACaptureSessionSharedOutput_create(
146 ANativeWindow* window, /*out*/ACaptureSessionOutput** out) {
147 ATRACE_CALL();
148 if (window == nullptr || out == nullptr) {
149 ALOGE("%s: Error: bad argument. window %p, out %p",
150 __FUNCTION__, window, out);
151 return ACAMERA_ERROR_INVALID_PARAMETER;
152 }
153 *out = new ACaptureSessionOutput(window, true);
154 return ACAMERA_OK;
155 }
156
157 EXPORT
ACaptureSessionPhysicalOutput_create(ANativeWindow * window,const char * physicalId,ACaptureSessionOutput ** out)158 camera_status_t ACaptureSessionPhysicalOutput_create(
159 ANativeWindow* window, const char* physicalId,
160 /*out*/ACaptureSessionOutput** out) {
161 ATRACE_CALL();
162 if (window == nullptr || physicalId == nullptr || out == nullptr) {
163 ALOGE("%s: Error: bad argument. window %p, physicalId %p, out %p",
164 __FUNCTION__, window, physicalId, out);
165 return ACAMERA_ERROR_INVALID_PARAMETER;
166 }
167 *out = new ACaptureSessionOutput(window, false, physicalId);
168 return ACAMERA_OK;
169 }
170
171 EXPORT
ACaptureSessionSharedOutput_add(ACaptureSessionOutput * out,ANativeWindow * window)172 camera_status_t ACaptureSessionSharedOutput_add(ACaptureSessionOutput *out,
173 ANativeWindow* window) {
174 ATRACE_CALL();
175 if ((window == nullptr) || (out == nullptr)) {
176 ALOGE("%s: Error: bad argument. window %p, out %p",
177 __FUNCTION__, window, out);
178 return ACAMERA_ERROR_INVALID_PARAMETER;
179 }
180 if (!out->mIsShared) {
181 ALOGE("%s: Error trying to insert a new window in non-shared output configuration",
182 __FUNCTION__);
183 return ACAMERA_ERROR_INVALID_OPERATION;
184 }
185 if (out->isWindowEqual(window)) {
186 ALOGE("%s: Error trying to add the same window associated with the output configuration",
187 __FUNCTION__);
188 return ACAMERA_ERROR_INVALID_PARAMETER;
189 }
190
191
192 bool insert = out->addSharedWindow(window);
193 camera_status_t ret = (insert) ? ACAMERA_OK : ACAMERA_ERROR_INVALID_PARAMETER;
194 return ret;
195 }
196
197 EXPORT
ACaptureSessionSharedOutput_remove(ACaptureSessionOutput * out,ANativeWindow * window)198 camera_status_t ACaptureSessionSharedOutput_remove(ACaptureSessionOutput *out,
199 ANativeWindow* window) {
200 ATRACE_CALL();
201 if ((window == nullptr) || (out == nullptr)) {
202 ALOGE("%s: Error: bad argument. window %p, out %p",
203 __FUNCTION__, window, out);
204 return ACAMERA_ERROR_INVALID_PARAMETER;
205 }
206 if (!out->mIsShared) {
207 ALOGE("%s: Error trying to remove a window in non-shared output configuration",
208 __FUNCTION__);
209 return ACAMERA_ERROR_INVALID_OPERATION;
210 }
211 if (out->isWindowEqual(window)) {
212 ALOGE("%s: Error trying to remove the same window associated with the output configuration",
213 __FUNCTION__);
214 return ACAMERA_ERROR_INVALID_PARAMETER;
215 }
216
217 auto remove = out->removeSharedWindow(window);
218 camera_status_t ret = (remove) ? ACAMERA_OK : ACAMERA_ERROR_INVALID_PARAMETER;
219 return ret;
220 }
221
222 EXPORT
ACaptureSessionOutput_free(ACaptureSessionOutput * output)223 void ACaptureSessionOutput_free(ACaptureSessionOutput* output) {
224 ATRACE_CALL();
225 if (output != nullptr) {
226 delete output;
227 }
228 return;
229 }
230
231 EXPORT
ACaptureSessionOutputContainer_add(ACaptureSessionOutputContainer * container,const ACaptureSessionOutput * output)232 camera_status_t ACaptureSessionOutputContainer_add(
233 ACaptureSessionOutputContainer* container, const ACaptureSessionOutput* output) {
234 ATRACE_CALL();
235 if (container == nullptr || output == nullptr) {
236 ALOGE("%s: Error: invalid input: container %p, output %p",
237 __FUNCTION__, container, output);
238 return ACAMERA_ERROR_INVALID_PARAMETER;
239 }
240 auto pair = container->mOutputs.insert(*output);
241 if (!pair.second) {
242 ALOGW("%s: output %p already exists!", __FUNCTION__, output);
243 }
244 return ACAMERA_OK;
245 }
246
247 EXPORT
ACaptureSessionOutputContainer_remove(ACaptureSessionOutputContainer * container,const ACaptureSessionOutput * output)248 camera_status_t ACaptureSessionOutputContainer_remove(
249 ACaptureSessionOutputContainer* container, const ACaptureSessionOutput* output) {
250 ATRACE_CALL();
251 if (container == nullptr || output == nullptr) {
252 ALOGE("%s: Error: invalid input: container %p, output %p",
253 __FUNCTION__, container, output);
254 return ACAMERA_ERROR_INVALID_PARAMETER;
255 }
256 container->mOutputs.erase(*output);
257 return ACAMERA_OK;
258 }
259
260 EXPORT
ACameraDevice_createCaptureSession(ACameraDevice * device,const ACaptureSessionOutputContainer * outputs,const ACameraCaptureSession_stateCallbacks * callbacks,ACameraCaptureSession ** session)261 camera_status_t ACameraDevice_createCaptureSession(
262 ACameraDevice* device,
263 const ACaptureSessionOutputContainer* outputs,
264 const ACameraCaptureSession_stateCallbacks* callbacks,
265 /*out*/ACameraCaptureSession** session) {
266 ATRACE_CALL();
267 if (device == nullptr || outputs == nullptr || callbacks == nullptr || session == nullptr) {
268 ALOGE("%s: Error: invalid input: device %p, outputs %p, callbacks %p, session %p",
269 __FUNCTION__, device, outputs, callbacks, session);
270 return ACAMERA_ERROR_INVALID_PARAMETER;
271 }
272 return device->createCaptureSession(outputs, nullptr, callbacks, session);
273 }
274
275 EXPORT
ACameraDevice_createCaptureSessionWithSessionParameters(ACameraDevice * device,const ACaptureSessionOutputContainer * outputs,const ACaptureRequest * sessionParameters,const ACameraCaptureSession_stateCallbacks * callbacks,ACameraCaptureSession ** session)276 camera_status_t ACameraDevice_createCaptureSessionWithSessionParameters(
277 ACameraDevice* device,
278 const ACaptureSessionOutputContainer* outputs,
279 const ACaptureRequest* sessionParameters,
280 const ACameraCaptureSession_stateCallbacks* callbacks,
281 /*out*/ACameraCaptureSession** session) {
282 ATRACE_CALL();
283 if (device == nullptr || outputs == nullptr || callbacks == nullptr || session == nullptr) {
284 ALOGE("%s: Error: invalid input: device %p, outputs %p, callbacks %p, session %p",
285 __FUNCTION__, device, outputs, callbacks, session);
286 return ACAMERA_ERROR_INVALID_PARAMETER;
287 }
288 return device->createCaptureSession(outputs, sessionParameters, callbacks, session);
289 }
290
291 EXPORT
ACameraDevice_isSessionConfigurationSupported(const ACameraDevice * device,const ACaptureSessionOutputContainer * sessionOutputContainer)292 camera_status_t ACameraDevice_isSessionConfigurationSupported(
293 const ACameraDevice* device,
294 const ACaptureSessionOutputContainer* sessionOutputContainer) {
295 ATRACE_CALL();
296 if (device == nullptr || sessionOutputContainer == nullptr) {
297 ALOGE("%s: Error: invalid input: device %p, sessionOutputContainer %p",
298 __FUNCTION__, device, sessionOutputContainer);
299 return ACAMERA_ERROR_INVALID_PARAMETER;
300 }
301 return device->isSessionConfigurationSupported(sessionOutputContainer);
302 }
303