Camera: Support querying session config with parameters
Existing isSessionConfigurationSupported doesn't consider session
parameters. However, many features are modeled as a session parameters.
Add a new API to query session configuration support considring session
parameters.
Test: Camera CTS
Bug: 309627704
Change-Id: If64d878cb0052c0f78db277ebe605d36197eb618
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp
index adcb523..fbb5e1b 100644
--- a/services/camera/libcameraservice/common/CameraProviderManager.cpp
+++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp
@@ -397,7 +397,7 @@
status_t CameraProviderManager::isSessionConfigurationSupported(const std::string& id,
const SessionConfiguration &configuration, bool overrideForPerfClass,
- metadataGetter getMetadata, bool *status /*out*/) const {
+ bool checkSessionParams, bool *status /*out*/) const {
std::lock_guard<std::mutex> lock(mInterfaceMutex);
auto deviceInfo = findDeviceInfoLocked(id);
if (deviceInfo == nullptr) {
@@ -405,7 +405,41 @@
}
return deviceInfo->isSessionConfigurationSupported(configuration,
- overrideForPerfClass, getMetadata, status);
+ overrideForPerfClass, checkSessionParams, status);
+}
+
+status_t CameraProviderManager::createDefaultRequest(const std::string& cameraId,
+ camera_request_template_t templateId,
+ CameraMetadata* metadata) const {
+ ATRACE_CALL();
+ if (templateId <= 0 || templateId >= CAMERA_TEMPLATE_COUNT) {
+ return BAD_VALUE;
+ }
+
+ std::lock_guard<std::mutex> lock(mInterfaceMutex);
+ auto deviceInfo = findDeviceInfoLocked(cameraId);
+ if (deviceInfo == nullptr) {
+ return NAME_NOT_FOUND;
+ }
+
+ camera_metadata_t *rawRequest;
+ status_t res = deviceInfo->createDefaultRequest(templateId,
+ &rawRequest);
+
+ if (res == BAD_VALUE) {
+ ALOGI("%s: template %d is not supported on this camera device",
+ __FUNCTION__, templateId);
+ return res;
+ } else if (res != OK) {
+ ALOGE("Unable to construct request template %d: %s (%d)",
+ templateId, strerror(-res), res);
+ return res;
+ }
+
+ set_camera_metadata_vendor_id(rawRequest, deviceInfo->mProviderTagid);
+ metadata->acquire(rawRequest);
+
+ return OK;
}
status_t CameraProviderManager::getCameraIdIPCTransport(const std::string &id,
@@ -1011,6 +1045,20 @@
}
}
+CameraMetadata CameraProviderManager::ProviderInfo::DeviceInfo3::deviceInfo(
+ const std::string &id) {
+ if (id.empty()) {
+ return mCameraCharacteristics;
+ } else {
+ if (mPhysicalCameraCharacteristics.find(id) != mPhysicalCameraCharacteristics.end()) {
+ return mPhysicalCameraCharacteristics.at(id);
+ } else {
+ ALOGE("%s: Invalid physical camera id %s", __FUNCTION__, id.c_str());
+ return mCameraCharacteristics;
+ }
+ }
+}
+
SystemCameraKind CameraProviderManager::ProviderInfo::DeviceInfo3::getSystemCameraKind() {
camera_metadata_entry_t entryCap;
entryCap = mCameraCharacteristics.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
@@ -1757,6 +1805,26 @@
return res;
}
+status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addSessionConfigQueryVersionTag() {
+ sp<ProviderInfo> parentProvider = mParentProvider.promote();
+ if (parentProvider == nullptr) {
+ return DEAD_OBJECT;
+ }
+
+ int versionCode = ANDROID_INFO_SESSION_CONFIGURATION_QUERY_VERSION_UPSIDE_DOWN_CAKE;
+ IPCTransport ipcTransport = parentProvider->getIPCTransport();
+ int deviceVersion = HARDWARE_DEVICE_API_VERSION(mVersion.get_major(), mVersion.get_minor());
+ if (ipcTransport == IPCTransport::AIDL
+ && deviceVersion >= CAMERA_DEVICE_API_VERSION_1_3) {
+ versionCode = ANDROID_INFO_SESSION_CONFIGURATION_QUERY_VERSION_VANILLA_ICE_CREAM;
+ }
+
+ auto& c = mCameraCharacteristics;
+ status_t res = c.update(ANDROID_INFO_SESSION_CONFIGURATION_QUERY_VERSION, &versionCode, 1);
+
+ return res;
+}
+
status_t CameraProviderManager::ProviderInfo::DeviceInfo3::removeAvailableKeys(
CameraMetadata& c, const std::vector<uint32_t>& keys, uint32_t keyTag) {
status_t res = OK;