[{"id":28248,"web_url":"https://patchwork.libcamera.org/comment/28248/","msgid":"<a4a5e80bfc39812e03dba4b0f4187bee73402ae1.camel@ndufresne.ca>","date":"2023-12-05T16:14:39","subject":"Re: [libcamera-devel] [PATCH v2 3/3] gstreamer: Implement\n\trenegotiation","submitter":{"id":30,"url":"https://patchwork.libcamera.org/api/people/30/","name":"Nicolas Dufresne","email":"nicolas@ndufresne.ca"},"content":"Le jeudi 30 novembre 2023 à 16:43 +0100, Jaslo Ziska via libcamera-devel a\nécrit :\n> This commit implements renegotiation of the camera configuration and\n> source pad caps. A renegotiation can happen when a downstream element\n> decides to change caps or the pipeline is dynamically changed.\n> \n> To handle a renegotiation the GST_FLOW_NOT_NEGOTIATED return value has\n> to be handled in GstLibcameraSrcState::processRequest. Otherwise the\n> default would be to print an error and stop streaming.\n> To archive this in a clean way the if statement is altered into a switch\n> statement which now also has a case for GST_FLOW_NOT_NEGOTIATED.\n> In the case of GST_FLOW_NOT_NEGOTIATED every source pad is checked for\n> the reconfiguration flag with gst_pad_needs_reconfigure which does not\n> clear this flag. If at least one pad requested a reconfiguration the\n> function returns without an error and the renegotiation will happen\n> later in the running task. If no pad requested a reconfiguration then\n> the function will return with an error.\n> \n> In gst_libcamera_src_task_run the source pads are checked for the\n> reconfigure flag by calling gst_pad_check_reconfigure and if one pad\n> returns true and the caps are not sufficient anymore then the\n> negotiation is triggered. It is fine to trigger the negotiation after\n> only a single pad returns true for gst_pad_check_reconfigure because the\n> reconfigure flags are cleared in the gst_libcamera_src_negotiate\n> function.\n> If any pad requested a reconfiguration the following will happen:\n> 1. The camera is stopped because changing the configuration may not\n>    happen while running.\n> 2. The completedRequests queue will be cleared by calling\n>    GstLibcameraSrcState::clearRequests because the completed buffers\n>    have the wrong configuration.\n> 3. The new caps are negotiated by calling gst_libcamera_src_negotiate.\n>    When the negotiation fails streaming will stop.\n> 4. The camera is started again.\n> \n> Signed-off-by: Jaslo Ziska <jaslo@ziska.de>\n\nReviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n\n> ---\n>  src/gstreamer/gstlibcamerasrc.cpp | 72 ++++++++++++++++++++++++++-----\n>  1 file changed, 61 insertions(+), 11 deletions(-)\n> \n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index d448a750..8bd32306 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -11,7 +11,6 @@\n>   *  - Implement GstElement::send_event\n>   *    + Allowing application to use FLUSH/FLUSH_STOP\n>   *    + Prevent the main thread from accessing streaming thread\n> - *  - Implement renegotiation (even if slow)\n>   *  - Implement GstElement::request-new-pad (multi stream)\n>   *    + Evaluate if a single streaming thread is fine\n>   *  - Add application driven request (snapshot)\n> @@ -302,18 +301,42 @@ int GstLibcameraSrcState::processRequest()\n>  \t\t\t\t\t\t\tsrcpad, ret);\n>  \t}\n>  \n> -\tif (ret != GST_FLOW_OK) {\n> -\t\tif (ret == GST_FLOW_EOS) {\n> -\t\t\tg_autoptr(GstEvent) eos = gst_event_new_eos();\n> -\t\t\tguint32 seqnum = gst_util_seqnum_next();\n> -\t\t\tgst_event_set_seqnum(eos, seqnum);\n> -\t\t\tfor (GstPad *srcpad : srcpads_)\n> -\t\t\t\tgst_pad_push_event(srcpad, gst_event_ref(eos));\n> -\t\t} else if (ret != GST_FLOW_FLUSHING) {\n> -\t\t\tGST_ELEMENT_FLOW_ERROR(src_, ret);\n> +\tswitch (ret) {\n> +\tcase GST_FLOW_OK:\n> +\t\tbreak;\n> +\tcase GST_FLOW_NOT_NEGOTIATED: {\n> +\t\tbool reconfigure = false;\n> +\t\tfor (GstPad *srcpad : srcpads_) {\n> +\t\t\tif (gst_pad_needs_reconfigure(srcpad)) {\n> +\t\t\t\treconfigure = true;\n> +\t\t\t\tbreak;\n> +\t\t\t}\n>  \t\t}\n>  \n> -\t\treturn -EPIPE;\n> +\t\t// if no pads needs a reconfiguration something went wrong\n> +\t\tif (!reconfigure)\n> +\t\t\terr = -EPIPE;\n> +\n> +\t\tbreak;\n> +\t}\n> +\tcase GST_FLOW_EOS: {\n> +\t\tg_autoptr(GstEvent) eos = gst_event_new_eos();\n> +\t\tguint32 seqnum = gst_util_seqnum_next();\n> +\t\tgst_event_set_seqnum(eos, seqnum);\n> +\t\tfor (GstPad *srcpad : srcpads_)\n> +\t\t\tgst_pad_push_event(srcpad, gst_event_ref(eos));\n> +\n> +\t\terr = -EPIPE;\n> +\t\tbreak;\n> +\t}\n> +\tcase GST_FLOW_FLUSHING:\n> +\t\terr = -EPIPE;\n> +\t\tbreak;\n> +\tdefault:\n> +\t\tGST_ELEMENT_FLOW_ERROR(src_, ret);\n> +\n> +\t\terr = -EPIPE;\n> +\t\tbreak;\n>  \t}\n>  \n>  \treturn err;\n> @@ -463,6 +486,8 @@ gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n>  \t\t\t\t\t G_CALLBACK(gst_task_resume), self->task);\n>  \n>  \t\tgst_libcamera_pad_set_pool(srcpad, pool);\n> +\n> +\t\tgst_pad_check_reconfigure(srcpad); // clear all reconfigure flags\n>  \t}\n>  \n>  \treturn true;\n> @@ -496,6 +521,31 @@ gst_libcamera_src_task_run(gpointer user_data)\n>  \t\treturn;\n>  \t}\n>  \n> +\t// check if a srcpad requested a renegotiation\n> +\tbool reconfigure = false;\n> +\tfor (GstPad *srcpad : state->srcpads_) {\n> +\t\tif (gst_pad_check_reconfigure(srcpad)) {\n> +\t\t\t// check whether the caps even need changing\n> +\t\t\tg_autoptr(GstCaps) caps = gst_pad_get_current_caps(srcpad);\n> +\t\t\tif (!gst_pad_peer_query_accept_caps(srcpad, caps)) {\n> +\t\t\t\treconfigure = true;\n> +\t\t\t\tbreak;\n> +\t\t\t}\n> +\t\t}\n> +\t}\n> +\n> +\tif (reconfigure) {\n> +\t\tstate->cam_->stop();\n> +\t\tstate->clearRequests();\n> +\n> +\t\tif (!gst_libcamera_src_negotiate(self)) {\n> +\t\t\tGST_ELEMENT_FLOW_ERROR(self, GST_FLOW_NOT_NEGOTIATED);\n> +\t\t\tgst_task_stop(self->task);\n> +\t\t}\n> +\n> +\t\tstate->cam_->start(&state->initControls_);\n> +\t}\n> +\n>  \t/*\n>  \t * Create and queue one request. If no buffers are available the\n>  \t * function returns -ENOBUFS, which we ignore here as that's not a","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 86FDAC3226\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  5 Dec 2023 16:14:43 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A8A5261D9F;\n\tTue,  5 Dec 2023 17:14:42 +0100 (CET)","from mail-qk1-x732.google.com (mail-qk1-x732.google.com\n\t[IPv6:2607:f8b0:4864:20::732])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 62CF861D9F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  5 Dec 2023 17:14:41 +0100 (CET)","by mail-qk1-x732.google.com with SMTP id\n\taf79cd13be357-77d645c0e06so367609685a.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 05 Dec 2023 08:14:41 -0800 (PST)","from nicolas-tpx395.localdomain ([2606:6d00:17:b5c::7a9])\n\tby smtp.gmail.com with ESMTPSA id\n\tul17-20020a05620a6d1100b0077f0a9ec24bsm2133906qkn.105.2023.12.05.08.14.39\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 05 Dec 2023 08:14:39 -0800 (PST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1701792882;\n\tbh=SVy7hF6EVzvKKcXAcx6dvmOzlMQRxPq9Jk+N3RsSrHY=;\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:\n\tFrom;\n\tb=gtsOpErvmF02fgVxQYwS1t64a59wxgqF1yDKfaCpjLoC/rJUqZ0xvBfld+yh4JMav\n\tEKGtulif+eIUdLX1zNvPd/m5tB6m7CVwNklt5ONZ1h/WJnFlJoDbWB4Wqdo64LBcUL\n\tseOKGXb8KJVxRrD2bYxvULo8oDF7ynvGUSV8gPAngopjxsD5Dv6Kw56vBuJr8KZ3/f\n\tq8+tcteOTEGDJ7QIR5qVSG100Re8ZAqkUGHk5x5Pi3g9tPQr2S3/LzaJ7IV6u4vR1N\n\tkxMbJo+0H2bsuoPbNNiWGFiaXBAfEPcrjVKznJPy0vcxJZU4sUNHCn1e8wAWkb42ZC\n\tzBgH8kyxB46Ig==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ndufresne-ca.20230601.gappssmtp.com; s=20230601; t=1701792880;\n\tx=1702397680; darn=lists.libcamera.org; \n\th=mime-version:user-agent:content-transfer-encoding:references\n\t:in-reply-to:date:to:from:subject:message-id:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=NFP4GISVBg8AE07AYJHhnaB7/X//iwTSi5g4kj2+0ms=;\n\tb=iItvkJOdzJkU+5wzzUzW63heJtGUHNnYgRuqJfEKKAUA4BxMh0zePtSzid6/e4QgEu\n\t745naKyHiLtGH5zIgSElaeI5x/PWVfg4RhKT+P3mXKGyF8T6eCe6Z6+01W1iYQgcUeIZ\n\t8gXNdsLJLMvH/Lmd9vzTFr7xxaT2LDpdtAGySPOYC4JMtpI2zL1kKrNqjcHo2ZnX10u4\n\tknXhRq9jyIeQ3hNzIaJCcxBOjxeh+mqmWX+EHPW7aKeoZWzEzjlNMGq8BUMYk+GNMQ8J\n\tQFuE5K2vtW4d5Yv9Ex6GN/F0DIrj/glRyD7QIdV2cp0CvJkElywthHa7bpa5t8EBFXIv\n\tR7DQ=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected)\n\theader.d=ndufresne-ca.20230601.gappssmtp.com\n\theader.i=@ndufresne-ca.20230601.gappssmtp.com header.b=\"iItvkJOd\"; \n\tdkim-atps=neutral","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1701792880; x=1702397680;\n\th=mime-version:user-agent:content-transfer-encoding:references\n\t:in-reply-to:date:to:from:subject:message-id:x-gm-message-state:from\n\t:to:cc:subject:date:message-id:reply-to;\n\tbh=NFP4GISVBg8AE07AYJHhnaB7/X//iwTSi5g4kj2+0ms=;\n\tb=HouiBfzxFO+zBtKsKILFQ+0w8piwDUKkIYz1qNvn/GJMkXdiaBTJH9o3ixg1tIPmNJ\n\tDkkoZ6Y37NBDL0Ull5xyg52DCuTlsKW5PRJq/7Nm1c319z7dTIQgXYTDLm58dRuZB27r\n\tOKnQOyF2LjLetb5igdwA6Gh9fkeJGGtsmt72jrwuZii7jx8NW9hSA+nX1y/XCMi3fOoJ\n\tyc2rqhVvV8YjDmyK/346ls4MQwaTyueAwE/Nlcd4xR9jn3gjPb9qY1+LS4Y0oGB+FmUU\n\tImQaMwHO497w2ApnM3sU/HnoMLtKetUAAEJNKN0F1fdmoeeW9xnvN1Fa3FDpbviM7Xt+\n\tpgEA==","X-Gm-Message-State":"AOJu0Yzi9D19+dOKMNI+pA/n4cJo1yOlXZRqEujcAW9tq3Nfw5ZdUCS6\n\t4WPUzA8pS6Ojy/tvVmIQabT7bBWZy8Vod8qo8bg=","X-Google-Smtp-Source":"AGHT+IGkCdWqkUwdWMOCps7S3oKeA7mV5O7kmdsmFUTp/7fkUms4qlUwi2mb4+QrXUEKtQb16sERyw==","X-Received":"by 2002:a05:620a:4484:b0:77f:26:18fd with SMTP id\n\tx4-20020a05620a448400b0077f002618fdmr1694121qkp.6.1701792880168; \n\tTue, 05 Dec 2023 08:14:40 -0800 (PST)","Message-ID":"<a4a5e80bfc39812e03dba4b0f4187bee73402ae1.camel@ndufresne.ca>","To":"Jaslo Ziska <jaslo@ziska.de>, libcamera-devel@lists.libcamera.org","Date":"Tue, 05 Dec 2023 11:14:39 -0500","In-Reply-To":"<20231130155323.13259-4-jaslo@ziska.de>","References":"<20231130155323.13259-1-jaslo@ziska.de>\n\t<20231130155323.13259-4-jaslo@ziska.de>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","User-Agent":"Evolution 3.48.4 (3.48.4-1.fc38) ","MIME-Version":"1.0","Subject":"Re: [libcamera-devel] [PATCH v2 3/3] gstreamer: Implement\n\trenegotiation","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":"Nicolas Dufresne via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Nicolas Dufresne <nicolas@ndufresne.ca>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":28270,"web_url":"https://patchwork.libcamera.org/comment/28270/","msgid":"<20231206233949.GH29417@pendragon.ideasonboard.com>","date":"2023-12-06T23:39:49","subject":"Re: [libcamera-devel] [PATCH v2 3/3] gstreamer: Implement\n\trenegotiation","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jaslo,\n\nThank you for the patch.\n\nOn Thu, Nov 30, 2023 at 04:43:10PM +0100, Jaslo Ziska via libcamera-devel wrote:\n> This commit implements renegotiation of the camera configuration and\n> source pad caps. A renegotiation can happen when a downstream element\n> decides to change caps or the pipeline is dynamically changed.\n> \n> To handle a renegotiation the GST_FLOW_NOT_NEGOTIATED return value has\n> to be handled in GstLibcameraSrcState::processRequest. Otherwise the\n> default would be to print an error and stop streaming.\n> To archive this in a clean way the if statement is altered into a switch\n> statement which now also has a case for GST_FLOW_NOT_NEGOTIATED.\n> In the case of GST_FLOW_NOT_NEGOTIATED every source pad is checked for\n> the reconfiguration flag with gst_pad_needs_reconfigure which does not\n> clear this flag. If at least one pad requested a reconfiguration the\n> function returns without an error and the renegotiation will happen\n> later in the running task. If no pad requested a reconfiguration then\n> the function will return with an error.\n> \n> In gst_libcamera_src_task_run the source pads are checked for the\n> reconfigure flag by calling gst_pad_check_reconfigure and if one pad\n> returns true and the caps are not sufficient anymore then the\n> negotiation is triggered. It is fine to trigger the negotiation after\n> only a single pad returns true for gst_pad_check_reconfigure because the\n> reconfigure flags are cleared in the gst_libcamera_src_negotiate\n> function.\n> If any pad requested a reconfiguration the following will happen:\n> 1. The camera is stopped because changing the configuration may not\n>    happen while running.\n> 2. The completedRequests queue will be cleared by calling\n>    GstLibcameraSrcState::clearRequests because the completed buffers\n>    have the wrong configuration.\n> 3. The new caps are negotiated by calling gst_libcamera_src_negotiate.\n>    When the negotiation fails streaming will stop.\n> 4. The camera is started again.\n> \n> Signed-off-by: Jaslo Ziska <jaslo@ziska.de>\n> ---\n>  src/gstreamer/gstlibcamerasrc.cpp | 72 ++++++++++++++++++++++++++-----\n>  1 file changed, 61 insertions(+), 11 deletions(-)\n> \n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index d448a750..8bd32306 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -11,7 +11,6 @@\n>   *  - Implement GstElement::send_event\n>   *    + Allowing application to use FLUSH/FLUSH_STOP\n>   *    + Prevent the main thread from accessing streaming thread\n> - *  - Implement renegotiation (even if slow)\n>   *  - Implement GstElement::request-new-pad (multi stream)\n>   *    + Evaluate if a single streaming thread is fine\n>   *  - Add application driven request (snapshot)\n> @@ -302,18 +301,42 @@ int GstLibcameraSrcState::processRequest()\n>  \t\t\t\t\t\t\tsrcpad, ret);\n>  \t}\n>  \n> -\tif (ret != GST_FLOW_OK) {\n> -\t\tif (ret == GST_FLOW_EOS) {\n> -\t\t\tg_autoptr(GstEvent) eos = gst_event_new_eos();\n> -\t\t\tguint32 seqnum = gst_util_seqnum_next();\n> -\t\t\tgst_event_set_seqnum(eos, seqnum);\n> -\t\t\tfor (GstPad *srcpad : srcpads_)\n> -\t\t\t\tgst_pad_push_event(srcpad, gst_event_ref(eos));\n> -\t\t} else if (ret != GST_FLOW_FLUSHING) {\n> -\t\t\tGST_ELEMENT_FLOW_ERROR(src_, ret);\n> +\tswitch (ret) {\n> +\tcase GST_FLOW_OK:\n> +\t\tbreak;\n\nWe usually add blank lines between cases.\n\n> +\tcase GST_FLOW_NOT_NEGOTIATED: {\n> +\t\tbool reconfigure = false;\n> +\t\tfor (GstPad *srcpad : srcpads_) {\n> +\t\t\tif (gst_pad_needs_reconfigure(srcpad)) {\n> +\t\t\t\treconfigure = true;\n> +\t\t\t\tbreak;\n> +\t\t\t}\n>  \t\t}\n>  \n> -\t\treturn -EPIPE;\n> +\t\t// if no pads needs a reconfiguration something went wrong\n\nWe use C-style comments:\n\n\t\t/* If no pads need a reconfiguration something went wrong. */\n\nSame comment below.\n\nI'll fix these minor issues when applying the series, no need to submit\na new version.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +\t\tif (!reconfigure)\n> +\t\t\terr = -EPIPE;\n> +\n> +\t\tbreak;\n> +\t}\n> +\tcase GST_FLOW_EOS: {\n> +\t\tg_autoptr(GstEvent) eos = gst_event_new_eos();\n> +\t\tguint32 seqnum = gst_util_seqnum_next();\n> +\t\tgst_event_set_seqnum(eos, seqnum);\n> +\t\tfor (GstPad *srcpad : srcpads_)\n> +\t\t\tgst_pad_push_event(srcpad, gst_event_ref(eos));\n> +\n> +\t\terr = -EPIPE;\n> +\t\tbreak;\n> +\t}\n> +\tcase GST_FLOW_FLUSHING:\n> +\t\terr = -EPIPE;\n> +\t\tbreak;\n> +\tdefault:\n> +\t\tGST_ELEMENT_FLOW_ERROR(src_, ret);\n> +\n> +\t\terr = -EPIPE;\n> +\t\tbreak;\n>  \t}\n>  \n>  \treturn err;\n> @@ -463,6 +486,8 @@ gst_libcamera_src_negotiate(GstLibcameraSrc *self)\n>  \t\t\t\t\t G_CALLBACK(gst_task_resume), self->task);\n>  \n>  \t\tgst_libcamera_pad_set_pool(srcpad, pool);\n> +\n> +\t\tgst_pad_check_reconfigure(srcpad); // clear all reconfigure flags\n>  \t}\n>  \n>  \treturn true;\n> @@ -496,6 +521,31 @@ gst_libcamera_src_task_run(gpointer user_data)\n>  \t\treturn;\n>  \t}\n>  \n> +\t// check if a srcpad requested a renegotiation\n> +\tbool reconfigure = false;\n> +\tfor (GstPad *srcpad : state->srcpads_) {\n> +\t\tif (gst_pad_check_reconfigure(srcpad)) {\n> +\t\t\t// check whether the caps even need changing\n> +\t\t\tg_autoptr(GstCaps) caps = gst_pad_get_current_caps(srcpad);\n> +\t\t\tif (!gst_pad_peer_query_accept_caps(srcpad, caps)) {\n> +\t\t\t\treconfigure = true;\n> +\t\t\t\tbreak;\n> +\t\t\t}\n> +\t\t}\n> +\t}\n> +\n> +\tif (reconfigure) {\n> +\t\tstate->cam_->stop();\n> +\t\tstate->clearRequests();\n> +\n> +\t\tif (!gst_libcamera_src_negotiate(self)) {\n> +\t\t\tGST_ELEMENT_FLOW_ERROR(self, GST_FLOW_NOT_NEGOTIATED);\n> +\t\t\tgst_task_stop(self->task);\n> +\t\t}\n> +\n> +\t\tstate->cam_->start(&state->initControls_);\n> +\t}\n> +\n>  \t/*\n>  \t * Create and queue one request. If no buffers are available the\n>  \t * function returns -ENOBUFS, which we ignore here as that's not a","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 BA09DC322E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  6 Dec 2023 23:39:45 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EFBA662B2C;\n\tThu,  7 Dec 2023 00:39:44 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 14C1961D9B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  7 Dec 2023 00:39:43 +0100 (CET)","from pendragon.ideasonboard.com (213-243-189-158.bb.dnainternet.fi\n\t[213.243.189.158])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A5279D77;\n\tThu,  7 Dec 2023 00:39:01 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1701905985;\n\tbh=R6XBoT8IKzkwFbA5rgkdd92U8bR/ZWMgUI7TcAsQ3Ec=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=mLPKrT+PIG6lVqxtgXezVHGt8cJULLp9etbZFyveyVvIS5sOqso+4509Gr+waH32d\n\tDqKPDyWhobkARJD5y1zWSfdDY4i8FlmQGKpEBtunElGWNMcJFZ8hnA6t3InvkUj1E8\n\t9Hpco9Hp5T+JhrCE/maxMcQrMUjpHmo4dSBO1IxIXh6yQyI23fLgmgihAcCJjWN2QA\n\t+zdk5OeUW2vtClDlMzbXlL5g+VNkzL25RdK1udJcn6swaRBd0JfKU/PIcBs/t5c7fr\n\tjmZZe2e3DbdKyKfWxzDLlHnL/x6rM+j8v38uTaRI4Ubhg0eEAK6BuERejqR0Azi/q7\n\tWAlsqAyZKu9GA==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1701905942;\n\tbh=R6XBoT8IKzkwFbA5rgkdd92U8bR/ZWMgUI7TcAsQ3Ec=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=bw7WStzEHTgv/h3NkWKutp2sN4J/KVbTVCGoSmcv4KaD72nQpa1SROKEDnMeh8w9e\n\tU8X5rBUcSw+lFAhMjpusz6+QwNCE6I4H9H/rqJS7Yen7/7j8B4aC7Pp18ikO6lvNzR\n\th+W0CAtVHXPpjmCiY/Gn2HCqpA4DQ7QaTIxR9+k4="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"bw7WStzE\"; dkim-atps=neutral","Date":"Thu, 7 Dec 2023 01:39:49 +0200","To":"Jaslo Ziska <jaslo@ziska.de>","Message-ID":"<20231206233949.GH29417@pendragon.ideasonboard.com>","References":"<20231130155323.13259-1-jaslo@ziska.de>\n\t<20231130155323.13259-4-jaslo@ziska.de>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20231130155323.13259-4-jaslo@ziska.de>","Subject":"Re: [libcamera-devel] [PATCH v2 3/3] gstreamer: Implement\n\trenegotiation","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":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]