[libcamera-devel] [PATCH v3 2/8] android: camera_device: Calculate metadata size

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sat Jun 6 02:03:44 CEST 2020


Hi Jacopo,

Thank you for the patch.

On Fri, Jun 05, 2020 at 04:09:56PM +0200, Jacopo Mondi wrote:
> As we move to have more and more dynamically generated static metadata
> entries, the size of the metadata buffer has to be calculated
> dynamically inspecting the information collected from the camera.
> 
> Provide a method to perform metadata buffers size calculation and
> use it when generating camera static metadata.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> ---
>  src/android/camera_device.cpp | 34 ++++++++++++++++++++++++++++------
>  src/android/camera_device.h   |  2 ++
>  2 files changed, 30 insertions(+), 6 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index cb9e4a6bc15b..c65295a32f3f 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -8,6 +8,7 @@
>  #include "camera_device.h"
>  #include "camera_ops.h"
>  
> +#include <tuple>
>  #include <vector>
>  
>  #include <libcamera/controls.h>
> @@ -368,6 +369,29 @@ void CameraDevice::setCallbacks(const camera3_callback_ops_t *callbacks)
>  	callbacks_ = callbacks;
>  }
>  
> +std::tuple<uint32_t, uint32_t> CameraDevice::calculateStaticMetadataSize()
> +{
> +	/*
> +	 * \todo Keep this in sync with the actual number of entries.
> +	 * Currently: 50 entries, 647 bytes of static metadata
> +	 */
> +	uint32_t numEntries = 50;
> +	uint32_t byteSize = 647;
> +
> +	/*
> +	 * Calculate space occupation in bytes for dynamically built metadata
> +	 * entries.
> +	 *
> +	 * Each stream configuration entry requires 52 bytes:
> +	 * 4 32bits integers for ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS
> +	 * 1 32bits integer for ANDROID_SCALER_AVAILABLE_FORMATS
> +	 * 4 64bits integers for ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS
> +	 */
> +	byteSize += streamConfigurations_.size() * 52;
> +
> +	return { numEntries, byteSize };
> +}
> +
>  /*
>   * Return static information for the camera.
>   */
> @@ -381,12 +405,10 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
>  	 * example application, but a real camera implementation will require
>  	 * more.
>  	 */
> -
> -	/*
> -	 * \todo Keep this in sync with the actual number of entries.
> -	 * Currently: 50 entries, 666 bytes
> -	 */
> -	staticMetadata_ = new CameraMetadata(50, 700);
> +	uint32_t numEntries;
> +	uint32_t byteSize;
> +	std::tie(numEntries, byteSize) = calculateStaticMetadataSize();
> +	staticMetadata_ = new CameraMetadata(numEntries, byteSize);
>  	if (!staticMetadata_->isValid()) {
>  		LOG(HAL, Error) << "Failed to allocate static metadata";
>  		delete staticMetadata_;
> diff --git a/src/android/camera_device.h b/src/android/camera_device.h
> index 4e8911da5770..ed11410a5577 100644
> --- a/src/android/camera_device.h
> +++ b/src/android/camera_device.h
> @@ -9,6 +9,7 @@
>  
>  #include <map>
>  #include <memory>
> +#include <tuple>
>  #include <vector>
>  
>  #include <hardware/camera3.h>
> @@ -68,6 +69,7 @@ private:
>  	};
>  
>  	int initializeStreamConfigurations();
> +	std::tuple<uint32_t, uint32_t> calculateStaticMetadataSize();
>  	void notifyShutter(uint32_t frameNumber, uint64_t timestamp);
>  	void notifyError(uint32_t frameNumber, camera3_stream_t *stream);
>  	std::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list