[libcamera-devel] [PATCH 07/10] android: camera_device: Handle PIPELINE_MAX_DEPTH

Kieran Bingham kieran.bingham at ideasonboard.com
Fri Oct 9 14:44:19 CEST 2020


Hi Jacopo,

On 09/10/2020 13:20, Jacopo Mondi wrote:
> Register the ANDROID_REQUEST_PIPELINE_MAX_DEPTH static property
> inspecting what the value returned by the pipeline handler
> through the properties::draft::PipelineMaxDepth libcamera property.
> 
> Report the result metadata ANDROID_REQUEST_PIPELINE_DEPTH that
> reports the processing stage a frame went through by inspecting the
> controls::draft::PipelineDepth libcamera control reported in the
> completed Request.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> ---
>  src/android/camera_device.cpp | 28 ++++++++++++++++++++++------
>  src/android/camera_device.h   |  3 ++-
>  2 files changed, 24 insertions(+), 7 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index 0a94c1ae17ac..bccec358ea13 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -12,6 +12,7 @@
>  #include <tuple>
>  #include <vector>
>  
> +#include <libcamera/control_ids.h>
>  #include <libcamera/controls.h>
>  #include <libcamera/formats.h>
>  #include <libcamera/property_ids.h>
> @@ -576,6 +577,8 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
>  		return nullptr;
>  	}
>  
> +	const ControlList &cameraProperties = camera_->properties();
> +
>  	/* Color correction static metadata. */
>  	std::vector<uint8_t> aberrationModes = {
>  		ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF,
> @@ -867,9 +870,12 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
>  	staticMetadata_->addEntry(ANDROID_REQUEST_PARTIAL_RESULT_COUNT,
>  				  &partialResultCount, 1);
>  
> -	uint8_t maxPipelineDepth = 2;
> -	staticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,
> -				  &maxPipelineDepth, 1);
> +	if (cameraProperties.contains(properties::draft::PipelineMaxDepth)) {
> +		uint8_t maxPipelineDepth =
> +			cameraProperties.get<int32_t>(properties::draft::PipelineMaxDepth);
> +		staticMetadata_->addEntry(ANDROID_REQUEST_PIPELINE_MAX_DEPTH,
> +					  &maxPipelineDepth, 1);
> +	}

I assume if the pipeline handler doesn't specify a max depth, and one
doesn't get added here, that's not a problem for android.

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

>  
>  	/* LIMITED does not support reprocessing. */
>  	uint32_t maxNumInputStreams = 0;
> @@ -1480,7 +1486,8 @@ void CameraDevice::requestComplete(Request *request)
>  	 * pipeline handlers) timestamp in the Request itself.
>  	 */
>  	FrameBuffer *buffer = buffers.begin()->second;
> -	resultMetadata = getResultMetadata(descriptor->frameNumber,
> +	resultMetadata = getResultMetadata(request->metadata(),
> +					   descriptor->frameNumber,
>  					   buffer->metadata().timestamp);
>  
>  	/* Handle any JPEG compression. */
> @@ -1600,7 +1607,8 @@ void CameraDevice::notifyError(uint32_t frameNumber, camera3_stream_t *stream)
>   * Produce a set of fixed result metadata.
>   */
>  std::unique_ptr<CameraMetadata>
> -CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,
> +CameraDevice::getResultMetadata(ControlList &metadata,
> +				[[maybe_unused]] int frame_number,
>  				int64_t timestamp)
>  {
>  	/*
> @@ -1608,7 +1616,7 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,
>  	 * Currently: 18 entries, 62 bytes
>  	 */
>  	std::unique_ptr<CameraMetadata> resultMetadata =
> -		std::make_unique<CameraMetadata>(18, 62);
> +		std::make_unique<CameraMetadata>(19, 63);
>  	if (!resultMetadata->isValid()) {
>  		LOG(HAL, Error) << "Failed to allocate static metadata";
>  		return nullptr;
> @@ -1658,6 +1666,14 @@ CameraDevice::getResultMetadata([[maybe_unused]] int frame_number,
>  	resultMetadata->addEntry(ANDROID_STATISTICS_SCENE_FLICKER,
>  				 &scene_flicker, 1);
>  
> +	/* Add metadata tags reported by libcamera. */
> +	if (metadata.contains(controls::draft::PipelineDepth)) {
> +		uint8_t pipeline_depth =
> +			metadata.get<int32_t>(controls::draft::PipelineDepth);
> +		resultMetadata->addEntry(ANDROID_REQUEST_PIPELINE_DEPTH,
> +					 &pipeline_depth, 1);
> +	}
> +
>  	/*
>  	 * Return the result metadata pack even is not valid: get() will return
>  	 * nullptr.
> diff --git a/src/android/camera_device.h b/src/android/camera_device.h
> index 777d1a35e801..8cf1006c0840 100644
> --- a/src/android/camera_device.h
> +++ b/src/android/camera_device.h
> @@ -102,7 +102,8 @@ private:
>  	void notifyError(uint32_t frameNumber, camera3_stream_t *stream);
>  	CameraMetadata *requestTemplatePreview();
>  	libcamera::PixelFormat toPixelFormat(int format);
> -	std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,
> +	std::unique_ptr<CameraMetadata> getResultMetadata(libcamera::ControlList &metadata,
> +							  int frame_number,
>  							  int64_t timestamp);
>  
>  	unsigned int id_;
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list