Commit a14c7842 authored by Chiranjeevi Melam's avatar Chiranjeevi Melam Committed by Martin Storsjö

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: 's avatarMartin Storsjö <martin@martin.st>
parent 4cc77323
...@@ -925,7 +925,7 @@ static int rtmp_write(URLContext *s, const uint8_t *buf, int size) ...@@ -925,7 +925,7 @@ static int rtmp_write(URLContext *s, const uint8_t *buf, int size)
uint32_t ts; uint32_t ts;
const uint8_t *buf_temp = buf; 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); av_log(s, AV_LOG_DEBUG, "FLV packet too small %d\n", size);
return 0; return 0;
} }
...@@ -966,20 +966,22 @@ static int rtmp_write(URLContext *s, const uint8_t *buf, int size) ...@@ -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) { if (rt->flv_size - rt->flv_off > size_temp) {
bytestream_get_buffer(&buf_temp, rt->flv_data + rt->flv_off, size_temp); bytestream_get_buffer(&buf_temp, rt->flv_data + rt->flv_off, size_temp);
rt->flv_off += size_temp; rt->flv_off += size_temp;
size_temp = 0;
} else { } else {
bytestream_get_buffer(&buf_temp, rt->flv_data + rt->flv_off, rt->flv_size - rt->flv_off); 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; rt->flv_off += rt->flv_size - rt->flv_off;
} }
if (rt->flv_off == rt->flv_size) { if (rt->flv_off == rt->flv_size) {
bytestream_get_be32(&buf_temp); 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_write(rt->stream, &rt->out_pkt, rt->chunk_size, rt->prev_pkt[1]);
ff_rtmp_packet_destroy(&rt->out_pkt); ff_rtmp_packet_destroy(&rt->out_pkt);
rt->flv_size = 0; rt->flv_size = 0;
rt->flv_off = 0; rt->flv_off = 0;
} }
} while (buf_temp - buf < size_temp); } while (buf_temp - buf < size);
return size; return size;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment