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 "ACameraManager"
19
20 #include "ACameraManager.h"
21 #include <android_companion_virtualdevice_flags.h>
22 #include <camera/CameraUtils.h>
23 #include <camera/StringUtils.h>
24 #include <camera/VendorTagDescriptor.h>
25 #include <cutils/properties.h>
26 #include <stdlib.h>
27 #include <utils/Vector.h>
28 #include <memory>
29 #include "ACameraDevice.h"
30 #include "ACameraMetadata.h"
31 #include <com_android_internal_camera_flags.h>
32
33 using namespace android::acam;
34 namespace vd_flags = android::companion::virtualdevice::flags;
35 namespace flags = com::android::internal::camera::flags;
36
37 namespace android {
38 namespace acam {
39 namespace {
40
41 using ::android::binder::Status;
42 using ::android::companion::virtualnative::IVirtualDeviceManagerNative;
43
44 // Return binder connection to VirtualDeviceManager.
45 //
46 // Subsequent calls return the same cached instance.
getVirtualDeviceManager()47 sp<IVirtualDeviceManagerNative> getVirtualDeviceManager() {
48 auto connectToVirtualDeviceManagerNative = []() {
49 sp<IBinder> binder =
50 defaultServiceManager()->checkService(String16("virtualdevice_native"));
51 if (binder == nullptr) {
52 ALOGW("%s: Cannot get virtualdevice_native service", __func__);
53 return interface_cast<IVirtualDeviceManagerNative>(nullptr);
54 }
55 return interface_cast<IVirtualDeviceManagerNative>(binder);
56 };
57
58 static sp<IVirtualDeviceManagerNative> vdm = connectToVirtualDeviceManagerNative();
59 return vdm;
60 }
61
62 // Returns device id calling process is running on.
63 // If the process cannot be attributed to single virtual device id, returns default device id.
getCurrentDeviceId()64 int getCurrentDeviceId() {
65 if (!vd_flags::camera_device_awareness()) {
66 return kDefaultDeviceId;
67 }
68
69 auto vdm = getVirtualDeviceManager();
70 if (vdm == nullptr) {
71 return kDefaultDeviceId;
72 }
73
74 const uid_t myUid = getuid();
75 std::vector<int> deviceIds;
76 Status status = vdm->getDeviceIdsForUid(myUid, &deviceIds);
77 if (!status.isOk() || deviceIds.empty()) {
78 ALOGE("%s: Failed to call getDeviceIdsForUid to determine device id for uid %d: %s",
79 __func__, myUid, status.toString8().c_str());
80 return kDefaultDeviceId;
81 }
82
83 // If the UID is associated with multiple virtual devices, use the default device's
84 // camera as we cannot disambiguate here. This effectively means that the app has
85 // activities on different devices at the same time.
86 if (deviceIds.size() != 1) {
87 return kDefaultDeviceId;
88 }
89 return deviceIds[0];
90 }
91
92 // Returns device policy for POLICY_TYPE_CAMERA corresponding to deviceId.
getDevicePolicyForDeviceId(const int deviceId)93 DevicePolicy getDevicePolicyForDeviceId(const int deviceId) {
94 if (!vd_flags::camera_device_awareness() || deviceId == kDefaultDeviceId) {
95 return DevicePolicy::DEVICE_POLICY_DEFAULT;
96 }
97
98 auto vdm = getVirtualDeviceManager();
99 if (vdm == nullptr) {
100 return DevicePolicy::DEVICE_POLICY_DEFAULT;
101 }
102
103 int policy = IVirtualDeviceManagerNative::DEVICE_POLICY_DEFAULT;
104 Status status = vdm->getDevicePolicy(deviceId, IVirtualDeviceManagerNative::POLICY_TYPE_CAMERA,
105 &policy);
106 if (!status.isOk()) {
107 ALOGE("%s: Failed to call getDevicePolicy to determine camera policy for device id %d: %s",
108 __func__, deviceId, status.toString8().c_str());
109 return DevicePolicy::DEVICE_POLICY_DEFAULT;
110 }
111 return static_cast<DevicePolicy>(policy);
112 }
113
114 // Returns true if camera owned by device cameraDeviceId can be accessed within deviceContext.
isCameraAccessible(const DeviceContext deviceContext,const int cameraDeviceId)115 bool isCameraAccessible(const DeviceContext deviceContext, const int cameraDeviceId) {
116 if (!vd_flags::camera_device_awareness() ||
117 deviceContext.policy == DevicePolicy::DEVICE_POLICY_DEFAULT) {
118 return cameraDeviceId == kDefaultDeviceId;
119 }
120 return deviceContext.deviceId == cameraDeviceId;
121 }
122
123 } // namespace
124
125 // Static member definitions
126 const char* CameraManagerGlobal::kCameraIdKey = "CameraId";
127 const char* CameraManagerGlobal::kPhysicalCameraIdKey = "PhysicalCameraId";
128 const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp";
129 const char* CameraManagerGlobal::kContextKey = "CallbackContext";
130 const nsecs_t CameraManagerGlobal::kCallbackDrainTimeout = 5000000; // 5 ms
131 Mutex CameraManagerGlobal::sLock;
132 wp<CameraManagerGlobal> CameraManagerGlobal::sInstance = nullptr;
133
DeviceContext()134 DeviceContext::DeviceContext() {
135 deviceId = getCurrentDeviceId();
136 policy = getDevicePolicyForDeviceId(deviceId);
137 }
138
getInstance()139 sp<CameraManagerGlobal> CameraManagerGlobal::getInstance() {
140 Mutex::Autolock _l(sLock);
141 sp<CameraManagerGlobal> instance = sInstance.promote();
142 if (instance == nullptr) {
143 instance = new CameraManagerGlobal();
144 sInstance = instance;
145 }
146 return instance;
147 }
148
~CameraManagerGlobal()149 CameraManagerGlobal::~CameraManagerGlobal() {
150 // clear sInstance so next getInstance call knows to create a new one
151 Mutex::Autolock _sl(sLock);
152 sInstance = nullptr;
153 Mutex::Autolock _l(mLock);
154 if (mCameraService != nullptr) {
155 IInterface::asBinder(mCameraService)->unlinkToDeath(mDeathNotifier);
156 mCameraService->removeListener(mCameraServiceListener);
157 }
158 mDeathNotifier.clear();
159 if (mCbLooper != nullptr) {
160 mCbLooper->unregisterHandler(mHandler->id());
161 mCbLooper->stop();
162 }
163 mCbLooper.clear();
164 mHandler.clear();
165 mCameraServiceListener.clear();
166 mCameraService.clear();
167 }
168
getCameraService()169 sp<hardware::ICameraService> CameraManagerGlobal::getCameraService() {
170 Mutex::Autolock _l(mLock);
171 return getCameraServiceLocked();
172 }
173
getCameraServiceLocked()174 sp<hardware::ICameraService> CameraManagerGlobal::getCameraServiceLocked() {
175 if (mCameraService.get() != nullptr) {
176 return mCameraService;
177 }
178 if (CameraUtils::isCameraServiceDisabled()) {
179 return mCameraService;
180 }
181
182 sp<IServiceManager> sm = defaultServiceManager();
183 sp<IBinder> binder;
184 binder = sm->checkService(String16(kCameraServiceName));
185 if (binder == nullptr) {
186 ALOGE("%s: Could not get CameraService instance.", __FUNCTION__);
187 return nullptr;
188 }
189 sp<hardware::ICameraService> cameraService = interface_cast<hardware::ICameraService>(binder);
190 if (mDeathNotifier == nullptr) {
191 mDeathNotifier = new DeathNotifier(this);
192 binder->linkToDeath(mDeathNotifier);
193 }
194
195 // Setup looper thread to perform availability callbacks
196 if (mCbLooper == nullptr) {
197 mCbLooper = new ALooper;
198 mCbLooper->setName("C2N-mgr-looper");
199 status_t err = mCbLooper->start(
200 /*runOnCallingThread*/false,
201 /*canCallJava*/ true,
202 PRIORITY_DEFAULT);
203 if (err != OK) {
204 ALOGE("%s: Unable to start camera service listener looper: %s (%d)",
205 __FUNCTION__, strerror(-err), err);
206 mCbLooper.clear();
207 return nullptr;
208 }
209 if (mHandler == nullptr) {
210 mHandler = new CallbackHandler(this);
211 }
212 mCbLooper->registerHandler(mHandler);
213 }
214
215 // register ICameraServiceListener
216 std::vector<hardware::CameraStatus> cameraStatuses{};
217 if (mCameraServiceListener == nullptr) {
218 mCameraServiceListener = new CameraServiceListener(this);
219 cameraService->addListener(mCameraServiceListener, &cameraStatuses);
220 }
221
222 for (auto& c : cameraStatuses) {
223 onStatusChangedLocked(c.status, c.deviceId, c.cameraId);
224
225 for (auto& unavailablePhysicalId : c.unavailablePhysicalIds) {
226 onStatusChangedLocked(hardware::ICameraServiceListener::STATUS_NOT_PRESENT,
227 c.deviceId, c.cameraId, unavailablePhysicalId);
228 }
229 }
230 // setup vendor tags
231 if (!setupVendorTags(cameraService)) {
232 ALOGE("%s: Vendor tag descriptor cache couldn't be set up", __FUNCTION__);
233 return nullptr;
234 }
235
236 mCameraService = cameraService;
237 ALOGE_IF(mCameraService == nullptr, "no CameraService!?");
238 return mCameraService;
239 }
240
setupVendorTags(sp<hardware::ICameraService> & cameraService)241 bool CameraManagerGlobal::setupVendorTags(sp<hardware::ICameraService> &cameraService) {
242 sp<VendorTagDescriptor> desc = new VendorTagDescriptor();
243 binder::Status ret = cameraService->getCameraVendorTagDescriptor(/*out*/desc.get());
244 if (!ret.isOk()) {
245 if (ret.serviceSpecificErrorCode() ==
246 hardware::ICameraService::ERROR_DEPRECATED_HAL) {
247 ALOGW("%s: Camera HAL too old; does not support vendor tags",
248 __FUNCTION__);
249 VendorTagDescriptor::clearGlobalVendorTagDescriptor();
250 } else {
251 ALOGE("%s: Failed to get vendor tag descriptors: %s",
252 __FUNCTION__, ret.toString8().c_str());
253 }
254 return false;
255 }
256
257 if (0 < desc->getTagCount()) {
258 status_t err = VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc);
259 if (err != OK) {
260 ALOGE("%s: Failed to set vendor tag descriptors, received error %s (%d)",
261 __FUNCTION__, strerror(-err), err);
262 return false;
263 }
264 } else {
265 sp<VendorTagDescriptorCache> cache =
266 new VendorTagDescriptorCache();
267 binder::Status res =
268 cameraService->getCameraVendorTagCache(
269 /*out*/cache.get());
270 if (res.serviceSpecificErrorCode() ==
271 hardware::ICameraService::ERROR_DISCONNECTED) {
272 // No camera module available, not an error on devices with no cameras
273 VendorTagDescriptorCache::clearGlobalVendorTagCache();
274 } else if (res.isOk()) {
275 status_t err =
276 VendorTagDescriptorCache::setAsGlobalVendorTagCache(
277 cache);
278 if (err != OK) {
279 ALOGE("%s: Failed to set vendor tag cache,"
280 "received error %s (%d)", __FUNCTION__,
281 strerror(-err), err);
282 return false;
283 }
284 } else {
285 VendorTagDescriptorCache::clearGlobalVendorTagCache();
286 ALOGE("%s: Failed to setup vendor tag cache: %s",
287 __FUNCTION__, res.toString8().c_str());
288 return false;
289 }
290 }
291
292 return true;
293 }
294
binderDied(const wp<IBinder> &)295 void CameraManagerGlobal::DeathNotifier::binderDied(const wp<IBinder>&)
296 {
297 ALOGE("Camera service binderDied!");
298 sp<CameraManagerGlobal> cm = mCameraManager.promote();
299 if (cm != nullptr) {
300 AutoMutex lock(cm->mLock);
301 std::vector<DeviceStatusMapKey> keysToRemove;
302 keysToRemove.reserve(cm->mDeviceStatusMap.size());
303 for (auto& pair : cm->mDeviceStatusMap) {
304 keysToRemove.push_back(pair.first);
305 }
306
307 for (const DeviceStatusMapKey& key : keysToRemove) {
308 cm->onStatusChangedLocked(CameraServiceListener::STATUS_NOT_PRESENT, key.deviceId,
309 key.cameraId);
310 }
311 cm->mCameraService.clear();
312 cm->mCameraServiceListener.clear();
313 cm->mDeathNotifier.clear();
314 // TODO: consider adding re-connect call here?
315 }
316 }
317
registerExtendedAvailabilityCallback(const DeviceContext & deviceContext,const ACameraManager_ExtendedAvailabilityCallbacks * callback)318 void CameraManagerGlobal::registerExtendedAvailabilityCallback(
319 const DeviceContext& deviceContext,
320 const ACameraManager_ExtendedAvailabilityCallbacks* callback) {
321 return registerAvailCallback<ACameraManager_ExtendedAvailabilityCallbacks>(deviceContext,
322 callback);
323 }
324
unregisterExtendedAvailabilityCallback(const DeviceContext & deviceContext,const ACameraManager_ExtendedAvailabilityCallbacks * callback)325 void CameraManagerGlobal::unregisterExtendedAvailabilityCallback(
326 const DeviceContext& deviceContext,
327 const ACameraManager_ExtendedAvailabilityCallbacks* callback) {
328 Mutex::Autolock _l(mLock);
329
330 drainPendingCallbacksLocked();
331
332 Callback cb(deviceContext, callback);
333 mCallbacks.erase(cb);
334 }
335
registerAvailabilityCallback(const DeviceContext & deviceContext,const ACameraManager_AvailabilityCallbacks * callback)336 void CameraManagerGlobal::registerAvailabilityCallback(
337 const DeviceContext& deviceContext, const ACameraManager_AvailabilityCallbacks* callback) {
338 return registerAvailCallback<ACameraManager_AvailabilityCallbacks>(deviceContext, callback);
339 }
340
unregisterAvailabilityCallback(const DeviceContext & deviceContext,const ACameraManager_AvailabilityCallbacks * callback)341 void CameraManagerGlobal::unregisterAvailabilityCallback(
342 const DeviceContext& deviceContext, const ACameraManager_AvailabilityCallbacks* callback) {
343 Mutex::Autolock _l(mLock);
344
345 drainPendingCallbacksLocked();
346
347 Callback cb(deviceContext, callback);
348 mCallbacks.erase(cb);
349 }
350
onCallbackCalled()351 void CameraManagerGlobal::onCallbackCalled() {
352 Mutex::Autolock _l(mLock);
353 if (mPendingCallbackCnt > 0) {
354 mPendingCallbackCnt--;
355 }
356 mCallbacksCond.signal();
357 }
358
drainPendingCallbacksLocked()359 void CameraManagerGlobal::drainPendingCallbacksLocked() {
360 while (mPendingCallbackCnt > 0) {
361 auto res = mCallbacksCond.waitRelative(mLock, kCallbackDrainTimeout);
362 if (res != NO_ERROR) {
363 ALOGE("%s: Error waiting to drain callbacks: %s(%d)",
364 __FUNCTION__, strerror(-res), res);
365 break;
366 }
367 }
368 }
369
370 template <class T>
registerAvailCallback(const DeviceContext & deviceContext,const T * callback)371 void CameraManagerGlobal::registerAvailCallback(const DeviceContext& deviceContext,
372 const T* callback) {
373 Mutex::Autolock _l(mLock);
374 getCameraServiceLocked();
375 Callback cb(deviceContext, callback);
376 const auto& [_, newlyRegistered] = mCallbacks.insert(cb);
377 // Send initial callbacks if callback is newly registered
378 if (newlyRegistered) {
379 for (auto& [key, statusAndHAL3Support] : mDeviceStatusMap) {
380 if (!isCameraAccessible(deviceContext, key.deviceId)) {
381 continue;
382 }
383 const std::string& cameraId = key.cameraId;
384 int32_t status = statusAndHAL3Support.getStatus();
385 // Don't send initial callbacks for camera ids which don't support
386 // camera2
387 if (!statusAndHAL3Support.supportsHAL3) {
388 continue;
389 }
390
391 // Camera available/unavailable callback
392 sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
393 ACameraManager_AvailabilityCallback cbFunc = isStatusAvailable(status) ?
394 cb.mAvailable : cb.mUnavailable;
395 msg->setPointer(kCallbackFpKey, (void *) cbFunc);
396 msg->setPointer(kContextKey, cb.mContext);
397 msg->setString(kCameraIdKey, AString(cameraId.c_str()));
398 mPendingCallbackCnt++;
399 msg->post();
400
401 // Physical camera unavailable callback
402 std::set<std::string> unavailablePhysicalCameras =
403 statusAndHAL3Support.getUnavailablePhysicalIds();
404 for (const auto& physicalCameraId : unavailablePhysicalCameras) {
405 sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
406 ACameraManager_PhysicalCameraAvailabilityCallback cbFunc =
407 cb.mPhysicalCamUnavailable;
408 msg->setPointer(kCallbackFpKey, (void *) cbFunc);
409 msg->setPointer(kContextKey, cb.mContext);
410 msg->setString(kCameraIdKey, AString(cameraId.c_str()));
411 msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId.c_str()));
412 mPendingCallbackCnt++;
413 msg->post();
414 }
415 }
416 }
417 }
418
supportsCamera2ApiLocked(const std::string & cameraId)419 bool CameraManagerGlobal::supportsCamera2ApiLocked(const std::string &cameraId) {
420 bool camera2Support = false;
421 auto cs = getCameraServiceLocked();
422 if (cs == nullptr) {
423 return false;
424 }
425 binder::Status serviceRet =
426 cs->supportsCameraApi(cameraId,
427 hardware::ICameraService::API_VERSION_2, &camera2Support);
428 if (!serviceRet.isOk()) {
429 ALOGE("%s: supportsCameraApi2Locked() call failed for cameraId %s",
430 __FUNCTION__, cameraId.c_str());
431 return false;
432 }
433 return camera2Support;
434 }
435
getCameraIdList(const DeviceContext & context,std::vector<std::string> * cameraIds)436 void CameraManagerGlobal::getCameraIdList(const DeviceContext& context,
437 std::vector<std::string>* cameraIds) {
438 // Ensure that we have initialized/refreshed the list of available devices
439 Mutex::Autolock _l(mLock);
440 // Needed to make sure we're connected to cameraservice
441 getCameraServiceLocked();
442 for (auto& [key, statusAndHAL3Support] : mDeviceStatusMap) {
443 if (!isCameraAccessible(context, key.deviceId)) {
444 continue;
445 }
446
447 int32_t status = statusAndHAL3Support.getStatus();
448 if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT ||
449 status == hardware::ICameraServiceListener::STATUS_ENUMERATING) {
450 continue;
451 }
452 if (!statusAndHAL3Support.supportsHAL3) {
453 continue;
454 }
455 cameraIds->push_back(key.cameraId);
456 }
457 }
458
validStatus(int32_t status)459 bool CameraManagerGlobal::validStatus(int32_t status) {
460 switch (status) {
461 case hardware::ICameraServiceListener::STATUS_NOT_PRESENT:
462 case hardware::ICameraServiceListener::STATUS_PRESENT:
463 case hardware::ICameraServiceListener::STATUS_ENUMERATING:
464 case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE:
465 return true;
466 default:
467 return false;
468 }
469 }
470
isStatusAvailable(int32_t status)471 bool CameraManagerGlobal::isStatusAvailable(int32_t status) {
472 switch (status) {
473 case hardware::ICameraServiceListener::STATUS_PRESENT:
474 return true;
475 default:
476 return false;
477 }
478 }
479
onMessageReceived(const sp<AMessage> & msg)480 void CameraManagerGlobal::CallbackHandler::onMessageReceived(
481 const sp<AMessage> &msg) {
482 onMessageReceivedInternal(msg);
483 if (msg->what() == kWhatSendSingleCallback ||
484 msg->what() == kWhatSendSingleAccessCallback ||
485 msg->what() == kWhatSendSinglePhysicalCameraCallback) {
486 notifyParent();
487 }
488 }
489
onMessageReceivedInternal(const sp<AMessage> & msg)490 void CameraManagerGlobal::CallbackHandler::onMessageReceivedInternal(
491 const sp<AMessage> &msg) {
492 switch (msg->what()) {
493 case kWhatSendSingleCallback:
494 {
495 ACameraManager_AvailabilityCallback cb;
496 void* context;
497 AString cameraId;
498 bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
499 if (!found) {
500 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
501 return;
502 }
503 found = msg->findPointer(kContextKey, &context);
504 if (!found) {
505 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
506 return;
507 }
508 found = msg->findString(kCameraIdKey, &cameraId);
509 if (!found) {
510 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
511 return;
512 }
513 (*cb)(context, cameraId.c_str());
514 break;
515 }
516 case kWhatSendSingleAccessCallback:
517 {
518 ACameraManager_AccessPrioritiesChangedCallback cb;
519 void* context;
520 AString cameraId;
521 bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
522 if (!found) {
523 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
524 return;
525 }
526 found = msg->findPointer(kContextKey, &context);
527 if (!found) {
528 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
529 return;
530 }
531 (*cb)(context);
532 break;
533 }
534 case kWhatSendSinglePhysicalCameraCallback:
535 {
536 ACameraManager_PhysicalCameraAvailabilityCallback cb;
537 void* context;
538 AString cameraId;
539 AString physicalCameraId;
540 bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
541 if (!found) {
542 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
543 return;
544 }
545 if (cb == nullptr) {
546 // Physical camera callback is null
547 return;
548 }
549 found = msg->findPointer(kContextKey, &context);
550 if (!found) {
551 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
552 return;
553 }
554 found = msg->findString(kCameraIdKey, &cameraId);
555 if (!found) {
556 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
557 return;
558 }
559 found = msg->findString(kPhysicalCameraIdKey, &physicalCameraId);
560 if (!found) {
561 ALOGE("%s: Cannot find physical camera ID!", __FUNCTION__);
562 return;
563 }
564 (*cb)(context, cameraId.c_str(), physicalCameraId.c_str());
565 break;
566 }
567 default:
568 ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what());
569 break;
570 }
571 }
572
notifyParent()573 void CameraManagerGlobal::CallbackHandler::notifyParent() {
574 sp<CameraManagerGlobal> parent = mParent.promote();
575 if (parent != nullptr) {
576 parent->onCallbackCalled();
577 }
578 }
579
onCameraAccessPrioritiesChanged()580 binder::Status CameraManagerGlobal::CameraServiceListener::onCameraAccessPrioritiesChanged() {
581 sp<CameraManagerGlobal> cm = mCameraManager.promote();
582 if (cm != nullptr) {
583 cm->onCameraAccessPrioritiesChanged();
584 } else {
585 ALOGE("Cannot deliver camera access priority callback. Global camera manager died");
586 }
587 return binder::Status::ok();
588 }
589
onStatusChanged(int32_t status,const std::string & cameraId,int deviceId)590 binder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged(
591 int32_t status, const std::string& cameraId, int deviceId) {
592 sp<CameraManagerGlobal> cm = mCameraManager.promote();
593 if (cm != nullptr) {
594 cm->onStatusChanged(status, deviceId, cameraId);
595 }
596 ALOGE_IF(cm == nullptr,
597 "Cannot deliver physical camera status change. Global camera manager died");
598 return binder::Status::ok();
599 }
600
onPhysicalCameraStatusChanged(int32_t status,const std::string & cameraId,const std::string & physicalCameraId,int deviceId)601 binder::Status CameraManagerGlobal::CameraServiceListener::onPhysicalCameraStatusChanged(
602 int32_t status, const std::string& cameraId, const std::string& physicalCameraId,
603 int deviceId) {
604 sp<CameraManagerGlobal> cm = mCameraManager.promote();
605 if (cm != nullptr) {
606 cm->onStatusChanged(status, deviceId, cameraId, physicalCameraId);
607 }
608 ALOGE_IF(cm == nullptr,
609 "Cannot deliver physical camera status change. Global camera manager died");
610 return binder::Status::ok();
611 }
612
onCameraAccessPrioritiesChanged()613 void CameraManagerGlobal::onCameraAccessPrioritiesChanged() {
614 Mutex::Autolock _l(mLock);
615 for (auto cb : mCallbacks) {
616 sp<AMessage> msg = new AMessage(kWhatSendSingleAccessCallback, mHandler);
617 ACameraManager_AccessPrioritiesChangedCallback cbFp = cb.mAccessPriorityChanged;
618 if (cbFp != nullptr) {
619 msg->setPointer(kCallbackFpKey, (void *) cbFp);
620 msg->setPointer(kContextKey, cb.mContext);
621 mPendingCallbackCnt++;
622 msg->post();
623 }
624 }
625 }
626
onStatusChanged(int32_t status,const int deviceId,const std::string & cameraId)627 void CameraManagerGlobal::onStatusChanged(int32_t status, const int deviceId,
628 const std::string& cameraId) {
629 Mutex::Autolock _l(mLock);
630 onStatusChangedLocked(status, deviceId, cameraId);
631 }
632
onStatusChangedLocked(int32_t status,const int deviceId,const std::string & cameraId)633 void CameraManagerGlobal::onStatusChangedLocked(int32_t status, const int deviceId,
634 const std::string& cameraId) {
635 if (!validStatus(status)) {
636 ALOGE("%s: Invalid status %d", __FUNCTION__, status);
637 return;
638 }
639
640 DeviceStatusMapKey key{.deviceId = deviceId, .cameraId = cameraId};
641
642 bool firstStatus = (mDeviceStatusMap.count(key) == 0);
643 int32_t oldStatus = firstStatus ? status : // first status
644 mDeviceStatusMap[key].getStatus();
645
646 if (!firstStatus &&
647 isStatusAvailable(status) == isStatusAvailable(oldStatus)) {
648 // No status update. No need to send callback
649 return;
650 }
651
652 bool supportsHAL3 = supportsCamera2ApiLocked(cameraId);
653 if (firstStatus) {
654 mDeviceStatusMap.emplace(std::piecewise_construct, std::forward_as_tuple(key),
655 std::forward_as_tuple(status, supportsHAL3));
656 } else {
657 mDeviceStatusMap[key].updateStatus(status);
658 }
659 // Iterate through all registered callbacks
660 if (supportsHAL3) {
661 for (auto cb : mCallbacks) {
662 if (!isCameraAccessible(cb.mDeviceContext, deviceId)) {
663 continue;
664 }
665 sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
666 ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ?
667 cb.mAvailable : cb.mUnavailable;
668 msg->setPointer(kCallbackFpKey, (void *) cbFp);
669 msg->setPointer(kContextKey, cb.mContext);
670 msg->setString(kCameraIdKey, AString(cameraId.c_str()));
671 mPendingCallbackCnt++;
672 msg->post();
673 }
674 }
675 if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT) {
676 mDeviceStatusMap.erase(key);
677 }
678 }
679
onStatusChanged(int32_t status,const int deviceId,const std::string & cameraId,const std::string & physicalCameraId)680 void CameraManagerGlobal::onStatusChanged(int32_t status, const int deviceId,
681 const std::string& cameraId, const std::string& physicalCameraId) {
682 Mutex::Autolock _l(mLock);
683 onStatusChangedLocked(status, deviceId, cameraId, physicalCameraId);
684 }
685
onStatusChangedLocked(int32_t status,const int deviceId,const std::string & cameraId,const std::string & physicalCameraId)686 void CameraManagerGlobal::onStatusChangedLocked(int32_t status, const int deviceId,
687 const std::string& cameraId, const std::string& physicalCameraId) {
688 if (!validStatus(status)) {
689 ALOGE("%s: Invalid status %d", __FUNCTION__, status);
690 return;
691 }
692
693 DeviceStatusMapKey key{.deviceId = deviceId, .cameraId = cameraId};
694 auto logicalStatus = mDeviceStatusMap.find(key);
695 if (logicalStatus == mDeviceStatusMap.end()) {
696 ALOGE("%s: Physical camera id %s status change on a non-present id %s",
697 __FUNCTION__, physicalCameraId.c_str(), cameraId.c_str());
698 return;
699 }
700 int32_t logicalCamStatus = mDeviceStatusMap[key].getStatus();
701 if (logicalCamStatus != hardware::ICameraServiceListener::STATUS_PRESENT &&
702 logicalCamStatus != hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE) {
703 ALOGE("%s: Physical camera id %s status %d change for an invalid logical camera state %d",
704 __FUNCTION__, physicalCameraId.c_str(), status, logicalCamStatus);
705 return;
706 }
707
708 bool supportsHAL3 = supportsCamera2ApiLocked(cameraId);
709
710 bool updated = false;
711 if (status == hardware::ICameraServiceListener::STATUS_PRESENT) {
712 updated = mDeviceStatusMap[key].removeUnavailablePhysicalId(physicalCameraId);
713 } else {
714 updated = mDeviceStatusMap[key].addUnavailablePhysicalId(physicalCameraId);
715 }
716
717 // Iterate through all registered callbacks
718 if (supportsHAL3 && updated) {
719 for (auto cb : mCallbacks) {
720 if (!isCameraAccessible(cb.mDeviceContext, deviceId)) {
721 continue;
722 }
723 sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
724 ACameraManager_PhysicalCameraAvailabilityCallback cbFp = isStatusAvailable(status) ?
725 cb.mPhysicalCamAvailable : cb.mPhysicalCamUnavailable;
726 msg->setPointer(kCallbackFpKey, (void *) cbFp);
727 msg->setPointer(kContextKey, cb.mContext);
728 msg->setString(kCameraIdKey, AString(cameraId.c_str()));
729 msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId.c_str()));
730 mPendingCallbackCnt++;
731 msg->post();
732 }
733 }
734 }
735
getStatus()736 int32_t CameraManagerGlobal::StatusAndHAL3Support::getStatus() {
737 std::lock_guard<std::mutex> lock(mLock);
738 return status;
739 }
740
updateStatus(int32_t newStatus)741 void CameraManagerGlobal::StatusAndHAL3Support::updateStatus(int32_t newStatus) {
742 std::lock_guard<std::mutex> lock(mLock);
743 status = newStatus;
744 }
745
addUnavailablePhysicalId(const std::string & physicalCameraId)746 bool CameraManagerGlobal::StatusAndHAL3Support::addUnavailablePhysicalId(
747 const std::string& physicalCameraId) {
748 std::lock_guard<std::mutex> lock(mLock);
749 auto result = unavailablePhysicalIds.insert(physicalCameraId);
750 return result.second;
751 }
752
removeUnavailablePhysicalId(const std::string & physicalCameraId)753 bool CameraManagerGlobal::StatusAndHAL3Support::removeUnavailablePhysicalId(
754 const std::string& physicalCameraId) {
755 std::lock_guard<std::mutex> lock(mLock);
756 auto count = unavailablePhysicalIds.erase(physicalCameraId);
757 return count > 0;
758 }
759
getUnavailablePhysicalIds()760 std::set<std::string> CameraManagerGlobal::StatusAndHAL3Support::getUnavailablePhysicalIds() {
761 std::lock_guard<std::mutex> lock(mLock);
762 return unavailablePhysicalIds;
763 }
764
765 } // namespace acam
766 } // namespace android
767
768 /**
769 * ACameraManger Implementation
770 */
771 camera_status_t
getCameraIdList(ACameraIdList ** cameraIdList)772 ACameraManager::getCameraIdList(ACameraIdList** cameraIdList) {
773 Mutex::Autolock _l(mLock);
774
775 std::vector<std::string> idList;
776 mGlobalManager->getCameraIdList(mDeviceContext, &idList);
777
778 int numCameras = idList.size();
779 ACameraIdList *out = new ACameraIdList;
780 if (!out) {
781 ALOGE("Allocate memory for ACameraIdList failed!");
782 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
783 }
784 out->numCameras = numCameras;
785 out->cameraIds = new const char*[numCameras];
786 if (!out->cameraIds) {
787 ALOGE("Allocate memory for ACameraIdList failed!");
788 deleteCameraIdList(out);
789 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
790 }
791 for (int i = 0; i < numCameras; i++) {
792 const char* src = idList[i].c_str();
793 size_t dstSize = strlen(src) + 1;
794 char* dst = new char[dstSize];
795 if (!dst) {
796 ALOGE("Allocate memory for ACameraIdList failed!");
797 deleteCameraIdList(out);
798 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
799 }
800 strlcpy(dst, src, dstSize);
801 out->cameraIds[i] = dst;
802 }
803 *cameraIdList = out;
804 return ACAMERA_OK;
805 }
806
807 void
deleteCameraIdList(ACameraIdList * cameraIdList)808 ACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) {
809 if (cameraIdList != nullptr) {
810 if (cameraIdList->cameraIds != nullptr) {
811 for (int i = 0; i < cameraIdList->numCameras; i ++) {
812 if (cameraIdList->cameraIds[i] != nullptr) {
813 delete[] cameraIdList->cameraIds[i];
814 }
815 }
816 delete[] cameraIdList->cameraIds;
817 }
818 delete cameraIdList;
819 }
820 }
821
getCameraCharacteristics(const char * cameraIdStr,sp<ACameraMetadata> * characteristics)822 camera_status_t ACameraManager::getCameraCharacteristics(
823 const char* cameraIdStr, sp<ACameraMetadata>* characteristics) {
824 Mutex::Autolock _l(mLock);
825
826 sp<hardware::ICameraService> cs = mGlobalManager->getCameraService();
827 if (cs == nullptr) {
828 ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
829 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
830 }
831
832 CameraMetadata rawMetadata;
833 int targetSdkVersion = android_get_application_target_sdk_version();
834
835 AttributionSourceState clientAttribution;
836 clientAttribution.uid = hardware::ICameraService::USE_CALLING_UID;
837 clientAttribution.pid = hardware::ICameraService::USE_CALLING_PID;
838 clientAttribution.deviceId = mDeviceContext.deviceId;
839
840 binder::Status serviceRet = cs->getCameraCharacteristics(cameraIdStr,
841 targetSdkVersion, /*rotationOverride*/hardware::ICameraService::ROTATION_OVERRIDE_NONE,
842 clientAttribution, static_cast<int32_t>(mDeviceContext.policy),
843 &rawMetadata);
844 if (!serviceRet.isOk()) {
845 switch(serviceRet.serviceSpecificErrorCode()) {
846 case hardware::ICameraService::ERROR_DISCONNECTED:
847 ALOGE("%s: Camera %s has been disconnected", __FUNCTION__, cameraIdStr);
848 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
849 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
850 ALOGE("%s: Camera ID %s does not exist!", __FUNCTION__, cameraIdStr);
851 return ACAMERA_ERROR_INVALID_PARAMETER;
852 default:
853 ALOGE("Get camera characteristics from camera service failed: %s",
854 serviceRet.toString8().c_str());
855 return ACAMERA_ERROR_UNKNOWN; // should not reach here
856 }
857 }
858
859 *characteristics = new ACameraMetadata(
860 rawMetadata.release(), ACameraMetadata::ACM_CHARACTERISTICS);
861 return ACAMERA_OK;
862 }
863
864 camera_status_t
isCameraDeviceSharingSupported(const char * cameraId,bool * isSharingSupported)865 ACameraManager::isCameraDeviceSharingSupported(
866 const char* cameraId,
867 /*out*/bool* isSharingSupported) {
868 if (!flags::camera_multi_client()) {
869 return ACAMERA_ERROR_UNSUPPORTED_OPERATION;
870 }
871 sp<ACameraMetadata> spChars;
872 camera_status_t ret = getCameraCharacteristics(cameraId, &spChars);
873 if (ret != ACAMERA_OK) {
874 ALOGE("%s: cannot get camera characteristics for camera %s. err %d",
875 __FUNCTION__, cameraId, ret);
876 return ret;
877 }
878
879 ACameraMetadata* chars = spChars.get();
880 ACameraMetadata_const_entry entry;
881 ret = ACameraMetadata_getConstEntry(chars, ANDROID_SHARED_SESSION_OUTPUT_CONFIGURATIONS,
882 &entry);
883 if (ret != ACAMERA_OK) {
884 return ret;
885 }
886 *isSharingSupported = (entry.count > 0) ? true : false;
887 return ACAMERA_OK;
888 }
889
890 camera_status_t
openCamera(const char * cameraId,bool sharedMode,ACameraDevice_StateCallbacks * callback,ACameraDevice ** outDevice,bool * primaryClient)891 ACameraManager::openCamera(
892 const char* cameraId, bool sharedMode,
893 ACameraDevice_StateCallbacks* callback,
894 /*out*/ACameraDevice** outDevice, /*out*/bool* primaryClient) {
895 sp<ACameraMetadata> chars;
896 camera_status_t ret = getCameraCharacteristics(cameraId, &chars);
897 Mutex::Autolock _l(mLock);
898 if (ret != ACAMERA_OK) {
899 ALOGE("%s: cannot get camera characteristics for camera %s. err %d",
900 __FUNCTION__, cameraId, ret);
901 return ACAMERA_ERROR_INVALID_PARAMETER;
902 }
903
904 ACameraDevice* device = new ACameraDevice(cameraId, callback, chars, sharedMode);
905
906 sp<hardware::ICameraService> cs = mGlobalManager->getCameraService();
907 if (cs == nullptr) {
908 ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
909 delete device;
910 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
911 }
912
913 sp<hardware::camera2::ICameraDeviceCallbacks> callbacks = device->getServiceCallback();
914 sp<hardware::camera2::ICameraDeviceUser> deviceRemote;
915 int targetSdkVersion = android_get_application_target_sdk_version();
916
917 AttributionSourceState clientAttribution;
918 clientAttribution.uid = hardware::ICameraService::USE_CALLING_UID;
919 clientAttribution.pid = hardware::ICameraService::USE_CALLING_PID;
920 clientAttribution.deviceId = mDeviceContext.deviceId;
921 clientAttribution.packageName = "";
922 clientAttribution.attributionTag = std::nullopt;
923 clientAttribution.token = sp<BBinder>::make();
924
925 // No way to get package name from native.
926 // Send a zero length package name and let camera service figure it out from UID
927 binder::Status serviceRet = cs->connectDevice(
928 callbacks, cameraId, /*oomScoreOffset*/0,
929 targetSdkVersion, /*rotationOverride*/hardware::ICameraService::ROTATION_OVERRIDE_NONE,
930 clientAttribution, static_cast<int32_t>(mDeviceContext.policy), sharedMode,
931 /*out*/&deviceRemote);
932
933 if (!serviceRet.isOk()) {
934 ALOGE("%s: connect camera device failed: %s", __FUNCTION__, serviceRet.toString8().c_str());
935 // Convert serviceRet to camera_status_t
936 switch(serviceRet.serviceSpecificErrorCode()) {
937 case hardware::ICameraService::ERROR_DISCONNECTED:
938 ret = ACAMERA_ERROR_CAMERA_DISCONNECTED;
939 break;
940 case hardware::ICameraService::ERROR_CAMERA_IN_USE:
941 ret = ACAMERA_ERROR_CAMERA_IN_USE;
942 break;
943 case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE:
944 ret = ACAMERA_ERROR_MAX_CAMERA_IN_USE;
945 break;
946 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
947 ret = ACAMERA_ERROR_INVALID_PARAMETER;
948 break;
949 case hardware::ICameraService::ERROR_DEPRECATED_HAL:
950 // Should not reach here since we filtered legacy HALs earlier
951 ret = ACAMERA_ERROR_INVALID_PARAMETER;
952 break;
953 case hardware::ICameraService::ERROR_DISABLED:
954 ret = ACAMERA_ERROR_CAMERA_DISABLED;
955 break;
956 case hardware::ICameraService::ERROR_PERMISSION_DENIED:
957 ret = ACAMERA_ERROR_PERMISSION_DENIED;
958 break;
959 case hardware::ICameraService::ERROR_INVALID_OPERATION:
960 default:
961 ret = ACAMERA_ERROR_UNKNOWN;
962 break;
963 }
964
965 delete device;
966 return ret;
967 }
968 if (deviceRemote == nullptr) {
969 ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__);
970 delete device;
971 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
972 }
973 device->setRemoteDevice(deviceRemote);
974 device->setDeviceMetadataQueues();
975 if (flags::camera_multi_client() && sharedMode) {
976 binder::Status remoteRet = deviceRemote->isPrimaryClient(primaryClient);
977 if (!remoteRet.isOk()) {
978 delete device;
979 return ACAMERA_ERROR_UNKNOWN;
980 }
981 device->setPrimaryClient(*primaryClient);
982 }
983 *outDevice = device;
984 return ACAMERA_OK;
985 }
986
registerAvailabilityCallback(const ACameraManager_AvailabilityCallbacks * callback)987 void ACameraManager::registerAvailabilityCallback(
988 const ACameraManager_AvailabilityCallbacks* callback) {
989 mGlobalManager->registerAvailabilityCallback(mDeviceContext, callback);
990 }
991
unregisterAvailabilityCallback(const ACameraManager_AvailabilityCallbacks * callback)992 void ACameraManager::unregisterAvailabilityCallback(
993 const ACameraManager_AvailabilityCallbacks* callback) {
994 mGlobalManager->unregisterAvailabilityCallback(mDeviceContext, callback);
995 }
996
registerExtendedAvailabilityCallback(const ACameraManager_ExtendedAvailabilityCallbacks * callback)997 void ACameraManager::registerExtendedAvailabilityCallback(
998 const ACameraManager_ExtendedAvailabilityCallbacks* callback) {
999 mGlobalManager->registerExtendedAvailabilityCallback(mDeviceContext, callback);
1000 }
1001
unregisterExtendedAvailabilityCallback(const ACameraManager_ExtendedAvailabilityCallbacks * callback)1002 void ACameraManager::unregisterExtendedAvailabilityCallback(
1003 const ACameraManager_ExtendedAvailabilityCallbacks* callback) {
1004 mGlobalManager->unregisterExtendedAvailabilityCallback(mDeviceContext, callback);
1005 }
1006