From 10776e474d206f25bb56acae25022565f8b13e2d Mon Sep 17 00:00:00 2001 From: Stefan Kost Date: Tue, 24 Aug 2010 11:26:52 +0300 Subject: [PATCH] fpsdisplaysink: don't add a g_mainloop dependency Just update the fps-message from the probe handler. --- gst/debugutils/fpsdisplaysink.c | 32 ++++++++++++++------------------ gst/debugutils/fpsdisplaysink.h | 4 ++-- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/gst/debugutils/fpsdisplaysink.c b/gst/debugutils/fpsdisplaysink.c index bde8ac98ea..ba5649b86b 100644 --- a/gst/debugutils/fpsdisplaysink.c +++ b/gst/debugutils/fpsdisplaysink.c @@ -222,11 +222,13 @@ on_video_sink_data_flow (GstPad * pad, GstMiniObject * mini_obj, self->frames_dropped++; } - if (G_UNLIKELY (!self->timeout_id)) { - self->last_ts = self->start_ts = gst_util_get_timestamp (); - self->timeout_id = - g_timeout_add (self->fps_update_interval, display_current_fps, - (gpointer) self); + ts = gst_util_get_timestamp (); + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (self->start_ts))) { + self->last_ts = self->start_ts = ts; + } + if (GST_CLOCK_DIFF (self->interval_ts, ts) > self->fps_update_interval) { + display_current_fps (self); + self->interval_ts = ts; } } } @@ -311,7 +313,7 @@ fps_display_sink_init (GstFPSDisplaySink * self, self->sync = FALSE; self->signal_measurements = DEFAULT_SIGNAL_FPS_MEASUREMENTS; self->use_text_overlay = TRUE; - self->fps_update_interval = DEFAULT_FPS_UPDATE_INTERVAL_MS; + self->fps_update_interval = GST_MSECOND * DEFAULT_FPS_UPDATE_INTERVAL_MS; self->video_sink = NULL; self->max_fps = -1; self->min_fps = -1; @@ -403,6 +405,9 @@ fps_display_sink_start (GstFPSDisplaySink * self) self->max_fps = -1; self->min_fps = -1; + /* init time stamps */ + self->last_ts = self->start_ts = self->interval_ts = GST_CLOCK_TIME_NONE; + GST_DEBUG_OBJECT (self, "Use text-overlay? %d", self->use_text_overlay); if (self->use_text_overlay) { @@ -436,21 +441,11 @@ no_text_overlay: } gst_ghost_pad_set_target (GST_GHOST_PAD (self->ghost_pad), target_pad); gst_object_unref (target_pad); - - /* Set a timeout for the fps display */ - GST_DEBUG_OBJECT (self, "setting a timeout with a %dms interval", - self->fps_update_interval); } static void fps_display_sink_stop (GstFPSDisplaySink * self) { - /* remove the timeout */ - if (self->timeout_id) { - g_source_remove (self->timeout_id); - self->timeout_id = 0; - } - if (self->text_overlay) { gst_element_unlink (self->text_overlay, self->video_sink); gst_bin_remove (GST_BIN (self), self->text_overlay); @@ -516,7 +511,8 @@ fps_display_sink_set_property (GObject * object, guint prop_id, update_video_sink (self, (GstElement *) g_value_get_object (value)); break; case ARG_FPS_UPDATE_INTERVAL: - self->fps_update_interval = g_value_get_int (value); + self->fps_update_interval = + GST_MSECOND * (GstClockTime) g_value_get_int (value); break; case ARG_SIGNAL_FPS_MEASUREMENTS: self->signal_measurements = g_value_get_boolean (value); @@ -544,7 +540,7 @@ fps_display_sink_get_property (GObject * object, guint prop_id, g_value_set_object (value, self->video_sink); break; case ARG_FPS_UPDATE_INTERVAL: - g_value_set_int (value, self->fps_update_interval); + g_value_set_int (value, (gint) (self->fps_update_interval / GST_MSECOND)); break; case ARG_MAX_FPS: g_value_set_double (value, self->max_fps); diff --git a/gst/debugutils/fpsdisplaysink.h b/gst/debugutils/fpsdisplaysink.h index 27331ecd6f..6a016633c6 100644 --- a/gst/debugutils/fpsdisplaysink.h +++ b/gst/debugutils/fpsdisplaysink.h @@ -56,14 +56,14 @@ struct _GstFPSDisplaySink GstClockTime start_ts; GstClockTime last_ts; - guint timeout_id; + GstClockTime interval_ts; guint data_probe_id; /* properties */ gboolean sync; gboolean use_text_overlay; gboolean signal_measurements; - gint fps_update_interval; + GstClockTime fps_update_interval; gdouble max_fps; gdouble min_fps; };