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