[libcamera-devel,RFC,4/4] android: camera_device: Propagate the requested test pattern mode
diff mbox series

Message ID 20210611084228.1830629-5-hiroh@chromium.org
State Superseded
Headers show
Series
  • Support sensor test pattern mode in Android HAL
Related show

Commit Message

Hirokazu Honda June 11, 2021, 8:42 a.m. UTC
Propagate the requested test pattern mode to libcamera::Camera
through libcamera::Request and also set the android metadata to
the test pattern mode contained by the complete Request.

Signed-off-by: Hirokazu Honda <hiroh@chromium.org>
---
 src/android/camera_device.cpp | 50 ++++++++++++++++++++++++++++++++++-
 1 file changed, 49 insertions(+), 1 deletion(-)

Patch
diff mbox series

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 5e961003..442c36b1 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -1926,16 +1926,57 @@  int CameraDevice::processControls(Camera3RequestDescriptor *descriptor)
 		return 0;
 
 	/* Translate the Android request settings to libcamera controls. */
+	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]) };
-		ControlList &controls = descriptor->request_->controls();
 		controls.set(controls::ScalerCrop, cropRegion);
 	}
 
+	if (settings.getEntry(ANDROID_SENSOR_TEST_PATTERN_MODE, &entry)) {
+		const int32_t data = *entry.data.i32;
+		switch (data) {
+		case ANDROID_SENSOR_TEST_PATTERN_MODE_OFF:
+			controls.set(controls::draft::TestPatternMode,
+				     controls::draft::TestPatternModeOff);
+			break;
+
+		case ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR:
+			controls.set(controls::draft::TestPatternMode,
+				     controls::draft::TestPatternModeSolidColor);
+			break;
+
+		case ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS:
+			controls.set(controls::draft::TestPatternMode,
+				     controls::draft::TestPatternModeColorBars);
+			break;
+
+		case ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY:
+			controls.set(controls::draft::TestPatternMode,
+				     controls::draft::TestPatternModeColorBarsFadeToGray);
+			break;
+
+		case ANDROID_SENSOR_TEST_PATTERN_MODE_PN9:
+			controls.set(controls::draft::TestPatternMode,
+				     controls::draft::TestPatternModePn9);
+			break;
+
+		case ANDROID_SENSOR_TEST_PATTERN_MODE_CUSTOM1:
+			controls.set(controls::draft::TestPatternMode,
+				     controls::draft::TestPatternModeCustom1);
+			break;
+
+		default:
+			LOG(HAL, Error)
+				<< "Unknown test pattern mode: " << data;
+
+			return -EINVAL;
+		}
+	}
+
 	return 0;
 }
 
@@ -2368,6 +2409,13 @@  CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons
 		resultMetadata->addEntry(ANDROID_SCALER_CROP_REGION, cropRect);
 	}
 
+	if (metadata.contains(controls::draft::TestPatternMode)) {
+		const int32_t testPatternMode =
+			metadata.get(controls::draft::TestPatternMode);
+		resultMetadata->addEntry(ANDROID_SENSOR_TEST_PATTERN_MODE,
+					 testPatternMode);
+	}
+
 	/*
 	 * Return the result metadata pack even is not valid: get() will return
 	 * nullptr.