diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp index 84428c2460..b9e07f3341 100644 --- a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp +++ b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp @@ -122,6 +122,7 @@ status_t CameraDeviceClient::initializeImpl(TProviderPtr providerPtr, const Stri physicalKeysEntry.data.i32 + physicalKeysEntry.count); } + mProviderManager = providerPtr; return OK; } @@ -626,12 +627,11 @@ binder::Status CameraDeviceClient::createStream( if (physicalCameraId.size() > 0) { std::vector physicalCameraIds; - std::string physicalId(physicalCameraId.string()); bool logicalCamera = - CameraProviderManager::isLogicalCamera(mDevice->info(), &physicalCameraIds); + mProviderManager->isLogicalCamera(mCameraIdStr.string(), &physicalCameraIds); if (!logicalCamera || - std::find(physicalCameraIds.begin(), physicalCameraIds.end(), physicalId) == - physicalCameraIds.end()) { + std::find(physicalCameraIds.begin(), physicalCameraIds.end(), + physicalCameraId.string()) == physicalCameraIds.end()) { String8 msg = String8::format("Camera %s: Camera doesn't support physicalCameraId %s.", mCameraIdStr.string(), physicalCameraId.string()); ALOGE("%s: %s", __FUNCTION__, msg.string()); diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.h b/services/camera/libcameraservice/api2/CameraDeviceClient.h index c30561d488..09ce977774 100644 --- a/services/camera/libcameraservice/api2/CameraDeviceClient.h +++ b/services/camera/libcameraservice/api2/CameraDeviceClient.h @@ -301,6 +301,7 @@ private: std::unordered_map mStreamInfoMap; static const int32_t MAX_SURFACES_PER_STREAM = 2; + sp mProviderManager; }; }; // namespace android diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp index c4944a67a5..a94e8865d1 100644 --- a/services/camera/libcameraservice/common/CameraProviderManager.cpp +++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp @@ -396,35 +396,46 @@ metadata_vendor_id_t CameraProviderManager::getProviderTagIdLocked( return ret; } -bool CameraProviderManager::isLogicalCamera(const CameraMetadata& staticInfo, - std::vector* physicalCameraIds) { - bool isLogicalCam = false; - camera_metadata_ro_entry_t entryCap; +void CameraProviderManager::ProviderInfo::DeviceInfo3::queryPhysicalCameraIds() { + camera_metadata_entry_t entryCap; - entryCap = staticInfo.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); + entryCap = mCameraCharacteristics.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); for (size_t i = 0; i < entryCap.count; ++i) { uint8_t capability = entryCap.data.u8[i]; if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) { - isLogicalCam = true; + mIsLogicalCamera = true; break; } } - if (!isLogicalCam) { - return false; + if (!mIsLogicalCamera) { + return; } - camera_metadata_ro_entry_t entryIds = staticInfo.find(ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS); + camera_metadata_entry_t entryIds = mCameraCharacteristics.find( + ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS); const uint8_t* ids = entryIds.data.u8; size_t start = 0; for (size_t i = 0; i < entryIds.count; ++i) { if (ids[i] == '\0') { if (start != i) { - physicalCameraIds->push_back((const char*)ids+start); + mPhysicalIds.push_back((const char*)ids+start); } start = i+1; } } - return true; +} + +bool CameraProviderManager::isLogicalCamera(const std::string& id, + std::vector* physicalCameraIds) { + std::lock_guard lock(mInterfaceMutex); + + auto deviceInfo = findDeviceInfoLocked(id); + if (deviceInfo == nullptr) return false; + + if (deviceInfo->mIsLogicalCamera && physicalCameraIds != nullptr) { + *physicalCameraIds = deviceInfo->mPhysicalIds; + } + return deviceInfo->mIsLogicalCamera; } bool CameraProviderManager::isHiddenPhysicalCamera(const std::string& cameraId) { @@ -449,9 +460,9 @@ bool CameraProviderManager::isHiddenPhysicalCamera(const std::string& cameraId) } std::vector physicalIds; - if (isLogicalCamera(info, &physicalIds)) { - if (std::find(physicalIds.begin(), physicalIds.end(), cameraId) != - physicalIds.end()) { + if (deviceInfo->mIsLogicalCamera) { + if (std::find(deviceInfo->mPhysicalIds.begin(), deviceInfo->mPhysicalIds.end(), + cameraId) != deviceInfo->mPhysicalIds.end()) { int deviceVersion = HARDWARE_DEVICE_API_VERSION( deviceInfo->mVersion.get_major(), deviceInfo->mVersion.get_minor()); if (deviceVersion < CAMERA_DEVICE_API_VERSION_3_5) { @@ -760,9 +771,8 @@ status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector physicalIds; - if (isLogicalCamera(info2, &physicalIds)) { - for (auto& id : physicalIds) { + if (device->mIsLogicalCamera) { + for (auto& id : device->mPhysicalIds) { // Skip if physical id is an independent camera if (std::find(mProviderPublicCameraIds.begin(), mProviderPublicCameraIds.end(), id) != mProviderPublicCameraIds.end()) { @@ -1130,6 +1140,7 @@ CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string& mHasFlashUnit = false; } + queryPhysicalCameraIds(); // Get physical camera characteristics if applicable auto castResult = device::V3_5::ICameraDevice::castFrom(mInterface); if (!castResult.isOk()) { @@ -1142,9 +1153,8 @@ CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string& return; } - std::vector physicalIds; - if (CameraProviderManager::isLogicalCamera(mCameraCharacteristics, &physicalIds)) { - for (auto& id : physicalIds) { + if (mIsLogicalCamera) { + for (auto& id : mPhysicalIds) { if (std::find(mPublicCameraIds.begin(), mPublicCameraIds.end(), id) != mPublicCameraIds.end()) { continue; @@ -1622,20 +1632,14 @@ void CameraProviderManager::filterLogicalCameraIdsLocked( std::unordered_set removedIds; for (auto& deviceId : deviceIds) { - CameraMetadata info; - status_t res = getCameraCharacteristicsLocked(deviceId, &info); - if (res != OK) { - ALOGE("%s: Failed to getCameraCharacteristics for id %s", __FUNCTION__, - deviceId.c_str()); - return; - } + auto deviceInfo = findDeviceInfoLocked(deviceId); + if (deviceInfo == nullptr) continue; - // idCombo contains the ids of a logical camera and its physical cameras - std::vector idCombo; - bool logicalCamera = isLogicalCamera(info, &idCombo); - if (!logicalCamera) { + if (!deviceInfo->mIsLogicalCamera) { continue; } + // idCombo contains the ids of a logical camera and its physical cameras + std::vector idCombo = deviceInfo->mPhysicalIds; idCombo.push_back(deviceId); for (auto& id : deviceIds) { diff --git a/services/camera/libcameraservice/common/CameraProviderManager.h b/services/camera/libcameraservice/common/CameraProviderManager.h index 61e21b4a18..9016747270 100644 --- a/services/camera/libcameraservice/common/CameraProviderManager.h +++ b/services/camera/libcameraservice/common/CameraProviderManager.h @@ -231,11 +231,10 @@ public: hardware::hidl_version maxVersion = hardware::hidl_version{1000,0}) const; /* - * Check if a camera with staticInfo is a logical camera. And if yes, return + * Check if a camera is a logical camera. And if yes, return * the physical camera ids. */ - static bool isLogicalCamera(const CameraMetadata& staticInfo, - std::vector* physicalCameraIds); + bool isLogicalCamera(const std::string& id, std::vector* physicalCameraIds); bool isHiddenPhysicalCamera(const std::string& cameraId); private: @@ -293,6 +292,8 @@ private: const std::string mId; // ID section of full name const hardware::hidl_version mVersion; const metadata_vendor_id_t mProviderTagid; + bool mIsLogicalCamera; + std::vector mPhysicalIds; const hardware::camera::common::V1_0::CameraResourceCost mResourceCost; @@ -319,7 +320,7 @@ private: const std::vector& publicCameraIds, const hardware::camera::common::V1_0::CameraResourceCost& resourceCost) : mName(name), mId(id), mVersion(version), mProviderTagid(tagId), - mResourceCost(resourceCost), + mIsLogicalCamera(false), mResourceCost(resourceCost), mStatus(hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT), mHasFlashUnit(false), mPublicCameraIds(publicCameraIds) {} virtual ~DeviceInfo(); @@ -383,6 +384,7 @@ private: private: CameraMetadata mCameraCharacteristics; std::unordered_map mPhysicalCameraCharacteristics; + void queryPhysicalCameraIds(); }; private: diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 1bc5d33ca7..664e7dc24a 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -127,7 +127,7 @@ status_t Camera3Device::initialize(sp manager, const Stri } std::vector physicalCameraIds; - bool isLogical = CameraProviderManager::isLogicalCamera(mDeviceInfo, &physicalCameraIds); + bool isLogical = manager->isLogicalCamera(mId.string(), &physicalCameraIds); if (isLogical) { for (auto& physicalId : physicalCameraIds) { res = manager->getCameraCharacteristics(physicalId, &mPhysicalDeviceInfoMap[physicalId]);