Camera: fix feature combination query implementation
1. Fix up keys in createDefaultSettings:
Camera framework fixes up keys for default settings for
Camera3Device::createDefaultSettings and caches them. Do
the same thing for CameraService::createDefaultSettings.
2. Handle non-session parameters
VIDEO_STABILIZATION_MODE may not be a session parameter on
some devices. Instead of filterig out all non-session-parameters,
keep both AE_TARGET_FPS_RANGE and VIDEO_STABILIZATION_MODE.
Test: atest CtsCameraTestCases
Bug: 309627704
Change-Id: I140f9248992adf6206d904109808d4233c449c39
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp
index 15e2755..d4b32e8 100644
--- a/services/camera/libcameraservice/common/CameraProviderManager.cpp
+++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp
@@ -439,9 +439,8 @@
return NAME_NOT_FOUND;
}
- camera_metadata_t *rawRequest;
status_t res = deviceInfo->createDefaultRequest(templateId,
- &rawRequest);
+ metadata);
if (res == BAD_VALUE) {
ALOGI("%s: template %d is not supported on this camera device",
@@ -453,9 +452,6 @@
return res;
}
- set_camera_metadata_vendor_id(rawRequest, deviceInfo->mProviderTagid);
- metadata->acquire(rawRequest);
-
return OK;
}
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.h b/services/camera/libcameraservice/common/CameraProviderManager.h
index 5ff3fcd..1a686bd 100644
--- a/services/camera/libcameraservice/common/CameraProviderManager.h
+++ b/services/camera/libcameraservice/common/CameraProviderManager.h
@@ -663,7 +663,7 @@
virtual void notifyDeviceStateChange(int64_t /*newState*/) {}
virtual status_t createDefaultRequest(
camera3::camera_request_template_t /*templateId*/,
- camera_metadata_t** /*metadata*/) {
+ CameraMetadata* /*metadata*/) {
return INVALID_OPERATION;
}
diff --git a/services/camera/libcameraservice/common/aidl/AidlProviderInfo.cpp b/services/camera/libcameraservice/common/aidl/AidlProviderInfo.cpp
index a721d28..8eaa7b4 100644
--- a/services/camera/libcameraservice/common/aidl/AidlProviderInfo.cpp
+++ b/services/camera/libcameraservice/common/aidl/AidlProviderInfo.cpp
@@ -26,6 +26,7 @@
#include <android/hardware/ICameraService.h>
#include <camera_metadata_hidden.h>
+#include "device3/DistortionMapper.h"
#include "device3/ZoomRatioMapper.h"
#include <utils/SessionConfigurationUtils.h>
#include <utils/Trace.h>
@@ -44,6 +45,7 @@
using namespace hardware::camera;
using hardware::camera2::utils::CameraIdAndSessionConfiguration;
using hardware::ICameraService;
+using SessionConfigurationUtils::overrideDefaultRequestKeys;
using HalDeviceStatusType = aidl::android::hardware::camera::common::CameraDeviceStatus;
using ICameraProvider = aidl::android::hardware::camera::provider::ICameraProvider;
@@ -690,6 +692,14 @@
}
}
+ int deviceVersion = HARDWARE_DEVICE_API_VERSION(mVersion.get_major(), mVersion.get_minor());
+ if (deviceVersion >= CAMERA_DEVICE_API_VERSION_1_3) {
+ // This additional set of request keys must match the ones specified
+ // in ICameraDevice.isSessionConfigurationWithSettingsSupported.
+ mAdditionalKeysForFeatureQuery.insert(mAdditionalKeysForFeatureQuery.end(),
+ {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, ANDROID_CONTROL_AE_TARGET_FPS_RANGE});
+ }
+
if (!kEnableLazyHal) {
// Save HAL reference indefinitely
mSavedInterface = interface;
@@ -804,7 +814,7 @@
auto bRes = SessionConfigurationUtils::convertToHALStreamCombination(configuration,
mId, mCameraCharacteristics, mCompositeJpegRDisabled, getMetadata,
mPhysicalIds, streamConfiguration, overrideForPerfClass, mProviderTagid,
- checkSessionParams, &earlyExit);
+ checkSessionParams, mAdditionalKeysForFeatureQuery, &earlyExit);
if (!bRes.isOk()) {
return UNKNOWN_ERROR;
@@ -851,7 +861,7 @@
}
status_t AidlProviderInfo::AidlDeviceInfo3::createDefaultRequest(
- camera3::camera_request_template_t templateId, camera_metadata_t** metadata) {
+ camera3::camera_request_template_t templateId, CameraMetadata* metadata) {
const std::shared_ptr<camera::device::ICameraDevice> interface =
startDeviceInterface();
@@ -887,11 +897,12 @@
}
const camera_metadata *r =
reinterpret_cast<const camera_metadata_t*>(request.metadata.data());
+ camera_metadata *rawRequest = nullptr;
size_t expectedSize = request.metadata.size();
int ret = validate_camera_metadata_structure(r, &expectedSize);
if (ret == OK || ret == CAMERA_METADATA_VALIDATION_SHIFTED) {
- *metadata = clone_camera_metadata(r);
- if (*metadata == nullptr) {
+ rawRequest = clone_camera_metadata(r);
+ if (rawRequest == nullptr) {
ALOGE("%s: Unable to clone camera metadata received from HAL",
__FUNCTION__);
res = UNKNOWN_ERROR;
@@ -901,6 +912,16 @@
res = UNKNOWN_ERROR;
}
+ set_camera_metadata_vendor_id(rawRequest, mProviderTagid);
+ metadata->acquire(rawRequest);
+
+ res = overrideDefaultRequestKeys(metadata);
+ if (res != OK) {
+ ALOGE("Unabled to override default request keys: %s (%d)",
+ strerror(-res), res);
+ return res;
+ }
+
return res;
}
@@ -912,7 +933,7 @@
auto res = SessionConfigurationUtils::convertToHALStreamCombination(configuration,
mId, mCameraCharacteristics, mCompositeJpegRDisabled, getMetadata,
mPhysicalIds, streamConfiguration, overrideForPerfClass, mProviderTagid,
- /*checkSessionParams*/true, &earlyExit);
+ /*checkSessionParams*/true, mAdditionalKeysForFeatureQuery, &earlyExit);
if (!res.isOk()) {
return UNKNOWN_ERROR;
@@ -992,7 +1013,8 @@
mManager->isCompositeJpegRDisabledLocked(cameraId), getMetadata,
physicalCameraIds, streamConfiguration,
overrideForPerfClass, mProviderTagid,
- /*checkSessionParams*/false, &shouldExit);
+ /*checkSessionParams*/false, /*additionalKeys*/{},
+ &shouldExit);
if (!bStatus.isOk()) {
ALOGE("%s: convertToHALStreamCombination failed", __FUNCTION__);
return INVALID_OPERATION;
diff --git a/services/camera/libcameraservice/common/aidl/AidlProviderInfo.h b/services/camera/libcameraservice/common/aidl/AidlProviderInfo.h
index 0bfa7d4..38ebc94 100644
--- a/services/camera/libcameraservice/common/aidl/AidlProviderInfo.h
+++ b/services/camera/libcameraservice/common/aidl/AidlProviderInfo.h
@@ -132,7 +132,7 @@
virtual status_t createDefaultRequest(
camera3::camera_request_template_t templateId,
- camera_metadata_t** metadata) override;
+ CameraMetadata* metadata) override;
virtual status_t getSessionCharacteristics(
const SessionConfiguration &/*configuration*/,
@@ -141,6 +141,7 @@
std::shared_ptr<aidl::android::hardware::camera::device::ICameraDevice>
startDeviceInterface();
+ std::vector<int32_t> mAdditionalKeysForFeatureQuery;
};
private:
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 392959e..c502092 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -1363,7 +1363,8 @@
status_t Camera3Device::filterParamsAndConfigureLocked(const CameraMetadata& params,
int operatingMode) {
CameraMetadata filteredParams;
- SessionConfigurationUtils::filterParameters(params, mDeviceInfo, mVendorTagId, filteredParams);
+ SessionConfigurationUtils::filterParameters(params, mDeviceInfo,
+ /*additionalKeys*/{}, mVendorTagId, filteredParams);
camera_metadata_entry_t availableSessionKeys = mDeviceInfo.find(
ANDROID_REQUEST_AVAILABLE_SESSION_KEYS);
@@ -1484,29 +1485,13 @@
set_camera_metadata_vendor_id(rawRequest, mVendorTagId);
mRequestTemplateCache[templateId].acquire(rawRequest);
- // Override the template request with zoomRatioMapper
- res = mZoomRatioMappers[mId].initZoomRatioInTemplate(
- &mRequestTemplateCache[templateId]);
+ res = overrideDefaultRequestKeys(&mRequestTemplateCache[templateId]);
if (res != OK) {
- CLOGE("Failed to update zoom ratio for template %d: %s (%d)",
+ CLOGE("Failed to overrideDefaultRequestKeys for template %d: %s (%d)",
templateId, strerror(-res), res);
return res;
}
- // Fill in JPEG_QUALITY if not available
- if (!mRequestTemplateCache[templateId].exists(ANDROID_JPEG_QUALITY)) {
- static const uint8_t kDefaultJpegQuality = 95;
- mRequestTemplateCache[templateId].update(ANDROID_JPEG_QUALITY,
- &kDefaultJpegQuality, 1);
- }
-
- // Fill in AUTOFRAMING if not available
- if (!mRequestTemplateCache[templateId].exists(ANDROID_CONTROL_AUTOFRAMING)) {
- static const uint8_t kDefaultAutoframingMode = ANDROID_CONTROL_AUTOFRAMING_OFF;
- mRequestTemplateCache[templateId].update(ANDROID_CONTROL_AUTOFRAMING,
- &kDefaultAutoframingMode, 1);
- }
-
*request = mRequestTemplateCache[templateId];
mLastTemplateId = templateId;
}
diff --git a/services/camera/libcameraservice/libcameraservice_fuzzer/Android.bp b/services/camera/libcameraservice/libcameraservice_fuzzer/Android.bp
index 9dd657c..c710671 100644
--- a/services/camera/libcameraservice/libcameraservice_fuzzer/Android.bp
+++ b/services/camera/libcameraservice/libcameraservice_fuzzer/Android.bp
@@ -57,6 +57,7 @@
"android.hardware.camera.device@3.5",
"android.hardware.camera.device@3.6",
"android.hardware.camera.device@3.7",
+ "camera_platform_flags_c_lib",
],
fuzz_config: {
cc: [
diff --git a/services/camera/libcameraservice/utils/SessionConfigurationUtils.cpp b/services/camera/libcameraservice/utils/SessionConfigurationUtils.cpp
index 23aed6e..a7a2b5e 100644
--- a/services/camera/libcameraservice/utils/SessionConfigurationUtils.cpp
+++ b/services/camera/libcameraservice/utils/SessionConfigurationUtils.cpp
@@ -27,6 +27,7 @@
#include "device3/aidl/AidlCamera3Device.h"
#include "device3/hidl/HidlCamera3Device.h"
#include "device3/Camera3OutputStream.h"
+#include "device3/ZoomRatioMapper.h"
#include "system/graphics-base-v1.1.h"
#include <camera/StringUtils.h>
#include <ui/PublicFormat.h>
@@ -686,7 +687,8 @@
metadataGetter getMetadata, const std::vector<std::string> &physicalCameraIds,
aidl::android::hardware::camera::device::StreamConfiguration &streamConfiguration,
bool overrideForPerfClass, metadata_vendor_id_t vendorTagId,
- bool checkSessionParams, bool *earlyExit) {
+ bool checkSessionParams, const std::vector<int32_t>& additionalKeys,
+ bool *earlyExit) {
using SensorPixelMode = aidl::android::hardware::camera::metadata::SensorPixelMode;
auto operatingMode = sessionConfiguration.getOperatingMode();
binder::Status res = checkOperatingMode(operatingMode, deviceInfo,
@@ -912,7 +914,7 @@
CameraMetadata filteredParams;
filterParameters(sessionConfiguration.getSessionParameters(), deviceInfo,
- vendorTagId, filteredParams);
+ additionalKeys, vendorTagId, filteredParams);
camera_metadata_t* metadata = const_cast<camera_metadata_t*>(filteredParams.getAndLock());
uint8_t *metadataP = reinterpret_cast<uint8_t*>(metadata);
@@ -1176,7 +1178,8 @@
}
void filterParameters(const CameraMetadata& src, const CameraMetadata& deviceInfo,
- metadata_vendor_id_t vendorTagId, CameraMetadata& dst) {
+ const std::vector<int32_t>& additionalTags, metadata_vendor_id_t vendorTagId,
+ CameraMetadata& dst) {
const CameraMetadata params(src);
camera_metadata_ro_entry_t availableSessionKeys = deviceInfo.find(
ANDROID_REQUEST_AVAILABLE_SESSION_KEYS);
@@ -1185,9 +1188,12 @@
filteredParams.getAndLock());
set_camera_metadata_vendor_id(meta, vendorTagId);
filteredParams.unlock(meta);
- for (size_t i = 0; i < availableSessionKeys.count; i++) {
- camera_metadata_ro_entry entry = params.find(
- availableSessionKeys.data.i32[i]);
+
+ std::unordered_set<int32_t> filteredTags(availableSessionKeys.data.i32,
+ availableSessionKeys.data.i32 + availableSessionKeys.count);
+ filteredTags.insert(additionalTags.begin(), additionalTags.end());
+ for (int32_t tag : filteredTags) {
+ camera_metadata_ro_entry entry = params.find(tag);
if (entry.count > 0) {
filteredParams.update(entry);
}
@@ -1195,6 +1201,29 @@
dst = std::move(filteredParams);
}
+status_t overrideDefaultRequestKeys(CameraMetadata *request) {
+ // Override the template request with ZoomRatioMapper
+ status_t res = ZoomRatioMapper::initZoomRatioInTemplate(request);
+ if (res != OK) {
+ ALOGE("Failed to update zoom ratio: %s (%d)", strerror(-res), res);
+ return res;
+ }
+
+ // Fill in JPEG_QUALITY if not available
+ if (!request->exists(ANDROID_JPEG_QUALITY)) {
+ static const uint8_t kDefaultJpegQuality = 95;
+ request->update(ANDROID_JPEG_QUALITY, &kDefaultJpegQuality, 1);
+ }
+
+ // Fill in AUTOFRAMING if not available
+ if (!request->exists(ANDROID_CONTROL_AUTOFRAMING)) {
+ static const uint8_t kDefaultAutoframingMode = ANDROID_CONTROL_AUTOFRAMING_OFF;
+ request->update(ANDROID_CONTROL_AUTOFRAMING, &kDefaultAutoframingMode, 1);
+ }
+
+ return OK;
+}
+
} // namespace SessionConfigurationUtils
} // namespace camera3
} // namespace android
diff --git a/services/camera/libcameraservice/utils/SessionConfigurationUtils.h b/services/camera/libcameraservice/utils/SessionConfigurationUtils.h
index a226829..3c0f109 100644
--- a/services/camera/libcameraservice/utils/SessionConfigurationUtils.h
+++ b/services/camera/libcameraservice/utils/SessionConfigurationUtils.h
@@ -156,7 +156,8 @@
const std::vector<std::string> &physicalCameraIds,
aidl::android::hardware::camera::device::StreamConfiguration &streamConfiguration,
bool overrideForPerfClass, metadata_vendor_id_t vendorTagId,
- bool checkSessionParams, bool *earlyExit);
+ bool checkSessionParams, const std::vector<int32_t>& additionalKeys,
+ bool *earlyExit);
StreamConfigurationPair getStreamConfigurationPair(const CameraMetadata &metadata);
@@ -177,7 +178,10 @@
aidl::android::hardware::camera::device::RequestTemplate* tempId /*out*/);
void filterParameters(const CameraMetadata& src, const CameraMetadata& deviceInfo,
- metadata_vendor_id_t vendorTagId, CameraMetadata& dst);
+ const std::vector<int32_t>& additionalKeys, metadata_vendor_id_t vendorTagId,
+ CameraMetadata& dst);
+
+status_t overrideDefaultRequestKeys(CameraMetadata *request);
template <typename T> bool contains(std::set<T> container, T value) {
return container.find(value) != container.end();
diff --git a/services/camera/libcameraservice/utils/SessionConfigurationUtilsHidl.cpp b/services/camera/libcameraservice/utils/SessionConfigurationUtilsHidl.cpp
index bf8ea84..cfa1815 100644
--- a/services/camera/libcameraservice/utils/SessionConfigurationUtilsHidl.cpp
+++ b/services/camera/libcameraservice/utils/SessionConfigurationUtilsHidl.cpp
@@ -113,7 +113,7 @@
auto ret = convertToHALStreamCombination(sessionConfiguration, logicalCameraId, deviceInfo,
false /*isCompositeJpegRDisabled*/, getMetadata, physicalCameraIds,
aidlStreamConfiguration, overrideForPerfClass, vendorTagId,
- /*checkSessionParams*/false, earlyExit);
+ /*checkSessionParams*/false, /*additionalKeys*/{}, earlyExit);
if (!ret.isOk()) {
return ret;
}