summaryrefslogtreecommitdiff
path: root/libavformat/rtpdec.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2013-01-09 18:56:17 +0200
committerMartin Storsjö <martin@martin.st>2013-01-12 19:55:49 +0200
commit22c436c85e0dd81702b4e9289b90755b7310982f (patch)
treeb27243a7c15a7b44b473201743feb23ec6ce4916 /libavformat/rtpdec.c
parente568db40258d549777ac1c16971678e18a18f5f5 (diff)
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@martin.st>
Diffstat (limited to 'libavformat/rtpdec.c')
-rw-r--r--libavformat/rtpdec.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c
index ac294a0c42..8e429cc735 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 */