diff options
-rw-r--r-- | include/libcamera/internal/v4l2_subdevice.h | 3 | ||||
-rw-r--r-- | src/libcamera/v4l2_subdevice.cpp | 60 |
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; } |