Patch Detail
Show a patch.
GET /api/patches/16867/?format=api
{ "id": 16867, "url": "https://patchwork.libcamera.org/api/patches/16867/?format=api", "web_url": "https://patchwork.libcamera.org/patch/16867/", "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": "<20220729103846.414819-1-umang.jain@ideasonboard.com>", "date": "2022-07-29T10:38:46", "name": "[libcamera-devel,v2] gstreamer: Provide colorimetry <> ColorSpace mappings", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "dd26454362b011340eb6d87bc01b0ba615a30b2e", "submitter": { "id": 86, "url": "https://patchwork.libcamera.org/api/people/86/?format=api", "name": "Umang Jain", "email": "umang.jain@ideasonboard.com" }, "delegate": { "id": 12, "url": "https://patchwork.libcamera.org/api/users/12/?format=api", "username": "uajain", "first_name": "Umang", "last_name": "Jain", "email": "umang.jain@ideasonboard.com" }, "mbox": "https://patchwork.libcamera.org/patch/16867/mbox/", "series": [ { "id": 3348, "url": "https://patchwork.libcamera.org/api/series/3348/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3348", "date": "2022-07-29T10:38:46", "name": "[libcamera-devel,v2] gstreamer: Provide colorimetry <> ColorSpace mappings", "version": 2, "mbox": "https://patchwork.libcamera.org/series/3348/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/16867/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/16867/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 DD19CC3275\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 29 Jul 2022 10:38:59 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3646E63312;\n\tFri, 29 Jul 2022 12:38:59 +0200 (CEST)", "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8890D603EC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 29 Jul 2022 12:38:57 +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 E856552F;\n\tFri, 29 Jul 2022 12:38:54 +0200 (CEST)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1659091139;\n\tbh=CGsJO3UTwLf9j2ZyS6CUUzEWTVQxfrkkItZEayQWRkI=;\n\th=To:Date:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post:\n\tList-Help:List-Subscribe:From:Reply-To:Cc:From;\n\tb=1G0yOUTs00nAtl+8PiO62RsncqBRzLFo11/q70pVRB68yhYkvHLagJ50wNQ4FqGga\n\todD2X8Uigx86NYZhlZ5hB/xLjpSJYkJ60vD3OpHluqXGQto3+1oPi/zaW75DRQcIKW\n\tg65SUIDCbTZZtPBJ/P626fycFtrO/zx0j9dj4Wmz7zj3lL39xWjb9+zPJt5tEk18cB\n\tDwk1zpbf/RBK806HfFEBxP3NZjtHToonk4CDvypFZo9IJWRTYpGfI9uhr4fRRk9NhO\n\tyPCZb8zhoMKb8X+NJHNilSkvYIhXdeKQeXBctIsZN58WYQCOwWAIOrRzGh7auy5Ckd\n\tpt3gI8azPTu3Q==", "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1659091137;\n\tbh=CGsJO3UTwLf9j2ZyS6CUUzEWTVQxfrkkItZEayQWRkI=;\n\th=From:To:Cc:Subject:Date:From;\n\tb=Ksk06aWHK/mzmx5UwNNdx3AWE8fCeu4k1hG8TxB7dBsOInW8NoOmm3i3vhgOpQur8\n\tIB0Odr00fWJXSabligqDa0e9vDWEojBrRy6L2aN2D14nndeUlvrX8QMgxqbppB3vhR\n\tHWUgz4UvwUZrYzr4M2InBHm6jxABPYrp2OicVFnk=" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"Ksk06aWH\"; dkim-atps=neutral", "To": "libcamera-devel@lists.libcamera.org", "Date": "Fri, 29 Jul 2022 16:08:46 +0530", "Message-Id": "<20220729103846.414819-1-umang.jain@ideasonboard.com>", "X-Mailer": "git-send-email 2.31.1", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v2] 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, 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\nChanges in v2:\n - Drop \"Default\" Colorspace\n - Improve function signature of colorimetry_from_colorspace() and\n colorspace_from_colorimetry()\n - Map GST_VIDEO_COLOR_MATRIX_RGB to Colorspace::YcbcrEncoding::Rec601\n (comes from the kernel)\n - Map GST_VIDEO_COLOR_PRIMARIES_UNKNOWN to Raw colorspace\n - Map ColorSpace::YcbcrEncoding::Rec601 to GST_VIDEO_COLOR_MATRIX_RGB\n if colorspace is \"sRGB\". GST_VIDEO_COLOR_MATRIX_BT601 for all other\n cases\n - Minor nits regarding error reporting strings.\n---\n src/gstreamer/gstlibcamera-utils.cpp | 164 +++++++++++++++++++++++++++\n 1 file changed, 164 insertions(+)", "diff": "diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\nindex c97c0d43..e4ff1269 100644\n--- a/src/gstreamer/gstlibcamera-utils.cpp\n+++ b/src/gstreamer/gstlibcamera-utils.cpp\n@@ -45,6 +45,146 @@ 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+\tcase ColorSpace::Primaries::Raw:\n+\t\tcolorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_UNKNOWN;\n+\t\tbreak;\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+\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::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\tif (colorSpace == ColorSpace::Srgb)\n+\t\t\tcolorimetry.matrix = GST_VIDEO_COLOR_MATRIX_RGB;\n+\t\telse\n+\t\t\tcolorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT601;\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 ColorSpace\n+colorspace_from_colorimetry(const GstVideoColorimetry &colorimetry)\n+{\n+\tColorSpace colorspace = ColorSpace::Raw;\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\t/* Unknown primaries map to raw colorspace in gstreamer */\n+\t\treturn colorspace;\n+\tdefault:\n+\t\tg_error(\"Unsupported colorimetry primaries: %d\", colorimetry.primaries);\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_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+\tdefault:\n+\t\tg_error(\"Unsupported colorimetry transfer function: %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/* v4l2_ycbcr_encoding of sRGB is ENC_601 in the kernel */\n+\tcase GST_VIDEO_COLOR_MATRIX_RGB:\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\tg_error(\"Unsupported 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+\tdefault:\n+\t\tg_error(\"Unsupported colorimetry range %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 +279,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@@ -222,6 +374,18 @@ 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\tstream_cfg.colorSpace = colorspace_from_colorimetry(colorimetry);\n+\t\t} else {\n+\t\t\tg_critical(\"Invalid colorimetry %s\", colorimetry_caps);\n+\t\t}\n+\t}\n }\n \n #if !GST_CHECK_VERSION(1, 17, 1)\n", "prefixes": [ "libcamera-devel", "v2" ] }