Patch Detail
Show a patch.
GET /api/1.1/patches/17256/?format=api
{ "id": 17256, "url": "https://patchwork.libcamera.org/api/1.1/patches/17256/?format=api", "web_url": "https://patchwork.libcamera.org/patch/17256/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/1.1/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": "<20220830074725.1059643-8-umang.jain@ideasonboard.com>", "date": "2022-08-30T07:47:25", "name": "[libcamera-devel,v4,7/7] gstreamer: Provide colorimetry <> ColorSpace mappings", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "b19c54f8eab77a4324b6f308eb64911c6df1d0d2", "submitter": { "id": 86, "url": "https://patchwork.libcamera.org/api/1.1/people/86/?format=api", "name": "Umang Jain", "email": "umang.jain@ideasonboard.com" }, "delegate": { "id": 12, "url": "https://patchwork.libcamera.org/api/1.1/users/12/?format=api", "username": "uajain", "first_name": "Umang", "last_name": "Jain", "email": "umang.jain@ideasonboard.com" }, "mbox": "https://patchwork.libcamera.org/patch/17256/mbox/", "series": [ { "id": 3452, "url": "https://patchwork.libcamera.org/api/1.1/series/3452/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3452", "date": "2022-08-30T07:47:18", "name": "Colospace adjustment and gstreamer mapping", "version": 4, "mbox": "https://patchwork.libcamera.org/series/3452/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/17256/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/17256/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 87BE3C3272\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 30 Aug 2022 07:47:55 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4636061FD3;\n\tTue, 30 Aug 2022 09:47:55 +0200 (CEST)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BA65A61FB9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 30 Aug 2022 09:47:53 +0200 (CEST)", "from umang.jainideasonboard.com (unknown\n\t[IPv6:2401:4900:1f3f:1548:78ac:4a3:edc3:c28a])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C673D481;\n\tTue, 30 Aug 2022 09:47:51 +0200 (CEST)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1661845675;\n\tbh=wrbpnVP0vGiTrYDPblaT32z3hJA2Ngi8FxRXo+nqjoQ=;\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=BRp5qgIe4yyUn4S7l3ww4vCiarGRrm++C3Dc93bWhLibufycj39/NbQumKcTiN0ac\n\tmZtLYzK3Gqf/KysTzdqPWDaEtnvtxd+bkdRy9fExJjN9rhL9o+3JhI+ogE7EXS+53E\n\tO/EQZBhyQlsWkswbhCKZj64dOgoQGrWkkHuUwWL24VE0gZYZtXxqvh0Sd3T1lTA+pk\n\tPgPN/tdhghYjrqbsnhm7f3zHDLZVPzqokrDgIDvVuUSaAEel2sZKC0qw5lXimeT5e1\n\twy2EHMyMb81xjOV3TpBI72PC4haBuFhBrmJ5sl0pvOfrJZyHoBzB0bhSOn06ZaSLuT\n\t/NRu2Opeo1FIA==", "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1661845673;\n\tbh=wrbpnVP0vGiTrYDPblaT32z3hJA2Ngi8FxRXo+nqjoQ=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=p7KbQvW8ApawQi4wAd40uj7AqMFwFDptzZj6Hj70riWZ1ZLS/pyJlNRWNZMJeDkU8\n\t1Aj4ys4PAR7+YvqCBEyHtPRArFAVflo/XKLPwxjgBxFijOr4LrN/7XJWCto8+mu9sr\n\tq0TnpAk+ZR4waiH150WlU3697y7e5M13mqeH5/Sw=" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"p7KbQvW8\"; dkim-atps=neutral", "To": "libcamera-devel@lists.libcamera.org", "Date": "Tue, 30 Aug 2022 13:17:25 +0530", "Message-Id": "<20220830074725.1059643-8-umang.jain@ideasonboard.com>", "X-Mailer": "git-send-email 2.37.2", "In-Reply-To": "<20220830074725.1059643-1-umang.jain@ideasonboard.com>", "References": "<20220830074725.1059643-1-umang.jain@ideasonboard.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v4 7/7] gstreamer: Provide colorimetry <>\n\tColorSpace 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", "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 gstlibcamera 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>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\nReviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n---\n src/gstreamer/gstlibcamera-utils.cpp | 169 +++++++++++++++++++++++++++\n 1 file changed, 169 insertions(+)", "diff": "diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\nindex 5a21a391..c7b44a8e 100644\n--- a/src/gstreamer/gstlibcamera-utils.cpp\n+++ b/src/gstreamer/gstlibcamera-utils.cpp\n@@ -57,6 +57,152 @@ 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::Raw:\n+\t\tcolorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_UNKNOWN;\n+\t\tbreak;\n+\tcase ColorSpace::Primaries::Smpte170m:\n+\t\tcolorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_SMPTE170M;\n+\t\tbreak;\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+\t}\n+\n+\tswitch (colorSpace.transferFunction) {\n+\tcase ColorSpace::TransferFunction::Linear:\n+\t\tcolorimetry.transfer = GST_VIDEO_TRANSFER_GAMMA10;\n+\t\tbreak;\n+\tcase ColorSpace::TransferFunction::Srgb:\n+\t\tcolorimetry.transfer = GST_VIDEO_TRANSFER_SRGB;\n+\t\tbreak;\n+\tcase ColorSpace::TransferFunction::Rec709:\n+\t\tcolorimetry.transfer = GST_VIDEO_TRANSFER_BT709;\n+\t\tbreak;\n+\t}\n+\n+\tswitch (colorSpace.ycbcrEncoding) {\n+\tcase ColorSpace::YcbcrEncoding::None:\n+\t\tcolorimetry.matrix = GST_VIDEO_COLOR_MATRIX_RGB;\n+\t\tbreak;\n+\tcase ColorSpace::YcbcrEncoding::Rec601:\n+\t\tcolorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT601;\n+\t\tbreak;\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+\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+\t}\n+\n+\treturn colorimetry;\n+}\n+\n+static std::optional<ColorSpace>\n+colorspace_from_colorimetry(const GstVideoColorimetry &colorimetry)\n+{\n+\tstd::optional<ColorSpace> colorspace;\n+\n+\tswitch (colorimetry.primaries) {\n+\tcase GST_VIDEO_COLOR_PRIMARIES_UNKNOWN:\n+\t\t/* Unknown primaries map to raw colorspace in gstreamer */\n+\t\treturn ColorSpace::Raw;\n+\tcase GST_VIDEO_COLOR_PRIMARIES_SMPTE170M:\n+\t\tcolorspace->primaries = ColorSpace::Primaries::Smpte170m;\n+\t\tbreak;\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+\tdefault:\n+\t\tGST_WARNING(\"Colorimetry primaries %d not mapped in gstlibcamera\",\n+\t\t\t colorimetry.primaries);\n+\t\treturn std::nullopt;\n+\t}\n+\n+\tswitch (colorimetry.transfer) {\n+\t/* Transfer 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_SRGB:\n+\t\tcolorspace->transferFunction = ColorSpace::TransferFunction::Srgb;\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+\tdefault:\n+\t\tGST_WARNING(\"Colorimetry transfer function %d not mapped in gstlibcamera\",\n+\t\t\t colorimetry.transfer);\n+\t\treturn std::nullopt;\n+\t}\n+\n+\tswitch (colorimetry.matrix) {\n+\tcase GST_VIDEO_COLOR_MATRIX_RGB:\n+\t\tcolorspace->ycbcrEncoding = ColorSpace::YcbcrEncoding::None;\n+\t\tbreak;\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+\tdefault:\n+\t\tGST_WARNING(\"Colorimetry matrix %d not mapped in gstlibcamera\",\n+\t\t\t colorimetry.matrix);\n+\t\treturn std::nullopt;\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+\tdefault:\n+\t\tGST_WARNING(\"Colorimetry range %d not mapped in gstlibcamera\",\n+\t\t\t colorimetry.range);\n+\t\treturn std::nullopt;\n+\t}\n+\n+\treturn colorspace;\n+}\n+\n static GstVideoFormat\n pixel_format_to_gst_format(const PixelFormat &format)\n {\n@@ -151,6 +297,18 @@ 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)\n+\t\t\tgst_structure_set(s, \"colorimetry\", G_TYPE_STRING, colorimetry_str, nullptr);\n+\t\telse\n+\t\t\tg_error(\"Got invalid colorimetry from ColorSpace: %s\",\n+\t\t\t\tColorSpace::toString(stream_cfg.colorSpace).c_str());\n+\t}\n+\n \tgst_caps_append_structure(caps, s);\n \n \treturn caps;\n@@ -234,6 +392,17 @@ 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_str = gst_structure_get_string(s, \"colorimetry\");\n+\t\tGstVideoColorimetry colorimetry;\n+\n+\t\tif (!gst_video_colorimetry_from_string(&colorimetry, colorimetry_str))\n+\t\t\tg_critical(\"Invalid colorimetry %s\", colorimetry_str);\n+\n+\t\tstream_cfg.colorSpace = colorspace_from_colorimetry(colorimetry);\n+\t}\n }\n \n #if !GST_CHECK_VERSION(1, 17, 1)\n", "prefixes": [ "libcamera-devel", "v4", "7/7" ] }