summaryrefslogtreecommitdiff
path: root/libavformat/rtmppkt.c
diff options
context:
space:
mode:
authorSergiy <piratfm@gmail.com>2009-12-03 06:40:37 +0000
committerKostya Shishkov <kostya.shishkov@gmail.com>2009-12-03 06:40:37 +0000
commita352b605945861df72977f2ed9786da3e4a90ef8 (patch)
tree530029a2508594b8cc343bbcde9aefc23cf80b35 /libavformat/rtmppkt.c
parent15e65f83ec89be2bd0c5548343f52cd317d827ce (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/rtmppkt.c')
-rw-r--r--libavformat/rtmppkt.c12
1 files changed, 8 insertions, 4 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;
}