Message ID | 20220830074725.1059643-5-umang.jain@ideasonboard.com |
---|---|
State | Accepted |
Delegated to: | Umang Jain |
Headers | show |
Series |
|
Related | show |
On Tue, Aug 30, 2022 at 01:17:22PM +0530, Umang Jain via libcamera-devel wrote: > 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> > --- > src/libcamera/color_space.cpp | 18 ++++++++++-------- > src/libcamera/v4l2_device.cpp | 7 +++++-- > 2 files changed, 15 insertions(+), 10 deletions(-) > > diff --git a/src/libcamera/color_space.cpp b/src/libcamera/color_space.cpp > index 944d0e98..ec34620a 100644 > --- a/src/libcamera/color_space.cpp > +++ b/src/libcamera/color_space.cpp > @@ -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> > * > * 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 > - * libcamera color space is called JPEG in V4L2 due to historical reasons. > + * and definitions in libcamera and V4L2. Two notable differences are > + * > + * - 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 > * V4L2 > @@ -138,16 +143,13 @@ const ColorSpace ColorSpace::Raw = { > }; > > /** > - * \brief A constant representing the sRGB color space > - * > - * This is identical to the sYCC color space except that the Y'CbCr > - * range is limited rather than full. > + * \brief A constant representing the sRGB color space (RGB formats only) > */ > const ColorSpace ColorSpace::Srgb = { > Primaries::Rec709, > TransferFunction::Srgb, > - YcbcrEncoding::Rec601, > - Range::Limited > + YcbcrEncoding::None, > + Range::Full > }; > > /** > diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp > index 301620f8..1d899657 100644 > --- a/src/libcamera/v4l2_device.cpp > +++ b/src/libcamera/v4l2_device.cpp > @@ -746,7 +746,11 @@ void V4L2Device::eventAvailable() > > static const std::map<uint32_t, ColorSpace> v4l2ToColorSpace = { > { 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_SMPTE170M, ColorSpace::Smpte170m }, > { 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 = { > { ColorSpace::Raw, V4L2_COLORSPACE_RAW }, > - { ColorSpace::Srgb, V4L2_COLORSPACE_SRGB }, > { ColorSpace::Sycc, V4L2_COLORSPACE_JPEG }, > { ColorSpace::Smpte170m, V4L2_COLORSPACE_SMPTE170M }, > { ColorSpace::Rec709, V4L2_COLORSPACE_REC709 }, > -- > 2.37.2 >
diff --git a/src/libcamera/color_space.cpp b/src/libcamera/color_space.cpp index 944d0e98..ec34620a 100644 --- a/src/libcamera/color_space.cpp +++ b/src/libcamera/color_space.cpp @@ -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> * * 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 - * libcamera color space is called JPEG in V4L2 due to historical reasons. + * and definitions in libcamera and V4L2. Two notable differences are + * + * - 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 * V4L2 @@ -138,16 +143,13 @@ const ColorSpace ColorSpace::Raw = { }; /** - * \brief A constant representing the sRGB color space - * - * This is identical to the sYCC color space except that the Y'CbCr - * range is limited rather than full. + * \brief A constant representing the sRGB color space (RGB formats only) */ const ColorSpace ColorSpace::Srgb = { Primaries::Rec709, TransferFunction::Srgb, - YcbcrEncoding::Rec601, - Range::Limited + YcbcrEncoding::None, + Range::Full }; /** diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp index 301620f8..1d899657 100644 --- a/src/libcamera/v4l2_device.cpp +++ b/src/libcamera/v4l2_device.cpp @@ -746,7 +746,11 @@ void V4L2Device::eventAvailable() static const std::map<uint32_t, ColorSpace> v4l2ToColorSpace = { { 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_SMPTE170M, ColorSpace::Smpte170m }, { 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 = { { ColorSpace::Raw, V4L2_COLORSPACE_RAW }, - { ColorSpace::Srgb, V4L2_COLORSPACE_SRGB }, { ColorSpace::Sycc, V4L2_COLORSPACE_JPEG }, { ColorSpace::Smpte170m, V4L2_COLORSPACE_SMPTE170M }, { ColorSpace::Rec709, V4L2_COLORSPACE_REC709 },