[{"id":3865,"web_url":"https://patchwork.libcamera.org/comment/3865/","msgid":"<20200229135226.GL18738@pendragon.ideasonboard.com>","date":"2020-02-29T13:52:26","subject":"Re: [libcamera-devel] [PATCH v2 10/27] gst: libcamerasrc: Add a\n\ttask for the streaming thread","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Nicolas,\n\nThank you for the patch.\n\nOn Thu, Feb 27, 2020 at 03:03:50PM -0500, Nicolas Dufresne wrote:\n> Use a GstTask as our internal streaming thread. Unlike GstBaseSrc, we\n> will be running a streaming thread at the element level rather than\n> per pad. This is needed to combine buffer request for multiple pads.\n> \n> Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n> ---\n>  src/gstreamer/gstlibcamerasrc.cpp | 49 +++++++++++++++++++++++++++++++\n>  1 file changed, 49 insertions(+)\n> \n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index 0c60478..53ece26 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -26,7 +26,11 @@ struct GstLibcameraSrcState {\n>  \n>  struct _GstLibcameraSrc {\n>  \tGstElement parent;\n> +\n> +\tGRecMutex stream_lock;\n> +\tGstTask *task;\n>  \tGstPad *srcpad;\n> +\n>  \tgchar *camera_name;\n>  \n>  \tGstLibcameraSrcState *state;\n> @@ -112,6 +116,30 @@ gst_libcamera_src_open(GstLibcameraSrc *self)\n>  \treturn true;\n>  }\n>  \n> +static void\n> +gst_libcamera_src_task_run(gpointer user_data)\n> +{\n> +\tGstLibcameraSrc *self = GST_LIBCAMERA_SRC(user_data);\n> +\n> +\tGST_DEBUG_OBJECT(self, \"Streaming thread is now capturing\");\n> +}\n> +\n> +static void\n> +gst_libcamera_src_task_enter(GstTask *task, GThread *thread, gpointer user_data)\n> +{\n> +\tGstLibcameraSrc *self = GST_LIBCAMERA_SRC(user_data);\n> +\n> +\tGST_DEBUG_OBJECT(self, \"Streaming thread has started\");\n> +}\n> +\n> +static void\n> +gst_libcamera_src_task_leave(GstTask *task, GThread *thread, gpointer user_data)\n> +{\n> +\tGstLibcameraSrc *self = GST_LIBCAMERA_SRC(user_data);\n> +\n> +\tGST_DEBUG_OBJECT(self, \"Streaming thread is about to stop\");\n> +}\n> +\n>  static void\n>  gst_libcamera_src_close(GstLibcameraSrc *self)\n>  {\n> @@ -182,9 +210,22 @@ gst_libcamera_src_change_state(GstElement *element, GstStateChange transition)\n>  \t\t\treturn GST_STATE_CHANGE_FAILURE;\n>  \t\tbreak;\n>  \tcase GST_STATE_CHANGE_READY_TO_PAUSED:\n> +\t\t/* This needs to be called after pads activation.*/\n> +\t\tif (!gst_task_pause(self->task))\n> +\t\t\treturn GST_STATE_CHANGE_FAILURE;\n> +\t\tret = GST_STATE_CHANGE_NO_PREROLL;\n> +\t\tbreak;\n>  \tcase GST_STATE_CHANGE_PLAYING_TO_PAUSED:\n>  \t\tret = GST_STATE_CHANGE_NO_PREROLL;\n>  \t\tbreak;\n> +\tcase GST_STATE_CHANGE_PAUSED_TO_READY:\n> +\t\t/* \\todo this might requires some thread unblocking in the future\n\ns/requires/require/\n\n> +\t\t * if the streaming thread starts doing any kind of blocking\n> +\t\t * operations. If this was the case, we would need to do so\n> +\t\t * before pad deactivation, so before chaining to the parent\n> +\t\t * change_state function. */\n\n\t\t/*\n\t\t * ...\n\t\t */\n\nhere too.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +\t\tgst_task_join(self->task);\n> +\t\tbreak;\n>  \tcase GST_STATE_CHANGE_READY_TO_NULL:\n>  \t\tgst_libcamera_src_close(self);\n>  \t\tbreak;\n> @@ -201,6 +242,8 @@ gst_libcamera_src_finalize(GObject *object)\n>  \tGObjectClass *klass = G_OBJECT_CLASS(gst_libcamera_src_parent_class);\n>  \tGstLibcameraSrc *self = GST_LIBCAMERA_SRC(object);\n>  \n> +\tg_rec_mutex_clear(&self->stream_lock);\n> +\tg_clear_object(&self->task);\n>  \tg_free(self->camera_name);\n>  \tdelete self->state;\n>  \n> @@ -213,6 +256,12 @@ gst_libcamera_src_init(GstLibcameraSrc *self)\n>  \tGstLibcameraSrcState *state = new GstLibcameraSrcState();\n>  \tGstPadTemplate *templ = gst_element_get_pad_template(GST_ELEMENT(self), \"src\");\n>  \n> +\tg_rec_mutex_init(&self->stream_lock);\n> +\tself->task = gst_task_new(gst_libcamera_src_task_run, self, nullptr);\n> +\tgst_task_set_enter_callback(self->task, gst_libcamera_src_task_enter, self, nullptr);\n> +\tgst_task_set_leave_callback(self->task, gst_libcamera_src_task_leave, self, nullptr);\n> +\tgst_task_set_lock(self->task, &self->stream_lock);\n> +\n>  \tself->srcpad = gst_pad_new_from_template(templ, \"src\");\n>  \tgst_element_add_pad(GST_ELEMENT(self), self->srcpad);\n>  \tself->state = state;","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4E50562689\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 29 Feb 2020 14:52:50 +0100 (CET)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id AB1342AF;\n\tSat, 29 Feb 2020 14:52:49 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1582984369;\n\tbh=rWz8qzfv2gwvhUjxj91BuYgkCWD9auEwG/qZmOuMeJ8=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=HaNV0XY7YxvRLLzPVAM/Zz3YqlnhYCHnPj6eW/7T0Px8TqpzvUukCidIYnQwTXgiB\n\t9UWiCsQGANiHvMc7p8ZjU0IfC8xp//ExCSEz+b0u7PYfwY89NGL6PumaEmlyomHtGR\n\tkWQtYpAV1+k3q9JMbTmuVuW1MllRJP/WUq8dbILY=","Date":"Sat, 29 Feb 2020 15:52:26 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20200229135226.GL18738@pendragon.ideasonboard.com>","References":"<20200227200407.490616-1-nicolas.dufresne@collabora.com>\n\t<20200227200407.490616-11-nicolas.dufresne@collabora.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20200227200407.490616-11-nicolas.dufresne@collabora.com>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v2 10/27] gst: libcamerasrc: Add a\n\ttask for the streaming thread","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>","X-List-Received-Date":"Sat, 29 Feb 2020 13:52:50 -0000"}}]