[libcamera-devel] [PATCH LIBCAMERA WIP] libcamera: rkisp1: Use parametered constructor instead of default

Jacopo Mondi jacopo at jmondi.org
Sat Mar 21 13:02:46 CET 2020


Hi again,

On Sat, Mar 21, 2020 at 12:56:12PM +0100, Jacopo Mondi wrote:
> Hi Kaaira,
>
> On Sat, Mar 21, 2020 at 03:20:20AM +0530, Kaaira Gupta wrote:
> > Use of default constructor StreamConfiguration() in deprecated, hence
> > make it private. Make Stream class a friend of StreamConfiguration as it
> > uses the default constructor.
> >
> > Replace default constructor StreamConfiguration() by it's parametered
>
> s/parametered/parametrized ?
>
> > counterpart by using StreamFormats in generateConfiguration() in rkisp1
> >
> > Signed-off-by: Kaaira Gupta <kgupta at es.iitr.ac.in>
> > ---
> > WIP:
> > 	- It fails to build as other pipelines still use default
> > 	  constructor.
> > 	- Even rkisp1 fails as it uses default constructor in its
> > 	  validate() function.
>
> The compiler points to
>
>                 config_.resize(1);
>                         ^
> ../include/libcamera/stream.h:54:2: note: declared private here
>         StreamConfiguration();
>
> The std::vector::resize() documentation says
> If the current size is greater than count, the container is reduced to its first count elements.
>
> So I guess the compiler is just worried about the possibility that the
> current size is smaller than the resize(n) argument and a new instance
> should be created, so it would need to access the default constructor.
>
> The most trivial option here is to manually delete the exceeding
> instances if vector.size() > 1 and create a new one using the
> parametrized constructor.

Sorry this is confused.

Delete the exceeding entries if the size of the vector is larger and
create a new instance manually if the vector is empty (which can't
happen as it is caught above :).

>
> > 	- I have taken care of generateConfiguration() only.
> >
> >  include/libcamera/stream.h               |  4 ++-
> >  src/libcamera/pipeline/rkisp1/rkisp1.cpp | 37 ++++++++++++++++--------
> >  src/libcamera/stream.cpp                 |  9 ------
> >  3 files changed, 28 insertions(+), 22 deletions(-)
> >
> > diff --git a/include/libcamera/stream.h b/include/libcamera/stream.h
> > index b1441f8..c19aed6 100644
> > --- a/include/libcamera/stream.h
> > +++ b/include/libcamera/stream.h
> > @@ -37,7 +37,6 @@ private:
> >  };
> >
> >  struct StreamConfiguration {
> > -	StreamConfiguration();
> >  	StreamConfiguration(const StreamFormats &formats);
> >
> >  	PixelFormat pixelFormat;
> > @@ -52,8 +51,11 @@ struct StreamConfiguration {
> >  	std::string toString() const;
> >
> >  private:
> > +	StreamConfiguration();
> >  	Stream *stream_;
> >  	StreamFormats formats_;
> > +
> > +	friend class Stream;
> >  };
> >
> >  enum StreamRole {
> > diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > index 2f909ce..bf97b53 100644
> > --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> > @@ -218,6 +218,21 @@ private:
> >  	Camera *activeCamera_;
> >  };
> >
> > +namespace {
> > +
> > +static const std::array<PixelFormat, 8> formats{
> > +	PixelFormat(DRM_FORMAT_YUYV),
> > +	PixelFormat(DRM_FORMAT_YVYU),
> > +	PixelFormat(DRM_FORMAT_VYUY),
> > +	PixelFormat(DRM_FORMAT_NV16),
> > +	PixelFormat(DRM_FORMAT_NV61),
> > +	PixelFormat(DRM_FORMAT_NV21),
> > +	PixelFormat(DRM_FORMAT_NV12),
> > +	/* \todo Add support for 8-bit greyscale to DRM formats */
> > +};
> > +
> > +} /* namespace */
> > +
> >  RkISP1Frames::RkISP1Frames(PipelineHandler *pipe)
> >  	: pipe_(dynamic_cast<PipelineHandlerRkISP1 *>(pipe))
> >  {
> > @@ -430,17 +445,6 @@ RkISP1CameraConfiguration::RkISP1CameraConfiguration(Camera *camera,
> >
> >  CameraConfiguration::Status RkISP1CameraConfiguration::validate()
> >  {
> > -	static const std::array<PixelFormat, 8> formats{
> > -		PixelFormat(DRM_FORMAT_YUYV),
> > -		PixelFormat(DRM_FORMAT_YVYU),
> > -		PixelFormat(DRM_FORMAT_VYUY),
> > -		PixelFormat(DRM_FORMAT_NV16),
> > -		PixelFormat(DRM_FORMAT_NV61),
> > -		PixelFormat(DRM_FORMAT_NV21),
> > -		PixelFormat(DRM_FORMAT_NV12),
> > -		/* \todo Add support for 8-bit greyscale to DRM formats */
> > -	};
> > -
> >  	const CameraSensor *sensor = data_->sensor_;
> >  	Status status = Valid;
> >
> > @@ -537,7 +541,16 @@ CameraConfiguration *PipelineHandlerRkISP1::generateConfiguration(Camera *camera
> >  	if (roles.empty())
> >  		return config;
> >
> > -	StreamConfiguration cfg{};
> > +	std::map<PixelFormat, std::vector<SizeRange>> pixelformats;
> > +
> > +	for (PixelFormat pixelformat : formats) {
> > +		std::vector<SizeRange> sizes{
> > +			SizeRange{ { 32, 16 }, { 4416, 3312 } }
>
> I might have missed where these sizes come from.
>
> > +		};
> > +		pixelformats[pixelformat] = sizes;
>
> So you have an hardcoded list of PixelFormats in the pipeline handler.
> And you got a map of V4L2PixelFormats from the video device.
> What I would do is going through all the PixelFormats, get their
> V4L2PixelFormat counterpart, access the map using that as key to
> retrive the size vector, and associated them with the PixelFormat you
> started with.
>
> I don't think it is necessary to make sure all the V4L2PixelFormat
> obtained from the PixelFormat array are valid, as the pipeline handler
> should know that.
>
> Thanks
>   j
>
>
> > +	}
> > +	StreamFormats format(pixelformats);
> > +	StreamConfiguration cfg(format);
> >  	cfg.pixelFormat = PixelFormat(DRM_FORMAT_NV12);
> >  	cfg.size = data->sensor_->resolution();
> >
> > diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp
> > index ea3d214..96b3dc5 100644
> > --- a/src/libcamera/stream.cpp
> > +++ b/src/libcamera/stream.cpp
> > @@ -274,15 +274,6 @@ SizeRange StreamFormats::range(const PixelFormat &pixelformat) const
> >   * configured for a single video stream.
> >   */
> >
> > -/**
> > - * \todo This method is deprecated and should be removed once all pipeline
> > - * handlers provied StreamFormats.
> > - */
> > -StreamConfiguration::StreamConfiguration()
> > -	: pixelFormat(0), stream_(nullptr)
> > -{
> > -}
> > -
> >  /**
> >   * \brief Construct a configuration with stream formats
> >   */
> > --
> > 2.17.1
> >
> > _______________________________________________
> > libcamera-devel mailing list
> > libcamera-devel at lists.libcamera.org
> > https://lists.libcamera.org/listinfo/libcamera-devel
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel


More information about the libcamera-devel mailing list