[libcamera-devel] [PATCH v2 4/6] libcamera: PixelFormatInfo: Add functions bytesPerLine and imageSize
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Wed Jul 1 12:48:27 CEST 2020
Hi Paul,
Thank you for the patch.
On Tue, Jun 30, 2020 at 11:58:06PM +0900, Paul Elder wrote:
> Add member functions to PixelFormatInfo for calculating bytes-per-line
> and image size. This will simplify existing code that calculates these
> things.
>
> Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
>
> ---
> Changes in v2:
> - make these functions const
> - add documentation
> - inline DIV_ROUND_UP
> ---
> include/libcamera/internal/formats.h | 3 +++
> src/libcamera/formats.cpp | 27 +++++++++++++++++++++++++++
> 2 files changed, 30 insertions(+)
>
> diff --git a/include/libcamera/internal/formats.h b/include/libcamera/internal/formats.h
> index 3c7440a..af0f1ac 100644
> --- a/include/libcamera/internal/formats.h
> +++ b/include/libcamera/internal/formats.h
> @@ -46,6 +46,9 @@ public:
> static const PixelFormatInfo &info(const PixelFormat &format);
> static const PixelFormatInfo &info(const V4L2PixelFormat &format);
>
> + unsigned int bytesPerLine(unsigned int width) const;
> + unsigned int imageSize(const Size &size) const;
> +
> const char *name;
> PixelFormat format;
> V4L2PixelFormat v4l2Format;
> diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
> index 4d18825..698c905 100644
> --- a/src/libcamera/formats.cpp
> +++ b/src/libcamera/formats.cpp
> @@ -693,4 +693,31 @@ const PixelFormatInfo &PixelFormatInfo::info(const V4L2PixelFormat &format)
> return info->second;
> }
>
> +/**
> + * \brief Compute the bytes per line
> + * \param[in] width The width of the line, in pixels
> + * \return The number of bytes necessary to store the line, or 0 if the
> + * PixelFormatInfo instance not valid
> + */
> +unsigned int PixelFormatInfo::bytesPerLine(unsigned int width) const
I think the name (and documentation) should be updated based on the
naming discussions in 2/6 v1 (stride or lineStride ?).
> +{
> + if (!isValid())
> + return 0;
> +
> + /* ceil(width / pixelsPerGroup) * bytesPerGroup */
> + return ((width + pixelsPerGroup - 1) / pixelsPerGroup) * bytesPerGroup;
You could remove the outer parentheses.
> +
Extra blank line.
> +}
> +
> +/**
> + * \brief Compute the bytes necessary to store the frame
> + * \param[in] size The size of the frame, in pixels
> + * \return The number of bytes necessary to store the frame, or 0 if the
> + * PixelFormatInfo instance is not valid
> + */
> +unsigned int PixelFormatInfo::imageSize(const Size &size) const
> +{
> + return size.height * bytesPerLine(size.width);
> +}
This one is a bit of an issue. The calculation is fine assuming the
device doesn't have particular requirements on the stride alignment.
However, if you have a device that requires the stride to be aligned on
a multiple of 32 bytes, the bytes per line value will be aligned by the
pipeline handler manually after calling PixelFormatInfo::bytesPerLine(),
but this won't be taken into account in PixelFormatInfo::imageSize(). I
would either pass the stride and height instead of the size to
PixelFormatInfo::imageSize(), or drop the function altogether as all it
does is a multiplication that doesn't depend on the PixelFormatInfo and
that can be easily done in the callers.
> +
> } /* namespace libcamera */
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list