Patch Detail
Show a patch.
GET /api/patches/16752/?format=api
{ "id": 16752, "url": "https://patchwork.libcamera.org/api/patches/16752/?format=api", "web_url": "https://patchwork.libcamera.org/patch/16752/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20220724144355.104978-4-umang.jain@ideasonboard.com>", "date": "2022-07-24T14:43:55", "name": "[libcamera-devel,3/3] gstreamer: Provide colorimetry <> libcamera::ColorSpace mappings", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "1fe3ca464a1971329f4cfb699eeb22a6a23c2c92", "submitter": { "id": 86, "url": "https://patchwork.libcamera.org/api/people/86/?format=api", "name": "Umang Jain", "email": "umang.jain@ideasonboard.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/16752/mbox/", "series": [ { "id": 3322, "url": "https://patchwork.libcamera.org/api/series/3322/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3322", "date": "2022-07-24T14:43:52", "name": "gstreamer: Plumb initial colorimetry support", "version": 1, "mbox": "https://patchwork.libcamera.org/series/3322/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/16752/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/16752/checks/", "tags": {}, "headers": { "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>", "X-Original-To": "parsemail@patchwork.libcamera.org", "Delivered-To": "parsemail@patchwork.libcamera.org", "Received": [ "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 45F86BE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 24 Jul 2022 14:44:14 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0FC256331B;\n\tSun, 24 Jul 2022 16:44:14 +0200 (CEST)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id DC6EB63315\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 24 Jul 2022 16:44:12 +0200 (CEST)", "from perceval.ideasonboard.com (unknown\n\t[IPv6:2401:4900:1f3e:f7a:bc8f:12ed:b45f:c35d])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 4182C898;\n\tSun, 24 Jul 2022 16:44:11 +0200 (CEST)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1658673854;\n\tbh=VGciOW5U+ee0LXxK1e5CjUkTEynElKoMA8UgLCPr2SE=;\n\th=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=pV7jrjCFm7mC3MlfrZzcwPGoFpj5hUKNjY5+lukWlUcz6wv4+KcZtwEF3jXQCMo6m\n\tuI1Wr5zhxDvtjP/bhcqtTrlvhLpCTdWo0dC2iUlbAjvdqyLLY5206jldefl1Ow1xjT\n\tPvyXX56JWz7S2vToIQoxhHYJaL3WQVGnaEwtTlDxPO6PYCV7HZdD2xxZbTHjqJjaUJ\n\tLIlsybP2MzJwoszN+JIEbG14LcMRZyn0uwdfu2PSlioXRHfsQga6DP6Ji4Pq0+Str8\n\tYa10GiLiJKxSQs7YYWmVXzcBS0zsdhJxbH4yUm/zueoqdL5Hzer2nHGWiueuHN69rq\n\tnn+QdfWMq9jtw==", "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1658673852;\n\tbh=VGciOW5U+ee0LXxK1e5CjUkTEynElKoMA8UgLCPr2SE=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=amz9E56NxTkpkJ6dIjQebebYm+KU6klu3l+K48ddHxf2uP5n6SpxGjVyNgfW5hvP9\n\tPyExr2aBs4Qi2zmQKO6IuJrGBbNHfL7BOCsaAdbS725vlGyqlWV+dLEXdc8yqkmt32\n\tj8VVy+6WFaDr4mvRN/YTzqXDWF6aZKjQExCwzYvg=" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"amz9E56N\"; dkim-atps=neutral", "To": "libcamera-devel@lists.libcamera.org", "Date": "Sun, 24 Jul 2022 20:13:55 +0530", "Message-Id": "<20220724144355.104978-4-umang.jain@ideasonboard.com>", "X-Mailer": "git-send-email 2.31.1", "In-Reply-To": "<20220724144355.104978-1-umang.jain@ideasonboard.com>", "References": "<20220724144355.104978-1-umang.jain@ideasonboard.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH 3/3] gstreamer: Provide colorimetry <>\n\tlibcamera::ColorSpace mappings", "X-BeenThere": "libcamera-devel@lists.libcamera.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "<libcamera-devel.lists.libcamera.org>", "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>", "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>", "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>", "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>", "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>", "From": "Umang Jain via libcamera-devel <libcamera-devel@lists.libcamera.org>", "Reply-To": "Umang Jain <umang.jain@ideasonboard.com>", "Cc": "rishikeshdonadkar@gmail.com, nicolas.dufresne@collabora.com,\n\tvedantparanjape160201@gmail.com", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "From: Rishikesh Donadkar <rishikeshdonadkar@gmail.com>\n\nProvide colorimetry <=> libcamera::ColorSpace mappings via:\n- GstVideoColorimetry colorimetry_from_colorspace(colorspace);\n- ColorSpace colorspace_from_colorimetry(colorimetry);\n\nRead the colorimetry field from caps into the stream configuration.\nAfter stream validation, the sensor supported colorimetry will\nbe retrieved and the caps will be updated accordingly.\n\nColorimetry support for gstlibcamerasrc currently undertakes only one\nargument. Multiple colorimetry support shall be introduced in\nsubsequent commits.\n\nSigned-off-by: Rishikesh Donadkar <rishikeshdonadkar@gmail.com>\nSigned-off-by: Umang Jain <umang.jain@ideasonboard.com>\n---\n src/gstreamer/gstlibcamera-utils.cpp | 175 +++++++++++++++++++++++++++\n 1 file changed, 175 insertions(+)", "diff": "diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\nindex c97c0d43..fb4f0e5c 100644\n--- a/src/gstreamer/gstlibcamera-utils.cpp\n+++ b/src/gstreamer/gstlibcamera-utils.cpp\n@@ -45,6 +45,157 @@ static struct {\n \t/* \\todo NV42 is used in libcamera but is not mapped in GStreamer yet. */\n };\n \n+static GstVideoColorimetry\n+colorimetry_from_colorspace(const ColorSpace &colorSpace)\n+{\n+\tGstVideoColorimetry colorimetry;\n+\n+\tswitch (colorSpace.primaries) {\n+\tcase ColorSpace::Primaries::Rec709:\n+\t\tcolorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;\n+\t\tbreak;\n+\tcase ColorSpace::Primaries::Rec2020:\n+\t\tcolorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;\n+\t\tbreak;\n+\tcase ColorSpace::Primaries::Smpte170m:\n+\t\tcolorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_SMPTE170M;\n+\t\tbreak;\n+\tdefault:\n+\t\tGST_WARNING(\"ColorSpace primaries not mapped in GstLibcameraSrc\");\n+\t\tcolorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_UNKNOWN;\n+\t}\n+\n+\tswitch (colorSpace.transferFunction) {\n+\tcase ColorSpace::TransferFunction::Rec709:\n+\t\tcolorimetry.transfer = GST_VIDEO_TRANSFER_BT709;\n+\t\tbreak;\n+\tcase ColorSpace::TransferFunction::Srgb:\n+\t\tcolorimetry.transfer = GST_VIDEO_TRANSFER_SRGB;\n+\t\tbreak;\n+\tcase ColorSpace::TransferFunction::Linear:\n+\t\tcolorimetry.transfer = GST_VIDEO_TRANSFER_GAMMA10;\n+\t\tbreak;\n+\tdefault:\n+\t\tGST_WARNING(\"ColorSpace transfer function not mapped in GstLibcameraSrc\");\n+\t\tcolorimetry.transfer = GST_VIDEO_TRANSFER_UNKNOWN;\n+\t}\n+\n+\tswitch (colorSpace.ycbcrEncoding) {\n+\tcase ColorSpace::YcbcrEncoding::Rec709:\n+\t\tcolorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT709;\n+\t\tbreak;\n+\tcase ColorSpace::YcbcrEncoding::Rec2020:\n+\t\tcolorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;\n+\t\tbreak;\n+\tcase ColorSpace::YcbcrEncoding::Rec601:\n+\t\tcolorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT601;\n+\t\tbreak;\n+\tdefault:\n+\t\tGST_WARNING(\"Colorspace YcbcrEncoding not mapped in GstLibcameraSrc\");\n+\t\tcolorimetry.matrix = GST_VIDEO_COLOR_MATRIX_UNKNOWN;\n+\t}\n+\n+\tswitch (colorSpace.range) {\n+\tcase ColorSpace::Range::Full:\n+\t\tcolorimetry.range = GST_VIDEO_COLOR_RANGE_0_255;\n+\t\tbreak;\n+\tcase ColorSpace::Range::Limited:\n+\t\tcolorimetry.range = GST_VIDEO_COLOR_RANGE_16_235;\n+\t\tbreak;\n+\tdefault:\n+\t\tGST_WARNING(\"Colorspace range not mapped in GstLibcameraSrc\");\n+\t\tcolorimetry.range = GST_VIDEO_COLOR_RANGE_UNKNOWN;\n+\t}\n+\n+\treturn colorimetry;\n+}\n+\n+static std::optional<ColorSpace>\n+colorspace_from_colorimetry(GstVideoColorimetry *colorimetry)\n+{\n+\tstd::optional<ColorSpace> colorspace = ColorSpace::Default;\n+\n+\tswitch (colorimetry->primaries) {\n+\tcase GST_VIDEO_COLOR_PRIMARIES_BT709:\n+\t\tcolorspace->primaries = ColorSpace::Primaries::Rec709;\n+\t\tbreak;\n+\tcase GST_VIDEO_COLOR_PRIMARIES_BT2020:\n+\t\tcolorspace->primaries = ColorSpace::Primaries::Rec2020;\n+\t\tbreak;\n+\tcase GST_VIDEO_COLOR_PRIMARIES_SMPTE170M:\n+\t\tcolorspace->primaries = ColorSpace::Primaries::Smpte170m;\n+\t\tbreak;\n+\tcase GST_VIDEO_COLOR_PRIMARIES_UNKNOWN:\n+\t\tcolorspace->primaries = ColorSpace::Primaries::Default;\n+\t\tbreak;\n+\tdefault:\n+\t\tGST_WARNING(\"Unknown primaries in colorimetry %d\", colorimetry->primaries);\n+\t}\n+\n+\tswitch (colorimetry->transfer) {\n+\t/* Tranfer function mappings inspired from v4l2src plugin */\n+\tcase GST_VIDEO_TRANSFER_GAMMA18:\n+\tcase GST_VIDEO_TRANSFER_GAMMA20:\n+\tcase GST_VIDEO_TRANSFER_GAMMA22:\n+\tcase GST_VIDEO_TRANSFER_GAMMA28:\n+\t\tGST_WARNING(\"GAMMA 18, 20, 22, 28 transfer functions not supported\");\n+\t/* fallthrough */\n+\tcase GST_VIDEO_TRANSFER_GAMMA10:\n+\t\tcolorspace->transferFunction = ColorSpace::TransferFunction::Linear;\n+\t\tbreak;\n+\tcase GST_VIDEO_TRANSFER_BT601:\n+\tcase GST_VIDEO_TRANSFER_BT2020_12:\n+\tcase GST_VIDEO_TRANSFER_BT2020_10:\n+\tcase GST_VIDEO_TRANSFER_BT709:\n+\t\tcolorspace->transferFunction = ColorSpace::TransferFunction::Rec709;\n+\t\tbreak;\n+\tcase GST_VIDEO_TRANSFER_SRGB:\n+\t\tcolorspace->transferFunction = ColorSpace::TransferFunction::Srgb;\n+\t\tbreak;\n+\tcase GST_VIDEO_TRANSFER_UNKNOWN:\n+\t\tcolorspace->transferFunction = ColorSpace::TransferFunction::Default;\n+\t\tbreak;\n+\tdefault:\n+\t\tGST_WARNING(\"Unknown colorimetry transfer %d\", colorimetry->transfer);\n+\t}\n+\n+\tswitch (colorimetry->matrix) {\n+\t/* FCC is about the same as BT601 with less digit */\n+\tcase GST_VIDEO_COLOR_MATRIX_FCC:\n+\tcase GST_VIDEO_COLOR_MATRIX_BT601:\n+\t\tcolorspace->ycbcrEncoding = ColorSpace::YcbcrEncoding::Rec601;\n+\t\tbreak;\n+\tcase GST_VIDEO_COLOR_MATRIX_BT709:\n+\t\tcolorspace->ycbcrEncoding = ColorSpace::YcbcrEncoding::Rec709;\n+\t\tbreak;\n+\tcase GST_VIDEO_COLOR_MATRIX_BT2020:\n+\t\tcolorspace->ycbcrEncoding = ColorSpace::YcbcrEncoding::Rec2020;\n+\t\tbreak;\n+\tcase GST_VIDEO_COLOR_MATRIX_RGB:\n+\tcase GST_VIDEO_COLOR_MATRIX_UNKNOWN:\n+\t\tcolorspace->ycbcrEncoding = ColorSpace::YcbcrEncoding::Default;\n+\t\tbreak;\n+\tdefault:\n+\t\tGST_WARNING(\"Unknown colorimetry matrix %d\", colorimetry->matrix);\n+\t}\n+\n+\tswitch (colorimetry->range) {\n+\tcase GST_VIDEO_COLOR_RANGE_0_255:\n+\t\tcolorspace->range = ColorSpace::Range::Full;\n+\t\tbreak;\n+\tcase GST_VIDEO_COLOR_RANGE_16_235:\n+\t\tcolorspace->range = ColorSpace::Range::Limited;\n+\t\tbreak;\n+\tcase GST_VIDEO_COLOR_RANGE_UNKNOWN:\n+\t\tcolorspace->range = ColorSpace::Range::Default;\n+\t\tbreak;\n+\tdefault:\n+\t\tGST_WARNING(\"Unknown range in colorimetry %d\", colorimetry->range);\n+\t}\n+\n+\treturn colorspace;\n+}\n+\n static GstVideoFormat\n pixel_format_to_gst_format(const PixelFormat &format)\n {\n@@ -139,6 +290,17 @@ gst_libcamera_stream_configuration_to_caps(const StreamConfiguration &stream_cfg\n \t\t\t \"width\", G_TYPE_INT, stream_cfg.size.width,\n \t\t\t \"height\", G_TYPE_INT, stream_cfg.size.height,\n \t\t\t nullptr);\n+\n+\tif (stream_cfg.colorSpace) {\n+\t\tGstVideoColorimetry colorimetry = colorimetry_from_colorspace(stream_cfg.colorSpace.value());\n+\t\tgchar *colorimetry_str = gst_video_colorimetry_to_string(&colorimetry);\n+\n+\t\tif (colorimetry_str != nullptr)\n+\t\t\tgst_structure_set(s, \"colorimetry\", G_TYPE_STRING, colorimetry_str, nullptr);\n+\t\telse\n+\t\t\tg_warning(\"libcamera::ColorSpace found but GstVideoColorimetry unknown\");\n+\t}\n+\n \tgst_caps_append_structure(caps, s);\n \n \treturn caps;\n@@ -222,6 +384,19 @@ gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\n \tgst_structure_get_int(s, \"height\", &height);\n \tstream_cfg.size.width = width;\n \tstream_cfg.size.height = height;\n+\n+\t/* Configure colorimetry */\n+\tif (gst_structure_has_field(s, \"colorimetry\")) {\n+\t\tconst gchar *colorimetry_caps = gst_structure_get_string(s, \"colorimetry\");\n+\t\tGstVideoColorimetry colorimetry;\n+\n+\t\tif(gst_video_colorimetry_from_string(&colorimetry, colorimetry_caps)) {\n+\t\t\tstd::optional<ColorSpace> colorSpace = colorspace_from_colorimetry(&colorimetry);\n+\t\t\tstream_cfg.colorSpace = colorSpace;\n+\t\t} else {\n+\t\t\tg_print(\"Invalid colorimetry %s\", colorimetry_caps);\n+\t\t}\n+\t}\n }\n \n #if !GST_CHECK_VERSION(1, 17, 1)\n", "prefixes": [ "libcamera-devel", "3/3" ] }