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 <memory>
21 #include "ACameraManager.h"
22 #include "ACameraMetadata.h"
23 #include "ACameraDevice.h"
24 #include <utils/Vector.h>
25 #include <cutils/properties.h>
26 #include <stdlib.h>
27 #include <camera/CameraUtils.h>
28 #include <camera/VendorTagDescriptor.h>
29
30 using namespace android::acam;
31
32 namespace android {
33 namespace acam {
34 // Static member definitions
35 const char* CameraManagerGlobal::kCameraIdKey = "CameraId";
36 const char* CameraManagerGlobal::kPhysicalCameraIdKey = "PhysicalCameraId";
37 const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp";
38 const char* CameraManagerGlobal::kContextKey = "CallbackContext";
39 const nsecs_t CameraManagerGlobal::kCallbackDrainTimeout = 5000000; // 5 ms
40 Mutex CameraManagerGlobal::sLock;
41 CameraManagerGlobal* CameraManagerGlobal::sInstance = nullptr;
42
43 CameraManagerGlobal&
getInstance()44 CameraManagerGlobal::getInstance() {
45 Mutex::Autolock _l(sLock);
46 CameraManagerGlobal* instance = sInstance;
47 if (instance == nullptr) {
48 instance = new CameraManagerGlobal();
49 sInstance = instance;
50 }
51 return *instance;
52 }
53
~CameraManagerGlobal()54 CameraManagerGlobal::~CameraManagerGlobal() {
55 // clear sInstance so next getInstance call knows to create a new one
56 Mutex::Autolock _sl(sLock);
57 sInstance = nullptr;
58 Mutex::Autolock _l(mLock);
59 if (mCameraService != nullptr) {
60 IInterface::asBinder(mCameraService)->unlinkToDeath(mDeathNotifier);
61 mCameraService->removeListener(mCameraServiceListener);
62 }
63 mDeathNotifier.clear();
64 if (mCbLooper != nullptr) {
65 mCbLooper->unregisterHandler(mHandler->id());
66 mCbLooper->stop();
67 }
68 mCbLooper.clear();
69 mHandler.clear();
70 mCameraServiceListener.clear();
71 mCameraService.clear();
72 }
73
getCameraService()74 sp<hardware::ICameraService> CameraManagerGlobal::getCameraService() {
75 Mutex::Autolock _l(mLock);
76 return getCameraServiceLocked();
77 }
78
getCameraServiceLocked()79 sp<hardware::ICameraService> CameraManagerGlobal::getCameraServiceLocked() {
80 if (mCameraService.get() == nullptr) {
81 if (CameraUtils::isCameraServiceDisabled()) {
82 return mCameraService;
83 }
84
85 sp<IServiceManager> sm = defaultServiceManager();
86 sp<IBinder> binder;
87 do {
88 binder = sm->getService(String16(kCameraServiceName));
89 if (binder != nullptr) {
90 break;
91 }
92 ALOGW("CameraService not published, waiting...");
93 usleep(kCameraServicePollDelay);
94 } while(true);
95 if (mDeathNotifier == nullptr) {
96 mDeathNotifier = new DeathNotifier(this);
97 }
98 binder->linkToDeath(mDeathNotifier);
99 mCameraService = interface_cast<hardware::ICameraService>(binder);
100
101 // Setup looper thread to perfrom availiability callbacks
102 if (mCbLooper == nullptr) {
103 mCbLooper = new ALooper;
104 mCbLooper->setName("C2N-mgr-looper");
105 status_t err = mCbLooper->start(
106 /*runOnCallingThread*/false,
107 /*canCallJava*/ true,
108 PRIORITY_DEFAULT);
109 if (err != OK) {
110 ALOGE("%s: Unable to start camera service listener looper: %s (%d)",
111 __FUNCTION__, strerror(-err), err);
112 mCbLooper.clear();
113 return nullptr;
114 }
115 if (mHandler == nullptr) {
116 mHandler = new CallbackHandler(this);
117 }
118 mCbLooper->registerHandler(mHandler);
119 }
120
121 // register ICameraServiceListener
122 if (mCameraServiceListener == nullptr) {
123 mCameraServiceListener = new CameraServiceListener(this);
124 }
125 std::vector<hardware::CameraStatus> cameraStatuses{};
126 mCameraService->addListener(mCameraServiceListener, &cameraStatuses);
127 for (auto& c : cameraStatuses) {
128 onStatusChangedLocked(c.status, c.cameraId);
129
130 for (auto& unavailablePhysicalId : c.unavailablePhysicalIds) {
131 onStatusChangedLocked(hardware::ICameraServiceListener::STATUS_NOT_PRESENT,
132 c.cameraId, unavailablePhysicalId);
133 }
134 }
135
136 // setup vendor tags
137 sp<VendorTagDescriptor> desc = new VendorTagDescriptor();
138 binder::Status ret = mCameraService->getCameraVendorTagDescriptor(/*out*/desc.get());
139
140 if (ret.isOk()) {
141 if (0 < desc->getTagCount()) {
142 status_t err = VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc);
143 if (err != OK) {
144 ALOGE("%s: Failed to set vendor tag descriptors, received error %s (%d)",
145 __FUNCTION__, strerror(-err), err);
146 }
147 } else {
148 sp<VendorTagDescriptorCache> cache =
149 new VendorTagDescriptorCache();
150 binder::Status res =
151 mCameraService->getCameraVendorTagCache(
152 /*out*/cache.get());
153 if (res.serviceSpecificErrorCode() ==
154 hardware::ICameraService::ERROR_DISCONNECTED) {
155 // No camera module available, not an error on devices with no cameras
156 VendorTagDescriptorCache::clearGlobalVendorTagCache();
157 } else if (res.isOk()) {
158 status_t err =
159 VendorTagDescriptorCache::setAsGlobalVendorTagCache(
160 cache);
161 if (err != OK) {
162 ALOGE("%s: Failed to set vendor tag cache,"
163 "received error %s (%d)", __FUNCTION__,
164 strerror(-err), err);
165 }
166 } else {
167 VendorTagDescriptorCache::clearGlobalVendorTagCache();
168 ALOGE("%s: Failed to setup vendor tag cache: %s",
169 __FUNCTION__, res.toString8().string());
170 }
171 }
172 } else if (ret.serviceSpecificErrorCode() ==
173 hardware::ICameraService::ERROR_DEPRECATED_HAL) {
174 ALOGW("%s: Camera HAL too old; does not support vendor tags",
175 __FUNCTION__);
176 VendorTagDescriptor::clearGlobalVendorTagDescriptor();
177 } else {
178 ALOGE("%s: Failed to get vendor tag descriptors: %s",
179 __FUNCTION__, ret.toString8().string());
180 }
181 }
182 ALOGE_IF(mCameraService == nullptr, "no CameraService!?");
183 return mCameraService;
184 }
185
binderDied(const wp<IBinder> &)186 void CameraManagerGlobal::DeathNotifier::binderDied(const wp<IBinder>&)
187 {
188 ALOGE("Camera service binderDied!");
189 sp<CameraManagerGlobal> cm = mCameraManager.promote();
190 if (cm != nullptr) {
191 AutoMutex lock(cm->mLock);
192 for (auto& pair : cm->mDeviceStatusMap) {
193 const String8 &cameraId = pair.first;
194 cm->onStatusChangedLocked(
195 CameraServiceListener::STATUS_NOT_PRESENT, cameraId);
196 }
197 cm->mCameraService.clear();
198 // TODO: consider adding re-connect call here?
199 }
200 }
201
registerExtendedAvailabilityCallback(const ACameraManager_ExtendedAvailabilityCallbacks * callback)202 void CameraManagerGlobal::registerExtendedAvailabilityCallback(
203 const ACameraManager_ExtendedAvailabilityCallbacks *callback) {
204 return registerAvailCallback<ACameraManager_ExtendedAvailabilityCallbacks>(callback);
205 }
206
unregisterExtendedAvailabilityCallback(const ACameraManager_ExtendedAvailabilityCallbacks * callback)207 void CameraManagerGlobal::unregisterExtendedAvailabilityCallback(
208 const ACameraManager_ExtendedAvailabilityCallbacks *callback) {
209 Mutex::Autolock _l(mLock);
210
211 drainPendingCallbacksLocked();
212
213 Callback cb(callback);
214 mCallbacks.erase(cb);
215 }
216
registerAvailabilityCallback(const ACameraManager_AvailabilityCallbacks * callback)217 void CameraManagerGlobal::registerAvailabilityCallback(
218 const ACameraManager_AvailabilityCallbacks *callback) {
219 return registerAvailCallback<ACameraManager_AvailabilityCallbacks>(callback);
220 }
221
unregisterAvailabilityCallback(const ACameraManager_AvailabilityCallbacks * callback)222 void CameraManagerGlobal::unregisterAvailabilityCallback(
223 const ACameraManager_AvailabilityCallbacks *callback) {
224 Mutex::Autolock _l(mLock);
225
226 drainPendingCallbacksLocked();
227
228 Callback cb(callback);
229 mCallbacks.erase(cb);
230 }
231
onCallbackCalled()232 void CameraManagerGlobal::onCallbackCalled() {
233 Mutex::Autolock _l(mLock);
234 if (mPendingCallbackCnt > 0) {
235 mPendingCallbackCnt--;
236 }
237 mCallbacksCond.signal();
238 }
239
drainPendingCallbacksLocked()240 void CameraManagerGlobal::drainPendingCallbacksLocked() {
241 while (mPendingCallbackCnt > 0) {
242 auto res = mCallbacksCond.waitRelative(mLock, kCallbackDrainTimeout);
243 if (res != NO_ERROR) {
244 ALOGE("%s: Error waiting to drain callbacks: %s(%d)",
245 __FUNCTION__, strerror(-res), res);
246 break;
247 }
248 }
249 }
250
251 template<class T>
registerAvailCallback(const T * callback)252 void CameraManagerGlobal::registerAvailCallback(const T *callback) {
253 Mutex::Autolock _l(mLock);
254 Callback cb(callback);
255 auto pair = mCallbacks.insert(cb);
256 // Send initial callbacks if callback is newly registered
257 if (pair.second) {
258 for (auto& pair : mDeviceStatusMap) {
259 const String8& cameraId = pair.first;
260 int32_t status = pair.second.getStatus();
261 // Don't send initial callbacks for camera ids which don't support
262 // camera2
263 if (!pair.second.supportsHAL3) {
264 continue;
265 }
266
267 // Camera available/unavailable callback
268 sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
269 ACameraManager_AvailabilityCallback cbFunc = isStatusAvailable(status) ?
270 cb.mAvailable : cb.mUnavailable;
271 msg->setPointer(kCallbackFpKey, (void *) cbFunc);
272 msg->setPointer(kContextKey, cb.mContext);
273 msg->setString(kCameraIdKey, AString(cameraId));
274 mPendingCallbackCnt++;
275 msg->post();
276
277 // Physical camera unavailable callback
278 std::set<String8> unavailablePhysicalCameras =
279 pair.second.getUnavailablePhysicalIds();
280 for (const auto& physicalCameraId : unavailablePhysicalCameras) {
281 sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
282 ACameraManager_PhysicalCameraAvailabilityCallback cbFunc =
283 cb.mPhysicalCamUnavailable;
284 msg->setPointer(kCallbackFpKey, (void *) cbFunc);
285 msg->setPointer(kContextKey, cb.mContext);
286 msg->setString(kCameraIdKey, AString(cameraId));
287 msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId));
288 mPendingCallbackCnt++;
289 msg->post();
290 }
291 }
292 }
293 }
294
supportsCamera2ApiLocked(const String8 & cameraId)295 bool CameraManagerGlobal::supportsCamera2ApiLocked(const String8 &cameraId) {
296 bool camera2Support = false;
297 auto cs = getCameraServiceLocked();
298 binder::Status serviceRet =
299 cs->supportsCameraApi(String16(cameraId),
300 hardware::ICameraService::API_VERSION_2, &camera2Support);
301 if (!serviceRet.isOk()) {
302 ALOGE("%s: supportsCameraApi2Locked() call failed for cameraId %s",
303 __FUNCTION__, cameraId.c_str());
304 return false;
305 }
306 return camera2Support;
307 }
308
getCameraIdList(std::vector<String8> * cameraIds)309 void CameraManagerGlobal::getCameraIdList(std::vector<String8>* cameraIds) {
310 // Ensure that we have initialized/refreshed the list of available devices
311 Mutex::Autolock _l(mLock);
312 // Needed to make sure we're connected to cameraservice
313 getCameraServiceLocked();
314 for(auto& deviceStatus : mDeviceStatusMap) {
315 int32_t status = deviceStatus.second.getStatus();
316 if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT ||
317 status == hardware::ICameraServiceListener::STATUS_ENUMERATING) {
318 continue;
319 }
320 if (!deviceStatus.second.supportsHAL3) {
321 continue;
322 }
323 cameraIds->push_back(deviceStatus.first);
324 }
325 }
326
validStatus(int32_t status)327 bool CameraManagerGlobal::validStatus(int32_t status) {
328 switch (status) {
329 case hardware::ICameraServiceListener::STATUS_NOT_PRESENT:
330 case hardware::ICameraServiceListener::STATUS_PRESENT:
331 case hardware::ICameraServiceListener::STATUS_ENUMERATING:
332 case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE:
333 return true;
334 default:
335 return false;
336 }
337 }
338
isStatusAvailable(int32_t status)339 bool CameraManagerGlobal::isStatusAvailable(int32_t status) {
340 switch (status) {
341 case hardware::ICameraServiceListener::STATUS_PRESENT:
342 return true;
343 default:
344 return false;
345 }
346 }
347
onMessageReceived(const sp<AMessage> & msg)348 void CameraManagerGlobal::CallbackHandler::onMessageReceived(
349 const sp<AMessage> &msg) {
350 onMessageReceivedInternal(msg);
351 if (msg->what() == kWhatSendSingleCallback ||
352 msg->what() == kWhatSendSingleAccessCallback ||
353 msg->what() == kWhatSendSinglePhysicalCameraCallback) {
354 notifyParent();
355 }
356 }
357
onMessageReceivedInternal(const sp<AMessage> & msg)358 void CameraManagerGlobal::CallbackHandler::onMessageReceivedInternal(
359 const sp<AMessage> &msg) {
360 switch (msg->what()) {
361 case kWhatSendSingleCallback:
362 {
363 ACameraManager_AvailabilityCallback cb;
364 void* context;
365 AString cameraId;
366 bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
367 if (!found) {
368 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
369 return;
370 }
371 found = msg->findPointer(kContextKey, &context);
372 if (!found) {
373 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
374 return;
375 }
376 found = msg->findString(kCameraIdKey, &cameraId);
377 if (!found) {
378 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
379 return;
380 }
381 (*cb)(context, cameraId.c_str());
382 break;
383 }
384 case kWhatSendSingleAccessCallback:
385 {
386 ACameraManager_AccessPrioritiesChangedCallback cb;
387 void* context;
388 AString cameraId;
389 bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
390 if (!found) {
391 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
392 return;
393 }
394 found = msg->findPointer(kContextKey, &context);
395 if (!found) {
396 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
397 return;
398 }
399 (*cb)(context);
400 break;
401 }
402 case kWhatSendSinglePhysicalCameraCallback:
403 {
404 ACameraManager_PhysicalCameraAvailabilityCallback cb;
405 void* context;
406 AString cameraId;
407 AString physicalCameraId;
408 bool found = msg->findPointer(kCallbackFpKey, (void**) &cb);
409 if (!found) {
410 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__);
411 return;
412 }
413 if (cb == nullptr) {
414 // Physical camera callback is null
415 return;
416 }
417 found = msg->findPointer(kContextKey, &context);
418 if (!found) {
419 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
420 return;
421 }
422 found = msg->findString(kCameraIdKey, &cameraId);
423 if (!found) {
424 ALOGE("%s: Cannot find camera ID!", __FUNCTION__);
425 return;
426 }
427 found = msg->findString(kPhysicalCameraIdKey, &physicalCameraId);
428 if (!found) {
429 ALOGE("%s: Cannot find physical camera ID!", __FUNCTION__);
430 return;
431 }
432 (*cb)(context, cameraId.c_str(), physicalCameraId.c_str());
433 break;
434 }
435 default:
436 ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what());
437 break;
438 }
439 }
440
notifyParent()441 void CameraManagerGlobal::CallbackHandler::notifyParent() {
442 sp<CameraManagerGlobal> parent = mParent.promote();
443 if (parent != nullptr) {
444 parent->onCallbackCalled();
445 }
446 }
447
onCameraAccessPrioritiesChanged()448 binder::Status CameraManagerGlobal::CameraServiceListener::onCameraAccessPrioritiesChanged() {
449 sp<CameraManagerGlobal> cm = mCameraManager.promote();
450 if (cm != nullptr) {
451 cm->onCameraAccessPrioritiesChanged();
452 } else {
453 ALOGE("Cannot deliver camera access priority callback. Global camera manager died");
454 }
455 return binder::Status::ok();
456 }
457
onStatusChanged(int32_t status,const String16 & cameraId)458 binder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged(
459 int32_t status, const String16& cameraId) {
460 sp<CameraManagerGlobal> cm = mCameraManager.promote();
461 if (cm != nullptr) {
462 cm->onStatusChanged(status, String8(cameraId));
463 } else {
464 ALOGE("Cannot deliver status change. Global camera manager died");
465 }
466 return binder::Status::ok();
467 }
468
onPhysicalCameraStatusChanged(int32_t status,const String16 & cameraId,const String16 & physicalCameraId)469 binder::Status CameraManagerGlobal::CameraServiceListener::onPhysicalCameraStatusChanged(
470 int32_t status, const String16& cameraId, const String16& physicalCameraId) {
471 sp<CameraManagerGlobal> cm = mCameraManager.promote();
472 if (cm != nullptr) {
473 cm->onStatusChanged(status, String8(cameraId), String8(physicalCameraId));
474 } else {
475 ALOGE("Cannot deliver physical camera status change. Global camera manager died");
476 }
477 return binder::Status::ok();
478 }
479
onCameraAccessPrioritiesChanged()480 void CameraManagerGlobal::onCameraAccessPrioritiesChanged() {
481 Mutex::Autolock _l(mLock);
482 for (auto cb : mCallbacks) {
483 sp<AMessage> msg = new AMessage(kWhatSendSingleAccessCallback, mHandler);
484 ACameraManager_AccessPrioritiesChangedCallback cbFp = cb.mAccessPriorityChanged;
485 if (cbFp != nullptr) {
486 msg->setPointer(kCallbackFpKey, (void *) cbFp);
487 msg->setPointer(kContextKey, cb.mContext);
488 mPendingCallbackCnt++;
489 msg->post();
490 }
491 }
492 }
493
onStatusChanged(int32_t status,const String8 & cameraId)494 void CameraManagerGlobal::onStatusChanged(
495 int32_t status, const String8& cameraId) {
496 Mutex::Autolock _l(mLock);
497 onStatusChangedLocked(status, cameraId);
498 }
499
onStatusChangedLocked(int32_t status,const String8 & cameraId)500 void CameraManagerGlobal::onStatusChangedLocked(
501 int32_t status, const String8& cameraId) {
502 if (!validStatus(status)) {
503 ALOGE("%s: Invalid status %d", __FUNCTION__, status);
504 return;
505 }
506
507 bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0);
508 int32_t oldStatus = firstStatus ?
509 status : // first status
510 mDeviceStatusMap[cameraId].getStatus();
511
512 if (!firstStatus &&
513 isStatusAvailable(status) == isStatusAvailable(oldStatus)) {
514 // No status update. No need to send callback
515 return;
516 }
517
518 bool supportsHAL3 = supportsCamera2ApiLocked(cameraId);
519 if (firstStatus) {
520 mDeviceStatusMap.emplace(std::piecewise_construct,
521 std::forward_as_tuple(cameraId),
522 std::forward_as_tuple(status, supportsHAL3));
523 } else {
524 mDeviceStatusMap[cameraId].updateStatus(status);
525 }
526 // Iterate through all registered callbacks
527 if (supportsHAL3) {
528 for (auto cb : mCallbacks) {
529 sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler);
530 ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ?
531 cb.mAvailable : cb.mUnavailable;
532 msg->setPointer(kCallbackFpKey, (void *) cbFp);
533 msg->setPointer(kContextKey, cb.mContext);
534 msg->setString(kCameraIdKey, AString(cameraId));
535 mPendingCallbackCnt++;
536 msg->post();
537 }
538 }
539 if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT) {
540 mDeviceStatusMap.erase(cameraId);
541 }
542 }
543
onStatusChanged(int32_t status,const String8 & cameraId,const String8 & physicalCameraId)544 void CameraManagerGlobal::onStatusChanged(
545 int32_t status, const String8& cameraId, const String8& physicalCameraId) {
546 Mutex::Autolock _l(mLock);
547 onStatusChangedLocked(status, cameraId, physicalCameraId);
548 }
549
onStatusChangedLocked(int32_t status,const String8 & cameraId,const String8 & physicalCameraId)550 void CameraManagerGlobal::onStatusChangedLocked(
551 int32_t status, const String8& cameraId, const String8& physicalCameraId) {
552 if (!validStatus(status)) {
553 ALOGE("%s: Invalid status %d", __FUNCTION__, status);
554 return;
555 }
556
557 auto logicalStatus = mDeviceStatusMap.find(cameraId);
558 if (logicalStatus == mDeviceStatusMap.end()) {
559 ALOGE("%s: Physical camera id %s status change on a non-present id %s",
560 __FUNCTION__, physicalCameraId.c_str(), cameraId.c_str());
561 return;
562 }
563 int32_t logicalCamStatus = mDeviceStatusMap[cameraId].getStatus();
564 if (logicalCamStatus != hardware::ICameraServiceListener::STATUS_PRESENT &&
565 logicalCamStatus != hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE) {
566 ALOGE("%s: Physical camera id %s status %d change for an invalid logical camera state %d",
567 __FUNCTION__, physicalCameraId.string(), status, logicalCamStatus);
568 return;
569 }
570
571 bool supportsHAL3 = supportsCamera2ApiLocked(cameraId);
572
573 bool updated = false;
574 if (status == hardware::ICameraServiceListener::STATUS_PRESENT) {
575 updated = mDeviceStatusMap[cameraId].removeUnavailablePhysicalId(physicalCameraId);
576 } else {
577 updated = mDeviceStatusMap[cameraId].addUnavailablePhysicalId(physicalCameraId);
578 }
579
580 // Iterate through all registered callbacks
581 if (supportsHAL3 && updated) {
582 for (auto cb : mCallbacks) {
583 sp<AMessage> msg = new AMessage(kWhatSendSinglePhysicalCameraCallback, mHandler);
584 ACameraManager_PhysicalCameraAvailabilityCallback cbFp = isStatusAvailable(status) ?
585 cb.mPhysicalCamAvailable : cb.mPhysicalCamUnavailable;
586 msg->setPointer(kCallbackFpKey, (void *) cbFp);
587 msg->setPointer(kContextKey, cb.mContext);
588 msg->setString(kCameraIdKey, AString(cameraId));
589 msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId));
590 mPendingCallbackCnt++;
591 msg->post();
592 }
593 }
594 }
595
getStatus()596 int32_t CameraManagerGlobal::StatusAndHAL3Support::getStatus() {
597 std::lock_guard<std::mutex> lock(mLock);
598 return status;
599 }
600
updateStatus(int32_t newStatus)601 void CameraManagerGlobal::StatusAndHAL3Support::updateStatus(int32_t newStatus) {
602 std::lock_guard<std::mutex> lock(mLock);
603 status = newStatus;
604 }
605
addUnavailablePhysicalId(const String8 & physicalCameraId)606 bool CameraManagerGlobal::StatusAndHAL3Support::addUnavailablePhysicalId(
607 const String8& physicalCameraId) {
608 std::lock_guard<std::mutex> lock(mLock);
609 auto result = unavailablePhysicalIds.insert(physicalCameraId);
610 return result.second;
611 }
612
removeUnavailablePhysicalId(const String8 & physicalCameraId)613 bool CameraManagerGlobal::StatusAndHAL3Support::removeUnavailablePhysicalId(
614 const String8& physicalCameraId) {
615 std::lock_guard<std::mutex> lock(mLock);
616 auto count = unavailablePhysicalIds.erase(physicalCameraId);
617 return count > 0;
618 }
619
getUnavailablePhysicalIds()620 std::set<String8> CameraManagerGlobal::StatusAndHAL3Support::getUnavailablePhysicalIds() {
621 std::lock_guard<std::mutex> lock(mLock);
622 return unavailablePhysicalIds;
623 }
624
625 } // namespace acam
626 } // namespace android
627
628 /**
629 * ACameraManger Implementation
630 */
631 camera_status_t
getCameraIdList(ACameraIdList ** cameraIdList)632 ACameraManager::getCameraIdList(ACameraIdList** cameraIdList) {
633 Mutex::Autolock _l(mLock);
634
635 std::vector<String8> idList;
636 CameraManagerGlobal::getInstance().getCameraIdList(&idList);
637
638 int numCameras = idList.size();
639 ACameraIdList *out = new ACameraIdList;
640 if (!out) {
641 ALOGE("Allocate memory for ACameraIdList failed!");
642 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
643 }
644 out->numCameras = numCameras;
645 out->cameraIds = new const char*[numCameras];
646 if (!out->cameraIds) {
647 ALOGE("Allocate memory for ACameraIdList failed!");
648 deleteCameraIdList(out);
649 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
650 }
651 for (int i = 0; i < numCameras; i++) {
652 const char* src = idList[i].string();
653 size_t dstSize = strlen(src) + 1;
654 char* dst = new char[dstSize];
655 if (!dst) {
656 ALOGE("Allocate memory for ACameraIdList failed!");
657 deleteCameraIdList(out);
658 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY;
659 }
660 strlcpy(dst, src, dstSize);
661 out->cameraIds[i] = dst;
662 }
663 *cameraIdList = out;
664 return ACAMERA_OK;
665 }
666
667 void
deleteCameraIdList(ACameraIdList * cameraIdList)668 ACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) {
669 if (cameraIdList != nullptr) {
670 if (cameraIdList->cameraIds != nullptr) {
671 for (int i = 0; i < cameraIdList->numCameras; i ++) {
672 if (cameraIdList->cameraIds[i] != nullptr) {
673 delete[] cameraIdList->cameraIds[i];
674 }
675 }
676 delete[] cameraIdList->cameraIds;
677 }
678 delete cameraIdList;
679 }
680 }
681
getCameraCharacteristics(const char * cameraIdStr,sp<ACameraMetadata> * characteristics)682 camera_status_t ACameraManager::getCameraCharacteristics(
683 const char* cameraIdStr, sp<ACameraMetadata>* characteristics) {
684 Mutex::Autolock _l(mLock);
685
686 sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
687 if (cs == nullptr) {
688 ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
689 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
690 }
691 CameraMetadata rawMetadata;
692 int targetSdkVersion = android_get_application_target_sdk_version();
693 binder::Status serviceRet = cs->getCameraCharacteristics(String16(cameraIdStr),
694 targetSdkVersion, &rawMetadata);
695 if (!serviceRet.isOk()) {
696 switch(serviceRet.serviceSpecificErrorCode()) {
697 case hardware::ICameraService::ERROR_DISCONNECTED:
698 ALOGE("%s: Camera %s has been disconnected", __FUNCTION__, cameraIdStr);
699 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
700 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
701 ALOGE("%s: Camera ID %s does not exist!", __FUNCTION__, cameraIdStr);
702 return ACAMERA_ERROR_INVALID_PARAMETER;
703 default:
704 ALOGE("Get camera characteristics from camera service failed: %s",
705 serviceRet.toString8().string());
706 return ACAMERA_ERROR_UNKNOWN; // should not reach here
707 }
708 }
709
710 *characteristics = new ACameraMetadata(
711 rawMetadata.release(), ACameraMetadata::ACM_CHARACTERISTICS);
712 return ACAMERA_OK;
713 }
714
715 camera_status_t
openCamera(const char * cameraId,ACameraDevice_StateCallbacks * callback,ACameraDevice ** outDevice)716 ACameraManager::openCamera(
717 const char* cameraId,
718 ACameraDevice_StateCallbacks* callback,
719 /*out*/ACameraDevice** outDevice) {
720 sp<ACameraMetadata> chars;
721 camera_status_t ret = getCameraCharacteristics(cameraId, &chars);
722 Mutex::Autolock _l(mLock);
723 if (ret != ACAMERA_OK) {
724 ALOGE("%s: cannot get camera characteristics for camera %s. err %d",
725 __FUNCTION__, cameraId, ret);
726 return ACAMERA_ERROR_INVALID_PARAMETER;
727 }
728
729 ACameraDevice* device = new ACameraDevice(cameraId, callback, chars);
730
731 sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService();
732 if (cs == nullptr) {
733 ALOGE("%s: Cannot reach camera service!", __FUNCTION__);
734 delete device;
735 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
736 }
737
738 sp<hardware::camera2::ICameraDeviceCallbacks> callbacks = device->getServiceCallback();
739 sp<hardware::camera2::ICameraDeviceUser> deviceRemote;
740 int targetSdkVersion = android_get_application_target_sdk_version();
741 // No way to get package name from native.
742 // Send a zero length package name and let camera service figure it out from UID
743 binder::Status serviceRet = cs->connectDevice(
744 callbacks, String16(cameraId), String16(""), {},
745 hardware::ICameraService::USE_CALLING_UID, /*oomScoreOffset*/0,
746 targetSdkVersion, /*out*/&deviceRemote);
747
748 if (!serviceRet.isOk()) {
749 ALOGE("%s: connect camera device failed: %s", __FUNCTION__, serviceRet.toString8().string());
750 // Convert serviceRet to camera_status_t
751 switch(serviceRet.serviceSpecificErrorCode()) {
752 case hardware::ICameraService::ERROR_DISCONNECTED:
753 ret = ACAMERA_ERROR_CAMERA_DISCONNECTED;
754 break;
755 case hardware::ICameraService::ERROR_CAMERA_IN_USE:
756 ret = ACAMERA_ERROR_CAMERA_IN_USE;
757 break;
758 case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE:
759 ret = ACAMERA_ERROR_MAX_CAMERA_IN_USE;
760 break;
761 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
762 ret = ACAMERA_ERROR_INVALID_PARAMETER;
763 break;
764 case hardware::ICameraService::ERROR_DEPRECATED_HAL:
765 // Should not reach here since we filtered legacy HALs earlier
766 ret = ACAMERA_ERROR_INVALID_PARAMETER;
767 break;
768 case hardware::ICameraService::ERROR_DISABLED:
769 ret = ACAMERA_ERROR_CAMERA_DISABLED;
770 break;
771 case hardware::ICameraService::ERROR_PERMISSION_DENIED:
772 ret = ACAMERA_ERROR_PERMISSION_DENIED;
773 break;
774 case hardware::ICameraService::ERROR_INVALID_OPERATION:
775 default:
776 ret = ACAMERA_ERROR_UNKNOWN;
777 break;
778 }
779
780 delete device;
781 return ret;
782 }
783 if (deviceRemote == nullptr) {
784 ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__);
785 delete device;
786 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
787 }
788 device->setRemoteDevice(deviceRemote);
789 *outDevice = device;
790 return ACAMERA_OK;
791 }
792
~ACameraManager()793 ACameraManager::~ACameraManager() {
794
795 }
796