[FFmpeg-cvslog] r20714 - in trunk/libavformat: rtmppkt.c rtmppkt.h

kostya subversion
Thu Dec 3 07:40:38 CET 2009


Author: kostya
Date: Thu Dec  3 07:40:37 2009
New Revision: 20714

Log:
RTMP packets with one-byte header use previous packet timestamp difference, so
track timestamp difference as well.
Patch by Sergiy (mail.composeAddress("piratfm","gmail.com"))

Modified:
   trunk/libavformat/rtmppkt.c
   trunk/libavformat/rtmppkt.h

Modified: trunk/libavformat/rtmppkt.c
==============================================================================
--- trunk/libavformat/rtmppkt.c	Thu Dec  3 01:55:52 2009	(r20713)
+++ trunk/libavformat/rtmppkt.c	Thu Dec  3 07:40:37 2009	(r20714)
@@ -93,7 +93,7 @@ int ff_rtmp_packet_read(URLContext *h, R
 
     hdr >>= 6;
     if (hdr == RTMP_PS_ONEBYTE) {
-        timestamp = prev_pkt[channel_id].timestamp;
+        timestamp = prev_pkt[channel_id].ts_delta;
     } else {
         if (url_read_complete(h, buf, 3) != 3)
             return AVERROR(EIO);
@@ -116,9 +116,10 @@ int ff_rtmp_packet_read(URLContext *h, R
                 return AVERROR(EIO);
             timestamp = AV_RB32(buf);
         }
-        if (hdr != RTMP_PS_TWELVEBYTES)
-            timestamp += prev_pkt[channel_id].timestamp;
     }
+    if (hdr != RTMP_PS_TWELVEBYTES)
+        timestamp += prev_pkt[channel_id].timestamp;
+
     if (ff_rtmp_packet_create(p, channel_id, type, timestamp, data_size))
         return -1;
     p->extra = extra;
@@ -126,6 +127,7 @@ int ff_rtmp_packet_read(URLContext *h, R
     prev_pkt[channel_id].channel_id = channel_id;
     prev_pkt[channel_id].type       = type;
     prev_pkt[channel_id].data_size  = data_size;
+    prev_pkt[channel_id].ts_delta   = timestamp - prev_pkt[channel_id].timestamp;
     prev_pkt[channel_id].timestamp  = timestamp;
     prev_pkt[channel_id].extra      = extra;
     while (data_size > 0) {
@@ -151,6 +153,7 @@ int ff_rtmp_packet_write(URLContext *h, 
     uint8_t pkt_hdr[16], *p = pkt_hdr;
     int mode = RTMP_PS_TWELVEBYTES;
     int off = 0;
+    pkt->ts_delta = pkt->timestamp - prev_pkt[pkt->channel_id].timestamp;
 
     //TODO: header compression
     if (pkt->channel_id < 64) {
@@ -165,7 +168,7 @@ int ff_rtmp_packet_write(URLContext *h, 
     if (mode != RTMP_PS_ONEBYTE) {
         uint32_t timestamp = pkt->timestamp;
         if (mode != RTMP_PS_TWELVEBYTES)
-            timestamp -= prev_pkt[pkt->channel_id].timestamp;
+            timestamp = pkt->ts_delta;
         bytestream_put_be24(&p, timestamp >= 0xFFFFFF ? 0xFFFFFF : timestamp);
         if (mode != RTMP_PS_FOURBYTES) {
             bytestream_put_be24(&p, pkt->data_size);
@@ -200,6 +203,7 @@ int ff_rtmp_packet_create(RTMPPacket *pk
     pkt->type       = type;
     pkt->timestamp  = timestamp;
     pkt->extra      = 0;
+    pkt->ts_delta   = 0;
 
     return 0;
 }

Modified: trunk/libavformat/rtmppkt.h
==============================================================================
--- trunk/libavformat/rtmppkt.h	Thu Dec  3 01:55:52 2009	(r20713)
+++ trunk/libavformat/rtmppkt.h	Thu Dec  3 07:40:37 2009	(r20714)
@@ -75,7 +75,8 @@ enum RTMPPacketSize {
 typedef struct RTMPPacket {
     uint8_t        channel_id; ///< RTMP channel ID (nothing to do with audio/video channels though)
     RTMPPacketType type;       ///< packet payload type
-    uint32_t       timestamp;  ///< packet full timestamp or timestamp increment to the previous one in milliseconds (latter only for media packets)
+    uint32_t       timestamp;  ///< packet full timestamp
+    uint32_t       ts_delta;   ///< timestamp increment to the previous one in milliseconds (latter only for media packets)
     uint32_t       extra;      ///< probably an additional channel ID used during streaming data
     uint8_t        *data;      ///< packet payload
     int            data_size;  ///< packet payload size



More information about the ffmpeg-cvslog mailing list