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);
}
mProviderManager = providerPtr;
return OK;
}
@ -627,12 +628,11 @@ binder::Status CameraDeviceClient::createStream(
if (physicalCameraId.size() > 0) {
std::vector<std::string> 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());

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

@ -396,35 +396,46 @@ metadata_vendor_id_t CameraProviderManager::getProviderTagIdLocked(
return ret;
}
bool CameraProviderManager::isLogicalCamera(const CameraMetadata& staticInfo,
std::vector<std::string>* 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<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) {
@ -449,9 +460,9 @@ bool CameraProviderManager::isHiddenPhysicalCamera(const std::string& cameraId)
}
std::vector<std::string> 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<String16
}
// Dump characteristics of non-standalone physical camera
std::vector<std::string> 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<std::string> 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<std::string> 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<std::string> 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<std::string> idCombo = deviceInfo->mPhysicalIds;
idCombo.push_back(deviceId);
for (auto& id : deviceIds) {

@ -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<std::string>* physicalCameraIds);
bool isLogicalCamera(const std::string& id, std::vector<std::string>* 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<std::string> mPhysicalIds;
const hardware::camera::common::V1_0::CameraResourceCost mResourceCost;
@ -319,7 +320,7 @@ private:
const std::vector<std::string>& 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<std::string, CameraMetadata> mPhysicalCameraCharacteristics;
void queryPhysicalCameraIds();
};
private:

@ -128,7 +128,7 @@ status_t Camera3Device::initialize(sp<CameraProviderManager> manager, const Stri
}
std::vector<std::string> 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]);

Loading…
Cancel
Save