• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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 "ACameraManagerVendor"
19 
20 #include "ACameraMetadata.h"
21 #include "ndk_vendor/impl/ACameraDevice.h"
22 #include "ndk_vendor/impl/ACameraManager.h"
23 #include "utils.h"
24 
25 #include <CameraMetadata.h>
26 #include <VendorTagDescriptor.h>
27 #include <android/binder_manager.h>
28 #include <android/binder_process.h>
29 #include <camera_metadata_hidden.h>
30 #include <cutils/properties.h>
31 #include <memory>
32 #include <utils/Vector.h>
33 
34 using namespace android::acam;
35 
36 namespace android {
37 namespace acam {
38 
39 using ::aidl::android::frameworks::cameraservice::common::ProviderIdAndVendorTagSections;
40 using ::android::hardware::camera::common::V1_0::helper::VendorTagDescriptor;
41 using ::android::hardware::camera::common::V1_0::helper::VendorTagDescriptorCache;
42 using ::ndk::ScopedAStatus;
43 
44 // Static member definitions
45 const char* CameraManagerGlobal::kCameraIdKey   = "CameraId";
46 const char* CameraManagerGlobal::kPhysicalCameraIdKey   = "PhysicalCameraId";
47 const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp";
48 const char* CameraManagerGlobal::kContextKey    = "CallbackContext";
49 const nsecs_t CameraManagerGlobal::kCallbackDrainTimeout = 5000000; // 5 ms
50 Mutex                CameraManagerGlobal::sLock;
51 std::weak_ptr<CameraManagerGlobal> CameraManagerGlobal::sInstance =
52         std::weak_ptr<CameraManagerGlobal>();
53 
54 /**
55  * The vendor tag descriptor class that takes AIDL vendor tag information as
56  * input. Not part of vendor available VendorTagDescriptor class because that class is used by
57  * default HAL implementation code as well.
58  *
59  * This is a class instead of a free-standing function because VendorTagDescriptor has some
60  * protected fields that need to be initialized during conversion.
61  */
62 class AidlVendorTagDescriptor : public VendorTagDescriptor {
63 public:
64     /**
65      * Create a VendorTagDescriptor object from the AIDL VendorTagSection
66      * vector.
67      *
68      * Returns OK on success, or a negative error code.
69      */
70     static status_t createDescriptorFromAidl(const std::vector<VendorTagSection>& vts,
71                                              /*out*/ sp<VendorTagDescriptor> *descriptor);
72 };
73 
createDescriptorFromAidl(const std::vector<VendorTagSection> & vts,sp<VendorTagDescriptor> * descriptor)74 status_t AidlVendorTagDescriptor::createDescriptorFromAidl(const std::vector<VendorTagSection>& vts,
75                                                            sp<VendorTagDescriptor>* descriptor){
76     size_t tagCount = 0;
77 
78     for (size_t s = 0; s < vts.size(); s++) {
79         tagCount += vts[s].tags.size();
80     }
81 
82     if (tagCount < 0 || tagCount > INT32_MAX) {
83         ALOGE("%s: tag count %zu from vendor tag sections is invalid.", __FUNCTION__, tagCount);
84         return BAD_VALUE;
85     }
86 
87     std::vector<int64_t> tagArray;
88     tagArray.resize(tagCount);
89 
90     sp<AidlVendorTagDescriptor> desc = new AidlVendorTagDescriptor();
91     desc->mTagCount = tagCount;
92 
93     std::map<int64_t, std::string> tagToSectionMap;
94 
95     int idx = 0;
96     for (size_t s = 0; s < vts.size(); s++) {
97         const VendorTagSection& section = vts[s];
98         const char *sectionName = section.sectionName.c_str();
99         if (sectionName == nullptr) {
100             ALOGE("%s: no section name defined for vendor tag section %zu.", __FUNCTION__, s);
101             return BAD_VALUE;
102         }
103         String8 sectionString(sectionName);
104         desc->mSections.add(sectionString);
105 
106         for (size_t j = 0; j < section.tags.size(); j++) {
107             uint32_t tag = section.tags[j].tagId;
108             if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) {
109                 ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag);
110                 return BAD_VALUE;
111             }
112 
113             tagArray[idx++] = section.tags[j].tagId;
114 
115             const char *tagName = section.tags[j].tagName.c_str();
116             if (tagName == nullptr) {
117                 ALOGE("%s: no tag name defined for vendor tag %d.", __FUNCTION__, tag);
118                 return BAD_VALUE;
119             }
120             desc->mTagToNameMap.add(tag, String8(tagName));
121             tagToSectionMap.insert({tag, section.sectionName});
122 
123             int tagType = (int) section.tags[j].tagType;
124             if (tagType < 0 || tagType >= NUM_TYPES) {
125                 ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType);
126                 return BAD_VALUE;
127             }
128             desc->mTagToTypeMap.emplace(tag, tagType);
129         }
130     }
131 
132     for (size_t i = 0; i < tagArray.size(); ++i) {
133         uint32_t tag = tagArray[i];
134         auto itr = tagToSectionMap.find(tag);
135         if (itr == tagToSectionMap.end()) {
136             ALOGE("%s: Couldn't find previously added tag in map.", __FUNCTION__);
137             return UNKNOWN_ERROR;
138         }
139         String8 sectionString = String8(itr->second.c_str());
140         // Set up tag to section index map
141         ssize_t index = desc->mSections.indexOf(sectionString);
142         LOG_ALWAYS_FATAL_IF(index < 0, "index %zd must be non-negative", index);
143         desc->mTagToSectionMap.add(tag, static_cast<uint32_t>(index));
144 
145         // Set up reverse mapping
146         ssize_t reverseIndex = -1;
147         if ((reverseIndex = desc->mReverseMapping.indexOfKey(sectionString)) < 0) {
148             KeyedVector<String8, uint32_t>* nameMapper = new KeyedVector<String8, uint32_t>();
149             reverseIndex = desc->mReverseMapping.add(sectionString, nameMapper);
150         }
151         desc->mReverseMapping[reverseIndex]->add(desc->mTagToNameMap.valueFor(tag), tag);
152     }
153 
154     *descriptor = std::move(desc);
155     return OK;
156 }
157 
getInstance()158 std::shared_ptr<CameraManagerGlobal> CameraManagerGlobal::getInstance() {
159     Mutex::Autolock _l(sLock);
160     std::shared_ptr<CameraManagerGlobal> instance = sInstance.lock();
161     if (instance == nullptr) {
162         instance = std::make_shared<CameraManagerGlobal>();
163         sInstance = instance;
164     }
165     return instance;
166 }
167 
~CameraManagerGlobal()168 CameraManagerGlobal::~CameraManagerGlobal() {
169     Mutex::Autolock _sl(sLock);
170     Mutex::Autolock _l(mLock);
171     if (mCameraService != nullptr) {
172         AIBinder_unlinkToDeath(mCameraService->asBinder().get(),
173                                mDeathRecipient.get(), this);
174         auto stat = mCameraService->removeListener(mCameraServiceListener);
175         if (!stat.isOk()) {
176             ALOGE("Failed to remove listener to camera service %d:%d", stat.getExceptionCode(),
177                   stat.getServiceSpecificError());
178         }
179     }
180 
181     if (mCbLooper != nullptr) {
182         mCbLooper->unregisterHandler(mHandler->id());
183         mCbLooper->stop();
184     }
185     mCbLooper.clear();
186     mHandler.clear();
187     mCameraServiceListener.reset();
188     mCameraService.reset();
189 }
190 
isCameraServiceDisabled()191 static bool isCameraServiceDisabled() {
192     char value[PROPERTY_VALUE_MAX];
193     property_get("config.disable_cameraservice", value, "0");
194     return (strncmp(value, "0", 2) != 0 && strncasecmp(value, "false", 6) != 0);
195 }
196 
setupVendorTags()197 bool CameraManagerGlobal::setupVendorTags() {
198     sp<VendorTagDescriptorCache> tagCache = new VendorTagDescriptorCache();
199     Status status = Status::NO_ERROR;
200     std::vector<ProviderIdAndVendorTagSections> providerIdsAndVts;
201     ScopedAStatus remoteRet = mCameraService->getCameraVendorTagSections(&providerIdsAndVts);
202 
203     if (!remoteRet.isOk()) {
204         if (remoteRet.getExceptionCode() == EX_SERVICE_SPECIFIC) {
205             Status errStatus = static_cast<Status>(remoteRet.getServiceSpecificError());
206             ALOGE("%s: Failed to retrieve VendorTagSections %s",
207                 __FUNCTION__, toString(status).c_str());
208         } else {
209             ALOGE("%s: Binder error when retrieving VendorTagSections: %d", __FUNCTION__,
210                 remoteRet.getExceptionCode());
211         }
212         return false;
213     }
214 
215     // Convert each providers VendorTagSections into a VendorTagDescriptor and
216     // add it to the cache
217     for (auto &providerIdAndVts : providerIdsAndVts) {
218         sp<VendorTagDescriptor> vendorTagDescriptor;
219         status_t ret = AidlVendorTagDescriptor::createDescriptorFromAidl(
220                 providerIdAndVts.vendorTagSections, &vendorTagDescriptor);
221         if (ret != OK) {
222             ALOGE("Failed to convert from Aidl: VendorTagDescriptor: %d", ret);
223             return false;
224         }
225         tagCache->addVendorDescriptor(providerIdAndVts.providerId, vendorTagDescriptor);
226     }
227     VendorTagDescriptorCache::setAsGlobalVendorTagCache(tagCache);
228     return true;
229 }
230 
getCameraService()231 std::shared_ptr<ICameraService> CameraManagerGlobal::getCameraService() {
232     Mutex::Autolock _l(mLock);
233 
234     if (mCameraService != nullptr) {
235         // Camera service already set up. Return existing value.
236         return mCameraService;
237     }
238 
239     if (isCameraServiceDisabled()) {
240         // Camera service is disabled. return nullptr.
241         return mCameraService;
242     }
243 
244     std::string serviceName = ICameraService::descriptor;
245     serviceName += "/default";
246 
247     bool isDeclared = AServiceManager_isDeclared(serviceName.c_str());
248     if (!isDeclared) {
249         ALOGE("%s: No ICameraService instance declared: %s", __FUNCTION__, serviceName.c_str());
250         return nullptr;
251     }
252 
253     // Before doing any more make sure there is a binder threadpool alive
254     // This is a no-op if the binder threadpool was already started by this process.
255     ABinderProcess_startThreadPool();
256 
257     std::shared_ptr<ICameraService> cameraService =
258             ICameraService::fromBinder(ndk::SpAIBinder(
259                     AServiceManager_waitForService(serviceName.c_str())));
260     if (cameraService == nullptr) {
261         ALOGE("%s: Could not get ICameraService instance.", __FUNCTION__);
262         return nullptr;
263     }
264 
265     if (mDeathRecipient.get() == nullptr) {
266         mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(
267                 AIBinder_DeathRecipient_new(CameraManagerGlobal::binderDeathCallback));
268     }
269     AIBinder_linkToDeath(cameraService->asBinder().get(),
270                          mDeathRecipient.get(), /*cookie=*/ this);
271 
272     mCameraService = cameraService;
273 
274     // Setup looper thread to perform availability callbacks
275     if (mCbLooper == nullptr) {
276         mCbLooper = new ALooper;
277         mCbLooper->setName("C2N-mgr-looper");
278         status_t err = mCbLooper->start(
279                 /*runOnCallingThread*/false,
280                 /*canCallJava*/       true,
281                 PRIORITY_DEFAULT);
282         if (err != OK) {
283             ALOGE("%s: Unable to start camera service listener looper: %s (%d)",
284                     __FUNCTION__, strerror(-err), err);
285             mCbLooper.clear();
286             return nullptr;
287         }
288         if (mHandler == nullptr) {
289             mHandler = new CallbackHandler(weak_from_this());
290         }
291         mCbLooper->registerHandler(mHandler);
292     }
293 
294     // register ICameraServiceListener
295     if (mCameraServiceListener == nullptr) {
296         mCameraServiceListener = ndk::SharedRefBase::make<CameraServiceListener>(weak_from_this());
297     }
298 
299     std::vector<CameraStatusAndId> cameraStatuses;
300     Status status = Status::NO_ERROR;
301     ScopedAStatus remoteRet = mCameraService->addListener(mCameraServiceListener,
302                                                           &cameraStatuses);
303 
304     if (!remoteRet.isOk()) {
305         if (remoteRet.getExceptionCode() == EX_SERVICE_SPECIFIC) {
306             Status errStatus = static_cast<Status>(remoteRet.getServiceSpecificError());
307             ALOGE("%s: Failed to add listener to camera service: %s", __FUNCTION__,
308                 toString(errStatus).c_str());
309         } else {
310             ALOGE("%s: Transaction failed when adding listener to camera service: %d",
311                 __FUNCTION__, remoteRet.getExceptionCode());
312         }
313     }
314 
315     // Setup vendor tags
316     if (!setupVendorTags()) {
317         ALOGE("Unable to set up vendor tags");
318         return nullptr;
319     }
320 
321     for (auto& csi: cameraStatuses){
322         onStatusChangedLocked(csi.deviceStatus, csi.cameraId);
323 
324         for (auto& unavailablePhysicalId : csi.unavailPhysicalCameraIds) {
325             onStatusChangedLocked(CameraDeviceStatus::STATUS_NOT_PRESENT,
326                                   csi.cameraId, unavailablePhysicalId);
327         }
328     }
329     return mCameraService;
330 }
331 
binderDeathCallback(void *)332 void CameraManagerGlobal::binderDeathCallback(void* /*cookie*/) {
333     AutoMutex _l(sLock);
334 
335     ALOGE("Camera service binderDied!");
336     std::shared_ptr<CameraManagerGlobal> instance = sInstance.lock();
337     if (instance == nullptr) {
338         return;
339     }
340 
341     // Remove cameraService from the static instance
342     AutoMutex lock(instance->mLock);
343     for (auto& pair : instance->mDeviceStatusMap) {
344         const auto &cameraId = pair.first;
345         const auto &deviceStatus = pair.second.getStatus();
346         instance->onStatusChangedLocked(deviceStatus, cameraId);
347     }
348     instance->mCameraService.reset();
349     // TODO: consider adding re-connect call here?
350 }
351 
registerAvailabilityCallback(const ACameraManager_AvailabilityCallbacks * callback)352 void CameraManagerGlobal::registerAvailabilityCallback(
353         const ACameraManager_AvailabilityCallbacks *callback) {
354     return registerAvailCallback<ACameraManager_AvailabilityCallbacks>(callback);
355 }
356 
unregisterAvailabilityCallback(const ACameraManager_AvailabilityCallbacks * callback)357 void CameraManagerGlobal::unregisterAvailabilityCallback(
358         const ACameraManager_AvailabilityCallbacks *callback) {
359     Mutex::Autolock _l(mLock);
360     drainPendingCallbacksLocked();
361     Callback cb(callback);
362     mCallbacks.erase(cb);
363 }
364 
registerExtendedAvailabilityCallback(const ACameraManager_ExtendedAvailabilityCallbacks * callback)365 void CameraManagerGlobal::registerExtendedAvailabilityCallback(
366         const ACameraManager_ExtendedAvailabilityCallbacks *callback) {
367     return registerAvailCallback<ACameraManager_ExtendedAvailabilityCallbacks>(callback);
368 }
369 
unregisterExtendedAvailabilityCallback(const ACameraManager_ExtendedAvailabilityCallbacks * callback)370 void CameraManagerGlobal::unregisterExtendedAvailabilityCallback(
371         const ACameraManager_ExtendedAvailabilityCallbacks *callback) {
372     Mutex::Autolock _l(mLock);
373     drainPendingCallbacksLocked();
374     Callback cb(callback);
375     mCallbacks.erase(cb);
376 }
377 
onCallbackCalled()378 void CameraManagerGlobal::onCallbackCalled() {
379     Mutex::Autolock _l(mLock);
380     if (mPendingCallbackCnt > 0) {
381         mPendingCallbackCnt--;
382     }
383     mCallbacksCond.signal();
384 }
385 
drainPendingCallbacksLocked()386 void CameraManagerGlobal::drainPendingCallbacksLocked() {
387     while (mPendingCallbackCnt > 0) {
388         auto res = mCallbacksCond.waitRelative(mLock, kCallbackDrainTimeout);
389         if (res != NO_ERROR) {
390             ALOGE("%s: Error waiting to drain callbacks: %s(%d)",
391                     __FUNCTION__, strerror(-res), res);
392             break;
393         }
394     }
395 }
396 
397 template <class T>
registerAvailCallback(const T * callback)398 void CameraManagerGlobal::registerAvailCallback(const T *callback) {
399     Mutex::Autolock _l(mLock);
400     Callback cb(callback);
401     auto res = mCallbacks.insert(cb);
402     if (!res.second) {
403         ALOGE("%s: Failed to register callback. Couldn't insert in map.", __FUNCTION__);
404         return;
405     }
406     // Send initial callbacks if callback is newly registered
407     for (auto& pair : mDeviceStatusMap) {
408         const std::string& cameraId = pair.first;
409         CameraDeviceStatus status = pair.second.getStatus();
410 
411         {
412             // Camera available/unavailable callback
413             sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
414             ACameraManager_AvailabilityCallback cbFunc = isStatusAvailable(status) ?
415                                                          cb.mAvailable : cb.mUnavailable;
416             msg->setPointer(kCallbackFpKey, (void *) cbFunc);
417             msg->setPointer(kContextKey, cb.mContext);
418             msg->setString(kCameraIdKey, AString(cameraId.c_str()));
419             mPendingCallbackCnt++;
420             msg->post();
421         }
422 
423         // Physical camera unavailable callback
424         std::set<std::string> unavailPhysicalIds = pair.second.getUnavailablePhysicalIds();
425         for (const auto& physicalCameraId : unavailPhysicalIds) {
426             sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
427             ACameraManager_PhysicalCameraAvailabilityCallback cbFunc =
428                     cb.mPhysicalCamUnavailable;
429             msg->setPointer(kCallbackFpKey, (void *) cbFunc);
430             msg->setPointer(kContextKey, cb.mContext);
431             msg->setString(kCameraIdKey, AString(cameraId.c_str()));
432             msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId.c_str()));
433             mPendingCallbackCnt++;
434             msg->post();
435         }
436     }
437 }
438 
getCameraIdList(std::vector<std::string> * cameraIds)439 void CameraManagerGlobal::getCameraIdList(std::vector<std::string>* cameraIds) {
440     // Ensure that we have initialized/refreshed the list of available devices
441     auto cs = getCameraService();
442     Mutex::Autolock _l(mLock);
443 
444     for(auto& deviceStatus : mDeviceStatusMap) {
445         CameraDeviceStatus status = deviceStatus.second.getStatus();
446         if (status == CameraDeviceStatus::STATUS_NOT_PRESENT ||
447                 status == CameraDeviceStatus::STATUS_ENUMERATING) {
448             continue;
449         }
450         cameraIds->push_back(deviceStatus.first);
451     }
452 }
453 
validStatus(CameraDeviceStatus status)454 bool CameraManagerGlobal::validStatus(CameraDeviceStatus status) {
455     switch (status) {
456         case CameraDeviceStatus::STATUS_NOT_PRESENT:
457         case CameraDeviceStatus::STATUS_PRESENT:
458         case CameraDeviceStatus::STATUS_ENUMERATING:
459         case CameraDeviceStatus::STATUS_NOT_AVAILABLE:
460             return true;
461         default:
462             return false;
463     }
464 }
465 
isStatusAvailable(CameraDeviceStatus status)466 bool CameraManagerGlobal::isStatusAvailable(CameraDeviceStatus status) {
467     switch (status) {
468         case CameraDeviceStatus::STATUS_PRESENT:
469             return true;
470         default:
471             return false;
472     }
473 }
474 
onMessageReceived(const sp<AMessage> & msg)475 void CameraManagerGlobal::CallbackHandler::onMessageReceived(
476       const sp<AMessage> &msg) {
477     onMessageReceivedInternal(msg);
478     if (msg->what() == kWhatSendSingleCallback ||
479             msg->what() == kWhatSendSinglePhysicalCameraCallback) {
480         notifyParent();
481     }
482 }
483 
onMessageReceivedInternal(const sp<AMessage> & msg)484 void CameraManagerGlobal::CallbackHandler::onMessageReceivedInternal(
485         const sp<AMessage> &msg) {
486     switch (msg->what()) {
487         case kWhatSendSingleCallback:
488         {
489             ACameraManager_AvailabilityCallback cb;
490             void* context;
491             AString cameraId;
492             bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
493             if (!found) {
494                 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
495                 return;
496             }
497             found = msg->findPointer(kContextKey, &context);
498             if (!found) {
499                 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
500                 return;
501             }
502             found = msg->findString(kCameraIdKey, &cameraId);
503             if (!found) {
504                 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
505                 return;
506             }
507             (*cb)(context, cameraId.c_str());
508             break;
509         }
510         case kWhatSendSinglePhysicalCameraCallback:
511         {
512             ACameraManager_PhysicalCameraAvailabilityCallback cb;
513             void* context;
514             AString cameraId;
515             AString physicalCameraId;
516             bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
517             if (!found) {
518                 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
519                 return;
520             }
521             if (cb == nullptr) {
522                 // Physical camera callback is null
523                 return;
524             }
525             found = msg->findPointer(kContextKey, &context);
526             if (!found) {
527                 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
528                 return;
529             }
530             found = msg->findString(kCameraIdKey, &cameraId);
531             if (!found) {
532                 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
533                 return;
534             }
535             found = msg->findString(kPhysicalCameraIdKey, &physicalCameraId);
536             if (!found) {
537                 ALOGE("%s: Cannot find physical camera ID!", __FUNCTION__);
538                 return;
539             }
540             (*cb)(context, cameraId.c_str(), physicalCameraId.c_str());
541             break;
542         }
543         default:
544             ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what());
545             break;
546     }
547 }
548 
notifyParent()549 void CameraManagerGlobal::CallbackHandler::notifyParent() {
550     std::shared_ptr<CameraManagerGlobal> parent = mParent.lock();
551     if (parent != nullptr) {
552         parent->onCallbackCalled();
553     }
554 }
555 
onStatusChanged(CameraDeviceStatus status,const std::string & cameraId)556 ScopedAStatus CameraManagerGlobal::CameraServiceListener::onStatusChanged(
557         CameraDeviceStatus status, const std::string &cameraId) {
558     std::shared_ptr<CameraManagerGlobal> cm = mCameraManager.lock();
559     if (cm != nullptr) {
560         cm->onStatusChanged(status, cameraId);
561     } else {
562         ALOGE("Cannot deliver status change. Global camera manager died");
563     }
564     return ScopedAStatus::ok();
565 }
566 
onStatusChanged(const CameraDeviceStatus & status,const std::string & cameraId)567 void CameraManagerGlobal::onStatusChanged(
568         const CameraDeviceStatus &status, const std::string &cameraId) {
569     Mutex::Autolock _l(mLock);
570     onStatusChangedLocked(status, cameraId);
571 }
572 
onStatusChangedLocked(const CameraDeviceStatus & status,const std::string & cameraId)573 void CameraManagerGlobal::onStatusChangedLocked(
574         const CameraDeviceStatus &status, const std::string &cameraId) {
575     if (!validStatus(status)) {
576         ALOGE("%s: Invalid status %d", __FUNCTION__, status);
577         return;
578     }
579 
580     bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0);
581     CameraDeviceStatus oldStatus = firstStatus ?
582             status : // first status
583             mDeviceStatusMap[cameraId].getStatus();
584 
585     if (!firstStatus &&
586             isStatusAvailable(status) == isStatusAvailable(oldStatus)) {
587         // No status update. No need to send callback
588         return;
589     }
590 
591     // Iterate through all registered callbacks
592     mDeviceStatusMap[cameraId].updateStatus(status);
593     for (auto cb : mCallbacks) {
594         sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
595         ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ?
596                 cb.mAvailable : cb.mUnavailable;
597         msg->setPointer(kCallbackFpKey, (void *) cbFp);
598         msg->setPointer(kContextKey, cb.mContext);
599         msg->setString(kCameraIdKey, AString(cameraId.c_str()));
600         mPendingCallbackCnt++;
601         msg->post();
602     }
603     if (status == CameraDeviceStatus::STATUS_NOT_PRESENT) {
604         mDeviceStatusMap.erase(cameraId);
605     }
606 }
607 
onPhysicalCameraStatusChanged(CameraDeviceStatus in_status,const std::string & in_cameraId,const std::string & in_physicalCameraId)608 ScopedAStatus CameraManagerGlobal::CameraServiceListener::onPhysicalCameraStatusChanged(
609         CameraDeviceStatus in_status, const std::string& in_cameraId,
610         const std::string& in_physicalCameraId) {
611     std::shared_ptr<CameraManagerGlobal> cm = mCameraManager.lock();
612     if (cm != nullptr) {
613         cm->onStatusChanged(in_status, in_cameraId, in_physicalCameraId);
614     } else {
615         ALOGE("Cannot deliver status change. Global camera manager died");
616     }
617     return ScopedAStatus::ok();
618 }
619 
onStatusChanged(const CameraDeviceStatus & status,const std::string & cameraId,const std::string & physicalCameraId)620 void CameraManagerGlobal::onStatusChanged(
621         const CameraDeviceStatus &status, const std::string& cameraId,
622         const std::string& physicalCameraId) {
623     Mutex::Autolock _l(mLock);
624     onStatusChangedLocked(status, cameraId, physicalCameraId);
625 }
626 
onStatusChangedLocked(const CameraDeviceStatus & status,const std::string & cameraId,const std::string & physicalCameraId)627 void CameraManagerGlobal::onStatusChangedLocked(
628         const CameraDeviceStatus &status, const std::string& cameraId,
629         const std::string& physicalCameraId) {
630     if (!validStatus(status)) {
631         ALOGE("%s: Invalid status %d", __FUNCTION__, status);
632         return;
633     }
634 
635     auto logicalStatus = mDeviceStatusMap.find(cameraId);
636     if (logicalStatus == mDeviceStatusMap.end()) {
637         ALOGE("%s: Physical camera id %s status change on a non-present id %s",
638                 __FUNCTION__, physicalCameraId.c_str(), cameraId.c_str());
639         return;
640     }
641     CameraDeviceStatus logicalCamStatus = mDeviceStatusMap[cameraId].getStatus();
642     if (logicalCamStatus != CameraDeviceStatus::STATUS_PRESENT &&
643             logicalCamStatus != CameraDeviceStatus::STATUS_NOT_AVAILABLE) {
644         ALOGE("%s: Physical camera id %s status %d change for an invalid logical camera state %d",
645                 __FUNCTION__, physicalCameraId.c_str(), status, logicalCamStatus);
646         return;
647     }
648 
649     bool updated = false;
650     if (status == CameraDeviceStatus::STATUS_PRESENT) {
651         updated = mDeviceStatusMap[cameraId].removeUnavailablePhysicalId(physicalCameraId);
652     } else {
653         updated = mDeviceStatusMap[cameraId].addUnavailablePhysicalId(physicalCameraId);
654     }
655 
656     // Iterate through all registered callbacks
657     if (updated) {
658         for (auto cb : mCallbacks) {
659             sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
660             ACameraManager_PhysicalCameraAvailabilityCallback cbFp = isStatusAvailable(status) ?
661                     cb.mPhysicalCamAvailable : cb.mPhysicalCamUnavailable;
662             msg->setPointer(kCallbackFpKey, (void *) cbFp);
663             msg->setPointer(kContextKey, cb.mContext);
664             msg->setString(kCameraIdKey, AString(cameraId.c_str()));
665             msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId.c_str()));
666             mPendingCallbackCnt++;
667             msg->post();
668         }
669     }
670 }
671 
getStatus()672 CameraDeviceStatus CameraManagerGlobal::CameraStatus::getStatus() {
673     std::lock_guard<std::mutex> lock(mLock);
674     return status;
675 }
676 
updateStatus(CameraDeviceStatus newStatus)677 void CameraManagerGlobal::CameraStatus::updateStatus(CameraDeviceStatus newStatus) {
678     std::lock_guard<std::mutex> lock(mLock);
679     status = newStatus;
680 }
681 
addUnavailablePhysicalId(const std::string & physicalCameraId)682 bool CameraManagerGlobal::CameraStatus::addUnavailablePhysicalId(
683         const std::string& physicalCameraId) {
684     std::lock_guard<std::mutex> lock(mLock);
685     auto result = unavailablePhysicalIds.insert(physicalCameraId);
686     return result.second;
687 }
688 
removeUnavailablePhysicalId(const std::string & physicalCameraId)689 bool CameraManagerGlobal::CameraStatus::removeUnavailablePhysicalId(
690         const std::string& physicalCameraId) {
691     std::lock_guard<std::mutex> lock(mLock);
692     auto count = unavailablePhysicalIds.erase(physicalCameraId);
693     return count > 0;
694 }
695 
getUnavailablePhysicalIds()696 std::set<std::string> CameraManagerGlobal::CameraStatus::getUnavailablePhysicalIds() {
697     std::lock_guard<std::mutex> lock(mLock);
698     return unavailablePhysicalIds;
699 }
700 
701 } // namespace acam
702 } // namespace android
703 
704 /**
705  * ACameraManger Implementation
706  */
getCameraIdList(ACameraIdList ** cameraIdList)707 camera_status_t ACameraManager::getCameraIdList(ACameraIdList** cameraIdList) {
708     Mutex::Autolock _l(mLock);
709 
710     std::vector<std::string> idList;
711     CameraManagerGlobal::getInstance()->getCameraIdList(&idList);
712 
713     int numCameras = idList.size();
714     ACameraIdList *out = new ACameraIdList;
715     if (out == nullptr) {
716         ALOGE("Allocate memory for ACameraIdList failed!");
717         return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
718     }
719     out->numCameras = numCameras;
720     out->cameraIds = new const char*[numCameras];
721     if (!out->cameraIds) {
722         ALOGE("Allocate memory for ACameraIdList failed!");
723         deleteCameraIdList(out);
724         return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
725     }
726     for (int i = 0; i < numCameras; i++) {
727         const char* src = idList[i].c_str();
728         size_t dstSize = strlen(src) + 1;
729         char* dst = new char[dstSize];
730         if (!dst) {
731             ALOGE("Allocate memory for ACameraIdList failed!");
732             deleteCameraIdList(out);
733             return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
734         }
735         strlcpy(dst, src, dstSize);
736         out->cameraIds[i] = dst;
737     }
738     *cameraIdList = out;
739     return ACAMERA_OK;
740 }
741 
742 void
deleteCameraIdList(ACameraIdList * cameraIdList)743 ACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) {
744     if (cameraIdList != nullptr) {
745         if (cameraIdList->cameraIds != nullptr) {
746             for (int i = 0; i < cameraIdList->numCameras; i ++) {
747                 if (cameraIdList->cameraIds[i] != nullptr) {
748                     delete[] cameraIdList->cameraIds[i];
749                 }
750             }
751             delete[] cameraIdList->cameraIds;
752         }
753         delete cameraIdList;
754     }
755 }
756 
getCameraCharacteristics(const char * cameraIdStr,sp<ACameraMetadata> * characteristics)757 camera_status_t ACameraManager::getCameraCharacteristics(const char *cameraIdStr,
758                                                          sp<ACameraMetadata> *characteristics) {
759     using AidlCameraMetadata = ::aidl::android::frameworks::cameraservice::device::CameraMetadata;
760     Mutex::Autolock _l(mLock);
761 
762     std::shared_ptr<ICameraService> cs = CameraManagerGlobal::getInstance()->getCameraService();
763     if (cs == nullptr) {
764         ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
765         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
766     }
767     AidlCameraMetadata rawMetadata;
768     ScopedAStatus serviceRet = cs->getCameraCharacteristics(cameraIdStr, &rawMetadata);
769 
770     if (!serviceRet.isOk()) {
771         if (serviceRet.getExceptionCode() == EX_SERVICE_SPECIFIC) {
772             Status errStatus = static_cast<Status>(serviceRet.getServiceSpecificError());
773             ALOGE("%s: Get camera characteristics from camera service failed: %s",
774                 __FUNCTION__, toString(errStatus).c_str());
775         } else {
776             ALOGE("%s: Transaction error when getting camera "
777                   "characteristics from camera service: %d",
778                 __FUNCTION__, serviceRet.getExceptionCode());
779         }
780         return ACAMERA_ERROR_UNKNOWN; // should not reach here
781     }
782 
783     camera_metadata_t* metadataBuffer;
784     ::android::acam::utils::cloneFromAidl(rawMetadata, &metadataBuffer);
785 
786     *characteristics = new ACameraMetadata(metadataBuffer,
787                                            ACameraMetadata::ACM_CHARACTERISTICS);
788     return ACAMERA_OK;
789 }
790 
791 camera_status_t
openCamera(const char * cameraId,ACameraDevice_StateCallbacks * callback,ACameraDevice ** outDevice)792 ACameraManager::openCamera(
793         const char* cameraId,
794         ACameraDevice_StateCallbacks* callback,
795         /*out*/ACameraDevice** outDevice) {
796     sp<ACameraMetadata> rawChars;
797     camera_status_t ret = getCameraCharacteristics(cameraId, &rawChars);
798     Mutex::Autolock _l(mLock);
799     if (ret != ACAMERA_OK) {
800         ALOGE("%s: cannot get camera characteristics for camera %s. err %d",
801                 __FUNCTION__, cameraId, ret);
802         return ACAMERA_ERROR_INVALID_PARAMETER;
803     }
804 
805     ACameraDevice* device = new ACameraDevice(cameraId, callback, std::move(rawChars));
806 
807     std::shared_ptr<ICameraService> cs = CameraManagerGlobal::getInstance()->getCameraService();
808     if (cs == nullptr) {
809         ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
810         delete device;
811         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
812     }
813 
814     std::shared_ptr<BnCameraDeviceCallback> deviceCallback = device->getServiceCallback();
815     std::shared_ptr<ICameraDeviceUser> deviceRemote;
816 
817     // No way to get package name from native.
818     // Send a zero length package name and let camera service figure it out from UID
819     ScopedAStatus serviceRet = cs->connectDevice(deviceCallback,
820                                                  std::string(cameraId), &deviceRemote);
821     if (!serviceRet.isOk()) {
822         if (serviceRet.getExceptionCode() == EX_SERVICE_SPECIFIC) {
823             Status errStatus = static_cast<Status>(serviceRet.getServiceSpecificError());
824             ALOGE("%s: connect camera device failed: %s",
825                   __FUNCTION__, toString(errStatus).c_str());
826             delete device;
827             return utils::convertFromAidl(errStatus);
828         } else {
829             ALOGE("%s: Transaction failed when connecting camera device: %d",
830                 __FUNCTION__, serviceRet.getExceptionCode());
831             delete device;
832             return ACAMERA_ERROR_UNKNOWN;
833         }
834     }
835 
836     if (deviceRemote == nullptr) {
837         ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__);
838         delete device;
839         return ACAMERA_ERROR_CAMERA_DISCONNECTED;
840     }
841 
842     device->setRemoteDevice(deviceRemote);
843     device->setDeviceMetadataQueues();
844     *outDevice = device;
845     return ACAMERA_OK;
846 }
847 
848 camera_status_t
getTagFromName(const char * cameraId,const char * name,uint32_t * tag)849 ACameraManager::getTagFromName(const char *cameraId, const char *name, uint32_t *tag) {
850     sp<ACameraMetadata> rawChars;
851     camera_status_t ret = getCameraCharacteristics(cameraId, &rawChars);
852     if (ret != ACAMERA_OK) {
853         ALOGE("%s, Cannot retrieve camera characteristics for camera id %s", __FUNCTION__,
854                 cameraId);
855         return ACAMERA_ERROR_METADATA_NOT_FOUND;
856     }
857     const CameraMetadata& metadata = rawChars->getInternalData();
858     const camera_metadata_t *rawMetadata = metadata.getAndLock();
859     metadata_vendor_id_t vendorTagId = get_camera_metadata_vendor_id(rawMetadata);
860     metadata.unlock(rawMetadata);
861     sp<VendorTagDescriptorCache> vtCache = VendorTagDescriptorCache::getGlobalVendorTagCache();
862     sp<VendorTagDescriptor> vTags = nullptr;
863     vtCache->getVendorTagDescriptor(vendorTagId, &vTags);
864     status_t status = CameraMetadata::getTagFromName(name, vTags.get(), tag);
865     return status == OK ? ACAMERA_OK : ACAMERA_ERROR_METADATA_NOT_FOUND;
866 }
867 
~ACameraManager()868 ACameraManager::~ACameraManager() {
869 
870 }
871