libcamera: colorspace: Rectify the ColorSpace::Srgb preset

Rectify the ColorSpace::Srgb to denote that it does not use
any Y'Cbcr encoding and uses full range.

The kernel on the other hand, recommends to use Rec601 as the encoding
for V4L2_COLORSPACE_SRGB. It is not very explicit but it can be
inferred that the kernel assumes V4L2_COLORSPACE_SRGB is a YUV-encoded
one. However, when the data is in RGB, no encoding is required (and
this is denoted by YcbcrEncoding::None in libcamera).

Hence, to be clear on the libcamera colorspace API, rectify the
ColorSpace::Srgb preset to use YcbcrEncoding::None and full range.

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>
This commit is contained in:
Umang Jain 2022-08-30 13:17:22 +05:30
parent e52729e7ec
commit d09c2bb127
2 changed files with 15 additions and 10 deletions

View file

@ -49,8 +49,13 @@ namespace libcamera {
* - <a href="https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/colorspaces-details.html#col-bt2020">Rec.2020</a> * - <a href="https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/colorspaces-details.html#col-bt2020">Rec.2020</a>
* *
* Note that there is no guarantee of a 1:1 mapping between color space names * Note that there is no guarantee of a 1:1 mapping between color space names
* and definitions in libcamera and V4L2. A notable difference is that the sYCC * and definitions in libcamera and V4L2. Two notable differences are
* libcamera color space is called JPEG in V4L2 due to historical reasons. *
* - The sRGB libcamera color space is defined for RGB formats only with no
* Y'CbCr encoding and a full quantization range, while the V4L2 SRGB color
* space has a Y'CbCr encoding and a limited quantization range.
* - The sYCC libcamera color space is called JPEG in V4L2 due to historical
* reasons.
* *
* \todo Define the color space fully in the libcamera API to avoid referencing * \todo Define the color space fully in the libcamera API to avoid referencing
* V4L2 * V4L2
@ -138,16 +143,13 @@ const ColorSpace ColorSpace::Raw = {
}; };
/** /**
* \brief A constant representing the sRGB color space * \brief A constant representing the sRGB color space (RGB formats only)
*
* This is identical to the sYCC color space except that the Y'CbCr
* range is limited rather than full.
*/ */
const ColorSpace ColorSpace::Srgb = { const ColorSpace ColorSpace::Srgb = {
Primaries::Rec709, Primaries::Rec709,
TransferFunction::Srgb, TransferFunction::Srgb,
YcbcrEncoding::Rec601, YcbcrEncoding::None,
Range::Limited Range::Full
}; };
/** /**

View file

@ -746,7 +746,11 @@ void V4L2Device::eventAvailable()
static const std::map<uint32_t, ColorSpace> v4l2ToColorSpace = { static const std::map<uint32_t, ColorSpace> v4l2ToColorSpace = {
{ V4L2_COLORSPACE_RAW, ColorSpace::Raw }, { V4L2_COLORSPACE_RAW, ColorSpace::Raw },
{ V4L2_COLORSPACE_SRGB, ColorSpace::Srgb }, { V4L2_COLORSPACE_SRGB, {
ColorSpace::Primaries::Rec709,
ColorSpace::TransferFunction::Srgb,
ColorSpace::YcbcrEncoding::Rec601,
ColorSpace::Range::Limited } },
{ V4L2_COLORSPACE_JPEG, ColorSpace::Sycc }, { V4L2_COLORSPACE_JPEG, ColorSpace::Sycc },
{ V4L2_COLORSPACE_SMPTE170M, ColorSpace::Smpte170m }, { V4L2_COLORSPACE_SMPTE170M, ColorSpace::Smpte170m },
{ V4L2_COLORSPACE_REC709, ColorSpace::Rec709 }, { V4L2_COLORSPACE_REC709, ColorSpace::Rec709 },
@ -772,7 +776,6 @@ static const std::map<uint32_t, ColorSpace::Range> v4l2ToRange = {
static const std::vector<std::pair<ColorSpace, v4l2_colorspace>> colorSpaceToV4l2 = { static const std::vector<std::pair<ColorSpace, v4l2_colorspace>> colorSpaceToV4l2 = {
{ ColorSpace::Raw, V4L2_COLORSPACE_RAW }, { ColorSpace::Raw, V4L2_COLORSPACE_RAW },
{ ColorSpace::Srgb, V4L2_COLORSPACE_SRGB },
{ ColorSpace::Sycc, V4L2_COLORSPACE_JPEG }, { ColorSpace::Sycc, V4L2_COLORSPACE_JPEG },
{ ColorSpace::Smpte170m, V4L2_COLORSPACE_SMPTE170M }, { ColorSpace::Smpte170m, V4L2_COLORSPACE_SMPTE170M },
{ ColorSpace::Rec709, V4L2_COLORSPACE_REC709 }, { ColorSpace::Rec709, V4L2_COLORSPACE_REC709 },