Patch Detail
Show a patch.
GET /api/patches/19191/?format=api
{ "id": 19191, "url": "https://patchwork.libcamera.org/api/patches/19191/?format=api", "web_url": "https://patchwork.libcamera.org/patch/19191/", "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": "<20231106165545.47116-1-jaslo@ziska.de>", "date": "2023-11-06T16:52:57", "name": "[libcamera-devel] gstreamer: Implement EOS handling", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "5415cb8cb898ee370c6b4f703593f61a912048f9", "submitter": { "id": 173, "url": "https://patchwork.libcamera.org/api/people/173/?format=api", "name": "Jaslo Ziska", "email": "jaslo@ziska.de" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/19191/mbox/", "series": [ { "id": 4066, "url": "https://patchwork.libcamera.org/api/series/4066/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=4066", "date": "2023-11-06T16:52:57", "name": "[libcamera-devel] gstreamer: Implement EOS handling", "version": 1, "mbox": "https://patchwork.libcamera.org/series/4066/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/19191/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/19191/checks/", "tags": {}, "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 3A24CBDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 6 Nov 2023 19:31:27 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 88792629A2;\n\tMon, 6 Nov 2023 20:31:26 +0100 (CET)", "from mo4-p00-ob.smtp.rzone.de (mo4-p00-ob.smtp.rzone.de\n\t[81.169.146.218])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8F63261DBA\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 6 Nov 2023 17:57:01 +0100 (CET)", "from archlinux.fritz.box by smtp.strato.de (RZmta 49.9.1 AUTH)\n\twith ESMTPSA id 6bb150zA6Gv1mxn\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits))\n\t(Client did not present a certificate);\n\tMon, 6 Nov 2023 17:57:01 +0100 (CET)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1699299086;\n\tbh=joazzP8pAi8f+f+035xJHb92zrQ/zFLWfbOy5G6jkxY=;\n\th=To:Date:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post:\n\tList-Help:List-Subscribe:From:Reply-To:Cc:From;\n\tb=D9mrCfKiWKxSb5IVhhCLx1TR3VSbTLx+DAF/Iw88JMngxsiREj3k0nUhivSwSnrxo\n\tV6CACpedc4sjtaLW91QcYABmYJfqucApkJQv3TpgJzvtT17EauCSRH9XUm9bz4LcDP\n\tGxyI9F/BInm6K4sc4vl9Cz/GJ106ETt1TrUuUpzzzxrR7caIF6APsaFRipddTdO5Nr\n\twT6+Y8satKHhP96FDrBM5AVueO5xxZd6ysJ3CpY/w2/ceFkUFdtaMiVV9gcjm5sZtV\n\tK/HR6mtsE77HsLvDo2w5Ri+soXAdM8JH0pZRryqrO2T0pFZsM2V2fOmO7MnqPXui/p\n\tu0cEDMfzSO+nw==", "v=1; a=rsa-sha256; c=relaxed/relaxed; t=1699289821;\n\ts=strato-dkim-0002; d=ziska.de;\n\th=Message-ID:Date:Subject:Cc:To:From:Cc:Date:From:Subject:Sender;\n\tbh=owrJwswb0NiuH1dPo0kJ4a70ARu+u32XGFubs2kyL5Y=;\n\tb=Dy9RraW+o34G7Bswtp0cpOagixUbVvk5L6zNsqvnGrCIKGpxqapFdgQRGjNGIFDkgT\n\tGBWp0/SZ+iAYG5Zoa6B98caFFNN0o17RfU4/5K39OwvAO837Wc1aKvVhC/nqDGI0+MpW\n\tk/v1zOAtOwImm4Xllvd70AXJQE4zspAuASAClWuUl/f631nKbk0Mmv44bU7tiKMdddJy\n\tfxAjNHbP8vSbDtY5bh1LpxDVM2VAZTkRaz5i61oltAba864g8Tij5BzmPcGJziPJOyCG\n\tct7vQeZIfy/HLI9N4e1Pgi2lHSWShNQiJowcc+GWGzfM9tqubph2pcg+SkSU/zCAAbqe\n\tCq2g==", "v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1699289821;\n\ts=strato-dkim-0003; d=ziska.de;\n\th=Message-ID:Date:Subject:Cc:To:From:Cc:Date:From:Subject:Sender;\n\tbh=owrJwswb0NiuH1dPo0kJ4a70ARu+u32XGFubs2kyL5Y=;\n\tb=jABrY6s6dzYkIZ3fYt1yXXL0qihbSAbfblEboDOnqj+nzmsMQ393MvEHnwzL64l1eM\n\tXsWH7WYNGESQXjs/oPAQ==" ], "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=ziska.de header.i=@ziska.de\n\theader.b=\"Dy9RraW+\"; \n\tdkim=permerror (0-bit key) header.d=ziska.de header.i=@ziska.de\n\theader.b=\"jABrY6s6\"; dkim-atps=neutral", "ARC-Seal": "i=1; a=rsa-sha256; t=1699289821; cv=none;\n\td=strato.com; s=strato-dkim-0002;\n\tb=jUYm4zLfFRbWJILfp1JelDrUeYO2770nIcZ4OB4YWbKGJL3c0ddA14abTJSsWcZu23\n\tL3QJ6fzg2XeqpZUVhk2HGAumdNhwLdMQxko1JxydMuIk5Zyjt/vdeiqdFnH4KEbkQ4Pc\n\tQTgKbTIF6BgS6tiOyZhXI9BXcB1+yfcMwVK3uXbvtNAYGMwCb8CyeDTbheDp8ULjpMzK\n\tpTrIjgEhyKqUkn7eR3HxWlgRl0T32sziqbUY9TWRVg+daV4h4tzClLgzAy/XSeziPNU8\n\tn+uy2JreOOINi7bSb5bIo/FA08i5UpqKv91+fpqtLwQLvFJyE8f7G36xM7lTB2O3mJ9a\n\t2GzA==", "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; t=1699289821;\n\ts=strato-dkim-0002; d=strato.com;\n\th=Message-ID:Date:Subject:Cc:To:From:Cc:Date:From:Subject:Sender;\n\tbh=owrJwswb0NiuH1dPo0kJ4a70ARu+u32XGFubs2kyL5Y=;\n\tb=S+VyWF6jJwUBo1o6GIYAqkuNSdtEnyTa15e+SiI9D536dZjwaw8rkzFMF7wuIhkwjf\n\tDVzEWnFxLN1HwLOblnqXMbVPlwZ/58rBY5GoA6OJNmlM4rcOR6rD/74d0toHHOxyiAC4\n\tt/9pIMZULNyFiJqdK2zqEcSG7TP+gv9kf/37Ea19I52O4D5aAlaPR5B71rOVMFXzmvH7\n\tJ8hqCjR8OxXMsrHstOKGqNObqiVNULvy7M+K0YC5M1vz6y2+7NPk0LHY/jYZFJ1Jf/MO\n\t4uDXplYPwEerhjpvNnozOQ5W+wX9FlF2mCReVHTmmyuKww5gb2uSUe+ah7L/wnDGf6gJ\n\tRCAQ==", "ARC-Authentication-Results": "i=1; strato.com;\n arc=none;\n dkim=none", "X-RZG-CLASS-ID": "mo00", "X-RZG-AUTH": "\":Jm0XeU+IYfb0x77LHmrjN5Wlb7TBwusDqIM6Hizy8VdfzvKi4yoFC9cE0Yq7VvJaIN88vdzOogHquPEQYsYDeV75nip6\"", "To": "libcamera-devel@lists.libcamera.org", "Date": "Mon, 6 Nov 2023 17:52:57 +0100", "Message-ID": "<20231106165545.47116-1-jaslo@ziska.de>", "X-Mailer": "git-send-email 2.42.1", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Content-Type": "text/plain; charset=\"us-ascii\"", "X-Mailman-Approved-At": "Mon, 06 Nov 2023 20:31:24 +0100", "Subject": "[libcamera-devel] [PATCH] gstreamer: Implement EOS handling", "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": "Jaslo Ziska via libcamera-devel <libcamera-devel@lists.libcamera.org>", "Reply-To": "Jaslo Ziska <jaslo@ziska.de>", "Cc": "Jaslo Ziska <jaslo@ziska.de>", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "---\nHi,\n\nI recently implemented basic EOS handling for the libcamerasrc gstreamer element.\n\nI basically looked at how GstBaseSrc does it and tried to do it similarly.\n\nI have no idea whether the locking is correct or if this is thread safe but so far it worked without any issues for my purposes.\n\nYou can also now run the following command and receive a working video file:\n\ngst-launch-1.0 -e libcamerasrc ! videoconvert ! x264enc ! h264parse ! mp4mux ! filesink location=test.mp4\n\nLooking forward for feedback!\n\nCheers,\n\nJaslo\n\n src/gstreamer/gstlibcamerasrc.cpp | 47 +++++++++++++++++++++++++++++++\n 1 file changed, 47 insertions(+)\n\n--\n2.42.1", "diff": "diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\nindex 63d99571..a4681e1e 100644\n--- a/src/gstreamer/gstlibcamerasrc.cpp\n+++ b/src/gstreamer/gstlibcamerasrc.cpp\n@@ -144,6 +144,9 @@ struct _GstLibcameraSrc {\n \tgchar *camera_name;\n \tcontrols::AfModeEnum auto_focus_mode = controls::AfModeManual;\n\n+\tGstEvent *pending_eos;\n+\tint has_pending_eos;\n+\n \tGstLibcameraSrcState *state;\n \tGstLibcameraAllocator *allocator;\n \tGstFlowCombiner *flow_combiner;\n@@ -397,6 +400,21 @@ gst_libcamera_src_task_run(gpointer user_data)\n\n \tbool doResume = false;\n\n+\tif (g_atomic_int_get(&self->has_pending_eos)) {\n+\t\tg_atomic_int_set(&self->has_pending_eos, FALSE);\n+\n+\t\tGST_OBJECT_LOCK(self);\n+\t\tGstEvent *event = self->pending_eos;\n+\t\tself->pending_eos = NULL;\n+\t\tGST_OBJECT_UNLOCK(self);\n+\n+\t\tfor (GstPad *srcpad : state->srcpads_)\n+\t\t\tgst_pad_push_event(srcpad, gst_event_ref(event));\n+\t\tgst_event_unref(event);\n+\n+\t\treturn;\n+\t}\n+\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@@ -747,6 +765,32 @@ gst_libcamera_src_change_state(GstElement *element, GstStateChange transition)\n \treturn ret;\n }\n\n+static gboolean\n+gst_libcamera_src_send_event(GstElement *element, GstEvent *event)\n+{\n+\tGstLibcameraSrc *self = GST_LIBCAMERA_SRC(element);\n+\tgboolean ret = FALSE;\n+\n+\tswitch (GST_EVENT_TYPE(event)) {\n+\tcase GST_EVENT_EOS: {\n+\t\tGST_OBJECT_LOCK(self);\n+\t\tg_atomic_int_set(&self->has_pending_eos, TRUE);\n+\t\tif (self->pending_eos)\n+\t\t\tgst_event_unref(self->pending_eos);\n+\t\tself->pending_eos = event;\n+\t\tGST_OBJECT_UNLOCK(self);\n+\n+\t\tret = TRUE;\n+\t\tbreak;\n+\t}\n+\tdefault:\n+\t\tgst_event_unref(event);\n+\t\tbreak;\n+\t}\n+\n+\treturn ret;\n+}\n+\n static void\n gst_libcamera_src_finalize(GObject *object)\n {\n@@ -779,6 +823,8 @@ gst_libcamera_src_init(GstLibcameraSrc *self)\n \tstate->srcpads_.push_back(gst_pad_new_from_template(templ, \"src\"));\n \tgst_element_add_pad(GST_ELEMENT(self), state->srcpads_.back());\n\n+\tGST_OBJECT_FLAG_SET(self, GST_ELEMENT_FLAG_SOURCE);\n+\n \t/* C-style friend. */\n \tstate->src_ = self;\n \tself->state = state;\n@@ -844,6 +890,7 @@ gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)\n \telement_class->request_new_pad = gst_libcamera_src_request_new_pad;\n \telement_class->release_pad = gst_libcamera_src_release_pad;\n \telement_class->change_state = gst_libcamera_src_change_state;\n+\telement_class->send_event = gst_libcamera_src_send_event;\n\n \tgst_element_class_set_metadata(element_class,\n \t\t\t\t \"libcamera Source\", \"Source/Video\",\n", "prefixes": [ "libcamera-devel" ] }