Mercurial > libavformat.hg
changeset 5604:81b2509db2ad libavformat
Make RTMP send/receive packet functions report number of bytes read or sent.
author | kostya |
---|---|
date | Sat, 30 Jan 2010 09:24:52 +0000 |
parents | 8efa6bc0752e |
children | 32fe8ab7e6b6 |
files | rtmppkt.c rtmppkt.h |
diffstat | 2 files changed, 16 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/rtmppkt.c Sat Jan 30 08:38:11 2010 +0000 +++ b/rtmppkt.c Sat Jan 30 09:24:52 2010 +0000 @@ -76,15 +76,18 @@ 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 @@ } 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 @@ } 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 @@ 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 @@ 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 @@ 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,
--- a/rtmppkt.h Sat Jan 30 08:38:11 2010 +0000 +++ b/rtmppkt.h Sat Jan 30 09:24:52 2010 +0000 @@ -110,7 +110,7 @@ * @param chunk_size current chunk size * @param prev_pkt previously read packet headers for all channels * (may be needed for restoring incomplete packet header) - * @return zero on success, negative value otherwise + * @return number of bytes read on success, negative value otherwise */ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p, int chunk_size, RTMPPacket *prev_pkt); @@ -123,7 +123,7 @@ * @param chunk_size current chunk size * @param prev_pkt previously sent packet headers for all channels * (may be used for packet header compressing) - * @return zero on success, negative value otherwise + * @return number of bytes written on success, negative value otherwise */ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *p, int chunk_size, RTMPPacket *prev_pkt);