Re: [RFC] [media] v4l2: add V4L2 pixel format array and helper functions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Monday 25 August 2014 14:50:53 Philipp Zabel wrote:
> Hi Hans,
> 
> Am Montag, den 25.08.2014, 13:38 +0200 schrieb Hans Verkuil:
> > Hi Philipp,
> > 
> > I have to think a bit more about the format names, but in the meantime I
> > have
> > two other suggestions:
> Thank you, I haven't spent much thought about the actual descriptions
> yet. Most are just transcribed from the comments in videodev2.h without
> looking at the names used in the drivers.
> 
> [...]
> 
> > > +/**
> > > + * struct v4l2_pixfmt - internal V4L2 pixel format description
> > > + * @name: format description to be returned by enum_fmt
> > > + * @pixelformat: v4l2 pixel format fourcc
> > > + * @bpp_line: bits per pixel, averaged over a line (of the first plane
> > > + *            for planar formats), used to calculate bytesperline
> > > + *            Zero for compressed and macroblock tiled formats.
> > > + * @bpp_image: bits per pixel, averaged over the whole image. This is
> > > used to
> > > + *             calculate sizeimage for uncompressed formats.
> > > + *             Zero for compressed formats.
> > 
> > I would add a 'planes' field as well for use with formats that use
> > non-contiguous planes.
> 
> Good point, I'll add that.
> 
> [...]
> 
> > > +static inline unsigned int v4l2_bytesperline(const struct v4l2_pixfmt
> > > *fmt, +					     unsigned int width)
> > > +{
> > > +	return width * fmt->bpp_line / 8;
> > 
> > Round up: return (width * fmt->bpp_line + 7) / 8;
> 
> Right, I should use DIV_ROUND_UP(width * fmt->bpp_line, 8) here.
> 
> > > +}
> > > +
> > > +static inline unsigned int v4l2_sizeimage(const struct v4l2_pixfmt
> > > *fmt,
> > > +					  unsigned int width,
> > > +					  unsigned int height)
> > > +{
> > > +	return width * height * fmt->bpp_image / 8;
> > 
> > Ditto: return height * v4l2_bytesperline(fmt, width);
> 
> I can't use v4l2_bytesperline because that might be zero for macroblock
> tiled formats and uses the wrong bpp value for planar formats with
> subsampled chroma.
> 
> This nearly works:
>     return height * DIV_ROUND_UP(width * fmt->bpp_image, 8)

Isn't that exactly height * v4l2_bytesperline(fmt, width) ?

> For the planar 4:2:0 subsampled formats and Y41P (bpp_image == 12),
> width has to be even, so that is ok.
> Most other formats have a bpp_image that is divisible by 8, but there
> are the 4:1:0 subsampled formats (bpp_image == 9). Those would round up
> width to a multiple of eight, even though it only has to be a multiple
> of four. I'd fall back to:
> 
>     if (fmt->bpp_image == fmt->bpp_line) {
>         return height * DIV_ROUND_UP(width * fmt->bpp_image, 8);
>     } else {
>         /* we know that v4l2_bytesperline doesn't round for planar */
>         return height * width * fmt->bpp_image / 8;
>     }

Isn't that growing slightly too big for an inline function ?

-- 
Regards,

Laurent Pinchart

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux