baseparse: post tag list when avg bitrate changes at least 2%
authorAthanasios Oikonomou <athoik@gmail.com>
Mon, 7 Dec 2015 16:20:35 +0000 (18:20 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 8 Dec 2015 09:34:13 +0000 (11:34 +0200)
Watching videos with variant bitrate is common to have delta
more than 10 kbps, resulting in tag list spam.

Instead of relying on fixed 10 kpbs delta, it is better to
calculale the difference in percentage and update tag list
only when bitrate changes more than 2%.

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

libs/gst/base/gstbaseparse.c

index c9a57c5..ac357d9 100644 (file)
 #define MIN_FRAMES_TO_POST_BITRATE 10
 #define TARGET_DIFFERENCE          (20 * GST_SECOND)
 #define MAX_INDEX_ENTRIES          4096
+#define UPDATE_THRESHOLD           2
+
+#define ABSDIFF(a,b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
 
 GST_DEBUG_CATEGORY_STATIC (gst_base_parse_debug);
 #define GST_CAT_DEFAULT gst_base_parse_debug
@@ -1691,11 +1694,8 @@ gst_base_parse_update_duration (GstBaseParse * parse)
 static void
 gst_base_parse_update_bitrates (GstBaseParse * parse, GstBaseParseFrame * frame)
 {
-  /* Only update the tag on a 10 kbps delta */
-  static const gint update_threshold = 10000;
-
   guint64 data_len, frame_dur;
-  gint overhead, frame_bitrate, old_avg_bitrate;
+  gint overhead, frame_bitrate;
   GstBuffer *buffer = frame->buffer;
 
   overhead = frame->overhead;
@@ -1755,11 +1755,14 @@ gst_base_parse_update_bitrates (GstBaseParse * parse, GstBaseParseFrame * frame)
         parse->priv->tags_changed = TRUE;
     }
 
-    old_avg_bitrate = parse->priv->posted_avg_bitrate;
-    if (((gint) (old_avg_bitrate - parse->priv->avg_bitrate) > update_threshold
-            || (gint) (parse->priv->avg_bitrate - old_avg_bitrate) >
-            update_threshold) && parse->priv->post_avg_bitrate)
-      parse->priv->tags_changed = TRUE;
+    /* Only update the tag on a 2% change */
+    if (parse->priv->post_avg_bitrate && parse->priv->avg_bitrate) {
+      guint64 diffprev = gst_util_uint64_scale_int (100,
+          ABSDIFF (parse->priv->avg_bitrate, parse->priv->posted_avg_bitrate),
+          parse->priv->avg_bitrate);
+      if (diffprev >= UPDATE_THRESHOLD)
+        parse->priv->tags_changed = TRUE;
+    }
   }
 }