[libcamera-devel,v4,3/3] android: camera_device: Report sensor physical size
diff mbox series

Message ID 20210412075702.9955-4-jacopo@jmondi.org
State Superseded
Headers show
Series
  • libcamera: Introduce sensor database
Related show

Commit Message

Jacopo Mondi April 12, 2021, 7:57 a.m. UTC
Calculate the value of the ANDROID_SENSOR_INFO_PHYSICAL_SIZE property
multiplying the number of sensor's readable pixels with the pixel unit
cell size if provided by the Camera.

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/android/camera_device.cpp | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 deletions(-)

Comments

Hirokazu Honda April 12, 2021, 1:08 p.m. UTC | #1
Hi Jacopo, thanks for the patch.

On Mon, Apr 12, 2021 at 4:56 PM Jacopo Mondi <jacopo@jmondi.org> wrote:
>
> Calculate the value of the ANDROID_SENSOR_INFO_PHYSICAL_SIZE property
> multiplying the number of sensor's readable pixels with the pixel unit
> cell size if provided by the Camera.
>
> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> ---
>  src/android/camera_device.cpp | 30 ++++++++++++++++--------------
>  1 file changed, 16 insertions(+), 14 deletions(-)
>
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index 89044efa7ebe..754ee00af472 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -9,6 +9,7 @@
>  #include "camera_ops.h"
>  #include "post_processor.h"
>
> +#include <array>
>  #include <cmath>
>  #include <fstream>
>  #include <sys/mman.h>
> @@ -1026,15 +1027,23 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
>         staticMetadata_->addEntry(ANDROID_JPEG_MAX_SIZE, &maxJpegBufferSize_, 1);
>
>         /* Sensor static metadata. */
> +       std::array<int32_t, 2> pixelArraySize;
>         {
> -               const Size &size =
> -                       properties.get(properties::PixelArraySize);
> -               std::vector<int32_t> data{
> -                       static_cast<int32_t>(size.width),
> -                       static_cast<int32_t>(size.height),
> -               };
> +               const Size &size = properties.get(properties::PixelArraySize);
> +               pixelArraySize[0] = size.width;
> +               pixelArraySize[1] = size.height;
>                 staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
> -                                         data.data(), data.size());
> +                                         pixelArraySize.data(), pixelArraySize.size());
> +       }
> +
> +       if (properties.contains(properties::UnitCellSize)) {
> +               const Size &cellSize = properties.get<Size>(properties::UnitCellSize);
> +               std::array<float, 2> physicalSize{
> +                       cellSize.width * pixelArraySize[0] / 1e6f,
> +                       cellSize.height * pixelArraySize[1] / 1e6f
> +               };
> +               staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
> +                                         physicalSize.data(), physicalSize.size());
>         }
>
>         {
> @@ -1082,13 +1091,6 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
>                                   testPatterModes.data(),
>                                   testPatterModes.size());
>
> -       std::vector<float> physicalSize = {
> -               2592, 1944,
> -       };
> -       staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
> -                                 physicalSize.data(),
> -                                 physicalSize.size());
> -
>         uint8_t timestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN;
>         staticMetadata_->addEntry(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE,
>                                   &timestampSource, 1);
> --
> 2.31.1
>

Reviewed-by: Hirokazu Honda <hiroh@chromium.org>

-Hiro

> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
Laurent Pinchart April 13, 2021, 1:49 a.m. UTC | #2
Hi Jacopo,

Thank you for the patch.

On Mon, Apr 12, 2021 at 09:57:02AM +0200, Jacopo Mondi wrote:
> Calculate the value of the ANDROID_SENSOR_INFO_PHYSICAL_SIZE property
> multiplying the number of sensor's readable pixels with the pixel unit
> cell size if provided by the Camera.
> 
> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>

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

> ---
>  src/android/camera_device.cpp | 30 ++++++++++++++++--------------
>  1 file changed, 16 insertions(+), 14 deletions(-)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index 89044efa7ebe..754ee00af472 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -9,6 +9,7 @@
>  #include "camera_ops.h"
>  #include "post_processor.h"
>  
> +#include <array>
>  #include <cmath>
>  #include <fstream>
>  #include <sys/mman.h>
> @@ -1026,15 +1027,23 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
>  	staticMetadata_->addEntry(ANDROID_JPEG_MAX_SIZE, &maxJpegBufferSize_, 1);
>  
>  	/* Sensor static metadata. */
> +	std::array<int32_t, 2> pixelArraySize;
>  	{
> -		const Size &size =
> -			properties.get(properties::PixelArraySize);
> -		std::vector<int32_t> data{
> -			static_cast<int32_t>(size.width),
> -			static_cast<int32_t>(size.height),
> -		};
> +		const Size &size = properties.get(properties::PixelArraySize);
> +		pixelArraySize[0] = size.width;
> +		pixelArraySize[1] = size.height;
>  		staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
> -					  data.data(), data.size());
> +					  pixelArraySize.data(), pixelArraySize.size());
> +	}
> +
> +	if (properties.contains(properties::UnitCellSize)) {
> +		const Size &cellSize = properties.get<Size>(properties::UnitCellSize);
> +		std::array<float, 2> physicalSize{
> +			cellSize.width * pixelArraySize[0] / 1e6f,
> +			cellSize.height * pixelArraySize[1] / 1e6f
> +		};
> +		staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
> +					  physicalSize.data(), physicalSize.size());
>  	}
>  
>  	{
> @@ -1082,13 +1091,6 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
>  				  testPatterModes.data(),
>  				  testPatterModes.size());
>  
> -	std::vector<float> physicalSize = {
> -		2592, 1944,
> -	};
> -	staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
> -				  physicalSize.data(),
> -				  physicalSize.size());
> -
>  	uint8_t timestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN;
>  	staticMetadata_->addEntry(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE,
>  				  &timestampSource, 1);

Patch
diff mbox series

diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 89044efa7ebe..754ee00af472 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -9,6 +9,7 @@ 
 #include "camera_ops.h"
 #include "post_processor.h"
 
+#include <array>
 #include <cmath>
 #include <fstream>
 #include <sys/mman.h>
@@ -1026,15 +1027,23 @@  const camera_metadata_t *CameraDevice::getStaticMetadata()
 	staticMetadata_->addEntry(ANDROID_JPEG_MAX_SIZE, &maxJpegBufferSize_, 1);
 
 	/* Sensor static metadata. */
+	std::array<int32_t, 2> pixelArraySize;
 	{
-		const Size &size =
-			properties.get(properties::PixelArraySize);
-		std::vector<int32_t> data{
-			static_cast<int32_t>(size.width),
-			static_cast<int32_t>(size.height),
-		};
+		const Size &size = properties.get(properties::PixelArraySize);
+		pixelArraySize[0] = size.width;
+		pixelArraySize[1] = size.height;
 		staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
-					  data.data(), data.size());
+					  pixelArraySize.data(), pixelArraySize.size());
+	}
+
+	if (properties.contains(properties::UnitCellSize)) {
+		const Size &cellSize = properties.get<Size>(properties::UnitCellSize);
+		std::array<float, 2> physicalSize{
+			cellSize.width * pixelArraySize[0] / 1e6f,
+			cellSize.height * pixelArraySize[1] / 1e6f
+		};
+		staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
+					  physicalSize.data(), physicalSize.size());
 	}
 
 	{
@@ -1082,13 +1091,6 @@  const camera_metadata_t *CameraDevice::getStaticMetadata()
 				  testPatterModes.data(),
 				  testPatterModes.size());
 
-	std::vector<float> physicalSize = {
-		2592, 1944,
-	};
-	staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
-				  physicalSize.data(),
-				  physicalSize.size());
-
 	uint8_t timestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN;
 	staticMetadata_->addEntry(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE,
 				  &timestampSource, 1);