Mercurial > libavformat.hg
changeset 5410:f66e3c131106 libavformat
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"))
author | kostya |
---|---|
date | Thu, 03 Dec 2009 06:40:37 +0000 |
parents | 6b3395dd156a |
children | 1f27e6bd85c3 |
files | rtmppkt.c rtmppkt.h |
diffstat | 2 files changed, 10 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/rtmppkt.c Thu Dec 03 00:27:01 2009 +0000 +++ b/rtmppkt.c Thu Dec 03 06:40:37 2009 +0000 @@ -93,7 +93,7 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ pkt->type = type; pkt->timestamp = timestamp; pkt->extra = 0; + pkt->ts_delta = 0; return 0; }
--- a/rtmppkt.h Thu Dec 03 00:27:01 2009 +0000 +++ b/rtmppkt.h Thu Dec 03 06:40:37 2009 +0000 @@ -75,7 +75,8 @@ 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