From 7ebd374766fb4aab3b2ef0a3700e51a56e84144d Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 14 Dec 2010 17:15:23 +0100 Subject: [PATCH] rtpbin: correctly calculate RTCP packet size --- gst/rtpmanager/rtpsession.c | 20 +++++++++++--------- gst/rtpmanager/rtpstats.c | 9 +++++---- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c index 3ca7966..c50141d 100644 --- a/gst/rtpmanager/rtpsession.c +++ b/gst/rtpmanager/rtpsession.c @@ -74,13 +74,14 @@ enum PROP_LAST }; -/* update average packet size, we keep this scaled by 16 to keep enough - * precision. */ +/* update average packet size */ +#define INIT_AVG(avg, val) \ + (avg) = (val); #define UPDATE_AVG(avg, val) \ if ((avg) == 0) \ - (avg) = (val) << 4; \ + (avg) = (val); \ else \ - (avg) = ((val) + (15 * (avg))); + (avg) = ((val) + (15 * (val))) >> 4; /* The number RTCP intervals after which to timeout entries in the * collision table @@ -2169,8 +2170,7 @@ rtp_session_schedule_bye_locked (RTPSession * sess, const gchar * reason, /* at least one member wants to send a BYE */ g_free (sess->bye_reason); sess->bye_reason = g_strdup (reason); - /* The avg packet size is kept scaled by 16 */ - sess->stats.avg_rtcp_packet_size = 100 * 16; + INIT_AVG (sess->stats.avg_rtcp_packet_size, 100); sess->stats.bye_members = 1; sess->first_rtcp = TRUE; sess->sent_bye = FALSE; @@ -2692,12 +2692,14 @@ rtp_session_on_timeout (RTPSession * sess, GstClockTime current_time, /* close the RTCP packet */ gst_rtcp_buffer_end (data.rtcp); - GST_DEBUG ("sending packet"); if (sess->callbacks.send_rtcp) { UPDATE_AVG (sess->stats.avg_rtcp_packet_size, GST_BUFFER_SIZE (data.rtcp)); - result = sess->callbacks.send_rtcp (sess, own, data.rtcp, - sess->sent_bye, sess->send_rtcp_user_data); + GST_DEBUG ("sending RTCP packet, avg size %u", + sess->stats.avg_rtcp_packet_size); + result = + sess->callbacks.send_rtcp (sess, own, data.rtcp, sess->sent_bye, + sess->send_rtcp_user_data); } else { GST_DEBUG ("freeing packet"); gst_buffer_unref (data.rtcp); diff --git a/gst/rtpmanager/rtpstats.c b/gst/rtpmanager/rtpstats.c index a6de7d8..a31e7e5 100644 --- a/gst/rtpmanager/rtpstats.c +++ b/gst/rtpmanager/rtpstats.c @@ -166,7 +166,7 @@ rtp_stats_calculate_rtcp_interval (RTPSessionStats * stats, gboolean we_send, if (rtcp_bw <= 0.00001) return GST_CLOCK_TIME_NONE; - avg_rtcp_size = stats->avg_rtcp_packet_size / 16.0; + avg_rtcp_size = stats->avg_rtcp_packet_size; /* * The effective number of sites times the average packet size is * the total number of octets sent when each site sends a report. @@ -176,6 +176,7 @@ rtp_stats_calculate_rtcp_interval (RTPSessionStats * stats, gboolean we_send, * time interval we send one report so this time is also our * average time between reports. */ + GST_DEBUG ("avg size %f, n %f, rtcp_bw %f", avg_rtcp_size, n, rtcp_bw); interval = avg_rtcp_size * n / rtcp_bw; if (interval < rtcp_min_time) interval = rtcp_min_time; @@ -245,7 +246,7 @@ rtp_stats_calculate_bye_interval (RTPSessionStats * stats) if (rtcp_bw <= 0.0001) return GST_CLOCK_TIME_NONE; - avg_rtcp_size = stats->avg_rtcp_packet_size / 16.0; + avg_rtcp_size = stats->avg_rtcp_packet_size; /* * The effective number of sites times the average packet size is * the total number of octets sent when each site sends a report. @@ -274,7 +275,7 @@ rtp_stats_calculate_bye_interval (RTPSessionStats * stats) * Returns: total RTP packets lost. */ gint64 -rtp_stats_get_packets_lost (const RTPSourceStats *stats) +rtp_stats_get_packets_lost (const RTPSourceStats * stats) { gint64 lost; guint64 extended_max, expected; @@ -284,4 +285,4 @@ rtp_stats_get_packets_lost (const RTPSourceStats *stats) lost = expected - stats->packets_received; return lost; -} \ No newline at end of file +} -- 2.7.4