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

Kaaira Gupta kgupta at es.iitr.ac.in
Sat Mar 21 15:09:23 CET 2020


On Sat, Mar 21, 2020 at 01:02:46PM +0100, Jacopo Mondi wrote:
> 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 :).

Can you please elaborate it a bit more? I don't catch it when you say
that "which can't happen as it is caught above", what exactly are you
talking about? 
Sorry if this seems trivial but I am confused of what you are trying to
get me to do here.

thanks!

> 
> >
> > > 	- 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