pads: use new g_object_notify_by_pspec() for caps notifies if available

If we're building against GLib >= 2.26.0, we can use the more efficient
g_object_notify_by_caps(), which avoids the param spec lookup.
This commit is contained in:
Tim-Philipp Müller 2010-10-07 17:23:10 +01:00
parent ca607d99b2
commit fd6334cb7c
2 changed files with 30 additions and 9 deletions

View file

@ -88,7 +88,7 @@ static xmlNodePtr gst_proxy_pad_save_thyself (GstObject * object,
static void on_src_target_notify (GstPad * target, static void on_src_target_notify (GstPad * target,
GParamSpec * unused, gpointer user_data); GParamSpec * unused, gpointer user_data);
static GParamSpec *pspec_caps = NULL;
static const GstQueryType * static const GstQueryType *
gst_proxy_pad_do_query_type (GstPad * pad) gst_proxy_pad_do_query_type (GstPad * pad)
@ -702,8 +702,13 @@ on_int_notify (GstPad * internal, GParamSpec * unused, GstGhostPad * pad)
gst_caps_replace (&(GST_PAD_CAPS (pad)), caps); gst_caps_replace (&(GST_PAD_CAPS (pad)), caps);
GST_OBJECT_UNLOCK (pad); GST_OBJECT_UNLOCK (pad);
if (changed) if (changed) {
g_object_notify (G_OBJECT (pad), "caps"); #if GLIB_CHECK_VERSION(2,26,0)
g_object_notify_by_pspec ((GObject *) pad, pspec_caps);
#else
g_object_notify ((GObject *) pad, "caps");
#endif
}
if (caps) if (caps)
gst_caps_unref (caps); gst_caps_unref (caps);
@ -749,8 +754,14 @@ on_src_target_notify (GstPad * target, GParamSpec * unused, gpointer user_data)
if (changed) if (changed)
gst_caps_replace (&(GST_PAD_CAPS (gpad)), caps); gst_caps_replace (&(GST_PAD_CAPS (gpad)), caps);
GST_OBJECT_UNLOCK (gpad); GST_OBJECT_UNLOCK (gpad);
if (changed)
g_object_notify (G_OBJECT (gpad), "caps"); if (changed) {
#if GLIB_CHECK_VERSION(2,26,0)
g_object_notify_by_pspec ((GObject *) gpad, pspec_caps);
#else
g_object_notify ((GObject *) gpad, "caps");
#endif
}
g_object_unref (gpad); g_object_unref (gpad);
@ -790,6 +801,8 @@ gst_ghost_pad_class_init (GstGhostPadClass * klass)
g_type_class_add_private (klass, sizeof (GstGhostPadPrivate)); g_type_class_add_private (klass, sizeof (GstGhostPadPrivate));
pspec_caps = g_object_class_find_property (gobject_class, "caps");
gobject_class->dispose = gst_ghost_pad_dispose; gobject_class->dispose = gst_ghost_pad_dispose;
GST_DEBUG_REGISTER_FUNCPTR (gst_ghost_pad_do_setcaps); GST_DEBUG_REGISTER_FUNCPTR (gst_ghost_pad_do_setcaps);

View file

@ -138,6 +138,8 @@ GList *gst_pad_get_internal_links_default (GstPad * pad);
static GstObjectClass *parent_class = NULL; static GstObjectClass *parent_class = NULL;
static guint gst_pad_signals[LAST_SIGNAL] = { 0 }; static guint gst_pad_signals[LAST_SIGNAL] = { 0 };
static GParamSpec *pspec_caps = NULL;
/* quarks for probe signals */ /* quarks for probe signals */
static GQuark buffer_quark; static GQuark buffer_quark;
static GQuark event_quark; static GQuark event_quark;
@ -313,9 +315,11 @@ gst_pad_class_init (GstPadClass * klass)
NULL, gst_marshal_BOOLEAN__POINTER, G_TYPE_BOOLEAN, 1, NULL, gst_marshal_BOOLEAN__POINTER, G_TYPE_BOOLEAN, 1,
GST_TYPE_MINI_OBJECT); GST_TYPE_MINI_OBJECT);
g_object_class_install_property (gobject_class, PAD_PROP_CAPS, pspec_caps = g_param_spec_boxed ("caps", "Caps",
g_param_spec_boxed ("caps", "Caps", "The capabilities of the pad", "The capabilities of the pad", GST_TYPE_CAPS,
GST_TYPE_CAPS, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PAD_PROP_CAPS, pspec_caps);
g_object_class_install_property (gobject_class, PAD_PROP_DIRECTION, g_object_class_install_property (gobject_class, PAD_PROP_DIRECTION,
g_param_spec_enum ("direction", "Direction", "The direction of the pad", g_param_spec_enum ("direction", "Direction", "The direction of the pad",
GST_TYPE_PAD_DIRECTION, GST_PAD_UNKNOWN, GST_TYPE_PAD_DIRECTION, GST_PAD_UNKNOWN,
@ -2674,7 +2678,11 @@ gst_pad_set_caps (GstPad * pad, GstCaps * caps)
caps); caps);
GST_OBJECT_UNLOCK (pad); GST_OBJECT_UNLOCK (pad);
g_object_notify (G_OBJECT (pad), "caps"); #if GLIB_CHECK_VERSION(2,26,0)
g_object_notify_by_pspec ((GObject *) pad, pspec_caps);
#else
g_object_notify ((GObject *) pad, "caps");
#endif
return TRUE; return TRUE;