Opened 3 years ago

Last modified 3 years ago

#4929 new defect

RTSP protocol not sending TEARDOWN packet

Reported by: nadenislamarre Owned by:
Priority: normal Component: avformat
Version: git-master Keywords: rtsp
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

Summary of the bug:
When a client close a rtsp connexion, it is supposed to send the TEARDOWN packet according to
https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol
ffmpeg doesn't (controlled by wireshark), while i guess it worked at a given time while the code to do it is inside ffmpeg.

In short, because my tv provider allows only 1 channel at a time, i've to wait 30 seconds between each channel change.
Below, you'll find more detail, and a not perfect but working patch to show the problem more in detail.

How to reproduce:

% ffplay 'rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=201&flavour=ld'
ffmpeg version : git version

The attached file is not really a patch while it's not the good way to fix.
However, it works in my case.
The thing is that

rtsp::read_close function
containing ff_rtsp_send_cmd_async(s, "TEARDOWN", rt->control_uri, NULL);

is called after

is->abort_request = 1;
SDL_WaitThread(is->read_tid, NULL);

and at the end, the packet is never sent.
To quickly and badly fix, i've added a preclose function called before the sdl_waitthread.

Attachments (1)

nae.patch (3.8 KB) - added by nadenislamarre 3 years ago.
ffplay preclose function for tearing down rtsp

Download all attachments as: .zip

Change History (3)

Changed 3 years ago by nadenislamarre

ffplay preclose function for tearing down rtsp

comment:1 Changed 3 years ago by cehoyos

  • Component changed from avcodec to avformat
  • Keywords rtsp added; TEARDOWN RTSP removed
  • Priority changed from important to normal

Please send your patch to the development mailing list, patches are ignored on this bug tracker.

comment:2 Changed 3 years ago by nadenislamarre

in the lowest network function, there is a test : "if (ff_check_interrupt(int_cb))" which make things not working

i can : or remove this check, but i think that it could be usefull for something else, or

add a parameter "force" to low network functions, but it touches the network.c of ffmpeg, so i guess you would not accept it easily
the thing is that testing if the user requesting to quit in this function it not valid with the fact that rtsp protocol require network packet sending at the disconnection.

Comment these 2 lines in libavformat/avio.c & libavformat/network.c fixes the problem :

if (ff_check_interrupt(&h->interrupt_callback))

return AVERROR_EXIT;

Note: See TracTickets for help on using tickets.