Patch Detail
Show a patch.
GET /api/patches/2744/?format=api
{ "id": 2744, "url": "https://patchwork.libcamera.org/api/patches/2744/?format=api", "web_url": "https://patchwork.libcamera.org/patch/2744/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20200129033210.278800-11-nicolas@ndufresne.ca>", "date": "2020-01-29T03:31:57", "name": "[libcamera-devel,v1,10/23] gst: libcamerasrc: Start/Stop the streaming thread", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "bdcf2609dfedd215e4a914d8b4ce9630cf5ecbff", "submitter": { "id": 30, "url": "https://patchwork.libcamera.org/api/people/30/?format=api", "name": "Nicolas Dufresne", "email": "nicolas@ndufresne.ca" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/2744/mbox/", "series": [ { "id": 648, "url": "https://patchwork.libcamera.org/api/series/648/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=648", "date": "2020-01-29T03:31:47", "name": "GStreamer Element for libcamera", "version": 1, "mbox": "https://patchwork.libcamera.org/series/648/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/2744/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/2744/checks/", "tags": {}, "headers": { "Return-Path": "<nicolas@ndufresne.ca>", "Received": [ "from bhuna.collabora.co.uk (bhuna.collabora.co.uk\n\t[IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 11921608CA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 29 Jan 2020 04:35:30 +0100 (CET)", "from nicolas-tpx395.localdomain (unknown\n\t[IPv6:2002:c0de:c115:0:66fc:8b:2a38:8313])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits))\n\t(No client certificate requested) (Authenticated sender: nicolas)\n\tby bhuna.collabora.co.uk (Postfix) with ESMTPSA id 72EC828EA9F;\n\tWed, 29 Jan 2020 03:35:28 +0000 (GMT)" ], "From": "Nicolas Dufresne <nicolas@ndufresne.ca>", "To": "libcamera-devel@lists.libcamera.org", "Cc": "Nicolas Dufresne <nicolas.dufresne@collabora.com>", "Date": "Tue, 28 Jan 2020 22:31:57 -0500", "Message-Id": "<20200129033210.278800-11-nicolas@ndufresne.ca>", "X-Mailer": "git-send-email 2.24.1", "In-Reply-To": "<20200129033210.278800-1-nicolas@ndufresne.ca>", "References": "<20200129033210.278800-1-nicolas@ndufresne.ca>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [PATCH v1 10/23] gst: libcamerasrc: Start/Stop\n\tthe 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": "Wed, 29 Jan 2020 03:35:30 -0000" }, "content": "From: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n\nUse a GstTask as our internal streaming thread. Unlike GstBaseSrc, we\nwill be running an streaming thread at the element level rather then\nper pad. This is needed to combine buffer request for multiple pads.\n\nSigned-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n---\n src/gstreamer/gstlibcamerasrc.cpp | 45 +++++++++++++++++++++++++++++++\n 1 file changed, 45 insertions(+)", "diff": "diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\nindex abb376b..4d0c7d0 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 it 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,18 @@ 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/* FIXME maybe this should happen before pad deactivation ? */\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 +238,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 +252,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;\n", "prefixes": [ "libcamera-devel", "v1", "10/23" ] }