pad, ghostpad: use the template gtype if specified
authorMathieu Duponchelle <mathieu@centricular.com>
Wed, 28 Feb 2018 18:51:44 +0000 (19:51 +0100)
committerMathieu Duponchelle <mathieu@centricular.com>
Wed, 28 Feb 2018 23:39:08 +0000 (00:39 +0100)
Also make sure the GType passed to the with_gtype versions
of the template constructors is_a GstPad

https://bugzilla.gnome.org/show_bug.cgi?id=793933

gst/gstghostpad.c
gst/gstpad.c
gst/gstpadtemplate.c

index 1598084..dd53122 100644 (file)
@@ -627,12 +627,15 @@ gst_ghost_pad_new_full (const gchar * name, GstPadDirection dir,
     GstPadTemplate * templ)
 {
   GstGhostPad *ret;
-
   g_return_val_if_fail (dir != GST_PAD_UNKNOWN, NULL);
 
   /* OBJECT CREATION */
   if (templ) {
-    ret = g_object_new (GST_TYPE_GHOST_PAD, "name", name,
+    GType pad_type =
+        GST_PAD_TEMPLATE_GTYPE (templ) ==
+        G_TYPE_NONE ? GST_TYPE_GHOST_PAD : GST_PAD_TEMPLATE_GTYPE (templ);
+
+    ret = g_object_new (pad_type, "name", name,
         "direction", dir, "template", templ, NULL);
   } else {
     ret = g_object_new (GST_TYPE_GHOST_PAD, "name", name,
index ffecee9..229f3dd 100644 (file)
@@ -864,8 +864,11 @@ GstPad *
 gst_pad_new_from_template (GstPadTemplate * templ, const gchar * name)
 {
   g_return_val_if_fail (GST_IS_PAD_TEMPLATE (templ), NULL);
+  GType pad_type =
+      GST_PAD_TEMPLATE_GTYPE (templ) ==
+      G_TYPE_NONE ? GST_TYPE_PAD : GST_PAD_TEMPLATE_GTYPE (templ);
 
-  return g_object_new (GST_TYPE_PAD,
+  return g_object_new (pad_type,
       "name", name, "direction", templ->direction, "template", templ, NULL);
 }
 
index 1df8e07..02a9132 100644 (file)
@@ -342,6 +342,8 @@ gst_pad_template_new_from_static_pad_template_with_gtype (GstStaticPadTemplate *
   GstPadTemplate *new;
   GstCaps *caps;
 
+  g_return_val_if_fail (g_type_is_a (pad_type, GST_TYPE_PAD), NULL);
+
   if (!name_is_valid (pad_template->name_template, pad_template->presence))
     return NULL;
 
@@ -423,6 +425,7 @@ gst_pad_template_new_with_gtype (const gchar * name_template,
       || direction == GST_PAD_SINK, NULL);
   g_return_val_if_fail (presence == GST_PAD_ALWAYS
       || presence == GST_PAD_SOMETIMES || presence == GST_PAD_REQUEST, NULL);
+  g_return_val_if_fail (g_type_is_a (pad_type, GST_TYPE_PAD), NULL);
 
   if (!name_is_valid (name_template, presence)) {
     return NULL;