changeset 173:38f64fabb24b libavformat

fixed NTP generation for mpeg
author bellard
date Tue, 15 Jul 2003 19:41:40 +0000
parents 9a0ab557b159
children 7d56e9f83fdb
files rtp.c
diffstat 1 files changed, 24 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/rtp.c	Tue Jul 15 16:57:35 2003 +0000
+++ b/rtp.c	Tue Jul 15 19:41:40 2003 +0000
@@ -98,6 +98,7 @@
     int max_payload_size;
     /* rtcp sender statistics receive */
     int64_t last_rtcp_ntp_time;
+    int64_t first_rtcp_ntp_time;
     uint32_t last_rtcp_timestamp;
     /* rtcp sender statistics */
     unsigned int packet_count;
@@ -189,7 +190,7 @@
     return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
 }
 
-static inline uint32_t decode_be64(const uint8_t *p)
+static inline uint64_t decode_be64(const uint8_t *p)
 {
     return ((uint64_t)decode_be32(p) << 32) | decode_be32(p + 4);
 }
@@ -201,6 +202,8 @@
     if (buf[1] != 200)
         return -1;
     s->last_rtcp_ntp_time = decode_be64(buf + 8);
+    if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE)
+        s->first_rtcp_ntp_time = s->last_rtcp_ntp_time;
     s->last_rtcp_timestamp = decode_be32(buf + 16);
     return 0;
 }
@@ -298,11 +301,23 @@
         break;
     }
 
-    if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) {
-        /* compute pts from timestamp with received ntp_time */
-        delta_timestamp = timestamp - s->last_rtcp_timestamp;
-        /* XXX: do conversion, but not needed for mpeg at 90 KhZ */
-        pkt->pts = s->last_rtcp_ntp_time + delta_timestamp;
+    switch(st->codec.codec_id) {
+    case CODEC_ID_MP2:
+    case CODEC_ID_MPEG1VIDEO:
+        if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) {
+            int64_t addend;
+            /* XXX: is it really necessary to unify the timestamp base ? */
+            /* compute pts from timestamp with received ntp_time */
+            delta_timestamp = timestamp - s->last_rtcp_timestamp;
+            /* convert to 90 kHz without overflow */
+            addend = (s->last_rtcp_ntp_time - s->first_rtcp_ntp_time) >> 14;
+            addend = (addend * 5625) >> 14;
+            pkt->pts = addend + delta_timestamp;
+        }
+        break;
+    default:
+        /* no timestamp info yet */
+        break;
     }
     return 0;
 }
@@ -313,6 +328,7 @@
     RTPContext *s = s1->priv_data;
     s->payload_type = -1;
     s->last_rtcp_ntp_time = AV_NOPTS_VALUE;
+    s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
     return 0;
 }
 
@@ -613,7 +629,8 @@
         RTCP_TX_RATIO_DEN;
     if (s->first_packet || rtcp_bytes >= 28) {
         /* compute NTP time */
-        ntp_time = force_pts; // ((int64_t)force_pts << 28) / 5625
+        /* XXX: 90 kHz timestamp hardcoded */
+        ntp_time = ((int64_t)force_pts << 28) / 5625;
         rtcp_send_sr(s1, ntp_time); 
         s->last_octet_count = s->octet_count;
         s->first_packet = 0;