[libcamera-devel,v5,09/19] libcamera: ipu3: Set stream configuration from sensor

Message ID 20190326083902.26121-10-jacopo@jmondi.org
State Superseded
Headers show
Series
  • libcamera: ipu3: Add ImgU support
Related show

Commit Message

Jacopo Mondi March 26, 2019, 8:38 a.m. UTC
Inspect all image sizes provided by the sensor and select the
biggest of them, associated with an image format code supported by the
CIO2 unit.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp | 35 +++++++++++++---------------
 1 file changed, 16 insertions(+), 19 deletions(-)

Comments

Laurent Pinchart April 2, 2019, 7:32 a.m. UTC | #1
Hi Jacopo,

Thank you for the patch.

On Tue, Mar 26, 2019 at 09:38:52AM +0100, Jacopo Mondi wrote:
> Inspect all image sizes provided by the sensor and select the
> biggest of them, associated with an image format code supported by the
> CIO2 unit.

This isn't correct anymore, you don't inspect all sizes here, you use
the cached maximum size.

"While at it, replace the hardcoded numerical value for the number of
buffers with a named constexpr."

> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> ---
>  src/libcamera/pipeline/ipu3/ipu3.cpp | 35 +++++++++++++---------------
>  1 file changed, 16 insertions(+), 19 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index d42c81273cc6..04cd02653711 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -5,6 +5,7 @@
>   * ipu3.cpp - Pipeline handler for Intel IPU3
>   */
>  
> +#include <iomanip>
>  #include <memory>
>  #include <vector>
>  
> @@ -94,6 +95,8 @@ private:
>  		std::pair<unsigned int, SizeRange> maxSizes_;
>  	};
>  
> +	static constexpr unsigned int IPU3_BUFFER_COUNT = 4;
> +
>  	IPU3CameraData *cameraData(const Camera *camera)
>  	{
>  		return static_cast<IPU3CameraData *>(
> @@ -124,26 +127,20 @@ std::map<Stream *, StreamConfiguration>
>  PipelineHandlerIPU3::streamConfiguration(Camera *camera,
>  					 std::set<Stream *> &streams)
>  {
> -	IPU3CameraData *data = cameraData(camera);
>  	std::map<Stream *, StreamConfiguration> configs;
> -	V4L2SubdeviceFormat format = {};
> -
> -	/*
> -	 * FIXME: As of now, return the image format reported by the sensor.
> -	 * In future good defaults should be provided for each stream.
> -	 */
> -	if (data->sensor_->getFormat(0, &format)) {
> -		LOG(IPU3, Error) << "Failed to create stream configurations";
> -		return configs;
> -	}
> -
> -	StreamConfiguration config = {};
> -	config.width = format.width;
> -	config.height = format.height;
> -	config.pixelFormat = V4L2_PIX_FMT_IPU3_SGRBG10;
> -	config.bufferCount = 4;
> -
> -	configs[&data->stream_] = config;
> +	IPU3CameraData *data = cameraData(camera);

I'd keep this above the configs variable declaration to make the diff
more readable (unless you think there's an advantage in this new order).

> +	StreamConfiguration *config = &configs[&data->stream_];
> +	SizeRange &maxRange = data->maxSizes_.second;
> +
> +	config->width = maxRange.maxWidth;
> +	config->height = maxRange.maxHeight;
> +	config->pixelFormat = data->maxSizes_.first;
> +	config->bufferCount = IPU3_BUFFER_COUNT;
> +
> +	LOG(IPU3, Debug)
> +		<< "Stream format set to: " << config->width << "x"

s/to:/to/

> +		<< config->height << "-0x" << std::hex << std::setfill('0')
> +		<< std::setw(4) << config->pixelFormat;

Something to keep in mind for later, adding a Format class may be a good
idea, to store pixel format, width and height. We should then give it a
toString() method. Or do you think it would make sense to add a
toString() method to StreamConfiguration and use it here ?

>  	return configs;
>  }
Jacopo Mondi April 2, 2019, 8:28 a.m. UTC | #2
Hi Laurent,

On Tue, Apr 02, 2019 at 10:32:58AM +0300, Laurent Pinchart wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Tue, Mar 26, 2019 at 09:38:52AM +0100, Jacopo Mondi wrote:
> > Inspect all image sizes provided by the sensor and select the
> > biggest of them, associated with an image format code supported by the
> > CIO2 unit.
>
> This isn't correct anymore, you don't inspect all sizes here, you use
> the cached maximum size.
>
> "While at it, replace the hardcoded numerical value for the number of
> buffers with a named constexpr."
>
> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
> > ---
> >  src/libcamera/pipeline/ipu3/ipu3.cpp | 35 +++++++++++++---------------
> >  1 file changed, 16 insertions(+), 19 deletions(-)
> >
> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > index d42c81273cc6..04cd02653711 100644
> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> > @@ -5,6 +5,7 @@
> >   * ipu3.cpp - Pipeline handler for Intel IPU3
> >   */
> >
> > +#include <iomanip>
> >  #include <memory>
> >  #include <vector>
> >
> > @@ -94,6 +95,8 @@ private:
> >  		std::pair<unsigned int, SizeRange> maxSizes_;
> >  	};
> >
> > +	static constexpr unsigned int IPU3_BUFFER_COUNT = 4;
> > +
> >  	IPU3CameraData *cameraData(const Camera *camera)
> >  	{
> >  		return static_cast<IPU3CameraData *>(
> > @@ -124,26 +127,20 @@ std::map<Stream *, StreamConfiguration>
> >  PipelineHandlerIPU3::streamConfiguration(Camera *camera,
> >  					 std::set<Stream *> &streams)
> >  {
> > -	IPU3CameraData *data = cameraData(camera);
> >  	std::map<Stream *, StreamConfiguration> configs;
> > -	V4L2SubdeviceFormat format = {};
> > -
> > -	/*
> > -	 * FIXME: As of now, return the image format reported by the sensor.
> > -	 * In future good defaults should be provided for each stream.
> > -	 */
> > -	if (data->sensor_->getFormat(0, &format)) {
> > -		LOG(IPU3, Error) << "Failed to create stream configurations";
> > -		return configs;
> > -	}
> > -
> > -	StreamConfiguration config = {};
> > -	config.width = format.width;
> > -	config.height = format.height;
> > -	config.pixelFormat = V4L2_PIX_FMT_IPU3_SGRBG10;
> > -	config.bufferCount = 4;
> > -
> > -	configs[&data->stream_] = config;
> > +	IPU3CameraData *data = cameraData(camera);
>
> I'd keep this above the configs variable declaration to make the diff
> more readable (unless you think there's an advantage in this new order).
>

Yes, the declaration order follows reverse line lenght ordering. Diff
might be more confused a little, but what we care about is the end
result, isn't it?

> > +	StreamConfiguration *config = &configs[&data->stream_];
> > +	SizeRange &maxRange = data->maxSizes_.second;
> > +
> > +	config->width = maxRange.maxWidth;
> > +	config->height = maxRange.maxHeight;
> > +	config->pixelFormat = data->maxSizes_.first;
> > +	config->bufferCount = IPU3_BUFFER_COUNT;
> > +
> > +	LOG(IPU3, Debug)
> > +		<< "Stream format set to: " << config->width << "x"
>
> s/to:/to/
>
> > +		<< config->height << "-0x" << std::hex << std::setfill('0')
> > +		<< std::setw(4) << config->pixelFormat;
>
> Something to keep in mind for later, adding a Format class may be a good
> idea, to store pixel format, width and height. We should then give it a
> toString() method. Or do you think it would make sense to add a
> toString() method to StreamConfiguration and use it here ?

Time, and more users, will tell. We'll need a Format class for sure,
we could add pretty printing there.

Thanks
  j
>
> >  	return configs;
> >  }
>
> --
> Regards,
>
> Laurent Pinchart

Patch

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index d42c81273cc6..04cd02653711 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -5,6 +5,7 @@ 
  * ipu3.cpp - Pipeline handler for Intel IPU3
  */
 
+#include <iomanip>
 #include <memory>
 #include <vector>
 
@@ -94,6 +95,8 @@  private:
 		std::pair<unsigned int, SizeRange> maxSizes_;
 	};
 
+	static constexpr unsigned int IPU3_BUFFER_COUNT = 4;
+
 	IPU3CameraData *cameraData(const Camera *camera)
 	{
 		return static_cast<IPU3CameraData *>(
@@ -124,26 +127,20 @@  std::map<Stream *, StreamConfiguration>
 PipelineHandlerIPU3::streamConfiguration(Camera *camera,
 					 std::set<Stream *> &streams)
 {
-	IPU3CameraData *data = cameraData(camera);
 	std::map<Stream *, StreamConfiguration> configs;
-	V4L2SubdeviceFormat format = {};
-
-	/*
-	 * FIXME: As of now, return the image format reported by the sensor.
-	 * In future good defaults should be provided for each stream.
-	 */
-	if (data->sensor_->getFormat(0, &format)) {
-		LOG(IPU3, Error) << "Failed to create stream configurations";
-		return configs;
-	}
-
-	StreamConfiguration config = {};
-	config.width = format.width;
-	config.height = format.height;
-	config.pixelFormat = V4L2_PIX_FMT_IPU3_SGRBG10;
-	config.bufferCount = 4;
-
-	configs[&data->stream_] = config;
+	IPU3CameraData *data = cameraData(camera);
+	StreamConfiguration *config = &configs[&data->stream_];
+	SizeRange &maxRange = data->maxSizes_.second;
+
+	config->width = maxRange.maxWidth;
+	config->height = maxRange.maxHeight;
+	config->pixelFormat = data->maxSizes_.first;
+	config->bufferCount = IPU3_BUFFER_COUNT;
+
+	LOG(IPU3, Debug)
+		<< "Stream format set to: " << config->width << "x"
+		<< config->height << "-0x" << std::hex << std::setfill('0')
+		<< std::setw(4) << config->pixelFormat;
 
 	return configs;
 }