[libcamera-devel] [PATCH v2 5/6] android: camera_device: Break-out request template
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sat Jul 25 18:31:55 CEST 2020
Hi Jacopo,
Thank you for the patch.
On Sat, Jul 25, 2020 at 04:40:57PM +0200, Jacopo Mondi wrote:
> 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.
>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> src/android/camera_device.cpp | 82 ++++++++++++++++++++---------------
> src/android/camera_device.h | 1 +
> 2 files changed, 47 insertions(+), 36 deletions(-)
>
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index 48f8090a93db..b294b88367d4 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -821,48 +821,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;
> }
> @@ -911,15 +877,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 af1b58ab6b4e..5a52ad8f741c 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);
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list