[libcamera-devel,RFC,5/8] android: camera_device: Set noise reduction values for FULL requirements
diff mbox series

Message ID 20210401101340.160590-6-paul.elder@ideasonboard.com
State Superseded
Delegated to: Paul Elder
Headers show
Series
  • android: First set of FULL fixes
Related show

Commit Message

Paul Elder April 1, 2021, 10:13 a.m. UTC
Set the appropriate values for noise reduction to satisfy the
requirements for hardware level FULL. These are:
- OFF and FAST and HIGH_QUALITY must be supported
- the preview template should have noise reduction set to FAST
- the capture result metadata should have the noise reduction mode set
  to the same mode as what was in the request metadata

This, along with "android: camera_device: Add separate template for
still capture" and "android: camera_device: Set proper frame duration",
allows the following CTS tests to pass:
- android.hardware.camera2.cts.CameraDeviceTest#testCameraDevicePreviewTemplate
- android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceRecordingTemplate
- android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceStillTemplate
- android.hardware.camera2.cts.CaptureRequestTest#testNoiseReductionModeControl
- android.hardware.camera2.cts.CaptureRequestTest#testNoiseReductionModeControlFastFps

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
---
 src/android/camera_device.cpp | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

Patch
diff mbox series

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 0dcfc880..fc432263 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -1087,12 +1087,18 @@  const camera_metadata_t *CameraDevice::getStaticMetadata()
 	{
 		std::vector<uint8_t> data;
 		data.reserve(5);
+		/*
+		 * \todo if this doesn't have OFF and FAST and HIGH_QUALITY
+		 * then this camera does not support FULL
+		 */
 		const auto &infoMap = controlsInfo.find(&controls::draft::NoiseReductionMode);
 		if (infoMap != controlsInfo.end()) {
 			for (const auto &value : infoMap->second.values())
 				data.push_back(value.get<int32_t>());
 		} else {
 			data.push_back(ANDROID_NOISE_REDUCTION_MODE_OFF);
+			data.push_back(ANDROID_NOISE_REDUCTION_MODE_FAST);
+			data.push_back(ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY);
 		}
 		staticMetadata_->addEntry(ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,
 					  data.data(), data.size());
@@ -1431,7 +1437,8 @@  std::unique_ptr<CameraMetadata> CameraDevice::requestTemplatePreview()
 	requestTemplate->addEntry(ANDROID_STATISTICS_FACE_DETECT_MODE,
 				  &faceDetectMode, 1);
 
-	uint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_OFF;
+	/* \todo FULL expects this to be FAST, not OFF*/
+	uint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_FAST;
 	requestTemplate->addEntry(ANDROID_NOISE_REDUCTION_MODE,
 				  &noiseReduction, 1);
 
@@ -2197,7 +2204,9 @@  CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor,
 				 &value, 1);
 
 	value = ANDROID_NOISE_REDUCTION_MODE_OFF;
-	resultMetadata->addEntry(ANDROID_NOISE_REDUCTION_MODE, &value, 1);
+	found = settings.getEntry(ANDROID_NOISE_REDUCTION_MODE, &entry);
+	resultMetadata->addEntry(ANDROID_NOISE_REDUCTION_MODE,
+				 found ? entry.data.u8 : &value, 1);
 
 	/*
 	 * \todo Use sliding window average