Improve and fix LATENCY query handling
authorSebastian Dröge <sebastian@centricular.com>
Wed, 11 Feb 2015 12:43:11 +0000 (13:43 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Wed, 11 Feb 2015 15:53:49 +0000 (17:53 +0200)
This now follows the design docs everywhere, especially the maximum latency
handling.

https://bugzilla.gnome.org/show_bug.cgi?id=744106

gst-libs/gst/app/gstappsrc.c
gst-libs/gst/audio/gstaudiobasesink.c
gst-libs/gst/audio/gstaudiodecoder.c
gst-libs/gst/audio/gstaudioencoder.c
gst-libs/gst/video/gstvideodecoder.c
gst-libs/gst/video/gstvideoencoder.c
gst/adder/gstadder.c
gst/playback/gsturidecodebin.c

index 9d27a67c89a64d88274cd4d3da056e08e95995c2..f3a56b3560c5bdeabefdc548310cb742bb06dfea 100644 (file)
@@ -887,10 +887,10 @@ gst_app_src_query (GstBaseSrc * src, GstQuery * query)
 
       /* overwrite with our values when we need to */
       g_mutex_lock (&priv->mutex);
-      if (priv->min_latency != -1)
+      if (priv->min_latency != -1) {
         min = priv->min_latency;
-      if (priv->max_latency != -1)
         max = priv->max_latency;
+      }
       g_mutex_unlock (&priv->mutex);
 
       gst_query_set_latency (query, live, min, max);
index 3ad7e31ebf2d6cc861436c4224bed7d924885fa4..ece99d44b050be3718d7478a7f444843b3b66dd8 100644 (file)
@@ -464,7 +464,6 @@ gst_audio_base_sink_query (GstElement * element, GstQuery * query)
            * amount of time. */
           max_latency = (max_l == -1) ? -1 : (base_latency + max_l);
 
-
           GST_DEBUG_OBJECT (basesink,
               "peer min %" GST_TIME_FORMAT ", our min latency: %"
               GST_TIME_FORMAT, GST_TIME_ARGS (min_l),
index 991371ed703637a183fde9881401d535533d6b51..37395d522aaf6c5b429ebfe10621f4514a490acd 100644 (file)
@@ -521,7 +521,7 @@ gst_audio_decoder_init (GstAudioDecoder * dec, GstAudioDecoderClass * klass)
 
   /* init state */
   dec->priv->ctx.min_latency = 0;
-  dec->priv->ctx.max_latency = GST_CLOCK_TIME_NONE;
+  dec->priv->ctx.max_latency = 0;
   gst_audio_decoder_reset (dec, TRUE);
   GST_DEBUG_OBJECT (dec, "init ok");
 }
@@ -2692,9 +2692,10 @@ gst_audio_decoder_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
 
         GST_OBJECT_LOCK (dec);
         /* add our latency */
-        if (min_latency != -1)
-          min_latency += dec->priv->ctx.min_latency;
-        if (max_latency != -1 && dec->priv->ctx.max_latency != -1)
+        min_latency += dec->priv->ctx.min_latency;
+        if (max_latency == -1 || dec->priv->ctx.max_latency == -1)
+          max_latency = -1;
+        else
           max_latency += dec->priv->ctx.max_latency;
         GST_OBJECT_UNLOCK (dec);
 
index 3f2027264f6bd8abde3ba4da262ff38d818a1aa1..3747a0b42ca7c72469e4086311471a11b6366653 100644 (file)
@@ -447,7 +447,7 @@ gst_audio_encoder_init (GstAudioEncoder * enc, GstAudioEncoderClass * bclass)
 
   /* init state */
   enc->priv->ctx.min_latency = 0;
-  enc->priv->ctx.max_latency = GST_CLOCK_TIME_NONE;
+  enc->priv->ctx.max_latency = 0;
   gst_audio_encoder_reset (enc, TRUE);
   GST_DEBUG_OBJECT (enc, "init ok");
 }
@@ -1837,9 +1837,10 @@ gst_audio_encoder_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
 
         GST_OBJECT_LOCK (enc);
         /* add our latency */
-        if (min_latency != -1)
-          min_latency += enc->priv->ctx.min_latency;
-        if (max_latency != -1 && enc->priv->ctx.max_latency != -1)
+        min_latency += enc->priv->ctx.min_latency;
+        if (max_latency == -1 || enc->priv->ctx.max_latency == -1)
+          max_latency = -1;
+        else
           max_latency += enc->priv->ctx.max_latency;
         GST_OBJECT_UNLOCK (enc);
 
index 1bb3c40154403f8c955fe46d3e4a5899a89b08dc..5d822099cba54c5b839766340b22c3108778f013 100644 (file)
@@ -569,7 +569,7 @@ gst_video_decoder_init (GstVideoDecoder * decoder, GstVideoDecoderClass * klass)
   decoder->priv->needs_format = FALSE;
 
   decoder->priv->min_latency = 0;
-  decoder->priv->max_latency = GST_CLOCK_TIME_NONE;
+  decoder->priv->max_latency = 0;
 
   gst_video_decoder_reset (decoder, TRUE, TRUE);
 }
@@ -1541,12 +1541,11 @@ gst_video_decoder_src_query_default (GstVideoDecoder * dec, GstQuery * query)
 
         GST_OBJECT_LOCK (dec);
         min_latency += dec->priv->min_latency;
-        if (max_latency != GST_CLOCK_TIME_NONE
-            && dec->priv->max_latency != GST_CLOCK_TIME_NONE) {
+        if (max_latency == GST_CLOCK_TIME_NONE
+            || dec->priv->max_latency == GST_CLOCK_TIME_NONE)
+          max_latency = GST_CLOCK_TIME_NONE;
+        else
           max_latency += dec->priv->max_latency;
-        } else if (dec->priv->max_latency != GST_CLOCK_TIME_NONE) {
-          max_latency = dec->priv->max_latency;
-        }
         GST_OBJECT_UNLOCK (dec);
 
         gst_query_set_latency (query, live, min_latency, max_latency);
index 8d64d4e34015867ae6be348b5b94c053faa2896d..063a3d9c25d0e911f4e3f38db8084bbe41942a24 100644 (file)
@@ -454,7 +454,7 @@ gst_video_encoder_init (GstVideoEncoder * encoder, GstVideoEncoderClass * klass)
   priv->new_headers = FALSE;
 
   priv->min_latency = 0;
-  priv->max_latency = GST_CLOCK_TIME_NONE;
+  priv->max_latency = 0;
 
   gst_video_encoder_reset (encoder, TRUE);
 }
@@ -1199,12 +1199,11 @@ gst_video_encoder_src_query_default (GstVideoEncoder * enc, GstQuery * query)
 
         GST_OBJECT_LOCK (enc);
         min_latency += priv->min_latency;
-        if (max_latency != GST_CLOCK_TIME_NONE
-            && enc->priv->max_latency != GST_CLOCK_TIME_NONE) {
+        if (max_latency == GST_CLOCK_TIME_NONE
+            || enc->priv->max_latency == GST_CLOCK_TIME_NONE)
+          max_latency = GST_CLOCK_TIME_NONE;
+        else
           max_latency += enc->priv->max_latency;
-        } else if (enc->priv->max_latency != GST_CLOCK_TIME_NONE) {
-          max_latency = enc->priv->max_latency;
-        }
         GST_OBJECT_UNLOCK (enc);
 
         gst_query_set_latency (query, live, min_latency, max_latency);
index 96d182a36f992486d1d60ed73c96e45694d4e3ab..92f2b985d1fe231aeb4b9b13f9190bb2a60d24fd 100644 (file)
@@ -527,15 +527,17 @@ gst_adder_query_latency (GstAdder * adder, GstQuery * query)
         if (res) {
           gst_query_parse_latency (peerquery, &live_cur, &min_cur, &max_cur);
 
-          if (min_cur > min)
-            min = min_cur;
+          if (live_cur) {
+            if (min_cur > min)
+              min = min_cur;
 
-          if (max_cur != GST_CLOCK_TIME_NONE &&
-              ((max != GST_CLOCK_TIME_NONE && max_cur > max) ||
-                  (max == GST_CLOCK_TIME_NONE)))
-            max = max_cur;
+            if (max == GST_CLOCK_TIME_NONE)
+              max = max_cur;
+            else if (max_cur < max)
+              max = max_cur;
 
-          live = live || live_cur;
+            live = TRUE;
+          }
         }
 
         gst_query_unref (peerquery);
index 49ce818b598dfeaa573a0eaf42d91cba6d0a50bb..3f4c0584088a59b12b0ad3e9e86adc9009e30eb8 100644 (file)
@@ -2564,16 +2564,18 @@ decoder_query_latency_fold (const GValue * item, GValue * ret, QueryFold * fold)
         "got latency min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT
         ", live %d", GST_TIME_ARGS (min), GST_TIME_ARGS (max), live);
 
-    /* for the combined latency we collect the MAX of all min latencies and
-     * the MIN of all max latencies */
-    if (min > fold->min)
-      fold->min = min;
-    if (fold->max == -1)
-      fold->max = max;
-    else if (max < fold->max)
-      fold->max = max;
-    if (!fold->live)
-      fold->live = live;
+    if (live) {
+      /* for the combined latency we collect the MAX of all min latencies and
+       * the MIN of all max latencies */
+      if (min > fold->min)
+        fold->min = min;
+      if (fold->max == -1)
+        fold->max = max;
+      else if (max < fold->max)
+        fold->max = max;
+
+      fold->live = TRUE;
+    }
   }
 
   return TRUE;