summaryrefslogtreecommitdiff
path: root/libavformat/rtmppkt.c
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2010-01-30 09:24:52 +0000
committerKostya Shishkov <kostya.shishkov@gmail.com>2010-01-30 09:24:52 +0000
commit0b6b10d9dae44d3f48dd75f466264c780f7cff00 (patch)
tree28c363bd78468bb488cbf84b73a3bd409de5a923 /libavformat/rtmppkt.c
parent09b67cc4bd4e7b587af346cef5eccf786b956674 (diff)
Make RTMP send/receive packet functions report number of bytes read or sent.
Originally committed as revision 21533 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/rtmppkt.c')
-rw-r--r--libavformat/rtmppkt.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/libavformat/rtmppkt.c b/libavformat/rtmppkt.c
index 62193a0a44..d4ffe8be3e 100644
--- a/libavformat/rtmppkt.c
+++ b/libavformat/rtmppkt.c
@@ -76,15 +76,18 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
int channel_id, timestamp, data_size, offset = 0;
uint32_t extra = 0;
enum RTMPPacketType type;
+ int size = 0;
if (url_read(h, &hdr, 1) != 1)
return AVERROR(EIO);
+ size++;
channel_id = hdr & 0x3F;
if (channel_id < 2) { //special case for channel number >= 64
buf[1] = 0;
if (url_read_complete(h, buf, channel_id + 1) != channel_id + 1)
return AVERROR(EIO);
+ size += channel_id + 1;
channel_id = AV_RL16(buf) + 64;
}
data_size = prev_pkt[channel_id].data_size;
@@ -97,17 +100,21 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
} else {
if (url_read_complete(h, buf, 3) != 3)
return AVERROR(EIO);
+ size += 3;
timestamp = AV_RB24(buf);
if (hdr != RTMP_PS_FOURBYTES) {
if (url_read_complete(h, buf, 3) != 3)
return AVERROR(EIO);
+ size += 3;
data_size = AV_RB24(buf);
if (url_read_complete(h, buf, 1) != 1)
return AVERROR(EIO);
+ size++;
type = buf[0];
if (hdr == RTMP_PS_TWELVEBYTES) {
if (url_read_complete(h, buf, 4) != 4)
return AVERROR(EIO);
+ size += 4;
extra = AV_RL32(buf);
}
}
@@ -138,13 +145,15 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
}
data_size -= chunk_size;
offset += chunk_size;
+ size += chunk_size;
if (data_size > 0) {
url_read_complete(h, &t, 1); //marker
+ size++;
if (t != (0xC0 + channel_id))
return -1;
}
}
- return 0;
+ return size;
}
int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
@@ -153,6 +162,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;
+ int size = 0;
pkt->ts_delta = pkt->timestamp - prev_pkt[pkt->channel_id].timestamp;
@@ -205,6 +215,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
prev_pkt[pkt->channel_id].extra = pkt->extra;
url_write(h, pkt_hdr, p-pkt_hdr);
+ size = p - pkt_hdr + pkt->data_size;
while (off < pkt->data_size) {
int towrite = FFMIN(chunk_size, pkt->data_size - off);
url_write(h, pkt->data + off, towrite);
@@ -212,9 +223,10 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
if (off < pkt->data_size) {
uint8_t marker = 0xC0 | pkt->channel_id;
url_write(h, &marker, 1);
+ size++;
}
}
- return 0;
+ return size;
}
int ff_rtmp_packet_create(RTMPPacket *pkt, int channel_id, RTMPPacketType type,