diff options
author | Chiranjeevi Melam <cmelam@rgbnetworks.com> | 2011-09-18 05:39:53 +0200 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2011-09-20 16:23:46 +0300 |
commit | a14c784210198fe830391a59897d4dc62f13ab84 (patch) | |
tree | 150621f00238775b42569b461e8f24834e3b2ee7 /libavformat/rtmpproto.c | |
parent | 4cc7732386eb36661ed22d1200339b38a5fa60bc (diff) | |
download | ffmpeg-a14c784210198fe830391a59897d4dc62f13ab84.tar.gz |
rtmp: Handle FLV packets written in more than one write call
If the FLV packet is larger than the AVIO buffer, a partial
FLV packet will be flushed to the RTMP protocol.
This commit handles the most common cases of FLV packets
being written in more than one call.
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/rtmpproto.c')
-rw-r--r-- | libavformat/rtmpproto.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c index de4eb0fd23..66265f2cfb 100644 --- a/libavformat/rtmpproto.c +++ b/libavformat/rtmpproto.c @@ -925,7 +925,7 @@ static int rtmp_write(URLContext *s, const uint8_t *buf, int size) uint32_t ts; const uint8_t *buf_temp = buf; - if (size < 11) { + if (!rt->flv_off && size < 11) { av_log(s, AV_LOG_DEBUG, "FLV packet too small %d\n", size); return 0; } @@ -966,20 +966,22 @@ static int rtmp_write(URLContext *s, const uint8_t *buf, int size) if (rt->flv_size - rt->flv_off > size_temp) { bytestream_get_buffer(&buf_temp, rt->flv_data + rt->flv_off, size_temp); rt->flv_off += size_temp; + size_temp = 0; } else { bytestream_get_buffer(&buf_temp, rt->flv_data + rt->flv_off, rt->flv_size - rt->flv_off); + size_temp -= rt->flv_size - rt->flv_off; rt->flv_off += rt->flv_size - rt->flv_off; } if (rt->flv_off == rt->flv_size) { bytestream_get_be32(&buf_temp); - + size_temp -= 4; ff_rtmp_packet_write(rt->stream, &rt->out_pkt, rt->chunk_size, rt->prev_pkt[1]); ff_rtmp_packet_destroy(&rt->out_pkt); rt->flv_size = 0; rt->flv_off = 0; } - } while (buf_temp - buf < size_temp); + } while (buf_temp - buf < size); return size; } |