[{"id":23670,"web_url":"https://patchwork.libcamera.org/comment/23670/","msgid":"<2b896701-5516-1349-bbf0-12739ec21d5c@ideasonboard.com>","date":"2022-06-30T07:51:34","subject":"Re: [libcamera-devel] [PATCH v2 06/12] gstreamer: Handle completed\n\trequests in the libcamerasrc task","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi Laurent,\n\nThank you for the patch.\n\nOn 6/30/22 05:32, Laurent Pinchart via libcamera-devel wrote:\n> Move the request wrap to a completed queue in the request completion\n> handler to move more of the request completion processing to the\n> libcamerasrc task. This lowers the amount of time spent in the\n> completion handler, and prepares for reworking the usage of locks.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n> Changes since v1:\n>\n> - Use GST_CLOCK_TIME_NONE and GST_CLOCK_TIME_IS_VALID()\n> ---\n>   src/gstreamer/gstlibcamerasrc.cpp | 82 ++++++++++++++++++-------------\n>   1 file changed, 48 insertions(+), 34 deletions(-)\n>\n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index f2f48d53991a..2cb915637874 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -57,10 +57,13 @@ struct RequestWrap {\n>   \n>   \tstd::unique_ptr<Request> request_;\n>   \tstd::map<Stream *, GstBuffer *> buffers_;\n> +\n> +\tGstClockTime latency_;\n> +\tGstClockTime pts_;\n>   };\n>   \n>   RequestWrap::RequestWrap(std::unique_ptr<Request> request)\n> -\t: request_(std::move(request))\n> +\t: request_(std::move(request)), latency_(0), pts_(GST_CLOCK_TIME_NONE)\n>   {\n>   }\n>   \n> @@ -109,6 +112,7 @@ struct GstLibcameraSrcState {\n>   \tstd::unique_ptr<CameraConfiguration> config_;\n>   \tstd::vector<GstPad *> srcpads_;\n>   \tstd::queue<std::unique_ptr<RequestWrap>> queuedRequests_;\n> +\tstd::queue<std::unique_ptr<RequestWrap>> completedRequests_;\n>   \tguint group_id_;\n>   \n>   \tvoid requestCompleted(Request *request);\n> @@ -165,9 +169,6 @@ GstLibcameraSrcState::requestCompleted(Request *request)\n>   \t\treturn;\n>   \t}\n>   \n> -\tGstClockTime latency;\n> -\tGstClockTime pts;\n> -\n>   \tif (GST_ELEMENT_CLOCK(src_)) {\n>   \t\tint64_t timestamp = request->metadata().get(controls::SensorTimestamp);\n>   \n> @@ -178,31 +179,11 @@ GstLibcameraSrcState::requestCompleted(Request *request)\n>   \n>   \t\t/* Deduced from: sys_now - sys_base_time == gst_now - gst_base_time */\n>   \t\tGstClockTime sys_base_time = sys_now - (gst_now - gst_base_time);\n> -\t\tpts = timestamp - sys_base_time;\n> -\t\tlatency = sys_now - timestamp;\n> -\t} else {\n> -\t\tlatency = 0;\n> -\t\tpts = GST_CLOCK_TIME_NONE;\n> +\t\twrap->pts_ = timestamp - sys_base_time;\n> +\t\twrap->latency_ = sys_now - timestamp;\n>   \t}\n>   \n> -\tfor (GstPad *srcpad : srcpads_) {\n> -\t\tStream *stream = gst_libcamera_pad_get_stream(srcpad);\n> -\t\tGstBuffer *buffer = wrap->detachBuffer(stream);\n> -\n> -\t\tFrameBuffer *fb = gst_libcamera_buffer_get_frame_buffer(buffer);\n> -\n> -\t\tif (GST_CLOCK_TIME_IS_VALID(pts)) {\n> -\t\t\tGST_BUFFER_PTS(buffer) = pts;\n> -\t\t\tgst_libcamera_pad_set_latency(srcpad, latency);\n> -\t\t} else {\n> -\t\t\tGST_BUFFER_PTS(buffer) = 0;\n> -\t\t}\n> -\n> -\t\tGST_BUFFER_OFFSET(buffer) = fb->metadata().sequence;\n> -\t\tGST_BUFFER_OFFSET_END(buffer) = fb->metadata().sequence;\n> -\n> -\t\tgst_libcamera_pad_queue_buffer(srcpad, buffer);\n> -\t}\n> +\tcompletedRequests_.push(std::move(wrap));\n>   \n>   \tgst_task_resume(src_->task);\n>   }\n> @@ -316,6 +297,39 @@ gst_libcamera_src_task_run(gpointer user_data)\n>   \t\t/* The RequestWrap will be deleted in the completion handler. */\n>   \t}\n>   \n> +\t{\n> +\t\tGLibLocker lock(GST_OBJECT(self));\n> +\n> +\t\tif (!state->completedRequests_.empty()) {\n> +\t\t\twrap = std::move(state->completedRequests_.front());\n> +\t\t\tstate->completedRequests_.pop();\n> +\t\t}\n> +\t}\n> +\n> +\tif (!wrap) {\n> +\t\tgst_task_pause(self->task);\n> +\t\treturn;\n> +\t}\n> +\n> +\tfor (GstPad *srcpad : state->srcpads_) {\n> +\t\tStream *stream = gst_libcamera_pad_get_stream(srcpad);\n> +\t\tGstBuffer *buffer = wrap->detachBuffer(stream);\n> +\n> +\t\tFrameBuffer *fb = gst_libcamera_buffer_get_frame_buffer(buffer);\n> +\n> +\t\tif (GST_CLOCK_TIME_IS_VALID(wrap->pts_)) {\n> +\t\t\tGST_BUFFER_PTS(buffer) = wrap->pts_;\n> +\t\t\tgst_libcamera_pad_set_latency(srcpad, wrap->latency_);\n> +\t\t} else {\n> +\t\t\tGST_BUFFER_PTS(buffer) = 0;\n> +\t\t}\n> +\n> +\t\tGST_BUFFER_OFFSET(buffer) = fb->metadata().sequence;\n> +\t\tGST_BUFFER_OFFSET_END(buffer) = fb->metadata().sequence;\n> +\n> +\t\tgst_libcamera_pad_queue_buffer(srcpad, buffer);\n> +\t}\n> +\n>   \tGstFlowReturn ret = GST_FLOW_OK;\n>   \tgst_flow_combiner_reset(self->flow_combiner);\n>   \tfor (GstPad *srcpad : state->srcpads_) {\n> @@ -344,13 +358,11 @@ gst_libcamera_src_task_run(gpointer user_data)\n>   \t\t * happen in lock step with the callback thread which may want\n>   \t\t * to resume the task and might push pending buffers.\n>   \t\t */\n> -\t\tGLibLocker lock(GST_OBJECT(self));\n> -\t\tbool do_pause = true;\n> -\t\tfor (GstPad *srcpad : state->srcpads_) {\n> -\t\t\tif (gst_libcamera_pad_has_pending(srcpad)) {\n> -\t\t\t\tdo_pause = false;\n> -\t\t\t\tbreak;\n> -\t\t\t}\n> +\t\tbool do_pause;\n> +\n> +\t\t{\n> +\t\t\tGLibLocker lock(GST_OBJECT(self));\n> +\t\t\tdo_pause = state->completedRequests_.empty();\n>   \t\t}\n>   \n>   \t\tif (do_pause)\n> @@ -504,6 +516,8 @@ gst_libcamera_src_task_leave([[maybe_unused]] GstTask *task,\n>   \n>   \tstate->cam_->stop();\n>   \n> +\tstate->completedRequests_ = {};\n> +\n\n\nAh so when we stop we might have some RequestWrap(s) being added to \ncompletedRequests_ but won't be processed by the libcamera_src_task_run \n- since we have are already in libcamera_src_task_leave.\n\nI wonder if need to do any 'processing' for them before clearing them \nout here. Maybe not, those are just \"cancelled\" ones right?\n\nSo, the 'processing' part for completedRequests_ is just, detaching the \nbuffer, setting up latency and presentation time(pts I believe) and \nre-queuing the buffer the pad. So that's minimal, so I guess it's safe \nto clear them out.\n\nReviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n\n>   \tfor (GstPad *srcpad : state->srcpads_)\n>   \t\tgst_libcamera_pad_set_pool(srcpad, nullptr);\n>","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 B1F9BBE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 30 Jun 2022 07:51:45 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C7D506564E;\n\tThu, 30 Jun 2022 09:51:44 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 10A496054C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 30 Jun 2022 09:51:43 +0200 (CEST)","from [IPV6:2401:4900:1f3f:ca21:e286:106b:5da4:9482] (unknown\n\t[IPv6:2401:4900:1f3f:ca21:e286:106b:5da4:9482])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E514745F;\n\tThu, 30 Jun 2022 09:51:40 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1656575504;\n\tbh=f6Rc6HqVOHk7LefMZoVaaPKTyYaF1tz4Z8kyTZezTio=;\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=ijpoMRPLv1vlxPTVmCZZyBN6FsutFsUEYBMEQfKi0SuJ+LBrqw1wBXuMQiyuVi44W\n\tqAlwuL0+WDXrwGfdJ50+XYS/lPw3AxGcnT6m1PpsJDfBCW88AFdYo/T49iavh//8Eo\n\t6tEJUQjpiYaMBGAKx9bS8DED+1x9XizG+dzq6xp8LN4P+anle7BZp+V+S/NrxhJ8sv\n\t/dYWj0213CFMXVQpW6e4MsoE7DVv4rI/ebGGHfYFoIuAElbNqXNf6ZPxjx7NIfHxQB\n\tilTELREQwvAxH05Y4+olfPrm67e1yvURIwEP9MU6EjceNhOO3usZy9v9q2pGHzD3DE\n\t7ZTzIOB09aBpw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1656575502;\n\tbh=f6Rc6HqVOHk7LefMZoVaaPKTyYaF1tz4Z8kyTZezTio=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=crhsyymJfuODGvDza92DaqpevOWxhc4z0KeTKgVCqknhe7KY/3ET1B5N+uFQt96sJ\n\tu/c0pKX32g1QaNUZXSJ6pz6vCNjXMhKteTEOoGkbs99ABF6dBC7jkq2JTkIk2DKWP6\n\th/RNWTHnELxPMDWpK/31w1Pvjg5Bvt/v/AYhsEII="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"crhsyymJ\"; dkim-atps=neutral","Message-ID":"<2b896701-5516-1349-bbf0-12739ec21d5c@ideasonboard.com>","Date":"Thu, 30 Jun 2022 13:21:34 +0530","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.4.1","Content-Language":"en-US","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20220630000251.31295-1-laurent.pinchart@ideasonboard.com>\n\t<20220630000251.31295-7-laurent.pinchart@ideasonboard.com>","In-Reply-To":"<20220630000251.31295-7-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH v2 06/12] gstreamer: Handle completed\n\trequests in the libcamerasrc task","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":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":23679,"web_url":"https://patchwork.libcamera.org/comment/23679/","msgid":"<Yr1wycXrHH+7LOay@pendragon.ideasonboard.com>","date":"2022-06-30T09:45:45","subject":"Re: [libcamera-devel] [PATCH v2 06/12] gstreamer: Handle completed\n\trequests in the libcamerasrc task","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Thu, Jun 30, 2022 at 01:21:34PM +0530, Umang Jain wrote:\n> Hi Laurent,\n> \n> Thank you for the patch.\n> \n> On 6/30/22 05:32, Laurent Pinchart via libcamera-devel wrote:\n> > Move the request wrap to a completed queue in the request completion\n> > handler to move more of the request completion processing to the\n> > libcamerasrc task. This lowers the amount of time spent in the\n> > completion handler, and prepares for reworking the usage of locks.\n> >\n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> > Changes since v1:\n> >\n> > - Use GST_CLOCK_TIME_NONE and GST_CLOCK_TIME_IS_VALID()\n> > ---\n> >   src/gstreamer/gstlibcamerasrc.cpp | 82 ++++++++++++++++++-------------\n> >   1 file changed, 48 insertions(+), 34 deletions(-)\n> >\n> > diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> > index f2f48d53991a..2cb915637874 100644\n> > --- a/src/gstreamer/gstlibcamerasrc.cpp\n> > +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> > @@ -57,10 +57,13 @@ struct RequestWrap {\n> >   \n> >   \tstd::unique_ptr<Request> request_;\n> >   \tstd::map<Stream *, GstBuffer *> buffers_;\n> > +\n> > +\tGstClockTime latency_;\n> > +\tGstClockTime pts_;\n> >   };\n> >   \n> >   RequestWrap::RequestWrap(std::unique_ptr<Request> request)\n> > -\t: request_(std::move(request))\n> > +\t: request_(std::move(request)), latency_(0), pts_(GST_CLOCK_TIME_NONE)\n> >   {\n> >   }\n> >   \n> > @@ -109,6 +112,7 @@ struct GstLibcameraSrcState {\n> >   \tstd::unique_ptr<CameraConfiguration> config_;\n> >   \tstd::vector<GstPad *> srcpads_;\n> >   \tstd::queue<std::unique_ptr<RequestWrap>> queuedRequests_;\n> > +\tstd::queue<std::unique_ptr<RequestWrap>> completedRequests_;\n> >   \tguint group_id_;\n> >   \n> >   \tvoid requestCompleted(Request *request);\n> > @@ -165,9 +169,6 @@ GstLibcameraSrcState::requestCompleted(Request *request)\n> >   \t\treturn;\n> >   \t}\n> >   \n> > -\tGstClockTime latency;\n> > -\tGstClockTime pts;\n> > -\n> >   \tif (GST_ELEMENT_CLOCK(src_)) {\n> >   \t\tint64_t timestamp = request->metadata().get(controls::SensorTimestamp);\n> >   \n> > @@ -178,31 +179,11 @@ GstLibcameraSrcState::requestCompleted(Request *request)\n> >   \n> >   \t\t/* Deduced from: sys_now - sys_base_time == gst_now - gst_base_time */\n> >   \t\tGstClockTime sys_base_time = sys_now - (gst_now - gst_base_time);\n> > -\t\tpts = timestamp - sys_base_time;\n> > -\t\tlatency = sys_now - timestamp;\n> > -\t} else {\n> > -\t\tlatency = 0;\n> > -\t\tpts = GST_CLOCK_TIME_NONE;\n> > +\t\twrap->pts_ = timestamp - sys_base_time;\n> > +\t\twrap->latency_ = sys_now - timestamp;\n> >   \t}\n> >   \n> > -\tfor (GstPad *srcpad : srcpads_) {\n> > -\t\tStream *stream = gst_libcamera_pad_get_stream(srcpad);\n> > -\t\tGstBuffer *buffer = wrap->detachBuffer(stream);\n> > -\n> > -\t\tFrameBuffer *fb = gst_libcamera_buffer_get_frame_buffer(buffer);\n> > -\n> > -\t\tif (GST_CLOCK_TIME_IS_VALID(pts)) {\n> > -\t\t\tGST_BUFFER_PTS(buffer) = pts;\n> > -\t\t\tgst_libcamera_pad_set_latency(srcpad, latency);\n> > -\t\t} else {\n> > -\t\t\tGST_BUFFER_PTS(buffer) = 0;\n> > -\t\t}\n> > -\n> > -\t\tGST_BUFFER_OFFSET(buffer) = fb->metadata().sequence;\n> > -\t\tGST_BUFFER_OFFSET_END(buffer) = fb->metadata().sequence;\n> > -\n> > -\t\tgst_libcamera_pad_queue_buffer(srcpad, buffer);\n> > -\t}\n> > +\tcompletedRequests_.push(std::move(wrap));\n> >   \n> >   \tgst_task_resume(src_->task);\n> >   }\n> > @@ -316,6 +297,39 @@ gst_libcamera_src_task_run(gpointer user_data)\n> >   \t\t/* The RequestWrap will be deleted in the completion handler. */\n> >   \t}\n> >   \n> > +\t{\n> > +\t\tGLibLocker lock(GST_OBJECT(self));\n> > +\n> > +\t\tif (!state->completedRequests_.empty()) {\n> > +\t\t\twrap = std::move(state->completedRequests_.front());\n> > +\t\t\tstate->completedRequests_.pop();\n> > +\t\t}\n> > +\t}\n> > +\n> > +\tif (!wrap) {\n> > +\t\tgst_task_pause(self->task);\n> > +\t\treturn;\n> > +\t}\n> > +\n> > +\tfor (GstPad *srcpad : state->srcpads_) {\n> > +\t\tStream *stream = gst_libcamera_pad_get_stream(srcpad);\n> > +\t\tGstBuffer *buffer = wrap->detachBuffer(stream);\n> > +\n> > +\t\tFrameBuffer *fb = gst_libcamera_buffer_get_frame_buffer(buffer);\n> > +\n> > +\t\tif (GST_CLOCK_TIME_IS_VALID(wrap->pts_)) {\n> > +\t\t\tGST_BUFFER_PTS(buffer) = wrap->pts_;\n> > +\t\t\tgst_libcamera_pad_set_latency(srcpad, wrap->latency_);\n> > +\t\t} else {\n> > +\t\t\tGST_BUFFER_PTS(buffer) = 0;\n> > +\t\t}\n> > +\n> > +\t\tGST_BUFFER_OFFSET(buffer) = fb->metadata().sequence;\n> > +\t\tGST_BUFFER_OFFSET_END(buffer) = fb->metadata().sequence;\n> > +\n> > +\t\tgst_libcamera_pad_queue_buffer(srcpad, buffer);\n> > +\t}\n> > +\n> >   \tGstFlowReturn ret = GST_FLOW_OK;\n> >   \tgst_flow_combiner_reset(self->flow_combiner);\n> >   \tfor (GstPad *srcpad : state->srcpads_) {\n> > @@ -344,13 +358,11 @@ gst_libcamera_src_task_run(gpointer user_data)\n> >   \t\t * happen in lock step with the callback thread which may want\n> >   \t\t * to resume the task and might push pending buffers.\n> >   \t\t */\n> > -\t\tGLibLocker lock(GST_OBJECT(self));\n> > -\t\tbool do_pause = true;\n> > -\t\tfor (GstPad *srcpad : state->srcpads_) {\n> > -\t\t\tif (gst_libcamera_pad_has_pending(srcpad)) {\n> > -\t\t\t\tdo_pause = false;\n> > -\t\t\t\tbreak;\n> > -\t\t\t}\n> > +\t\tbool do_pause;\n> > +\n> > +\t\t{\n> > +\t\t\tGLibLocker lock(GST_OBJECT(self));\n> > +\t\t\tdo_pause = state->completedRequests_.empty();\n> >   \t\t}\n> >   \n> >   \t\tif (do_pause)\n> > @@ -504,6 +516,8 @@ gst_libcamera_src_task_leave([[maybe_unused]] GstTask *task,\n> >   \n> >   \tstate->cam_->stop();\n> >   \n> > +\tstate->completedRequests_ = {};\n> > +\n> \n> \n> Ah so when we stop we might have some RequestWrap(s) being added to \n> completedRequests_ but won't be processed by the libcamera_src_task_run \n> - since we have are already in libcamera_src_task_leave.\n> \n> I wonder if need to do any 'processing' for them before clearing them \n> out here. Maybe not, those are just \"cancelled\" ones right?\n\nMostly, there could also occasionally be some completed requests.\n\n> So, the 'processing' part for completedRequests_ is just, detaching the \n> buffer, setting up latency and presentation time(pts I believe) and \n> re-queuing the buffer the pad. So that's minimal, so I guess it's safe \n> to clear them out.\n\nGiven that the task is stopped due to the element being stopped, I don't\nsee how we could meaningful process the completed requests anyway.\n\n> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n> \n> >   \tfor (GstPad *srcpad : state->srcpads_)\n> >   \t\tgst_libcamera_pad_set_pool(srcpad, nullptr);\n> >","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 DBDF5BD808\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 30 Jun 2022 09:46:08 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 163936564E;\n\tThu, 30 Jun 2022 11:46:08 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CEA236054C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 30 Jun 2022 11:46:06 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 78B5845F;\n\tThu, 30 Jun 2022 11:46:05 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1656582368;\n\tbh=HX8/JzwhZLTVu0Wlo+qevOGlgzL/afyhztitcbWj5rU=;\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=Pt2BMPGFmqnKj+roNcG1UdlFVItHrz+S93zmjyaqA5vSVTp9RtP+34xWPgJEv5vPR\n\t0I+YeaghLPu8w3NiW/0iE0I99bjB9B/i09XvhQj/KF3ZqDVzwdQavk6UdYuieGHs9m\n\tIwO8xI1BDSERFchkxYiuTW8lCBUThIahtVK5cmEnnNIeqtTgMFF7xqlZK8KYE4oZqx\n\tZcPRxs/3Ozn0bOHJH3T6+3vb275G7ZYXpcG9j4cNEcmeYFuF4z2VacosOpOHEIxdOc\n\twKwx2GvlOL3iP/6Q291dBZrz6cQZMBZXP2FXp1We5yJhBRl+/QVH8hhM7rWFSX+1Nw\n\tAai7kdy2xSFtg==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1656582366;\n\tbh=HX8/JzwhZLTVu0Wlo+qevOGlgzL/afyhztitcbWj5rU=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=QqNf7TqJ/xgmxzB7xOnsJe8ylwBJtTXtgwPQtr9OUc+vheXd/5uFoCMVg4t2zVQ0k\n\tM9fDVfOIyPFAprvdqa+ouHUna1KAvm+kVgFGI3b+/RpcbcIshD8b67+eSa0xawy9GJ\n\tnpoBLn2o3Q5bOrVNoZdaPZ/UBzD6VprFlm1J3LUo="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"QqNf7TqJ\"; dkim-atps=neutral","Date":"Thu, 30 Jun 2022 12:45:45 +0300","To":"Umang Jain <umang.jain@ideasonboard.com>","Message-ID":"<Yr1wycXrHH+7LOay@pendragon.ideasonboard.com>","References":"<20220630000251.31295-1-laurent.pinchart@ideasonboard.com>\n\t<20220630000251.31295-7-laurent.pinchart@ideasonboard.com>\n\t<2b896701-5516-1349-bbf0-12739ec21d5c@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<2b896701-5516-1349-bbf0-12739ec21d5c@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v2 06/12] gstreamer: Handle completed\n\trequests in the libcamerasrc task","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,\n\tNicolas Dufresne <nicolas.dufresne@collabora.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]