[{"id":3862,"web_url":"https://patchwork.libcamera.org/comment/3862/","msgid":"<20200229133603.GI18738@pendragon.ideasonboard.com>","date":"2020-02-29T13:36:03","subject":"Re: [libcamera-devel] [PATCH v2 05/27] gst: Add pads to the source","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:45PM -0500, Nicolas Dufresne wrote:\n> This simply adds the boiler plate for pads on the source element. The\n> design is that we have one pad, called \"src\", that will always be\n> present, and then more pads can be requested prior in READY or less\n> state. Initially pads have one property \"stream-role\" that let you\n> decide which role this pad will have.\n> \n> Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> ---\n>  src/gstreamer/gstlibcamerapad.cpp | 101 ++++++++++++++++++++++++++++++\n>  src/gstreamer/gstlibcamerapad.h   |  19 ++++++\n>  src/gstreamer/gstlibcamerasrc.cpp |  19 ++++++\n>  src/gstreamer/meson.build         |   1 +\n>  4 files changed, 140 insertions(+)\n>  create mode 100644 src/gstreamer/gstlibcamerapad.cpp\n>  create mode 100644 src/gstreamer/gstlibcamerapad.h\n> \n> diff --git a/src/gstreamer/gstlibcamerapad.cpp b/src/gstreamer/gstlibcamerapad.cpp\n> new file mode 100644\n> index 0000000..6212c3b\n> --- /dev/null\n> +++ b/src/gstreamer/gstlibcamerapad.cpp\n> @@ -0,0 +1,101 @@\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> +#include \"gstlibcamera-utils.h\"\n> +\n> +#include <libcamera/stream.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> +}\n> diff --git a/src/gstreamer/gstlibcamerapad.h b/src/gstreamer/gstlibcamerapad.h\n> new file mode 100644\n> index 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__ */\n> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp\n> index 3807503..085c489 100644\n> --- a/src/gstreamer/gstlibcamerasrc.cpp\n> +++ b/src/gstreamer/gstlibcamerasrc.cpp\n> @@ -6,6 +6,7 @@\n>   * gstlibcamerasrc.cpp - GStreamer Capture Element\n>   */\n>  \n> +#include \"gstlibcamerapad.h\"\n>  #include \"gstlibcamerasrc.h\"\n>  \n>  struct _GstLibcameraSrc {\n> @@ -14,6 +15,18 @@ struct _GstLibcameraSrc {\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 +41,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 <nicolas.dufresne@collabora.com\");\n> +\tgst_element_class_add_static_pad_template_with_gtype(element_class,\n> +\t\t\t\t\t\t\t     &src_template,\n> +\t\t\t\t\t\t\t     GST_TYPE_LIBCAMERA_PAD);\n> +\tgst_element_class_add_static_pad_template_with_gtype(element_class,\n> +\t\t\t\t\t\t\t     &request_src_template,\n> +\t\t\t\t\t\t\t     GST_TYPE_LIBCAMERA_PAD);\n>  }\n> diff --git a/src/gstreamer/meson.build b/src/gstreamer/meson.build\n> index a57dd85..1c4a2e3 100644\n> --- a/src/gstreamer/meson.build\n> +++ b/src/gstreamer/meson.build\n> @@ -1,6 +1,7 @@\n>  libcamera_gst_sources = [\n>      'gstlibcamera-utils.cpp',\n>      'gstlibcamera.c',\n> +    'gstlibcamerapad.cpp',\n>      'gstlibcameraprovider.cpp',\n>      'gstlibcamerasrc.cpp',\n>  ]","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 1E36F62689\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 29 Feb 2020 14:36:27 +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 8F4BE2AF;\n\tSat, 29 Feb 2020 14:36:26 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1582983386;\n\tbh=YnXxlrSLTxUOSwvXbdpPr+IwdZThySjDTTnVgefSF30=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=H7CUP153P+lU6Qs2rWO4D+IkAMER0OfPucnYYVfPj0LCSQmC8xlW5Ttmt72hcRdrl\n\tbiAy54KzXTC9Y2YB73ttXn1w5UGjxgKnpu8aJMqXo6v8hCPGsZMczaKc4RekvgvSR7\n\tIsSPXbJev0cmf3vnpWT24f+dZp2DiEAUZFu80igk=","Date":"Sat, 29 Feb 2020 15:36:03 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Nicolas Dufresne <nicolas.dufresne@collabora.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20200229133603.GI18738@pendragon.ideasonboard.com>","References":"<20200227200407.490616-1-nicolas.dufresne@collabora.com>\n\t<20200227200407.490616-6-nicolas.dufresne@collabora.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20200227200407.490616-6-nicolas.dufresne@collabora.com>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v2 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":"Sat, 29 Feb 2020 13:36:27 -0000"}}]