|
|
|
@ -1352,29 +1352,9 @@ status_t CameraProviderManager::ProviderInfo::initialize(
|
|
|
|
|
|
|
|
|
|
// Get list of concurrent streaming camera device combinations
|
|
|
|
|
if (mMinorVersion >= 6) {
|
|
|
|
|
hardware::Return<void> ret = interface2_6->getConcurrentStreamingCameraIds([&status, this](
|
|
|
|
|
Status concurrentIdStatus, // TODO: Move all instances of hidl_string to 'using'
|
|
|
|
|
const hardware::hidl_vec<hardware::hidl_vec<hardware::hidl_string>>&
|
|
|
|
|
cameraDeviceIdCombinations) {
|
|
|
|
|
status = concurrentIdStatus;
|
|
|
|
|
if (status == Status::OK) {
|
|
|
|
|
for (auto& combination : cameraDeviceIdCombinations) {
|
|
|
|
|
std::unordered_set<std::string> deviceIds;
|
|
|
|
|
for (auto &cameraDeviceId : combination) {
|
|
|
|
|
deviceIds.insert(cameraDeviceId.c_str());
|
|
|
|
|
}
|
|
|
|
|
mConcurrentCameraIdCombinations.push_back(std::move(deviceIds));
|
|
|
|
|
}
|
|
|
|
|
} });
|
|
|
|
|
if (!ret.isOk()) {
|
|
|
|
|
ALOGE("%s: Transaction error in getting camera ID list from provider '%s': %s",
|
|
|
|
|
__FUNCTION__, mProviderName.c_str(), linked.description().c_str());
|
|
|
|
|
return DEAD_OBJECT;
|
|
|
|
|
}
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
ALOGE("%s: Unable to query for camera devices from provider '%s'",
|
|
|
|
|
__FUNCTION__, mProviderName.c_str());
|
|
|
|
|
return mapToStatusT(status);
|
|
|
|
|
res = getConcurrentStreamingCameraIdsInternalLocked(interface2_6);
|
|
|
|
|
if (res != OK) {
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1626,6 +1606,75 @@ status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status_t CameraProviderManager::ProviderInfo::getConcurrentStreamingCameraIdsInternalLocked(
|
|
|
|
|
sp<provider::V2_6::ICameraProvider> &interface2_6) {
|
|
|
|
|
if (interface2_6 == nullptr) {
|
|
|
|
|
ALOGE("%s: null interface provided", __FUNCTION__);
|
|
|
|
|
return BAD_VALUE;
|
|
|
|
|
}
|
|
|
|
|
Status status = Status::OK;
|
|
|
|
|
hardware::Return<void> ret =
|
|
|
|
|
interface2_6->getConcurrentStreamingCameraIds([&status, this](
|
|
|
|
|
Status concurrentIdStatus, // TODO: Move all instances of hidl_string to 'using'
|
|
|
|
|
const hardware::hidl_vec<hardware::hidl_vec<hardware::hidl_string>>&
|
|
|
|
|
cameraDeviceIdCombinations) {
|
|
|
|
|
status = concurrentIdStatus;
|
|
|
|
|
if (status == Status::OK) {
|
|
|
|
|
mConcurrentCameraIdCombinations.clear();
|
|
|
|
|
for (auto& combination : cameraDeviceIdCombinations) {
|
|
|
|
|
std::unordered_set<std::string> deviceIds;
|
|
|
|
|
for (auto &cameraDeviceId : combination) {
|
|
|
|
|
deviceIds.insert(cameraDeviceId.c_str());
|
|
|
|
|
}
|
|
|
|
|
mConcurrentCameraIdCombinations.push_back(std::move(deviceIds));
|
|
|
|
|
}
|
|
|
|
|
} });
|
|
|
|
|
if (!ret.isOk()) {
|
|
|
|
|
ALOGE("%s: Transaction error in getting concurrent camera ID list from provider '%s'",
|
|
|
|
|
__FUNCTION__, mProviderName.c_str());
|
|
|
|
|
return DEAD_OBJECT;
|
|
|
|
|
}
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
ALOGE("%s: Unable to query for camera devices from provider '%s'",
|
|
|
|
|
__FUNCTION__, mProviderName.c_str());
|
|
|
|
|
return mapToStatusT(status);
|
|
|
|
|
}
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status_t CameraProviderManager::ProviderInfo::reCacheConcurrentStreamingCameraIdsLocked() {
|
|
|
|
|
if (mMinorVersion < 6) {
|
|
|
|
|
// Unsupported operation, nothing to do here
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
// Check if the provider is currently active - not going to start it up for this notification
|
|
|
|
|
auto interface = mSavedInterface != nullptr ? mSavedInterface : mActiveInterface.promote();
|
|
|
|
|
if (interface == nullptr) {
|
|
|
|
|
ALOGE("%s: camera provider interface for %s is not valid", __FUNCTION__,
|
|
|
|
|
mProviderName.c_str());
|
|
|
|
|
return INVALID_OPERATION;
|
|
|
|
|
}
|
|
|
|
|
auto castResult = provider::V2_6::ICameraProvider::castFrom(interface);
|
|
|
|
|
|
|
|
|
|
if (castResult.isOk()) {
|
|
|
|
|
sp<provider::V2_6::ICameraProvider> interface2_6 = castResult;
|
|
|
|
|
if (interface2_6 != nullptr) {
|
|
|
|
|
return getConcurrentStreamingCameraIdsInternalLocked(interface2_6);
|
|
|
|
|
} else {
|
|
|
|
|
// This should not happen since mMinorVersion >= 6
|
|
|
|
|
ALOGE("%s: mMinorVersion was >= 6, but interface2_6 was nullptr", __FUNCTION__);
|
|
|
|
|
return UNKNOWN_ERROR;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::vector<std::unordered_set<std::string>>
|
|
|
|
|
CameraProviderManager::ProviderInfo::getConcurrentCameraIdCombinations() {
|
|
|
|
|
std::lock_guard<std::mutex> lock(mLock);
|
|
|
|
|
return mConcurrentCameraIdCombinations;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
hardware::Return<void> CameraProviderManager::ProviderInfo::cameraDeviceStatusChange(
|
|
|
|
|
const hardware::hidl_string& cameraDeviceName,
|
|
|
|
|
CameraDeviceStatus newStatus) {
|
|
|
|
@ -1659,6 +1708,10 @@ hardware::Return<void> CameraProviderManager::ProviderInfo::cameraDeviceStatusCh
|
|
|
|
|
}
|
|
|
|
|
listener = mManager->getStatusListener();
|
|
|
|
|
initialized = mInitialized;
|
|
|
|
|
if (reCacheConcurrentStreamingCameraIdsLocked() != OK) {
|
|
|
|
|
ALOGE("%s: CameraProvider %s could not re-cache concurrent streaming camera id list ",
|
|
|
|
|
__FUNCTION__, mProviderName.c_str());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Call without lock held to allow reentrancy into provider manager
|
|
|
|
|
// Don't send the callback if providerInfo hasn't been initialized.
|
|
|
|
@ -2747,7 +2800,7 @@ CameraProviderManager::getConcurrentStreamingCameraIds() const {
|
|
|
|
|
std::vector<std::unordered_set<std::string>> deviceIdCombinations;
|
|
|
|
|
std::lock_guard<std::mutex> lock(mInterfaceMutex);
|
|
|
|
|
for (auto &provider : mProviders) {
|
|
|
|
|
for (auto &combinations : provider->mConcurrentCameraIdCombinations) {
|
|
|
|
|
for (auto &combinations : provider->getConcurrentCameraIdCombinations()) {
|
|
|
|
|
deviceIdCombinations.push_back(combinations);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -2831,7 +2884,7 @@ status_t CameraProviderManager::isConcurrentSessionConfigurationSupported(
|
|
|
|
|
// TODO: we should also do a findDeviceInfoLocked here ?
|
|
|
|
|
for (auto &provider : mProviders) {
|
|
|
|
|
if (checkIfSetContainsAll(cameraIdsAndSessionConfigs,
|
|
|
|
|
provider->mConcurrentCameraIdCombinations)) {
|
|
|
|
|
provider->getConcurrentCameraIdCombinations())) {
|
|
|
|
|
// For each camera device in cameraIdsAndSessionConfigs collect
|
|
|
|
|
// the streamConfigs and create the HAL
|
|
|
|
|
// CameraIdAndStreamCombination, exit early if needed
|
|
|
|
|