From 0b6b10d9dae44d3f48dd75f466264c780f7cff00 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Sat, 30 Jan 2010 09:24:52 +0000 Subject: 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 --- libavformat/rtmppkt.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'libavformat/rtmppkt.c') 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, -- cgit v1.2.3