summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2020-07-24 15:47:50 +0200
committerJacopo Mondi <jacopo@jmondi.org>2020-08-05 14:33:52 +0200
commit8a02d4451cebeea98ed31447b22e603176bca385 (patch)
treeba019712eaada61c34e3d635a65239e44ecfd32e /src
parent29b59a91469a5aaeab792799dfa303fc753be956 (diff)
android: camera_device: Break-out request template
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 a dedicated function that supports the PREVIEW use case. All the other template types use the requestTemplatePreview() function and just update the capture intent property. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src')
-rw-r--r--src/android/camera_device.cpp82
-rw-r--r--src/android/camera_device.h1
2 files changed, 47 insertions, 36 deletions
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index b5206fd6..7b89766c 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -870,48 +870,14 @@ 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)
+CameraMetadata *CameraDevice::requestTemplatePreview()
{
- 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;
return nullptr;
}
@@ -960,15 +926,59 @@ 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;
+}
+
+/*
+ * 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. */
+ CameraMetadata *requestTemplate;
+ 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;
+ }
+
+ requestTemplate = requestTemplatePreview();
+ if (!requestTemplate || !requestTemplate->isValid()) {
LOG(HAL, Error) << "Failed to construct request template";
delete requestTemplate;
return nullptr;
}
+ requestTemplate->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT,
+ &captureIntent, 1);
+
requestTemplates_[type] = requestTemplate;
return requestTemplate->get();
}
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index fd2eeff1..4e5fb98c 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -83,6 +83,7 @@ private:
libcamera::FrameBuffer *createFrameBuffer(const buffer_handle_t camera3buffer);
void notifyShutter(uint32_t frameNumber, uint64_t timestamp);
void notifyError(uint32_t frameNumber, camera3_stream_t *stream);
+ CameraMetadata *requestTemplatePreview();
libcamera::PixelFormat toPixelFormat(int format);
std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,
int64_t timestamp);