[{"id":23678,"web_url":"https://patchwork.libcamera.org/comment/23678/","msgid":"<edd0e780-3fd8-1c56-1eb9-4a06a2f835c0@ideasonboard.com>","date":"2022-06-30T09:14:04","subject":"Re: [libcamera-devel] [PATCH v2 11/12] gstreamer: Split completed\n\trequest processing to a separate function","submitter":{"id":86,"url":"https://patchwork.libcamera.org/api/people/86/","name":"Umang Jain","email":"umang.jain@ideasonboard.com"},"content":"Hi Laurent,\n\nOn 6/30/22 05:32, Laurent Pinchart via libcamera-devel wrote:\n> Simplify the task run function futher by moving the processing of\n> completed requests to a separate function. No functional change\n> intended, only increased readability.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n\n\nReviewed-by: Umang Jain <umang.jain@ideasonboard.com>\n\n> ---\n> Changes since v1:\n>\n> - Add comment about locking requirement\n> ---\n>   src/gstreamer/gstlibcamerasrc.cpp | 126 ++++++++++++++++++------------\n>   1 file changed, 74 insertions(+), 52 deletions(-)\n>\n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index d63083d0cd8f..9ea59631a9f2 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -135,6 +135,7 @@ struct GstLibcameraSrcState {\n>   \n>   \tint queueRequest();\n>   \tvoid requestCompleted(Request *request);\n> +\tint processRequest();\n>   };\n>   \n>   struct _GstLibcameraSrc {\n> @@ -254,6 +255,64 @@ GstLibcameraSrcState::requestCompleted(Request *request)\n>   \tgst_task_resume(src_->task);\n>   }\n>   \n> +/* Must be called with stream_lock held. */\n> +int GstLibcameraSrcState::processRequest()\n> +{\n> +\tstd::unique_ptr<RequestWrap> wrap;\n> +\n> +\t{\n> +\t\tMutexLocker locker(lock_);\n> +\n> +\t\tif (!completedRequests_.empty()) {\n> +\t\t\twrap = std::move(completedRequests_.front());\n> +\t\t\tcompletedRequests_.pop();\n> +\t\t}\n> +\t}\n> +\n> +\tif (!wrap)\n> +\t\treturn -ENODATA;\n> +\n> +\tGstFlowReturn ret = GST_FLOW_OK;\n> +\tgst_flow_combiner_reset(src_->flow_combiner);\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(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\tret = gst_pad_push(srcpad, buffer);\n> +\t\tret = gst_flow_combiner_update_pad_flow(src_->flow_combiner,\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> +\t\t}\n> +\n> +\t\treturn -EPIPE;\n> +\t}\n> +\n> +\treturn 0;\n> +}\n> +\n>   static bool\n>   gst_libcamera_src_open(GstLibcameraSrc *self)\n>   {\n> @@ -321,8 +380,13 @@ gst_libcamera_src_task_run(gpointer user_data)\n>   \tGstLibcameraSrc *self = GST_LIBCAMERA_SRC(user_data);\n>   \tGstLibcameraSrcState *state = self->state;\n>   \n> -\tint err = state->queueRequest();\n> -\tif (err == -ENOMEM) {\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\n> +\t * fatal error.\n> +\t */\n> +\tint ret = state->queueRequest();\n> +\tif (ret == -ENOMEM) {\n>   \t\tGST_ELEMENT_ERROR(self, RESOURCE, NO_SPACE_LEFT,\n>   \t\t\t\t  (\"Failed to allocate request for camera '%s'.\",\n>   \t\t\t\t   state->cam_->id().c_str()),\n> @@ -331,58 +395,16 @@ gst_libcamera_src_task_run(gpointer user_data)\n>   \t\treturn;\n>   \t}\n>   \n> -\tstd::unique_ptr<RequestWrap> wrap;\n> -\n> -\t{\n> -\t\tMutexLocker locker(state->lock_);\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> -\tGstFlowReturn ret = GST_FLOW_OK;\n> -\tgst_flow_combiner_reset(self->flow_combiner);\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\tret = gst_pad_push(srcpad, buffer);\n> -\t\tret = gst_flow_combiner_update_pad_flow(self->flow_combiner,\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 : state->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(self, ret);\n> -\t\t}\n> +\t/* Process one completed request, if available. */\n> +\tret = state->processRequest();\n> +\tswitch (ret) {\n> +\tcase -EPIPE:\n>   \t\tgst_task_stop(self->task);\n>   \t\treturn;\n> +\n> +\tcase -ENODATA:\n> +\t\tgst_task_pause(self->task);\n> +\t\treturn;\n>   \t}\n>   \n>   \t/*","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 E784FBE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 30 Jun 2022 09:14:15 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 395AA6564E;\n\tThu, 30 Jun 2022 11:14:15 +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 50EAC6054C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 30 Jun 2022 11:14:13 +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 7D53F45F;\n\tThu, 30 Jun 2022 11:14:11 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1656580455;\n\tbh=W2Gl/KL+TkUFSQVxLiQMFxeZxMxlexhcNq4WWbvwTxg=;\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=j60LXsh1rVwz3gYAweUwZM8JpODmmwkVLRJIoYErYL8grwj2MRL55g6A6O2eI7clY\n\toGzAzVNg12KltCvZqD8WrP367Ikmb99p4q2L3WeL0UoZXlmniUwn5ZNHIISW6Bu92Q\n\ty+Qfokbhz36ulFG5n7OV7YwHmiKOxZBhDeCl+5eHcrmrarq9m9OZRQ14yhr8/KNBDO\n\t1XqkWnj7p0qqFYAHppvoTb0suruRqZXOPHixZjZveuqv1Dyfq89MvMcjgnHzm8CCg2\n\tt0wavJ3Z97MQ6UCPMKxeBm3/hwT025FPS+nGcr/zEc1LDzIwGvtXmbgy61jlcx33jk\n\t33JaUiQiuuz7Q==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1656580452;\n\tbh=W2Gl/KL+TkUFSQVxLiQMFxeZxMxlexhcNq4WWbvwTxg=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=S4XlkEiZm3JyXXzn6EutM1YWbVhzo8JniibmdQpX8ZMdaXxD/G7AO1V+g/bLn1Nti\n\tEdAiMy5AoMXrSU+eSGAClsbHy6JVeotFk0jO93+xgMqf0sgG0+szJGrbfSZxe01Dh0\n\t9FBJhC1P8tVG3VUCAKjnhVIufeV412IJ8b6IMXss="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"S4XlkEiZ\"; dkim-atps=neutral","Message-ID":"<edd0e780-3fd8-1c56-1eb9-4a06a2f835c0@ideasonboard.com>","Date":"Thu, 30 Jun 2022 14:44:04 +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-12-laurent.pinchart@ideasonboard.com>","In-Reply-To":"<20220630000251.31295-12-laurent.pinchart@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH v2 11/12] gstreamer: Split completed\n\trequest processing to a separate function","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>"}}]