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: