From 4d40e073dcdef335215c124d340ea156bc4bdf13 Mon Sep 17 00:00:00 2001 From: Stephan Soller Date: Sun, 13 Apr 2014 01:06:22 +0200 Subject: rtmpproto: Handle RTMP chunk size packets before the connect packet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In all other cases where ff_rtmp_packet_read is used, the packet returned is passed to rtmp_parse_result more or less immediately. In this single case, the content of the packet was required to be a connect packet. Some clients, e.g. Open Broadcaster Software, send a chunk size packet before the connect packet. If the first packet is a chunk size packet, handle it and read another one, requiring this to be a connect packet instead. Signed-off-by: Martin Storsjö --- libavformat/rtmpproto.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'libavformat/rtmpproto.c') diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c index bc6a4fef69..8d8aabc60a 100644 --- a/libavformat/rtmpproto.c +++ b/libavformat/rtmpproto.c @@ -150,6 +150,8 @@ static const uint8_t rtmp_server_key[] = { 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE }; +static int handle_chunk_size(URLContext *s, RTMPPacket *pkt); + static int add_tracked_method(RTMPContext *rt, const char *name, int id) { int err; @@ -411,6 +413,16 @@ static int read_connect(URLContext *s, RTMPContext *rt) if ((ret = ff_rtmp_packet_read(rt->stream, &pkt, rt->in_chunk_size, &rt->prev_pkt[0], &rt->nb_prev_pkt[0])) < 0) return ret; + + if (pkt.type == RTMP_PT_CHUNK_SIZE) { + if ((ret = handle_chunk_size(s, &pkt)) < 0) + return ret; + ff_rtmp_packet_destroy(&pkt); + if ((ret = ff_rtmp_packet_read(rt->stream, &pkt, rt->in_chunk_size, + &rt->prev_pkt[0], &rt->nb_prev_pkt[0])) < 0) + return ret; + } + cp = pkt.data; bytestream2_init(&gbc, cp, pkt.size); if (ff_amf_read_string(&gbc, command, sizeof(command), &stringlen)) { -- cgit v1.2.3