[libcamera-devel] [PATCH 5/6] android: camera_device: Create request templates per use-case

Jacopo Mondi jacopo at jmondi.org
Fri Jul 24 16:21:19 CEST 2020


Currently the request template returned from
CameraDevice::constructDefaultRequestSettings() is the same for all
the supported template types.

To prepare to adjust the template depending on the use case, break out
the template generation to dedicated function.

As we currently support the PREVIEW use case only, make all the other
template types use the captureTemplatePreview() function and just update
the capture intent property. This requires a nasty const-cast on the
generated template pack which will be removed once the functions will be
properly populated.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 src/android/camera_device.cpp | 146 +++++++++++++++++++++++++---------
 src/android/camera_device.h   |   7 ++
 2 files changed, 114 insertions(+), 39 deletions(-)

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 48f8090a93db..b8cb118a960e 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -821,51 +821,15 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
 	return staticMetadata_->get();
 }
 
-/*
- * Produce a metadata pack to be used as template for a capture request.
- */
-const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)
+const CameraMetadata *CameraDevice::captureTemplatePreview()
 {
-	auto it = requestTemplates_.find(type);
-	if (it != requestTemplates_.end())
-		return it->second->get();
-
-	/* Use the capture intent matching the requested template type. */
-	uint8_t captureIntent;
-	switch (type) {
-	case CAMERA3_TEMPLATE_PREVIEW:
-		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
-		break;
-	case CAMERA3_TEMPLATE_STILL_CAPTURE:
-		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
-		break;
-	case CAMERA3_TEMPLATE_VIDEO_RECORD:
-		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
-		break;
-	case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
-		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
-		break;
-	case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
-		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
-		break;
-	case CAMERA3_TEMPLATE_MANUAL:
-		captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;
-		break;
-	default:
-		LOG(HAL, Error) << "Invalid template request type: " << type;
-		return nullptr;
-	}
-
 	/*
 	 * \todo Keep this in sync with the actual number of entries.
 	 * Currently: 12 entries, 15 bytes
 	 */
 	CameraMetadata *requestTemplate = new CameraMetadata(15, 20);
-	if (!requestTemplate->isValid()) {
-		LOG(HAL, Error) << "Failed to allocate template metadata";
-		delete requestTemplate;
+	if (!requestTemplate->isValid())
 		return nullptr;
-	}
 
 	uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
 	requestTemplate->addEntry(ANDROID_CONTROL_AE_MODE,
@@ -911,10 +875,114 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)
 	requestTemplate->addEntry(ANDROID_COLOR_CORRECTION_ABERRATION_MODE,
 				  &aberrationMode, 1);
 
+	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
 	requestTemplate->addEntry(ANDROID_CONTROL_CAPTURE_INTENT,
 				  &captureIntent, 1);
 
-	if (!requestTemplate->isValid()) {
+	return requestTemplate;
+}
+
+const CameraMetadata *CameraDevice::captureTemplateStillCapture()
+{
+	const CameraMetadata *requestTemplate = captureTemplatePreview();
+	if (!requestTemplate || !requestTemplate->isValid())
+		return nullptr;
+
+	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
+	const_cast<CameraMetadata *>(requestTemplate)
+		->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);
+
+	return requestTemplate;
+}
+
+const CameraMetadata *CameraDevice::captureTemplateVideoRecord()
+{
+	const CameraMetadata *requestTemplate = captureTemplatePreview();
+	if (!requestTemplate || !requestTemplate->isValid())
+		return nullptr;
+
+	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
+	const_cast<CameraMetadata *>(requestTemplate)
+		->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);
+
+	return requestTemplate;
+}
+
+const CameraMetadata *CameraDevice::captureTemplateVideoSnapshot()
+{
+	const CameraMetadata *requestTemplate = captureTemplatePreview();
+	if (!requestTemplate || !requestTemplate->isValid())
+		return nullptr;
+
+	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
+	const_cast<CameraMetadata *>(requestTemplate)
+		->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);
+
+	return requestTemplate;
+}
+
+const CameraMetadata *CameraDevice::captureTemplateZSL()
+{
+	const CameraMetadata *requestTemplate = captureTemplatePreview();
+	if (!requestTemplate || !requestTemplate->isValid())
+		return nullptr;
+
+	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
+	const_cast<CameraMetadata *>(requestTemplate)
+		->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);
+
+	return requestTemplate;
+}
+
+const CameraMetadata *CameraDevice::captureTemplateManual()
+{
+	const CameraMetadata *requestTemplate = captureTemplatePreview();
+	if (!requestTemplate || !requestTemplate->isValid())
+		return nullptr;
+
+	uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;
+	const_cast<CameraMetadata *>(requestTemplate)
+		->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);
+
+	return requestTemplate;
+}
+
+/*
+ * Produce a metadata pack to be used as template for a capture request.
+ */
+const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)
+{
+	auto it = requestTemplates_.find(type);
+	if (it != requestTemplates_.end())
+		return it->second->get();
+
+	/* Use the capture intent matching the requested template type. */
+	const CameraMetadata *requestTemplate;
+	switch (type) {
+	case CAMERA3_TEMPLATE_PREVIEW:
+		requestTemplate = captureTemplatePreview();
+		break;
+	case CAMERA3_TEMPLATE_STILL_CAPTURE:
+		requestTemplate = captureTemplateStillCapture();
+		break;
+	case CAMERA3_TEMPLATE_VIDEO_RECORD:
+		requestTemplate = captureTemplateVideoRecord();
+		break;
+	case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
+		requestTemplate = captureTemplateVideoSnapshot();
+		break;
+	case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
+		requestTemplate = captureTemplateZSL();
+		break;
+	case CAMERA3_TEMPLATE_MANUAL:
+		requestTemplate = captureTemplateManual();
+		break;
+	default:
+		LOG(HAL, Error) << "Invalid template request type: " << type;
+		return nullptr;
+	}
+
+	if (!requestTemplate || !requestTemplate->isValid()) {
 		LOG(HAL, Error) << "Failed to construct request template";
 		delete requestTemplate;
 		return nullptr;
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index af1b58ab6b4e..7bf68e23f7fe 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -87,6 +87,13 @@ private:
 	std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,
 							  int64_t timestamp);
 
+	const CameraMetadata *captureTemplatePreview();
+	const CameraMetadata *captureTemplateStillCapture();
+	const CameraMetadata *captureTemplateVideoRecord();
+	const CameraMetadata *captureTemplateVideoSnapshot();
+	const CameraMetadata *captureTemplateZSL();
+	const CameraMetadata *captureTemplateManual();
+
 	unsigned int id_;
 	camera3_device_t camera3Device_;
 
-- 
2.27.0



More information about the libcamera-devel mailing list