android: camera: fix unsupported camera control validation

Add runtime validation for camera controls before setting them to prevent
spam errors. Check controls.find() for ANDROID_SCALER_CROP_REGION and
ANDROID_STATISTICS_FACE_DETECT_MODE before attempting to set values.

Fixes error spam:
- "Control 0x0000001b is not valid" (ScalerCrop)
- "Control 0x0000271a is not valid" (FaceDetectMode)

Only sets controls that are supported by the specific camera hardware,
improving HAL compliance and reducing log noise.

Signed-off-by: Maxime Fournier <mfournier@baylibre.com>
This commit is contained in:
Maxime Fournier
2025-08-25 00:29:18 +02:00
committed by Konsta
parent 66b0bcbbee
commit 276d062e23

View File

@@ -807,16 +807,24 @@ int CameraDevice::processControls(Camera3RequestDescriptor *descriptor)
ControlList &controls = descriptor->request_->controls();
camera_metadata_ro_entry_t entry;
if (settings.getEntry(ANDROID_SCALER_CROP_REGION, &entry)) {
const int32_t *data = entry.data.i32;
Rectangle cropRegion{ data[0], data[1],
static_cast<unsigned int>(data[2]),
static_cast<unsigned int>(data[3]) };
controls.set(controls::ScalerCrop, cropRegion);
/* Only set the control if the camera supports it */
auto iter = camera_->controls().find(controls::ScalerCrop.id());
if (iter != camera_->controls().end()) {
const int32_t *data = entry.data.i32;
Rectangle cropRegion{ data[0], data[1],
static_cast<unsigned int>(data[2]),
static_cast<unsigned int>(data[3]) };
controls.set(controls::ScalerCrop, cropRegion);
}
}
if (settings.getEntry(ANDROID_STATISTICS_FACE_DETECT_MODE, &entry)) {
const uint8_t *data = entry.data.u8;
controls.set(controls::draft::FaceDetectMode, data[0]);
/* Only set the control if the camera supports it */
auto iter = camera_->controls().find(controls::draft::FaceDetectMode.id());
if (iter != camera_->controls().end()) {
const uint8_t *data = entry.data.u8;
controls.set(controls::draft::FaceDetectMode, data[0]);
}
}
if (settings.getEntry(ANDROID_SENSOR_TEST_PATTERN_MODE, &entry)) {