]> git.sesse.net Git - ffmpeg/commitdiff
avformat/rtpdec: Fix prft wallclock time.
authorAlok Priyadarshi <alokpr@gmail.com>
Thu, 25 Mar 2021 04:46:36 +0000 (21:46 -0700)
committerJames Almer <jamrial@gmail.com>
Tue, 30 Mar 2021 14:59:15 +0000 (11:59 -0300)
Timestamp difference is available in media timebase (1/90K) where as
rtcp time is in the default microseconds timebase. This patch fixes
the calculated prft wallclock time by rescaling the timestamp delta
to the microseconds timebase.

Signed-off-by: James Almer <jamrial@gmail.com>
libavformat/rtpdec.c

index 1edb64b9bffb4208df5c5e07d75d2088a50c155a..6b0da9e63695261b193b3e9ca98d46c8c9b568b0 100644 (file)
@@ -623,14 +623,19 @@ void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite,
 }
 
 static int rtp_set_prft(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp) {
+    int64_t rtcp_time, delta_timestamp, delta_time;
+
     AVProducerReferenceTime *prft =
         (AVProducerReferenceTime *) av_packet_new_side_data(
             pkt, AV_PKT_DATA_PRFT, sizeof(AVProducerReferenceTime));
     if (!prft)
         return AVERROR(ENOMEM);
 
-    prft->wallclock = ff_parse_ntp_time(s->last_rtcp_ntp_time) - NTP_OFFSET_US +
-                      timestamp - s->last_rtcp_timestamp;
+    rtcp_time = ff_parse_ntp_time(s->last_rtcp_ntp_time) - NTP_OFFSET_US;
+    delta_timestamp = (int64_t)timestamp - (int64_t)s->last_rtcp_timestamp;
+    delta_time = av_rescale_q(delta_timestamp, s->st->time_base, AV_TIME_BASE_Q);
+
+    prft->wallclock = rtcp_time + delta_time;
     prft->flags = 24;
     return 0;
 }