[gst-cvs] gst-plugins-good: rtpsession: Add the option to auto-discover the RTP bandwidth

Wim Taymans wtay at kemper.freedesktop.org
Mon Sep 13 06:51:54 PDT 2010


Module: gst-plugins-good
Branch: master
Commit: 6f53a2b240aed4f2230b7b17fb66025cfadcb32a
URL:    http://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=6f53a2b240aed4f2230b7b17fb66025cfadcb32a

Author: Olivier Crête <olivier.crete at collabora.co.uk>
Date:   Tue Jun  1 21:17:26 2010 -0400

rtpsession: Add the option to auto-discover the RTP bandwidth

---

 gst/rtpmanager/gstrtpsession.c |    2 +-
 gst/rtpmanager/rtpsession.c    |   28 ++++++++++++++++++++++++++--
 2 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/gst/rtpmanager/gstrtpsession.c b/gst/rtpmanager/gstrtpsession.c
index 8e20773..d46ceaf 100644
--- a/gst/rtpmanager/gstrtpsession.c
+++ b/gst/rtpmanager/gstrtpsession.c
@@ -537,7 +537,7 @@ gst_rtp_session_class_init (GstRtpSessionClass * klass)
 
   g_object_class_install_property (gobject_class, PROP_BANDWIDTH,
       g_param_spec_double ("bandwidth", "Bandwidth",
-          "The bandwidth of the session in bytes per second",
+          "The bandwidth of the session in bytes per second (0 for auto-discover)",
           0.0, G_MAXDOUBLE, DEFAULT_BANDWIDTH, G_PARAM_READWRITE));
 
   g_object_class_install_property (gobject_class, PROP_RTCP_FRACTION,
diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c
index 7da6a5c..457f4d4 100644
--- a/gst/rtpmanager/rtpsession.c
+++ b/gst/rtpmanager/rtpsession.c
@@ -250,7 +250,7 @@ rtp_session_class_init (RTPSessionClass * klass)
 
   g_object_class_install_property (gobject_class, PROP_BANDWIDTH,
       g_param_spec_double ("bandwidth", "Bandwidth",
-          "The bandwidth of the session",
+          "The bandwidth of the session (0 for auto-discover)",
           0.0, G_MAXDOUBLE, DEFAULT_BANDWIDTH,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
@@ -2063,14 +2063,38 @@ invalid_packet:
   }
 }
 
+static void
+add_bitrates (gpointer key, gpointer value, gpointer user_data)
+{
+  gdouble *bandwidth = user_data;
+  RTPSource *source = value;
+
+  *bandwidth += source->bitrate;
+}
+
 static GstClockTime
 calculate_rtcp_interval (RTPSession * sess, gboolean deterministic,
     gboolean first)
 {
   GstClockTime result;
 
-  if (sess->recalc_bandwidth) {
+  if (sess->recalc_bandwidth || sess->bandwidth == 0) {
     /* recalculate bandwidth when it changed */
+    gdouble bandwidth;
+
+    if (sess->bandwidth > 0)
+      bandwidth = sess->bandwidth;
+    else {
+      /* If it is <= 0, then try to estimate the actual bandwidth */
+      bandwidth = sess->source->bitrate;
+
+      g_hash_table_foreach (sess->cnames, add_bitrates, &bandwidth);
+      bandwidth /= 8.0;
+    }
+
+    if (bandwidth == 0)
+      bandwidth = RTP_STATS_BANDWIDTH;
+
     rtp_stats_set_bandwidths (&sess->stats, sess->bandwidth,
         sess->rtcp_bandwidth, sess->rtcp_rs_bandwidth, sess->rtcp_rr_bandwidth);
     sess->recalc_bandwidth = FALSE;





More information about the Gstreamer-commits mailing list