{"id":22330,"url":"https://patchwork.libcamera.org/api/1.1/patches/22330/?format=json","web_url":"https://patchwork.libcamera.org/patch/22330/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20241216043044.1760345-1-qi.hou@nxp.com>","date":"2024-12-16T04:30:44","name":"[v4] gstreamer: keep same transfer with that in negotiated caps","commit_ref":"e9a876acc6d3a3d8ce1cfc99e4cbcf1c6122d591","pull_url":null,"state":"accepted","archived":false,"hash":"b2c8d9dc455409b9b4aa41121f54037ed503ca33","submitter":{"id":195,"url":"https://patchwork.libcamera.org/api/1.1/people/195/?format=json","name":"Qi Hou","email":"qi.hou@nxp.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/22330/mbox/","series":[{"id":4891,"url":"https://patchwork.libcamera.org/api/1.1/series/4891/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=4891","date":"2024-12-16T04:30:44","name":"[v4] gstreamer: keep same transfer with that in negotiated caps","version":4,"mbox":"https://patchwork.libcamera.org/series/4891/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/22330/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/22330/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 5586FC32F9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 16 Dec 2024 04:31:12 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7A10162C8A;\n\tMon, 16 Dec 2024 05:31:11 +0100 (CET)","from AM0PR83CU005.outbound.protection.outlook.com\n\t(mail-westeuropeazlp170100000.outbound.protection.outlook.com\n\t[IPv6:2a01:111:f403:c201::])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1A22F62C8A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Dec 2024 05:31:09 +0100 (CET)","from PAXPR04MB8285.eurprd04.prod.outlook.com\n\t(2603:10a6:102:1ca::15)\n\tby GVXPR04MB9949.eurprd04.prod.outlook.com (2603:10a6:150:112::5)\n\twith Microsoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8251.21;\n\tMon, 16 Dec 2024 04:31:07 +0000","from PAXPR04MB8285.eurprd04.prod.outlook.com\n\t([fe80::e003:8fb:64ea:acfd]) by\n\tPAXPR04MB8285.eurprd04.prod.outlook.com\n\t([fe80::e003:8fb:64ea:acfd%6]) with mapi id 15.20.8251.015;\n\tMon, 16 Dec 2024 04:31:07 +0000"],"Authentication-Results":["lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=nxp.com header.i=@nxp.com header.b=\"ku2eiCRN\";\n\tdkim-atps=neutral","dkim=none (message not signed)\n\theader.d=none;dmarc=none action=none header.from=nxp.com;"],"ARC-Seal":"i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n\tb=qhNkqG+slr73jT2VzcKNBMVi/TkSX40dAiGJM1xWBDsclDDtynlKfvj8eVergbms2Fq14bhquQNoQ96ChbdBG0BNwbhOqq1Ku6bvB21dXJlobR6nHcpbhcFZO7I4DtDgVTFd/Bm7CJUK0+g0L5+YZ7YTAow+iMGsUuWWkX5xcm/ETxkXeEawHmh6IILB552vUHwiNNewG0wvOZhX/8KyV2yXhIpC4dCP7OqsiXCBEKAB1IhjeK2W3SfNuiJXeyVMkWx3p6Lhwvpo3yePBcoD0XM6SkbH9IVfSOfxNqUaHO/Rki93ARksO5HOivQSHs38VNURA0gAHgxIYOtD8ovPwQ==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n\ts=arcselector10001;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n\tbh=LQ1K0ZYHWmNHG68miq1+fDxtoMoHUUfzA5m3Wode9yg=;\n\tb=hIdTTeEaNheURMKvJ07f1jWkh3eEPtSbarYnAt30NXKDFVYBmsEOQUdfh/3xJUrFxJk7h02+l3yu9EQ6t+BAoPeV68VnesH/RwnrYx98GotuTZ4pX8LZsn0MtEfBwWEIWUueqKZUsYGeovISxnjrlY8CXeAII3xZLg/S4ALBiw/WNrFdCbimilcbHbsYYZ9X+aLIGFLKggMdWQh810h4haYZ01ynyxu1zuZGzkql2QsWzQyxkV6h7CPWWIwyV1gypnf6NknGA3rXeMCwX/5m/E+5S8fNm1wJblhs77ELubVj1I1odwAczpYPNRnHt8WIKjAhJ1Zp7jZpL1hmWKAq4w==","ARC-Authentication-Results":"i=1; mx.microsoft.com 1; spf=pass\n\tsmtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com;\n\tdkim=pass header.d=nxp.com; arc=none","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=LQ1K0ZYHWmNHG68miq1+fDxtoMoHUUfzA5m3Wode9yg=;\n\tb=ku2eiCRNc1EUfiI9fsH/iZxpkDxecPkHwn8uvAbD+6hNo8o1jzTnJSmvxCl4D/Q7bPoJblanL6Axl89XND4+HaLJcWp0FKZ5A3f8J/4jqZwWZtyaWOFHJnLLdh2d8YnX3ghaSgQZBNLEcX+pWs7ACdLrs27GVJguynAulupGi77RtKkGGKCz3RKf3cU96hMqcqOiWyj8O6ZJimeWSaQ15REZWfwoCdBbaHPFXLJ7hxUmLkuDpzXIui0FFL8S+SkRwmijY53aMAiDPY2/KpVwBtZpNb1TSEWVv/xfyt71BAZsNLHnGFA9uFiS0dliONNP7ydAWVg0i0hSKVjtvEqjIA==","From":"Hou Qi <qi.hou@nxp.com>","To":"libcamera-devel@lists.libcamera.org","Cc":"jared.hu@nxp.com,\n\tqi.hou@nxp.com,\n\tjulien.vuillaumier@nxp.com","Subject":"[PATCH v4] gstreamer: keep same transfer with that in negotiated\n\tcaps","Date":"Mon, 16 Dec 2024 13:30:44 +0900","Message-Id":"<20241216043044.1760345-1-qi.hou@nxp.com>","X-Mailer":"git-send-email 2.34.1","Content-Transfer-Encoding":"8bit","Content-Type":"text/plain","X-ClientProxiedBy":"SG2PR04CA0179.apcprd04.prod.outlook.com\n\t(2603:1096:4:14::17) To PAXPR04MB8285.eurprd04.prod.outlook.com\n\t(2603:10a6:102:1ca::15)","MIME-Version":"1.0","X-MS-PublicTrafficType":"Email","X-MS-TrafficTypeDiagnostic":"PAXPR04MB8285:EE_|GVXPR04MB9949:EE_","X-MS-Office365-Filtering-Correlation-Id":"603f5fa8-1075-4902-c35b-08dd1d8a7561","X-MS-Exchange-SenderADCheck":"1","X-MS-Exchange-AntiSpam-Relay":"0","X-Microsoft-Antispam":"BCL:0;\n\tARA:13230040|52116014|1800799024|376014|366016|38350700014; ","X-Microsoft-Antispam-Message-Info":"2r48uVUBK23mWfHULvv2hc1bxXcdeLOq9blG26SDvR7TTcGzGse9xLKdFVZ4ANQU9KfeE60aT7n5BIw+WAffNE52WGOq1SWddcwMA0qjvquMdXP9OpsnnN0jNZTirG6OmvZE5H1A9XR0QNunNBI6rdN6fAmyI13Plx90bu9U1v56ShBdtqJGNSQwTx6X/Dt6tW8Orw5sp9sPA1NBHYyrV6zb27ujgysJ1JZewa9JIe4r5AmmzqdBNZBr0mY780llWrLeS83NsUxJF5UVSRwOZvB7yefUWhR7PAx41vmOP8g5eX49U/wKMP50NvPaMugZMJzCW/5P5E552BE+BuzVO/8V7CNqZVmbV6jQqlVVxaiBSNWNmxTbkG5lmO5NEVhkidM0exROEqFWxzB7PjK2jUcjHgIFhia1RsM3mFmfOCoeNHuplFccFGyUhEp+B3+nwLDx8esxTEIjW1w2ZZkPkApa80ptMgIqEW9CZt23a2syy3ora4shJySdLcnom1b/sXykAqR0twDU9c00QHTTwq8tXOCzNKT28g6oa0A/EsY+w5HkHBjJXLK59B7vt4CUOF2N+aNsmDYe9A3j4n1EciLo09FDz7XEbsnraaT+oE+mUH8LRaP6QWDq2wV3xHXrNsyPHyl0Y6XCBoKeNkseP0oQIDTicBGgbPODbjSycXVwJBKdwHtqQlX/h3r2Y3TTQyEbnt9HGFp5w9ypL2EotH5AH5LRAyoL94wunqGOrdGUB2DzB9sX57jDS7vFI2v0P2y3zyQcpLEnYmIJ6lmCGK161RvKTcc3qZhannAWDyV0J5PUFK+v4jpms72gAWS6t9e3+T7/mMN5M6ImOSOyDQt1A7y3DKG4S0PaUx5E1bgUdFwOl+YTalMB27KyXGaTTDSmhtI1i7gL6qJkUXxU2TQiSSpqEgmOhbXQi7Gne0Y7n88/Ei8VbTJTCKszLTcvGDIW/3WGEKs7aGQVsKSRyuajmKnnnPtlcasfH1F+qEpqIJTTif6+YyXw1+vR60ToG5CZ3gU1wK5BPP0t5UAEelN1PmP+V4TFZY6RWp42v6XNyL7Wi2Fvge6tbdHTg/c4MR7XeefcVY/E9kYNdGr3v0DfFv310/7SfU3+U2xkvSdgG382G7mg3lcW19Ye881jB0MkvVrE6wLq/GnfA+zAPrFS48q9/oU26L9vMoA7iHK+f+70sh+mHDi6r1EMop0CGDoTtBRcQrOQpW6QvSSfkFogeRdMgNjUOuoy5V/qzWVoUHh8vwKVPphKRDQ1htBkJ2CP3omGqFmC2PBQ3L0Ufy6tJLIs1TO1CAYLGbtHoH0hJEpzl+iX8pMRKI85IzaU5F+WnSHoXVYJWjFqKP1zVkjAxCdvvXBuF8cYqHBiB/taI9VnVkcuFNHURT6B3Lj1","X-Forefront-Antispam-Report":"CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n\tIPV:NLI; SFV:NSPM; H:PAXPR04MB8285.eurprd04.prod.outlook.com; PTR:;\n\tCAT:NONE; \n\tSFS:(13230040)(52116014)(1800799024)(376014)(366016)(38350700014);\n\tDIR:OUT; SFP:1101; ","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"vRm/H4J9VQfn58tg5EWrByK69L95k/8JSRGKxja0nC3G2K+sbFNcJCtlHBnlTHSBgVikTTZit0jssxmplF4fMUqFdt8mgOOAt44xZ3pmslax8xc0Rx4WE0mOsCp2Uz4cSX1G2ZWAAznng5joAFaGWJvd2nQpfljcfOrZ68spypfHcxzTHA2L1IhMPSFKn6UgwUHx5Kz9ZpUrpEzddLIAXVIMgAs0+PCi7eJ+IQDle2OdL/O2ISLqSTDJNPoZlJiNvjKC5PW9NPFFr12sBgbBmU8q218/9SErV2OIELvEuSYsrGzeFcAJdmQo2wFzy8Q0hd2QBJZmO1tQi7qmDHb7DxZtIM6BNY/CfsyO2DVzqcUNEkkV6sqIjGjPXyUzof2axvKftqf5cg6gdQVA8WcWJHJu2JANgXTUr5GC080M1B7iLPOgwolpj4z7Up9d/2mb+ZrCRoZNtuQIsxRP33K3pvfKqowwoLtFQThrWSwqflOSEBJwJjTz3blPpziGqo2KEz5Lu41aO4JiLS4we9myS/6w6ZAbqe/az73K3lMBK7p6iTRYZr8GRPPls7cktPh2fPl+6QBDgPEqaeQypf2gc9qHKd6uagol7b1z9pBuUGRsBdIjTdC6QWkgIVHfVWRNNDbowcmoWjF/5nv2Oh0H4neZbXZmzg5qcIbrc3OmKH2gNXpVuVw+yFaMGmbdP+wgQLXyEtTVRjh6Gx1/02JUSdI25+Fd9gl31IIwvh0KEcLwVmhAHRLIDxxa1pVe54VVstfc4QJ6bjlrmgWWucqDluY+SiGRwwAdQp6VQBPQ85U5zTMHN5GQz7BXF0luUCuO7Oswt6aIgOm82qjgSarlITvddQ7UisX3tsHbaDq4GWCKAoNuxu924oTr2eSHaJToG7097k5OzZwELtK+ltNS8QTE5aMtp8zbrux7VSXRp0eiD94odAaikfUWmKDss21/qGAgLPz1+GZ94T6ivjAKRtOmpjr96vLLhXMe5/+rYzHpQW3G/r1RZdPmfLTEK/0gxBwa1SsT+wAEI3KO2cBR1PWO0+6gcAsbWLXvHsYKIMgoLK/W8QktV/K9zSvpB4T+64y9BwT1K8Gz9xeIRZsJ2Bdwrp0rGi1NcLeWOGASCXmMRRfNPaGt45SBjjHsrLNLbclZXXZW/sYxiDDC4gx4pqeRSN2tyTEs7K+N5cTmUmLQmzMk46wHoHJS6Bg4QdcHVCtoFtNaMDQ6aa4K22QstQ0LdapQJI5PsJhwz4nTnb/Fji4+NgBdJoXooy1AuoWFAHSt4Oa5JLvj0lBWZUAz3xs5bYUhXkR0pyp0fH3m6FT2f8ishHnzNH6o3ZRcPd2XH9AcQTDP47CwZ36KccdejmRPlkbFUoy+UydWrSt2x9odJHEq5gc554F2rj/b2drmVnFc8MeXRCLUJs/GIp1O2l5VDtQr8hOlt99km2SiIn5xtfV+Ka6azoC1s9r97SwXhyT84SBLSWiX6UyOxTyZw2mDJ5v3In7XxItpipx/XgqqyYeCX5o0uqdvBu530Wm7TsyImjBDYKAlYpNtYngrQ8GSp0Wo4/fmCk6lZvbOHdjutDJXwxTkEN1LRUcRA8or","X-OriginatorOrg":"nxp.com","X-MS-Exchange-CrossTenant-Network-Message-Id":"603f5fa8-1075-4902-c35b-08dd1d8a7561","X-MS-Exchange-CrossTenant-AuthSource":"PAXPR04MB8285.eurprd04.prod.outlook.com","X-MS-Exchange-CrossTenant-AuthAs":"Internal","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"16 Dec 2024 04:31:07.0559\n\t(UTC)","X-MS-Exchange-CrossTenant-FromEntityHeader":"Hosted","X-MS-Exchange-CrossTenant-Id":"686ea1d3-bc2b-4c6f-a92c-d99c5c301635","X-MS-Exchange-CrossTenant-MailboxType":"HOSTED","X-MS-Exchange-CrossTenant-UserPrincipalName":"yCQf8Rj6mHvpr06Prtl56yyxCNaXFCO4UlEqjcZcxVv/dXNqNJZ3EahtW0xv6sLl","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"GVXPR04MB9949","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"The conversions back and forth between GStreamer colorimetry and\nlibcamera color space are not invariant for the bt601 colorimetry.\nThe reason is that Rec709 transfer function defined in GStreamer\nas GST_VIDEO_TRANSFER_BT709 (5), is to be replaced by its alias\nGST_VIDEO_TRANSFER_BT601 (16) only for the case of bt601 (aka 2:4:16:4)\ncolorimetry - see [1].\n\nCurrently the composition of the GStreamer/libcamera conversions:\ncolorimetry_from_colorspace (colorspace_from_colorimetry (bt601))\nreturns 2:4:5:4 instead of the expected 2:4:16:4 (bt601). This\ncauses negotiation error when the downstream element explicitly\nexpects bt601 colorimetry.\n\nMinimal example to reproduce the issue is with a pipeline handler\nthat do not set the optional color space in the stream configuration,\nfor instance vimc or imx8-isi:\nexport LIBCAMERA_PIPELINES_MATCH_LIST=\"vimc,imx8-isi\"\ngst-launch-1.0 -v libcamerasrc ! video/x-raw,colorimetry=bt601 ! fakesink\n\nAbove pipeline fails to start. This change memorizes downstream required\ntransfer function when mapped libcamera transfer is Rec709 in\ngst_libcamera_configure_stream_from_caps(), and restores the transfer\nfunction in gst_libcamera_stream_formats_to_caps().\n\n[1] https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/724\n\nBug: https://bugs.libcamera.org/show_bug.cgi?id=150\nSigned-off-by: Hou Qi <qi.hou@nxp.com>\n---\n src/gstreamer/gstlibcamera-utils.cpp | 20 ++++++++++++--------\n src/gstreamer/gstlibcamera-utils.h   |  5 +++--\n src/gstreamer/gstlibcamerasrc.cpp    |  6 ++++--\n 3 files changed, 19 insertions(+), 12 deletions(-)","diff":"diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\nindex 732987ef..a466b305 100644\n--- a/src/gstreamer/gstlibcamera-utils.cpp\n+++ b/src/gstreamer/gstlibcamera-utils.cpp\n@@ -85,7 +85,7 @@ static struct {\n };\n \n static GstVideoColorimetry\n-colorimetry_from_colorspace(const ColorSpace &colorSpace)\n+colorimetry_from_colorspace(const ColorSpace &colorSpace, GstVideoTransferFunction transfer)\n {\n \tGstVideoColorimetry colorimetry;\n \n@@ -113,6 +113,8 @@ colorimetry_from_colorspace(const ColorSpace &colorSpace)\n \t\tbreak;\n \tcase ColorSpace::TransferFunction::Rec709:\n \t\tcolorimetry.transfer = GST_VIDEO_TRANSFER_BT709;\n+\t\tif (transfer != GST_VIDEO_TRANSFER_UNKNOWN)\n+\t\t\tcolorimetry.transfer = transfer;\n \t\tbreak;\n \t}\n \n@@ -144,7 +146,8 @@ colorimetry_from_colorspace(const ColorSpace &colorSpace)\n }\n \n static std::optional<ColorSpace>\n-colorspace_from_colorimetry(const GstVideoColorimetry &colorimetry)\n+colorspace_from_colorimetry(const GstVideoColorimetry &colorimetry,\n+\t\t\t    GstVideoTransferFunction *transfer)\n {\n \tstd::optional<ColorSpace> colorspace = ColorSpace::Raw;\n \n@@ -188,6 +191,7 @@ colorspace_from_colorimetry(const GstVideoColorimetry &colorimetry)\n \tcase GST_VIDEO_TRANSFER_BT2020_12:\n \tcase GST_VIDEO_TRANSFER_BT709:\n \t\tcolorspace->transferFunction = ColorSpace::TransferFunction::Rec709;\n+\t\t*transfer = colorimetry.transfer;\n \t\tbreak;\n \tdefault:\n \t\tGST_WARNING(\"Colorimetry transfer function %d not mapped in gstlibcamera\",\n@@ -379,7 +383,8 @@ gst_libcamera_stream_formats_to_caps(const StreamFormats &formats)\n }\n \n GstCaps *\n-gst_libcamera_stream_configuration_to_caps(const StreamConfiguration &stream_cfg)\n+gst_libcamera_stream_configuration_to_caps(const StreamConfiguration &stream_cfg,\n+\t\t\t\t\t   GstVideoTransferFunction transfer)\n {\n \tGstCaps *caps = gst_caps_new_empty();\n \tGstStructure *s = bare_structure_from_format(stream_cfg.pixelFormat);\n@@ -390,7 +395,7 @@ gst_libcamera_stream_configuration_to_caps(const StreamConfiguration &stream_cfg\n \t\t\t  nullptr);\n \n \tif (stream_cfg.colorSpace) {\n-\t\tGstVideoColorimetry colorimetry = colorimetry_from_colorspace(stream_cfg.colorSpace.value());\n+\t\tGstVideoColorimetry colorimetry = colorimetry_from_colorspace(stream_cfg.colorSpace.value(), transfer);\n \t\tg_autofree gchar *colorimetry_str = gst_video_colorimetry_to_string(&colorimetry);\n \n \t\tif (colorimetry_str)\n@@ -405,9 +410,8 @@ gst_libcamera_stream_configuration_to_caps(const StreamConfiguration &stream_cfg\n \treturn caps;\n }\n \n-void\n-gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\n-\t\t\t\t\t GstCaps *caps)\n+void gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\n+\t\t\t\t\t      GstCaps *caps, GstVideoTransferFunction *transfer)\n {\n \tGstVideoFormat gst_format = pixel_format_to_gst_format(stream_cfg.pixelFormat);\n \tguint i;\n@@ -495,7 +499,7 @@ gst_libcamera_configure_stream_from_caps(StreamConfiguration &stream_cfg,\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\tstream_cfg.colorSpace = colorspace_from_colorimetry(colorimetry, transfer);\n \t}\n }\n \ndiff --git a/src/gstreamer/gstlibcamera-utils.h b/src/gstreamer/gstlibcamera-utils.h\nindex cab1c814..4978987c 100644\n--- a/src/gstreamer/gstlibcamera-utils.h\n+++ b/src/gstreamer/gstlibcamera-utils.h\n@@ -16,9 +16,10 @@\n #include <gst/video/video.h>\n \n GstCaps *gst_libcamera_stream_formats_to_caps(const libcamera::StreamFormats &formats);\n-GstCaps *gst_libcamera_stream_configuration_to_caps(const libcamera::StreamConfiguration &stream_cfg);\n+GstCaps *gst_libcamera_stream_configuration_to_caps(const libcamera::StreamConfiguration &stream_cfg,\n+\t\t\t\t\t\t    GstVideoTransferFunction transfer);\n void gst_libcamera_configure_stream_from_caps(libcamera::StreamConfiguration &stream_cfg,\n-\t\t\t\t\t      GstCaps *caps);\n+\t\t\t\t\t      GstCaps *caps, GstVideoTransferFunction *transfer);\n void gst_libcamera_get_framerate_from_caps(GstCaps *caps, GstStructure *element_caps);\n void gst_libcamera_clamp_and_set_frameduration(libcamera::ControlList &controls,\n \t\t\t\t\t       const libcamera::ControlInfoMap &camera_controls,\ndiff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\nindex 8efa25f4..5e9e843d 100644\n--- a/src/gstreamer/gstlibcamerasrc.cpp\n+++ b/src/gstreamer/gstlibcamerasrc.cpp\n@@ -433,6 +433,8 @@ static bool\n gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n {\n \tGstLibcameraSrcState *state = self->state;\n+\tstd::vector<GstVideoTransferFunction> transfer(state->srcpads_.size(),\n+\t\t\t\t\t\t       GST_VIDEO_TRANSFER_UNKNOWN);\n \n \tg_autoptr(GstStructure) element_caps = gst_structure_new_empty(\"caps\");\n \n@@ -448,7 +450,7 @@ gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n \n \t\t/* Fixate caps and configure the stream. */\n \t\tcaps = gst_caps_make_writable(caps);\n-\t\tgst_libcamera_configure_stream_from_caps(stream_cfg, caps);\n+\t\tgst_libcamera_configure_stream_from_caps(stream_cfg, caps, &transfer[i]);\n \t\tgst_libcamera_get_framerate_from_caps(caps, element_caps);\n \t}\n \n@@ -476,7 +478,7 @@ gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n \t\tGstPad *srcpad = state->srcpads_[i];\n \t\tconst StreamConfiguration &stream_cfg = state->config_->at(i);\n \n-\t\tg_autoptr(GstCaps) caps = gst_libcamera_stream_configuration_to_caps(stream_cfg);\n+\t\tg_autoptr(GstCaps) caps = gst_libcamera_stream_configuration_to_caps(stream_cfg, transfer[i]);\n \t\tgst_libcamera_framerate_to_caps(caps, element_caps);\n \n \t\tif (!gst_pad_push_event(srcpad, gst_event_new_caps(caps)))\n","prefixes":["v4"]}