{"id":21881,"url":"https://patchwork.libcamera.org/api/1.1/patches/21881/?format=json","web_url":"https://patchwork.libcamera.org/patch/21881/","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":"<20241113072947.1579075-1-qi.hou@nxp.com>","date":"2024-11-13T07:29:47","name":"[v3] gstreamer: Add GstVideoMeta support","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"e9353c764e6e36d1ff001efcef92198313cd5a01","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/21881/mbox/","series":[{"id":4788,"url":"https://patchwork.libcamera.org/api/1.1/series/4788/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=4788","date":"2024-11-13T07:29:47","name":"[v3] gstreamer: Add GstVideoMeta support","version":3,"mbox":"https://patchwork.libcamera.org/series/4788/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/21881/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/21881/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 63F1BBE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 13 Nov 2024 07:30:38 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id ACF4D65800;\n\tWed, 13 Nov 2024 08:30:37 +0100 (CET)","from EUR05-DB8-obe.outbound.protection.outlook.com\n\t(mail-db8eur05on20614.outbound.protection.outlook.com\n\t[IPv6:2a01:111:f403:2614::614])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AE2B6657FA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 13 Nov 2024 08:30:35 +0100 (CET)","from PAXPR04MB8285.eurprd04.prod.outlook.com\n\t(2603:10a6:102:1ca::15)\n\tby DB8PR04MB7132.eurprd04.prod.outlook.com (2603:10a6:10:12e::16)\n\twith Microsoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8137.29;\n\tWed, 13 Nov 2024 07:30:33 +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%3]) with mapi id 15.20.8158.013;\n\tWed, 13 Nov 2024 07:30:32 +0000"],"Authentication-Results":["lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=nxp.com header.i=@nxp.com header.b=\"MhNSE9uF\";\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=nmOx98fJsH+k9fyNUdOvoA6aDgHD24uMvjFbZcN/w/4jrt5JyJHqnyqM6jNd6J831zkhMHwDC7EEB7RL467TWU6E2ILuJ6BgEyMopX3waaIGl6RJtXljKN4yDh5lSrMMcgqdjsYCVTMlyJ4MFnxqAqsuyCsA2wcHbf1eqHzQoByWSeLsn/5WhiCf9z+uz+7KYBz2ykcVm0snukOyBGvZlVh8fZ3Ef7jXUiHESQ9P/FDhMQiIdPl7RXylPnLj3hfw8jT0+pCl1yt+0EYGBQDA8OfJl/LYp5cEhMrtrX+R9QYUqLf1LHapT8Uw23DKxb+atWxfvOJ9ql8CGyIDAA6WfQ==","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=dqF6enlbE4G0XW88dLHz3yvqwAsx5ZL8egpRlgK/jXQ=;\n\tb=oCRVF5KyUFxCpyqJGbP9zWUOhOgfy7t6DDWBLlP5w2esl0lIV7HcAqF0oBz2QXLjOl9hlFvVF8X+R7NMJCCbnS9aM6nqRPVgNb/MdZmHkb81J2YDy5F8A9g2ARReQ5d+zQhOMkRjgef75whZjWxAf09kMPmGw1N1NuYeYr5VwWsHUDKTrFWh5p6KTORBx+SJshLQZ1EYU3ac5jkQ81VQ3QYtWYW7hUgdS1Lsy/ZnfiauulDiB1z+NZyhjFI7+VbfXeaxlQAwSCdCOSKR04Pt/9NOFz1sIAkxR4vzJCSY/QZgFCoPJCy2trF53/EBUcoPc2eXvP1oTeUuZFb93KZULg==","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=dqF6enlbE4G0XW88dLHz3yvqwAsx5ZL8egpRlgK/jXQ=;\n\tb=MhNSE9uFaXiwx/MFZazd+XrMQqkzFp3Kmu5FO7jqGVNR7QiRr2nGXcId6ssfepqRPSKuuUY063YahpnVKoMyCbyBnh3pHY+VwOiqoDlp65U+Z/VSsj17jX2gCyPBqEn3XtaBBw5bvVRPuypylIaMZsx1z6elQFbEBsB04sf0bHaN9TCj6SQlA0Y0yvSLAukADh3D+dnIIFJOQGtxtDYb9jHo1yjrWUPk2fHwLZqtXSS6zBKy6ggZfY1+zzyRE6RwMRonoQj256at4Jzsepg0vsSlQv3dWxHCrjXsW65hzk6j/vgAbllBpkkuz9L5Bt8K9fvX7ZfNGDfXxD8cNb6Qcg==","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 v3] gstreamer: Add GstVideoMeta support","Date":"Wed, 13 Nov 2024 16:29:47 +0900","Message-Id":"<20241113072947.1579075-1-qi.hou@nxp.com>","X-Mailer":"git-send-email 2.34.1","Content-Transfer-Encoding":"8bit","Content-Type":"text/plain","X-ClientProxiedBy":"SG2PR02CA0041.apcprd02.prod.outlook.com\n\t(2603:1096:3:18::29) 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_|DB8PR04MB7132:EE_","X-MS-Office365-Filtering-Correlation-Id":"1e06de68-6ebc-462b-67b8-08dd03b50e99","X-MS-Exchange-SenderADCheck":"1","X-MS-Exchange-AntiSpam-Relay":"0","X-Microsoft-Antispam":"BCL:0;\n\tARA:13230040|1800799024|52116014|376014|366016|38350700014; ","X-Microsoft-Antispam-Message-Info":"eF5kKVudTYHsaRo26+3ccIZZImenkWrQgF4cpJU4L1OkKWumN60pNyJzZZJZPTpZ70XbnGI2YkXQ/5sv9MVGM9FiRJ1sBQY+yP/66XWAzMyfDTuRDsFRNcxhAAwcXIpGbMZ7wHoWLe1JeQowc8oTrB9+rsX3bU/vW5QfpRD6/LJvs5xNs7NFk0au7ZaxhVIWkdqlE7q18Z4yLPNWM4yQr6uI9JUpYbeAm/7/bF4DhIRjHcrAkPXV8CxIjFQ9Wvd8c6kWR7Bdm5fGDraMpDvDY4Ep6km7g6KLLXee306oRojJ7hfj3ixemTX8E7Vil1Fhze0wEHjGayMlwSBh1osdlnUiiwTP1gPdFYcjaelgC5oFnk4o2nFyEn4LxcRm6ar/sPdhp3EwrhEIyStIvLjnr1wsqgQjNIyIztHwcEHzOQJs0SIqlhG1mnGmPCpgih2XHiwFFVQldFNnErUBHPBNh06EuyojWKYp1HcxMgReBgJwiIj4VHauk4WzLoRuihqsC7+jc6hsYxGfBSl1cWzxbByWfVqVPxvvJQOhdpjIurMtvqAFfn+bZunElWhaChOfWh9WKpy66PiFG3ygmBc1JdP7OdbiDPQ6zP6yRUr24b5K/eoLSiFLLI1kO12KasmQXAEyyJHR7V7BxYSKgJ3broDj2IDrOiwRB3O9Co5nZzNeHbbtFye3DKxsnoDKaOl+lKviuMuhN5X0yqdPdyn9tcuWgxq4j0qXkw1XFJDUxEz+1L2MMUFgb721ejUPxm/Wvm8ioLnFSr+o6zgUVdopjH2RqPTbnrNVZ3NfkRanOVHYgoCJI4huYSXumVW6PXdASudniVVD/emvIK8Rhm8LzuNQJIHaghK5b2t+1c9Kcmb4axEvriExqsl8snvkjAcRHODJU4LONRQjHLxNo0o/z+y//r4TDqFSu3l3zNW5Zym0NHhacM5Q8J4DRzC8L903vHj1CyGgZGae2tLGa0caG274mg056MbojMwceWgDuIeGfve5vaS8yqkN0yn1uIGESzobKUJfPNqSn0uC7rbjKx9prjnW/yNkh9q98FFmDOCoAolWjzdwDggPD6POFAujfMBb7sYabYDI9e9AhY8IpwmfcPi9uvuMxr5ld6ICKunti7tmlz2KxkVJilghR83SXmsbF+WHLf4d4jlW0Tz/I60yTO8YTfLc1dDPKTujG4P2wCnW/UYA169GMag4wQUCc8H4Fq2g9BHk0iHJQfZ+RYFLEIyttDZ/lgZjrmqdLatKv3kRbJyUFpzD5dFhSt+dP0YTjeorbGZ6cnYiZtD/RzIBJk0mFrxeEhI7FHn6xyeDAiZez5W5EXNOKAu1ZMRDoF7CPbosXGFn3Z1EhzGSd1ivVuhn6JkmXV1oW7S0HwM=","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)(1800799024)(52116014)(376014)(366016)(38350700014);\n\tDIR:OUT; SFP:1101; ","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"hcyfs6n7zSH0lax+5uQ+vs1phnbLpdHhqhjQ7Tg0xkgwSTjkkTKP1agxxdhrFHRZQP2irpFzHbFVr4IpYGcEBvNf3Fp/SDXCNAzVPUbnEdon62BxqKks50iyindBgpv1pXjUT/PUuRvqcRriTOEw0Qr4wOaMH3tWix5U6LaMw+o19Ozzr2G6r4WEFq00zyKuC6+86HkpwgXJKJpvGFeWLfFcJcRnvTNmZoKbEVPEQfhJR5y5Wsin0gE+l8uLRecI12CXdlfOYXNArA5RhwRaiWWMaApsMzbvg4Cb/6qYR+05YzPJbiKKHOdjfrcx9Dn9BuCf6fYt+kD9gdGbVHr32xKo6VPh+7Zbglo/NnyU1Co6Or1K7+QXcp18ySMKJdAiAUUBqToAEPnBBAzpn9AuD0+G0P5oPb/EdQnmXY/lUlbO1DXOvOvpPkIfjkSK3PVNZP3kNxnq5ZBAIqHMG/KU5RlP5My+URBi3I1Ine7jnXbb2j5qQ3/5Q1m90GxxnxPOXX9wTvC6wiv6yZ+IIfj8F1aQlmvjQ3tiA4eVOXTn4J1d8wGc9iXHkCFs59PhJmbRkx9qi47cO77i7lVeG2BnrWxyXzBgyfKlvI4Dcv3azzV2/fUI3EkMt6kLmH5V9pkNYG5dCANtzHrLdzKtAUOq7ygTwg+xnJ7vQzTNtf0hEZednStLB7EIDgyVFZ3lXyQ9p0YI2TZSrA/yC8vYY/Pp7q7SeumCd5L86Xu3XIkq+fontYhkNr4LUZpLZPHpWc9J6IwGJjqIWB4zyYhZvJSSXc6SJH8FhNzTLukwH39prHv1+gQefVaePLoeTtuXS/hlUj42hVS4kvSv9VyYsw4I2X6soBr31vDPb6oYU3OQ+LFq0GPLCk98KIa9LkSvVxnAg2JfynoWJ9E3sfmTJ6D5LyD/UDulC0xznA3Sv2EuckEKdMM4Rhb6cLSj232UKxjKGtEQnH3uDFxCg9R/8xKtbPzdmQ146Po16gtrbTBPOFCZvagPdEtvSPeBjgb2jCiYyvHfo5Mw5LZWpE2VY9iSZHXCIOZ9yMLCODm1MvrMPTFP9R+TQrUoJugA6jecm+HFPeSzIT7vCujLBfok4QqXFLGR0L8I8r03UMVwA6gr1JcfNYtyYYwXDA770Qrm/6VI3Q/3yVHfAxe/lp84CDFmcJl93E3adae8LOCM1b/ZRgTq5gzvy5rM2Hd0n3+P/3yNB3p+jj+o5rJ5fD+hhzuhawxQkt6UBm6lX2dPNoTfcbN3zTWV9GW/ZXOrDu9alKSZUJf/5HOidRgo0G1tNhUx2T0delaI65A8gQTOTlOLlucx80O1LCC2UtuvAjNbvbHmZML/AzvDCjmlAUkbM03OctAb9A2ofMdN6QXmT56Bwty3tV3CW988RXJ/z4sJyqaL3XY1EuCKIgkeCsz2JMHknTZmSC2vaxGQgRg4Uc//GWT+A6N5OWAzDZ3lbXphQKHydpWF3dYeM4vHUzX7RNnkgxFzR0oern6vd/f6mqhRhTLfbsPTNxhK5l9C3vElYHHA56X+2RWcagVFRToD2OyY5FlwTVoHNnusmMh8rYr46eY=","X-OriginatorOrg":"nxp.com","X-MS-Exchange-CrossTenant-Network-Message-Id":"1e06de68-6ebc-462b-67b8-08dd03b50e99","X-MS-Exchange-CrossTenant-AuthSource":"PAXPR04MB8285.eurprd04.prod.outlook.com","X-MS-Exchange-CrossTenant-AuthAs":"Internal","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"13 Nov 2024 07:30:32.8442\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":"1OXlM6l36HjhbqbP+QpyYqcnZV5EcVMCuBtxAaDKXoZfBxg8SIQdJECpSgh2S7LG","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"DB8PR04MB7132","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":"GStreamer video-info calculated stride and offset may differ from\nthose used by the camera.\n\nThis patch enhances downstream plugin's support for videometa by\nadding videometa support for libcamerasrc. It ensures that when\ndownstream plugin supports videometa by allocation query, libcamerasrc\nalso attaches videometa to buffer, preventing discrepancies\nbetween the stride and offset calculated by video-info and camera.\n\nSigned-off-by: Hou Qi <qi.hou@nxp.com>\n---\n src/gstreamer/gstlibcamera-utils.cpp | 28 ++++++++++++++++++++++++\n src/gstreamer/gstlibcamera-utils.h   |  7 ++++++\n src/gstreamer/gstlibcamerapool.cpp   | 32 ++++++++++++++++++++++++----\n src/gstreamer/gstlibcamerapool.h     |  2 +-\n src/gstreamer/gstlibcamerasrc.cpp    | 14 +++++++++++-\n 5 files changed, 77 insertions(+), 6 deletions(-)","diff":"diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp\nindex 732987ef..91de1d44 100644\n--- a/src/gstreamer/gstlibcamera-utils.cpp\n+++ b/src/gstreamer/gstlibcamera-utils.cpp\n@@ -2,6 +2,9 @@\n /*\n  * Copyright (C) 2020, Collabora Ltd.\n  *     Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>\n+ * Library       <2002> Ronald Bultje <rbultje@ronald.bitfreak.net>\n+ * Copyright (C) <2007> David A. Schleef <ds@schleef.org>\n  *\n  * GStreamer libcamera Utility Function\n  */\n@@ -591,6 +594,31 @@ gst_task_resume(GstTask *task)\n }\n #endif\n \n+#if !GST_CHECK_VERSION(1, 22, 0)\n+gint gst_libcamera_extrapolate_stride(const GstVideoFormatInfo *finfo, gint plane, gint stride)\n+{\n+\tgint estride;\n+\tgint comp[GST_VIDEO_MAX_COMPONENTS];\n+\tgint i;\n+\n+\t/* there is nothing to extrapolate on first plane */\n+\tif (plane == 0)\n+\t\treturn stride;\n+\n+\tgst_video_format_info_component(finfo, plane, comp);\n+\n+\t/* For now, all planar formats have a single component on first plane, but\n+\t* if there was a planar format with more, we'd have to make a ratio of the\n+\t* number of component on the first plane against the number of component on\n+\t* the current plane. */\n+\testride = 0;\n+\tfor (i = 0; i < GST_VIDEO_MAX_COMPONENTS && comp[i] >= 0; i++)\n+\t\testride += GST_VIDEO_FORMAT_INFO_SCALE_WIDTH(finfo, comp[i], stride);\n+\n+\treturn estride;\n+}\n+#endif\n+\n G_LOCK_DEFINE_STATIC(cm_singleton_lock);\n static std::weak_ptr<CameraManager> cm_singleton_ptr;\n \ndiff --git a/src/gstreamer/gstlibcamera-utils.h b/src/gstreamer/gstlibcamera-utils.h\nindex cab1c814..14bf6664 100644\n--- a/src/gstreamer/gstlibcamera-utils.h\n+++ b/src/gstreamer/gstlibcamera-utils.h\n@@ -2,6 +2,9 @@\n /*\n  * Copyright (C) 2020, Collabora Ltd.\n  *     Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>\n+ * Library       <2002> Ronald Bultje <rbultje@ronald.bitfreak.net>\n+ * Copyright (C) <2007> David A. Schleef <ds@schleef.org>\n  *\n  * GStreamer libcamera Utility Functions\n  */\n@@ -35,6 +38,10 @@ static inline void gst_clear_event(GstEvent **event_ptr)\n #if !GST_CHECK_VERSION(1, 17, 1)\n gboolean gst_task_resume(GstTask *task);\n #endif\n+\n+#if !GST_CHECK_VERSION(1, 22, 0)\n+gint gst_libcamera_extrapolate_stride(const GstVideoFormatInfo *finfo, gint plane, gint stride);\n+#endif\n std::shared_ptr<libcamera::CameraManager> gst_libcamera_get_camera_manager(int &ret);\n \n /**\ndiff --git a/src/gstreamer/gstlibcamerapool.cpp b/src/gstreamer/gstlibcamerapool.cpp\nindex 9cd7eccb..315f08ac 100644\n--- a/src/gstreamer/gstlibcamerapool.cpp\n+++ b/src/gstreamer/gstlibcamerapool.cpp\n@@ -135,16 +135,40 @@ gst_libcamera_pool_class_init(GstLibcameraPoolClass *klass)\n }\n \n GstLibcameraPool *\n-gst_libcamera_pool_new(GstLibcameraAllocator *allocator, Stream *stream)\n+gst_libcamera_pool_new(GstLibcameraAllocator *allocator, const StreamConfiguration &stream_cfg,\n+\t\t       GstCaps *caps, gboolean add_video_meta)\n {\n \tauto *pool = GST_LIBCAMERA_POOL(g_object_new(GST_TYPE_LIBCAMERA_POOL, nullptr));\n+\tGstVideoInfo info;\n \n \tpool->allocator = GST_LIBCAMERA_ALLOCATOR(g_object_ref(allocator));\n-\tpool->stream = stream;\n-\n-\tgsize pool_size = gst_libcamera_allocator_get_pool_size(allocator, stream);\n+\tpool->stream = stream_cfg.stream();\n+\n+\tif (caps && gst_video_info_from_caps(&info, caps)) {\n+\t\tguint k, stride;\n+\t\tgsize offset = 0;\n+\t\tfor (k = 0; k < GST_VIDEO_INFO_N_PLANES(&info); k++) {\n+#if !GST_CHECK_VERSION(1, 22, 0)\n+\t\t\tstride = gst_libcamera_extrapolate_stride(info.finfo, k, stream_cfg.stride);\n+#else\n+\t\t\tstride = gst_video_format_info_extrapolate_stride(info.finfo, k, stream_cfg.stride);\n+#endif\n+\t\t\tinfo.stride[k] = stride;\n+\t\t\tinfo.offset[k] = offset;\n+\t\t\toffset += stride * GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT(info.finfo, k, GST_VIDEO_INFO_HEIGHT(&info));\n+\t\t}\n+\t} else\n+\t\tadd_video_meta = false;\n+\n+\tgsize pool_size = gst_libcamera_allocator_get_pool_size(allocator, stream_cfg.stream());\n \tfor (gsize i = 0; i < pool_size; i++) {\n \t\tGstBuffer *buffer = gst_buffer_new();\n+\t\tif (add_video_meta) {\n+\t\t\tgst_buffer_add_video_meta_full(buffer, GST_VIDEO_FRAME_FLAG_NONE,\n+\t\t\t\t\t\t       GST_VIDEO_INFO_FORMAT(&info), GST_VIDEO_INFO_WIDTH(&info),\n+\t\t\t\t\t\t       GST_VIDEO_INFO_HEIGHT(&info), GST_VIDEO_INFO_N_PLANES(&info),\n+\t\t\t\t\t\t       info.offset, info.stride);\n+\t\t}\n \t\tpool->queue->push_back(buffer);\n \t}\n \ndiff --git a/src/gstreamer/gstlibcamerapool.h b/src/gstreamer/gstlibcamerapool.h\nindex 2a7a9c77..8ad87cab 100644\n--- a/src/gstreamer/gstlibcamerapool.h\n+++ b/src/gstreamer/gstlibcamerapool.h\n@@ -21,7 +21,7 @@\n G_DECLARE_FINAL_TYPE(GstLibcameraPool, gst_libcamera_pool, GST_LIBCAMERA, POOL, GstBufferPool)\n \n GstLibcameraPool *gst_libcamera_pool_new(GstLibcameraAllocator *allocator,\n-\t\t\t\t\t libcamera::Stream *stream);\n+\t\t\t\t\t const libcamera::StreamConfiguration &stream_cfg, GstCaps *caps, gboolean add_video_meta);\n \n libcamera::Stream *gst_libcamera_pool_get_stream(GstLibcameraPool *self);\n \ndiff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\nindex 8efa25f4..c05a31e7 100644\n--- a/src/gstreamer/gstlibcamerasrc.cpp\n+++ b/src/gstreamer/gstlibcamerasrc.cpp\n@@ -497,9 +497,21 @@ gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n \tfor (gsize i = 0; i < state->srcpads_.size(); i++) {\n \t\tGstPad *srcpad = state->srcpads_[i];\n \t\tconst StreamConfiguration &stream_cfg = state->config_->at(i);\n+\t\tGstQuery *query = NULL;\n+\t\tgboolean add_video_meta = false;\n+\n+\t\tg_autoptr(GstCaps) caps = gst_libcamera_stream_configuration_to_caps(stream_cfg);\n+\t\tgst_libcamera_framerate_to_caps(caps, element_caps);\n+\n+\t\tquery = gst_query_new_allocation(caps, false);\n+\t\tif (!gst_pad_peer_query(srcpad, query))\n+\t\t\tGST_DEBUG_OBJECT(self, \"didn't get downstream ALLOCATION hints\");\n+\t\telse\n+\t\t\tadd_video_meta = gst_query_find_allocation_meta(query, GST_VIDEO_META_API_TYPE, NULL);\n+\t\tgst_query_unref(query);\n \n \t\tGstLibcameraPool *pool = gst_libcamera_pool_new(self->allocator,\n-\t\t\t\t\t\t\t\tstream_cfg.stream());\n+\t\t\t\t\t\t\t\tstream_cfg, caps, add_video_meta);\n \t\tg_signal_connect_swapped(pool, \"buffer-notify\",\n \t\t\t\t\t G_CALLBACK(gst_task_resume), self->task);\n \n","prefixes":["v3"]}