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 <chrono> 24 #include <inttypes.h> 25 #include <hidl/ServiceManagement.h> 26 #include <functional> 27 #include <camera_metadata_hidden.h> 28 29 namespace android { 30 31 using namespace ::android::hardware::camera; 32 using namespace ::android::hardware::camera::common::V1_0; 33 34 namespace { 35 // Hardcoded name for the passthrough HAL implementation, since it can't be discovered via the 36 // service manager 37 const std::string kLegacyProviderName("legacy/0"); 38 39 // Slash-separated list of provider types to consider for use via the old camera API 40 const std::string kStandardProviderTypes("internal/legacy"); 41 42 } // anonymous namespace 43 44 CameraProviderManager::HardwareServiceInteractionProxy 45 CameraProviderManager::sHardwareServiceInteractionProxy{}; 46 47 CameraProviderManager::~CameraProviderManager() { 48 } 49 50 status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener, 51 ServiceInteractionProxy* proxy) { 52 std::lock_guard<std::mutex> lock(mInterfaceMutex); 53 if (proxy == nullptr) { 54 ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__); 55 return BAD_VALUE; 56 } 57 mListener = listener; 58 mServiceProxy = proxy; 59 60 // Registering will trigger notifications for all already-known providers 61 bool success = mServiceProxy->registerForNotifications( 62 /* instance name, empty means no filter */ "", 63 this); 64 if (!success) { 65 ALOGE("%s: Unable to register with hardware service manager for notifications " 66 "about camera providers", __FUNCTION__); 67 return INVALID_OPERATION; 68 } 69 70 // See if there's a passthrough HAL, but let's not complain if there's not 71 addProviderLocked(kLegacyProviderName, /*expected*/ false); 72 73 return OK; 74 } 75 76 int CameraProviderManager::getCameraCount() const { 77 std::lock_guard<std::mutex> lock(mInterfaceMutex); 78 int count = 0; 79 for (auto& provider : mProviders) { 80 count += provider->mUniqueDeviceCount; 81 } 82 return count; 83 } 84 85 int CameraProviderManager::getAPI1CompatibleCameraCount() const { 86 std::lock_guard<std::mutex> lock(mInterfaceMutex); 87 int count = 0; 88 for (auto& provider : mProviders) { 89 if (kStandardProviderTypes.find(provider->getType()) != std::string::npos) { 90 count += provider->mUniqueAPI1CompatibleCameraIds.size(); 91 } 92 } 93 return count; 94 } 95 96 std::vector<std::string> CameraProviderManager::getCameraDeviceIds() const { 97 std::lock_guard<std::mutex> lock(mInterfaceMutex); 98 std::vector<std::string> deviceIds; 99 for (auto& provider : mProviders) { 100 for (auto& id : provider->mUniqueCameraIds) { 101 deviceIds.push_back(id); 102 } 103 } 104 return deviceIds; 105 } 106 107 std::vector<std::string> CameraProviderManager::getAPI1CompatibleCameraDeviceIds() const { 108 std::lock_guard<std::mutex> lock(mInterfaceMutex); 109 std::vector<std::string> deviceIds; 110 for (auto& provider : mProviders) { 111 if (kStandardProviderTypes.find(provider->getType()) != std::string::npos) { 112 for (auto& id : provider->mUniqueAPI1CompatibleCameraIds) { 113 deviceIds.push_back(id); 114 } 115 } 116 } 117 return deviceIds; 118 } 119 120 bool CameraProviderManager::isValidDevice(const std::string &id, uint16_t majorVersion) const { 121 std::lock_guard<std::mutex> lock(mInterfaceMutex); 122 return isValidDeviceLocked(id, majorVersion); 123 } 124 125 bool CameraProviderManager::isValidDeviceLocked(const std::string &id, uint16_t majorVersion) const { 126 for (auto& provider : mProviders) { 127 for (auto& deviceInfo : provider->mDevices) { 128 if (deviceInfo->mId == id && deviceInfo->mVersion.get_major() == majorVersion) { 129 return true; 130 } 131 } 132 } 133 return false; 134 } 135 136 bool CameraProviderManager::hasFlashUnit(const std::string &id) const { 137 std::lock_guard<std::mutex> lock(mInterfaceMutex); 138 139 auto deviceInfo = findDeviceInfoLocked(id); 140 if (deviceInfo == nullptr) return false; 141 142 return deviceInfo->hasFlashUnit(); 143 } 144 145 status_t CameraProviderManager::getResourceCost(const std::string &id, 146 CameraResourceCost* cost) const { 147 std::lock_guard<std::mutex> lock(mInterfaceMutex); 148 149 auto deviceInfo = findDeviceInfoLocked(id); 150 if (deviceInfo == nullptr) return NAME_NOT_FOUND; 151 152 *cost = deviceInfo->mResourceCost; 153 return OK; 154 } 155 156 status_t CameraProviderManager::getCameraInfo(const std::string &id, 157 hardware::CameraInfo* info) const { 158 std::lock_guard<std::mutex> lock(mInterfaceMutex); 159 160 auto deviceInfo = findDeviceInfoLocked(id); 161 if (deviceInfo == nullptr) return NAME_NOT_FOUND; 162 163 return deviceInfo->getCameraInfo(info); 164 } 165 166 status_t CameraProviderManager::getCameraCharacteristics(const std::string &id, 167 CameraMetadata* characteristics) const { 168 std::lock_guard<std::mutex> lock(mInterfaceMutex); 169 170 auto deviceInfo = findDeviceInfoLocked(id, /*minVersion*/ {3,0}, /*maxVersion*/ {4,0}); 171 if (deviceInfo == nullptr) return NAME_NOT_FOUND; 172 173 return deviceInfo->getCameraCharacteristics(characteristics); 174 } 175 176 status_t CameraProviderManager::getHighestSupportedVersion(const std::string &id, 177 hardware::hidl_version *v) { 178 std::lock_guard<std::mutex> lock(mInterfaceMutex); 179 180 hardware::hidl_version maxVersion{0,0}; 181 bool found = false; 182 for (auto& provider : mProviders) { 183 for (auto& deviceInfo : provider->mDevices) { 184 if (deviceInfo->mId == id) { 185 if (deviceInfo->mVersion > maxVersion) { 186 maxVersion = deviceInfo->mVersion; 187 found = true; 188 } 189 } 190 } 191 } 192 if (!found) { 193 return NAME_NOT_FOUND; 194 } 195 *v = maxVersion; 196 return OK; 197 } 198 199 bool CameraProviderManager::supportSetTorchMode(const std::string &id) { 200 std::lock_guard<std::mutex> lock(mInterfaceMutex); 201 bool support = false; 202 for (auto& provider : mProviders) { 203 auto deviceInfo = findDeviceInfoLocked(id); 204 if (deviceInfo != nullptr) { 205 provider->mInterface->isSetTorchModeSupported( 206 [&support](auto status, bool supported) { 207 if (status == Status::OK) { 208 support = supported; 209 } 210 }); 211 } 212 } 213 return support; 214 } 215 216 status_t CameraProviderManager::setTorchMode(const std::string &id, bool enabled) { 217 std::lock_guard<std::mutex> lock(mInterfaceMutex); 218 219 auto deviceInfo = findDeviceInfoLocked(id); 220 if (deviceInfo == nullptr) return NAME_NOT_FOUND; 221 222 return deviceInfo->setTorchMode(enabled); 223 } 224 225 status_t CameraProviderManager::setUpVendorTags() { 226 sp<VendorTagDescriptorCache> tagCache = new VendorTagDescriptorCache(); 227 228 for (auto& provider : mProviders) { 229 hardware::hidl_vec<VendorTagSection> vts; 230 Status status; 231 hardware::Return<void> ret; 232 ret = provider->mInterface->getVendorTags( 233 [&](auto s, const auto& vendorTagSecs) { 234 status = s; 235 if (s == Status::OK) { 236 vts = vendorTagSecs; 237 } 238 }); 239 if (!ret.isOk()) { 240 ALOGE("%s: Transaction error getting vendor tags from provider '%s': %s", 241 __FUNCTION__, provider->mProviderName.c_str(), ret.description().c_str()); 242 return DEAD_OBJECT; 243 } 244 if (status != Status::OK) { 245 return mapToStatusT(status); 246 } 247 248 // Read all vendor tag definitions into a descriptor 249 sp<VendorTagDescriptor> desc; 250 status_t res; 251 if ((res = HidlVendorTagDescriptor::createDescriptorFromHidl(vts, /*out*/desc)) 252 != OK) { 253 ALOGE("%s: Could not generate descriptor from vendor tag operations," 254 "received error %s (%d). Camera clients will not be able to use" 255 "vendor tags", __FUNCTION__, strerror(res), res); 256 return res; 257 } 258 259 tagCache->addVendorDescriptor(provider->mProviderTagid, desc); 260 } 261 262 VendorTagDescriptorCache::setAsGlobalVendorTagCache(tagCache); 263 264 return OK; 265 } 266 267 status_t CameraProviderManager::openSession(const std::string &id, 268 const sp<hardware::camera::device::V3_2::ICameraDeviceCallback>& callback, 269 /*out*/ 270 sp<hardware::camera::device::V3_2::ICameraDeviceSession> *session) { 271 272 std::lock_guard<std::mutex> lock(mInterfaceMutex); 273 274 auto deviceInfo = findDeviceInfoLocked(id, 275 /*minVersion*/ {3,0}, /*maxVersion*/ {4,0}); 276 if (deviceInfo == nullptr) return NAME_NOT_FOUND; 277 278 auto *deviceInfo3 = static_cast<ProviderInfo::DeviceInfo3*>(deviceInfo); 279 280 Status status; 281 hardware::Return<void> ret; 282 ret = deviceInfo3->mInterface->open(callback, [&status, &session] 283 (Status s, const sp<device::V3_2::ICameraDeviceSession>& cameraSession) { 284 status = s; 285 if (status == Status::OK) { 286 *session = cameraSession; 287 } 288 }); 289 if (!ret.isOk()) { 290 ALOGE("%s: Transaction error opening a session for camera device %s: %s", 291 __FUNCTION__, id.c_str(), ret.description().c_str()); 292 return DEAD_OBJECT; 293 } 294 return mapToStatusT(status); 295 } 296 297 status_t CameraProviderManager::openSession(const std::string &id, 298 const sp<hardware::camera::device::V1_0::ICameraDeviceCallback>& callback, 299 /*out*/ 300 sp<hardware::camera::device::V1_0::ICameraDevice> *session) { 301 302 std::lock_guard<std::mutex> lock(mInterfaceMutex); 303 304 auto deviceInfo = findDeviceInfoLocked(id, 305 /*minVersion*/ {1,0}, /*maxVersion*/ {2,0}); 306 if (deviceInfo == nullptr) return NAME_NOT_FOUND; 307 308 auto *deviceInfo1 = static_cast<ProviderInfo::DeviceInfo1*>(deviceInfo); 309 310 hardware::Return<Status> status = deviceInfo1->mInterface->open(callback); 311 if (!status.isOk()) { 312 ALOGE("%s: Transaction error opening a session for camera device %s: %s", 313 __FUNCTION__, id.c_str(), status.description().c_str()); 314 return DEAD_OBJECT; 315 } 316 if (status == Status::OK) { 317 *session = deviceInfo1->mInterface; 318 } 319 return mapToStatusT(status); 320 } 321 322 323 hardware::Return<void> CameraProviderManager::onRegistration( 324 const hardware::hidl_string& /*fqName*/, 325 const hardware::hidl_string& name, 326 bool /*preexisting*/) { 327 { 328 std::lock_guard<std::mutex> lock(mInterfaceMutex); 329 330 addProviderLocked(name); 331 } 332 333 sp<StatusListener> listener = getStatusListener(); 334 if (nullptr != listener.get()) { 335 listener->onNewProviderRegistered(); 336 } 337 338 return hardware::Return<void>(); 339 } 340 341 status_t CameraProviderManager::dump(int fd, const Vector<String16>& args) { 342 std::lock_guard<std::mutex> lock(mInterfaceMutex); 343 344 for (auto& provider : mProviders) { 345 provider->dump(fd, args); 346 } 347 return OK; 348 } 349 350 CameraProviderManager::ProviderInfo::DeviceInfo* CameraProviderManager::findDeviceInfoLocked( 351 const std::string& id, 352 hardware::hidl_version minVersion, hardware::hidl_version maxVersion) const { 353 for (auto& provider : mProviders) { 354 for (auto& deviceInfo : provider->mDevices) { 355 if (deviceInfo->mId == id && 356 minVersion <= deviceInfo->mVersion && maxVersion >= deviceInfo->mVersion) { 357 return deviceInfo.get(); 358 } 359 } 360 } 361 return nullptr; 362 } 363 364 metadata_vendor_id_t CameraProviderManager::getProviderTagIdLocked( 365 const std::string& id, hardware::hidl_version minVersion, 366 hardware::hidl_version maxVersion) const { 367 metadata_vendor_id_t ret = CAMERA_METADATA_INVALID_VENDOR_ID; 368 369 std::lock_guard<std::mutex> lock(mInterfaceMutex); 370 for (auto& provider : mProviders) { 371 for (auto& deviceInfo : provider->mDevices) { 372 if (deviceInfo->mId == id && 373 minVersion <= deviceInfo->mVersion && 374 maxVersion >= deviceInfo->mVersion) { 375 return provider->mProviderTagid; 376 } 377 } 378 } 379 380 return ret; 381 } 382 383 status_t CameraProviderManager::addProviderLocked(const std::string& newProvider, bool expected) { 384 for (const auto& providerInfo : mProviders) { 385 if (providerInfo->mProviderName == newProvider) { 386 ALOGW("%s: Camera provider HAL with name '%s' already registered", __FUNCTION__, 387 newProvider.c_str()); 388 return ALREADY_EXISTS; 389 } 390 } 391 392 sp<provider::V2_4::ICameraProvider> interface; 393 interface = mServiceProxy->getService(newProvider); 394 395 if (interface == nullptr) { 396 if (expected) { 397 ALOGE("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__, 398 newProvider.c_str()); 399 return BAD_VALUE; 400 } else { 401 return OK; 402 } 403 } 404 405 sp<ProviderInfo> providerInfo = 406 new ProviderInfo(newProvider, interface, this); 407 status_t res = providerInfo->initialize(); 408 if (res != OK) { 409 return res; 410 } 411 412 mProviders.push_back(providerInfo); 413 414 return OK; 415 } 416 417 status_t CameraProviderManager::removeProvider(const std::string& provider) { 418 std::unique_lock<std::mutex> lock(mInterfaceMutex); 419 std::vector<String8> removedDeviceIds; 420 status_t res = NAME_NOT_FOUND; 421 for (auto it = mProviders.begin(); it != mProviders.end(); it++) { 422 if ((*it)->mProviderName == provider) { 423 removedDeviceIds.reserve((*it)->mDevices.size()); 424 for (auto& deviceInfo : (*it)->mDevices) { 425 removedDeviceIds.push_back(String8(deviceInfo->mId.c_str())); 426 } 427 mProviders.erase(it); 428 res = OK; 429 break; 430 } 431 } 432 if (res != OK) { 433 ALOGW("%s: Camera provider HAL with name '%s' is not registered", __FUNCTION__, 434 provider.c_str()); 435 } else { 436 // Inform camera service of loss of presence for all the devices from this provider, 437 // without lock held for reentrancy 438 sp<StatusListener> listener = getStatusListener(); 439 if (listener != nullptr) { 440 lock.unlock(); 441 for (auto& id : removedDeviceIds) { 442 listener->onDeviceStatusChanged(id, CameraDeviceStatus::NOT_PRESENT); 443 } 444 } 445 } 446 return res; 447 } 448 449 sp<CameraProviderManager::StatusListener> CameraProviderManager::getStatusListener() const { 450 return mListener.promote(); 451 } 452 453 /**** Methods for ProviderInfo ****/ 454 455 456 CameraProviderManager::ProviderInfo::ProviderInfo( 457 const std::string &providerName, 458 sp<provider::V2_4::ICameraProvider>& interface, 459 CameraProviderManager *manager) : 460 mProviderName(providerName), 461 mInterface(interface), 462 mProviderTagid(generateVendorTagId(providerName)), 463 mUniqueDeviceCount(0), 464 mManager(manager) { 465 (void) mManager; 466 } 467 468 status_t CameraProviderManager::ProviderInfo::initialize() { 469 status_t res = parseProviderName(mProviderName, &mType, &mId); 470 if (res != OK) { 471 ALOGE("%s: Invalid provider name, ignoring", __FUNCTION__); 472 return BAD_VALUE; 473 } 474 ALOGI("Connecting to new camera provider: %s, isRemote? %d", 475 mProviderName.c_str(), mInterface->isRemote()); 476 hardware::Return<Status> status = mInterface->setCallback(this); 477 if (!status.isOk()) { 478 ALOGE("%s: Transaction error setting up callbacks with camera provider '%s': %s", 479 __FUNCTION__, mProviderName.c_str(), status.description().c_str()); 480 return DEAD_OBJECT; 481 } 482 if (status != Status::OK) { 483 ALOGE("%s: Unable to register callbacks with camera provider '%s'", 484 __FUNCTION__, mProviderName.c_str()); 485 return mapToStatusT(status); 486 } 487 488 hardware::Return<bool> linked = mInterface->linkToDeath(this, /*cookie*/ mId); 489 if (!linked.isOk()) { 490 ALOGE("%s: Transaction error in linking to camera provider '%s' death: %s", 491 __FUNCTION__, mProviderName.c_str(), linked.description().c_str()); 492 return DEAD_OBJECT; 493 } else if (!linked) { 494 ALOGW("%s: Unable to link to provider '%s' death notifications", 495 __FUNCTION__, mProviderName.c_str()); 496 } 497 498 // Get initial list of camera devices, if any 499 std::vector<std::string> devices; 500 hardware::Return<void> ret = mInterface->getCameraIdList([&status, &devices]( 501 Status idStatus, 502 const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames) { 503 status = idStatus; 504 if (status == Status::OK) { 505 for (size_t i = 0; i < cameraDeviceNames.size(); i++) { 506 devices.push_back(cameraDeviceNames[i]); 507 } 508 } }); 509 if (!ret.isOk()) { 510 ALOGE("%s: Transaction error in getting camera ID list from provider '%s': %s", 511 __FUNCTION__, mProviderName.c_str(), linked.description().c_str()); 512 return DEAD_OBJECT; 513 } 514 if (status != Status::OK) { 515 ALOGE("%s: Unable to query for camera devices from provider '%s'", 516 __FUNCTION__, mProviderName.c_str()); 517 return mapToStatusT(status); 518 } 519 520 sp<StatusListener> listener = mManager->getStatusListener(); 521 for (auto& device : devices) { 522 std::string id; 523 status_t res = addDevice(device, 524 hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT, &id); 525 if (res != OK) { 526 ALOGE("%s: Unable to enumerate camera device '%s': %s (%d)", 527 __FUNCTION__, device.c_str(), strerror(-res), res); 528 continue; 529 } 530 } 531 532 for (auto& device : mDevices) { 533 mUniqueCameraIds.insert(device->mId); 534 if (device->isAPI1Compatible()) { 535 mUniqueAPI1CompatibleCameraIds.insert(device->mId); 536 } 537 } 538 mUniqueDeviceCount = mUniqueCameraIds.size(); 539 540 ALOGI("Camera provider %s ready with %zu camera devices", 541 mProviderName.c_str(), mDevices.size()); 542 543 return OK; 544 } 545 546 const std::string& CameraProviderManager::ProviderInfo::getType() const { 547 return mType; 548 } 549 550 status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name, 551 CameraDeviceStatus initialStatus, /*out*/ std::string* parsedId) { 552 553 ALOGI("Enumerating new camera device: %s", name.c_str()); 554 555 uint16_t major, minor; 556 std::string type, id; 557 558 status_t res = parseDeviceName(name, &major, &minor, &type, &id); 559 if (res != OK) { 560 return res; 561 } 562 if (type != mType) { 563 ALOGE("%s: Device type %s does not match provider type %s", __FUNCTION__, 564 type.c_str(), mType.c_str()); 565 return BAD_VALUE; 566 } 567 if (mManager->isValidDeviceLocked(id, major)) { 568 ALOGE("%s: Device %s: ID %s is already in use for device major version %d", __FUNCTION__, 569 name.c_str(), id.c_str(), major); 570 return BAD_VALUE; 571 } 572 573 std::unique_ptr<DeviceInfo> deviceInfo; 574 switch (major) { 575 case 1: 576 deviceInfo = initializeDeviceInfo<DeviceInfo1>(name, mProviderTagid, 577 id, minor); 578 break; 579 case 3: 580 deviceInfo = initializeDeviceInfo<DeviceInfo3>(name, mProviderTagid, 581 id, minor); 582 break; 583 default: 584 ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__, 585 name.c_str(), major); 586 return BAD_VALUE; 587 } 588 if (deviceInfo == nullptr) return BAD_VALUE; 589 deviceInfo->mStatus = initialStatus; 590 591 mDevices.push_back(std::move(deviceInfo)); 592 593 if (parsedId != nullptr) { 594 *parsedId = id; 595 } 596 return OK; 597 } 598 599 status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const { 600 dprintf(fd, "== Camera Provider HAL %s (v2.4, %s) static info: %zu devices: ==\n", 601 mProviderName.c_str(), mInterface->isRemote() ? "remote" : "passthrough", 602 mDevices.size()); 603 604 for (auto& device : mDevices) { 605 dprintf(fd, "== Camera HAL device %s (v%d.%d) static information: ==\n", device->mName.c_str(), 606 device->mVersion.get_major(), device->mVersion.get_minor()); 607 dprintf(fd, " Resource cost: %d\n", device->mResourceCost.resourceCost); 608 if (device->mResourceCost.conflictingDevices.size() == 0) { 609 dprintf(fd, " Conflicting devices: None\n"); 610 } else { 611 dprintf(fd, " Conflicting devices:\n"); 612 for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) { 613 dprintf(fd, " %s\n", 614 device->mResourceCost.conflictingDevices[i].c_str()); 615 } 616 } 617 dprintf(fd, " API1 info:\n"); 618 dprintf(fd, " Has a flash unit: %s\n", 619 device->hasFlashUnit() ? "true" : "false"); 620 hardware::CameraInfo info; 621 status_t res = device->getCameraInfo(&info); 622 if (res != OK) { 623 dprintf(fd, " <Error reading camera info: %s (%d)>\n", 624 strerror(-res), res); 625 } else { 626 dprintf(fd, " Facing: %s\n", 627 info.facing == hardware::CAMERA_FACING_BACK ? "Back" : "Front"); 628 dprintf(fd, " Orientation: %d\n", info.orientation); 629 } 630 CameraMetadata info2; 631 res = device->getCameraCharacteristics(&info2); 632 if (res == INVALID_OPERATION) { 633 dprintf(fd, " API2 not directly supported\n"); 634 } else if (res != OK) { 635 dprintf(fd, " <Error reading camera characteristics: %s (%d)>\n", 636 strerror(-res), res); 637 } else { 638 dprintf(fd, " API2 camera characteristics:\n"); 639 info2.dump(fd, /*verbosity*/ 2, /*indentation*/ 4); 640 } 641 } 642 return OK; 643 } 644 645 hardware::Return<void> CameraProviderManager::ProviderInfo::cameraDeviceStatusChange( 646 const hardware::hidl_string& cameraDeviceName, 647 CameraDeviceStatus newStatus) { 648 sp<StatusListener> listener; 649 std::string id; 650 { 651 std::lock_guard<std::mutex> lock(mLock); 652 bool known = false; 653 for (auto& deviceInfo : mDevices) { 654 if (deviceInfo->mName == cameraDeviceName) { 655 ALOGI("Camera device %s status is now %s, was %s", cameraDeviceName.c_str(), 656 deviceStatusToString(newStatus), deviceStatusToString(deviceInfo->mStatus)); 657 deviceInfo->mStatus = newStatus; 658 // TODO: Handle device removal (NOT_PRESENT) 659 id = deviceInfo->mId; 660 known = true; 661 break; 662 } 663 } 664 // Previously unseen device; status must not be NOT_PRESENT 665 if (!known) { 666 if (newStatus == CameraDeviceStatus::NOT_PRESENT) { 667 ALOGW("Camera provider %s says an unknown camera device %s is not present. Curious.", 668 mProviderName.c_str(), cameraDeviceName.c_str()); 669 return hardware::Void(); 670 } 671 addDevice(cameraDeviceName, newStatus, &id); 672 } 673 listener = mManager->getStatusListener(); 674 } 675 // Call without lock held to allow reentrancy into provider manager 676 if (listener != nullptr) { 677 listener->onDeviceStatusChanged(String8(id.c_str()), newStatus); 678 } 679 return hardware::Void(); 680 } 681 682 hardware::Return<void> CameraProviderManager::ProviderInfo::torchModeStatusChange( 683 const hardware::hidl_string& cameraDeviceName, 684 TorchModeStatus newStatus) { 685 sp<StatusListener> listener; 686 std::string id; 687 { 688 std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex); 689 bool known = false; 690 for (auto& deviceInfo : mDevices) { 691 if (deviceInfo->mName == cameraDeviceName) { 692 ALOGI("Camera device %s torch status is now %s", cameraDeviceName.c_str(), 693 torchStatusToString(newStatus)); 694 id = deviceInfo->mId; 695 known = true; 696 break; 697 } 698 } 699 if (!known) { 700 ALOGW("Camera provider %s says an unknown camera %s now has torch status %d. Curious.", 701 mProviderName.c_str(), cameraDeviceName.c_str(), newStatus); 702 return hardware::Void(); 703 } 704 listener = mManager->getStatusListener(); 705 } 706 // Call without lock held to allow reentrancy into provider manager 707 if (listener != nullptr) { 708 listener->onTorchStatusChanged(String8(id.c_str()), newStatus); 709 } 710 return hardware::Void(); 711 } 712 713 void CameraProviderManager::ProviderInfo::serviceDied(uint64_t cookie, 714 const wp<hidl::base::V1_0::IBase>& who) { 715 (void) who; 716 ALOGI("Camera provider '%s' has died; removing it", mProviderName.c_str()); 717 if (cookie != mId) { 718 ALOGW("%s: Unexpected serviceDied cookie %" PRIu64 ", expected %" PRIu32, 719 __FUNCTION__, cookie, mId); 720 } 721 mManager->removeProvider(mProviderName); 722 } 723 724 template<class DeviceInfoT> 725 std::unique_ptr<CameraProviderManager::ProviderInfo::DeviceInfo> 726 CameraProviderManager::ProviderInfo::initializeDeviceInfo( 727 const std::string &name, const metadata_vendor_id_t tagId, 728 const std::string &id, uint16_t minorVersion) const { 729 Status status; 730 731 auto cameraInterface = 732 getDeviceInterface<typename DeviceInfoT::InterfaceT>(name); 733 if (cameraInterface == nullptr) return nullptr; 734 735 CameraResourceCost resourceCost; 736 cameraInterface->getResourceCost([&status, &resourceCost]( 737 Status s, CameraResourceCost cost) { 738 status = s; 739 resourceCost = cost; 740 }); 741 if (status != Status::OK) { 742 ALOGE("%s: Unable to obtain resource costs for camera device %s: %s", __FUNCTION__, 743 name.c_str(), statusToString(status)); 744 return nullptr; 745 } 746 return std::unique_ptr<DeviceInfo>( 747 new DeviceInfoT(name, tagId, id, minorVersion, resourceCost, 748 cameraInterface)); 749 } 750 751 template<class InterfaceT> 752 sp<InterfaceT> 753 CameraProviderManager::ProviderInfo::getDeviceInterface(const std::string &name) const { 754 ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__, 755 name.c_str(), InterfaceT::version.get_major()); 756 return nullptr; 757 } 758 759 template<> 760 sp<device::V1_0::ICameraDevice> 761 CameraProviderManager::ProviderInfo::getDeviceInterface 762 <device::V1_0::ICameraDevice>(const std::string &name) const { 763 Status status; 764 sp<device::V1_0::ICameraDevice> cameraInterface; 765 hardware::Return<void> ret; 766 ret = mInterface->getCameraDeviceInterface_V1_x(name, [&status, &cameraInterface]( 767 Status s, sp<device::V1_0::ICameraDevice> interface) { 768 status = s; 769 cameraInterface = interface; 770 }); 771 if (!ret.isOk()) { 772 ALOGE("%s: Transaction error trying to obtain interface for camera device %s: %s", 773 __FUNCTION__, name.c_str(), ret.description().c_str()); 774 return nullptr; 775 } 776 if (status != Status::OK) { 777 ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__, 778 name.c_str(), statusToString(status)); 779 return nullptr; 780 } 781 return cameraInterface; 782 } 783 784 template<> 785 sp<device::V3_2::ICameraDevice> 786 CameraProviderManager::ProviderInfo::getDeviceInterface 787 <device::V3_2::ICameraDevice>(const std::string &name) const { 788 Status status; 789 sp<device::V3_2::ICameraDevice> cameraInterface; 790 hardware::Return<void> ret; 791 ret = mInterface->getCameraDeviceInterface_V3_x(name, [&status, &cameraInterface]( 792 Status s, sp<device::V3_2::ICameraDevice> interface) { 793 status = s; 794 cameraInterface = interface; 795 }); 796 if (!ret.isOk()) { 797 ALOGE("%s: Transaction error trying to obtain interface for camera device %s: %s", 798 __FUNCTION__, name.c_str(), ret.description().c_str()); 799 return nullptr; 800 } 801 if (status != Status::OK) { 802 ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__, 803 name.c_str(), statusToString(status)); 804 return nullptr; 805 } 806 return cameraInterface; 807 } 808 809 CameraProviderManager::ProviderInfo::DeviceInfo::~DeviceInfo() {} 810 811 template<class InterfaceT> 812 status_t CameraProviderManager::ProviderInfo::DeviceInfo::setTorchMode(InterfaceT& interface, 813 bool enabled) { 814 Status s = interface->setTorchMode(enabled ? TorchMode::ON : TorchMode::OFF); 815 return mapToStatusT(s); 816 } 817 818 CameraProviderManager::ProviderInfo::DeviceInfo1::DeviceInfo1(const std::string& name, 819 const metadata_vendor_id_t tagId, const std::string &id, 820 uint16_t minorVersion, 821 const CameraResourceCost& resourceCost, 822 sp<InterfaceT> interface) : 823 DeviceInfo(name, tagId, id, hardware::hidl_version{1, minorVersion}, 824 resourceCost), 825 mInterface(interface) { 826 // Get default parameters and initialize flash unit availability 827 // Requires powering on the camera device 828 hardware::Return<Status> status = mInterface->open(nullptr); 829 if (!status.isOk()) { 830 ALOGE("%s: Transaction error opening camera device %s to check for a flash unit: %s", 831 __FUNCTION__, mId.c_str(), status.description().c_str()); 832 return; 833 } 834 if (status != Status::OK) { 835 ALOGE("%s: Unable to open camera device %s to check for a flash unit: %s", __FUNCTION__, 836 mId.c_str(), CameraProviderManager::statusToString(status)); 837 return; 838 } 839 hardware::Return<void> ret; 840 ret = mInterface->getParameters([this](const hardware::hidl_string& parms) { 841 mDefaultParameters.unflatten(String8(parms.c_str())); 842 }); 843 if (!ret.isOk()) { 844 ALOGE("%s: Transaction error reading camera device %s params to check for a flash unit: %s", 845 __FUNCTION__, mId.c_str(), status.description().c_str()); 846 return; 847 } 848 const char *flashMode = 849 mDefaultParameters.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES); 850 if (flashMode && strstr(flashMode, CameraParameters::FLASH_MODE_TORCH)) { 851 mHasFlashUnit = true; 852 } 853 854 ret = mInterface->close(); 855 if (!ret.isOk()) { 856 ALOGE("%s: Transaction error closing camera device %s after check for a flash unit: %s", 857 __FUNCTION__, mId.c_str(), status.description().c_str()); 858 } 859 } 860 861 CameraProviderManager::ProviderInfo::DeviceInfo1::~DeviceInfo1() {} 862 863 status_t CameraProviderManager::ProviderInfo::DeviceInfo1::setTorchMode(bool enabled) { 864 return DeviceInfo::setTorchMode(mInterface, enabled); 865 } 866 867 status_t CameraProviderManager::ProviderInfo::DeviceInfo1::getCameraInfo( 868 hardware::CameraInfo *info) const { 869 if (info == nullptr) return BAD_VALUE; 870 871 Status status; 872 device::V1_0::CameraInfo cInfo; 873 hardware::Return<void> ret; 874 ret = mInterface->getCameraInfo([&status, &cInfo](Status s, device::V1_0::CameraInfo camInfo) { 875 status = s; 876 cInfo = camInfo; 877 }); 878 if (!ret.isOk()) { 879 ALOGE("%s: Transaction error reading camera info from device %s: %s", 880 __FUNCTION__, mId.c_str(), ret.description().c_str()); 881 return DEAD_OBJECT; 882 } 883 if (status != Status::OK) { 884 return mapToStatusT(status); 885 } 886 887 switch(cInfo.facing) { 888 case device::V1_0::CameraFacing::BACK: 889 info->facing = hardware::CAMERA_FACING_BACK; 890 break; 891 case device::V1_0::CameraFacing::EXTERNAL: 892 // Map external to front for legacy API 893 case device::V1_0::CameraFacing::FRONT: 894 info->facing = hardware::CAMERA_FACING_FRONT; 895 break; 896 default: 897 ALOGW("%s: Device %s: Unknown camera facing: %d", 898 __FUNCTION__, mId.c_str(), cInfo.facing); 899 info->facing = hardware::CAMERA_FACING_BACK; 900 } 901 info->orientation = cInfo.orientation; 902 903 return OK; 904 } 905 906 CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string& name, 907 const metadata_vendor_id_t tagId, const std::string &id, 908 uint16_t minorVersion, 909 const CameraResourceCost& resourceCost, 910 sp<InterfaceT> interface) : 911 DeviceInfo(name, tagId, id, hardware::hidl_version{3, minorVersion}, 912 resourceCost), 913 mInterface(interface) { 914 // Get camera characteristics and initialize flash unit availability 915 Status status; 916 hardware::Return<void> ret; 917 ret = mInterface->getCameraCharacteristics([&status, this](Status s, 918 device::V3_2::CameraMetadata metadata) { 919 status = s; 920 if (s == Status::OK) { 921 camera_metadata_t *buffer = 922 reinterpret_cast<camera_metadata_t*>(metadata.data()); 923 size_t expectedSize = metadata.size(); 924 int res = validate_camera_metadata_structure(buffer, &expectedSize); 925 if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) { 926 set_camera_metadata_vendor_id(buffer, mProviderTagid); 927 mCameraCharacteristics = buffer; 928 } else { 929 ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__); 930 status = Status::INTERNAL_ERROR; 931 } 932 } 933 }); 934 if (!ret.isOk()) { 935 ALOGE("%s: Transaction error getting camera characteristics for device %s" 936 " to check for a flash unit: %s", __FUNCTION__, mId.c_str(), 937 ret.description().c_str()); 938 return; 939 } 940 if (status != Status::OK) { 941 ALOGE("%s: Unable to get camera characteristics for device %s: %s (%d)", 942 __FUNCTION__, mId.c_str(), CameraProviderManager::statusToString(status), status); 943 return; 944 } 945 camera_metadata_entry flashAvailable = 946 mCameraCharacteristics.find(ANDROID_FLASH_INFO_AVAILABLE); 947 if (flashAvailable.count == 1 && 948 flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE) { 949 mHasFlashUnit = true; 950 } else { 951 mHasFlashUnit = false; 952 } 953 } 954 955 CameraProviderManager::ProviderInfo::DeviceInfo3::~DeviceInfo3() {} 956 957 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::setTorchMode(bool enabled) { 958 return DeviceInfo::setTorchMode(mInterface, enabled); 959 } 960 961 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraInfo( 962 hardware::CameraInfo *info) const { 963 if (info == nullptr) return BAD_VALUE; 964 965 camera_metadata_ro_entry facing = 966 mCameraCharacteristics.find(ANDROID_LENS_FACING); 967 if (facing.count == 1) { 968 switch (facing.data.u8[0]) { 969 case ANDROID_LENS_FACING_BACK: 970 info->facing = hardware::CAMERA_FACING_BACK; 971 break; 972 case ANDROID_LENS_FACING_EXTERNAL: 973 // Map external to front for legacy API 974 case ANDROID_LENS_FACING_FRONT: 975 info->facing = hardware::CAMERA_FACING_FRONT; 976 break; 977 } 978 } else { 979 ALOGE("%s: Unable to find android.lens.facing static metadata", __FUNCTION__); 980 return NAME_NOT_FOUND; 981 } 982 983 camera_metadata_ro_entry orientation = 984 mCameraCharacteristics.find(ANDROID_SENSOR_ORIENTATION); 985 if (orientation.count == 1) { 986 info->orientation = orientation.data.i32[0]; 987 } else { 988 ALOGE("%s: Unable to find android.sensor.orientation static metadata", __FUNCTION__); 989 return NAME_NOT_FOUND; 990 } 991 992 return OK; 993 } 994 bool CameraProviderManager::ProviderInfo::DeviceInfo3::isAPI1Compatible() const { 995 bool isBackwardCompatible = false; 996 camera_metadata_ro_entry_t caps = mCameraCharacteristics.find( 997 ANDROID_REQUEST_AVAILABLE_CAPABILITIES); 998 for (size_t i = 0; i < caps.count; i++) { 999 if (caps.data.u8[i] == 1000 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) { 1001 isBackwardCompatible = true; 1002 break; 1003 } 1004 } 1005 1006 return isBackwardCompatible; 1007 } 1008 1009 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraCharacteristics( 1010 CameraMetadata *characteristics) const { 1011 if (characteristics == nullptr) return BAD_VALUE; 1012 1013 *characteristics = mCameraCharacteristics; 1014 return OK; 1015 } 1016 1017 status_t CameraProviderManager::ProviderInfo::parseProviderName(const std::string& name, 1018 std::string *type, uint32_t *id) { 1019 // Format must be "<type>/<id>" 1020 #define ERROR_MSG_PREFIX "%s: Invalid provider name '%s'. " \ 1021 "Should match '<type>/<id>' - " 1022 1023 if (!type || !id) return INVALID_OPERATION; 1024 1025 std::string::size_type slashIdx = name.find('/'); 1026 if (slashIdx == std::string::npos || slashIdx == name.size() - 1) { 1027 ALOGE(ERROR_MSG_PREFIX 1028 "does not have / separator between type and id", 1029 __FUNCTION__, name.c_str()); 1030 return BAD_VALUE; 1031 } 1032 1033 std::string typeVal = name.substr(0, slashIdx); 1034 1035 char *endPtr; 1036 errno = 0; 1037 long idVal = strtol(name.c_str() + slashIdx + 1, &endPtr, 10); 1038 if (errno != 0) { 1039 ALOGE(ERROR_MSG_PREFIX 1040 "cannot parse provider id as an integer: %s (%d)", 1041 __FUNCTION__, name.c_str(), strerror(errno), errno); 1042 return BAD_VALUE; 1043 } 1044 if (endPtr != name.c_str() + name.size()) { 1045 ALOGE(ERROR_MSG_PREFIX 1046 "provider id has unexpected length", 1047 __FUNCTION__, name.c_str()); 1048 return BAD_VALUE; 1049 } 1050 if (idVal < 0) { 1051 ALOGE(ERROR_MSG_PREFIX 1052 "id is negative: %ld", 1053 __FUNCTION__, name.c_str(), idVal); 1054 return BAD_VALUE; 1055 } 1056 1057 #undef ERROR_MSG_PREFIX 1058 1059 *type = typeVal; 1060 *id = static_cast<uint32_t>(idVal); 1061 1062 return OK; 1063 } 1064 1065 metadata_vendor_id_t CameraProviderManager::ProviderInfo::generateVendorTagId( 1066 const std::string &name) { 1067 metadata_vendor_id_t ret = std::hash<std::string> {} (name); 1068 // CAMERA_METADATA_INVALID_VENDOR_ID is not a valid hash value 1069 if (CAMERA_METADATA_INVALID_VENDOR_ID == ret) { 1070 ret = 0; 1071 } 1072 1073 return ret; 1074 } 1075 1076 status_t CameraProviderManager::ProviderInfo::parseDeviceName(const std::string& name, 1077 uint16_t *major, uint16_t *minor, std::string *type, std::string *id) { 1078 1079 // Format must be "device@<major>.<minor>/<type>/<id>" 1080 1081 #define ERROR_MSG_PREFIX "%s: Invalid device name '%s'. " \ 1082 "Should match 'device@<major>.<minor>/<type>/<id>' - " 1083 1084 if (!major || !minor || !type || !id) return INVALID_OPERATION; 1085 1086 // Verify starting prefix 1087 const char expectedPrefix[] = "device@"; 1088 1089 if (name.find(expectedPrefix) != 0) { 1090 ALOGE(ERROR_MSG_PREFIX 1091 "does not start with '%s'", 1092 __FUNCTION__, name.c_str(), expectedPrefix); 1093 return BAD_VALUE; 1094 } 1095 1096 // Extract major/minor versions 1097 constexpr std::string::size_type atIdx = sizeof(expectedPrefix) - 2; 1098 std::string::size_type dotIdx = name.find('.', atIdx); 1099 if (dotIdx == std::string::npos) { 1100 ALOGE(ERROR_MSG_PREFIX 1101 "does not have @<major>. version section", 1102 __FUNCTION__, name.c_str()); 1103 return BAD_VALUE; 1104 } 1105 std::string::size_type typeSlashIdx = name.find('/', dotIdx); 1106 if (typeSlashIdx == std::string::npos) { 1107 ALOGE(ERROR_MSG_PREFIX 1108 "does not have .<minor>/ version section", 1109 __FUNCTION__, name.c_str()); 1110 return BAD_VALUE; 1111 } 1112 1113 char *endPtr; 1114 errno = 0; 1115 long majorVal = strtol(name.c_str() + atIdx + 1, &endPtr, 10); 1116 if (errno != 0) { 1117 ALOGE(ERROR_MSG_PREFIX 1118 "cannot parse major version: %s (%d)", 1119 __FUNCTION__, name.c_str(), strerror(errno), errno); 1120 return BAD_VALUE; 1121 } 1122 if (endPtr != name.c_str() + dotIdx) { 1123 ALOGE(ERROR_MSG_PREFIX 1124 "major version has unexpected length", 1125 __FUNCTION__, name.c_str()); 1126 return BAD_VALUE; 1127 } 1128 long minorVal = strtol(name.c_str() + dotIdx + 1, &endPtr, 10); 1129 if (errno != 0) { 1130 ALOGE(ERROR_MSG_PREFIX 1131 "cannot parse minor version: %s (%d)", 1132 __FUNCTION__, name.c_str(), strerror(errno), errno); 1133 return BAD_VALUE; 1134 } 1135 if (endPtr != name.c_str() + typeSlashIdx) { 1136 ALOGE(ERROR_MSG_PREFIX 1137 "minor version has unexpected length", 1138 __FUNCTION__, name.c_str()); 1139 return BAD_VALUE; 1140 } 1141 if (majorVal < 0 || majorVal > UINT16_MAX || minorVal < 0 || minorVal > UINT16_MAX) { 1142 ALOGE(ERROR_MSG_PREFIX 1143 "major/minor version is out of range of uint16_t: %ld.%ld", 1144 __FUNCTION__, name.c_str(), majorVal, minorVal); 1145 return BAD_VALUE; 1146 } 1147 1148 // Extract type and id 1149 1150 std::string::size_type instanceSlashIdx = name.find('/', typeSlashIdx + 1); 1151 if (instanceSlashIdx == std::string::npos) { 1152 ALOGE(ERROR_MSG_PREFIX 1153 "does not have /<type>/ component", 1154 __FUNCTION__, name.c_str()); 1155 return BAD_VALUE; 1156 } 1157 std::string typeVal = name.substr(typeSlashIdx + 1, instanceSlashIdx - typeSlashIdx - 1); 1158 1159 if (instanceSlashIdx == name.size() - 1) { 1160 ALOGE(ERROR_MSG_PREFIX 1161 "does not have an /<id> component", 1162 __FUNCTION__, name.c_str()); 1163 return BAD_VALUE; 1164 } 1165 std::string idVal = name.substr(instanceSlashIdx + 1); 1166 1167 #undef ERROR_MSG_PREFIX 1168 1169 *major = static_cast<uint16_t>(majorVal); 1170 *minor = static_cast<uint16_t>(minorVal); 1171 *type = typeVal; 1172 *id = idVal; 1173 1174 return OK; 1175 } 1176 1177 1178 1179 CameraProviderManager::ProviderInfo::~ProviderInfo() { 1180 // Destruction of ProviderInfo is only supposed to happen when the respective 1181 // CameraProvider interface dies, so do not unregister callbacks. 1182 1183 } 1184 1185 status_t CameraProviderManager::mapToStatusT(const Status& s) { 1186 switch(s) { 1187 case Status::OK: 1188 return OK; 1189 case Status::ILLEGAL_ARGUMENT: 1190 return BAD_VALUE; 1191 case Status::CAMERA_IN_USE: 1192 return -EBUSY; 1193 case Status::MAX_CAMERAS_IN_USE: 1194 return -EUSERS; 1195 case Status::METHOD_NOT_SUPPORTED: 1196 return UNKNOWN_TRANSACTION; 1197 case Status::OPERATION_NOT_SUPPORTED: 1198 return INVALID_OPERATION; 1199 case Status::CAMERA_DISCONNECTED: 1200 return DEAD_OBJECT; 1201 case Status::INTERNAL_ERROR: 1202 return INVALID_OPERATION; 1203 } 1204 ALOGW("Unexpected HAL status code %d", s); 1205 return INVALID_OPERATION; 1206 } 1207 1208 const char* CameraProviderManager::statusToString(const Status& s) { 1209 switch(s) { 1210 case Status::OK: 1211 return "OK"; 1212 case Status::ILLEGAL_ARGUMENT: 1213 return "ILLEGAL_ARGUMENT"; 1214 case Status::CAMERA_IN_USE: 1215 return "CAMERA_IN_USE"; 1216 case Status::MAX_CAMERAS_IN_USE: 1217 return "MAX_CAMERAS_IN_USE"; 1218 case Status::METHOD_NOT_SUPPORTED: 1219 return "METHOD_NOT_SUPPORTED"; 1220 case Status::OPERATION_NOT_SUPPORTED: 1221 return "OPERATION_NOT_SUPPORTED"; 1222 case Status::CAMERA_DISCONNECTED: 1223 return "CAMERA_DISCONNECTED"; 1224 case Status::INTERNAL_ERROR: 1225 return "INTERNAL_ERROR"; 1226 } 1227 ALOGW("Unexpected HAL status code %d", s); 1228 return "UNKNOWN_ERROR"; 1229 } 1230 1231 const char* CameraProviderManager::deviceStatusToString(const CameraDeviceStatus& s) { 1232 switch(s) { 1233 case CameraDeviceStatus::NOT_PRESENT: 1234 return "NOT_PRESENT"; 1235 case CameraDeviceStatus::PRESENT: 1236 return "PRESENT"; 1237 case CameraDeviceStatus::ENUMERATING: 1238 return "ENUMERATING"; 1239 } 1240 ALOGW("Unexpected HAL device status code %d", s); 1241 return "UNKNOWN_STATUS"; 1242 } 1243 1244 const char* CameraProviderManager::torchStatusToString(const TorchModeStatus& s) { 1245 switch(s) { 1246 case TorchModeStatus::NOT_AVAILABLE: 1247 return "NOT_AVAILABLE"; 1248 case TorchModeStatus::AVAILABLE_OFF: 1249 return "AVAILABLE_OFF"; 1250 case TorchModeStatus::AVAILABLE_ON: 1251 return "AVAILABLE_ON"; 1252 } 1253 ALOGW("Unexpected HAL torch mode status code %d", s); 1254 return "UNKNOWN_STATUS"; 1255 } 1256 1257 1258 status_t HidlVendorTagDescriptor::createDescriptorFromHidl( 1259 const hardware::hidl_vec<hardware::camera::common::V1_0::VendorTagSection>& vts, 1260 /*out*/ 1261 sp<VendorTagDescriptor>& descriptor) { 1262 1263 int tagCount = 0; 1264 1265 for (size_t s = 0; s < vts.size(); s++) { 1266 tagCount += vts[s].tags.size(); 1267 } 1268 1269 if (tagCount < 0 || tagCount > INT32_MAX) { 1270 ALOGE("%s: tag count %d from vendor tag sections is invalid.", __FUNCTION__, tagCount); 1271 return BAD_VALUE; 1272 } 1273 1274 Vector<uint32_t> tagArray; 1275 LOG_ALWAYS_FATAL_IF(tagArray.resize(tagCount) != tagCount, 1276 "%s: too many (%u) vendor tags defined.", __FUNCTION__, tagCount); 1277 1278 1279 sp<HidlVendorTagDescriptor> desc = new HidlVendorTagDescriptor(); 1280 desc->mTagCount = tagCount; 1281 1282 SortedVector<String8> sections; 1283 KeyedVector<uint32_t, String8> tagToSectionMap; 1284 1285 int idx = 0; 1286 for (size_t s = 0; s < vts.size(); s++) { 1287 const hardware::camera::common::V1_0::VendorTagSection& section = vts[s]; 1288 const char *sectionName = section.sectionName.c_str(); 1289 if (sectionName == NULL) { 1290 ALOGE("%s: no section name defined for vendor tag section %zu.", __FUNCTION__, s); 1291 return BAD_VALUE; 1292 } 1293 String8 sectionString(sectionName); 1294 sections.add(sectionString); 1295 1296 for (size_t j = 0; j < section.tags.size(); j++) { 1297 uint32_t tag = section.tags[j].tagId; 1298 if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) { 1299 ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag); 1300 return BAD_VALUE; 1301 } 1302 1303 tagArray.editItemAt(idx++) = section.tags[j].tagId; 1304 1305 const char *tagName = section.tags[j].tagName.c_str(); 1306 if (tagName == NULL) { 1307 ALOGE("%s: no tag name defined for vendor tag %d.", __FUNCTION__, tag); 1308 return BAD_VALUE; 1309 } 1310 desc->mTagToNameMap.add(tag, String8(tagName)); 1311 tagToSectionMap.add(tag, sectionString); 1312 1313 int tagType = (int) section.tags[j].tagType; 1314 if (tagType < 0 || tagType >= NUM_TYPES) { 1315 ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType); 1316 return BAD_VALUE; 1317 } 1318 desc->mTagToTypeMap.add(tag, tagType); 1319 } 1320 } 1321 1322 desc->mSections = sections; 1323 1324 for (size_t i = 0; i < tagArray.size(); ++i) { 1325 uint32_t tag = tagArray[i]; 1326 String8 sectionString = tagToSectionMap.valueFor(tag); 1327 1328 // Set up tag to section index map 1329 ssize_t index = sections.indexOf(sectionString); 1330 LOG_ALWAYS_FATAL_IF(index < 0, "index %zd must be non-negative", index); 1331 desc->mTagToSectionMap.add(tag, static_cast<uint32_t>(index)); 1332 1333 // Set up reverse mapping 1334 ssize_t reverseIndex = -1; 1335 if ((reverseIndex = desc->mReverseMapping.indexOfKey(sectionString)) < 0) { 1336 KeyedVector<String8, uint32_t>* nameMapper = new KeyedVector<String8, uint32_t>(); 1337 reverseIndex = desc->mReverseMapping.add(sectionString, nameMapper); 1338 } 1339 desc->mReverseMapping[reverseIndex]->add(desc->mTagToNameMap.valueFor(tag), tag); 1340 } 1341 1342 descriptor = desc; 1343 return OK; 1344 } 1345 1346 1347 } // namespace android 1348