[{"id":23625,"web_url":"https://patchwork.libcamera.org/comment/23625/","msgid":"<0a4aadea6e303dec74fcad729a18e474e518307f.camel@collabora.com>","date":"2022-06-27T21:09:26","subject":"Re: [libcamera-devel] [PATCH 07/13] gstreamer: Handle completed\n\trequests in the libcamerasrc task","submitter":{"id":31,"url":"https://patchwork.libcamera.org/api/people/31/","name":"Nicolas Dufresne","email":"nicolas.dufresne@collabora.com"},"content":"Hi Laurent, \n\nLe vendredi 24 juin 2022 à 02:22 +0300, Laurent Pinchart a écrit :\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>  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 02fc913764f8..ee9c83fde777 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_(0)\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 = 0;\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 (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 (wrap->pts_) {\n\nThis cascade from my previous review:\n\n                if (GST_CLOCK_TIME_IS_VALID (wrap->pts_)) {\n\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>  \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 B6C85BD808\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 27 Jun 2022 21:09:38 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 19D8965637;\n\tMon, 27 Jun 2022 23:09:38 +0200 (CEST)","from madras.collabora.co.uk (madras.collabora.co.uk\n\t[46.235.227.172])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6C6286059B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 27 Jun 2022 23:09:37 +0200 (CEST)","from nicolas-tpx395.localdomain (192-222-136-102.qc.cable.ebox.net\n\t[192.222.136.102])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\tkey-exchange X25519 server-signature RSA-PSS (4096 bits)\n\tserver-digest SHA256)\n\t(No client certificate requested) (Authenticated sender: nicolas)\n\tby madras.collabora.co.uk (Postfix) with ESMTPSA id 8F9E1660163E;\n\tMon, 27 Jun 2022 22:09:36 +0100 (BST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1656364178;\n\tbh=aDsedZpM3I4sy1vHW+kB6CiqWpswySF9PiYex0dK8i8=;\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:Cc:\n\tFrom;\n\tb=mUTF0wAqRxpXx4N5jJLrvwYpg9vTbiF6unwHCYOlLQ5eRSTM3JyWNaFR3Hhj4ovtZ\n\tj3gkT3cjdwLTV+Hs0i5e+2Fzu7UJar9HdJkCaMmw82692gQrT12wJv5wo/AjRuwRb6\n\t/QK0mgp+Vfilq+Ha+oygFZYiqueuuGK/kaAG/W797pzvG46hZ8KaytGEU/wPjhFDmD\n\txUHBnpt56kFFqe39JlF5FbN9T1ePbGk+8qxCDG+WnUEw5s0juR6UzYA+ZqaPE+7TES\n\th5xnB1HCi8XWJnF2RYBmqslvfthKq1Ly+GiuPyOVyMiFmroUVevRube2A9fSrgaWeO\n\tnc7MxvWF6vTqg==","v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com;\n\ts=mail; t=1656364177;\n\tbh=aDsedZpM3I4sy1vHW+kB6CiqWpswySF9PiYex0dK8i8=;\n\th=Subject:From:To:Cc:Date:In-Reply-To:References:From;\n\tb=Z7fbhHJvp3t7kp7X7M+rgW15+byeBqMQrBbBP44VMgbnkA9CvQx5E7LF6h+qiZyrf\n\tVLaIw9k9T/XKxHdDhqDZRUZvZYEOMYKR+J6GgLC+AeovrDgLfPiWgkoybEch8JIqzJ\n\ttOnOyeu/QCnKHRKrRSn8t8FsHB8OJjJA9WelWvoSTINNJ592/7NVVbsen+ckgii324\n\tY/6+iOhbYGP2scodfR2ud7FDcdhogk0Ex/EWgc3sHrz30nBvIKBJ5d6Vx8h4epLnLM\n\tGb8ZNIl/z8Qh62yQwr45wqpD2m2MKns0nSzGfCa+pE2FBbU8PnH7LYbdTreOXp3G62\n\tu80c6w4NS8PQw=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=collabora.com\n\theader.i=@collabora.com\n\theader.b=\"Z7fbhHJv\"; dkim-atps=neutral","Message-ID":"<0a4aadea6e303dec74fcad729a18e474e518307f.camel@collabora.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>, \n\tlibcamera-devel@lists.libcamera.org","Date":"Mon, 27 Jun 2022 17:09:26 -0400","In-Reply-To":"<20220623232210.18742-8-laurent.pinchart@ideasonboard.com>","References":"<20220623232210.18742-1-laurent.pinchart@ideasonboard.com>\n\t<20220623232210.18742-8-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","User-Agent":"Evolution 3.44.2 (3.44.2-1.fc36) ","MIME-Version":"1.0","Subject":"Re: [libcamera-devel] [PATCH 07/13] 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":"Nicolas Dufresne via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","Cc":"Vedant Paranjape <vedantparanjape160201@gmail.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]