From dc0ed9a5ebadbc5b0e9baac215b6b1714cf23b22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 12 Sep 2016 17:41:16 +0200 Subject: [PATCH] basesink: Remove unused fields and always use the buffer timestamp difference for calculating the QoS proportion The buffer timestamps are only hints and more often than not have nothing to do with reality. https://bugzilla.gnome.org/show_bug.cgi?id=771306 --- libs/gst/base/gstbasesink.c | 88 +++++-------------------------------- 1 file changed, 12 insertions(+), 76 deletions(-) diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c index 42c6221bcd..ac2390fcb6 100644 --- a/libs/gst/base/gstbasesink.c +++ b/libs/gst/base/gstbasesink.c @@ -201,19 +201,8 @@ struct _GstBaseSinkPrivate GstClockTime last_left; /* running averages go here these are done on running time */ - GstClockTime avg_pt; - GstClockTime avg_duration; - gdouble avg_rate; - GstClockTime avg_in_diff; - - /* these are done on system time. avg_jitter and avg_render are - * compared to eachother to see if the rendering time takes a - * huge amount of the processing, If so we are flooded with - * buffers. */ - GstClockTime last_left_systime; - GstClockTime avg_jitter; - GstClockTime start, stop; - GstClockTime avg_render; + GstClockTime avg_pt, avg_in_diff; + gdouble avg_rate; /* average with infinite window */ /* number of rendered and dropped frames */ guint64 rendered; @@ -2672,12 +2661,7 @@ gst_base_sink_perform_qos (GstBaseSink * sink, gboolean dropped) * trick mode or key-unit mode. Otherwise the buffer durations will be * meaningless as frames are being dropped in-between without updating the * durations. */ - if (GST_CLOCK_TIME_IS_VALID (stop) - && !(sink->segment.flags & (GST_SEGMENT_FLAG_TRICKMODE | - GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS)) && stop != start) - duration = stop - start; - else - duration = priv->avg_in_diff; + duration = priv->avg_in_diff; /* if we have the time when the last buffer left us, calculate * processing time */ @@ -2698,29 +2682,24 @@ gst_base_sink_perform_qos (GstBaseSink * sink, gboolean dropped) GST_TIME_ARGS (entered), GST_TIME_ARGS (left), GST_TIME_ARGS (pt), GST_TIME_ARGS (duration), jitter); - GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, sink, "avg_duration: %" GST_TIME_FORMAT - ", avg_pt: %" GST_TIME_FORMAT ", avg_rate: %g", - GST_TIME_ARGS (priv->avg_duration), GST_TIME_ARGS (priv->avg_pt), - priv->avg_rate); + GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, sink, + "avg_pt: %" GST_TIME_FORMAT ", avg_rate: %g", + GST_TIME_ARGS (priv->avg_pt), priv->avg_rate); /* collect running averages. for first observations, we copy the * values */ - if (!GST_CLOCK_TIME_IS_VALID (priv->avg_duration)) - priv->avg_duration = duration; - else - priv->avg_duration = UPDATE_RUNNING_AVG (priv->avg_duration, duration); - if (!GST_CLOCK_TIME_IS_VALID (priv->avg_pt)) priv->avg_pt = pt; else priv->avg_pt = UPDATE_RUNNING_AVG (priv->avg_pt, pt); - if (priv->avg_duration != 0) + if (duration != -1 && duration != 0) { rate = gst_guint64_to_gdouble (priv->avg_pt) / - gst_guint64_to_gdouble (priv->avg_duration); - else + gst_guint64_to_gdouble (duration); + } else { rate = 1.0; + } if (GST_CLOCK_TIME_IS_VALID (priv->last_left)) { if (dropped || priv->avg_rate < 0.0) { @@ -2734,9 +2713,8 @@ gst_base_sink_perform_qos (GstBaseSink * sink, gboolean dropped) } GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, sink, - "updated: avg_duration: %" GST_TIME_FORMAT ", avg_pt: %" GST_TIME_FORMAT - ", avg_rate: %g", GST_TIME_ARGS (priv->avg_duration), - GST_TIME_ARGS (priv->avg_pt), priv->avg_rate); + "updated: avg_pt: %" GST_TIME_FORMAT + ", avg_rate: %g", GST_TIME_ARGS (priv->avg_pt), priv->avg_rate); if (priv->avg_rate >= 0.0) { @@ -2782,10 +2760,8 @@ gst_base_sink_reset_qos (GstBaseSink * sink) priv->prev_rstart = GST_CLOCK_TIME_NONE; priv->earliest_in_time = GST_CLOCK_TIME_NONE; priv->last_left = GST_CLOCK_TIME_NONE; - priv->avg_duration = GST_CLOCK_TIME_NONE; priv->avg_pt = GST_CLOCK_TIME_NONE; priv->avg_rate = -1.0; - priv->avg_render = GST_CLOCK_TIME_NONE; priv->avg_in_diff = GST_CLOCK_TIME_NONE; priv->rendered = 0; priv->dropped = 0; @@ -2894,35 +2870,6 @@ no_timestamp: } } -/* called before and after calling the render vmethod. It keeps track of how - * much time was spent in the render method and is used to check if we are - * flooded */ -static void -gst_base_sink_do_render_stats (GstBaseSink * basesink, gboolean start) -{ - GstBaseSinkPrivate *priv; - - priv = basesink->priv; - - if (start) { - priv->start = gst_util_get_timestamp (); - } else { - GstClockTime elapsed; - - priv->stop = gst_util_get_timestamp (); - - elapsed = GST_CLOCK_DIFF (priv->start, priv->stop); - - if (!GST_CLOCK_TIME_IS_VALID (priv->avg_render)) - priv->avg_render = elapsed; - else - priv->avg_render = UPDATE_RUNNING_AVG (priv->avg_render, elapsed); - - GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, basesink, - "avg_render: %" GST_TIME_FORMAT, GST_TIME_ARGS (priv->avg_render)); - } -} - static void gst_base_sink_update_start_time (GstBaseSink * basesink) { @@ -3353,7 +3300,6 @@ gst_base_sink_chain_unlocked (GstBaseSink * basesink, GstPad * pad, GstClockTime start = GST_CLOCK_TIME_NONE, end = GST_CLOCK_TIME_NONE; GstSegment *segment; GstBuffer *sync_buf; - gint do_qos; gboolean late, step_end, prepared = FALSE; if (G_UNLIKELY (basesink->flushing)) @@ -3519,15 +3465,8 @@ again: 8 * GST_SECOND, priv->max_bitrate); } - /* read once, to get same value before and after */ - do_qos = g_atomic_int_get (&priv->qos_enabled); - GST_DEBUG_OBJECT (basesink, "rendering object %p", obj); - /* record rendering time for QoS and stats */ - if (do_qos) - gst_base_sink_do_render_stats (basesink, TRUE); - if (!is_list) { /* For buffer lists do not set last buffer for now. */ gst_base_sink_set_last_buffer (basesink, GST_BUFFER_CAST (obj)); @@ -3546,9 +3485,6 @@ again: gst_base_sink_set_last_buffer_list (basesink, buffer_list); } - if (do_qos) - gst_base_sink_do_render_stats (basesink, FALSE); - if (ret == GST_FLOW_STEP) goto again;