static void gst_play_class_init (GstPlayClass *klass);
static void gst_play_dispose (GObject *object);
-static void gst_play_default_timeout_add (guint interval, GSourceFunc function, gpointer data);
-static void gst_play_default_idle_add (GSourceFunc function, gpointer data);
+static guint gst_play_default_timeout_add (guint interval, GSourceFunc function, gpointer data);
+static guint gst_play_default_idle_add (GSourceFunc function, gpointer data);
static void gst_play_set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec);
play->video_bin_mutex = g_mutex_new();
gst_play_set_idle_timeout_funcs(play, gst_play_default_timeout_add, gst_play_default_idle_add);
+ /*fixored by dolphy */
+
+ play->tick_timeout_id = play->idle_timeout_id = play->idle_signal_id = 0;
}
GstPlay *
gst_play_dispose (GObject *object)
{
GstPlay *play = GST_PLAY (object);
+ /* fixored by dolphy : Before disposing removing any callback that could
+ be called : time ticks, signal poller, etc...*/
+ if (play->tick_timeout_id)
+ if (!g_source_remove(play->tick_timeout_id))
+ g_warning("failed to remove timetick timer %d", play->tick_timeout_id);
+ if (play->idle_timeout_id)
+ if (!g_source_remove(play->idle_timeout_id))
+ g_warning("failed to remove idle timer %d", play->idle_timeout_id);
+ if (play->idle_signal_id)
+ if (!g_source_remove(play->idle_signal_id))
+ g_warning("failed to remove signal idle timer %d", play->idle_signal_id);
+
G_OBJECT_CLASS (parent_class)->dispose (object);
g_mutex_free(play->audio_bin_mutex);
g_mutex_free(play->video_bin_mutex);
signal->signal_data.info.element = orig;
signal->signal_data.info.param = param;
g_async_queue_push(play->signal_queue, signal);
- play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play);
+ /* fixored by dolphy : If an idle callback has been added for signal polling
+ no need to put a new one */
+ if (!play->idle_signal_id)
+ play->idle_signal_id = play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play);
}
static void
if (GST_IS_PIPELINE (play->pipeline)){
switch (state) {
case GST_STATE_PLAYING:
- play->idle_add_func ((GSourceFunc) gst_play_idle_callback, play);
- play->timeout_add_func (200, (GSourceFunc) gst_play_tick_callback, play);
+ play->idle_timeout_id = play->idle_add_func ((GSourceFunc) gst_play_idle_callback, play);
+ play->tick_timeout_id = play->timeout_add_func (200, (GSourceFunc) gst_play_tick_callback, play);
if (play->length_nanos == 0LL){
/* try to get the length up to 16 times */
play->get_length_attempt = 16;
- play->timeout_add_func (200, (GSourceFunc) gst_play_get_length_callback, play);
+ play->timeout_add_func (200, (GSourceFunc) gst_play_get_length_callback, play);
}
break;
default:
signal->signal_data.state.old_state = old;
signal->signal_data.state.new_state = state;
g_async_queue_push(play->signal_queue, signal);
- play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play);
+ /* fixored by dolphy : If an idle callback has been added for signal polling
+ no need to put a new one */
+ if (!play->idle_signal_id)
+ play->idle_signal_id = play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play);
}
static gboolean
{
GstPlaySignal *signal;
gint queue_length;
-
+
+ /* fixored by dolphy : Added safety check on play before poping */
+
+ g_return_val_if_fail(GST_IS_PLAY(play), FALSE);
+
signal = g_async_queue_try_pop(play->signal_queue);
if (signal == NULL){
return FALSE;
g_free(signal);
queue_length = g_async_queue_length (play->signal_queue);
+
+ /* fixored by dolphy : If queue length is zero the idle callback will be
+ destroyed */
+
+ if (!queue_length)
+ play->idle_signal_id = 0;
+
return (queue_length > 0);
}
signal->signal_id = HAVE_XID;
signal->signal_data.video_xid.xid = xid;
g_async_queue_push(play->signal_queue, signal);
- play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play);
+ /* fixored by dolphy : If an idle callback has been added for signal polling
+ no need to put a new one */
+ if (!play->idle_signal_id)
+ play->idle_signal_id = play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play);
/*g_print("have xid %d\n", xid);*/
}
signal->signal_data.video_size.width = width;
signal->signal_data.video_size.height = height;
g_async_queue_push(play->signal_queue, signal);
- play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play);
+ /* fixored by dolphy : If an idle callback has been added for signal polling
+ no need to put a new one */
+ if (!play->idle_signal_id)
+ play->idle_signal_id = play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play);
/*g_print("have size %d x %d\n", width, height);*/
}
gst_play_tick_callback (GstPlay *play)
{
gint secs;
+
+ /* fixored by dolphy : Added safety check on play before accessing */
+
+ g_return_val_if_fail(GST_IS_PLAY(play), FALSE);
+
play->clock = gst_bin_get_clock (GST_BIN (play->pipeline));
play->time_nanos = gst_clock_get_time(play->clock);
secs = (gint) (play->time_nanos / GST_SECOND);
static gboolean
gst_play_idle_callback (GstPlay *play)
{
+ /* fixored by dolphy : Added safety check on play before iterating */
+
+ g_return_val_if_fail(GST_IS_PLAY(play), FALSE);
+
return gst_bin_iterate (GST_BIN (play->pipeline));
}
return FALSE;
}
-static void
+static guint
gst_play_default_timeout_add (guint interval, GSourceFunc function, gpointer data)
{
GstPlayIdleData *idle_data = g_new0(GstPlayIdleData, 1);
idle_data->func = function;
idle_data->data = data;
- g_timeout_add (interval, (GSourceFunc)gst_play_default_idle, idle_data);
+
+ /* fixored by dolphy : here we return the source tag to caller */
+
+ return g_timeout_add (interval, (GSourceFunc)gst_play_default_idle, idle_data);
}
-static void
+static guint
gst_play_default_idle_add (GSourceFunc function, gpointer data)
{
GstPlayIdleData *idle_data = g_new0(GstPlayIdleData, 1);
idle_data->func = function;
idle_data->data = data;
- g_idle_add ((GSourceFunc)gst_play_default_idle, idle_data);
+
+ /* fixored by dolphy : here we return the source tag to caller */
+
+ return g_idle_add ((GSourceFunc)gst_play_default_idle, idle_data);
}
void