[FFmpeg-devel] [PATCH] avformat/rtsp: fix infinite loop with udp transport

Zhao Zhili quinkblack at foxmail.com
Sun Aug 30 06:50:54 EEST 2020



> On Aug 30, 2020, at 1:45 AM, Andriy Gelman <andriy.gelman at gmail.com> wrote:
> 
> Hi Zhao,
> 
> On Tue, 25. Aug 01:17, Zhao Zhili wrote:
>> Ping again.
>> 
>>> On Aug 17, 2020, at 8:05 AM, zhilizhao <quinkblack at foxmail.com> wrote:
>>> 
>>> Please help review the patch, thanks!
>>> 
>>>> On Aug 6, 2020, at 4:50 PM, quinkblack at foxmail.com wrote:
>>>> 
>>>> From: Zhao Zhili <quinkblack at foxmail.com>
>>>> 
>>>> User report: http://ffmpeg.org/pipermail/ffmpeg-user/2020-August/049494.html
>>>> 
>>>> server:
>>>> ./ffmpeg -i test.mp4 -c copy -f rtsp -rtsp_transport udp  rtsp://localhost:12345/live.sdp
>>>> 
>>>> client:
>>>> ./ffmpeg_g -y -rtsp_flags listen -timeout 100 -i rtsp://localhost:12345/live.sdp -c copy test.mp4
>>>> ---
>>>> libavformat/rtsp.c | 5 +++++
>>>> 1 file changed, 5 insertions(+)
>>>> 
>>>> diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
>>>> index 5d8491b74b..0fb9fde6b4 100644
>>>> --- a/libavformat/rtsp.c
>>>> +++ b/libavformat/rtsp.c
>>>> @@ -2051,6 +2051,11 @@ static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
>>>>               if ((ret = parse_rtsp_message(s)) < 0) {
>>>>                   return ret;
>>>>               }
>>>> +                /* Since there is no way to detect eof of udp streams, break
>>>> +                 * the loop in teardown state to prevent run into infinite.
>>>> +                 */
>>>> +                if (rt->state == RTSP_STATE_IDLE)
>>>> +                    return AVERROR_EOF;
>>>>           }
>>>> #endif
>>>>       } else if (n == 0 && ++timeout_cnt >= MAX_TIMEOUTS) {
> 
> Currently when the stream finishes a BYE message is not sent from the server.  
> 
> You can ensure that the message is sent by adding the send_bye option with the
> flag:
> "-rtpflags send_bye"
> 
> This will also fix the problem.

Thanks for your reply. It's a clean solution from the viewpoint of FFmpeg users.
However, I think FFmpeg should handle the case without BYE packets, even
without RTCP. The busy loop leads to high cpu usage. I'm not saying the patch
is the right solution, I'd like to hear other suggestions to fix the problem on the
rtsp receiver's side.

> 
> What I think is more confusing is that "-rtp_flags send_bye" is also valid on
> the command line but will have no effect..
> 
> -- 
> Andriy
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".



More information about the ffmpeg-devel mailing list