1 /* 2 * Copyright (C) 2016 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_TAG "CameraProviderManager" 18 #define ATRACE_TAG ATRACE_TAG_CAMERA 19 //#define LOG_NDEBUG 0 20 21 #include "CameraProviderManager.h" 22 23 #include <android/hardware/camera/device/3.5/ICameraDevice.h> 24 25 #include <algorithm> 26 #include <chrono> 27 #include "common/DepthPhotoProcessor.h" 28 #include <dlfcn.h> 29 #include <future> 30 #include <inttypes.h> 31 #include <hardware/camera_common.h> 32 #include <hidl/ServiceManagement.h> 33 #include <functional> 34 #include <camera_metadata_hidden.h> 35 #include <android-base/parseint.h> 36 #include <android-base/logging.h> 37 #include <cutils/properties.h> 38 #include <hwbinder/IPCThreadState.h> 39 #include <utils/Trace.h> 40 41 #include "api2/HeicCompositeStream.h" 42 43 namespace android { 44 45 using namespace ::android::hardware::camera; 46 using namespace ::android::hardware::camera::common::V1_0; 47 using std::literals::chrono_literals::operator""s; 48 49 namespace { 50 // Hardcoded name for the passthrough HAL implementation, since it can't be discovered via the 51 // service manager 52 const std::string kLegacyProviderName("legacy/0"); 53 const std::string kExternalProviderName("external/0"); 54 const bool kEnableLazyHal(property_get_bool("ro.camera.enableLazyHal", false)); 55 } // anonymous namespace 56 57 const float CameraProviderManager::kDepthARTolerance = .1f; 58 59 CameraProviderManager::HardwareServiceInteractionProxy 60 CameraProviderManager::sHardwareServiceInteractionProxy{}; 61 62 CameraProviderManager::~CameraProviderManager() { 63 } 64 65 status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener, 66 ServiceInteractionProxy* proxy) { 67 std::lock_guard<std::mutex> lock(mInterfaceMutex); 68 if (proxy == nullptr) { 69 ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__); 70 return BAD_VALUE; 71 } 72 mListener = listener; 73 mServiceProxy = proxy; 74 mDeviceState = static_cast<hardware::hidl_bitfield<provider::V2_5::DeviceState>>( 75 provider::V2_5::DeviceState::NORMAL); 76 77 // Registering will trigger notifications for all already-known providers 78 bool success = mServiceProxy->registerForNotifications( 79 /* instance name, empty means no filter */ "", 80 this); 81 if (!success) { 82 ALOGE("%s: Unable to register with hardware service manager for notifications " 83 "about camera providers", __FUNCTION__); 84 return INVALID_OPERATION; 85 } 86 87 // See if there's a passthrough HAL, but let's not complain if there's not 88 addProviderLocked(kLegacyProviderName, /*expected*/ false); 89 addProviderLocked(kExternalProviderName, /*expected*/ false); 90 91 IPCThreadState::self()->flushCommands(); 92 93 return OK; 94 } 95 96 int CameraProviderManager::getCameraCount() const { 97 std::lock_guard<std::mutex> lock(mInterfaceMutex); 98 int count = 0; 99 for (auto& provider : mProviders) { 100 count += provider->mUniqueCameraIds.size(); 101 } 102 return count; 103 } 104 105 std::vector<std::string> CameraProviderManager::getCameraDeviceIds() const { 106 std::lock_guard<std::mutex> lock(mInterfaceMutex); 107 std::vector<std::string> deviceIds; 108 for (auto& provider : mProviders) { 109 for (auto& id : provider->mUniqueCameraIds) { 110 deviceIds.push_back(id); 111 } 112 } 113 return deviceIds; 114 } 115 116 std::vector<std::string> CameraProviderManager::getAPI1CompatibleCameraDeviceIds() const { 117 std::lock_guard<std::mutex> lock(mInterfaceMutex); 118 std::vector<std::string> deviceIds; 119 for (auto& provider : mProviders) { 120 std::vector<std::string> providerDeviceIds = provider->mUniqueAPI1CompatibleCameraIds; 121 122 // API1 app doesn't handle logical and physical camera devices well. So 123 // for each camera facing, only take the first id advertised by HAL in 124 // all [logical, physical1, physical2, ...] id combos, and filter out the rest. 125 filterLogicalCameraIdsLocked(providerDeviceIds); 126 127 deviceIds.insert(deviceIds.end(), providerDeviceIds.begin(), providerDeviceIds.end()); 128 } 129 130 std::sort(deviceIds.begin(), deviceIds.end(), 131 [](const std::string& a, const std::string& b) -> bool { 132 uint32_t aUint = 0, bUint = 0; 133 bool aIsUint = base::ParseUint(a, &aUint); 134 bool bIsUint = base::ParseUint(b, &bUint); 135 136 // Uint device IDs first 137 if (aIsUint && bIsUint) { 138 return aUint < bUint; 139 } else if (aIsUint) { 140 return true; 141 } else if (bIsUint) { 142 return false; 143 } 144 // Simple string compare if both id are not uint 145 return a < b; 146 }); 147 return deviceIds; 148 } 149 150 bool CameraProviderManager::isValidDevice(const std::string &id, uint16_t majorVersion) const { 151 std::lock_guard<std::mutex> lock(mInterfaceMutex); 152 return isValidDeviceLocked(id, majorVersion); 153 } 154 155 bool CameraProviderManager::isValidDeviceLocked(const std::string &id, uint16_t majorVersion) const { 156 for (auto& provider : mProviders) { 157 for (auto& deviceInfo : provider->mDevices) { 158 if (deviceInfo->mId == id && deviceInfo->mVersion.get_major() == majorVersion) { 159 return true; 160 } 161 } 162 } 163 return false; 164 } 165 166 bool CameraProviderManager::hasFlashUnit(const std::string &id) const { 167 std::lock_guard<std::mutex> lock(mInterfaceMutex); 168 169 auto deviceInfo = findDeviceInfoLocked(id); 170 if (deviceInfo == nullptr) return false; 171 172 return deviceInfo->hasFlashUnit(); 173 } 174 175 status_t CameraProviderManager::getResourceCost(const std::string &id, 176 CameraResourceCost* cost) const { 177 std::lock_guard<std::mutex> lock(mInterfaceMutex); 178 179 auto deviceInfo = findDeviceInfoLocked(id); 180 if (deviceInfo == nullptr) return NAME_NOT_FOUND; 181 182 *cost = deviceInfo->mResourceCost; 183 return OK; 184 } 185 186 status_t CameraProviderManager::getCameraInfo(const std::string &id, 187 hardware::CameraInfo* info) const { 188 std::lock_guard<std::mutex> lock(mInterfaceMutex); 189 190 auto deviceInfo = findDeviceInfoLocked(id); 191 if (deviceInfo == nullptr) return NAME_NOT_FOUND; 192 193 return deviceInfo->getCameraInfo(info); 194 } 195 196 status_t CameraProviderManager::isSessionConfigurationSupported(const std::string& id, 197 const hardware::camera::device::V3_4::StreamConfiguration &configuration, 198 bool *status /*out*/) const { 199 std::lock_guard<std::mutex> lock(mInterfaceMutex); 200 201 auto deviceInfo = findDeviceInfoLocked(id); 202 if (deviceInfo == nullptr) { 203 return NAME_NOT_FOUND; 204 } 205 206 return deviceInfo->isSessionConfigurationSupported(configuration, status); 207 } 208 209 status_t CameraProviderManager::getCameraCharacteristics(const std::string &id, 210 CameraMetadata* characteristics) const { 211 std::lock_guard<std::mutex> lock(mInterfaceMutex); 212 return getCameraCharacteristicsLocked(id, characteristics); 213 } 214 215 status_t CameraProviderManager::getHighestSupportedVersion(const std::string &id, 216 hardware::hidl_version *v) { 217 std::lock_guard<std::mutex> lock(mInterfaceMutex); 218 219 hardware::hidl_version maxVersion{0,0}; 220 bool found = false; 221 for (auto& provider : mProviders) { 222 for (auto& deviceInfo : provider->mDevices) { 223 if (deviceInfo->mId == id) { 224 if (deviceInfo->mVersion > maxVersion) { 225 maxVersion = deviceInfo->mVersion; 226 found = true; 227 } 228 } 229 } 230 } 231 if (!found) { 232 return NAME_NOT_FOUND; 233 } 234 *v = maxVersion; 235 return OK; 236 } 237 238 bool CameraProviderManager::supportSetTorchMode(const std::string &id) const { 239 std::lock_guard<std::mutex> lock(mInterfaceMutex); 240 for (auto& provider : mProviders) { 241 auto deviceInfo = findDeviceInfoLocked(id); 242 if (deviceInfo != nullptr) { 243 return provider->mSetTorchModeSupported; 244 } 245 } 246 return false; 247 } 248 249 status_t CameraProviderManager::setTorchMode(const std::string &id, bool enabled) { 250 std::lock_guard<std::mutex> lock(mInterfaceMutex); 251 252 auto deviceInfo = findDeviceInfoLocked(id); 253 if (deviceInfo == nullptr) return NAME_NOT_FOUND; 254 255 // Pass the camera ID to start interface so that it will save it to the map of ICameraProviders 256 // that are currently in use. 257 const sp<provider::V2_4::ICameraProvider> interface = 258 deviceInfo->mParentProvider->startProviderInterface(); 259 if (interface == nullptr) { 260 return DEAD_OBJECT; 261 } 262 saveRef(DeviceMode::TORCH, deviceInfo->mId, interface); 263 264 return deviceInfo->setTorchMode(enabled); 265 } 266 267 status_t CameraProviderManager::setUpVendorTags() { 268 sp<VendorTagDescriptorCache> tagCache = new VendorTagDescriptorCache(); 269 270 for (auto& provider : mProviders) { 271 tagCache->addVendorDescriptor(provider->mProviderTagid, provider->mVendorTagDescriptor); 272 } 273 274 VendorTagDescriptorCache::setAsGlobalVendorTagCache(tagCache); 275 276 return OK; 277 } 278 279 status_t CameraProviderManager::notifyDeviceStateChange( 280 hardware::hidl_bitfield<provider::V2_5::DeviceState> newState) { 281 std::lock_guard<std::mutex> lock(mInterfaceMutex); 282 mDeviceState = newState; 283 status_t res = OK; 284 for (auto& provider : mProviders) { 285 ALOGV("%s: Notifying %s for new state 0x%" PRIx64, 286 __FUNCTION__, provider->mProviderName.c_str(), newState); 287 status_t singleRes = provider->notifyDeviceStateChange(mDeviceState); 288 if (singleRes != OK) { 289 ALOGE("%s: Unable to notify provider %s about device state change", 290 __FUNCTION__, 291 provider->mProviderName.c_str()); 292 res = singleRes; 293 // continue to do the rest of the providers instead of returning now 294 } 295 } 296 return res; 297 } 298 299 status_t CameraProviderManager::openSession(const std::string &id, 300 const sp<device::V3_2::ICameraDeviceCallback>& callback, 301 /*out*/ 302 sp<device::V3_2::ICameraDeviceSession> *session) { 303 304 std::lock_guard<std::mutex> lock(mInterfaceMutex); 305 306 auto deviceInfo = findDeviceInfoLocked(id, 307 /*minVersion*/ {3,0}, /*maxVersion*/ {4,0}); 308 if (deviceInfo == nullptr) return NAME_NOT_FOUND; 309 310 auto *deviceInfo3 = static_cast<ProviderInfo::DeviceInfo3*>(deviceInfo); 311 const sp<provider::V2_4::ICameraProvider> provider = 312 deviceInfo->mParentProvider->startProviderInterface(); 313 if (provider == nullptr) { 314 return DEAD_OBJECT; 315 } 316 saveRef(DeviceMode::CAMERA, id, provider); 317 318 Status status; 319 hardware::Return<void> ret; 320 auto interface = deviceInfo3->startDeviceInterface< 321 CameraProviderManager::ProviderInfo::DeviceInfo3::InterfaceT>(); 322 if (interface == nullptr) { 323 return DEAD_OBJECT; 324 } 325 326 ret = interface->open(callback, [&status, &session] 327 (Status s, const sp<device::V3_2::ICameraDeviceSession>& cameraSession) { 328 status = s; 329 if (status == Status::OK) { 330 *session = cameraSession; 331 } 332 }); 333 if (!ret.isOk()) { 334 removeRef(DeviceMode::CAMERA, id); 335 ALOGE("%s: Transaction error opening a session for camera device %s: %s", 336 __FUNCTION__, id.c_str(), ret.description().c_str()); 337 return DEAD_OBJECT; 338 } 339 return mapToStatusT(status); 340 } 341 342 status_t CameraProviderManager::openSession(const std::string &id, 343 const sp<device::V1_0::ICameraDeviceCallback>& callback, 344 /*out*/ 345 sp<device::V1_0::ICameraDevice> *session) { 346 347 std::lock_guard<std::mutex> lock(mInterfaceMutex); 348 349 auto deviceInfo = findDeviceInfoLocked(id, 350 /*minVersion*/ {1,0}, /*maxVersion*/ {2,0}); 351 if (deviceInfo == nullptr) return NAME_NOT_FOUND; 352 353 auto *deviceInfo1 = static_cast<ProviderInfo::DeviceInfo1*>(deviceInfo); 354 const sp<provider::V2_4::ICameraProvider> provider = 355 deviceInfo->mParentProvider->startProviderInterface(); 356 if (provider == nullptr) { 357 return DEAD_OBJECT; 358 } 359 saveRef(DeviceMode::CAMERA, id, provider); 360 361 auto interface = deviceInfo1->startDeviceInterface< 362 CameraProviderManager::ProviderInfo::DeviceInfo1::InterfaceT>(); 363 if (interface == nullptr) { 364 return DEAD_OBJECT; 365 } 366 hardware::Return<Status> status = interface->open(callback); 367 if (!status.isOk()) { 368 removeRef(DeviceMode::CAMERA, id); 369 ALOGE("%s: Transaction error opening a session for camera device %s: %s", 370 __FUNCTION__, id.c_str(), status.description().c_str()); 371 return DEAD_OBJECT; 372 } 373 if (status == Status::OK) { 374 *session = interface; 375 } 376 return mapToStatusT(status); 377 } 378 379 void CameraProviderManager::saveRef(DeviceMode usageType, const std::string &cameraId, 380 sp<provider::V2_4::ICameraProvider> provider) { 381 if (!kEnableLazyHal) { 382 return; 383 } 384 ALOGV("Saving camera provider %s for camera device %s", provider->descriptor, cameraId.c_str()); 385 std::lock_guard<std::mutex> lock(mProviderInterfaceMapLock); 386 std::unordered_map<std::string, sp<provider::V2_4::ICameraProvider>> *primaryMap, *alternateMap; 387 if (usageType == DeviceMode::TORCH) { 388 primaryMap = &mTorchProviderByCameraId; 389 alternateMap = &mCameraProviderByCameraId; 390 } else { 391 primaryMap = &mCameraProviderByCameraId; 392 alternateMap = &mTorchProviderByCameraId; 393 } 394 auto id = cameraId.c_str(); 395 (*primaryMap)[id] = provider; 396 auto search = alternateMap->find(id); 397 if (search != alternateMap->end()) { 398 ALOGW("%s: Camera device %s is using both torch mode and camera mode simultaneously. " 399 "That should not be possible", __FUNCTION__, id); 400 } 401 ALOGV("%s: Camera device %s connected", __FUNCTION__, id); 402 } 403 404 void CameraProviderManager::removeRef(DeviceMode usageType, const std::string &cameraId) { 405 if (!kEnableLazyHal) { 406 return; 407 } 408 ALOGV("Removing camera device %s", cameraId.c_str()); 409 std::unordered_map<std::string, sp<provider::V2_4::ICameraProvider>> *providerMap; 410 if (usageType == DeviceMode::TORCH) { 411 providerMap = &mTorchProviderByCameraId; 412 } else { 413 providerMap = &mCameraProviderByCameraId; 414 } 415 std::lock_guard<std::mutex> lock(mProviderInterfaceMapLock); 416 auto search = providerMap->find(cameraId.c_str()); 417 if (search != providerMap->end()) { 418 // Drop the reference to this ICameraProvider. This is safe to do immediately (without an 419 // added delay) because hwservicemanager guarantees to hold the reference for at least five 420 // more seconds. We depend on this behavior so that if the provider is unreferenced and 421 // then referenced again quickly, we do not let the HAL exit and then need to immediately 422 // restart it. An example when this could happen is switching from a front-facing to a 423 // rear-facing camera. If the HAL were to exit during the camera switch, the camera could 424 // appear janky to the user. 425 providerMap->erase(cameraId.c_str()); 426 IPCThreadState::self()->flushCommands(); 427 } else { 428 ALOGE("%s: Asked to remove reference for camera %s, but no reference to it was found. This " 429 "could mean removeRef was called twice for the same camera ID.", __FUNCTION__, 430 cameraId.c_str()); 431 } 432 } 433 434 hardware::Return<void> CameraProviderManager::onRegistration( 435 const hardware::hidl_string& /*fqName*/, 436 const hardware::hidl_string& name, 437 bool /*preexisting*/) { 438 std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock); 439 { 440 std::lock_guard<std::mutex> lock(mInterfaceMutex); 441 442 addProviderLocked(name); 443 } 444 445 sp<StatusListener> listener = getStatusListener(); 446 if (nullptr != listener.get()) { 447 listener->onNewProviderRegistered(); 448 } 449 450 IPCThreadState::self()->flushCommands(); 451 452 return hardware::Return<void>(); 453 } 454 455 status_t CameraProviderManager::dump(int fd, const Vector<String16>& args) { 456 std::lock_guard<std::mutex> lock(mInterfaceMutex); 457 458 for (auto& provider : mProviders) { 459 provider->dump(fd, args); 460 } 461 return OK; 462 } 463 464 CameraProviderManager::ProviderInfo::DeviceInfo* CameraProviderManager::findDeviceInfoLocked( 465 const std::string& id, 466 hardware::hidl_version minVersion, hardware::hidl_version maxVersion) const { 467 for (auto& provider : mProviders) { 468 for (auto& deviceInfo : provider->mDevices) { 469 if (deviceInfo->mId == id && 470 minVersion <= deviceInfo->mVersion && maxVersion >= deviceInfo->mVersion) { 471 return deviceInfo.get(); 472 } 473 } 474 } 475 return nullptr; 476 } 477 478 metadata_vendor_id_t CameraProviderManager::getProviderTagIdLocked( 479 const std::string& id, hardware::hidl_version minVersion, 480 hardware::hidl_version maxVersion) const { 481 metadata_vendor_id_t ret = CAMERA_METADATA_INVALID_VENDOR_ID; 482 483 std::lock_guard<std::mutex> lock(mInterfaceMutex); 484 for (auto& provider : mProviders) { 485 for (auto& deviceInfo : provider->mDevices) { 486 if (deviceInfo->mId == id && 487 minVersion <= deviceInfo->mVersion && 488 maxVersion >= deviceInfo->mVersion) { 489 return provider->mProviderTagid; 490 } 491 } 492 } 493 494 return ret; 495 } 496 497 void CameraProviderManager::ProviderInfo::DeviceInfo3::queryPhysicalCameraIds() { 498 camera_metadata_entry_t entryCap; 499 500 entryCap = mCameraCharacteristics.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); 501 for (size_t i = 0; i < entryCap.count; ++i) { 502 uint8_t capability = entryCap.data.u8[i]; 503 if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) { 504 mIsLogicalCamera = true; 505 break; 506 } 507 } 508 if (!mIsLogicalCamera) { 509 return; 510 } 511 512 camera_metadata_entry_t entryIds = mCameraCharacteristics.find( 513 ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS); 514 const uint8_t* ids = entryIds.data.u8; 515 size_t start = 0; 516 for (size_t i = 0; i < entryIds.count; ++i) { 517 if (ids[i] == '\0') { 518 if (start != i) { 519 mPhysicalIds.push_back((const char*)ids+start); 520 } 521 start = i+1; 522 } 523 } 524 } 525 526 bool CameraProviderManager::ProviderInfo::DeviceInfo3::isPublicallyHiddenSecureCamera() { 527 camera_metadata_entry_t entryCap; 528 entryCap = mCameraCharacteristics.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); 529 if (entryCap.count != 1) { 530 // Do NOT hide this camera device if the capabilities specify anything more 531 // than ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA. 532 return false; 533 } 534 return entryCap.data.u8[0] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA; 535 } 536 537 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedSizes( 538 const CameraMetadata& ch, uint32_t tag, android_pixel_format_t format, 539 std::vector<std::tuple<size_t, size_t>> *sizes/*out*/) { 540 if (sizes == nullptr) { 541 return; 542 } 543 544 auto scalerDims = ch.find(tag); 545 if (scalerDims.count > 0) { 546 // Scaler entry contains 4 elements (format, width, height, type) 547 for (size_t i = 0; i < scalerDims.count; i += 4) { 548 if ((scalerDims.data.i32[i] == format) && 549 (scalerDims.data.i32[i+3] == 550 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT)) { 551 sizes->push_back(std::make_tuple(scalerDims.data.i32[i+1], 552 scalerDims.data.i32[i+2])); 553 } 554 } 555 } 556 } 557 558 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedDurations( 559 const CameraMetadata& ch, uint32_t tag, android_pixel_format_t format, 560 const std::vector<std::tuple<size_t, size_t>>& sizes, 561 std::vector<int64_t> *durations/*out*/) { 562 if (durations == nullptr) { 563 return; 564 } 565 566 auto availableDurations = ch.find(tag); 567 if (availableDurations.count > 0) { 568 // Duration entry contains 4 elements (format, width, height, duration) 569 for (size_t i = 0; i < availableDurations.count; i += 4) { 570 for (const auto& size : sizes) { 571 int64_t width = std::get<0>(size); 572 int64_t height = std::get<1>(size); 573 if ((availableDurations.data.i64[i] == format) && 574 (availableDurations.data.i64[i+1] == width) && 575 (availableDurations.data.i64[i+2] == height)) { 576 durations->push_back(availableDurations.data.i64[i+3]); 577 } 578 } 579 } 580 } 581 } 582 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedDynamicDepthDurations( 583 const std::vector<int64_t>& depthDurations, const std::vector<int64_t>& blobDurations, 584 std::vector<int64_t> *dynamicDepthDurations /*out*/) { 585 if ((dynamicDepthDurations == nullptr) || (depthDurations.size() != blobDurations.size())) { 586 return; 587 } 588 589 // Unfortunately there is no direct way to calculate the dynamic depth stream duration. 590 // Processing time on camera service side can vary greatly depending on multiple 591 // variables which are not under our control. Make a guesstimate by taking the maximum 592 // corresponding duration value from depth and blob. 593 auto depthDuration = depthDurations.begin(); 594 auto blobDuration = blobDurations.begin(); 595 dynamicDepthDurations->reserve(depthDurations.size()); 596 while ((depthDuration != depthDurations.end()) && (blobDuration != blobDurations.end())) { 597 dynamicDepthDurations->push_back(std::max(*depthDuration, *blobDuration)); 598 depthDuration++; blobDuration++; 599 } 600 } 601 602 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedDynamicDepthSizes( 603 const std::vector<std::tuple<size_t, size_t>>& blobSizes, 604 const std::vector<std::tuple<size_t, size_t>>& depthSizes, 605 std::vector<std::tuple<size_t, size_t>> *dynamicDepthSizes /*out*/, 606 std::vector<std::tuple<size_t, size_t>> *internalDepthSizes /*out*/) { 607 if (dynamicDepthSizes == nullptr || internalDepthSizes == nullptr) { 608 return; 609 } 610 611 // The dynamic depth spec. does not mention how close the AR ratio should be. 612 // Try using something appropriate. 613 float ARTolerance = kDepthARTolerance; 614 615 for (const auto& blobSize : blobSizes) { 616 float jpegAR = static_cast<float> (std::get<0>(blobSize)) / 617 static_cast<float>(std::get<1>(blobSize)); 618 bool found = false; 619 for (const auto& depthSize : depthSizes) { 620 if (depthSize == blobSize) { 621 internalDepthSizes->push_back(depthSize); 622 found = true; 623 break; 624 } else { 625 float depthAR = static_cast<float> (std::get<0>(depthSize)) / 626 static_cast<float>(std::get<1>(depthSize)); 627 if (std::fabs(jpegAR - depthAR) <= ARTolerance) { 628 internalDepthSizes->push_back(depthSize); 629 found = true; 630 break; 631 } 632 } 633 } 634 635 if (found) { 636 dynamicDepthSizes->push_back(blobSize); 637 } 638 } 639 } 640 641 bool CameraProviderManager::ProviderInfo::DeviceInfo3::isDepthPhotoLibraryPresent() { 642 static bool libraryPresent = false; 643 static bool initialized = false; 644 if (initialized) { 645 return libraryPresent; 646 } else { 647 initialized = true; 648 } 649 650 void* depthLibHandle = dlopen(camera3::kDepthPhotoLibrary, RTLD_NOW | RTLD_LOCAL); 651 if (depthLibHandle == nullptr) { 652 return false; 653 } 654 655 auto processFunc = dlsym(depthLibHandle, camera3::kDepthPhotoProcessFunction); 656 if (processFunc != nullptr) { 657 libraryPresent = true; 658 } else { 659 libraryPresent = false; 660 } 661 dlclose(depthLibHandle); 662 663 return libraryPresent; 664 } 665 666 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addDynamicDepthTags() { 667 uint32_t depthExclTag = ANDROID_DEPTH_DEPTH_IS_EXCLUSIVE; 668 uint32_t depthSizesTag = ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS; 669 auto& c = mCameraCharacteristics; 670 std::vector<std::tuple<size_t, size_t>> supportedBlobSizes, supportedDepthSizes, 671 supportedDynamicDepthSizes, internalDepthSizes; 672 auto chTags = c.find(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS); 673 if (chTags.count == 0) { 674 ALOGE("%s: Supported camera characteristics is empty!", __FUNCTION__); 675 return BAD_VALUE; 676 } 677 678 bool isDepthExclusivePresent = std::find(chTags.data.i32, chTags.data.i32 + chTags.count, 679 depthExclTag) != (chTags.data.i32 + chTags.count); 680 bool isDepthSizePresent = std::find(chTags.data.i32, chTags.data.i32 + chTags.count, 681 depthSizesTag) != (chTags.data.i32 + chTags.count); 682 if (!(isDepthExclusivePresent && isDepthSizePresent)) { 683 // No depth support, nothing more to do. 684 return OK; 685 } 686 687 auto depthExclusiveEntry = c.find(depthExclTag); 688 if (depthExclusiveEntry.count > 0) { 689 if (depthExclusiveEntry.data.u8[0] != ANDROID_DEPTH_DEPTH_IS_EXCLUSIVE_FALSE) { 690 // Depth support is exclusive, nothing more to do. 691 return OK; 692 } 693 } else { 694 ALOGE("%s: Advertised depth exclusive tag but value is not present!", __FUNCTION__); 695 return BAD_VALUE; 696 } 697 698 getSupportedSizes(c, ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, HAL_PIXEL_FORMAT_BLOB, 699 &supportedBlobSizes); 700 getSupportedSizes(c, depthSizesTag, HAL_PIXEL_FORMAT_Y16, &supportedDepthSizes); 701 if (supportedBlobSizes.empty() || supportedDepthSizes.empty()) { 702 // Nothing to do in this case. 703 return OK; 704 } 705 706 getSupportedDynamicDepthSizes(supportedBlobSizes, supportedDepthSizes, 707 &supportedDynamicDepthSizes, &internalDepthSizes); 708 if (supportedDynamicDepthSizes.empty()) { 709 // Nothing more to do. 710 return OK; 711 } 712 713 if(!isDepthPhotoLibraryPresent()) { 714 // Depth photo processing library is not present, nothing more to do. 715 return OK; 716 } 717 718 std::vector<int32_t> dynamicDepthEntries; 719 for (const auto& it : supportedDynamicDepthSizes) { 720 int32_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(it)), 721 static_cast<int32_t> (std::get<1>(it)), 722 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT }; 723 dynamicDepthEntries.insert(dynamicDepthEntries.end(), entry, entry + 4); 724 } 725 726 std::vector<int64_t> depthMinDurations, depthStallDurations; 727 std::vector<int64_t> blobMinDurations, blobStallDurations; 728 std::vector<int64_t> dynamicDepthMinDurations, dynamicDepthStallDurations; 729 730 getSupportedDurations(c, ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS, 731 HAL_PIXEL_FORMAT_Y16, internalDepthSizes, &depthMinDurations); 732 getSupportedDurations(c, ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, 733 HAL_PIXEL_FORMAT_BLOB, supportedDynamicDepthSizes, &blobMinDurations); 734 if (blobMinDurations.empty() || depthMinDurations.empty() || 735 (depthMinDurations.size() != blobMinDurations.size())) { 736 ALOGE("%s: Unexpected number of available depth min durations! %zu vs. %zu", 737 __FUNCTION__, depthMinDurations.size(), blobMinDurations.size()); 738 return BAD_VALUE; 739 } 740 741 getSupportedDurations(c, ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS, 742 HAL_PIXEL_FORMAT_Y16, internalDepthSizes, &depthStallDurations); 743 getSupportedDurations(c, ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, 744 HAL_PIXEL_FORMAT_BLOB, supportedDynamicDepthSizes, &blobStallDurations); 745 if (blobStallDurations.empty() || depthStallDurations.empty() || 746 (depthStallDurations.size() != blobStallDurations.size())) { 747 ALOGE("%s: Unexpected number of available depth stall durations! %zu vs. %zu", 748 __FUNCTION__, depthStallDurations.size(), blobStallDurations.size()); 749 return BAD_VALUE; 750 } 751 752 getSupportedDynamicDepthDurations(depthMinDurations, blobMinDurations, 753 &dynamicDepthMinDurations); 754 getSupportedDynamicDepthDurations(depthStallDurations, blobStallDurations, 755 &dynamicDepthStallDurations); 756 if (dynamicDepthMinDurations.empty() || dynamicDepthStallDurations.empty() || 757 (dynamicDepthMinDurations.size() != dynamicDepthStallDurations.size())) { 758 ALOGE("%s: Unexpected number of dynamic depth stall/min durations! %zu vs. %zu", 759 __FUNCTION__, dynamicDepthMinDurations.size(), dynamicDepthStallDurations.size()); 760 return BAD_VALUE; 761 } 762 763 std::vector<int64_t> dynamicDepthMinDurationEntries; 764 auto itDuration = dynamicDepthMinDurations.begin(); 765 auto itSize = supportedDynamicDepthSizes.begin(); 766 while (itDuration != dynamicDepthMinDurations.end()) { 767 int64_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(*itSize)), 768 static_cast<int32_t> (std::get<1>(*itSize)), *itDuration}; 769 dynamicDepthMinDurationEntries.insert(dynamicDepthMinDurationEntries.end(), entry, 770 entry + 4); 771 itDuration++; itSize++; 772 } 773 774 std::vector<int64_t> dynamicDepthStallDurationEntries; 775 itDuration = dynamicDepthStallDurations.begin(); 776 itSize = supportedDynamicDepthSizes.begin(); 777 while (itDuration != dynamicDepthStallDurations.end()) { 778 int64_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(*itSize)), 779 static_cast<int32_t> (std::get<1>(*itSize)), *itDuration}; 780 dynamicDepthStallDurationEntries.insert(dynamicDepthStallDurationEntries.end(), entry, 781 entry + 4); 782 itDuration++; itSize++; 783 } 784 785 c.update(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS, 786 dynamicDepthEntries.data(), dynamicDepthEntries.size()); 787 c.update(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS, 788 dynamicDepthMinDurationEntries.data(), dynamicDepthMinDurationEntries.size()); 789 c.update(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS, 790 dynamicDepthStallDurationEntries.data(), dynamicDepthStallDurationEntries.size()); 791 792 std::vector<int32_t> supportedChTags; 793 supportedChTags.reserve(chTags.count + 3); 794 supportedChTags.insert(supportedChTags.end(), chTags.data.i32, 795 chTags.data.i32 + chTags.count); 796 supportedChTags.push_back(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS); 797 supportedChTags.push_back(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS); 798 supportedChTags.push_back(ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS); 799 c.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, supportedChTags.data(), 800 supportedChTags.size()); 801 802 return OK; 803 } 804 805 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::fixupMonochromeTags() { 806 status_t res = OK; 807 auto& c = mCameraCharacteristics; 808 809 // Override static metadata for MONOCHROME camera with older device version 810 if (mVersion.get_major() == 3 && mVersion.get_minor() < 5) { 811 camera_metadata_entry cap = c.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); 812 for (size_t i = 0; i < cap.count; i++) { 813 if (cap.data.u8[i] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) { 814 // ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT 815 uint8_t cfa = ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_MONO; 816 res = c.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, &cfa, 1); 817 if (res != OK) { 818 ALOGE("%s: Failed to update COLOR_FILTER_ARRANGEMENT: %s (%d)", 819 __FUNCTION__, strerror(-res), res); 820 return res; 821 } 822 823 // ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS 824 const std::vector<uint32_t> sKeys = { 825 ANDROID_SENSOR_REFERENCE_ILLUMINANT1, 826 ANDROID_SENSOR_REFERENCE_ILLUMINANT2, 827 ANDROID_SENSOR_CALIBRATION_TRANSFORM1, 828 ANDROID_SENSOR_CALIBRATION_TRANSFORM2, 829 ANDROID_SENSOR_COLOR_TRANSFORM1, 830 ANDROID_SENSOR_COLOR_TRANSFORM2, 831 ANDROID_SENSOR_FORWARD_MATRIX1, 832 ANDROID_SENSOR_FORWARD_MATRIX2, 833 }; 834 res = removeAvailableKeys(c, sKeys, 835 ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS); 836 if (res != OK) { 837 ALOGE("%s: Failed to update REQUEST_AVAILABLE_CHARACTERISTICS_KEYS: %s (%d)", 838 __FUNCTION__, strerror(-res), res); 839 return res; 840 } 841 842 // ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS 843 const std::vector<uint32_t> reqKeys = { 844 ANDROID_COLOR_CORRECTION_MODE, 845 ANDROID_COLOR_CORRECTION_TRANSFORM, 846 ANDROID_COLOR_CORRECTION_GAINS, 847 }; 848 res = removeAvailableKeys(c, reqKeys, ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS); 849 if (res != OK) { 850 ALOGE("%s: Failed to update REQUEST_AVAILABLE_REQUEST_KEYS: %s (%d)", 851 __FUNCTION__, strerror(-res), res); 852 return res; 853 } 854 855 // ANDROID_REQUEST_AVAILABLE_RESULT_KEYS 856 const std::vector<uint32_t> resKeys = { 857 ANDROID_SENSOR_GREEN_SPLIT, 858 ANDROID_SENSOR_NEUTRAL_COLOR_POINT, 859 ANDROID_COLOR_CORRECTION_MODE, 860 ANDROID_COLOR_CORRECTION_TRANSFORM, 861 ANDROID_COLOR_CORRECTION_GAINS, 862 }; 863 res = removeAvailableKeys(c, resKeys, ANDROID_REQUEST_AVAILABLE_RESULT_KEYS); 864 if (res != OK) { 865 ALOGE("%s: Failed to update REQUEST_AVAILABLE_RESULT_KEYS: %s (%d)", 866 __FUNCTION__, strerror(-res), res); 867 return res; 868 } 869 870 // ANDROID_SENSOR_BLACK_LEVEL_PATTERN 871 camera_metadata_entry blEntry = c.find(ANDROID_SENSOR_BLACK_LEVEL_PATTERN); 872 for (size_t j = 1; j < blEntry.count; j++) { 873 blEntry.data.i32[j] = blEntry.data.i32[0]; 874 } 875 } 876 } 877 } 878 return res; 879 } 880 881 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::removeAvailableKeys( 882 CameraMetadata& c, const std::vector<uint32_t>& keys, uint32_t keyTag) { 883 status_t res = OK; 884 885 camera_metadata_entry keysEntry = c.find(keyTag); 886 if (keysEntry.count == 0) { 887 ALOGE("%s: Failed to find tag %u: %s (%d)", __FUNCTION__, keyTag, strerror(-res), res); 888 return res; 889 } 890 std::vector<int32_t> vKeys; 891 vKeys.reserve(keysEntry.count); 892 for (size_t i = 0; i < keysEntry.count; i++) { 893 if (std::find(keys.begin(), keys.end(), keysEntry.data.i32[i]) == keys.end()) { 894 vKeys.push_back(keysEntry.data.i32[i]); 895 } 896 } 897 res = c.update(keyTag, vKeys.data(), vKeys.size()); 898 return res; 899 } 900 901 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::fillHeicStreamCombinations( 902 std::vector<int32_t>* outputs, 903 std::vector<int64_t>* durations, 904 std::vector<int64_t>* stallDurations, 905 const camera_metadata_entry& halStreamConfigs, 906 const camera_metadata_entry& halStreamDurations) { 907 if (outputs == nullptr || durations == nullptr || stallDurations == nullptr) { 908 return BAD_VALUE; 909 } 910 911 static bool supportInMemoryTempFile = 912 camera3::HeicCompositeStream::isInMemoryTempFileSupported(); 913 if (!supportInMemoryTempFile) { 914 ALOGI("%s: No HEIC support due to absence of in memory temp file support", 915 __FUNCTION__); 916 return OK; 917 } 918 919 for (size_t i = 0; i < halStreamConfigs.count; i += 4) { 920 int32_t format = halStreamConfigs.data.i32[i]; 921 // Only IMPLEMENTATION_DEFINED and YUV_888 can be used to generate HEIC 922 // image. 923 if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && 924 format != HAL_PIXEL_FORMAT_YCBCR_420_888) { 925 continue; 926 } 927 928 bool sizeAvail = false; 929 for (size_t j = 0; j < outputs->size(); j+= 4) { 930 if ((*outputs)[j+1] == halStreamConfigs.data.i32[i+1] && 931 (*outputs)[j+2] == halStreamConfigs.data.i32[i+2]) { 932 sizeAvail = true; 933 break; 934 } 935 } 936 if (sizeAvail) continue; 937 938 int64_t stall = 0; 939 bool useHeic, useGrid; 940 if (camera3::HeicCompositeStream::isSizeSupportedByHeifEncoder( 941 halStreamConfigs.data.i32[i+1], halStreamConfigs.data.i32[i+2], 942 &useHeic, &useGrid, &stall)) { 943 if (useGrid != (format == HAL_PIXEL_FORMAT_YCBCR_420_888)) { 944 continue; 945 } 946 947 // HEIC configuration 948 int32_t config[] = {HAL_PIXEL_FORMAT_BLOB, halStreamConfigs.data.i32[i+1], 949 halStreamConfigs.data.i32[i+2], 0 /*isInput*/}; 950 outputs->insert(outputs->end(), config, config + 4); 951 952 // HEIC minFrameDuration 953 for (size_t j = 0; j < halStreamDurations.count; j += 4) { 954 if (halStreamDurations.data.i64[j] == format && 955 halStreamDurations.data.i64[j+1] == halStreamConfigs.data.i32[i+1] && 956 halStreamDurations.data.i64[j+2] == halStreamConfigs.data.i32[i+2]) { 957 int64_t duration[] = {HAL_PIXEL_FORMAT_BLOB, halStreamConfigs.data.i32[i+1], 958 halStreamConfigs.data.i32[i+2], halStreamDurations.data.i64[j+3]}; 959 durations->insert(durations->end(), duration, duration+4); 960 break; 961 } 962 } 963 964 // HEIC stallDuration 965 int64_t stallDuration[] = {HAL_PIXEL_FORMAT_BLOB, halStreamConfigs.data.i32[i+1], 966 halStreamConfigs.data.i32[i+2], stall}; 967 stallDurations->insert(stallDurations->end(), stallDuration, stallDuration+4); 968 } 969 } 970 return OK; 971 } 972 973 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::deriveHeicTags() { 974 auto& c = mCameraCharacteristics; 975 976 camera_metadata_entry halHeicSupport = c.find(ANDROID_HEIC_INFO_SUPPORTED); 977 if (halHeicSupport.count > 1) { 978 ALOGE("%s: Invalid entry count %zu for ANDROID_HEIC_INFO_SUPPORTED", 979 __FUNCTION__, halHeicSupport.count); 980 return BAD_VALUE; 981 } else if (halHeicSupport.count == 0 || 982 halHeicSupport.data.u8[0] == ANDROID_HEIC_INFO_SUPPORTED_FALSE) { 983 // Camera HAL doesn't support mandatory stream combinations for HEIC. 984 return OK; 985 } 986 987 camera_metadata_entry maxJpegAppsSegments = 988 c.find(ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT); 989 if (maxJpegAppsSegments.count != 1 || maxJpegAppsSegments.data.u8[0] == 0 || 990 maxJpegAppsSegments.data.u8[0] > 16) { 991 ALOGE("%s: ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT must be within [1, 16]", 992 __FUNCTION__); 993 return BAD_VALUE; 994 } 995 996 // Populate HEIC output configurations and its related min frame duration 997 // and stall duration. 998 std::vector<int32_t> heicOutputs; 999 std::vector<int64_t> heicDurations; 1000 std::vector<int64_t> heicStallDurations; 1001 1002 camera_metadata_entry halStreamConfigs = 1003 c.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS); 1004 camera_metadata_entry minFrameDurations = 1005 c.find(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS); 1006 1007 status_t res = fillHeicStreamCombinations(&heicOutputs, &heicDurations, &heicStallDurations, 1008 halStreamConfigs, minFrameDurations); 1009 if (res != OK) { 1010 ALOGE("%s: Failed to fill HEIC stream combinations: %s (%d)", __FUNCTION__, 1011 strerror(-res), res); 1012 return res; 1013 } 1014 1015 c.update(ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS, 1016 heicOutputs.data(), heicOutputs.size()); 1017 c.update(ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS, 1018 heicDurations.data(), heicDurations.size()); 1019 c.update(ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS, 1020 heicStallDurations.data(), heicStallDurations.size()); 1021 1022 return OK; 1023 } 1024 1025 bool CameraProviderManager::isLogicalCamera(const std::string& id, 1026 std::vector<std::string>* physicalCameraIds) { 1027 std::lock_guard<std::mutex> lock(mInterfaceMutex); 1028 1029 auto deviceInfo = findDeviceInfoLocked(id); 1030 if (deviceInfo == nullptr) return false; 1031 1032 if (deviceInfo->mIsLogicalCamera && physicalCameraIds != nullptr) { 1033 *physicalCameraIds = deviceInfo->mPhysicalIds; 1034 } 1035 return deviceInfo->mIsLogicalCamera; 1036 } 1037 1038 bool CameraProviderManager::isPublicallyHiddenSecureCamera(const std::string& id) { 1039 std::lock_guard<std::mutex> lock(mInterfaceMutex); 1040 1041 auto deviceInfo = findDeviceInfoLocked(id); 1042 if (deviceInfo == nullptr) { 1043 return false; 1044 } 1045 return deviceInfo->mIsPublicallyHiddenSecureCamera; 1046 } 1047 1048 bool CameraProviderManager::isHiddenPhysicalCamera(const std::string& cameraId) { 1049 for (auto& provider : mProviders) { 1050 for (auto& deviceInfo : provider->mDevices) { 1051 if (deviceInfo->mId == cameraId) { 1052 // cameraId is found in public camera IDs advertised by the 1053 // provider. 1054 return false; 1055 } 1056 } 1057 } 1058 1059 for (auto& provider : mProviders) { 1060 for (auto& deviceInfo : provider->mDevices) { 1061 CameraMetadata info; 1062 status_t res = deviceInfo->getCameraCharacteristics(&info); 1063 if (res != OK) { 1064 ALOGE("%s: Failed to getCameraCharacteristics for id %s", __FUNCTION__, 1065 deviceInfo->mId.c_str()); 1066 return false; 1067 } 1068 1069 std::vector<std::string> physicalIds; 1070 if (deviceInfo->mIsLogicalCamera) { 1071 if (std::find(deviceInfo->mPhysicalIds.begin(), deviceInfo->mPhysicalIds.end(), 1072 cameraId) != deviceInfo->mPhysicalIds.end()) { 1073 int deviceVersion = HARDWARE_DEVICE_API_VERSION( 1074 deviceInfo->mVersion.get_major(), deviceInfo->mVersion.get_minor()); 1075 if (deviceVersion < CAMERA_DEVICE_API_VERSION_3_5) { 1076 ALOGE("%s: Wrong deviceVersion %x for hiddenPhysicalCameraId %s", 1077 __FUNCTION__, deviceVersion, cameraId.c_str()); 1078 return false; 1079 } else { 1080 return true; 1081 } 1082 } 1083 } 1084 } 1085 } 1086 1087 return false; 1088 } 1089 1090 status_t CameraProviderManager::addProviderLocked(const std::string& newProvider, bool expected) { 1091 for (const auto& providerInfo : mProviders) { 1092 if (providerInfo->mProviderName == newProvider) { 1093 ALOGW("%s: Camera provider HAL with name '%s' already registered", __FUNCTION__, 1094 newProvider.c_str()); 1095 return ALREADY_EXISTS; 1096 } 1097 } 1098 1099 sp<provider::V2_4::ICameraProvider> interface; 1100 interface = mServiceProxy->getService(newProvider); 1101 1102 if (interface == nullptr) { 1103 if (expected) { 1104 ALOGE("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__, 1105 newProvider.c_str()); 1106 return BAD_VALUE; 1107 } else { 1108 return OK; 1109 } 1110 } 1111 1112 sp<ProviderInfo> providerInfo = new ProviderInfo(newProvider, this); 1113 status_t res = providerInfo->initialize(interface, mDeviceState); 1114 if (res != OK) { 1115 return res; 1116 } 1117 1118 mProviders.push_back(providerInfo); 1119 1120 return OK; 1121 } 1122 1123 status_t CameraProviderManager::removeProvider(const std::string& provider) { 1124 std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock); 1125 std::unique_lock<std::mutex> lock(mInterfaceMutex); 1126 std::vector<String8> removedDeviceIds; 1127 status_t res = NAME_NOT_FOUND; 1128 for (auto it = mProviders.begin(); it != mProviders.end(); it++) { 1129 if ((*it)->mProviderName == provider) { 1130 removedDeviceIds.reserve((*it)->mDevices.size()); 1131 for (auto& deviceInfo : (*it)->mDevices) { 1132 removedDeviceIds.push_back(String8(deviceInfo->mId.c_str())); 1133 } 1134 mProviders.erase(it); 1135 res = OK; 1136 break; 1137 } 1138 } 1139 if (res != OK) { 1140 ALOGW("%s: Camera provider HAL with name '%s' is not registered", __FUNCTION__, 1141 provider.c_str()); 1142 } else { 1143 // Inform camera service of loss of presence for all the devices from this provider, 1144 // without lock held for reentrancy 1145 sp<StatusListener> listener = getStatusListener(); 1146 if (listener != nullptr) { 1147 lock.unlock(); 1148 for (auto& id : removedDeviceIds) { 1149 listener->onDeviceStatusChanged(id, CameraDeviceStatus::NOT_PRESENT); 1150 } 1151 } 1152 } 1153 return res; 1154 } 1155 1156 sp<CameraProviderManager::StatusListener> CameraProviderManager::getStatusListener() const { 1157 return mListener.promote(); 1158 } 1159 1160 /**** Methods for ProviderInfo ****/ 1161 1162 1163 CameraProviderManager::ProviderInfo::ProviderInfo( 1164 const std::string &providerName, 1165 CameraProviderManager *manager) : 1166 mProviderName(providerName), 1167 mProviderTagid(generateVendorTagId(providerName)), 1168 mUniqueDeviceCount(0), 1169 mManager(manager) { 1170 (void) mManager; 1171 } 1172 1173 status_t CameraProviderManager::ProviderInfo::initialize( 1174 sp<provider::V2_4::ICameraProvider>& interface, 1175 hardware::hidl_bitfield<provider::V2_5::DeviceState> currentDeviceState) { 1176 status_t res = parseProviderName(mProviderName, &mType, &mId); 1177 if (res != OK) { 1178 ALOGE("%s: Invalid provider name, ignoring", __FUNCTION__); 1179 return BAD_VALUE; 1180 } 1181 ALOGI("Connecting to new camera provider: %s, isRemote? %d", 1182 mProviderName.c_str(), interface->isRemote()); 1183 1184 // Determine minor version 1185 auto castResult = provider::V2_5::ICameraProvider::castFrom(interface); 1186 if (castResult.isOk()) { 1187 mMinorVersion = 5; 1188 } else { 1189 mMinorVersion = 4; 1190 } 1191 1192 // cameraDeviceStatusChange callbacks may be called (and causing new devices added) 1193 // before setCallback returns 1194 hardware::Return<Status> status = interface->setCallback(this); 1195 if (!status.isOk()) { 1196 ALOGE("%s: Transaction error setting up callbacks with camera provider '%s': %s", 1197 __FUNCTION__, mProviderName.c_str(), status.description().c_str()); 1198 return DEAD_OBJECT; 1199 } 1200 if (status != Status::OK) { 1201 ALOGE("%s: Unable to register callbacks with camera provider '%s'", 1202 __FUNCTION__, mProviderName.c_str()); 1203 return mapToStatusT(status); 1204 } 1205 1206 hardware::Return<bool> linked = interface->linkToDeath(this, /*cookie*/ mId); 1207 if (!linked.isOk()) { 1208 ALOGE("%s: Transaction error in linking to camera provider '%s' death: %s", 1209 __FUNCTION__, mProviderName.c_str(), linked.description().c_str()); 1210 return DEAD_OBJECT; 1211 } else if (!linked) { 1212 ALOGW("%s: Unable to link to provider '%s' death notifications", 1213 __FUNCTION__, mProviderName.c_str()); 1214 } 1215 1216 if (!kEnableLazyHal) { 1217 // Save HAL reference indefinitely 1218 mSavedInterface = interface; 1219 } else { 1220 mActiveInterface = interface; 1221 } 1222 1223 ALOGV("%s: Setting device state for %s: 0x%" PRIx64, 1224 __FUNCTION__, mProviderName.c_str(), mDeviceState); 1225 notifyDeviceStateChange(currentDeviceState); 1226 1227 res = setUpVendorTags(); 1228 if (res != OK) { 1229 ALOGE("%s: Unable to set up vendor tags from provider '%s'", 1230 __FUNCTION__, mProviderName.c_str()); 1231 return res; 1232 } 1233 1234 // Get initial list of camera devices, if any 1235 std::vector<std::string> devices; 1236 hardware::Return<void> ret = interface->getCameraIdList([&status, this, &devices]( 1237 Status idStatus, 1238 const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames) { 1239 status = idStatus; 1240 if (status == Status::OK) { 1241 for (auto& name : cameraDeviceNames) { 1242 uint16_t major, minor; 1243 std::string type, id; 1244 status_t res = parseDeviceName(name, &major, &minor, &type, &id); 1245 if (res != OK) { 1246 ALOGE("%s: Error parsing deviceName: %s: %d", __FUNCTION__, name.c_str(), res); 1247 status = Status::INTERNAL_ERROR; 1248 } else { 1249 devices.push_back(name); 1250 mProviderPublicCameraIds.push_back(id); 1251 } 1252 } 1253 } }); 1254 if (!ret.isOk()) { 1255 ALOGE("%s: Transaction error in getting camera ID list from provider '%s': %s", 1256 __FUNCTION__, mProviderName.c_str(), linked.description().c_str()); 1257 return DEAD_OBJECT; 1258 } 1259 if (status != Status::OK) { 1260 ALOGE("%s: Unable to query for camera devices from provider '%s'", 1261 __FUNCTION__, mProviderName.c_str()); 1262 return mapToStatusT(status); 1263 } 1264 1265 ret = interface->isSetTorchModeSupported( 1266 [this](auto status, bool supported) { 1267 if (status == Status::OK) { 1268 mSetTorchModeSupported = supported; 1269 } 1270 }); 1271 if (!ret.isOk()) { 1272 ALOGE("%s: Transaction error checking torch mode support '%s': %s", 1273 __FUNCTION__, mProviderName.c_str(), ret.description().c_str()); 1274 return DEAD_OBJECT; 1275 } 1276 1277 mIsRemote = interface->isRemote(); 1278 1279 sp<StatusListener> listener = mManager->getStatusListener(); 1280 for (auto& device : devices) { 1281 std::string id; 1282 status_t res = addDevice(device, common::V1_0::CameraDeviceStatus::PRESENT, &id); 1283 if (res != OK) { 1284 ALOGE("%s: Unable to enumerate camera device '%s': %s (%d)", 1285 __FUNCTION__, device.c_str(), strerror(-res), res); 1286 continue; 1287 } 1288 } 1289 1290 ALOGI("Camera provider %s ready with %zu camera devices", 1291 mProviderName.c_str(), mDevices.size()); 1292 1293 mInitialized = true; 1294 return OK; 1295 } 1296 1297 const sp<provider::V2_4::ICameraProvider> 1298 CameraProviderManager::ProviderInfo::startProviderInterface() { 1299 ATRACE_CALL(); 1300 ALOGV("Request to start camera provider: %s", mProviderName.c_str()); 1301 if (mSavedInterface != nullptr) { 1302 return mSavedInterface; 1303 } 1304 if (!kEnableLazyHal) { 1305 ALOGE("Bad provider state! Should not be here on a non-lazy HAL!"); 1306 return nullptr; 1307 } 1308 1309 auto interface = mActiveInterface.promote(); 1310 if (interface == nullptr) { 1311 ALOGI("Camera HAL provider needs restart, calling getService(%s)", mProviderName.c_str()); 1312 interface = mManager->mServiceProxy->getService(mProviderName); 1313 interface->setCallback(this); 1314 hardware::Return<bool> linked = interface->linkToDeath(this, /*cookie*/ mId); 1315 if (!linked.isOk()) { 1316 ALOGE("%s: Transaction error in linking to camera provider '%s' death: %s", 1317 __FUNCTION__, mProviderName.c_str(), linked.description().c_str()); 1318 mManager->removeProvider(mProviderName); 1319 return nullptr; 1320 } else if (!linked) { 1321 ALOGW("%s: Unable to link to provider '%s' death notifications", 1322 __FUNCTION__, mProviderName.c_str()); 1323 } 1324 // Send current device state 1325 if (mMinorVersion >= 5) { 1326 auto castResult = provider::V2_5::ICameraProvider::castFrom(interface); 1327 if (castResult.isOk()) { 1328 sp<provider::V2_5::ICameraProvider> interface_2_5 = castResult; 1329 if (interface_2_5 != nullptr) { 1330 ALOGV("%s: Initial device state for %s: 0x %" PRIx64, 1331 __FUNCTION__, mProviderName.c_str(), mDeviceState); 1332 interface_2_5->notifyDeviceStateChange(mDeviceState); 1333 } 1334 } 1335 } 1336 1337 mActiveInterface = interface; 1338 } else { 1339 ALOGV("Camera provider (%s) already in use. Re-using instance.", mProviderName.c_str()); 1340 } 1341 return interface; 1342 } 1343 1344 const std::string& CameraProviderManager::ProviderInfo::getType() const { 1345 return mType; 1346 } 1347 1348 status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name, 1349 CameraDeviceStatus initialStatus, /*out*/ std::string* parsedId) { 1350 1351 ALOGI("Enumerating new camera device: %s", name.c_str()); 1352 1353 uint16_t major, minor; 1354 std::string type, id; 1355 1356 status_t res = parseDeviceName(name, &major, &minor, &type, &id); 1357 if (res != OK) { 1358 return res; 1359 } 1360 if (type != mType) { 1361 ALOGE("%s: Device type %s does not match provider type %s", __FUNCTION__, 1362 type.c_str(), mType.c_str()); 1363 return BAD_VALUE; 1364 } 1365 if (mManager->isValidDeviceLocked(id, major)) { 1366 ALOGE("%s: Device %s: ID %s is already in use for device major version %d", __FUNCTION__, 1367 name.c_str(), id.c_str(), major); 1368 return BAD_VALUE; 1369 } 1370 1371 std::unique_ptr<DeviceInfo> deviceInfo; 1372 switch (major) { 1373 case 1: 1374 deviceInfo = initializeDeviceInfo<DeviceInfo1>(name, mProviderTagid, 1375 id, minor); 1376 break; 1377 case 3: 1378 deviceInfo = initializeDeviceInfo<DeviceInfo3>(name, mProviderTagid, 1379 id, minor); 1380 break; 1381 default: 1382 ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__, 1383 name.c_str(), major); 1384 return BAD_VALUE; 1385 } 1386 if (deviceInfo == nullptr) return BAD_VALUE; 1387 deviceInfo->mStatus = initialStatus; 1388 bool isAPI1Compatible = deviceInfo->isAPI1Compatible(); 1389 1390 mDevices.push_back(std::move(deviceInfo)); 1391 1392 mUniqueCameraIds.insert(id); 1393 if (isAPI1Compatible) { 1394 // addDevice can be called more than once for the same camera id if HAL 1395 // supports openLegacy. 1396 if (std::find(mUniqueAPI1CompatibleCameraIds.begin(), mUniqueAPI1CompatibleCameraIds.end(), 1397 id) == mUniqueAPI1CompatibleCameraIds.end()) { 1398 mUniqueAPI1CompatibleCameraIds.push_back(id); 1399 } 1400 } 1401 1402 if (parsedId != nullptr) { 1403 *parsedId = id; 1404 } 1405 return OK; 1406 } 1407 1408 void CameraProviderManager::ProviderInfo::removeDevice(std::string id) { 1409 for (auto it = mDevices.begin(); it != mDevices.end(); it++) { 1410 if ((*it)->mId == id) { 1411 mUniqueCameraIds.erase(id); 1412 if ((*it)->isAPI1Compatible()) { 1413 mUniqueAPI1CompatibleCameraIds.erase(std::remove( 1414 mUniqueAPI1CompatibleCameraIds.begin(), 1415 mUniqueAPI1CompatibleCameraIds.end(), id)); 1416 } 1417 mDevices.erase(it); 1418 break; 1419 } 1420 } 1421 } 1422 1423 status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const { 1424 dprintf(fd, "== Camera Provider HAL %s (v2.%d, %s) static info: %zu devices: ==\n", 1425 mProviderName.c_str(), 1426 mMinorVersion, 1427 mIsRemote ? "remote" : "passthrough", 1428 mDevices.size()); 1429 1430 for (auto& device : mDevices) { 1431 dprintf(fd, "== Camera HAL device %s (v%d.%d) static information: ==\n", device->mName.c_str(), 1432 device->mVersion.get_major(), device->mVersion.get_minor()); 1433 dprintf(fd, " Resource cost: %d\n", device->mResourceCost.resourceCost); 1434 if (device->mResourceCost.conflictingDevices.size() == 0) { 1435 dprintf(fd, " Conflicting devices: None\n"); 1436 } else { 1437 dprintf(fd, " Conflicting devices:\n"); 1438 for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) { 1439 dprintf(fd, " %s\n", 1440 device->mResourceCost.conflictingDevices[i].c_str()); 1441 } 1442 } 1443 dprintf(fd, " API1 info:\n"); 1444 dprintf(fd, " Has a flash unit: %s\n", 1445 device->hasFlashUnit() ? "true" : "false"); 1446 hardware::CameraInfo info; 1447 status_t res = device->getCameraInfo(&info); 1448 if (res != OK) { 1449 dprintf(fd, " <Error reading camera info: %s (%d)>\n", 1450 strerror(-res), res); 1451 } else { 1452 dprintf(fd, " Facing: %s\n", 1453 info.facing == hardware::CAMERA_FACING_BACK ? "Back" : "Front"); 1454 dprintf(fd, " Orientation: %d\n", info.orientation); 1455 } 1456 CameraMetadata info2; 1457 res = device->getCameraCharacteristics(&info2); 1458 if (res == INVALID_OPERATION) { 1459 dprintf(fd, " API2 not directly supported\n"); 1460 } else if (res != OK) { 1461 dprintf(fd, " <Error reading camera characteristics: %s (%d)>\n", 1462 strerror(-res), res); 1463 } else { 1464 dprintf(fd, " API2 camera characteristics:\n"); 1465 info2.dump(fd, /*verbosity*/ 2, /*indentation*/ 4); 1466 } 1467 1468 // Dump characteristics of non-standalone physical camera 1469 if (device->mIsLogicalCamera) { 1470 for (auto& id : device->mPhysicalIds) { 1471 // Skip if physical id is an independent camera 1472 if (std::find(mProviderPublicCameraIds.begin(), mProviderPublicCameraIds.end(), id) 1473 != mProviderPublicCameraIds.end()) { 1474 continue; 1475 } 1476 1477 CameraMetadata physicalInfo; 1478 status_t status = device->getPhysicalCameraCharacteristics(id, &physicalInfo); 1479 if (status == OK) { 1480 dprintf(fd, " Physical camera %s characteristics:\n", id.c_str()); 1481 physicalInfo.dump(fd, /*verbosity*/ 2, /*indentation*/ 4); 1482 } 1483 } 1484 } 1485 1486 dprintf(fd, "== Camera HAL device %s (v%d.%d) dumpState: ==\n", device->mName.c_str(), 1487 device->mVersion.get_major(), device->mVersion.get_minor()); 1488 res = device->dumpState(fd); 1489 if (res != OK) { 1490 dprintf(fd, " <Error dumping device %s state: %s (%d)>\n", 1491 device->mName.c_str(), strerror(-res), res); 1492 } 1493 } 1494 return OK; 1495 } 1496 1497 hardware::Return<void> CameraProviderManager::ProviderInfo::cameraDeviceStatusChange( 1498 const hardware::hidl_string& cameraDeviceName, 1499 CameraDeviceStatus newStatus) { 1500 sp<StatusListener> listener; 1501 std::string id; 1502 bool initialized = false; 1503 { 1504 std::lock_guard<std::mutex> lock(mLock); 1505 bool known = false; 1506 for (auto& deviceInfo : mDevices) { 1507 if (deviceInfo->mName == cameraDeviceName) { 1508 ALOGI("Camera device %s status is now %s, was %s", cameraDeviceName.c_str(), 1509 deviceStatusToString(newStatus), deviceStatusToString(deviceInfo->mStatus)); 1510 deviceInfo->mStatus = newStatus; 1511 // TODO: Handle device removal (NOT_PRESENT) 1512 id = deviceInfo->mId; 1513 known = true; 1514 break; 1515 } 1516 } 1517 // Previously unseen device; status must not be NOT_PRESENT 1518 if (!known) { 1519 if (newStatus == CameraDeviceStatus::NOT_PRESENT) { 1520 ALOGW("Camera provider %s says an unknown camera device %s is not present. Curious.", 1521 mProviderName.c_str(), cameraDeviceName.c_str()); 1522 return hardware::Void(); 1523 } 1524 addDevice(cameraDeviceName, newStatus, &id); 1525 } else if (newStatus == CameraDeviceStatus::NOT_PRESENT) { 1526 removeDevice(id); 1527 } 1528 listener = mManager->getStatusListener(); 1529 initialized = mInitialized; 1530 } 1531 // Call without lock held to allow reentrancy into provider manager 1532 // Don't send the callback if providerInfo hasn't been initialized. 1533 // CameraService will initialize device status after provider is 1534 // initialized 1535 if (listener != nullptr && initialized) { 1536 listener->onDeviceStatusChanged(String8(id.c_str()), newStatus); 1537 } 1538 return hardware::Void(); 1539 } 1540 1541 hardware::Return<void> CameraProviderManager::ProviderInfo::torchModeStatusChange( 1542 const hardware::hidl_string& cameraDeviceName, 1543 TorchModeStatus newStatus) { 1544 sp<StatusListener> listener; 1545 std::string id; 1546 { 1547 std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex); 1548 bool known = false; 1549 for (auto& deviceInfo : mDevices) { 1550 if (deviceInfo->mName == cameraDeviceName) { 1551 ALOGI("Camera device %s torch status is now %s", cameraDeviceName.c_str(), 1552 torchStatusToString(newStatus)); 1553 id = deviceInfo->mId; 1554 known = true; 1555 if (TorchModeStatus::AVAILABLE_ON != newStatus) { 1556 mManager->removeRef(DeviceMode::TORCH, id); 1557 } 1558 break; 1559 } 1560 } 1561 if (!known) { 1562 ALOGW("Camera provider %s says an unknown camera %s now has torch status %d. Curious.", 1563 mProviderName.c_str(), cameraDeviceName.c_str(), newStatus); 1564 return hardware::Void(); 1565 } 1566 listener = mManager->getStatusListener(); 1567 } 1568 // Call without lock held to allow reentrancy into provider manager 1569 if (listener != nullptr) { 1570 listener->onTorchStatusChanged(String8(id.c_str()), newStatus); 1571 } 1572 return hardware::Void(); 1573 } 1574 1575 void CameraProviderManager::ProviderInfo::serviceDied(uint64_t cookie, 1576 const wp<hidl::base::V1_0::IBase>& who) { 1577 (void) who; 1578 ALOGI("Camera provider '%s' has died; removing it", mProviderName.c_str()); 1579 if (cookie != mId) { 1580 ALOGW("%s: Unexpected serviceDied cookie %" PRIu64 ", expected %" PRIu32, 1581 __FUNCTION__, cookie, mId); 1582 } 1583 mManager->removeProvider(mProviderName); 1584 } 1585 1586 status_t CameraProviderManager::ProviderInfo::setUpVendorTags() { 1587 if (mVendorTagDescriptor != nullptr) 1588 return OK; 1589 1590 hardware::hidl_vec<VendorTagSection> vts; 1591 Status status; 1592 hardware::Return<void> ret; 1593 const sp<provider::V2_4::ICameraProvider> interface = startProviderInterface(); 1594 if (interface == nullptr) { 1595 return DEAD_OBJECT; 1596 } 1597 ret = interface->getVendorTags( 1598 [&](auto s, const auto& vendorTagSecs) { 1599 status = s; 1600 if (s == Status::OK) { 1601 vts = vendorTagSecs; 1602 } 1603 }); 1604 if (!ret.isOk()) { 1605 ALOGE("%s: Transaction error getting vendor tags from provider '%s': %s", 1606 __FUNCTION__, mProviderName.c_str(), ret.description().c_str()); 1607 return DEAD_OBJECT; 1608 } 1609 if (status != Status::OK) { 1610 return mapToStatusT(status); 1611 } 1612 1613 // Read all vendor tag definitions into a descriptor 1614 status_t res; 1615 if ((res = HidlVendorTagDescriptor::createDescriptorFromHidl(vts, /*out*/mVendorTagDescriptor)) 1616 != OK) { 1617 ALOGE("%s: Could not generate descriptor from vendor tag operations," 1618 "received error %s (%d). Camera clients will not be able to use" 1619 "vendor tags", __FUNCTION__, strerror(res), res); 1620 return res; 1621 } 1622 1623 return OK; 1624 } 1625 1626 status_t CameraProviderManager::ProviderInfo::notifyDeviceStateChange( 1627 hardware::hidl_bitfield<provider::V2_5::DeviceState> newDeviceState) { 1628 mDeviceState = newDeviceState; 1629 if (mMinorVersion >= 5) { 1630 // Check if the provider is currently active - not going to start it up for this notification 1631 auto interface = mSavedInterface != nullptr ? mSavedInterface : mActiveInterface.promote(); 1632 if (interface != nullptr) { 1633 // Send current device state 1634 auto castResult = provider::V2_5::ICameraProvider::castFrom(interface); 1635 if (castResult.isOk()) { 1636 sp<provider::V2_5::ICameraProvider> interface_2_5 = castResult; 1637 if (interface_2_5 != nullptr) { 1638 interface_2_5->notifyDeviceStateChange(mDeviceState); 1639 } 1640 } 1641 } 1642 } 1643 return OK; 1644 } 1645 1646 template<class DeviceInfoT> 1647 std::unique_ptr<CameraProviderManager::ProviderInfo::DeviceInfo> 1648 CameraProviderManager::ProviderInfo::initializeDeviceInfo( 1649 const std::string &name, const metadata_vendor_id_t tagId, 1650 const std::string &id, uint16_t minorVersion) { 1651 Status status; 1652 1653 auto cameraInterface = 1654 startDeviceInterface<typename DeviceInfoT::InterfaceT>(name); 1655 if (cameraInterface == nullptr) return nullptr; 1656 1657 CameraResourceCost resourceCost; 1658 cameraInterface->getResourceCost([&status, &resourceCost]( 1659 Status s, CameraResourceCost cost) { 1660 status = s; 1661 resourceCost = cost; 1662 }); 1663 if (status != Status::OK) { 1664 ALOGE("%s: Unable to obtain resource costs for camera device %s: %s", __FUNCTION__, 1665 name.c_str(), statusToString(status)); 1666 return nullptr; 1667 } 1668 1669 for (auto& conflictName : resourceCost.conflictingDevices) { 1670 uint16_t major, minor; 1671 std::string type, id; 1672 status_t res = parseDeviceName(conflictName, &major, &minor, &type, &id); 1673 if (res != OK) { 1674 ALOGE("%s: Failed to parse conflicting device %s", __FUNCTION__, conflictName.c_str()); 1675 return nullptr; 1676 } 1677 conflictName = id; 1678 } 1679 1680 return std::unique_ptr<DeviceInfo>( 1681 new DeviceInfoT(name, tagId, id, minorVersion, resourceCost, this, 1682 mProviderPublicCameraIds, cameraInterface)); 1683 } 1684 1685 template<class InterfaceT> 1686 sp<InterfaceT> 1687 CameraProviderManager::ProviderInfo::startDeviceInterface(const std::string &name) { 1688 ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__, 1689 name.c_str(), InterfaceT::version.get_major()); 1690 return nullptr; 1691 } 1692 1693 template<> 1694 sp<device::V1_0::ICameraDevice> 1695 CameraProviderManager::ProviderInfo::startDeviceInterface 1696 <device::V1_0::ICameraDevice>(const std::string &name) { 1697 Status status; 1698 sp<device::V1_0::ICameraDevice> cameraInterface; 1699 hardware::Return<void> ret; 1700 const sp<provider::V2_4::ICameraProvider> interface = startProviderInterface(); 1701 if (interface == nullptr) { 1702 return nullptr; 1703 } 1704 ret = interface->getCameraDeviceInterface_V1_x(name, [&status, &cameraInterface]( 1705 Status s, sp<device::V1_0::ICameraDevice> interface) { 1706 status = s; 1707 cameraInterface = interface; 1708 }); 1709 if (!ret.isOk()) { 1710 ALOGE("%s: Transaction error trying to obtain interface for camera device %s: %s", 1711 __FUNCTION__, name.c_str(), ret.description().c_str()); 1712 return nullptr; 1713 } 1714 if (status != Status::OK) { 1715 ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__, 1716 name.c_str(), statusToString(status)); 1717 return nullptr; 1718 } 1719 return cameraInterface; 1720 } 1721 1722 template<> 1723 sp<device::V3_2::ICameraDevice> 1724 CameraProviderManager::ProviderInfo::startDeviceInterface 1725 <device::V3_2::ICameraDevice>(const std::string &name) { 1726 Status status; 1727 sp<device::V3_2::ICameraDevice> cameraInterface; 1728 hardware::Return<void> ret; 1729 const sp<provider::V2_4::ICameraProvider> interface = startProviderInterface(); 1730 if (interface == nullptr) { 1731 return nullptr; 1732 } 1733 ret = interface->getCameraDeviceInterface_V3_x(name, [&status, &cameraInterface]( 1734 Status s, sp<device::V3_2::ICameraDevice> interface) { 1735 status = s; 1736 cameraInterface = interface; 1737 }); 1738 if (!ret.isOk()) { 1739 ALOGE("%s: Transaction error trying to obtain interface for camera device %s: %s", 1740 __FUNCTION__, name.c_str(), ret.description().c_str()); 1741 return nullptr; 1742 } 1743 if (status != Status::OK) { 1744 ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__, 1745 name.c_str(), statusToString(status)); 1746 return nullptr; 1747 } 1748 return cameraInterface; 1749 } 1750 1751 CameraProviderManager::ProviderInfo::DeviceInfo::~DeviceInfo() {} 1752 1753 template<class InterfaceT> 1754 sp<InterfaceT> CameraProviderManager::ProviderInfo::DeviceInfo::startDeviceInterface() { 1755 sp<InterfaceT> device; 1756 ATRACE_CALL(); 1757 if (mSavedInterface == nullptr) { 1758 device = mParentProvider->startDeviceInterface<InterfaceT>(mName); 1759 } else { 1760 device = (InterfaceT *) mSavedInterface.get(); 1761 } 1762 return device; 1763 } 1764 1765 template<class InterfaceT> 1766 status_t CameraProviderManager::ProviderInfo::DeviceInfo::setTorchMode(InterfaceT& interface, 1767 bool enabled) { 1768 Status s = interface->setTorchMode(enabled ? TorchMode::ON : TorchMode::OFF); 1769 return mapToStatusT(s); 1770 } 1771 1772 CameraProviderManager::ProviderInfo::DeviceInfo1::DeviceInfo1(const std::string& name, 1773 const metadata_vendor_id_t tagId, const std::string &id, 1774 uint16_t minorVersion, 1775 const CameraResourceCost& resourceCost, 1776 sp<ProviderInfo> parentProvider, 1777 const std::vector<std::string>& publicCameraIds, 1778 sp<InterfaceT> interface) : 1779 DeviceInfo(name, tagId, id, hardware::hidl_version{1, minorVersion}, 1780 publicCameraIds, resourceCost, parentProvider) { 1781 // Get default parameters and initialize flash unit availability 1782 // Requires powering on the camera device 1783 hardware::Return<Status> status = interface->open(nullptr); 1784 if (!status.isOk()) { 1785 ALOGE("%s: Transaction error opening camera device %s to check for a flash unit: %s", 1786 __FUNCTION__, id.c_str(), status.description().c_str()); 1787 return; 1788 } 1789 if (status != Status::OK) { 1790 ALOGE("%s: Unable to open camera device %s to check for a flash unit: %s", __FUNCTION__, 1791 id.c_str(), CameraProviderManager::statusToString(status)); 1792 return; 1793 } 1794 hardware::Return<void> ret; 1795 ret = interface->getParameters([this](const hardware::hidl_string& parms) { 1796 mDefaultParameters.unflatten(String8(parms.c_str())); 1797 }); 1798 if (!ret.isOk()) { 1799 ALOGE("%s: Transaction error reading camera device %s params to check for a flash unit: %s", 1800 __FUNCTION__, id.c_str(), status.description().c_str()); 1801 return; 1802 } 1803 const char *flashMode = 1804 mDefaultParameters.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES); 1805 if (flashMode && strstr(flashMode, CameraParameters::FLASH_MODE_TORCH)) { 1806 mHasFlashUnit = true; 1807 } 1808 1809 status_t res = cacheCameraInfo(interface); 1810 if (res != OK) { 1811 ALOGE("%s: Could not cache CameraInfo", __FUNCTION__); 1812 return; 1813 } 1814 1815 ret = interface->close(); 1816 if (!ret.isOk()) { 1817 ALOGE("%s: Transaction error closing camera device %s after check for a flash unit: %s", 1818 __FUNCTION__, id.c_str(), status.description().c_str()); 1819 } 1820 1821 if (!kEnableLazyHal) { 1822 // Save HAL reference indefinitely 1823 mSavedInterface = interface; 1824 } 1825 } 1826 1827 CameraProviderManager::ProviderInfo::DeviceInfo1::~DeviceInfo1() {} 1828 1829 status_t CameraProviderManager::ProviderInfo::DeviceInfo1::setTorchMode(bool enabled) { 1830 return setTorchModeForDevice<InterfaceT>(enabled); 1831 } 1832 1833 status_t CameraProviderManager::ProviderInfo::DeviceInfo1::getCameraInfo( 1834 hardware::CameraInfo *info) const { 1835 if (info == nullptr) return BAD_VALUE; 1836 *info = mInfo; 1837 return OK; 1838 } 1839 1840 status_t CameraProviderManager::ProviderInfo::DeviceInfo1::cacheCameraInfo( 1841 sp<CameraProviderManager::ProviderInfo::DeviceInfo1::InterfaceT> interface) { 1842 Status status; 1843 device::V1_0::CameraInfo cInfo; 1844 hardware::Return<void> ret; 1845 ret = interface->getCameraInfo([&status, &cInfo](Status s, device::V1_0::CameraInfo camInfo) { 1846 status = s; 1847 cInfo = camInfo; 1848 }); 1849 if (!ret.isOk()) { 1850 ALOGE("%s: Transaction error reading camera info from device %s: %s", 1851 __FUNCTION__, mId.c_str(), ret.description().c_str()); 1852 return DEAD_OBJECT; 1853 } 1854 if (status != Status::OK) { 1855 return mapToStatusT(status); 1856 } 1857 1858 switch(cInfo.facing) { 1859 case device::V1_0::CameraFacing::BACK: 1860 mInfo.facing = hardware::CAMERA_FACING_BACK; 1861 break; 1862 case device::V1_0::CameraFacing::EXTERNAL: 1863 // Map external to front for legacy API 1864 case device::V1_0::CameraFacing::FRONT: 1865 mInfo.facing = hardware::CAMERA_FACING_FRONT; 1866 break; 1867 default: 1868 ALOGW("%s: Device %s: Unknown camera facing: %d", 1869 __FUNCTION__, mId.c_str(), cInfo.facing); 1870 mInfo.facing = hardware::CAMERA_FACING_BACK; 1871 } 1872 mInfo.orientation = cInfo.orientation; 1873 1874 return OK; 1875 } 1876 1877 status_t CameraProviderManager::ProviderInfo::DeviceInfo1::dumpState(int fd) { 1878 native_handle_t* handle = native_handle_create(1,0); 1879 handle->data[0] = fd; 1880 const sp<InterfaceT> interface = startDeviceInterface<InterfaceT>(); 1881 if (interface == nullptr) { 1882 return DEAD_OBJECT; 1883 } 1884 hardware::Return<Status> s = interface->dumpState(handle); 1885 native_handle_delete(handle); 1886 if (!s.isOk()) { 1887 return INVALID_OPERATION; 1888 } 1889 return mapToStatusT(s); 1890 } 1891 1892 CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string& name, 1893 const metadata_vendor_id_t tagId, const std::string &id, 1894 uint16_t minorVersion, 1895 const CameraResourceCost& resourceCost, 1896 sp<ProviderInfo> parentProvider, 1897 const std::vector<std::string>& publicCameraIds, 1898 sp<InterfaceT> interface) : 1899 DeviceInfo(name, tagId, id, hardware::hidl_version{3, minorVersion}, 1900 publicCameraIds, resourceCost, parentProvider) { 1901 // Get camera characteristics and initialize flash unit availability 1902 Status status; 1903 hardware::Return<void> ret; 1904 ret = interface->getCameraCharacteristics([&status, this](Status s, 1905 device::V3_2::CameraMetadata metadata) { 1906 status = s; 1907 if (s == Status::OK) { 1908 camera_metadata_t *buffer = 1909 reinterpret_cast<camera_metadata_t*>(metadata.data()); 1910 size_t expectedSize = metadata.size(); 1911 int res = validate_camera_metadata_structure(buffer, &expectedSize); 1912 if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) { 1913 set_camera_metadata_vendor_id(buffer, mProviderTagid); 1914 mCameraCharacteristics = buffer; 1915 } else { 1916 ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__); 1917 status = Status::INTERNAL_ERROR; 1918 } 1919 } 1920 }); 1921 if (!ret.isOk()) { 1922 ALOGE("%s: Transaction error getting camera characteristics for device %s" 1923 " to check for a flash unit: %s", __FUNCTION__, id.c_str(), 1924 ret.description().c_str()); 1925 return; 1926 } 1927 if (status != Status::OK) { 1928 ALOGE("%s: Unable to get camera characteristics for device %s: %s (%d)", 1929 __FUNCTION__, id.c_str(), CameraProviderManager::statusToString(status), status); 1930 return; 1931 } 1932 1933 mIsPublicallyHiddenSecureCamera = isPublicallyHiddenSecureCamera(); 1934 1935 status_t res = fixupMonochromeTags(); 1936 if (OK != res) { 1937 ALOGE("%s: Unable to fix up monochrome tags based for older HAL version: %s (%d)", 1938 __FUNCTION__, strerror(-res), res); 1939 return; 1940 } 1941 auto stat = addDynamicDepthTags(); 1942 if (OK != stat) { 1943 ALOGE("%s: Failed appending dynamic depth tags: %s (%d)", __FUNCTION__, strerror(-stat), 1944 stat); 1945 } 1946 res = deriveHeicTags(); 1947 if (OK != res) { 1948 ALOGE("%s: Unable to derive HEIC tags based on camera and media capabilities: %s (%d)", 1949 __FUNCTION__, strerror(-res), res); 1950 } 1951 1952 camera_metadata_entry flashAvailable = 1953 mCameraCharacteristics.find(ANDROID_FLASH_INFO_AVAILABLE); 1954 if (flashAvailable.count == 1 && 1955 flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE) { 1956 mHasFlashUnit = true; 1957 } else { 1958 mHasFlashUnit = false; 1959 } 1960 1961 queryPhysicalCameraIds(); 1962 1963 // Get physical camera characteristics if applicable 1964 auto castResult = device::V3_5::ICameraDevice::castFrom(interface); 1965 if (!castResult.isOk()) { 1966 ALOGV("%s: Unable to convert ICameraDevice instance to version 3.5", __FUNCTION__); 1967 return; 1968 } 1969 sp<device::V3_5::ICameraDevice> interface_3_5 = castResult; 1970 if (interface_3_5 == nullptr) { 1971 ALOGE("%s: Converted ICameraDevice instance to nullptr", __FUNCTION__); 1972 return; 1973 } 1974 1975 if (mIsLogicalCamera) { 1976 for (auto& id : mPhysicalIds) { 1977 if (std::find(mPublicCameraIds.begin(), mPublicCameraIds.end(), id) != 1978 mPublicCameraIds.end()) { 1979 continue; 1980 } 1981 1982 hardware::hidl_string hidlId(id); 1983 ret = interface_3_5->getPhysicalCameraCharacteristics(hidlId, 1984 [&status, &id, this](Status s, device::V3_2::CameraMetadata metadata) { 1985 status = s; 1986 if (s == Status::OK) { 1987 camera_metadata_t *buffer = 1988 reinterpret_cast<camera_metadata_t*>(metadata.data()); 1989 size_t expectedSize = metadata.size(); 1990 int res = validate_camera_metadata_structure(buffer, &expectedSize); 1991 if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) { 1992 set_camera_metadata_vendor_id(buffer, mProviderTagid); 1993 mPhysicalCameraCharacteristics[id] = buffer; 1994 } else { 1995 ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__); 1996 status = Status::INTERNAL_ERROR; 1997 } 1998 } 1999 }); 2000 2001 if (!ret.isOk()) { 2002 ALOGE("%s: Transaction error getting physical camera %s characteristics for %s: %s", 2003 __FUNCTION__, id.c_str(), id.c_str(), ret.description().c_str()); 2004 return; 2005 } 2006 if (status != Status::OK) { 2007 ALOGE("%s: Unable to get physical camera %s characteristics for device %s: %s (%d)", 2008 __FUNCTION__, id.c_str(), mId.c_str(), 2009 CameraProviderManager::statusToString(status), status); 2010 return; 2011 } 2012 } 2013 } 2014 2015 if (!kEnableLazyHal) { 2016 // Save HAL reference indefinitely 2017 mSavedInterface = interface; 2018 } 2019 } 2020 2021 CameraProviderManager::ProviderInfo::DeviceInfo3::~DeviceInfo3() {} 2022 2023 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::setTorchMode(bool enabled) { 2024 return setTorchModeForDevice<InterfaceT>(enabled); 2025 } 2026 2027 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraInfo( 2028 hardware::CameraInfo *info) const { 2029 if (info == nullptr) return BAD_VALUE; 2030 2031 camera_metadata_ro_entry facing = 2032 mCameraCharacteristics.find(ANDROID_LENS_FACING); 2033 if (facing.count == 1) { 2034 switch (facing.data.u8[0]) { 2035 case ANDROID_LENS_FACING_BACK: 2036 info->facing = hardware::CAMERA_FACING_BACK; 2037 break; 2038 case ANDROID_LENS_FACING_EXTERNAL: 2039 // Map external to front for legacy API 2040 case ANDROID_LENS_FACING_FRONT: 2041 info->facing = hardware::CAMERA_FACING_FRONT; 2042 break; 2043 } 2044 } else { 2045 ALOGE("%s: Unable to find android.lens.facing static metadata", __FUNCTION__); 2046 return NAME_NOT_FOUND; 2047 } 2048 2049 camera_metadata_ro_entry orientation = 2050 mCameraCharacteristics.find(ANDROID_SENSOR_ORIENTATION); 2051 if (orientation.count == 1) { 2052 info->orientation = orientation.data.i32[0]; 2053 } else { 2054 ALOGE("%s: Unable to find android.sensor.orientation static metadata", __FUNCTION__); 2055 return NAME_NOT_FOUND; 2056 } 2057 2058 return OK; 2059 } 2060 bool CameraProviderManager::ProviderInfo::DeviceInfo3::isAPI1Compatible() const { 2061 bool isBackwardCompatible = false; 2062 camera_metadata_ro_entry_t caps = mCameraCharacteristics.find( 2063 ANDROID_REQUEST_AVAILABLE_CAPABILITIES); 2064 for (size_t i = 0; i < caps.count; i++) { 2065 if (caps.data.u8[i] == 2066 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) { 2067 isBackwardCompatible = true; 2068 break; 2069 } 2070 } 2071 2072 return isBackwardCompatible; 2073 } 2074 2075 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::dumpState(int fd) { 2076 native_handle_t* handle = native_handle_create(1,0); 2077 handle->data[0] = fd; 2078 const sp<InterfaceT> interface = startDeviceInterface<InterfaceT>(); 2079 if (interface == nullptr) { 2080 return DEAD_OBJECT; 2081 } 2082 auto ret = interface->dumpState(handle); 2083 native_handle_delete(handle); 2084 if (!ret.isOk()) { 2085 return INVALID_OPERATION; 2086 } 2087 return OK; 2088 } 2089 2090 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraCharacteristics( 2091 CameraMetadata *characteristics) const { 2092 if (characteristics == nullptr) return BAD_VALUE; 2093 2094 *characteristics = mCameraCharacteristics; 2095 return OK; 2096 } 2097 2098 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getPhysicalCameraCharacteristics( 2099 const std::string& physicalCameraId, CameraMetadata *characteristics) const { 2100 if (characteristics == nullptr) return BAD_VALUE; 2101 if (mPhysicalCameraCharacteristics.find(physicalCameraId) == 2102 mPhysicalCameraCharacteristics.end()) { 2103 return NAME_NOT_FOUND; 2104 } 2105 2106 *characteristics = mPhysicalCameraCharacteristics.at(physicalCameraId); 2107 return OK; 2108 } 2109 2110 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::isSessionConfigurationSupported( 2111 const hardware::camera::device::V3_4::StreamConfiguration &configuration, 2112 bool *status /*out*/) { 2113 2114 const sp<CameraProviderManager::ProviderInfo::DeviceInfo3::InterfaceT> interface = 2115 this->startDeviceInterface<CameraProviderManager::ProviderInfo::DeviceInfo3::InterfaceT>(); 2116 if (interface == nullptr) { 2117 return DEAD_OBJECT; 2118 } 2119 auto castResult = device::V3_5::ICameraDevice::castFrom(interface); 2120 sp<hardware::camera::device::V3_5::ICameraDevice> interface_3_5 = castResult; 2121 if (interface_3_5 == nullptr) { 2122 return INVALID_OPERATION; 2123 } 2124 2125 status_t res; 2126 Status callStatus; 2127 auto ret = interface_3_5->isStreamCombinationSupported(configuration, 2128 [&callStatus, &status] (Status s, bool combStatus) { 2129 callStatus = s; 2130 *status = combStatus; 2131 }); 2132 if (ret.isOk()) { 2133 switch (callStatus) { 2134 case Status::OK: 2135 // Expected case, do nothing. 2136 res = OK; 2137 break; 2138 case Status::METHOD_NOT_SUPPORTED: 2139 res = INVALID_OPERATION; 2140 break; 2141 default: 2142 ALOGE("%s: Session configuration query failed: %d", __FUNCTION__, callStatus); 2143 res = UNKNOWN_ERROR; 2144 } 2145 } else { 2146 ALOGE("%s: Unexpected binder error: %s", __FUNCTION__, ret.description().c_str()); 2147 res = UNKNOWN_ERROR; 2148 } 2149 2150 return res; 2151 } 2152 2153 status_t CameraProviderManager::ProviderInfo::parseProviderName(const std::string& name, 2154 std::string *type, uint32_t *id) { 2155 // Format must be "<type>/<id>" 2156 #define ERROR_MSG_PREFIX "%s: Invalid provider name '%s'. " \ 2157 "Should match '<type>/<id>' - " 2158 2159 if (!type || !id) return INVALID_OPERATION; 2160 2161 std::string::size_type slashIdx = name.find('/'); 2162 if (slashIdx == std::string::npos || slashIdx == name.size() - 1) { 2163 ALOGE(ERROR_MSG_PREFIX 2164 "does not have / separator between type and id", 2165 __FUNCTION__, name.c_str()); 2166 return BAD_VALUE; 2167 } 2168 2169 std::string typeVal = name.substr(0, slashIdx); 2170 2171 char *endPtr; 2172 errno = 0; 2173 long idVal = strtol(name.c_str() + slashIdx + 1, &endPtr, 10); 2174 if (errno != 0) { 2175 ALOGE(ERROR_MSG_PREFIX 2176 "cannot parse provider id as an integer: %s (%d)", 2177 __FUNCTION__, name.c_str(), strerror(errno), errno); 2178 return BAD_VALUE; 2179 } 2180 if (endPtr != name.c_str() + name.size()) { 2181 ALOGE(ERROR_MSG_PREFIX 2182 "provider id has unexpected length", 2183 __FUNCTION__, name.c_str()); 2184 return BAD_VALUE; 2185 } 2186 if (idVal < 0) { 2187 ALOGE(ERROR_MSG_PREFIX 2188 "id is negative: %ld", 2189 __FUNCTION__, name.c_str(), idVal); 2190 return BAD_VALUE; 2191 } 2192 2193 #undef ERROR_MSG_PREFIX 2194 2195 *type = typeVal; 2196 *id = static_cast<uint32_t>(idVal); 2197 2198 return OK; 2199 } 2200 2201 metadata_vendor_id_t CameraProviderManager::ProviderInfo::generateVendorTagId( 2202 const std::string &name) { 2203 metadata_vendor_id_t ret = std::hash<std::string> {} (name); 2204 // CAMERA_METADATA_INVALID_VENDOR_ID is not a valid hash value 2205 if (CAMERA_METADATA_INVALID_VENDOR_ID == ret) { 2206 ret = 0; 2207 } 2208 2209 return ret; 2210 } 2211 2212 status_t CameraProviderManager::ProviderInfo::parseDeviceName(const std::string& name, 2213 uint16_t *major, uint16_t *minor, std::string *type, std::string *id) { 2214 2215 // Format must be "device@<major>.<minor>/<type>/<id>" 2216 2217 #define ERROR_MSG_PREFIX "%s: Invalid device name '%s'. " \ 2218 "Should match 'device@<major>.<minor>/<type>/<id>' - " 2219 2220 if (!major || !minor || !type || !id) return INVALID_OPERATION; 2221 2222 // Verify starting prefix 2223 const char expectedPrefix[] = "device@"; 2224 2225 if (name.find(expectedPrefix) != 0) { 2226 ALOGE(ERROR_MSG_PREFIX 2227 "does not start with '%s'", 2228 __FUNCTION__, name.c_str(), expectedPrefix); 2229 return BAD_VALUE; 2230 } 2231 2232 // Extract major/minor versions 2233 constexpr std::string::size_type atIdx = sizeof(expectedPrefix) - 2; 2234 std::string::size_type dotIdx = name.find('.', atIdx); 2235 if (dotIdx == std::string::npos) { 2236 ALOGE(ERROR_MSG_PREFIX 2237 "does not have @<major>. version section", 2238 __FUNCTION__, name.c_str()); 2239 return BAD_VALUE; 2240 } 2241 std::string::size_type typeSlashIdx = name.find('/', dotIdx); 2242 if (typeSlashIdx == std::string::npos) { 2243 ALOGE(ERROR_MSG_PREFIX 2244 "does not have .<minor>/ version section", 2245 __FUNCTION__, name.c_str()); 2246 return BAD_VALUE; 2247 } 2248 2249 char *endPtr; 2250 errno = 0; 2251 long majorVal = strtol(name.c_str() + atIdx + 1, &endPtr, 10); 2252 if (errno != 0) { 2253 ALOGE(ERROR_MSG_PREFIX 2254 "cannot parse major version: %s (%d)", 2255 __FUNCTION__, name.c_str(), strerror(errno), errno); 2256 return BAD_VALUE; 2257 } 2258 if (endPtr != name.c_str() + dotIdx) { 2259 ALOGE(ERROR_MSG_PREFIX 2260 "major version has unexpected length", 2261 __FUNCTION__, name.c_str()); 2262 return BAD_VALUE; 2263 } 2264 long minorVal = strtol(name.c_str() + dotIdx + 1, &endPtr, 10); 2265 if (errno != 0) { 2266 ALOGE(ERROR_MSG_PREFIX 2267 "cannot parse minor version: %s (%d)", 2268 __FUNCTION__, name.c_str(), strerror(errno), errno); 2269 return BAD_VALUE; 2270 } 2271 if (endPtr != name.c_str() + typeSlashIdx) { 2272 ALOGE(ERROR_MSG_PREFIX 2273 "minor version has unexpected length", 2274 __FUNCTION__, name.c_str()); 2275 return BAD_VALUE; 2276 } 2277 if (majorVal < 0 || majorVal > UINT16_MAX || minorVal < 0 || minorVal > UINT16_MAX) { 2278 ALOGE(ERROR_MSG_PREFIX 2279 "major/minor version is out of range of uint16_t: %ld.%ld", 2280 __FUNCTION__, name.c_str(), majorVal, minorVal); 2281 return BAD_VALUE; 2282 } 2283 2284 // Extract type and id 2285 2286 std::string::size_type instanceSlashIdx = name.find('/', typeSlashIdx + 1); 2287 if (instanceSlashIdx == std::string::npos) { 2288 ALOGE(ERROR_MSG_PREFIX 2289 "does not have /<type>/ component", 2290 __FUNCTION__, name.c_str()); 2291 return BAD_VALUE; 2292 } 2293 std::string typeVal = name.substr(typeSlashIdx + 1, instanceSlashIdx - typeSlashIdx - 1); 2294 2295 if (instanceSlashIdx == name.size() - 1) { 2296 ALOGE(ERROR_MSG_PREFIX 2297 "does not have an /<id> component", 2298 __FUNCTION__, name.c_str()); 2299 return BAD_VALUE; 2300 } 2301 std::string idVal = name.substr(instanceSlashIdx + 1); 2302 2303 #undef ERROR_MSG_PREFIX 2304 2305 *major = static_cast<uint16_t>(majorVal); 2306 *minor = static_cast<uint16_t>(minorVal); 2307 *type = typeVal; 2308 *id = idVal; 2309 2310 return OK; 2311 } 2312 2313 2314 2315 CameraProviderManager::ProviderInfo::~ProviderInfo() { 2316 // Destruction of ProviderInfo is only supposed to happen when the respective 2317 // CameraProvider interface dies, so do not unregister callbacks. 2318 2319 } 2320 2321 status_t CameraProviderManager::mapToStatusT(const Status& s) { 2322 switch(s) { 2323 case Status::OK: 2324 return OK; 2325 case Status::ILLEGAL_ARGUMENT: 2326 return BAD_VALUE; 2327 case Status::CAMERA_IN_USE: 2328 return -EBUSY; 2329 case Status::MAX_CAMERAS_IN_USE: 2330 return -EUSERS; 2331 case Status::METHOD_NOT_SUPPORTED: 2332 return UNKNOWN_TRANSACTION; 2333 case Status::OPERATION_NOT_SUPPORTED: 2334 return INVALID_OPERATION; 2335 case Status::CAMERA_DISCONNECTED: 2336 return DEAD_OBJECT; 2337 case Status::INTERNAL_ERROR: 2338 return INVALID_OPERATION; 2339 } 2340 ALOGW("Unexpected HAL status code %d", s); 2341 return INVALID_OPERATION; 2342 } 2343 2344 const char* CameraProviderManager::statusToString(const Status& s) { 2345 switch(s) { 2346 case Status::OK: 2347 return "OK"; 2348 case Status::ILLEGAL_ARGUMENT: 2349 return "ILLEGAL_ARGUMENT"; 2350 case Status::CAMERA_IN_USE: 2351 return "CAMERA_IN_USE"; 2352 case Status::MAX_CAMERAS_IN_USE: 2353 return "MAX_CAMERAS_IN_USE"; 2354 case Status::METHOD_NOT_SUPPORTED: 2355 return "METHOD_NOT_SUPPORTED"; 2356 case Status::OPERATION_NOT_SUPPORTED: 2357 return "OPERATION_NOT_SUPPORTED"; 2358 case Status::CAMERA_DISCONNECTED: 2359 return "CAMERA_DISCONNECTED"; 2360 case Status::INTERNAL_ERROR: 2361 return "INTERNAL_ERROR"; 2362 } 2363 ALOGW("Unexpected HAL status code %d", s); 2364 return "UNKNOWN_ERROR"; 2365 } 2366 2367 const char* CameraProviderManager::deviceStatusToString(const CameraDeviceStatus& s) { 2368 switch(s) { 2369 case CameraDeviceStatus::NOT_PRESENT: 2370 return "NOT_PRESENT"; 2371 case CameraDeviceStatus::PRESENT: 2372 return "PRESENT"; 2373 case CameraDeviceStatus::ENUMERATING: 2374 return "ENUMERATING"; 2375 } 2376 ALOGW("Unexpected HAL device status code %d", s); 2377 return "UNKNOWN_STATUS"; 2378 } 2379 2380 const char* CameraProviderManager::torchStatusToString(const TorchModeStatus& s) { 2381 switch(s) { 2382 case TorchModeStatus::NOT_AVAILABLE: 2383 return "NOT_AVAILABLE"; 2384 case TorchModeStatus::AVAILABLE_OFF: 2385 return "AVAILABLE_OFF"; 2386 case TorchModeStatus::AVAILABLE_ON: 2387 return "AVAILABLE_ON"; 2388 } 2389 ALOGW("Unexpected HAL torch mode status code %d", s); 2390 return "UNKNOWN_STATUS"; 2391 } 2392 2393 2394 status_t HidlVendorTagDescriptor::createDescriptorFromHidl( 2395 const hardware::hidl_vec<common::V1_0::VendorTagSection>& vts, 2396 /*out*/ 2397 sp<VendorTagDescriptor>& descriptor) { 2398 2399 int tagCount = 0; 2400 2401 for (size_t s = 0; s < vts.size(); s++) { 2402 tagCount += vts[s].tags.size(); 2403 } 2404 2405 if (tagCount < 0 || tagCount > INT32_MAX) { 2406 ALOGE("%s: tag count %d from vendor tag sections is invalid.", __FUNCTION__, tagCount); 2407 return BAD_VALUE; 2408 } 2409 2410 Vector<uint32_t> tagArray; 2411 LOG_ALWAYS_FATAL_IF(tagArray.resize(tagCount) != tagCount, 2412 "%s: too many (%u) vendor tags defined.", __FUNCTION__, tagCount); 2413 2414 2415 sp<HidlVendorTagDescriptor> desc = new HidlVendorTagDescriptor(); 2416 desc->mTagCount = tagCount; 2417 2418 SortedVector<String8> sections; 2419 KeyedVector<uint32_t, String8> tagToSectionMap; 2420 2421 int idx = 0; 2422 for (size_t s = 0; s < vts.size(); s++) { 2423 const common::V1_0::VendorTagSection& section = vts[s]; 2424 const char *sectionName = section.sectionName.c_str(); 2425 if (sectionName == NULL) { 2426 ALOGE("%s: no section name defined for vendor tag section %zu.", __FUNCTION__, s); 2427 return BAD_VALUE; 2428 } 2429 String8 sectionString(sectionName); 2430 sections.add(sectionString); 2431 2432 for (size_t j = 0; j < section.tags.size(); j++) { 2433 uint32_t tag = section.tags[j].tagId; 2434 if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) { 2435 ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag); 2436 return BAD_VALUE; 2437 } 2438 2439 tagArray.editItemAt(idx++) = section.tags[j].tagId; 2440 2441 const char *tagName = section.tags[j].tagName.c_str(); 2442 if (tagName == NULL) { 2443 ALOGE("%s: no tag name defined for vendor tag %d.", __FUNCTION__, tag); 2444 return BAD_VALUE; 2445 } 2446 desc->mTagToNameMap.add(tag, String8(tagName)); 2447 tagToSectionMap.add(tag, sectionString); 2448 2449 int tagType = (int) section.tags[j].tagType; 2450 if (tagType < 0 || tagType >= NUM_TYPES) { 2451 ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType); 2452 return BAD_VALUE; 2453 } 2454 desc->mTagToTypeMap.add(tag, tagType); 2455 } 2456 } 2457 2458 desc->mSections = sections; 2459 2460 for (size_t i = 0; i < tagArray.size(); ++i) { 2461 uint32_t tag = tagArray[i]; 2462 String8 sectionString = tagToSectionMap.valueFor(tag); 2463 2464 // Set up tag to section index map 2465 ssize_t index = sections.indexOf(sectionString); 2466 LOG_ALWAYS_FATAL_IF(index < 0, "index %zd must be non-negative", index); 2467 desc->mTagToSectionMap.add(tag, static_cast<uint32_t>(index)); 2468 2469 // Set up reverse mapping 2470 ssize_t reverseIndex = -1; 2471 if ((reverseIndex = desc->mReverseMapping.indexOfKey(sectionString)) < 0) { 2472 KeyedVector<String8, uint32_t>* nameMapper = new KeyedVector<String8, uint32_t>(); 2473 reverseIndex = desc->mReverseMapping.add(sectionString, nameMapper); 2474 } 2475 desc->mReverseMapping[reverseIndex]->add(desc->mTagToNameMap.valueFor(tag), tag); 2476 } 2477 2478 descriptor = std::move(desc); 2479 return OK; 2480 } 2481 2482 status_t CameraProviderManager::getCameraCharacteristicsLocked(const std::string &id, 2483 CameraMetadata* characteristics) const { 2484 auto deviceInfo = findDeviceInfoLocked(id, /*minVersion*/ {3,0}, /*maxVersion*/ {5,0}); 2485 if (deviceInfo != nullptr) { 2486 return deviceInfo->getCameraCharacteristics(characteristics); 2487 } 2488 2489 // Find hidden physical camera characteristics 2490 for (auto& provider : mProviders) { 2491 for (auto& deviceInfo : provider->mDevices) { 2492 status_t res = deviceInfo->getPhysicalCameraCharacteristics(id, characteristics); 2493 if (res != NAME_NOT_FOUND) return res; 2494 } 2495 } 2496 2497 return NAME_NOT_FOUND; 2498 } 2499 2500 void CameraProviderManager::filterLogicalCameraIdsLocked( 2501 std::vector<std::string>& deviceIds) const 2502 { 2503 // Map between camera facing and camera IDs related to logical camera. 2504 std::map<int, std::unordered_set<std::string>> idCombos; 2505 2506 // Collect all logical and its underlying physical camera IDs for each 2507 // facing. 2508 for (auto& deviceId : deviceIds) { 2509 auto deviceInfo = findDeviceInfoLocked(deviceId); 2510 if (deviceInfo == nullptr) continue; 2511 2512 if (!deviceInfo->mIsLogicalCamera) { 2513 continue; 2514 } 2515 2516 // combo contains the ids of a logical camera and its physical cameras 2517 std::vector<std::string> combo = deviceInfo->mPhysicalIds; 2518 combo.push_back(deviceId); 2519 2520 hardware::CameraInfo info; 2521 status_t res = deviceInfo->getCameraInfo(&info); 2522 if (res != OK) { 2523 ALOGE("%s: Error reading camera info: %s (%d)", __FUNCTION__, strerror(-res), res); 2524 continue; 2525 } 2526 idCombos[info.facing].insert(combo.begin(), combo.end()); 2527 } 2528 2529 // Only expose one camera ID per facing for all logical and underlying 2530 // physical camera IDs. 2531 for (auto& r : idCombos) { 2532 auto& removedIds = r.second; 2533 for (auto& id : deviceIds) { 2534 auto foundId = std::find(removedIds.begin(), removedIds.end(), id); 2535 if (foundId == removedIds.end()) { 2536 continue; 2537 } 2538 2539 removedIds.erase(foundId); 2540 break; 2541 } 2542 deviceIds.erase(std::remove_if(deviceIds.begin(), deviceIds.end(), 2543 [&removedIds](const std::string& s) { 2544 return removedIds.find(s) != removedIds.end();}), 2545 deviceIds.end()); 2546 } 2547 } 2548 2549 } // namespace android 2550