[libcamera-devel] [PATCH 2/6] libcamera: formats: Add fields to info ease calculating bpl

Niklas Söderlund niklas.soderlund at ragnatech.se
Wed Jul 1 16:24:33 CEST 2020


Hi Paul and Laurent,

On 2020-07-01 15:32:58 +0300, Laurent Pinchart wrote:

<snip>

> > > >  	{ formats::MJPEG, {
> > > >  		.name = "MJPEG",
> > > >  		.format = formats::MJPEG,
> > > >  		.v4l2Format = V4L2PixelFormat(V4L2_PIX_FMT_MJPEG),
> > > > -		.bitsPerPixel = 0,
> > > > +		.bitsPerPixel = 16,
> > > >  		.colourEncoding = PixelFormatInfo::ColourEncodingYUV,
> > > >  		.packed = false,
> > > > +		.bytesPerGroup = 4,
> > > > +		.pixelsPerGroup = 2,
> > > 
> > > I'd rather set these fields to 0 for MJPEG instead of faking them. JPEG
> > > can store YUV 4:4:4, 4:2:2 or 4:2:0, so the values are not very
> > > relevant. Pipeline handlers that can produce MJPEG (that's just UVC)
> > > will need to set the frame size manually instead of using helpers.
> > 
> > Ah, okay. So... we'll still need check if format is MJPEG and then get
> > the parameters from the pipeline handler instead? I think that'll messy
> > up the code... But we want pipeline handlers to fill out the alignment
> > parameter anyway, so maybe the pipeline handlers could set format info
> > parameters?
> 
> They can't do that as the PixelFormatInfo instances are global (and
> const). Pipeline handlers already report the stride through
> StreamConfiguration::stride. I think we need an additional frameSize (or
> frameLength ? or another name ?) field in there to report the total
> size, which would be especially important for MJPEG.
> 
> Niklas, any opinion ?

Always :-)

First so that I understand you correctly frame{Size,Length} would be the 
frame size in bytes without or without stride taken into account? Or 
would it depend on the format? Which now that I write it sounds odd as 
stride hos no real meaning for MJPEG. Put it another way if I where to 
copy frame{Size,Length} bytes from the buffer I would be guaranteed to 
have all have image data, but I still need to depending on format deal 
with alignment or would it be the size of the data after alignment have 
been dealt with?

I see no problem with a pipeline controlling such fields in the same way 
stride is handled. It would be nice if somewhere in core a sanity check 
could be added. If we take stride as an example, if its initialize to 
zero and we expect the pipeline to updated it, it could be useful for 
some core code to check that its != 0 before handing the structure to an 
application. We can't guarantee the value is correct but we can warn if 
a pipeline have not attempted to update it.

My gut is telling me it's nicer to default to 0 then to the worst case 
since that will force pipelines to do the right thing :-)

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list