summaryrefslogtreecommitdiff
path: root/libavformat/rtmppkt.c
diff options
context:
space:
mode:
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>2012-06-14 15:28:40 +0200
committerMartin Storsjö <martin@martin.st>2012-06-14 22:22:58 +0300
commit7dc747f50b0adeaf2bcf6413e291dc4bffa54f9a (patch)
treeccdcab4a4c61542a0f84e7a504ee42435a60d375 /libavformat/rtmppkt.c
parentd2d193c9b6963f3041ee0037c791c44453b845a0 (diff)
rtmp: Read and handle incoming packets while writing data
This makes sure all incoming packets are read and handled (and reacted to) while sending an FLV stream over RTMP to a server. If there were enough incoming data to fill the TCP buffers, this could potentially make things block at unexpected places. For the upcoming RTMPT support, we need to consume all incoming data before we can send the next request. Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/rtmppkt.c')
-rw-r--r--libavformat/rtmppkt.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/libavformat/rtmppkt.c b/libavformat/rtmppkt.c
index ed8e6b203d..4ce238d5d0 100644
--- a/libavformat/rtmppkt.c
+++ b/libavformat/rtmppkt.c
@@ -74,15 +74,25 @@ void ff_amf_write_object_end(uint8_t **dst)
int ff_rtmp_packet_read(URLContext *h, RTMPPacket *p,
int chunk_size, RTMPPacket *prev_pkt)
{
- uint8_t hdr, t, buf[16];
+ uint8_t hdr;
+
+ if (ffurl_read(h, &hdr, 1) != 1)
+ return AVERROR(EIO);
+
+ return ff_rtmp_packet_read_internal(h, p, chunk_size, prev_pkt, hdr);
+}
+
+int ff_rtmp_packet_read_internal(URLContext *h, RTMPPacket *p, int chunk_size,
+ RTMPPacket *prev_pkt, uint8_t hdr)
+{
+
+ uint8_t t, buf[16];
int channel_id, timestamp, data_size, offset = 0;
uint32_t extra = 0;
enum RTMPPacketType type;
int size = 0;
int ret;
- if (ffurl_read(h, &hdr, 1) != 1)
- return AVERROR(EIO);
size++;
channel_id = hdr & 0x3F;