Show a patch.

GET /api/1.1/patches/3011/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 3011,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/3011/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/3011/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/1.1/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": "<20200306202637.525587-6-nicolas@ndufresne.ca>",
    "date": "2020-03-06T20:26:15",
    "name": "[libcamera-devel,v3,05/27] gst: Add pads to the source",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "ae6692b98b3c23297d33c57e38032be2bee3786f",
    "submitter": {
        "id": 30,
        "url": "https://patchwork.libcamera.org/api/1.1/people/30/?format=api",
        "name": "Nicolas Dufresne",
        "email": "nicolas@ndufresne.ca"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/3011/mbox/",
    "series": [
        {
            "id": 705,
            "url": "https://patchwork.libcamera.org/api/1.1/series/705/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=705",
            "date": "2020-03-06T20:26:10",
            "name": "GStreamer Element for libcamera",
            "version": 3,
            "mbox": "https://patchwork.libcamera.org/series/705/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/3011/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/3011/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 47DE560424\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  6 Mar 2020 21:27:02 +0100 (CET)",
            "from nicolas-tpx395.localdomain (unknown [IPv6:2610:98:8005::527])\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 ABE0C2970E7;\n\tFri,  6 Mar 2020 20:27:01 +0000 (GMT)"
        ],
        "From": "Nicolas Dufresne <nicolas@ndufresne.ca>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Nicolas Dufresne <nicolas.dufresne@collabora.com>,\n\tLaurent Pinchart <laurent.pinchart@ideasonboard.com>",
        "Date": "Fri,  6 Mar 2020 15:26:15 -0500",
        "Message-Id": "<20200306202637.525587-6-nicolas@ndufresne.ca>",
        "X-Mailer": "git-send-email 2.24.1",
        "In-Reply-To": "<20200306202637.525587-1-nicolas@ndufresne.ca>",
        "References": "<20200306202637.525587-1-nicolas@ndufresne.ca>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v3 05/27] gst: Add pads to the source",
        "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": "Fri, 06 Mar 2020 20:27:02 -0000"
    },
    "content": "From: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n\nThis simply adds the boiler plate for pads on the source element. The\ndesign is that we have one pad, called \"src\", that will always be\npresent, and then more pads can be requested prior in READY or less\nstate. Initially pads have one property \"stream-role\" that let you\ndecide which role this pad will have.\n\nSigned-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n src/gstreamer/gstlibcamerapad.cpp | 102 ++++++++++++++++++++++++++++++\n src/gstreamer/gstlibcamerapad.h   |  19 ++++++\n src/gstreamer/gstlibcamerasrc.cpp |  20 ++++++\n src/gstreamer/meson.build         |   1 +\n 4 files changed, 142 insertions(+)\n create mode 100644 src/gstreamer/gstlibcamerapad.cpp\n create mode 100644 src/gstreamer/gstlibcamerapad.h",
    "diff": "diff --git a/src/gstreamer/gstlibcamerapad.cpp b/src/gstreamer/gstlibcamerapad.cpp\nnew file mode 100644\nindex 0000000..ca5c820\n--- /dev/null\n+++ b/src/gstreamer/gstlibcamerapad.cpp\n@@ -0,0 +1,102 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2019, Collabora Ltd.\n+ *     Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n+ *\n+ * gstlibcamerapad.cpp - GStreamer Capture Pad\n+ */\n+\n+#include \"gstlibcamerapad.h\"\n+\n+#include <libcamera/stream.h>\n+\n+#include \"gstlibcamera-utils.h\"\n+\n+using namespace libcamera;\n+\n+struct _GstLibcameraPad {\n+\tGstPad parent;\n+\tStreamRole role;\n+};\n+\n+enum {\n+\tPROP_0,\n+\tPROP_STREAM_ROLE\n+};\n+\n+G_DEFINE_TYPE(GstLibcameraPad, gst_libcamera_pad, GST_TYPE_PAD);\n+\n+static void\n+gst_libcamera_pad_set_property(GObject *object, guint prop_id,\n+\t\t\t       const GValue *value, GParamSpec *pspec)\n+{\n+\tauto *self = GST_LIBCAMERA_PAD(object);\n+\tGLibLocker lock(GST_OBJECT(self));\n+\n+\tswitch (prop_id) {\n+\tcase PROP_STREAM_ROLE:\n+\t\tself->role = (StreamRole)g_value_get_enum(value);\n+\t\tbreak;\n+\tdefault:\n+\t\tG_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);\n+\t\tbreak;\n+\t}\n+}\n+\n+static void\n+gst_libcamera_pad_get_property(GObject *object, guint prop_id, GValue *value,\n+\t\t\t       GParamSpec *pspec)\n+{\n+\tauto *self = GST_LIBCAMERA_PAD(object);\n+\tGLibLocker lock(GST_OBJECT(self));\n+\n+\tswitch (prop_id) {\n+\tcase PROP_STREAM_ROLE:\n+\t\tg_value_set_enum(value, self->role);\n+\t\tbreak;\n+\tdefault:\n+\t\tG_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);\n+\t\tbreak;\n+\t}\n+}\n+\n+static void\n+gst_libcamera_pad_init(GstLibcameraPad *self)\n+{\n+}\n+\n+static GType\n+gst_libcamera_stream_role_get_type(void)\n+{\n+\tstatic GType type = 0;\n+\tstatic const GEnumValue values[] = {\n+\t\t{ StillCapture, \"libcamera::StillCapture\", \"still-capture\" },\n+\t\t{ VideoRecording, \"libcamera::VideoRecording\", \"video-recording\" },\n+\t\t{ Viewfinder, \"libcamera::Viewfinder\", \"view-finder\" },\n+\t\t{ 0, NULL, NULL }\n+\t};\n+\n+\tif (!type)\n+\t\ttype = g_enum_register_static(\"GstLibcameraStreamRole\", values);\n+\n+\treturn type;\n+}\n+\n+static void\n+gst_libcamera_pad_class_init(GstLibcameraPadClass *klass)\n+{\n+\tauto *object_class = G_OBJECT_CLASS(klass);\n+\n+\tobject_class->set_property = gst_libcamera_pad_set_property;\n+\tobject_class->get_property = gst_libcamera_pad_get_property;\n+\n+\tauto *spec = g_param_spec_enum(\"stream-role\", \"Stream Role\",\n+\t\t\t\t       \"The selected stream role\",\n+\t\t\t\t       gst_libcamera_stream_role_get_type(),\n+\t\t\t\t       VideoRecording,\n+\t\t\t\t       (GParamFlags)(GST_PARAM_MUTABLE_READY\n+\t\t\t\t\t             | G_PARAM_CONSTRUCT\n+\t\t\t\t\t\t     | G_PARAM_READWRITE\n+\t\t\t\t\t\t     | G_PARAM_STATIC_STRINGS));\n+\tg_object_class_install_property(object_class, PROP_STREAM_ROLE, spec);\n+}\ndiff --git a/src/gstreamer/gstlibcamerapad.h b/src/gstreamer/gstlibcamerapad.h\nnew file mode 100644\nindex 0000000..2e745f1\n--- /dev/null\n+++ b/src/gstreamer/gstlibcamerapad.h\n@@ -0,0 +1,19 @@\n+/* SPDX-License-Identifier: LGPL-2.1-or-later */\n+/*\n+ * Copyright (C) 2019, Collabora Ltd.\n+ *     Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n+ *\n+ * gstlibcamerapad.h - GStreamer Capture Element\n+ */\n+\n+#include <gst/gst.h>\n+\n+#ifndef __GST_LIBCAMERA_PAD_H__\n+#define __GST_LIBCAMERA_PAD_H__\n+\n+#define GST_TYPE_LIBCAMERA_PAD gst_libcamera_pad_get_type()\n+G_DECLARE_FINAL_TYPE(GstLibcameraPad, gst_libcamera_pad,\n+\t\t     GST_LIBCAMERA, PAD, GstPad)\n+\n+\n+#endif /* __GST_LIBCAMERA_PAD_H__ */\ndiff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\nindex 3807503..79d4196 100644\n--- a/src/gstreamer/gstlibcamerasrc.cpp\n+++ b/src/gstreamer/gstlibcamerasrc.cpp\n@@ -8,12 +8,26 @@\n \n #include \"gstlibcamerasrc.h\"\n \n+#include \"gstlibcamerapad.h\"\n+\n struct _GstLibcameraSrc {\n \tGstElement parent;\n };\n \n G_DEFINE_TYPE(GstLibcameraSrc, gst_libcamera_src, GST_TYPE_ELEMENT);\n \n+#define TEMPLATE_CAPS GST_STATIC_CAPS(\"video/x-raw; image/jpeg\")\n+\n+/* For the simple case, we have a src pad that is always present. */\n+GstStaticPadTemplate src_template = {\n+\t\"src\", GST_PAD_SRC, GST_PAD_ALWAYS, TEMPLATE_CAPS\n+};\n+\n+/* More pads can be requested in state < PAUSED */\n+GstStaticPadTemplate request_src_template = {\n+\t\"src_%s\", GST_PAD_SRC, GST_PAD_REQUEST, TEMPLATE_CAPS\n+};\n+\n static void\n gst_libcamera_src_init(GstLibcameraSrc *self)\n {\n@@ -28,4 +42,10 @@ gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)\n \t\t\t\t       \"libcamera Source\", \"Source/Video\",\n \t\t\t\t       \"Linux Camera source using libcamera\",\n \t\t\t\t       \"Nicolas Dufresne