From a352b605945861df72977f2ed9786da3e4a90ef8 Mon Sep 17 00:00:00 2001 From: Sergiy Date: Thu, 3 Dec 2009 06:40:37 +0000 Subject: [PATCH] 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")) Originally committed as revision 20714 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/rtmppkt.c | 12 ++++++++---- libavformat/rtmppkt.h | 3 ++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libavformat/rtmppkt.c b/libavformat/rtmppkt.c index b48493ba11..2eab1c13df 100644 --- a/libavformat/rtmppkt.c +++ b/libavformat/rtmppkt.c @@ -93,7 +93,7 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p, 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, RTMPPacket *p, 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, RTMPPacket *p, 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, RTMPPacket *pkt, 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, RTMPPacket *pkt, 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 *pkt, int channel_id, RTMPPacketType type, pkt->type = type; pkt->timestamp = timestamp; pkt->extra = 0; + pkt->ts_delta = 0; return 0; } diff --git a/libavformat/rtmppkt.h b/libavformat/rtmppkt.h index 2c4f92bbec..8be59078e6 100644 --- a/libavformat/rtmppkt.h +++ b/libavformat/rtmppkt.h @@ -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