Originally committed as revision 21533 to svn://svn.ffmpeg.org/ffmpeg/trunk
| ... | ... |
@@ -76,15 +76,18 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p, |
| 76 | 76 |
int channel_id, timestamp, data_size, offset = 0; |
| 77 | 77 |
uint32_t extra = 0; |
| 78 | 78 |
enum RTMPPacketType type; |
| 79 |
+ int size = 0; |
|
| 79 | 80 |
|
| 80 | 81 |
if (url_read(h, &hdr, 1) != 1) |
| 81 | 82 |
return AVERROR(EIO); |
| 83 |
+ size++; |
|
| 82 | 84 |
channel_id = hdr & 0x3F; |
| 83 | 85 |
|
| 84 | 86 |
if (channel_id < 2) { //special case for channel number >= 64
|
| 85 | 87 |
buf[1] = 0; |
| 86 | 88 |
if (url_read_complete(h, buf, channel_id + 1) != channel_id + 1) |
| 87 | 89 |
return AVERROR(EIO); |
| 90 |
+ size += channel_id + 1; |
|
| 88 | 91 |
channel_id = AV_RL16(buf) + 64; |
| 89 | 92 |
} |
| 90 | 93 |
data_size = prev_pkt[channel_id].data_size; |
| ... | ... |
@@ -97,17 +100,21 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p, |
| 97 | 97 |
} else {
|
| 98 | 98 |
if (url_read_complete(h, buf, 3) != 3) |
| 99 | 99 |
return AVERROR(EIO); |
| 100 |
+ size += 3; |
|
| 100 | 101 |
timestamp = AV_RB24(buf); |
| 101 | 102 |
if (hdr != RTMP_PS_FOURBYTES) {
|
| 102 | 103 |
if (url_read_complete(h, buf, 3) != 3) |
| 103 | 104 |
return AVERROR(EIO); |
| 105 |
+ size += 3; |
|
| 104 | 106 |
data_size = AV_RB24(buf); |
| 105 | 107 |
if (url_read_complete(h, buf, 1) != 1) |
| 106 | 108 |
return AVERROR(EIO); |
| 109 |
+ size++; |
|
| 107 | 110 |
type = buf[0]; |
| 108 | 111 |
if (hdr == RTMP_PS_TWELVEBYTES) {
|
| 109 | 112 |
if (url_read_complete(h, buf, 4) != 4) |
| 110 | 113 |
return AVERROR(EIO); |
| 114 |
+ size += 4; |
|
| 111 | 115 |
extra = AV_RL32(buf); |
| 112 | 116 |
} |
| 113 | 117 |
} |
| ... | ... |
@@ -138,13 +145,15 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p, |
| 138 | 138 |
} |
| 139 | 139 |
data_size -= chunk_size; |
| 140 | 140 |
offset += chunk_size; |
| 141 |
+ size += chunk_size; |
|
| 141 | 142 |
if (data_size > 0) {
|
| 142 | 143 |
url_read_complete(h, &t, 1); //marker |
| 144 |
+ size++; |
|
| 143 | 145 |
if (t != (0xC0 + channel_id)) |
| 144 | 146 |
return -1; |
| 145 | 147 |
} |
| 146 | 148 |
} |
| 147 |
- return 0; |
|
| 149 |
+ return size; |
|
| 148 | 150 |
} |
| 149 | 151 |
|
| 150 | 152 |
int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, |
| ... | ... |
@@ -153,6 +162,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, |
| 153 | 153 |
uint8_t pkt_hdr[16], *p = pkt_hdr; |
| 154 | 154 |
int mode = RTMP_PS_TWELVEBYTES; |
| 155 | 155 |
int off = 0; |
| 156 |
+ int size = 0; |
|
| 156 | 157 |
|
| 157 | 158 |
pkt->ts_delta = pkt->timestamp - prev_pkt[pkt->channel_id].timestamp; |
| 158 | 159 |
|
| ... | ... |
@@ -205,6 +215,7 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, |
| 205 | 205 |
prev_pkt[pkt->channel_id].extra = pkt->extra; |
| 206 | 206 |
|
| 207 | 207 |
url_write(h, pkt_hdr, p-pkt_hdr); |
| 208 |
+ size = p - pkt_hdr + pkt->data_size; |
|
| 208 | 209 |
while (off < pkt->data_size) {
|
| 209 | 210 |
int towrite = FFMIN(chunk_size, pkt->data_size - off); |
| 210 | 211 |
url_write(h, pkt->data + off, towrite); |
| ... | ... |
@@ -212,9 +223,10 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt, |
| 212 | 212 |
if (off < pkt->data_size) {
|
| 213 | 213 |
uint8_t marker = 0xC0 | pkt->channel_id; |
| 214 | 214 |
url_write(h, &marker, 1); |
| 215 |
+ size++; |
|
| 215 | 216 |
} |
| 216 | 217 |
} |
| 217 |
- return 0; |
|
| 218 |
+ return size; |
|
| 218 | 219 |
} |
| 219 | 220 |
|
| 220 | 221 |
int ff_rtmp_packet_create(RTMPPacket *pkt, int channel_id, RTMPPacketType type, |
| ... | ... |
@@ -110,7 +110,7 @@ void ff_rtmp_packet_destroy(RTMPPacket *pkt); |
| 110 | 110 |
* @param chunk_size current chunk size |
| 111 | 111 |
* @param prev_pkt previously read packet headers for all channels |
| 112 | 112 |
* (may be needed for restoring incomplete packet header) |
| 113 |
- * @return zero on success, negative value otherwise |
|
| 113 |
+ * @return number of bytes read on success, negative value otherwise |
|
| 114 | 114 |
*/ |
| 115 | 115 |
int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p, |
| 116 | 116 |
int chunk_size, RTMPPacket *prev_pkt); |
| ... | ... |
@@ -123,7 +123,7 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p, |
| 123 | 123 |
* @param chunk_size current chunk size |
| 124 | 124 |
* @param prev_pkt previously sent packet headers for all channels |
| 125 | 125 |
* (may be used for packet header compressing) |
| 126 |
- * @return zero on success, negative value otherwise |
|
| 126 |
+ * @return number of bytes written on success, negative value otherwise |
|
| 127 | 127 |
*/ |
| 128 | 128 |
int ff_rtmp_packet_write(URLContext *h, RTMPPacket *p, |
| 129 | 129 |
int chunk_size, RTMPPacket *prev_pkt); |