[libcamera-devel] [PATCH v3 3/4] android: camera_device: Rework template generation
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Wed Sep 4 14:44:28 CEST 2019
Hi Jacopo,
Thank you for the patch.
On Wed, Sep 04, 2019 at 02:08:46PM +0200, Jacopo Mondi wrote:
> Rework the template generation procedure by adding two missing requested
> keys, fixing the capture intent to update it based on the requested
> template type, and removing static metadata keys which didn't belong
> there.
As this is temporary code there's no need to spend too much time on
this, but having split this in one change per patch would have made it
easier to review.
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
> src/android/camera_device.cpp | 123 +++++++---------------------------
> 1 file changed, 24 insertions(+), 99 deletions(-)
>
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index dee60e3d2931..eaa0e1de12c2 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -544,52 +544,29 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)
> return nullptr;
> }
>
> - if (requestTemplate_)
> + if (requestTemplate_) {
> + camera_metadata_entry_t captureIntentEntry;
> +
> + find_camera_metadata_entry(requestTemplate_,
> + ANDROID_CONTROL_CAPTURE_INTENT, &captureIntentEntry);
> + ret = update_camera_metadata_entry(requestTemplate_,
> + captureIntentEntry.index,
> + &captureIntent, 1, &captureIntentEntry);
> + METADATA_ASSERT(ret);
> +
> return requestTemplate_;
> + }
According to the HAL documentation,
* The HAL retains ownership of this structure, but the pointer to the
* structure must be valid until the device is closed. The framework and the
* HAL may not modify the buffer once it is returned by this call. The same
* buffer may be returned for subsequent calls for the same template, or for
* other templates.
So it looks like you will need to make turn the requestTemplate_ into a
map indexed by type :-S
>
> - /* \todo Use correct sizes */
> - #define REQUEST_TEMPLATE_ENTRIES 30
> - #define REQUEST_TEMPLATE_DATA 2048
> - requestTemplate_ = allocate_camera_metadata(REQUEST_TEMPLATE_ENTRIES,
> - REQUEST_TEMPLATE_DATA);
> + /*
> + * \todo Keep this in sync with the actual number of entries.
> + * Currently: 12 entries, 15 bytes
> + */
> + requestTemplate_ = allocate_camera_metadata(15, 20);
> if (!requestTemplate_) {
> LOG(HAL, Error) << "Failed to allocate template metadata";
> return nullptr;
> }
>
> - /* Set to 0 the number of 'processed and stalling' streams (ie JPEG). */
> - int32_t maxOutStream[] = { 0, 2, 0 };
> - ret = add_camera_metadata_entry(requestTemplate_,
> - ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
> - maxOutStream, 3);
> - METADATA_ASSERT(ret);
> -
> - uint8_t maxPipelineDepth = 5;
> - ret = add_camera_metadata_entry(requestTemplate_,
> - ANDROID_REQUEST_PIPELINE_MAX_DEPTH,
> - &maxPipelineDepth, 1);
> - METADATA_ASSERT(ret);
> -
> - int32_t inputStreams = 0;
> - ret = add_camera_metadata_entry(requestTemplate_,
> - ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS,
> - &inputStreams, 1);
> - METADATA_ASSERT(ret);
> -
> - int32_t partialResultCount = 1;
> - ret = add_camera_metadata_entry(requestTemplate_,
> - ANDROID_REQUEST_PARTIAL_RESULT_COUNT,
> - &partialResultCount, 1);
> - METADATA_ASSERT(ret);
> -
> - uint8_t availableCapabilities[] = {
> - ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,
> - };
> - ret = add_camera_metadata_entry(requestTemplate_,
> - ANDROID_REQUEST_AVAILABLE_CAPABILITIES,
> - availableCapabilities, 1);
> - METADATA_ASSERT(ret);
> -
> uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
> ret = add_camera_metadata_entry(requestTemplate_,
> ANDROID_CONTROL_AE_MODE,
> @@ -632,12 +609,6 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)
> &awbLock, 1);
> METADATA_ASSERT(ret);
>
> - uint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE;
> - ret = add_camera_metadata_entry(requestTemplate_,
> - ANDROID_CONTROL_AWB_LOCK_AVAILABLE,
> - &awbLockAvailable, 1);
> - METADATA_ASSERT(ret);
> -
> uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
> ret = add_camera_metadata_entry(requestTemplate_,
> ANDROID_FLASH_MODE,
> @@ -650,67 +621,21 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)
> &faceDetectMode, 1);
> METADATA_ASSERT(ret);
>
> + uint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_OFF;
> ret = add_camera_metadata_entry(requestTemplate_,
> - ANDROID_CONTROL_CAPTURE_INTENT,
> - &captureIntent, 1);
> + ANDROID_NOISE_REDUCTION_MODE, &noiseReduction, 1);
> METADATA_ASSERT(ret);
>
> - /*
> - * This is quite hard to list at the moment wihtout knowing what
> - * we could control.
> - *
> - * For now, just list in the available Request keys and in the available
> - * result keys the control and reporting of the AE algorithm.
> - */
> - std::vector<int32_t> availableRequestKeys = {
> - ANDROID_CONTROL_AE_MODE,
> - ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
> - ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
> - ANDROID_CONTROL_AE_LOCK,
> - ANDROID_CONTROL_AF_TRIGGER,
> - ANDROID_CONTROL_AWB_MODE,
> - ANDROID_CONTROL_AWB_LOCK,
> - ANDROID_CONTROL_AWB_LOCK_AVAILABLE,
> - ANDROID_CONTROL_CAPTURE_INTENT,
> - ANDROID_FLASH_MODE,
> - ANDROID_STATISTICS_FACE_DETECT_MODE,
> - };
> -
> + uint8_t aberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;
> ret = add_camera_metadata_entry(requestTemplate_,
> - ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS,
> - availableRequestKeys.data(),
> - availableRequestKeys.size());
> - METADATA_ASSERT(ret);
> -
> - std::vector<int32_t> availableResultKeys = {
> - ANDROID_CONTROL_AE_MODE,
> - ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
> - ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
> - ANDROID_CONTROL_AE_LOCK,
> - ANDROID_CONTROL_AF_TRIGGER,
> - ANDROID_CONTROL_AWB_MODE,
> - ANDROID_CONTROL_AWB_LOCK,
> - ANDROID_CONTROL_AWB_LOCK_AVAILABLE,
> - ANDROID_CONTROL_CAPTURE_INTENT,
> - ANDROID_FLASH_MODE,
> - ANDROID_STATISTICS_FACE_DETECT_MODE,
> - };
> - ret = add_camera_metadata_entry(requestTemplate_,
> - ANDROID_REQUEST_AVAILABLE_RESULT_KEYS,
> - availableResultKeys.data(),
> - availableResultKeys.size());
> + ANDROID_COLOR_CORRECTION_ABERRATION_MODE,
> + &aberrationMode, 1);
> METADATA_ASSERT(ret);
>
> - /*
> - * \todo The available characteristics are be the tags reported
> - * as part of the static metadata reported at hal_get_camera_info()
> - * time. As of now, report an empty list.
> - */
> - std::vector<int32_t> availableCharacteristicsKeys = {};
> + /* Use the capture matching the requested template type. */
> ret = add_camera_metadata_entry(requestTemplate_,
> - ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,
> - availableCharacteristicsKeys.data(),
> - availableCharacteristicsKeys.size());
> + ANDROID_CONTROL_CAPTURE_INTENT,
> + &captureIntent, 1);
> METADATA_ASSERT(ret);
>
> return requestTemplate_;
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list