changeset 5524:043b36cefe89 libavformat

Correct timestamps inside FLV data received by RTMP. Patch by Sergiy (gmail(piratfm))
author kostya
date Tue, 12 Jan 2010 07:10:47 +0000
parents d854655b2042
children f484a964bed1
files rtmpproto.c
diffstat 1 files changed, 22 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/rtmpproto.c	Tue Jan 12 06:44:49 2010 +0000
+++ b/rtmpproto.c	Tue Jan 12 07:10:47 2010 +0000
@@ -651,6 +651,10 @@
 {
     RTMPContext *rt = s->priv_data;
     int ret;
+    uint8_t *p;
+    const uint8_t *next;
+    uint32_t data_size;
+    uint32_t ts, cts, pts=0;
 
     if (rt->state == STATE_STOPPED)
         return AVERROR_EOF;
@@ -685,8 +689,7 @@
         }
         if (rpkt.type == RTMP_PT_VIDEO || rpkt.type == RTMP_PT_AUDIO ||
            (rpkt.type == RTMP_PT_NOTIFY && !memcmp("\002\000\012onMetaData", rpkt.data, 13))) {
-            uint8_t *p;
-            uint32_t ts = rpkt.timestamp;
+            ts = rpkt.timestamp;
 
             // generate packet header and put data into buffer for FLV demuxer
             rt->flv_off  = 0;
@@ -706,6 +709,23 @@
             rt->flv_off  = 0;
             rt->flv_size = rpkt.data_size;
             rt->flv_data = av_realloc(rt->flv_data, rt->flv_size);
+            /* rewrite timestamps */
+            next = rpkt.data;
+            ts = rpkt.timestamp;
+            while (next - rpkt.data < rpkt.data_size - 11) {
+                next++;
+                data_size = bytestream_get_be24(&next);
+                p=next;
+                cts = bytestream_get_be24(&next);
+                cts |= bytestream_get_byte(&next);
+                if (pts==0)
+                    pts=cts;
+                ts += cts - pts;
+                pts = cts;
+                bytestream_put_be24(&p, ts);
+                bytestream_put_byte(&p, ts >> 24);
+                next += data_size + 3 + 4;
+            }
             memcpy(rt->flv_data, rpkt.data, rpkt.data_size);
             ff_rtmp_packet_destroy(&rpkt);
             return 0;