[FFmpeg-devel] rtsp.c udp_read_packet() fails to return when stream ends, simple fix

Martin Storsjö martin
Wed Mar 24 19:44:46 CET 2010


Hi,

On Wed, 24 Mar 2010, Sam Gerstein wrote:

> I've seen this discussed here and there, but not submitted as a patch; it's
> simple enough that I'm proposing it, and hoping someone familiar with the
> module will review and comment.  This solution solves the problem I have,
> but I wonder if it would be problematic in case of, eg. a flaky connection.
> 
> The problem:
> when udp_read_packet calls select() to look for new data on its sockets, it
> only handles the case where some socket signals.  Non-positive return values
> from select() are ignored, ie. timeouts are ignored and the function
> continues to loop looking for data.
> 
> The trivial solution:
> {see patch below}
> 
> Questions:
> -Is there a case where we would like to continue looping when a timeout
> occurs?  a flaky connection?
>   - if so, how about making a fixed number of tries before giving up?
> -Should the timeout be adjusted from its current value of 100ms?

First and foremost - the timeout is used for rechecking url_interrupt_cb() 
regularly, so we can't increase it arbitrarily. Instead, an "end of 
stream" timeout could be checked separately from the select() timeout.

On to the actual probem - do you suggest that not receiving any RTP packet 
for x seconds should be interpreted as end of stream? What would be a 
suitable timeout for this? In order to handle non-perfect network 
conditions, I'd say this should be on the order of tens of seconds? But 
generally, this may be a good idea.

What's the proper way of signalling end of stream, by the way? A quick 
test with DSS here shows that the server sends a RTCP BYE packet and 
closed the RTSP control connection, but this happens only 50-100 seconds 
after the stream finished. An RTCP BYE packet can be missed of course, so 
some kind of timeout probably is a good fallback.

When using RTSP, the control connection may also timeout on the OS level, 
if the connection gets closed/broken, but a timeout for packets received 
may also be a good idea. And for a pure RTP stream initialized from a 
local SDP file, there's no control connection, so this would be needed 
indeed.

// Martin




More information about the ffmpeg-devel mailing list