summaryrefslogtreecommitdiff
path: root/src/libcamera/v4l2_subdevice.cpp
diff options
context:
space:
mode:
authorUmang Jain <umang.jain@ideasonboard.com>2022-08-30 13:17:20 +0530
committerUmang Jain <umang.jain@ideasonboard.com>2022-09-01 16:49:59 +0530
commite297673e7686160bed5773ea54866f570f939feb (patch)
tree3f2465865bcba2efa12afb4841d95e6037395b16 /src/libcamera/v4l2_subdevice.cpp
parentd5ad19bf03654697988afa9b71263f46d2ca0aba (diff)
libcamera: v4l2_device: Adjust colorspace based on pixel format
V4L2 has no "none" YCbCr encoding, and thus reports an encoding for all formats, including RGB and raw formats. This causes the libcamera ColorSpace to report incorrect encodings for non-YUV formats. Fix it by overriding the encoding reported by the kernel to YCbCrEncoding::None for non-YUV pixel formats and media bus formats. Similarly, override the quantization range of non-YUV formats to full range, as limited range isn't used for RGB and raw formats. Signed-off-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Diffstat (limited to 'src/libcamera/v4l2_subdevice.cpp')
-rw-r--r--src/libcamera/v4l2_subdevice.cpp30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
index 07a0bb07..95bfde34 100644
--- a/src/libcamera/v4l2_subdevice.cpp
+++ b/src/libcamera/v4l2_subdevice.cpp
@@ -503,7 +503,20 @@ 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;
- format->colorSpace = toColorSpace(subdevFmt.format);
+
+ 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);
return 0;
}
@@ -549,7 +562,20 @@ 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;
- format->colorSpace = toColorSpace(subdevFmt.format);
+
+ 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);
return 0;
}