[libcamera-devel] [PATCH] libcamera: v4l2_subdevice: Silence warning for unknown metadata formats
Umang Jain
umang.jain at ideasonboard.com
Mon Sep 5 21:42:39 CEST 2022
Hi Laurent,
Thank you for the patch.
On 9/5/22 10:16 PM, Laurent Pinchart via libcamera-devel wrote:
> Commit e297673e7686 ("libcamera: v4l2_device: Adjust colorspace based on
> pixel format") has introduced a warning when trying to convert a color
> space from V4L2 to libcamera if the media bus code is unknown. This was
> meant to catch unknown image formats, but turned out to be also
> triggered for metadata formats.
err...
>
> Color spaces are not applicable to metadata formats, there should thus
> be no warning. Fix it by skipping the color space translation and
> returning std::nullopt directly if the kernel reports
> V4L2_COLORSPACE_DEFAULT. This doesn't introduce any change in behaviour
> other than getting rid of the warning, as the V4L2Device::toColorSpace()
> function returns std::nullopt alread in that case.
s/alread/already
>
> Fixes: e297673e7686 ("libcamera: v4l2_device: Adjust colorspace based on pixel format")
> Reported-by: Naushir Patuck <naush at raspberrypi.com>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> include/libcamera/internal/v4l2_subdevice.h | 3 ++
> src/libcamera/v4l2_subdevice.cpp | 51 ++++++++++-----------
> 2 files changed, 26 insertions(+), 28 deletions(-)
>
> diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h
> index 00be17bb1465..69862de0585a 100644
> --- a/include/libcamera/internal/v4l2_subdevice.h
> +++ b/include/libcamera/internal/v4l2_subdevice.h
> @@ -101,6 +101,9 @@ protected:
> private:
> LIBCAMERA_DISABLE_COPY(V4L2Subdevice)
>
> + std::optional<ColorSpace>
> + toColorSpace(const v4l2_mbus_framefmt &format) const;
> +
> std::vector<unsigned int> enumPadCodes(unsigned int pad);
> std::vector<SizeRange> enumPadSizes(unsigned int pad,
> unsigned int code);
> diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
> index 95bfde340d8c..f3a9a0096c6c 100644
> --- a/src/libcamera/v4l2_subdevice.cpp
> +++ b/src/libcamera/v4l2_subdevice.cpp
> @@ -477,6 +477,27 @@ V4L2Subdevice::Formats V4L2Subdevice::formats(unsigned int pad)
> return formats;
> }
>
> +std::optional<ColorSpace> V4L2Subdevice::toColorSpace(const v4l2_mbus_framefmt &format) const
> +{
Comment about metadata formats <> V4L2_COLORSPACE_DEFAULT please :-)
Other than that, looks good to me.
Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>
> + if (format.colorspace == V4L2_COLORSPACE_DEFAULT)
> + return std::nullopt;
> +
> + PixelFormatInfo::ColourEncoding colourEncoding;
> + auto iter = formatInfoMap.find(format.code);
> + if (iter != formatInfoMap.end()) {
> + colourEncoding = iter->second.colourEncoding;
> + } else {
> + LOG(V4L2, Warning)
> + << "Unknown subdev format "
> + << utils::hex(format.code, 4)
> + << ", defaulting to RGB encoding";
> +
> + colourEncoding = PixelFormatInfo::ColourEncodingRGB;
> + }
> +
> + return V4L2Device::toColorSpace(format, colourEncoding);
> +}
> +
> /**
> * \brief Retrieve the image format set on one of the V4L2 subdevice pads
> * \param[in] pad The 0-indexed pad number the format is to be retrieved from
> @@ -503,20 +524,7 @@ int V4L2Subdevice::getFormat(unsigned int pad, V4L2SubdeviceFormat *format,
> format->size.width = subdevFmt.format.width;
> format->size.height = subdevFmt.format.height;
> format->mbus_code = subdevFmt.format.code;
> -
> - PixelFormatInfo::ColourEncoding colourEncoding;
> - auto iter = formatInfoMap.find(subdevFmt.format.code);
> - if (iter != formatInfoMap.end()) {
> - colourEncoding = iter->second.colourEncoding;
> - } else {
> - LOG(V4L2, Warning)
> - << "Unknown subdev format "
> - << utils::hex(subdevFmt.format.code, 4)
> - << ", defaulting to RGB encoding";
> -
> - colourEncoding = PixelFormatInfo::ColourEncodingRGB;
> - }
> - format->colorSpace = toColorSpace(subdevFmt.format, colourEncoding);
> + format->colorSpace = toColorSpace(subdevFmt.format);
>
> return 0;
> }
> @@ -562,20 +570,7 @@ int V4L2Subdevice::setFormat(unsigned int pad, V4L2SubdeviceFormat *format,
> format->size.width = subdevFmt.format.width;
> format->size.height = subdevFmt.format.height;
> format->mbus_code = subdevFmt.format.code;
> -
> - PixelFormatInfo::ColourEncoding colourEncoding;
> - auto iter = formatInfoMap.find(subdevFmt.format.code);
> - if (iter != formatInfoMap.end()) {
> - colourEncoding = iter->second.colourEncoding;
> - } else {
> - LOG(V4L2, Warning)
> - << "Unknown subdev format "
> - << utils::hex(subdevFmt.format.code, 4)
> - << ", defaulting to RGB encoding";
> -
> - colourEncoding = PixelFormatInfo::ColourEncodingRGB;
> - }
> - format->colorSpace = toColorSpace(subdevFmt.format, colourEncoding);
> + format->colorSpace = toColorSpace(subdevFmt.format);
>
> return 0;
> }
>
> base-commit: da9bb8dea6821edcfd3464e8cba37ad4a91087d6
More information about the libcamera-devel
mailing list