blob: d8e5f3c0bd3be28f7857bed5998e25b5b5999593 [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 "ACameraManager"
19
20#include <memory>
21#include "ACameraManager.h"
22#include "ACameraMetadata.h"
23#include "ACameraDevice.h"
24#include <utils/Vector.h>
Ivan Podogovee844a82016-09-15 11:32:41 +010025#include <cutils/properties.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080026#include <stdlib.h>
Jayant Chowdharyf5b9cc62020-09-08 16:25:17 -070027#include <camera/CameraUtils.h>
Austin Borger0fb3ad92023-06-01 16:51:35 -070028#include <camera/StringUtils.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080029#include <camera/VendorTagDescriptor.h>
30
Jayant Chowdhary6df26072018-11-06 23:55:12 -080031using namespace android::acam;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080032
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080033namespace android {
Jayant Chowdhary6df26072018-11-06 23:55:12 -080034namespace acam {
Biswarup Pal37a75182024-01-16 15:53:35 +000035
36// TODO(b/291736219): Add device-awareness to ACameraManager.
37
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080038// Static member definitions
39const char* CameraManagerGlobal::kCameraIdKey = "CameraId";
Shuzhen Wang43858162020-01-10 13:42:15 -080040const char* CameraManagerGlobal::kPhysicalCameraIdKey = "PhysicalCameraId";
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080041const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp";
42const char* CameraManagerGlobal::kContextKey = "CallbackContext";
Shuzhen Wang7e540682020-04-10 13:30:25 -070043const nsecs_t CameraManagerGlobal::kCallbackDrainTimeout = 5000000; // 5 ms
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080044Mutex CameraManagerGlobal::sLock;
Avichal Rakeshf099b232022-10-27 15:44:50 -070045wp<CameraManagerGlobal> CameraManagerGlobal::sInstance = nullptr;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080046
Avichal Rakeshf099b232022-10-27 15:44:50 -070047sp<CameraManagerGlobal> CameraManagerGlobal::getInstance() {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080048 Mutex::Autolock _l(sLock);
Avichal Rakeshf099b232022-10-27 15:44:50 -070049 sp<CameraManagerGlobal> instance = sInstance.promote();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080050 if (instance == nullptr) {
51 instance = new CameraManagerGlobal();
52 sInstance = instance;
53 }
Avichal Rakeshf099b232022-10-27 15:44:50 -070054 return instance;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080055}
56
57CameraManagerGlobal::~CameraManagerGlobal() {
58 // clear sInstance so next getInstance call knows to create a new one
59 Mutex::Autolock _sl(sLock);
60 sInstance = nullptr;
61 Mutex::Autolock _l(mLock);
62 if (mCameraService != nullptr) {
63 IInterface::asBinder(mCameraService)->unlinkToDeath(mDeathNotifier);
Yin-Chia Yehead91462016-01-06 16:45:08 -080064 mCameraService->removeListener(mCameraServiceListener);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080065 }
66 mDeathNotifier.clear();
67 if (mCbLooper != nullptr) {
68 mCbLooper->unregisterHandler(mHandler->id());
69 mCbLooper->stop();
70 }
71 mCbLooper.clear();
72 mHandler.clear();
73 mCameraServiceListener.clear();
74 mCameraService.clear();
75}
76
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080077sp<hardware::ICameraService> CameraManagerGlobal::getCameraService() {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080078 Mutex::Autolock _l(mLock);
Jayant Chowdhary80f128b2019-10-30 16:13:31 -070079 return getCameraServiceLocked();
80}
81
82sp<hardware::ICameraService> CameraManagerGlobal::getCameraServiceLocked() {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080083 if (mCameraService.get() == nullptr) {
Jayant Chowdharyf5b9cc62020-09-08 16:25:17 -070084 if (CameraUtils::isCameraServiceDisabled()) {
Ivan Podogovee844a82016-09-15 11:32:41 +010085 return mCameraService;
86 }
87
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080088 sp<IServiceManager> sm = defaultServiceManager();
89 sp<IBinder> binder;
90 do {
Austin Borger0fb3ad92023-06-01 16:51:35 -070091 binder = sm->getService(toString16(kCameraServiceName));
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080092 if (binder != nullptr) {
93 break;
94 }
95 ALOGW("CameraService not published, waiting...");
96 usleep(kCameraServicePollDelay);
97 } while(true);
98 if (mDeathNotifier == nullptr) {
99 mDeathNotifier = new DeathNotifier(this);
100 }
101 binder->linkToDeath(mDeathNotifier);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800102 mCameraService = interface_cast<hardware::ICameraService>(binder);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800103
104 // Setup looper thread to perfrom availiability callbacks
105 if (mCbLooper == nullptr) {
106 mCbLooper = new ALooper;
107 mCbLooper->setName("C2N-mgr-looper");
Eino-Ville Talvala02bf0322016-02-18 12:41:10 -0800108 status_t err = mCbLooper->start(
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800109 /*runOnCallingThread*/false,
110 /*canCallJava*/ true,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800111 PRIORITY_DEFAULT);
Eino-Ville Talvala02bf0322016-02-18 12:41:10 -0800112 if (err != OK) {
113 ALOGE("%s: Unable to start camera service listener looper: %s (%d)",
114 __FUNCTION__, strerror(-err), err);
115 mCbLooper.clear();
116 return nullptr;
117 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800118 if (mHandler == nullptr) {
Shuzhen Wang7e540682020-04-10 13:30:25 -0700119 mHandler = new CallbackHandler(this);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800120 }
121 mCbLooper->registerHandler(mHandler);
122 }
123
124 // register ICameraServiceListener
125 if (mCameraServiceListener == nullptr) {
126 mCameraServiceListener = new CameraServiceListener(this);
127 }
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800128 std::vector<hardware::CameraStatus> cameraStatuses{};
129 mCameraService->addListener(mCameraServiceListener, &cameraStatuses);
130 for (auto& c : cameraStatuses) {
Biswarup Pal37a75182024-01-16 15:53:35 +0000131 // Skip callback for cameras not belonging to the default device, as NDK doesn't support
132 // device awareness yet.
133 if (c.deviceId != kDefaultDeviceId) {
134 continue;
135 }
136
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800137 onStatusChangedLocked(c.status, c.cameraId);
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800138
139 for (auto& unavailablePhysicalId : c.unavailablePhysicalIds) {
140 onStatusChangedLocked(hardware::ICameraServiceListener::STATUS_NOT_PRESENT,
141 c.cameraId, unavailablePhysicalId);
142 }
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800143 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800144
145 // setup vendor tags
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800146 sp<VendorTagDescriptor> desc = new VendorTagDescriptor();
147 binder::Status ret = mCameraService->getCameraVendorTagDescriptor(/*out*/desc.get());
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800148
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800149 if (ret.isOk()) {
Emilian Peev71c73a22017-03-21 16:35:51 +0000150 if (0 < desc->getTagCount()) {
151 status_t err = VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc);
152 if (err != OK) {
153 ALOGE("%s: Failed to set vendor tag descriptors, received error %s (%d)",
154 __FUNCTION__, strerror(-err), err);
155 }
156 } else {
157 sp<VendorTagDescriptorCache> cache =
158 new VendorTagDescriptorCache();
159 binder::Status res =
160 mCameraService->getCameraVendorTagCache(
161 /*out*/cache.get());
162 if (res.serviceSpecificErrorCode() ==
163 hardware::ICameraService::ERROR_DISCONNECTED) {
164 // No camera module available, not an error on devices with no cameras
165 VendorTagDescriptorCache::clearGlobalVendorTagCache();
166 } else if (res.isOk()) {
167 status_t err =
168 VendorTagDescriptorCache::setAsGlobalVendorTagCache(
169 cache);
170 if (err != OK) {
171 ALOGE("%s: Failed to set vendor tag cache,"
172 "received error %s (%d)", __FUNCTION__,
173 strerror(-err), err);
174 }
175 } else {
176 VendorTagDescriptorCache::clearGlobalVendorTagCache();
177 ALOGE("%s: Failed to setup vendor tag cache: %s",
Tomasz Wasilczyk12b04a52023-08-11 15:52:22 +0000178 __FUNCTION__, res.toString8().c_str());
Emilian Peev71c73a22017-03-21 16:35:51 +0000179 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800180 }
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800181 } else if (ret.serviceSpecificErrorCode() ==
182 hardware::ICameraService::ERROR_DEPRECATED_HAL) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800183 ALOGW("%s: Camera HAL too old; does not support vendor tags",
184 __FUNCTION__);
185 VendorTagDescriptor::clearGlobalVendorTagDescriptor();
186 } else {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800187 ALOGE("%s: Failed to get vendor tag descriptors: %s",
Tomasz Wasilczyk12b04a52023-08-11 15:52:22 +0000188 __FUNCTION__, ret.toString8().c_str());
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800189 }
190 }
191 ALOGE_IF(mCameraService == nullptr, "no CameraService!?");
192 return mCameraService;
193}
194
195void CameraManagerGlobal::DeathNotifier::binderDied(const wp<IBinder>&)
196{
197 ALOGE("Camera service binderDied!");
198 sp<CameraManagerGlobal> cm = mCameraManager.promote();
199 if (cm != nullptr) {
200 AutoMutex lock(cm->mLock);
Austin Borger0fb3ad92023-06-01 16:51:35 -0700201 std::vector<std::string> cameraIdList;
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800202 for (auto& pair : cm->mDeviceStatusMap) {
Rucha Katakwarc6e64012021-08-12 06:32:42 +0000203 cameraIdList.push_back(pair.first);
204 }
205
Austin Borger0fb3ad92023-06-01 16:51:35 -0700206 for (const std::string& cameraId : cameraIdList) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800207 cm->onStatusChangedLocked(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800208 CameraServiceListener::STATUS_NOT_PRESENT, cameraId);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800209 }
210 cm->mCameraService.clear();
211 // TODO: consider adding re-connect call here?
212 }
213}
214
Emilian Peevc6f2ab32019-03-04 11:18:59 -0800215void CameraManagerGlobal::registerExtendedAvailabilityCallback(
216 const ACameraManager_ExtendedAvailabilityCallbacks *callback) {
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800217 return registerAvailCallback<ACameraManager_ExtendedAvailabilityCallbacks>(callback);
Emilian Peevc6f2ab32019-03-04 11:18:59 -0800218}
219
220void CameraManagerGlobal::unregisterExtendedAvailabilityCallback(
221 const ACameraManager_ExtendedAvailabilityCallbacks *callback) {
222 Mutex::Autolock _l(mLock);
Shuzhen Wang7e540682020-04-10 13:30:25 -0700223
224 drainPendingCallbacksLocked();
225
Emilian Peevc6f2ab32019-03-04 11:18:59 -0800226 Callback cb(callback);
227 mCallbacks.erase(cb);
228}
229
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800230void CameraManagerGlobal::registerAvailabilityCallback(
231 const ACameraManager_AvailabilityCallbacks *callback) {
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800232 return registerAvailCallback<ACameraManager_AvailabilityCallbacks>(callback);
233}
234
235void CameraManagerGlobal::unregisterAvailabilityCallback(
236 const ACameraManager_AvailabilityCallbacks *callback) {
237 Mutex::Autolock _l(mLock);
Shuzhen Wang7e540682020-04-10 13:30:25 -0700238
239 drainPendingCallbacksLocked();
240
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800241 Callback cb(callback);
242 mCallbacks.erase(cb);
243}
244
Shuzhen Wang7e540682020-04-10 13:30:25 -0700245void CameraManagerGlobal::onCallbackCalled() {
246 Mutex::Autolock _l(mLock);
247 if (mPendingCallbackCnt > 0) {
248 mPendingCallbackCnt--;
249 }
250 mCallbacksCond.signal();
251}
252
253void CameraManagerGlobal::drainPendingCallbacksLocked() {
254 while (mPendingCallbackCnt > 0) {
255 auto res = mCallbacksCond.waitRelative(mLock, kCallbackDrainTimeout);
256 if (res != NO_ERROR) {
257 ALOGE("%s: Error waiting to drain callbacks: %s(%d)",
258 __FUNCTION__, strerror(-res), res);
259 break;
260 }
261 }
262}
263
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800264template<class T>
265void CameraManagerGlobal::registerAvailCallback(const T *callback) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800266 Mutex::Autolock _l(mLock);
Kwangkyu Park01f84432023-09-15 17:08:17 +0900267 getCameraServiceLocked();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800268 Callback cb(callback);
269 auto pair = mCallbacks.insert(cb);
270 // Send initial callbacks if callback is newly registered
271 if (pair.second) {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800272 for (auto& pair : mDeviceStatusMap) {
Austin Borger0fb3ad92023-06-01 16:51:35 -0700273 const std::string& cameraId = pair.first;
Shuzhen Wang43858162020-01-10 13:42:15 -0800274 int32_t status = pair.second.getStatus();
Jayant Chowdhary80f128b2019-10-30 16:13:31 -0700275 // Don't send initial callbacks for camera ids which don't support
276 // camera2
277 if (!pair.second.supportsHAL3) {
278 continue;
279 }
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800280
281 // Camera available/unavailable callback
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800282 sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800283 ACameraManager_AvailabilityCallback cbFunc = isStatusAvailable(status) ?
284 cb.mAvailable : cb.mUnavailable;
285 msg->setPointer(kCallbackFpKey, (void *) cbFunc);
286 msg->setPointer(kContextKey, cb.mContext);
Austin Borger0fb3ad92023-06-01 16:51:35 -0700287 msg->setString(kCameraIdKey, AString(cameraId.c_str()));
Shuzhen Wang7e540682020-04-10 13:30:25 -0700288 mPendingCallbackCnt++;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800289 msg->post();
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800290
291 // Physical camera unavailable callback
Austin Borger0fb3ad92023-06-01 16:51:35 -0700292 std::set<std::string> unavailablePhysicalCameras =
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800293 pair.second.getUnavailablePhysicalIds();
294 for (const auto& physicalCameraId : unavailablePhysicalCameras) {
295 sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
296 ACameraManager_PhysicalCameraAvailabilityCallback cbFunc =
297 cb.mPhysicalCamUnavailable;
298 msg->setPointer(kCallbackFpKey, (void *) cbFunc);
299 msg->setPointer(kContextKey, cb.mContext);
Austin Borger0fb3ad92023-06-01 16:51:35 -0700300 msg->setString(kCameraIdKey, AString(cameraId.c_str()));
301 msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId.c_str()));
Shuzhen Wang7e540682020-04-10 13:30:25 -0700302 mPendingCallbackCnt++;
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800303 msg->post();
304 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800305 }
306 }
307}
308
Austin Borger0fb3ad92023-06-01 16:51:35 -0700309bool CameraManagerGlobal::supportsCamera2ApiLocked(const std::string &cameraId) {
Jayant Chowdhary80f128b2019-10-30 16:13:31 -0700310 bool camera2Support = false;
311 auto cs = getCameraServiceLocked();
312 binder::Status serviceRet =
Austin Borger0fb3ad92023-06-01 16:51:35 -0700313 cs->supportsCameraApi(cameraId,
Jayant Chowdhary80f128b2019-10-30 16:13:31 -0700314 hardware::ICameraService::API_VERSION_2, &camera2Support);
315 if (!serviceRet.isOk()) {
316 ALOGE("%s: supportsCameraApi2Locked() call failed for cameraId %s",
317 __FUNCTION__, cameraId.c_str());
318 return false;
319 }
320 return camera2Support;
321}
322
Austin Borger0fb3ad92023-06-01 16:51:35 -0700323void CameraManagerGlobal::getCameraIdList(std::vector<std::string>* cameraIds) {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800324 // Ensure that we have initialized/refreshed the list of available devices
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800325 Mutex::Autolock _l(mLock);
Jayant Chowdhary80f128b2019-10-30 16:13:31 -0700326 // Needed to make sure we're connected to cameraservice
327 getCameraServiceLocked();
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800328 for(auto& deviceStatus : mDeviceStatusMap) {
Shuzhen Wang43858162020-01-10 13:42:15 -0800329 int32_t status = deviceStatus.second.getStatus();
330 if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT ||
331 status == hardware::ICameraServiceListener::STATUS_ENUMERATING) {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800332 continue;
333 }
Jayant Chowdhary80f128b2019-10-30 16:13:31 -0700334 if (!deviceStatus.second.supportsHAL3) {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800335 continue;
336 }
337 cameraIds->push_back(deviceStatus.first);
338 }
339}
340
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800341bool CameraManagerGlobal::validStatus(int32_t status) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800342 switch (status) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800343 case hardware::ICameraServiceListener::STATUS_NOT_PRESENT:
344 case hardware::ICameraServiceListener::STATUS_PRESENT:
345 case hardware::ICameraServiceListener::STATUS_ENUMERATING:
346 case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800347 return true;
348 default:
349 return false;
350 }
351}
352
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800353bool CameraManagerGlobal::isStatusAvailable(int32_t status) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800354 switch (status) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800355 case hardware::ICameraServiceListener::STATUS_PRESENT:
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800356 return true;
357 default:
358 return false;
359 }
360}
361
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800362void CameraManagerGlobal::CallbackHandler::onMessageReceived(
Shuzhen Wang7e540682020-04-10 13:30:25 -0700363 const sp<AMessage> &msg) {
364 onMessageReceivedInternal(msg);
365 if (msg->what() == kWhatSendSingleCallback ||
366 msg->what() == kWhatSendSingleAccessCallback ||
367 msg->what() == kWhatSendSinglePhysicalCameraCallback) {
368 notifyParent();
369 }
370}
371
372void CameraManagerGlobal::CallbackHandler::onMessageReceivedInternal(
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800373 const sp<AMessage> &msg) {
374 switch (msg->what()) {
375 case kWhatSendSingleCallback:
376 {
377 ACameraManager_AvailabilityCallback cb;
378 void* context;
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800379 AString cameraId;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800380 bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
381 if (!found) {
382 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
383 return;
384 }
385 found = msg->findPointer(kContextKey, &context);
386 if (!found) {
387 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
388 return;
389 }
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800390 found = msg->findString(kCameraIdKey, &cameraId);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800391 if (!found) {
392 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
393 return;
394 }
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800395 (*cb)(context, cameraId.c_str());
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800396 break;
397 }
Emilian Peevc6f2ab32019-03-04 11:18:59 -0800398 case kWhatSendSingleAccessCallback:
399 {
400 ACameraManager_AccessPrioritiesChangedCallback cb;
401 void* context;
402 AString cameraId;
403 bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
404 if (!found) {
405 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
406 return;
407 }
408 found = msg->findPointer(kContextKey, &context);
409 if (!found) {
410 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
411 return;
412 }
413 (*cb)(context);
414 break;
415 }
Shuzhen Wang43858162020-01-10 13:42:15 -0800416 case kWhatSendSinglePhysicalCameraCallback:
417 {
418 ACameraManager_PhysicalCameraAvailabilityCallback cb;
419 void* context;
420 AString cameraId;
421 AString physicalCameraId;
422 bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
423 if (!found) {
424 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
425 return;
426 }
427 if (cb == nullptr) {
428 // Physical camera callback is null
429 return;
430 }
431 found = msg->findPointer(kContextKey, &context);
432 if (!found) {
433 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
434 return;
435 }
436 found = msg->findString(kCameraIdKey, &cameraId);
437 if (!found) {
438 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
439 return;
440 }
441 found = msg->findString(kPhysicalCameraIdKey, &physicalCameraId);
442 if (!found) {
443 ALOGE("%s: Cannot find physical camera ID!", __FUNCTION__);
444 return;
445 }
446 (*cb)(context, cameraId.c_str(), physicalCameraId.c_str());
447 break;
448 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800449 default:
450 ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what());
451 break;
452 }
453}
454
Shuzhen Wang7e540682020-04-10 13:30:25 -0700455void CameraManagerGlobal::CallbackHandler::notifyParent() {
456 sp<CameraManagerGlobal> parent = mParent.promote();
457 if (parent != nullptr) {
458 parent->onCallbackCalled();
459 }
460}
461
Emilian Peevc6f2ab32019-03-04 11:18:59 -0800462binder::Status CameraManagerGlobal::CameraServiceListener::onCameraAccessPrioritiesChanged() {
463 sp<CameraManagerGlobal> cm = mCameraManager.promote();
464 if (cm != nullptr) {
465 cm->onCameraAccessPrioritiesChanged();
466 } else {
467 ALOGE("Cannot deliver camera access priority callback. Global camera manager died");
468 }
469 return binder::Status::ok();
470}
471
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800472binder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged(
Biswarup Pal37a75182024-01-16 15:53:35 +0000473 int32_t status, const std::string& cameraId, int deviceId) {
474 // Skip callback for cameras not belonging to the default device, as NDK doesn't support
475 // device awareness yet.
476 if (deviceId != kDefaultDeviceId) {
477 return binder::Status::ok();
478 }
479
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800480 sp<CameraManagerGlobal> cm = mCameraManager.promote();
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800481 if (cm != nullptr) {
Austin Borger0fb3ad92023-06-01 16:51:35 -0700482 cm->onStatusChanged(status, cameraId);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800483 } else {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800484 ALOGE("Cannot deliver status change. Global camera manager died");
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800485 }
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800486 return binder::Status::ok();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800487}
488
Shuzhen Wang43858162020-01-10 13:42:15 -0800489binder::Status CameraManagerGlobal::CameraServiceListener::onPhysicalCameraStatusChanged(
Biswarup Pal37a75182024-01-16 15:53:35 +0000490 int32_t status, const std::string& cameraId, const std::string& physicalCameraId,
491 int deviceId) {
492 // Skip callback for cameras not belonging to the default device, as NDK doesn't support
493 // device awareness yet.
494 if (deviceId != kDefaultDeviceId) {
495 return binder::Status::ok();
496 }
497
Shuzhen Wang43858162020-01-10 13:42:15 -0800498 sp<CameraManagerGlobal> cm = mCameraManager.promote();
499 if (cm != nullptr) {
Austin Borger0fb3ad92023-06-01 16:51:35 -0700500 cm->onStatusChanged(status, cameraId, physicalCameraId);
Shuzhen Wang43858162020-01-10 13:42:15 -0800501 } else {
502 ALOGE("Cannot deliver physical camera status change. Global camera manager died");
503 }
504 return binder::Status::ok();
505}
506
Emilian Peevc6f2ab32019-03-04 11:18:59 -0800507void CameraManagerGlobal::onCameraAccessPrioritiesChanged() {
508 Mutex::Autolock _l(mLock);
509 for (auto cb : mCallbacks) {
510 sp<AMessage> msg = new AMessage(kWhatSendSingleAccessCallback, mHandler);
511 ACameraManager_AccessPrioritiesChangedCallback cbFp = cb.mAccessPriorityChanged;
512 if (cbFp != nullptr) {
513 msg->setPointer(kCallbackFpKey, (void *) cbFp);
514 msg->setPointer(kContextKey, cb.mContext);
Shuzhen Wang7e540682020-04-10 13:30:25 -0700515 mPendingCallbackCnt++;
Emilian Peevc6f2ab32019-03-04 11:18:59 -0800516 msg->post();
517 }
518 }
519}
520
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800521void CameraManagerGlobal::onStatusChanged(
Austin Borger0fb3ad92023-06-01 16:51:35 -0700522 int32_t status, const std::string& cameraId) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800523 Mutex::Autolock _l(mLock);
524 onStatusChangedLocked(status, cameraId);
525}
526
527void CameraManagerGlobal::onStatusChangedLocked(
Austin Borger0fb3ad92023-06-01 16:51:35 -0700528 int32_t status, const std::string& cameraId) {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800529 if (!validStatus(status)) {
530 ALOGE("%s: Invalid status %d", __FUNCTION__, status);
531 return;
532 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800533
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800534 bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0);
535 int32_t oldStatus = firstStatus ?
536 status : // first status
Shuzhen Wang43858162020-01-10 13:42:15 -0800537 mDeviceStatusMap[cameraId].getStatus();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800538
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800539 if (!firstStatus &&
540 isStatusAvailable(status) == isStatusAvailable(oldStatus)) {
541 // No status update. No need to send callback
542 return;
543 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800544
Jayant Chowdhary80f128b2019-10-30 16:13:31 -0700545 bool supportsHAL3 = supportsCamera2ApiLocked(cameraId);
Shuzhen Wang43858162020-01-10 13:42:15 -0800546 if (firstStatus) {
547 mDeviceStatusMap.emplace(std::piecewise_construct,
548 std::forward_as_tuple(cameraId),
549 std::forward_as_tuple(status, supportsHAL3));
550 } else {
551 mDeviceStatusMap[cameraId].updateStatus(status);
552 }
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800553 // Iterate through all registered callbacks
Jayant Chowdhary80f128b2019-10-30 16:13:31 -0700554 if (supportsHAL3) {
555 for (auto cb : mCallbacks) {
556 sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
557 ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ?
558 cb.mAvailable : cb.mUnavailable;
559 msg->setPointer(kCallbackFpKey, (void *) cbFp);
560 msg->setPointer(kContextKey, cb.mContext);
Austin Borger0fb3ad92023-06-01 16:51:35 -0700561 msg->setString(kCameraIdKey, AString(cameraId.c_str()));
Shuzhen Wang7e540682020-04-10 13:30:25 -0700562 mPendingCallbackCnt++;
Jayant Chowdhary80f128b2019-10-30 16:13:31 -0700563 msg->post();
564 }
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800565 }
Guennadi Liakhovetski6034bf52017-12-07 10:28:29 +0100566 if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT) {
567 mDeviceStatusMap.erase(cameraId);
568 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800569}
570
Shuzhen Wang43858162020-01-10 13:42:15 -0800571void CameraManagerGlobal::onStatusChanged(
Austin Borger0fb3ad92023-06-01 16:51:35 -0700572 int32_t status, const std::string& cameraId, const std::string& physicalCameraId) {
Shuzhen Wang43858162020-01-10 13:42:15 -0800573 Mutex::Autolock _l(mLock);
574 onStatusChangedLocked(status, cameraId, physicalCameraId);
575}
576
577void CameraManagerGlobal::onStatusChangedLocked(
Austin Borger0fb3ad92023-06-01 16:51:35 -0700578 int32_t status, const std::string& cameraId, const std::string& physicalCameraId) {
Shuzhen Wang43858162020-01-10 13:42:15 -0800579 if (!validStatus(status)) {
580 ALOGE("%s: Invalid status %d", __FUNCTION__, status);
581 return;
582 }
583
584 auto logicalStatus = mDeviceStatusMap.find(cameraId);
585 if (logicalStatus == mDeviceStatusMap.end()) {
586 ALOGE("%s: Physical camera id %s status change on a non-present id %s",
587 __FUNCTION__, physicalCameraId.c_str(), cameraId.c_str());
588 return;
589 }
590 int32_t logicalCamStatus = mDeviceStatusMap[cameraId].getStatus();
591 if (logicalCamStatus != hardware::ICameraServiceListener::STATUS_PRESENT &&
592 logicalCamStatus != hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE) {
593 ALOGE("%s: Physical camera id %s status %d change for an invalid logical camera state %d",
Austin Borger0fb3ad92023-06-01 16:51:35 -0700594 __FUNCTION__, physicalCameraId.c_str(), status, logicalCamStatus);
Shuzhen Wang43858162020-01-10 13:42:15 -0800595 return;
596 }
597
598 bool supportsHAL3 = supportsCamera2ApiLocked(cameraId);
599
600 bool updated = false;
601 if (status == hardware::ICameraServiceListener::STATUS_PRESENT) {
602 updated = mDeviceStatusMap[cameraId].removeUnavailablePhysicalId(physicalCameraId);
603 } else {
604 updated = mDeviceStatusMap[cameraId].addUnavailablePhysicalId(physicalCameraId);
605 }
606
607 // Iterate through all registered callbacks
608 if (supportsHAL3 && updated) {
609 for (auto cb : mCallbacks) {
610 sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
611 ACameraManager_PhysicalCameraAvailabilityCallback cbFp = isStatusAvailable(status) ?
612 cb.mPhysicalCamAvailable : cb.mPhysicalCamUnavailable;
613 msg->setPointer(kCallbackFpKey, (void *) cbFp);
614 msg->setPointer(kContextKey, cb.mContext);
Austin Borger0fb3ad92023-06-01 16:51:35 -0700615 msg->setString(kCameraIdKey, AString(cameraId.c_str()));
616 msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId.c_str()));
Shuzhen Wang7e540682020-04-10 13:30:25 -0700617 mPendingCallbackCnt++;
Shuzhen Wang43858162020-01-10 13:42:15 -0800618 msg->post();
619 }
620 }
621}
622
623int32_t CameraManagerGlobal::StatusAndHAL3Support::getStatus() {
624 std::lock_guard<std::mutex> lock(mLock);
625 return status;
626}
627
628void CameraManagerGlobal::StatusAndHAL3Support::updateStatus(int32_t newStatus) {
629 std::lock_guard<std::mutex> lock(mLock);
630 status = newStatus;
631}
632
633bool CameraManagerGlobal::StatusAndHAL3Support::addUnavailablePhysicalId(
Austin Borger0fb3ad92023-06-01 16:51:35 -0700634 const std::string& physicalCameraId) {
Shuzhen Wang43858162020-01-10 13:42:15 -0800635 std::lock_guard<std::mutex> lock(mLock);
636 auto result = unavailablePhysicalIds.insert(physicalCameraId);
637 return result.second;
638}
639
640bool CameraManagerGlobal::StatusAndHAL3Support::removeUnavailablePhysicalId(
Austin Borger0fb3ad92023-06-01 16:51:35 -0700641 const std::string& physicalCameraId) {
Shuzhen Wang43858162020-01-10 13:42:15 -0800642 std::lock_guard<std::mutex> lock(mLock);
643 auto count = unavailablePhysicalIds.erase(physicalCameraId);
644 return count > 0;
645}
646
Austin Borger0fb3ad92023-06-01 16:51:35 -0700647std::set<std::string> CameraManagerGlobal::StatusAndHAL3Support::getUnavailablePhysicalIds() {
Shuzhen Wang4fa28d22020-01-23 15:57:25 -0800648 std::lock_guard<std::mutex> lock(mLock);
649 return unavailablePhysicalIds;
650}
651
Jayant Chowdhary6df26072018-11-06 23:55:12 -0800652} // namespace acam
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800653} // namespace android
654
655/**
656 * ACameraManger Implementation
657 */
658camera_status_t
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800659ACameraManager::getCameraIdList(ACameraIdList** cameraIdList) {
660 Mutex::Autolock _l(mLock);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800661
Austin Borger0fb3ad92023-06-01 16:51:35 -0700662 std::vector<std::string> idList;
Avichal Rakeshf099b232022-10-27 15:44:50 -0700663 CameraManagerGlobal::getInstance()->getCameraIdList(&idList);
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800664
665 int numCameras = idList.size();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800666 ACameraIdList *out = new ACameraIdList;
667 if (!out) {
668 ALOGE("Allocate memory for ACameraIdList failed!");
669 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
670 }
671 out->numCameras = numCameras;
Bjoern Johansson1a5954c2017-01-10 10:30:18 -0800672 out->cameraIds = new const char*[numCameras];
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800673 if (!out->cameraIds) {
674 ALOGE("Allocate memory for ACameraIdList failed!");
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800675 deleteCameraIdList(out);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800676 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
677 }
678 for (int i = 0; i < numCameras; i++) {
Austin Borger0fb3ad92023-06-01 16:51:35 -0700679 const char* src = idList[i].c_str();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800680 size_t dstSize = strlen(src) + 1;
681 char* dst = new char[dstSize];
682 if (!dst) {
683 ALOGE("Allocate memory for ACameraIdList failed!");
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800684 deleteCameraIdList(out);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800685 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
686 }
687 strlcpy(dst, src, dstSize);
688 out->cameraIds[i] = dst;
689 }
690 *cameraIdList = out;
691 return ACAMERA_OK;
692}
693
694void
695ACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) {
696 if (cameraIdList != nullptr) {
697 if (cameraIdList->cameraIds != nullptr) {
698 for (int i = 0; i < cameraIdList->numCameras; i ++) {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800699 if (cameraIdList->cameraIds[i] != nullptr) {
700 delete[] cameraIdList->cameraIds[i];
701 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800702 }
703 delete[] cameraIdList->cameraIds;
704 }
705 delete cameraIdList;
706 }
707}
708
709camera_status_t ACameraManager::getCameraCharacteristics(
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700710 const char* cameraIdStr, sp<ACameraMetadata>* characteristics) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800711 Mutex::Autolock _l(mLock);
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800712
Avichal Rakeshf099b232022-10-27 15:44:50 -0700713 sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance()->getCameraService();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800714 if (cs == nullptr) {
715 ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
716 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
717 }
Austin Borger3560b7e2022-10-27 12:20:29 -0700718
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800719 CameraMetadata rawMetadata;
Shuzhen Wangd4abdf72021-05-28 11:22:50 -0700720 int targetSdkVersion = android_get_application_target_sdk_version();
Austin Borger0fb3ad92023-06-01 16:51:35 -0700721 binder::Status serviceRet = cs->getCameraCharacteristics(cameraIdStr,
Jayant Chowdhary81d81b02024-02-15 19:13:39 +0000722 targetSdkVersion, /*rotationOverride*/hardware::ICameraService::ROTATION_OVERRIDE_NONE,
723 kDefaultDeviceId, /*devicePolicy*/0,
Biswarup Pal37a75182024-01-16 15:53:35 +0000724 &rawMetadata);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800725 if (!serviceRet.isOk()) {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800726 switch(serviceRet.serviceSpecificErrorCode()) {
727 case hardware::ICameraService::ERROR_DISCONNECTED:
728 ALOGE("%s: Camera %s has been disconnected", __FUNCTION__, cameraIdStr);
729 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
730 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
731 ALOGE("%s: Camera ID %s does not exist!", __FUNCTION__, cameraIdStr);
732 return ACAMERA_ERROR_INVALID_PARAMETER;
733 default:
734 ALOGE("Get camera characteristics from camera service failed: %s",
Tomasz Wasilczyk12b04a52023-08-11 15:52:22 +0000735 serviceRet.toString8().c_str());
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800736 return ACAMERA_ERROR_UNKNOWN; // should not reach here
737 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800738 }
739
740 *characteristics = new ACameraMetadata(
741 rawMetadata.release(), ACameraMetadata::ACM_CHARACTERISTICS);
742 return ACAMERA_OK;
743}
744
745camera_status_t
746ACameraManager::openCamera(
747 const char* cameraId,
748 ACameraDevice_StateCallbacks* callback,
749 /*out*/ACameraDevice** outDevice) {
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700750 sp<ACameraMetadata> chars;
751 camera_status_t ret = getCameraCharacteristics(cameraId, &chars);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800752 Mutex::Autolock _l(mLock);
753 if (ret != ACAMERA_OK) {
754 ALOGE("%s: cannot get camera characteristics for camera %s. err %d",
755 __FUNCTION__, cameraId, ret);
756 return ACAMERA_ERROR_INVALID_PARAMETER;
757 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800758
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700759 ACameraDevice* device = new ACameraDevice(cameraId, callback, chars);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800760
Avichal Rakeshf099b232022-10-27 15:44:50 -0700761 sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance()->getCameraService();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800762 if (cs == nullptr) {
763 ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
Yunlian Jiangb01d8f72016-10-04 16:34:18 -0700764 delete device;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800765 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
766 }
767
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800768 sp<hardware::camera2::ICameraDeviceCallbacks> callbacks = device->getServiceCallback();
769 sp<hardware::camera2::ICameraDeviceUser> deviceRemote;
Shuzhen Wangd4abdf72021-05-28 11:22:50 -0700770 int targetSdkVersion = android_get_application_target_sdk_version();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800771 // No way to get package name from native.
772 // Send a zero length package name and let camera service figure it out from UID
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800773 binder::Status serviceRet = cs->connectDevice(
Austin Borger0fb3ad92023-06-01 16:51:35 -0700774 callbacks, cameraId, "", {},
Shuzhen Wangd4abdf72021-05-28 11:22:50 -0700775 hardware::ICameraService::USE_CALLING_UID, /*oomScoreOffset*/0,
Jayant Chowdhary81d81b02024-02-15 19:13:39 +0000776 targetSdkVersion, /*rotationOverride*/hardware::ICameraService::ROTATION_OVERRIDE_NONE,
777 kDefaultDeviceId, /*devicePolicy*/0,
Biswarup Pal37a75182024-01-16 15:53:35 +0000778 /*out*/&deviceRemote);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800779
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800780 if (!serviceRet.isOk()) {
Tomasz Wasilczyk12b04a52023-08-11 15:52:22 +0000781 ALOGE("%s: connect camera device failed: %s", __FUNCTION__, serviceRet.toString8().c_str());
Yin-Chia Yeh3e49be12016-04-12 16:00:33 -0700782 // Convert serviceRet to camera_status_t
783 switch(serviceRet.serviceSpecificErrorCode()) {
784 case hardware::ICameraService::ERROR_DISCONNECTED:
785 ret = ACAMERA_ERROR_CAMERA_DISCONNECTED;
786 break;
787 case hardware::ICameraService::ERROR_CAMERA_IN_USE:
788 ret = ACAMERA_ERROR_CAMERA_IN_USE;
789 break;
790 case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE:
791 ret = ACAMERA_ERROR_MAX_CAMERA_IN_USE;
792 break;
793 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
794 ret = ACAMERA_ERROR_INVALID_PARAMETER;
795 break;
796 case hardware::ICameraService::ERROR_DEPRECATED_HAL:
797 // Should not reach here since we filtered legacy HALs earlier
798 ret = ACAMERA_ERROR_INVALID_PARAMETER;
799 break;
800 case hardware::ICameraService::ERROR_DISABLED:
801 ret = ACAMERA_ERROR_CAMERA_DISABLED;
802 break;
803 case hardware::ICameraService::ERROR_PERMISSION_DENIED:
804 ret = ACAMERA_ERROR_PERMISSION_DENIED;
805 break;
806 case hardware::ICameraService::ERROR_INVALID_OPERATION:
807 default:
808 ret = ACAMERA_ERROR_UNKNOWN;
809 break;
810 }
811
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800812 delete device;
Yin-Chia Yeh3e49be12016-04-12 16:00:33 -0700813 return ret;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800814 }
815 if (deviceRemote == nullptr) {
816 ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__);
817 delete device;
818 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
819 }
820 device->setRemoteDevice(deviceRemote);
821 *outDevice = device;
822 return ACAMERA_OK;
823}
824
825ACameraManager::~ACameraManager() {
Eino-Ville Talvalaf51fca22016-12-13 11:25:55 -0800826
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800827}