Show a patch.

GET /api/patches/23471/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 23471,
    "url": "https://patchwork.libcamera.org/api/patches/23471/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/23471/",
    "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": "<20250605063741.1527483-1-qi.hou@nxp.com>",
    "date": "2025-06-05T06:37:41",
    "name": "gstreamer: Fix libcamerasrc responding latency before setting caps",
    "commit_ref": "4a277906a41e73b4e35e1c528f906e3c70938b16",
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "65d2aaf5adc7b2c86426fef1572daf8477223581",
    "submitter": {
        "id": 195,
        "url": "https://patchwork.libcamera.org/api/people/195/?format=api",
        "name": "Qi Hou",
        "email": "qi.hou@nxp.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/23471/mbox/",
    "series": [
        {
            "id": 5206,
            "url": "https://patchwork.libcamera.org/api/series/5206/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5206",
            "date": "2025-06-05T06:37:41",
            "name": "gstreamer: Fix libcamerasrc responding latency before setting caps",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/5206/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/23471/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/23471/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 C83B1C31E9\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  5 Jun 2025 06:38:08 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8111F68DB3;\n\tThu,  5 Jun 2025 08:38:07 +0200 (CEST)",
            "from AS8PR03CU001.outbound.protection.outlook.com\n\t(mail-westeuropeazlp170120005.outbound.protection.outlook.com\n\t[IPv6:2a01:111:f403:c201::5])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AC02B60342\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  5 Jun 2025 08:38:05 +0200 (CEST)",
            "from AS8PR04MB8278.eurprd04.prod.outlook.com\n\t(2603:10a6:20b:3ff::22)\n\tby DB9PR04MB8169.eurprd04.prod.outlook.com (2603:10a6:10:25d::9) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8813.20;\n\tThu, 5 Jun 2025 06:38:01 +0000",
            "from AS8PR04MB8278.eurprd04.prod.outlook.com\n\t([fe80::8e33:9371:b4c5:c059]) by\n\tAS8PR04MB8278.eurprd04.prod.outlook.com\n\t([fe80::8e33:9371:b4c5:c059%4]) with mapi id 15.20.8813.018;\n\tThu, 5 Jun 2025 06:38:01 +0000"
        ],
        "Authentication-Results": [
            "lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=nxp.com header.i=@nxp.com header.b=\"bclzELB0\";\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=Q8wnjby9gkTaztK8Aq8bUdx4QmsmwM/ZtGrGRqzkX/Vxby4BCcSunc3toJmZvoHW4suskz88iXLeDKeINEZC7mdzYQD7H+VX2glOYBCDRco5mn+i8qA12TgdSyWq2ukahlHbQ+Z4ZKZhkjb58oeuQ4w0XgvPuzoGnhQdggfuT2PGPitl/hVGYWYIEpvYEFvhT5O4l18V+7E7NFIgZPe+Z5UVvWzLWbujnfPQj0eDNgu4HP3QaN6+gak378mCwHEPd4hWOjuU9mcK4RHmk9q/K3P7NUoMSfyykQT4fi57OcyPFxpj33JeKUv8L1CeKf2hBb9J26dz/Tpd/ltPoCA+oQ==",
        "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=EqmXcjAYZVL5m+QPFUIxvZOq6t5HSzACQvfffgCWyxI=;\n\tb=YqPz1aCPHzE6vfs3RkxVUIA8UlHXKmGyi7U7F4GJwgkuVcwlAP8pw/3cJLdy4UKWu3uchFwFTl6brYlnOBQt4ktT9ouicbWdnY9cTvhLZjpKnYH9hdhStLS/X3zy16MtAe5ji5udac2khRP8piPjFTKR8691AEou63dVR3X7IKrgJOeh+9mmGdwPobJw/wTzvWr5u9Vy5FcHR6OvbMjZaRwT4vzOkH6Uj2oZ9pth/NS0bt0Z0TBlWyWXmAeKfHqKySRyhkQzX/22a/UlgRpLWaceqEQvtDrgnTVPRRuAqkNAgRdEsFyKNc/c3ec5fz0hLBPZv1vC1KKle7FzWYj3rQ==",
        "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=EqmXcjAYZVL5m+QPFUIxvZOq6t5HSzACQvfffgCWyxI=;\n\tb=bclzELB09kDjI7NKWCcEUQ7wfLxDusNQdEWCJKYtVxbRhV46z/KYg7W8PKYdo5jJ/C8i/s0tbWbVe3Z2Wl8yDBO23BObrWJUe93EXiUtjlRWnfX/VisXBu1s6IkkHpTS4SumZlBx9SmxIiEdGZw0Sg4nMgw6NueoO0qbNnXLZKCN/dBzic1FKY0drp+heWVaaM0KasJhtKs/xQCguncvrygil7Tu3zIcQ8COkT4qwAcWZRu2YAnfOPCovqyKqqEjqm8WHrpkH0z5fjFACqbjtYpu85UmPDfp3h2As9UC5gWst3zuA288pGtSXx5Y2O3P4eVvO0mMHDxe65vqS6JKzQ==",
        "From": "Hou Qi <qi.hou@nxp.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "nicolas@ndufresne.ca, jared.hu@nxp.com, qi.hou@nxp.com,\n\tjulien.vuillaumier@nxp.com",
        "Subject": "[PATCH] gstreamer: Fix libcamerasrc responding latency before\n\tsetting caps",
        "Date": "Thu,  5 Jun 2025 15:37:41 +0900",
        "Message-Id": "<20250605063741.1527483-1-qi.hou@nxp.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "SI2PR02CA0051.apcprd02.prod.outlook.com\n\t(2603:1096:4:196::10) To AS8PR04MB8278.eurprd04.prod.outlook.com\n\t(2603:10a6:20b:3ff::22)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "AS8PR04MB8278:EE_|DB9PR04MB8169:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "17d255b5-9ca9-46ee-3487-08dda3fb843d",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;\n\tARA:13230040|376014|52116014|366016|1800799024|38350700014; ",
        "X-Microsoft-Antispam-Message-Info": "9VYxP7uxQ3YgMKKLelNXCLsT4Pqg1NAJZlXZJE7i2B4FPyidv4DlP84bwuz6kfHHoMxUntnvwRas/yONwbKgkhfa6Z1+XudBI0Hzw74dGFCHkwtor9CSrkJMWDrION87EEK3ChS2s21V+EYzEWoi5uf05eSqtQCH3JZXqmf37ymGPVDzh7f5bSsxPtoD8+pTbvBK442s4CFDPGd30R7+YiDa/jdnztAJkD1wwXF1BE6M5i3sInMUm3R8d6AQgstYToJmgdeDReryqqlTY9YwtwhPsXN16Der7ngyj5EBnfLb0fdRKpKLQI3Z48eyhu78uZbZO5bP7eOXXoMESx3Mxs6Po3PmVM5LubnWrIcarpuZKSCDYJpV8K/fv/FFZHGNRzQiMw+qaIMz7bdViwl1DZluzyMqPYGZanHEsty8yWG6dRLHc8h9FFkzB92901lRERmf8kmVdFfjqHQ2ofEtEy3tUlPDRmg3JcdGkALS6MlyInkKSSlR1i27uAckbhiK5xMyh3RzjRBnHfynL1QxOw1VH+F2ArgwHY8HeXqqy0i0JJqdpszDAHvcOFS8RxdirRkkYMbVfBP0J3s8fir+VXhHAaZTyj3JPZR+9YUju5n1Obmj5kSMW+172PSwgJNJPR2PSEct547QQD5x2HNkxVncz20O8ffHhLCK5fCS5Z1q69MzYBcbd11PZcqunsUKPPcNaXTtBaxNu01IdR7swk1scrT+P4tjZtfCGBo10D6yh9zm9P2+SqJ+CYRmF1ppxA5RvltDGVNwcHYiSIpuhujxHDqwMsOUYrvm/CRnx1UIBNRm+h3Gx30Lk2K/P9Sm7mje2CM2XJIjbnYKBusQtoo0sEK8dnWWmSVUsWDzpAaMvP4w1GJrSk+GRxs0w1py0UOBHegTMQfD9EEcOhbsdjmBog/Un1r3l6mHsb6K2566s77Rlt86hu/9U82twTECp0fmPEuOZRc1/Lz3mD0u4Nvs6uptAULo0s3EUfczi2aFsQDlOnMaZ7+MvGqDEjQbqncoLIg4IWzcTywQAEhwWkVVG/bUYZS5gKyfEwL/5cKVxfXc6IvxEnJNLzf2Ut5SRWMnTxfLJEleCKrlS99fmolKdsp5X1lqADhyFsxpOj4jZ/jonfpDvb5f1luEevm40vewG67J8Xj4G+2Eu41+OvoLi1ZegYe9Klb45FAr9c7Xl7zk4k3+dLfpwOgDR3nz7wRFtk0nOwhUUD/Uj8ZQLrP3xCeC0Tl0ArKQYXzl1vCkSdgwhXeC1IqNu4iO+X/9HK7uyUxI6x9NIyIyVc28KWK8IQH7cM0eiVlRxwgXfbPHQVqW/IyBI0JSo7ac8rhbAIbTJypH2VrtHqxw1aswU5mroQeLrvobX3jJi45olE/mvsJgAE6RvaM/BQxjqrrUVJ2sbD0aLQbmlhRDUA648db7qOmVqjfeiQ691vfORkr2oGqTvENFSX1UeDL295q0GEsBpVtCkULjkizpls68ZXhx7cStsMz6zRykjN1gqsw=",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n\tIPV:NLI; SFV:NSPM; H:AS8PR04MB8278.eurprd04.prod.outlook.com; PTR:;\n\tCAT:NONE; \n\tSFS:(13230040)(376014)(52116014)(366016)(1800799024)(38350700014);\n\tDIR:OUT; SFP:1101; ",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "6g/39FDjkO1MCd8PUF7iNFnGIS8vlOMRX8njWxX2pFX5dsFyah3VrSKeIE8TpYHywi9l0pgS1PHR4ritVSDD3TRkBLQmNeuERAN0ZaOsCd/1OI1yrwIfKc0y0VvFaF3g6l4pOrgfLc2mfHP68MLmHvEgpJchUEJoPbycC/TI8gI6gOwfKxkLKRrY9Hdroj8OQ80DmFtgu0pwSpGt+v8IIizUJ4z+/8t7SLP6Y2WVcjSA6mhgUomNk/8XHeXalOhVymoqY3TxKPqNm7ne5Iwn4atYUmzjmRpDniO0Kj2TLjruR1B/ZmnU+vzGF02nlOUU/2UiyFrDusvH07i8zK4we8LHbL2SCVYwAMoQEpqB5+YSjtqMlcNQ3+Pc/cbhY/sO+VTyr0OeFDsVlgIFJ1Id9UoKfb3b1z7+tdOcJIE/IJQOXg+vyUj7bMbocaZ124mEHl+SCMcF68KRi5UrWckTvkGAosJz1Yj4X3xdLLVuNVBr3o5EABAfDKYOZPrH9Q/v21RMLskfl1qmdHXdqKljYpQpoF3Coq2kPcIwHLSWtA/sU+LxQ4b/glg73Nq1BC84ibXA0WB3OM8q/XzNsHySRJUTrBYSB+AVWWVXmdndPmlLjaghC/fBMhZic5MyG0S6yAGD8zQV9raG3WBh14Y/PQeoxZZexeSrYyIgFOTRvY3nfLkb218VewGUBoMyC1MBVn8Y6AdnenJNUfHPR2JxtYpZRdukAgn5phAFkwGZ6E/cT6RAzCCKEsXPbFu4zsPNBsRTOZ/AZSAnf5E21RLYRSOfAWSPFYAK5yun8ehfCFlOzyWBTakSPi0yRiB4emGdwElBT3lbkB7FiKCYcbF7DuRJ3GBeQAAf8I7kypPI+RjIYeVaTwMqVVekQCU8AOLwmXcTP64RCAQsPOMjiPw5f0ajxeeNrAeh5mYqkJJ/oF6FwE4jk46/otKoa/ygtA8qFvvjjn8qaDCy3VQQWEJ+PbhxggDpjR3IXCCZw5LqB1fmaLWRSwFWJqq+TPwBuqwr1aoEJ2lxpx5dJyGWl11j6fEffxfd4y0+G4ah66niBCFIqO63mtN2lUpaF9Wz0nYhFXEvi5x8WVzr7Jhkfi9+KW7Lat8vNHuMRkkabHanvIl4rGvGqHKEgDPMr6+a4zGKKEGEU7Vbja+PXmnEWPnNVnZImKOIp1fOWdRgM6xUJIpps3SffuzLOssurOFlsX/LWaVX4rsjGZxLZS0OISNMGiwd+1QlY4czqnwuT0ER6coDnICRPolMUD9GHLF5VmxD5pfSIGBsXk54kYUfLNna+b+1ZRsVqwC4mdIFoxx53NkJPu8YD4bsSMte+vUQNkNZZoRDoXPbZ7oFbS/yUh13j0qUssWg31W8sYm+uHmImspqUnO6nvBqgQbe34ij4DDRABVvdzaPa5qs6HVgT96JpfPXgjnfScU9yE40FkP44kH2RekwaOGqzKZWe09MK8HdMVtg5I/3pg5f1eJrzA2TwD1SnHmnbNpPFhaL240yEnpi5sihuxjgAfNBP3csoi/hlugWHqgKCsAJhpLoce7F/hq9ZI8dg6gO0o6NvU/6HiwqB8DlLkRcU17VroC9rwyq",
        "X-OriginatorOrg": "nxp.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "17d255b5-9ca9-46ee-3487-08dda3fb843d",
        "X-MS-Exchange-CrossTenant-AuthSource": "AS8PR04MB8278.eurprd04.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "05 Jun 2025 06:38:00.9867\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": "hY/iz9AUmj3X9sJUA3HjEo8ub1dgpP/fEwkPKz7BVK8P7nkmNIzgTKLo3NgB7jDr",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DB9PR04MB8169",
        "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": "Whenever a downstream element queries latency, libcamerasrc will always reply,\neven though it has not yet determined the latency.\n\nHowever some downstream elements (e.g. glvideomixer/aggregator) will query the\nlatency before libcamerasrc sets the caps. When these elements get the latency,\nthey will start the caps negotiation. Since libcamerasrc has not yet determined\ncaps, invalid negotiation is performed and workflow is disrupted.\n\nSo, set latency to 'GST_CLOCK_TIME_NONE' during initialization, and reply to the\nquery after libcamerasrc confirms the latency. At this time, libcamerasrc has also\ncompleted caps negotiation and downstream elements work fine.\n\nIn addition, every time the src pad task stops, we reset the latency to\nGST_CLOCK_TIME_NONE to ensure that when next time task starts, the downstream\nelements can generate out buffers after receiving the effective latency.\n\nSigned-off-by: Hou Qi <qi.hou@nxp.com>\n---\n src/gstreamer/gstlibcamerapad.cpp | 5 +++++\n src/gstreamer/gstlibcamerasrc.cpp | 4 +++-\n 2 files changed, 8 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/src/gstreamer/gstlibcamerapad.cpp b/src/gstreamer/gstlibcamerapad.cpp\nindex 3bc2bc87..37a4689f 100644\n--- a/src/gstreamer/gstlibcamerapad.cpp\n+++ b/src/gstreamer/gstlibcamerapad.cpp\n@@ -72,6 +72,10 @@ gst_libcamera_pad_query(GstPad *pad, GstObject *parent, GstQuery *query)\n \tif (query->type != GST_QUERY_LATENCY)\n \t\treturn gst_pad_query_default(pad, parent, query);\n \n+\tGLibLocker lock(GST_OBJECT(self));\n+\tif (self->latency == GST_CLOCK_TIME_NONE)\n+\t\treturn FALSE;\n+\n \t/* TRUE here means live, we assumes that max latency is the same as min\n \t * as we have no idea that duration of frames. */\n \tgst_query_set_latency(query, TRUE, self->latency, self->latency);\n@@ -81,6 +85,7 @@ gst_libcamera_pad_query(GstPad *pad, GstObject *parent, GstQuery *query)\n static void\n gst_libcamera_pad_init(GstLibcameraPad *self)\n {\n+\tself->latency = GST_CLOCK_TIME_NONE;\n \tGST_PAD_QUERYFUNC(self) = gst_libcamera_pad_query;\n }\n \ndiff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\nindex b34f0897..b57d4a55 100644\n--- a/src/gstreamer/gstlibcamerasrc.cpp\n+++ b/src/gstreamer/gstlibcamerasrc.cpp\n@@ -835,8 +835,10 @@ gst_libcamera_src_task_leave([[maybe_unused]] GstTask *task,\n \n \t{\n \t\tGLibRecLocker locker(&self->stream_lock);\n-\t\tfor (GstPad *srcpad : state->srcpads_)\n+\t\tfor (GstPad *srcpad : state->srcpads_) {\n+\t\t\tgst_libcamera_pad_set_latency(srcpad, GST_CLOCK_TIME_NONE);\n \t\t\tgst_libcamera_pad_set_pool(srcpad, nullptr);\n+\t\t}\n \t}\n \n \tg_clear_object(&self->allocator);\n",
    "prefixes": []
}