Merge "Camera: Cache logical camera related info"

gugelfrei
TreeHugger Robot 6 years ago committed by Android (Google) Code Review
commit 1e91e0ea18

@ -123,6 +123,7 @@ status_t CameraDeviceClient::initializeImpl(TProviderPtr providerPtr, const Stri
physicalKeysEntry.data.i32 + physicalKeysEntry.count); physicalKeysEntry.data.i32 + physicalKeysEntry.count);
} }
mProviderManager = providerPtr;
return OK; return OK;
} }
@ -627,12 +628,11 @@ binder::Status CameraDeviceClient::createStream(
if (physicalCameraId.size() > 0) { if (physicalCameraId.size() > 0) {
std::vector<std::string> physicalCameraIds; std::vector<std::string> physicalCameraIds;
std::string physicalId(physicalCameraId.string());
bool logicalCamera = bool logicalCamera =
CameraProviderManager::isLogicalCamera(mDevice->info(), &physicalCameraIds); mProviderManager->isLogicalCamera(mCameraIdStr.string(), &physicalCameraIds);
if (!logicalCamera || if (!logicalCamera ||
std::find(physicalCameraIds.begin(), physicalCameraIds.end(), physicalId) == std::find(physicalCameraIds.begin(), physicalCameraIds.end(),
physicalCameraIds.end()) { physicalCameraId.string()) == physicalCameraIds.end()) {
String8 msg = String8::format("Camera %s: Camera doesn't support physicalCameraId %s.", String8 msg = String8::format("Camera %s: Camera doesn't support physicalCameraId %s.",
mCameraIdStr.string(), physicalCameraId.string()); mCameraIdStr.string(), physicalCameraId.string());
ALOGE("%s: %s", __FUNCTION__, msg.string()); ALOGE("%s: %s", __FUNCTION__, msg.string());

@ -301,6 +301,7 @@ private:
std::unordered_map<int32_t, OutputStreamInfo> mStreamInfoMap; std::unordered_map<int32_t, OutputStreamInfo> mStreamInfoMap;
static const int32_t MAX_SURFACES_PER_STREAM = 2; static const int32_t MAX_SURFACES_PER_STREAM = 2;
sp<CameraProviderManager> mProviderManager;
}; };
}; // namespace android }; // namespace android

@ -396,35 +396,46 @@ metadata_vendor_id_t CameraProviderManager::getProviderTagIdLocked(
return ret; return ret;
} }
bool CameraProviderManager::isLogicalCamera(const CameraMetadata& staticInfo, void CameraProviderManager::ProviderInfo::DeviceInfo3::queryPhysicalCameraIds() {
std::vector<std::string>* physicalCameraIds) { camera_metadata_entry_t entryCap;
bool isLogicalCam = false;
camera_metadata_ro_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) { for (size_t i = 0; i < entryCap.count; ++i) {
uint8_t capability = entryCap.data.u8[i]; uint8_t capability = entryCap.data.u8[i];
if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) { if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) {
isLogicalCam = true; mIsLogicalCamera = true;
break; break;
} }
} }
if (!isLogicalCam) { if (!mIsLogicalCamera) {
return false; 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; const uint8_t* ids = entryIds.data.u8;
size_t start = 0; size_t start = 0;
for (size_t i = 0; i < entryIds.count; ++i) { for (size_t i = 0; i < entryIds.count; ++i) {
if (ids[i] == '\0') { if (ids[i] == '\0') {
if (start != i) { if (start != i) {
physicalCameraIds->push_back((const char*)ids+start); mPhysicalIds.push_back((const char*)ids+start);
} }
start = i+1; start = i+1;
} }
} }
return true; }
bool CameraProviderManager::isLogicalCamera(const std::string& id,
std::vector<std::string>* physicalCameraIds) {
std::lock_guard<std::mutex> 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) { bool CameraProviderManager::isHiddenPhysicalCamera(const std::string& cameraId) {
@ -449,9 +460,9 @@ bool CameraProviderManager::isHiddenPhysicalCamera(const std::string& cameraId)
} }
std::vector<std::string> physicalIds; std::vector<std::string> physicalIds;
if (isLogicalCamera(info, &physicalIds)) { if (deviceInfo->mIsLogicalCamera) {
if (std::find(physicalIds.begin(), physicalIds.end(), cameraId) != if (std::find(deviceInfo->mPhysicalIds.begin(), deviceInfo->mPhysicalIds.end(),
physicalIds.end()) { cameraId) != deviceInfo->mPhysicalIds.end()) {
int deviceVersion = HARDWARE_DEVICE_API_VERSION( int deviceVersion = HARDWARE_DEVICE_API_VERSION(
deviceInfo->mVersion.get_major(), deviceInfo->mVersion.get_minor()); deviceInfo->mVersion.get_major(), deviceInfo->mVersion.get_minor());
if (deviceVersion < CAMERA_DEVICE_API_VERSION_3_5) { if (deviceVersion < CAMERA_DEVICE_API_VERSION_3_5) {
@ -760,9 +771,8 @@ status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16
} }
// Dump characteristics of non-standalone physical camera // Dump characteristics of non-standalone physical camera
std::vector<std::string> physicalIds; if (device->mIsLogicalCamera) {
if (isLogicalCamera(info2, &physicalIds)) { for (auto& id : device->mPhysicalIds) {
for (auto& id : physicalIds) {
// Skip if physical id is an independent camera // Skip if physical id is an independent camera
if (std::find(mProviderPublicCameraIds.begin(), mProviderPublicCameraIds.end(), id) if (std::find(mProviderPublicCameraIds.begin(), mProviderPublicCameraIds.end(), id)
!= mProviderPublicCameraIds.end()) { != mProviderPublicCameraIds.end()) {
@ -1130,6 +1140,7 @@ CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string&
mHasFlashUnit = false; mHasFlashUnit = false;
} }
queryPhysicalCameraIds();
// Get physical camera characteristics if applicable // Get physical camera characteristics if applicable
auto castResult = device::V3_5::ICameraDevice::castFrom(mInterface); auto castResult = device::V3_5::ICameraDevice::castFrom(mInterface);
if (!castResult.isOk()) { if (!castResult.isOk()) {
@ -1142,9 +1153,8 @@ CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string&
return; return;
} }
std::vector<std::string> physicalIds; if (mIsLogicalCamera) {
if (CameraProviderManager::isLogicalCamera(mCameraCharacteristics, &physicalIds)) { for (auto& id : mPhysicalIds) {
for (auto& id : physicalIds) {
if (std::find(mPublicCameraIds.begin(), mPublicCameraIds.end(), id) != if (std::find(mPublicCameraIds.begin(), mPublicCameraIds.end(), id) !=
mPublicCameraIds.end()) { mPublicCameraIds.end()) {
continue; continue;
@ -1622,20 +1632,14 @@ void CameraProviderManager::filterLogicalCameraIdsLocked(
std::unordered_set<std::string> removedIds; std::unordered_set<std::string> removedIds;
for (auto& deviceId : deviceIds) { for (auto& deviceId : deviceIds) {
CameraMetadata info; auto deviceInfo = findDeviceInfoLocked(deviceId);
status_t res = getCameraCharacteristicsLocked(deviceId, &info); if (deviceInfo == nullptr) continue;
if (res != OK) {
ALOGE("%s: Failed to getCameraCharacteristics for id %s", __FUNCTION__,
deviceId.c_str());
return;
}
// idCombo contains the ids of a logical camera and its physical cameras if (!deviceInfo->mIsLogicalCamera) {
std::vector<std::string> idCombo;
bool logicalCamera = isLogicalCamera(info, &idCombo);
if (!logicalCamera) {
continue; continue;
} }
// idCombo contains the ids of a logical camera and its physical cameras
std::vector<std::string> idCombo = deviceInfo->mPhysicalIds;
idCombo.push_back(deviceId); idCombo.push_back(deviceId);
for (auto& id : deviceIds) { for (auto& id : deviceIds) {

@ -231,11 +231,10 @@ public:
hardware::hidl_version maxVersion = hardware::hidl_version{1000,0}) const; 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. * the physical camera ids.
*/ */
static bool isLogicalCamera(const CameraMetadata& staticInfo, bool isLogicalCamera(const std::string& id, std::vector<std::string>* physicalCameraIds);
std::vector<std::string>* physicalCameraIds);
bool isHiddenPhysicalCamera(const std::string& cameraId); bool isHiddenPhysicalCamera(const std::string& cameraId);
private: private:
@ -293,6 +292,8 @@ private:
const std::string mId; // ID section of full name const std::string mId; // ID section of full name
const hardware::hidl_version mVersion; const hardware::hidl_version mVersion;
const metadata_vendor_id_t mProviderTagid; const metadata_vendor_id_t mProviderTagid;
bool mIsLogicalCamera;
std::vector<std::string> mPhysicalIds;
const hardware::camera::common::V1_0::CameraResourceCost mResourceCost; const hardware::camera::common::V1_0::CameraResourceCost mResourceCost;
@ -319,7 +320,7 @@ private:
const std::vector<std::string>& publicCameraIds, const std::vector<std::string>& publicCameraIds,
const hardware::camera::common::V1_0::CameraResourceCost& resourceCost) : const hardware::camera::common::V1_0::CameraResourceCost& resourceCost) :
mName(name), mId(id), mVersion(version), mProviderTagid(tagId), mName(name), mId(id), mVersion(version), mProviderTagid(tagId),
mResourceCost(resourceCost), mIsLogicalCamera(false), mResourceCost(resourceCost),
mStatus(hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT), mStatus(hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT),
mHasFlashUnit(false), mPublicCameraIds(publicCameraIds) {} mHasFlashUnit(false), mPublicCameraIds(publicCameraIds) {}
virtual ~DeviceInfo(); virtual ~DeviceInfo();
@ -383,6 +384,7 @@ private:
private: private:
CameraMetadata mCameraCharacteristics; CameraMetadata mCameraCharacteristics;
std::unordered_map<std::string, CameraMetadata> mPhysicalCameraCharacteristics; std::unordered_map<std::string, CameraMetadata> mPhysicalCameraCharacteristics;
void queryPhysicalCameraIds();
}; };
private: private:

@ -128,7 +128,7 @@ status_t Camera3Device::initialize(sp<CameraProviderManager> manager, const Stri
} }
std::vector<std::string> physicalCameraIds; std::vector<std::string> physicalCameraIds;
bool isLogical = CameraProviderManager::isLogicalCamera(mDeviceInfo, &physicalCameraIds); bool isLogical = manager->isLogicalCamera(mId.string(), &physicalCameraIds);
if (isLogical) { if (isLogical) {
for (auto& physicalId : physicalCameraIds) { for (auto& physicalId : physicalCameraIds) {
res = manager->getCameraCharacteristics(physicalId, &mPhysicalDeviceInfoMap[physicalId]); res = manager->getCameraCharacteristics(physicalId, &mPhysicalDeviceInfoMap[physicalId]);

Loading…
Cancel
Save