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