[FFmpeg-cvslog] rtpdec: Send a valid "delay since SR" value in the RTCP RR packets

Martin Storsjö git at videolan.org
Sun Jan 13 14:12:56 CET 2013


ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Wed Jan  9 18:56:17 2013 +0200| [22c436c85e0dd81702b4e9289b90755b7310982f] | committer: Martin Storsjö

rtpdec: Send a valid "delay since SR" value in the RTCP RR packets

Previously, we always signalled a zero time since the last RTCP
SR, which is dubious.

The code also suggested that this would be the difference in
RTP NTP time units (32.32 fixed point), while it actually is
in in 1/65536 second units. (RFC 3550 section 6.4.1)

Signed-off-by: Martin Storsjö <martin at martin.st>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=22c436c85e0dd81702b4e9289b90755b7310982f
---

 libavformat/rtpdec.c |    5 +++--
 libavformat/rtpdec.h |    1 +
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c
index ac294a0..8e429cc 100644
--- a/libavformat/rtpdec.c
+++ b/libavformat/rtpdec.c
@@ -135,6 +135,7 @@ static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf,
                 return AVERROR_INVALIDDATA;
             }
 
+            s->last_rtcp_reception_time = av_gettime();
             s->last_rtcp_ntp_time  = AV_RB64(buf + 8);
             s->last_rtcp_timestamp = AV_RB32(buf + 16);
             if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) {
@@ -261,7 +262,6 @@ int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, URLContext *fd,
     uint32_t lost_interval;
     uint32_t expected;
     uint32_t fraction;
-    uint64_t ntp_time = s->last_rtcp_ntp_time; // TODO: Get local ntp time?
 
     if ((!fd && !avio) || (count < 1))
         return -1;
@@ -315,7 +315,8 @@ int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, URLContext *fd,
         avio_wb32(pb, 0); /* delay since last SR */
     } else {
         uint32_t middle_32_bits   = s->last_rtcp_ntp_time >> 16; // this is valid, right? do we need to handle 64 bit values special?
-        uint32_t delay_since_last = ntp_time - s->last_rtcp_ntp_time;
+        uint32_t delay_since_last = av_rescale(av_gettime() - s->last_rtcp_reception_time,
+                                               65536, AV_TIME_BASE);
 
         avio_wb32(pb, middle_32_bits); /* last SR timestamp */
         avio_wb32(pb, delay_since_last); /* delay since last SR */
diff --git a/libavformat/rtpdec.h b/libavformat/rtpdec.h
index ee085b1..6c808cd 100644
--- a/libavformat/rtpdec.h
+++ b/libavformat/rtpdec.h
@@ -175,6 +175,7 @@ struct RTPDemuxContext {
 
     /* rtcp sender statistics receive */
     int64_t last_rtcp_ntp_time;
+    int64_t last_rtcp_reception_time;
     int64_t first_rtcp_ntp_time;
     uint32_t last_rtcp_timestamp;
     int64_t rtcp_ts_offset;



More information about the ffmpeg-cvslog mailing list