diff mbox series

[FFmpeg-devel,v2,1/2] avformat/rtsp: fix infinite loop with udp transport

Message ID tencent_C5B5DA49130EBC45429311684893FE136F05@qq.com
State Superseded
Headers show
Series [FFmpeg-devel,v2,1/2] avformat/rtsp: fix infinite loop with udp transport | expand

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Zhao Zhili Sept. 8, 2020, 4:10 p.m. UTC
sender:
./ffmpeg -i test.mp4 -c copy -f rtsp -rtsp_transport udp  rtsp://localhost:12345/live.sdp

receiver:
./ffmpeg_g -y -rtsp_flags listen -timeout 100 -i rtsp://localhost:12345/live.sdp -c copy test.mp4
---
 libavformat/rtsp.c    | 2 ++
 libavformat/rtsp.h    | 1 +
 libavformat/rtspdec.c | 2 +-
 3 files changed, 4 insertions(+), 1 deletion(-)

Comments

Zhao Zhili Sept. 26, 2020, 4:31 p.m. UTC | #1
Ping for review, thanks.

> On Sep 9, 2020, at 12:10 AM, Zhao Zhili <quinkblack@foxmail.com> wrote:
> 
> sender:
> ./ffmpeg -i test.mp4 -c copy -f rtsp -rtsp_transport udp  rtsp://localhost:12345/live.sdp
> 
> receiver:
> ./ffmpeg_g -y -rtsp_flags listen -timeout 100 -i rtsp://localhost:12345/live.sdp -c copy test.mp4
> ---
> libavformat/rtsp.c    | 2 ++
> libavformat/rtsp.h    | 1 +
> libavformat/rtspdec.c | 2 +-
> 3 files changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
> index 5d8491b74b..597413803f 100644
> --- a/libavformat/rtsp.c
> +++ b/libavformat/rtsp.c
> @@ -2051,6 +2051,8 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
>                 if ((ret = parse_rtsp_message(s)) < 0) {
>                     return ret;
>                 }
> +                if (rt->state == RTSP_STATE_TEARDOWN)
> +                    return AVERROR_EOF;
>             }
> #endif
>         } else if (n == 0 && ++timeout_cnt >= MAX_TIMEOUTS) {
> diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h
> index 54a9a30c16..481cc0c3ce 100644
> --- a/libavformat/rtsp.h
> +++ b/libavformat/rtsp.h
> @@ -198,6 +198,7 @@ enum RTSPClientState {
>     RTSP_STATE_STREAMING, /**< initialized and sending/receiving data */
>     RTSP_STATE_PAUSED,  /**< initialized, but not receiving data */
>     RTSP_STATE_SEEKING, /**< initialized, requesting a seek */
> +    RTSP_STATE_TEARDOWN,/**< initialized, in teardown state */
> };
> 
> /**
> diff --git a/libavformat/rtspdec.c b/libavformat/rtspdec.c
> index dfa29913bf..ec786a469a 100644
> --- a/libavformat/rtspdec.c
> +++ b/libavformat/rtspdec.c
> @@ -494,7 +494,7 @@ int ff_rtsp_parse_streaming_commands(AVFormatContext *s)
>                               "Public: ANNOUNCE, PAUSE, SETUP, TEARDOWN, "
>                               "RECORD\r\n", request.seq);
>     } else if (methodcode == TEARDOWN) {
> -        rt->state = RTSP_STATE_IDLE;
> +        rt->state = RTSP_STATE_TEARDOWN;
>         ret       = rtsp_send_reply(s, RTSP_STATUS_OK, NULL , request.seq);
>     }
>     return ret;
> -- 
> 2.25.1
>
Andriy Gelman Sept. 26, 2020, 9:24 p.m. UTC | #2
On Sun, 27. Sep 00:31, Zhao Zhili wrote:
> Ping for review, thanks.
> 
> > On Sep 9, 2020, at 12:10 AM, Zhao Zhili <quinkblack@foxmail.com> wrote:
> > 
> > sender:
> > ./ffmpeg -i test.mp4 -c copy -f rtsp -rtsp_transport udp  rtsp://localhost:12345/live.sdp
> > 
> > receiver:
> > ./ffmpeg_g -y -rtsp_flags listen -timeout 100 -i rtsp://localhost:12345/live.sdp -c copy test.mp4

Mention ticket 8840.

> > ---
> > libavformat/rtsp.c    | 2 ++
> > libavformat/rtsp.h    | 1 +
> > libavformat/rtspdec.c | 2 +-
> > 3 files changed, 4 insertions(+), 1 deletion(-)
> > 
> > diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
> > index 5d8491b74b..597413803f 100644
> > --- a/libavformat/rtsp.c
> > +++ b/libavformat/rtsp.c
> > @@ -2051,6 +2051,8 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
> >                 if ((ret = parse_rtsp_message(s)) < 0) {
> >                     return ret;
> >                 }
> > +                if (rt->state == RTSP_STATE_TEARDOWN)
> > +                    return AVERROR_EOF;
> >             }
> > #endif
> >         } else if (n == 0 && ++timeout_cnt >= MAX_TIMEOUTS) {
> > diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h
> > index 54a9a30c16..481cc0c3ce 100644
> > --- a/libavformat/rtsp.h
> > +++ b/libavformat/rtsp.h
> > @@ -198,6 +198,7 @@ enum RTSPClientState {
> >     RTSP_STATE_STREAMING, /**< initialized and sending/receiving data */
> >     RTSP_STATE_PAUSED,  /**< initialized, but not receiving data */
> >     RTSP_STATE_SEEKING, /**< initialized, requesting a seek */
> > +    RTSP_STATE_TEARDOWN,/**< initialized, in teardown state */
> > };
> > 
> > /**
> > diff --git a/libavformat/rtspdec.c b/libavformat/rtspdec.c
> > index dfa29913bf..ec786a469a 100644
> > --- a/libavformat/rtspdec.c
> > +++ b/libavformat/rtspdec.c
> > @@ -494,7 +494,7 @@ int ff_rtsp_parse_streaming_commands(AVFormatContext *s)
> >                               "Public: ANNOUNCE, PAUSE, SETUP, TEARDOWN, "
> >                               "RECORD\r\n", request.seq);
> >     } else if (methodcode == TEARDOWN) {
> > -        rt->state = RTSP_STATE_IDLE;
> > +        rt->state = RTSP_STATE_TEARDOWN;
> >         ret       = rtsp_send_reply(s, RTSP_STATUS_OK, NULL , request.seq);
> >     }
> >     return ret;
> > -- 
> > 2.25.1
> > 

Looks ok to me.
diff mbox series

Patch

diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 5d8491b74b..597413803f 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -2051,6 +2051,8 @@  static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
                 if ((ret = parse_rtsp_message(s)) < 0) {
                     return ret;
                 }
+                if (rt->state == RTSP_STATE_TEARDOWN)
+                    return AVERROR_EOF;
             }
 #endif
         } else if (n == 0 && ++timeout_cnt >= MAX_TIMEOUTS) {
diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h
index 54a9a30c16..481cc0c3ce 100644
--- a/libavformat/rtsp.h
+++ b/libavformat/rtsp.h
@@ -198,6 +198,7 @@  enum RTSPClientState {
     RTSP_STATE_STREAMING, /**< initialized and sending/receiving data */
     RTSP_STATE_PAUSED,  /**< initialized, but not receiving data */
     RTSP_STATE_SEEKING, /**< initialized, requesting a seek */
+    RTSP_STATE_TEARDOWN,/**< initialized, in teardown state */
 };
 
 /**
diff --git a/libavformat/rtspdec.c b/libavformat/rtspdec.c
index dfa29913bf..ec786a469a 100644
--- a/libavformat/rtspdec.c
+++ b/libavformat/rtspdec.c
@@ -494,7 +494,7 @@  int ff_rtsp_parse_streaming_commands(AVFormatContext *s)
                               "Public: ANNOUNCE, PAUSE, SETUP, TEARDOWN, "
                               "RECORD\r\n", request.seq);
     } else if (methodcode == TEARDOWN) {
-        rt->state = RTSP_STATE_IDLE;
+        rt->state = RTSP_STATE_TEARDOWN;
         ret       = rtsp_send_reply(s, RTSP_STATUS_OK, NULL , request.seq);
     }
     return ret;