[libcamera-devel,4/5] android: camera_device: Construct VideoRecording request template

Message ID 20200725164243.168297-5-jacopo@jmondi.org
State Superseded, archived
Delegated to: Jacopo Mondi
Headers show
Series
  • android: cts: Fix Manual and VideoRecording templates
Related show

Commit Message

Jacopo Mondi July 25, 2020, 4:42 p.m. UTC
Construct the template for the VIDEO_RECORDING request template.

The constructed control pack is quite similar to the one used for
preview, with the exception that the desired FPS rage is a single value.

This fixes the CTS 9.0.r12 test:
android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceRecordingTemplate

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/android/camera_device.cpp | 86 ++++++++++++++++++++++++++++++++++-
 src/android/camera_device.h   |  1 +
 2 files changed, 86 insertions(+), 1 deletion(-)

Comments

Niklas Söderlund July 29, 2020, 12:09 a.m. UTC | #1
Hi Jacopo,

Thanks for your work.

On 2020-07-25 18:42:42 +0200, Jacopo Mondi wrote:
> Construct the template for the VIDEO_RECORDING request template.
> 
> The constructed control pack is quite similar to the one used for
> preview, with the exception that the desired FPS rage is a single value.
> 
> This fixes the CTS 9.0.r12 test:
> android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceRecordingTemplate
> 
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>

> ---
>  src/android/camera_device.cpp | 86 ++++++++++++++++++++++++++++++++++-
>  src/android/camera_device.h   |  1 +
>  2 files changed, 86 insertions(+), 1 deletion(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index ca746b685c26..bd501a9b1660 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -918,6 +918,90 @@ CameraMetadata *CameraDevice::requestTemplatePreview()
>  	return requestTemplate;
>  }
>  
> +CameraMetadata *CameraDevice::requestTemplateVideoRecord()
> +{
> +	/*
> +	 * \todo Keep this in sync with the actual number of entries.
> +	 * Currently: 20 entries, 35 bytes
> +	 */
> +	CameraMetadata *requestTemplate = new CameraMetadata(20, 35);
> +	if (!requestTemplate->isValid()) {
> +		delete requestTemplate;
> +		return nullptr;
> +	}
> +
> +	uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
> +	requestTemplate->addEntry(ANDROID_CONTROL_AE_MODE,
> +				  &aeMode, 1);
> +
> +	int32_t aeExposureCompensation = 0;
> +	requestTemplate->addEntry(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
> +				  &aeExposureCompensation, 1);
> +
> +	uint8_t aePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;
> +	requestTemplate->addEntry(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
> +				  &aePrecaptureTrigger, 1);
> +
> +	uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
> +	requestTemplate->addEntry(ANDROID_CONTROL_AE_LOCK,
> +				  &aeLock, 1);
> +
> +	std::vector<int32_t> aeFpsTarget = {
> +		30, 30,
> +	};
> +	requestTemplate->addEntry(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
> +				  aeFpsTarget.data(),
> +				  aeFpsTarget.size());
> +
> +	uint8_t aeAntibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO;
> +	requestTemplate->addEntry(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
> +				  &aeAntibandingMode, 1);
> +
> +	uint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE;
> +	requestTemplate->addEntry(ANDROID_CONTROL_AF_TRIGGER,
> +				  &afTrigger, 1);
> +
> +	uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
> +	requestTemplate->addEntry(ANDROID_CONTROL_AWB_MODE,
> +				  &awbMode, 1);
> +
> +	uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
> +	requestTemplate->addEntry(ANDROID_CONTROL_AWB_LOCK,
> +				  &awbLock, 1);
> +
> +	uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
> +	requestTemplate->addEntry(ANDROID_FLASH_MODE,
> +				  &flashMode, 1);
> +
> +	uint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
> +	requestTemplate->addEntry(ANDROID_STATISTICS_FACE_DETECT_MODE,
> +				  &faceDetectMode, 1);
> +
> +	uint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_OFF;
> +	requestTemplate->addEntry(ANDROID_NOISE_REDUCTION_MODE,
> +				  &noiseReduction, 1);
> +
> +	uint8_t aberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;
> +	requestTemplate->addEntry(ANDROID_COLOR_CORRECTION_ABERRATION_MODE,
> +				  &aberrationMode, 1);
> +
> +	uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
> +	requestTemplate->addEntry(ANDROID_CONTROL_MODE, &controlMode, 1);
> +
> +	float lensAperture = 2.53 / 100;
> +	requestTemplate->addEntry(ANDROID_LENS_APERTURE, &lensAperture, 1);
> +
> +	uint8_t opticalStabilization = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
> +	requestTemplate->addEntry(ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
> +				  &opticalStabilization, 1);
> +
> +	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
> +	requestTemplate->addEntry(ANDROID_CONTROL_CAPTURE_INTENT,
> +				  &captureIntent, 1);
> +
> +	return requestTemplate;
> +}
> +
>  CameraMetadata *CameraDevice::requestTemplateManual()
>  {
>  	/*
> @@ -1024,7 +1108,7 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)
>  		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
>  		break;
>  	case CAMERA3_TEMPLATE_VIDEO_RECORD:
> -		requestTemplate = requestTemplatePreview();
> +		requestTemplate = requestTemplateVideoRecord();
>  		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
>  		break;
>  	case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
> diff --git a/src/android/camera_device.h b/src/android/camera_device.h
> index db7b3c558993..87ee36e96805 100644
> --- a/src/android/camera_device.h
> +++ b/src/android/camera_device.h
> @@ -84,6 +84,7 @@ private:
>  	void notifyShutter(uint32_t frameNumber, uint64_t timestamp);
>  	void notifyError(uint32_t frameNumber, camera3_stream_t *stream);
>  	CameraMetadata *requestTemplatePreview();
> +	CameraMetadata *requestTemplateVideoRecord();
>  	CameraMetadata *requestTemplateManual();
>  	libcamera::PixelFormat toPixelFormat(int format);
>  	std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,
> -- 
> 2.27.0
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

Patch

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index ca746b685c26..bd501a9b1660 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -918,6 +918,90 @@  CameraMetadata *CameraDevice::requestTemplatePreview()
 	return requestTemplate;
 }
 
+CameraMetadata *CameraDevice::requestTemplateVideoRecord()
+{
+	/*
+	 * \todo Keep this in sync with the actual number of entries.
+	 * Currently: 20 entries, 35 bytes
+	 */
+	CameraMetadata *requestTemplate = new CameraMetadata(20, 35);
+	if (!requestTemplate->isValid()) {
+		delete requestTemplate;
+		return nullptr;
+	}
+
+	uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
+	requestTemplate->addEntry(ANDROID_CONTROL_AE_MODE,
+				  &aeMode, 1);
+
+	int32_t aeExposureCompensation = 0;
+	requestTemplate->addEntry(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
+				  &aeExposureCompensation, 1);
+
+	uint8_t aePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;
+	requestTemplate->addEntry(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
+				  &aePrecaptureTrigger, 1);
+
+	uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
+	requestTemplate->addEntry(ANDROID_CONTROL_AE_LOCK,
+				  &aeLock, 1);
+
+	std::vector<int32_t> aeFpsTarget = {
+		30, 30,
+	};
+	requestTemplate->addEntry(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
+				  aeFpsTarget.data(),
+				  aeFpsTarget.size());
+
+	uint8_t aeAntibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO;
+	requestTemplate->addEntry(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
+				  &aeAntibandingMode, 1);
+
+	uint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE;
+	requestTemplate->addEntry(ANDROID_CONTROL_AF_TRIGGER,
+				  &afTrigger, 1);
+
+	uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
+	requestTemplate->addEntry(ANDROID_CONTROL_AWB_MODE,
+				  &awbMode, 1);
+
+	uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
+	requestTemplate->addEntry(ANDROID_CONTROL_AWB_LOCK,
+				  &awbLock, 1);
+
+	uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
+	requestTemplate->addEntry(ANDROID_FLASH_MODE,
+				  &flashMode, 1);
+
+	uint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
+	requestTemplate->addEntry(ANDROID_STATISTICS_FACE_DETECT_MODE,
+				  &faceDetectMode, 1);
+
+	uint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_OFF;
+	requestTemplate->addEntry(ANDROID_NOISE_REDUCTION_MODE,
+				  &noiseReduction, 1);
+
+	uint8_t aberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;
+	requestTemplate->addEntry(ANDROID_COLOR_CORRECTION_ABERRATION_MODE,
+				  &aberrationMode, 1);
+
+	uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
+	requestTemplate->addEntry(ANDROID_CONTROL_MODE, &controlMode, 1);
+
+	float lensAperture = 2.53 / 100;
+	requestTemplate->addEntry(ANDROID_LENS_APERTURE, &lensAperture, 1);
+
+	uint8_t opticalStabilization = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF;
+	requestTemplate->addEntry(ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
+				  &opticalStabilization, 1);
+
+	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
+	requestTemplate->addEntry(ANDROID_CONTROL_CAPTURE_INTENT,
+				  &captureIntent, 1);
+
+	return requestTemplate;
+}
+
 CameraMetadata *CameraDevice::requestTemplateManual()
 {
 	/*
@@ -1024,7 +1108,7 @@  const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)
 		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
 		break;
 	case CAMERA3_TEMPLATE_VIDEO_RECORD:
-		requestTemplate = requestTemplatePreview();
+		requestTemplate = requestTemplateVideoRecord();
 		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
 		break;
 	case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index db7b3c558993..87ee36e96805 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -84,6 +84,7 @@  private:
 	void notifyShutter(uint32_t frameNumber, uint64_t timestamp);
 	void notifyError(uint32_t frameNumber, camera3_stream_t *stream);
 	CameraMetadata *requestTemplatePreview();
+	CameraMetadata *requestTemplateVideoRecord();
 	CameraMetadata *requestTemplateManual();
 	libcamera::PixelFormat toPixelFormat(int format);
 	std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,