[PATCH v1 1/2] gst: Add child proxy support to libcamerasrc

Kieran Bingham kieran.bingham at ideasonboard.com
Thu May 23 01:09:47 CEST 2024


Quoting Nicolas Dufresne (2024-05-22 21:39:23)
> From: Nicolas Dufresne <nicolas.dufresne at collabora.com>
> 
> The child proxy interface is needed in order to allow setting
> properties on pad using parse launch syntax.
> 

I don't know anything about child proxies - so my review here is quite
superficial - but from my perspective this is your code so you know best
;-)


> Signed-off-by: Nicolas Dufresne <nicolas.dufresne at collabora.com>
> ---
>  src/gstreamer/gstlibcamerasrc.cpp | 45 +++++++++++++++++++++++++++++--
>  1 file changed, 43 insertions(+), 2 deletions(-)
> 
> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
> index 6a95b6af..74b372f3 100644
> --- a/src/gstreamer/gstlibcamerasrc.cpp
> +++ b/src/gstreamer/gstlibcamerasrc.cpp
> @@ -157,7 +157,12 @@ enum {
>         PROP_AUTO_FOCUS_MODE,
>  };
>  
> +static void gst_libcamera_src_child_proxy_init(gpointer g_iface,
> +                                              gpointer iface_data);
> +
>  G_DEFINE_TYPE_WITH_CODE(GstLibcameraSrc, gst_libcamera_src, GST_TYPE_ELEMENT,
> +                       G_IMPLEMENT_INTERFACE(GST_TYPE_CHILD_PROXY,
> +                                             gst_libcamera_src_child_proxy_init)
>                         GST_DEBUG_CATEGORY_INIT(source_debug, "libcamerasrc", 0,
>                                                 "libcamera Source"))
>  
> @@ -864,8 +869,10 @@ gst_libcamera_src_init(GstLibcameraSrc *self)
>  
>         g_mutex_init(&state->lock_);
>  
> -       state->srcpads_.push_back(gst_pad_new_from_template(templ, "src"));
> -       gst_element_add_pad(GST_ELEMENT(self), state->srcpads_.back());
> +       GstPad *pad = gst_pad_new_from_template(templ, "src");
> +       state->srcpads_.push_back(pad);
> +       gst_element_add_pad(GST_ELEMENT(self), pad);
> +       gst_child_proxy_child_added(GST_CHILD_PROXY(self), G_OBJECT(pad), GST_OBJECT_NAME(pad));
>  
>         GST_OBJECT_FLAG_SET(self, GST_ELEMENT_FLAG_SOURCE);
>  
> @@ -896,6 +903,8 @@ gst_libcamera_src_request_new_pad(GstElement *element, GstPadTemplate *templ,
>                 return NULL;
>         }
>  
> +       gst_child_proxy_child_added(GST_CHILD_PROXY(self), G_OBJECT(pad), GST_OBJECT_NAME(pad));
> +
>         return reinterpret_cast<GstPad *>(g_steal_pointer(&pad));
>  }
>  
> @@ -904,6 +913,8 @@ gst_libcamera_src_release_pad(GstElement *element, GstPad *pad)
>  {
>         GstLibcameraSrc *self = GST_LIBCAMERA_SRC(element);
>  
> +       gst_child_proxy_child_removed(GST_CHILD_PROXY(self), G_OBJECT(pad), GST_OBJECT_NAME(pad));
> +
>         GST_DEBUG_OBJECT(self, "Pad %" GST_PTR_FORMAT " being released", pad);
>  
>         {
> @@ -964,3 +975,33 @@ gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)
>                                  G_PARAM_WRITABLE);
>         g_object_class_install_property(object_class, PROP_AUTO_FOCUS_MODE, spec);
>  }
> +
> +/* GstChildProxy implementation */
> +static GObject *
> +gst_libcamera_src_child_proxy_get_child_by_index(GstChildProxy * child_proxy,
> +                                                guint index)
> +{
> +       GLibLocker lock(GST_OBJECT(child_proxy));
> +       GObject *obj = nullptr;
> +
> +       obj = reinterpret_cast<GObject*>(g_list_nth_data(GST_ELEMENT(child_proxy)->srcpads, index));
> +       if (obj)
> +               gst_object_ref(obj);
> +
> +       return obj;
> +}
> +
> +static guint
> +gst_libcamera_src_child_proxy_get_children_count(GstChildProxy * child_proxy)
> +{
> +       GLibLocker lock(GST_OBJECT(child_proxy));
> +       return GST_ELEMENT_CAST(child_proxy)->numsrcpads;
> +}
> +
> +static void
> +gst_libcamera_src_child_proxy_init(gpointer g_iface, [[maybe_unused]] gpointer iface_data)
> +{
> +  GstChildProxyInterface *iface = reinterpret_cast<GstChildProxyInterface *>(g_iface);
> +  iface->get_child_by_index = gst_libcamera_src_child_proxy_get_child_by_index;
> +  iface->get_children_count = gst_libcamera_src_child_proxy_get_children_count;

absolute minor nit: The indentation here is less than the other
functions.

If that's all I can come up with :

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> +}
> -- 
> 2.45.0
>


More information about the libcamera-devel mailing list