From 997b3c4b7892bec714245f57a26b422164e79706 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Wed, 21 Sep 2005 12:58:35 +0000 Subject: [PATCH] gst/playback/gstplaybasebin.c: Attempt to fix up buffer probe thingies. Original commit message from CVS: 2005-09-21 Andy Wingo * gst/playback/gstplaybasebin.c: Attempt to fix up buffer probe thingies. * gst/playback/gstdecodebin.c (gst_decode_bin_dispose): Dispose can be called multiple times, dogs. --- ChangeLog | 8 ++++++++ gst/playback/gstdecodebin.c | 8 +++++--- gst/playback/gstplaybasebin.c | 45 +++++++++++++++++++++++++++++-------------- 3 files changed, 44 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index be1892d..2ac53cc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-09-21 Andy Wingo + + * gst/playback/gstplaybasebin.c: Attempt to fix up buffer probe + thingies. + + * gst/playback/gstdecodebin.c (gst_decode_bin_dispose): Dispose + can be called multiple times, dogs. + 2005-09-21 Wim Taymans * gst-libs/gst/rtp/gstbasertppayload.c: diff --git a/gst/playback/gstdecodebin.c b/gst/playback/gstdecodebin.c index c78d714..79bc569 100644 --- a/gst/playback/gstdecodebin.c +++ b/gst/playback/gstdecodebin.c @@ -348,7 +348,9 @@ gst_decode_bin_dispose (GObject * object) decode_bin = GST_DECODE_BIN (object); - gst_plugin_feature_list_free (decode_bin->factories); + if (decode_bin->factories) + gst_plugin_feature_list_free (decode_bin->factories); + decode_bin->factories = NULL; G_OBJECT_CLASS (parent_class)->dispose (object); } @@ -567,8 +569,8 @@ try_to_link_1 (GstDecodeBin * decode_bin, GstPad * pad, GList * factories) /* make an element from the factory first */ if ((element = gst_element_factory_create (factory, NULL)) == NULL) { - /* hmm, strange. Like with all things in live, let's move on.. */ - GST_WARNING_OBJECT (decode_bin, "could not create an element from %s", + /* hmm, strange. Like with all things in life, let's move on.. */ + GST_WARNING_OBJECT (decode_bin, "could not create an element from %s", gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory))); continue; } diff --git a/gst/playback/gstplaybasebin.c b/gst/playback/gstplaybasebin.c index d361dcc..eed04cd 100644 --- a/gst/playback/gstplaybasebin.c +++ b/gst/playback/gstplaybasebin.c @@ -483,12 +483,15 @@ queue_overrun (GstElement * element, GstPlayBaseBin * play_base_bin) static void queue_threshold_reached (GstElement * queue, GstPlayBaseBin * play_base_bin) { + gpointer data; + GST_DEBUG ("Running"); /* play */ g_object_set (queue, "min-threshold-time", (guint64) 0, NULL); - if (g_object_get_data (G_OBJECT (queue), "probe")) { + data = g_object_get_data (G_OBJECT (queue), "probe"); + if (data) { GstPad *sinkpad; sinkpad = gst_element_get_pad (queue, "sink"); @@ -499,7 +502,7 @@ queue_threshold_reached (GstElement * queue, GstPlayBaseBin * play_base_bin) fill_buffer (play_base_bin, 100); g_object_set_data (G_OBJECT (queue), "probe", NULL); - gst_pad_remove_buffer_probe (sinkpad, G_CALLBACK (check_queue), queue); + gst_pad_remove_buffer_probe (sinkpad, GPOINTER_TO_INT (data)); gst_object_unref (sinkpad); } @@ -519,10 +522,11 @@ queue_out_of_data (GstElement * queue, GstPlayBaseBin * play_base_bin) /* re-connect probe */ if (!g_object_get_data (G_OBJECT (queue), "probe")) { GstPad *sinkpad; + guint id; sinkpad = gst_element_get_pad (queue, "sink"); - gst_pad_add_buffer_probe (sinkpad, G_CALLBACK (check_queue), queue); - g_object_set_data (G_OBJECT (queue), "probe", (gpointer) 0x1); + id = gst_pad_add_buffer_probe (sinkpad, G_CALLBACK (check_queue), queue); + g_object_set_data (G_OBJECT (queue), "probe", GINT_TO_POINTER (id)); GST_DEBUG_OBJECT (play_base_bin, "Re-attaching buffering probe to pad %s:%s", GST_DEBUG_PAD_NAME (sinkpad), sinkpad); @@ -587,6 +591,7 @@ gen_preroll_element (GstPlayBaseBin * play_base_bin, (type == GST_STREAM_TYPE_AUDIO && group->type[GST_STREAM_TYPE_VIDEO - 1].npads == 0))) { GstPad *sinkpad; + guint id; g_signal_connect (G_OBJECT (preroll), "running", G_CALLBACK (queue_threshold_reached), play_base_bin); @@ -595,12 +600,12 @@ gen_preroll_element (GstPlayBaseBin * play_base_bin, /* give updates on queue size */ sinkpad = gst_element_get_pad (preroll, "sink"); - gst_pad_add_buffer_probe (sinkpad, G_CALLBACK (check_queue), preroll); + id = gst_pad_add_buffer_probe (sinkpad, G_CALLBACK (check_queue), preroll); GST_DEBUG_OBJECT (play_base_bin, "Attaching probe to pad %s:%s (%p)", GST_DEBUG_PAD_NAME (sinkpad), sinkpad); gst_object_unref (sinkpad); g_object_set_data (G_OBJECT (preroll), "pbb", play_base_bin); - g_object_set_data (G_OBJECT (preroll), "probe", (gpointer) 0x1); + g_object_set_data (G_OBJECT (preroll), "probe", GINT_TO_POINTER (id)); g_signal_connect (G_OBJECT (preroll), "underrun", G_CALLBACK (queue_out_of_data), play_base_bin); @@ -874,12 +879,14 @@ static gboolean mute_stream (GstPad * pad, GstBuffer * buf, gpointer data) { GstStreamInfo *info = GST_STREAM_INFO (data); + guint id; GST_DEBUG ("mute stream triggered"); g_object_set (G_OBJECT (info), "mute", TRUE, NULL); - gst_pad_remove_buffer_probe (GST_PAD_CAST (info->object), - G_CALLBACK (mute_stream), data); + id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (info), "mute_probe")); + g_object_set_data (G_OBJECT (info), "mute_probe", NULL); + gst_pad_remove_buffer_probe (GST_PAD_CAST (info->object), id); /* no data */ return FALSE; @@ -968,9 +975,11 @@ new_decoded_pad (GstElement * element, GstPad * pad, gboolean last, /* select 1st for now - we'll select a preferred one after preroll */ if (type == GST_STREAM_TYPE_UNKNOWN || group->type[type - 1].npads > 0) { - gst_pad_add_data_probe (GST_PAD_CAST (pad), + guint id; + + id = gst_pad_add_data_probe (GST_PAD_CAST (pad), G_CALLBACK (silence_stream), info); - g_object_set_data (G_OBJECT (pad), "eat_probe", (gpointer) 0x1); + g_object_set_data (G_OBJECT (pad), "eat_probe", GINT_TO_POINTER (id)); } add_stream (group, info); @@ -1067,17 +1076,22 @@ setup_substreams (GstPlayBaseBin * play_base_bin) group = get_active_group (play_base_bin); for (item = group->streaminfo; item; item = item->next) { GstStreamInfo *info = item->data; + gpointer data; - if (g_object_get_data (G_OBJECT (info->object), "eat_probe")) { + data = g_object_get_data (G_OBJECT (info->object), "eat_probe"); + if (data) { gst_pad_remove_data_probe (GST_PAD_CAST (info->object), - G_CALLBACK (silence_stream), info); + GPOINTER_TO_INT (data)); g_object_set_data (G_OBJECT (info->object), "eat_probe", NULL); } /* now remove unknown pads */ if (info->type == GST_STREAM_TYPE_UNKNOWN) { - gst_pad_add_buffer_probe (GST_PAD_CAST (info->object), + guint id; + + id = gst_pad_add_buffer_probe (GST_PAD_CAST (info->object), G_CALLBACK (mute_stream), info); + g_object_set_data (G_OBJECT (info), "mute_probe", GINT_TO_POINTER (id)); } } @@ -1497,8 +1511,11 @@ set_active_source (GstPlayBaseBin * play_base_bin, g_object_set (s->data, "mute", FALSE, NULL); have_active = TRUE; } else { - gst_pad_add_buffer_probe (GST_PAD_CAST (info->object), + guint id; + + id = gst_pad_add_buffer_probe (GST_PAD_CAST (info->object), G_CALLBACK (mute_stream), info); + g_object_set_data (G_OBJECT (info), "mute_probe", GINT_TO_POINTER (id)); } num++; } -- 2.7.4