From 276d062e23ce0c3b81e294ad29cd72cc597ada3f Mon Sep 17 00:00:00 2001 From: Maxime Fournier Date: Mon, 25 Aug 2025 00:29:18 +0200 Subject: [PATCH] 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 --- src/android/camera_device.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 80ff248c..3b56bd21 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -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(data[2]), - static_cast(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(data[2]), + static_cast(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)) {