mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-24 03:59:43 +00:00
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
This commit is contained in:
parent
09b67cc4bd
commit
0b6b10d9da
@ -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,
|
||||
|
@ -110,7 +110,7 @@ void ff_rtmp_packet_destroy(RTMPPacket *pkt);
|
||||
* @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 @@ int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
|
||||
* @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);
|
||||
|
Loading…
Reference in New Issue
Block a user