summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-09-05 19:38:52 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-09-08 16:43:32 +0300
commit560ceb1ea854b1cb0c7d91efffa0e7aabbed2328 (patch)
treec5dcb0c3a859ff4211ec6978af2fb395ea794fda
parent5a9fd9a95cce4ab17c9cf5d9e0c33a008255bedb (diff)
libcamera: v4l2_subdevice: Silence warning for unknown metadata formats
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. 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 already in that case. Fixes: e297673e7686 ("libcamera: v4l2_device: Adjust colorspace based on pixel format") Reported-by: Naushir Patuck <naush@raspberrypi.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Tested-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
-rw-r--r--include/libcamera/internal/v4l2_subdevice.h3
-rw-r--r--src/libcamera/v4l2_subdevice.cpp60
2 files changed, 35 insertions, 28 deletions
diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h
index 00be17bb..69862de0 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 95bfde34..9ef95963 100644
--- a/src/libcamera/v4l2_subdevice.cpp
+++ b/src/libcamera/v4l2_subdevice.cpp
@@ -477,6 +477,36 @@ V4L2Subdevice::Formats V4L2Subdevice::formats(unsigned int pad)
return formats;
}
+std::optional<ColorSpace> V4L2Subdevice::toColorSpace(const v4l2_mbus_framefmt &format) const
+{
+ /*
+ * Only image formats have a color space, for other formats (such as
+ * metadata formats) the color space concept isn't applicable. V4L2
+ * subdev drivers return a colorspace set to V4L2_COLORSPACE_DEFAULT in
+ * that case (as well as for image formats when the driver hasn't
+ * bothered implementing color space support). Check the colorspace
+ * field here and return std::nullopt directly to avoid logging a
+ * warning.
+ */
+ 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 +533,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 +579,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;
}