blob: 28cc9afccd01f9ebe5b2bcc8151a3848398c98e2 [file] [log] [blame]
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001/*
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 "NdkCameraManager"
19#define ATRACE_TAG ATRACE_TAG_CAMERA
20
21#include <utils/Log.h>
22#include <utils/Trace.h>
23
Colin Cross7e8d4ba2017-05-04 16:17:42 -070024#include <camera/NdkCameraManager.h>
Jayant Chowdhary6df26072018-11-06 23:55:12 -080025
26#ifdef __ANDROID_VNDK__
27#include "ndk_vendor/impl/ACameraManager.h"
28#else
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080029#include "impl/ACameraManager.h"
Jyoti Bhayana1f9600b2024-10-29 20:25:32 -070030#include <com_android_internal_camera_flags.h>
31namespace flags = com::android::internal::camera::flags;
Jayant Chowdhary6df26072018-11-06 23:55:12 -080032#endif
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -070033#include "impl/ACameraMetadata.h"
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080034
Jayant Chowdhary6df26072018-11-06 23:55:12 -080035using namespace android::acam;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080036
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080037EXPORT
38ACameraManager* ACameraManager_create() {
39 ATRACE_CALL();
40 return new ACameraManager();
41}
42
43EXPORT
44void ACameraManager_delete(ACameraManager* manager) {
45 ATRACE_CALL();
46 if (manager != nullptr) {
47 delete manager;
48 }
49}
50
51EXPORT
52camera_status_t ACameraManager_getCameraIdList(
53 ACameraManager* manager, ACameraIdList** cameraIdList) {
54 ATRACE_CALL();
55 if (manager == nullptr || cameraIdList == nullptr) {
Yin-Chia Yehead91462016-01-06 16:45:08 -080056 ALOGE("%s: invalid argument! manager %p, cameraIdList %p",
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080057 __FUNCTION__, manager, cameraIdList);
58 return ACAMERA_ERROR_INVALID_PARAMETER;
59 }
60 return manager->getCameraIdList(cameraIdList);
61}
62
63EXPORT
64void ACameraManager_deleteCameraIdList(ACameraIdList* cameraIdList) {
65 ATRACE_CALL();
66 if (cameraIdList != nullptr) {
67 ACameraManager::deleteCameraIdList(cameraIdList);
68 }
69}
70
71EXPORT
72camera_status_t ACameraManager_registerAvailabilityCallback(
Jan Sebechlebsky952e3c42024-04-05 13:13:11 +020073 ACameraManager* manager, const ACameraManager_AvailabilityCallbacks* callback) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080074 ATRACE_CALL();
75 if (callback == nullptr) {
76 ALOGE("%s: invalid argument! callback is null!", __FUNCTION__);
77 return ACAMERA_ERROR_INVALID_PARAMETER;
78 }
79 if (callback->onCameraAvailable == nullptr || callback->onCameraUnavailable == nullptr) {
Yin-Chia Yehead91462016-01-06 16:45:08 -080080 ALOGE("%s: invalid argument! callback %p, "
81 "onCameraAvailable %p, onCameraUnavailable %p",
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080082 __FUNCTION__, callback,
83 callback->onCameraAvailable, callback->onCameraUnavailable);
84 return ACAMERA_ERROR_INVALID_PARAMETER;
85 }
Jan Sebechlebsky952e3c42024-04-05 13:13:11 +020086 manager->registerAvailabilityCallback(callback);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080087 return ACAMERA_OK;
88}
89
90EXPORT
91camera_status_t ACameraManager_unregisterAvailabilityCallback(
Jan Sebechlebsky952e3c42024-04-05 13:13:11 +020092 ACameraManager* manager, const ACameraManager_AvailabilityCallbacks* callback) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080093 ATRACE_CALL();
94 if (callback == nullptr) {
95 ALOGE("%s: invalid argument! callback is null!", __FUNCTION__);
96 return ACAMERA_ERROR_INVALID_PARAMETER;
97 }
98 if (callback->onCameraAvailable == nullptr || callback->onCameraUnavailable == nullptr) {
Yin-Chia Yehead91462016-01-06 16:45:08 -080099 ALOGE("%s: invalid argument! callback %p, "
100 "onCameraAvailable %p, onCameraUnavailable %p",
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800101 __FUNCTION__, callback,
102 callback->onCameraAvailable, callback->onCameraUnavailable);
103 return ACAMERA_ERROR_INVALID_PARAMETER;
104 }
Jan Sebechlebsky952e3c42024-04-05 13:13:11 +0200105 manager->unregisterAvailabilityCallback(callback);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800106 return ACAMERA_OK;
107}
108
109EXPORT
Emilian Peevc6f2ab32019-03-04 11:18:59 -0800110camera_status_t ACameraManager_registerExtendedAvailabilityCallback(
Jan Sebechlebsky952e3c42024-04-05 13:13:11 +0200111 ACameraManager* manager, const ACameraManager_ExtendedAvailabilityCallbacks* callback) {
Emilian Peevc6f2ab32019-03-04 11:18:59 -0800112 ATRACE_CALL();
113 if (callback == nullptr) {
114 ALOGE("%s: invalid argument! callback is null!", __FUNCTION__);
115 return ACAMERA_ERROR_INVALID_PARAMETER;
116 }
117 if ((callback->availabilityCallbacks.onCameraAvailable == nullptr) ||
118 (callback->availabilityCallbacks.onCameraUnavailable == nullptr) ||
119 (callback->onCameraAccessPrioritiesChanged == nullptr)) {
120 ALOGE("%s: invalid argument! callback %p, "
121 "onCameraAvailable %p, onCameraUnavailable %p onCameraAccessPrioritiesChanged %p",
122 __FUNCTION__, callback,
123 callback->availabilityCallbacks.onCameraAvailable,
124 callback->availabilityCallbacks.onCameraUnavailable,
125 callback->onCameraAccessPrioritiesChanged);
126 return ACAMERA_ERROR_INVALID_PARAMETER;
127 }
128 auto reservedEntriesCount = sizeof(callback->reserved) / sizeof(callback->reserved[0]);
129 for (size_t i = 0; i < reservedEntriesCount; i++) {
130 if (callback->reserved[i] != nullptr) {
131 ALOGE("%s: invalid argument! callback reserved entries must be set to NULL",
132 __FUNCTION__);
133 return ACAMERA_ERROR_INVALID_PARAMETER;
134 }
135 }
Jan Sebechlebsky952e3c42024-04-05 13:13:11 +0200136 manager->registerExtendedAvailabilityCallback(callback);
Emilian Peevc6f2ab32019-03-04 11:18:59 -0800137 return ACAMERA_OK;
138}
139
140EXPORT
141camera_status_t ACameraManager_unregisterExtendedAvailabilityCallback(
Jan Sebechlebsky952e3c42024-04-05 13:13:11 +0200142 ACameraManager* manager, const ACameraManager_ExtendedAvailabilityCallbacks* callback) {
Emilian Peevc6f2ab32019-03-04 11:18:59 -0800143 ATRACE_CALL();
144 if (callback == nullptr) {
145 ALOGE("%s: invalid argument! callback is null!", __FUNCTION__);
146 return ACAMERA_ERROR_INVALID_PARAMETER;
147 }
148 if ((callback->availabilityCallbacks.onCameraAvailable == nullptr) ||
149 (callback->availabilityCallbacks.onCameraUnavailable == nullptr) ||
150 (callback->onCameraAccessPrioritiesChanged == nullptr)) {
151 ALOGE("%s: invalid argument! callback %p, "
152 "onCameraAvailable %p, onCameraUnavailable %p onCameraAccessPrioritiesChanged %p",
153 __FUNCTION__, callback,
154 callback->availabilityCallbacks.onCameraAvailable,
155 callback->availabilityCallbacks.onCameraUnavailable,
156 callback->onCameraAccessPrioritiesChanged);
157 return ACAMERA_ERROR_INVALID_PARAMETER;
158 }
Jan Sebechlebsky952e3c42024-04-05 13:13:11 +0200159 manager->unregisterExtendedAvailabilityCallback(callback);
Emilian Peevc6f2ab32019-03-04 11:18:59 -0800160 return ACAMERA_OK;
161}
162
163EXPORT
Jyoti Bhayana1f9600b2024-10-29 20:25:32 -0700164camera_status_t ACameraManager_isCameraDeviceSharingSupported(ACameraManager *mgr,
165 const char *cameraId, bool *isSharingSupported) {
166 ATRACE_CALL();
167 #ifndef __ANDROID_VNDK__
168 if (!flags::camera_multi_client()) {
169 return ACAMERA_ERROR_UNSUPPORTED_OPERATION;
170 }
171 #endif
172 if (mgr == nullptr || cameraId == nullptr || isSharingSupported == nullptr) {
173 ALOGE("%s: invalid argument! mgr %p cameraId %p isSharingSupported %p",
174 __FUNCTION__, mgr, cameraId, isSharingSupported);
175 return ACAMERA_ERROR_INVALID_PARAMETER;
176 }
177 return mgr->isCameraDeviceSharingSupported(cameraId, isSharingSupported);
178}
179
180EXPORT
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800181camera_status_t ACameraManager_getCameraCharacteristics(
182 ACameraManager* mgr, const char* cameraId, ACameraMetadata** chars){
183 ATRACE_CALL();
184 if (mgr == nullptr || cameraId == nullptr || chars == nullptr) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800185 ALOGE("%s: invalid argument! mgr %p cameraId %p chars %p",
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800186 __FUNCTION__, mgr, cameraId, chars);
187 return ACAMERA_ERROR_INVALID_PARAMETER;
188 }
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700189 sp<ACameraMetadata> spChars;
190 camera_status_t status = mgr->getCameraCharacteristics(cameraId, &spChars);
191 if (status != ACAMERA_OK) {
192 return status;
193 }
194 spChars->incStrong((void*) ACameraManager_getCameraCharacteristics);
195 *chars = spChars.get();
196 return ACAMERA_OK;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800197}
198
199EXPORT
200camera_status_t ACameraManager_openCamera(
201 ACameraManager* mgr, const char* cameraId,
202 ACameraDevice_StateCallbacks* callback,
203 /*out*/ACameraDevice** device) {
204 ATRACE_CALL();
205 if (mgr == nullptr || cameraId == nullptr || callback == nullptr || device == nullptr) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800206 ALOGE("%s: invalid argument! mgr %p cameraId %p callback %p device %p",
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800207 __FUNCTION__, mgr, cameraId, callback, device);
208 return ACAMERA_ERROR_INVALID_PARAMETER;
209 }
Jyoti Bhayana1f9600b2024-10-29 20:25:32 -0700210 bool primaryClient;
211 return mgr->openCamera(cameraId, /*sharedMode*/false, callback, device, &primaryClient);
212}
213
214EXPORT
215camera_status_t ACameraManager_openSharedCamera(
216 ACameraManager* mgr, const char* cameraId, ACameraDevice_StateCallbacks* callback,
217 /*out*/ACameraDevice** device, /*out*/bool* primaryClient) {
218 ATRACE_CALL();
219 #ifndef __ANDROID_VNDK__
220 if (!flags::camera_multi_client()) {
221 return ACAMERA_ERROR_UNSUPPORTED_OPERATION;
222 }
223 #endif
224 if (mgr == nullptr || cameraId == nullptr || callback == nullptr || device == nullptr ||
225 primaryClient == nullptr) {
226 ALOGE("%s: invalid argument! mgr %p cameraId %p callback %p device %p primary %p",
227 __FUNCTION__, mgr, cameraId, callback, device, primaryClient);
228 return ACAMERA_ERROR_INVALID_PARAMETER;
229 }
230 return mgr->openCamera(cameraId, /*sharedMode*/true, callback, device, primaryClient);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800231}
Jayant Chowdharyb16194d2019-04-19 16:04:01 -0700232
233#ifdef __ANDROID_VNDK__
234EXPORT
235camera_status_t ACameraManager_getTagFromName(ACameraManager *mgr, const char* cameraId,
236 const char *name, /*out*/uint32_t *tag) {
237 ATRACE_CALL();
238 if (mgr == nullptr || cameraId == nullptr || name == nullptr) {
239 ALOGE("%s: invalid argument! mgr %p cameraId %p name %p",
240 __FUNCTION__, mgr, cameraId, name);
241 return ACAMERA_ERROR_INVALID_PARAMETER;
242 }
243 return mgr->getTagFromName(cameraId, name, tag);
244}
245#endif