[libcamera-devel] [PATCH v2 1/4] gstreamer: convert from libcamera colorspace toGStreamer colorimetry.

Nicolas Dufresne nicolas.dufresne at collabora.com
Thu Jul 7 16:00:56 CEST 2022


Le jeudi 07 juillet 2022 à 15:13 +0530, Rishikesh Donadkar via libcamera-devel a
écrit :
> Libcamera StreamConfiguration class has colorSpace attribute, which
> holds the colorspace that is being applied to the camera after the
> validation of the camera configuration.
> 
> Map the libcamera colorspace to GStreamer colorimetry and find
> the colorimetry corresponding to the colorspace that is being applied to
> the camera. This colorimetry if found will be pushed in the caps.
> 
> Signed-off-by: Rishikesh Donadkar <rishikeshdonadkar at gmail.com>
> ---
>  src/gstreamer/gstlibcamera-utils.cpp | 32 ++++++++++++++++++++++++++++
>  1 file changed, 32 insertions(+)
> 
> diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp
> index c97c0d43..60ac8c8e 100644
> --- a/src/gstreamer/gstlibcamera-utils.cpp
> +++ b/src/gstreamer/gstlibcamera-utils.cpp
> @@ -45,6 +45,12 @@ static struct {
>  	/* \todo NV42 is used in libcamera but is not mapped in GStreamer yet. */
>  };
>  
> +static const std::vector<std::pair<ColorSpace, std::string>> ColorSpaceTocolorimetry = {
> +	{ ColorSpace::Srgb, GST_VIDEO_COLORIMETRY_SRGB },
> +	{ ColorSpace::Rec709, GST_VIDEO_COLORIMETRY_BT709 },
> +	{ ColorSpace::Rec2020, GST_VIDEO_COLORIMETRY_BT2020 },
> +};
> +
>  static GstVideoFormat
>  pixel_format_to_gst_format(const PixelFormat &format)
>  {
> @@ -87,6 +93,32 @@ bare_structure_from_format(const PixelFormat &format)
>  	}
>  }
>  
> +static gchar *
> +colorimerty_from_colorspace(std::optional<ColorSpace> colorSpace)
> +{
> +	gchar *colorimetry_str = nullptr;
> +	gchar *colorimetry_found = nullptr;
> +	GstVideoColorimetry colorimetry;
> +	gboolean isColorimetryValid;
> +
> +	auto iterColorimetry = std::find_if(ColorSpaceTocolorimetry.begin(), ColorSpaceTocolorimetry.end(),
> +					    [&colorSpace](const auto &item) {
> +						    return colorSpace == item.first;
> +					    });

Perhaps more readable if you make a helper libcamera_colorimetry_to_gst_string()
?

> +	if (iterColorimetry != ColorSpaceTocolorimetry.end()) {
> +		colorimetry_found = (gchar *)iterColorimetry->second.c_str();
> +		isColorimetryValid = gst_video_colorimetry_from_string(&colorimetry, colorimetry_found);
> +	}

I think you should cary the colorimetry structure over, as matching the
colorpsace is just a first step, there might be alteration to that colorspace.

> +	if (isColorimetryValid) {
> +		colorimetry_str = gst_video_colorimetry_to_string(&colorimetry);
> +		return colorimetry_str;
> +	} else {
> +		g_free(colorimetry_found);
> +		g_free(colorimetry_str);
> +		return nullptr;
> +	}
> +}
> +
>  GstCaps *
>  gst_libcamera_stream_formats_to_caps(const StreamFormats &formats)
>  {



More information about the libcamera-devel mailing list