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

Steven Liu lingjiujianke at gmail.com
Fri Oct 21 16:05:13 EEST 2016


LGTM

小山浩之 <oyama at module.jp>于2016年10月21日 周五上午4:47写道:

> 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)
> >
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list