[FFmpeg-devel] [PATCH] avformat/rtmpproto: Fix RTMP control message handling error in listen mode.

小山浩之 oyama at module.jp
Fri Oct 21 11:47:27 EEST 2016


ping

> 2016/10/12 15:33、Hiroyuki OYAMA <oyama at module.jp> :
> 
> Fix problem to fail by a RTMP Control Message except "Set Chunk Size (1)" after an RTMP handshake. When 'nginx-rtmp-module' relays an RTMP, it sends not only control message 'Set Chunk Size (1)' but also 'Window Acknowledgement Size (5)'.
> ---
> libavformat/rtmpproto.c | 47 ++++++++++++++++++++++++++++++++++++++---------
> 1 file changed, 38 insertions(+), 9 deletions(-)
> 
> diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c
> index 95d1c1d..b118b4e 100644
> --- a/libavformat/rtmpproto.c
> +++ b/libavformat/rtmpproto.c
> @@ -156,6 +156,8 @@ static const uint8_t rtmp_server_key[] = {
> };
> 
> static int handle_chunk_size(URLContext *s, RTMPPacket *pkt);
> +static int handle_server_bw(URLContext *s, RTMPPacket *pkt);
> +static int handle_client_bw(URLContext *s, RTMPPacket *pkt);
> 
> static int add_tracked_method(RTMPContext *rt, const char *name, int id)
> {
> @@ -399,6 +401,9 @@ static int gen_connect(URLContext *s, RTMPContext *rt)
>     return rtmp_send_packet(rt, &pkt, 1);
> }
> 
> +
> +#define RTMP_CTRL_ABORT_MESSAGE  (2)
> +
> static int read_connect(URLContext *s, RTMPContext *rt)
> {
>     RTMPPacket pkt = { 0 };
> @@ -411,18 +416,42 @@ static int read_connect(URLContext *s, RTMPContext *rt)
>     uint8_t tmpstr[256];
>     GetByteContext gbc;
> 
> -    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);
> +    // handle RTMP Protocol Control Messages
> +    for (;;) {
>         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;
> +#ifdef DEBUG
> +        ff_rtmp_packet_dump(s, &pkt);
> +#endif
> +        if (pkt.type == RTMP_PT_CHUNK_SIZE) {
> +            if ((ret = handle_chunk_size(s, &pkt)) < 0) {
> +                ff_rtmp_packet_destroy(&pkt);
> +                return ret;
> +            }
> +        } else if (pkt.type == RTMP_CTRL_ABORT_MESSAGE) {
> +            av_log(s, AV_LOG_ERROR, "received abort message\n");
> +            ff_rtmp_packet_destroy(&pkt);
> +            return AVERROR_UNKNOWN;
> +        } else if (pkt.type == RTMP_PT_BYTES_READ) {
> +            av_log(s, AV_LOG_TRACE, "received acknowledgement\n");
> +        } else if (pkt.type == RTMP_PT_SERVER_BW) {
> +            if ((ret = handle_server_bw(s, &pkt)) < 0) {
> +                ff_rtmp_packet_destroy(&pkt);
> +                return ret;
> +            }
> +        } else if (pkt.type == RTMP_PT_CLIENT_BW) {
> +            if ((ret = handle_client_bw(s, &pkt)) < 0) {
> +                ff_rtmp_packet_destroy(&pkt);
> +                return ret;
> +            }
> +        } else if (pkt.type == RTMP_PT_INVOKE) {
> +            // received RTMP Command Message
> +            break;
> +        } else {
> +            av_log(s, AV_LOG_ERROR, "Unknown control message type (%d)\n", pkt.type);
> +        }
> +        ff_rtmp_packet_destroy(&pkt);
>     }
> 
>     cp = pkt.data;
> -- 
> 2.8.4 (Apple Git-73)
> 



More information about the ffmpeg-devel mailing list