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/VendorTagDescriptor.h> 28 29 using namespace android::acam; 30 31 namespace android { 32 namespace acam { 33 // Static member definitions 34 const char* CameraManagerGlobal::kCameraIdKey = "CameraId"; 35 const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp"; 36 const char* CameraManagerGlobal::kContextKey = "CallbackContext"; 37 Mutex CameraManagerGlobal::sLock; 38 CameraManagerGlobal* CameraManagerGlobal::sInstance = nullptr; 39 40 CameraManagerGlobal& 41 CameraManagerGlobal::getInstance() { 42 Mutex::Autolock _l(sLock); 43 CameraManagerGlobal* instance = sInstance; 44 if (instance == nullptr) { 45 instance = new CameraManagerGlobal(); 46 sInstance = instance; 47 } 48 return *instance; 49 } 50 51 CameraManagerGlobal::~CameraManagerGlobal() { 52 // clear sInstance so next getInstance call knows to create a new one 53 Mutex::Autolock _sl(sLock); 54 sInstance = nullptr; 55 Mutex::Autolock _l(mLock); 56 if (mCameraService != nullptr) { 57 IInterface::asBinder(mCameraService)->unlinkToDeath(mDeathNotifier); 58 mCameraService->removeListener(mCameraServiceListener); 59 } 60 mDeathNotifier.clear(); 61 if (mCbLooper != nullptr) { 62 mCbLooper->unregisterHandler(mHandler->id()); 63 mCbLooper->stop(); 64 } 65 mCbLooper.clear(); 66 mHandler.clear(); 67 mCameraServiceListener.clear(); 68 mCameraService.clear(); 69 } 70 71 static bool isCameraServiceDisabled() { 72 char value[PROPERTY_VALUE_MAX]; 73 property_get("config.disable_cameraservice", value, "0"); 74 return (strncmp(value, "0", 2) != 0 && strncasecmp(value, "false", 6) != 0); 75 } 76 77 sp<hardware::ICameraService> CameraManagerGlobal::getCameraService() { 78 Mutex::Autolock _l(mLock); 79 if (mCameraService.get() == nullptr) { 80 if (isCameraServiceDisabled()) { 81 return mCameraService; 82 } 83 84 sp<IServiceManager> sm = defaultServiceManager(); 85 sp<IBinder> binder; 86 do { 87 binder = sm->getService(String16(kCameraServiceName)); 88 if (binder != nullptr) { 89 break; 90 } 91 ALOGW("CameraService not published, waiting..."); 92 usleep(kCameraServicePollDelay); 93 } while(true); 94 if (mDeathNotifier == nullptr) { 95 mDeathNotifier = new DeathNotifier(this); 96 } 97 binder->linkToDeath(mDeathNotifier); 98 mCameraService = interface_cast<hardware::ICameraService>(binder); 99 100 // Setup looper thread to perfrom availiability callbacks 101 if (mCbLooper == nullptr) { 102 mCbLooper = new ALooper; 103 mCbLooper->setName("C2N-mgr-looper"); 104 status_t err = mCbLooper->start( 105 /*runOnCallingThread*/false, 106 /*canCallJava*/ true, 107 PRIORITY_DEFAULT); 108 if (err != OK) { 109 ALOGE("%s: Unable to start camera service listener looper: %s (%d)", 110 __FUNCTION__, strerror(-err), err); 111 mCbLooper.clear(); 112 return nullptr; 113 } 114 if (mHandler == nullptr) { 115 mHandler = new CallbackHandler(); 116 } 117 mCbLooper->registerHandler(mHandler); 118 } 119 120 // register ICameraServiceListener 121 if (mCameraServiceListener == nullptr) { 122 mCameraServiceListener = new CameraServiceListener(this); 123 } 124 std::vector<hardware::CameraStatus> cameraStatuses{}; 125 mCameraService->addListener(mCameraServiceListener, &cameraStatuses); 126 for (auto& c : cameraStatuses) { 127 onStatusChangedLocked(c.status, c.cameraId); 128 } 129 130 // setup vendor tags 131 sp<VendorTagDescriptor> desc = new VendorTagDescriptor(); 132 binder::Status ret = mCameraService->getCameraVendorTagDescriptor(/*out*/desc.get()); 133 134 if (ret.isOk()) { 135 if (0 < desc->getTagCount()) { 136 status_t err = VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc); 137 if (err != OK) { 138 ALOGE("%s: Failed to set vendor tag descriptors, received error %s (%d)", 139 __FUNCTION__, strerror(-err), err); 140 } 141 } else { 142 sp<VendorTagDescriptorCache> cache = 143 new VendorTagDescriptorCache(); 144 binder::Status res = 145 mCameraService->getCameraVendorTagCache( 146 /*out*/cache.get()); 147 if (res.serviceSpecificErrorCode() == 148 hardware::ICameraService::ERROR_DISCONNECTED) { 149 // No camera module available, not an error on devices with no cameras 150 VendorTagDescriptorCache::clearGlobalVendorTagCache(); 151 } else if (res.isOk()) { 152 status_t err = 153 VendorTagDescriptorCache::setAsGlobalVendorTagCache( 154 cache); 155 if (err != OK) { 156 ALOGE("%s: Failed to set vendor tag cache," 157 "received error %s (%d)", __FUNCTION__, 158 strerror(-err), err); 159 } 160 } else { 161 VendorTagDescriptorCache::clearGlobalVendorTagCache(); 162 ALOGE("%s: Failed to setup vendor tag cache: %s", 163 __FUNCTION__, res.toString8().string()); 164 } 165 } 166 } else if (ret.serviceSpecificErrorCode() == 167 hardware::ICameraService::ERROR_DEPRECATED_HAL) { 168 ALOGW("%s: Camera HAL too old; does not support vendor tags", 169 __FUNCTION__); 170 VendorTagDescriptor::clearGlobalVendorTagDescriptor(); 171 } else { 172 ALOGE("%s: Failed to get vendor tag descriptors: %s", 173 __FUNCTION__, ret.toString8().string()); 174 } 175 } 176 ALOGE_IF(mCameraService == nullptr, "no CameraService!?"); 177 return mCameraService; 178 } 179 180 void CameraManagerGlobal::DeathNotifier::binderDied(const wp<IBinder>&) 181 { 182 ALOGE("Camera service binderDied!"); 183 sp<CameraManagerGlobal> cm = mCameraManager.promote(); 184 if (cm != nullptr) { 185 AutoMutex lock(cm->mLock); 186 for (auto& pair : cm->mDeviceStatusMap) { 187 const String8 &cameraId = pair.first; 188 cm->onStatusChangedLocked( 189 CameraServiceListener::STATUS_NOT_PRESENT, cameraId); 190 } 191 cm->mCameraService.clear(); 192 // TODO: consider adding re-connect call here? 193 } 194 } 195 196 void CameraManagerGlobal::registerExtendedAvailabilityCallback( 197 const ACameraManager_ExtendedAvailabilityCallbacks *callback) { 198 Mutex::Autolock _l(mLock); 199 Callback cb(callback); 200 mCallbacks.insert(cb); 201 } 202 203 void CameraManagerGlobal::unregisterExtendedAvailabilityCallback( 204 const ACameraManager_ExtendedAvailabilityCallbacks *callback) { 205 Mutex::Autolock _l(mLock); 206 Callback cb(callback); 207 mCallbacks.erase(cb); 208 } 209 210 void CameraManagerGlobal::registerAvailabilityCallback( 211 const ACameraManager_AvailabilityCallbacks *callback) { 212 Mutex::Autolock _l(mLock); 213 Callback cb(callback); 214 auto pair = mCallbacks.insert(cb); 215 // Send initial callbacks if callback is newly registered 216 if (pair.second) { 217 for (auto& pair : mDeviceStatusMap) { 218 const String8& cameraId = pair.first; 219 int32_t status = pair.second; 220 221 sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler); 222 ACameraManager_AvailabilityCallback cb = isStatusAvailable(status) ? 223 callback->onCameraAvailable : callback->onCameraUnavailable; 224 msg->setPointer(kCallbackFpKey, (void *) cb); 225 msg->setPointer(kContextKey, callback->context); 226 msg->setString(kCameraIdKey, AString(cameraId)); 227 msg->post(); 228 } 229 } 230 } 231 232 void CameraManagerGlobal::unregisterAvailabilityCallback( 233 const ACameraManager_AvailabilityCallbacks *callback) { 234 Mutex::Autolock _l(mLock); 235 Callback cb(callback); 236 mCallbacks.erase(cb); 237 } 238 239 void CameraManagerGlobal::getCameraIdList(std::vector<String8>* cameraIds) { 240 // Ensure that we have initialized/refreshed the list of available devices 241 auto cs = getCameraService(); 242 Mutex::Autolock _l(mLock); 243 244 for(auto& deviceStatus : mDeviceStatusMap) { 245 if (deviceStatus.second == hardware::ICameraServiceListener::STATUS_NOT_PRESENT || 246 deviceStatus.second == hardware::ICameraServiceListener::STATUS_ENUMERATING) { 247 continue; 248 } 249 bool camera2Support = false; 250 binder::Status serviceRet = cs->supportsCameraApi(String16(deviceStatus.first), 251 hardware::ICameraService::API_VERSION_2, &camera2Support); 252 if (!serviceRet.isOk() || !camera2Support) { 253 continue; 254 } 255 cameraIds->push_back(deviceStatus.first); 256 } 257 } 258 259 bool CameraManagerGlobal::validStatus(int32_t status) { 260 switch (status) { 261 case hardware::ICameraServiceListener::STATUS_NOT_PRESENT: 262 case hardware::ICameraServiceListener::STATUS_PRESENT: 263 case hardware::ICameraServiceListener::STATUS_ENUMERATING: 264 case hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE: 265 return true; 266 default: 267 return false; 268 } 269 } 270 271 bool CameraManagerGlobal::isStatusAvailable(int32_t status) { 272 switch (status) { 273 case hardware::ICameraServiceListener::STATUS_PRESENT: 274 return true; 275 default: 276 return false; 277 } 278 } 279 280 void CameraManagerGlobal::CallbackHandler::onMessageReceived( 281 const sp<AMessage> &msg) { 282 switch (msg->what()) { 283 case kWhatSendSingleCallback: 284 { 285 ACameraManager_AvailabilityCallback cb; 286 void* context; 287 AString cameraId; 288 bool found = msg->findPointer(kCallbackFpKey, (void**) &cb); 289 if (!found) { 290 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__); 291 return; 292 } 293 found = msg->findPointer(kContextKey, &context); 294 if (!found) { 295 ALOGE("%s: Cannot find callback context!", __FUNCTION__); 296 return; 297 } 298 found = msg->findString(kCameraIdKey, &cameraId); 299 if (!found) { 300 ALOGE("%s: Cannot find camera ID!", __FUNCTION__); 301 return; 302 } 303 (*cb)(context, cameraId.c_str()); 304 break; 305 } 306 case kWhatSendSingleAccessCallback: 307 { 308 ACameraManager_AccessPrioritiesChangedCallback cb; 309 void* context; 310 AString cameraId; 311 bool found = msg->findPointer(kCallbackFpKey, (void**) &cb); 312 if (!found) { 313 ALOGE("%s: Cannot find camera callback fp!", __FUNCTION__); 314 return; 315 } 316 found = msg->findPointer(kContextKey, &context); 317 if (!found) { 318 ALOGE("%s: Cannot find callback context!", __FUNCTION__); 319 return; 320 } 321 (*cb)(context); 322 break; 323 } 324 default: 325 ALOGE("%s: unknown message type %d", __FUNCTION__, msg->what()); 326 break; 327 } 328 } 329 330 binder::Status CameraManagerGlobal::CameraServiceListener::onCameraAccessPrioritiesChanged() { 331 sp<CameraManagerGlobal> cm = mCameraManager.promote(); 332 if (cm != nullptr) { 333 cm->onCameraAccessPrioritiesChanged(); 334 } else { 335 ALOGE("Cannot deliver camera access priority callback. Global camera manager died"); 336 } 337 return binder::Status::ok(); 338 } 339 340 binder::Status CameraManagerGlobal::CameraServiceListener::onStatusChanged( 341 int32_t status, const String16& cameraId) { 342 sp<CameraManagerGlobal> cm = mCameraManager.promote(); 343 if (cm != nullptr) { 344 cm->onStatusChanged(status, String8(cameraId)); 345 } else { 346 ALOGE("Cannot deliver status change. Global camera manager died"); 347 } 348 return binder::Status::ok(); 349 } 350 351 void CameraManagerGlobal::onCameraAccessPrioritiesChanged() { 352 Mutex::Autolock _l(mLock); 353 for (auto cb : mCallbacks) { 354 sp<AMessage> msg = new AMessage(kWhatSendSingleAccessCallback, mHandler); 355 ACameraManager_AccessPrioritiesChangedCallback cbFp = cb.mAccessPriorityChanged; 356 if (cbFp != nullptr) { 357 msg->setPointer(kCallbackFpKey, (void *) cbFp); 358 msg->setPointer(kContextKey, cb.mContext); 359 msg->post(); 360 } 361 } 362 } 363 364 void CameraManagerGlobal::onStatusChanged( 365 int32_t status, const String8& cameraId) { 366 Mutex::Autolock _l(mLock); 367 onStatusChangedLocked(status, cameraId); 368 } 369 370 void CameraManagerGlobal::onStatusChangedLocked( 371 int32_t status, const String8& cameraId) { 372 if (!validStatus(status)) { 373 ALOGE("%s: Invalid status %d", __FUNCTION__, status); 374 return; 375 } 376 377 bool firstStatus = (mDeviceStatusMap.count(cameraId) == 0); 378 int32_t oldStatus = firstStatus ? 379 status : // first status 380 mDeviceStatusMap[cameraId]; 381 382 if (!firstStatus && 383 isStatusAvailable(status) == isStatusAvailable(oldStatus)) { 384 // No status update. No need to send callback 385 return; 386 } 387 388 // Iterate through all registered callbacks 389 mDeviceStatusMap[cameraId] = status; 390 for (auto cb : mCallbacks) { 391 sp<AMessage> msg = new AMessage(kWhatSendSingleCallback, mHandler); 392 ACameraManager_AvailabilityCallback cbFp = isStatusAvailable(status) ? 393 cb.mAvailable : cb.mUnavailable; 394 msg->setPointer(kCallbackFpKey, (void *) cbFp); 395 msg->setPointer(kContextKey, cb.mContext); 396 msg->setString(kCameraIdKey, AString(cameraId)); 397 msg->post(); 398 } 399 if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT) { 400 mDeviceStatusMap.erase(cameraId); 401 } 402 } 403 404 } // namespace acam 405 } // namespace android 406 407 /** 408 * ACameraManger Implementation 409 */ 410 camera_status_t 411 ACameraManager::getCameraIdList(ACameraIdList** cameraIdList) { 412 Mutex::Autolock _l(mLock); 413 414 std::vector<String8> idList; 415 CameraManagerGlobal::getInstance().getCameraIdList(&idList); 416 417 int numCameras = idList.size(); 418 ACameraIdList *out = new ACameraIdList; 419 if (!out) { 420 ALOGE("Allocate memory for ACameraIdList failed!"); 421 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY; 422 } 423 out->numCameras = numCameras; 424 out->cameraIds = new const char*[numCameras]; 425 if (!out->cameraIds) { 426 ALOGE("Allocate memory for ACameraIdList failed!"); 427 deleteCameraIdList(out); 428 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY; 429 } 430 for (int i = 0; i < numCameras; i++) { 431 const char* src = idList[i].string(); 432 size_t dstSize = strlen(src) + 1; 433 char* dst = new char[dstSize]; 434 if (!dst) { 435 ALOGE("Allocate memory for ACameraIdList failed!"); 436 deleteCameraIdList(out); 437 return ACAMERA_ERROR_NOT_ENOUGH_MEMORY; 438 } 439 strlcpy(dst, src, dstSize); 440 out->cameraIds[i] = dst; 441 } 442 *cameraIdList = out; 443 return ACAMERA_OK; 444 } 445 446 void 447 ACameraManager::deleteCameraIdList(ACameraIdList* cameraIdList) { 448 if (cameraIdList != nullptr) { 449 if (cameraIdList->cameraIds != nullptr) { 450 for (int i = 0; i < cameraIdList->numCameras; i ++) { 451 if (cameraIdList->cameraIds[i] != nullptr) { 452 delete[] cameraIdList->cameraIds[i]; 453 } 454 } 455 delete[] cameraIdList->cameraIds; 456 } 457 delete cameraIdList; 458 } 459 } 460 461 camera_status_t ACameraManager::getCameraCharacteristics( 462 const char* cameraIdStr, sp<ACameraMetadata>* characteristics) { 463 Mutex::Autolock _l(mLock); 464 465 sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService(); 466 if (cs == nullptr) { 467 ALOGE("%s: Cannot reach camera service!", __FUNCTION__); 468 return ACAMERA_ERROR_CAMERA_DISCONNECTED; 469 } 470 CameraMetadata rawMetadata; 471 binder::Status serviceRet = cs->getCameraCharacteristics(String16(cameraIdStr), &rawMetadata); 472 if (!serviceRet.isOk()) { 473 switch(serviceRet.serviceSpecificErrorCode()) { 474 case hardware::ICameraService::ERROR_DISCONNECTED: 475 ALOGE("%s: Camera %s has been disconnected", __FUNCTION__, cameraIdStr); 476 return ACAMERA_ERROR_CAMERA_DISCONNECTED; 477 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT: 478 ALOGE("%s: Camera ID %s does not exist!", __FUNCTION__, cameraIdStr); 479 return ACAMERA_ERROR_INVALID_PARAMETER; 480 default: 481 ALOGE("Get camera characteristics from camera service failed: %s", 482 serviceRet.toString8().string()); 483 return ACAMERA_ERROR_UNKNOWN; // should not reach here 484 } 485 } 486 487 *characteristics = new ACameraMetadata( 488 rawMetadata.release(), ACameraMetadata::ACM_CHARACTERISTICS); 489 return ACAMERA_OK; 490 } 491 492 camera_status_t 493 ACameraManager::openCamera( 494 const char* cameraId, 495 ACameraDevice_StateCallbacks* callback, 496 /*out*/ACameraDevice** outDevice) { 497 sp<ACameraMetadata> chars; 498 camera_status_t ret = getCameraCharacteristics(cameraId, &chars); 499 Mutex::Autolock _l(mLock); 500 if (ret != ACAMERA_OK) { 501 ALOGE("%s: cannot get camera characteristics for camera %s. err %d", 502 __FUNCTION__, cameraId, ret); 503 return ACAMERA_ERROR_INVALID_PARAMETER; 504 } 505 506 ACameraDevice* device = new ACameraDevice(cameraId, callback, chars); 507 508 sp<hardware::ICameraService> cs = CameraManagerGlobal::getInstance().getCameraService(); 509 if (cs == nullptr) { 510 ALOGE("%s: Cannot reach camera service!", __FUNCTION__); 511 delete device; 512 return ACAMERA_ERROR_CAMERA_DISCONNECTED; 513 } 514 515 sp<hardware::camera2::ICameraDeviceCallbacks> callbacks = device->getServiceCallback(); 516 sp<hardware::camera2::ICameraDeviceUser> deviceRemote; 517 // No way to get package name from native. 518 // Send a zero length package name and let camera service figure it out from UID 519 binder::Status serviceRet = cs->connectDevice( 520 callbacks, String16(cameraId), String16(""), 521 hardware::ICameraService::USE_CALLING_UID, /*out*/&deviceRemote); 522 523 if (!serviceRet.isOk()) { 524 ALOGE("%s: connect camera device failed: %s", __FUNCTION__, serviceRet.toString8().string()); 525 // Convert serviceRet to camera_status_t 526 switch(serviceRet.serviceSpecificErrorCode()) { 527 case hardware::ICameraService::ERROR_DISCONNECTED: 528 ret = ACAMERA_ERROR_CAMERA_DISCONNECTED; 529 break; 530 case hardware::ICameraService::ERROR_CAMERA_IN_USE: 531 ret = ACAMERA_ERROR_CAMERA_IN_USE; 532 break; 533 case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE: 534 ret = ACAMERA_ERROR_MAX_CAMERA_IN_USE; 535 break; 536 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT: 537 ret = ACAMERA_ERROR_INVALID_PARAMETER; 538 break; 539 case hardware::ICameraService::ERROR_DEPRECATED_HAL: 540 // Should not reach here since we filtered legacy HALs earlier 541 ret = ACAMERA_ERROR_INVALID_PARAMETER; 542 break; 543 case hardware::ICameraService::ERROR_DISABLED: 544 ret = ACAMERA_ERROR_CAMERA_DISABLED; 545 break; 546 case hardware::ICameraService::ERROR_PERMISSION_DENIED: 547 ret = ACAMERA_ERROR_PERMISSION_DENIED; 548 break; 549 case hardware::ICameraService::ERROR_INVALID_OPERATION: 550 default: 551 ret = ACAMERA_ERROR_UNKNOWN; 552 break; 553 } 554 555 delete device; 556 return ret; 557 } 558 if (deviceRemote == nullptr) { 559 ALOGE("%s: connect camera device failed! remote device is null", __FUNCTION__); 560 delete device; 561 return ACAMERA_ERROR_CAMERA_DISCONNECTED; 562 } 563 device->setRemoteDevice(deviceRemote); 564 *outDevice = device; 565 return ACAMERA_OK; 566 } 567 568 ACameraManager::~ACameraManager() { 569 570 } 571