rtpjitterbuffer: implement rtx statistics
authorTorrie Fischer <torrie.fischer@collabora.co.uk>
Tue, 12 Nov 2013 16:19:25 +0000 (11:19 -0500)
committerWim Taymans <wim.taymans@gmail.com>
Thu, 14 Nov 2013 08:24:26 +0000 (09:24 +0100)
gst/rtpmanager/gstrtpjitterbuffer.c
tests/check/elements/rtpjitterbuffer.c

index c6fe94e..0eb75d9 100644 (file)
@@ -149,6 +149,7 @@ enum
   PROP_RTX_DELAY_REORDER,
   PROP_RTX_RETRY_TIMEOUT,
   PROP_RTX_RETRY_PERIOD,
+  PROP_RTX_STATS,
   PROP_LAST
 };
 
@@ -399,6 +400,9 @@ static void remove_all_timers (GstRtpJitterBuffer * jitterbuffer);
 
 static void wait_next_timeout (GstRtpJitterBuffer * jitterbuffer);
 
+static GstStructure *gst_rtp_jitter_buffer_create_stats (GstRtpJitterBuffer *
+    jitterbuffer);
+
 static void
 gst_rtp_jitter_buffer_class_init (GstRtpJitterBufferClass * klass)
 {
@@ -554,6 +558,23 @@ gst_rtp_jitter_buffer_class_init (GstRtpJitterBufferClass * klass)
           "Try to get a retransmission for this many ms "
           "(-1 automatic)", -1, G_MAXINT, DEFAULT_RTX_RETRY_PERIOD,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * GstRtpJitterBuffer::rtx-stats:
+   *
+   * Various retransmission statistics. This property returns a GstStructure
+   * with name application/x-rtp-jitterbuffer-stats with the following fields:
+   *
+   *  "count"          G_TYPE_UINT64   The number of retransmissions requested
+   *  "success-count"  G_TYPE_UINT64   The number of successful retransmissions
+   *  "rtx-per-packet" G_TYPE_DOUBLE   Average number of RTX per packet
+   *  "rtx-rtt"        G_TYPE_UINT64   Average round trip time per RTX
+   *
+   * Since: 1.2.1
+   */
+  g_object_class_install_property (gobject_class, PROP_RTX_STATS,
+      g_param_spec_boxed ("rtx-stats", "RTX statistics",
+          "Various retransmission statistics", GST_TYPE_STRUCTURE,
+          G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
   /**
    * GstRtpJitterBuffer::request-pt-map:
@@ -3207,8 +3228,28 @@ gst_rtp_jitter_buffer_get_property (GObject * object,
       g_value_set_int (value, priv->rtx_retry_period);
       JBUF_UNLOCK (priv);
       break;
+    case PROP_RTX_STATS:
+      g_value_take_boxed (value,
+          gst_rtp_jitter_buffer_create_stats (jitterbuffer));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
   }
 }
+
+static GstStructure *
+gst_rtp_jitter_buffer_create_stats (GstRtpJitterBuffer * jbuf)
+{
+  GstStructure *s;
+
+  JBUF_LOCK (jbuf->priv);
+  s = gst_structure_new ("application/x-rtp-jitterbuffer-stats",
+      "count", G_TYPE_UINT64, jbuf->priv->num_rtx_requests,
+      "success-count", G_TYPE_UINT64, jbuf->priv->num_rtx_success,
+      "rtx-per-packet", G_TYPE_DOUBLE, jbuf->priv->avg_rtx_num,
+      "rtx-rtt", G_TYPE_UINT64, jbuf->priv->avg_rtx_rtt, NULL);
+  JBUF_UNLOCK (jbuf->priv);
+
+  return s;
+}
index f7d9e41..5877f78 100644 (file)
@@ -999,6 +999,8 @@ GST_START_TEST (test_rtx_two_missing)
   GstEvent *out_event;
   gint jb_latency_ms = 200;
   gint i;
+  GstStructure *rtx_stats;
+  const GValue *rtx_stat;
   GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
 
   setup_testharness (&data);
@@ -1111,6 +1113,17 @@ GST_START_TEST (test_rtx_two_missing)
   /* should still have only seen 1 packet lost events */
   g_assert_cmpint (data.lost_event_count, ==, 1);
 
+  g_object_get (data.jitter_buffer, "stats", &rtx_stats, NULL);
+
+  rtx_stat = gst_structure_get_value (rtx_stats, "count");
+  g_assert_cmpuint (g_value_get_uint64 (rtx_stat), ==, 5);
+
+  rtx_stat = gst_structure_get_value (rtx_stats, "success-count");
+  g_assert_cmpuint (g_value_get_uint64 (rtx_stat), ==, 1);
+
+  rtx_stat = gst_structure_get_value (rtx_stats, "rtx-rtt");
+  g_assert_cmpuint (g_value_get_uint64 (rtx_stat), ==, 0);
+
   destroy_testharness (&data);
 }