[libcamera-devel] [RFC PATCH 3/8] android: camera_device: Add separate template for still capture

Paul Elder paul.elder at ideasonboard.com
Thu Apr 1 12:13:35 CEST 2021


Add a separate template for still capture, so that we can set the noise
reduction mode to high quality, as hardware level FULL requires this.

This is part of a fix to allow the following CTS test to pass:
- android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceStillTemplate

Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
---
 src/android/camera_device.cpp | 23 ++++++++++++++++++-----
 src/android/camera_device.h   |  1 +
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 30ea3ade..ded57649 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -1479,6 +1479,23 @@ std::unique_ptr<CameraMetadata> CameraDevice::requestTemplateVideo()
 	return previewTemplate;
 }
 
+std::unique_ptr<CameraMetadata> CameraDevice::requestTemplateStill()
+{
+	std::unique_ptr<CameraMetadata> previewTemplate = requestTemplatePreview();
+	if (!previewTemplate)
+		return nullptr;
+
+	/*
+	 * The still template with FULL requires the noise reduction mode to be
+	 * HIGH_QUALITY.
+	 */
+	uint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY;
+	previewTemplate->updateEntry(ANDROID_NOISE_REDUCTION_MODE,
+				     &noiseReduction, 1);
+
+	return previewTemplate;
+}
+
 /*
  * Produce a metadata pack to be used as template for a capture request.
  */
@@ -1497,12 +1514,8 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)
 		requestTemplate = requestTemplatePreview();
 		break;
 	case CAMERA3_TEMPLATE_STILL_CAPTURE:
-		/*
-		 * Use the preview template for still capture, they only differ
-		 * for the torch mode we currently do not support.
-		 */
 		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
-		requestTemplate = requestTemplatePreview();
+		requestTemplate = requestTemplateStill();
 		break;
 	case CAMERA3_TEMPLATE_VIDEO_RECORD:
 		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index 11bdfec8..388acf51 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -99,6 +99,7 @@ private:
 	void notifyError(uint32_t frameNumber, camera3_stream_t *stream);
 	std::unique_ptr<CameraMetadata> requestTemplatePreview();
 	std::unique_ptr<CameraMetadata> requestTemplateVideo();
+	std::unique_ptr<CameraMetadata> requestTemplateStill();
 	libcamera::PixelFormat toPixelFormat(int format) const;
 	int processControls(Camera3RequestDescriptor *descriptor);
 	std::unique_ptr<CameraMetadata> getResultMetadata(
-- 
2.27.0



More information about the libcamera-devel mailing list