diff options
author | Sergiy <piratfm@gmail.com> | 2009-12-03 09:40:37 +0300 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2009-12-03 09:40:37 +0300 |
commit | a352b605945861df72977f2ed9786da3e4a90ef8 (patch) | |
tree | 530029a2508594b8cc343bbcde9aefc23cf80b35 /libavformat | |
parent | 15e65f83ec89be2bd0c5548343f52cd317d827ce (diff) |
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
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/rtmppkt.c | 12 | ||||
-rw-r--r-- | 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 |