Opened 6 years ago

Closed 5 years ago

#653 closed defect (fixed)

ffplay freezes every 30 seconds when playing rtsp stream with authentication

Reported by: imbens Owned by:
Priority: normal Component: undetermined
Version: unspecified Keywords:
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

Using ffplay on Win32 I am trying to play an h264 rtsp stream from an Axis camera. ffplay freezes for approx. 2 seconds every 30 seconds. When looking at the stack av_get_random_seed seems the culprit.
Every 30 seconds ffplay wants to send a keep-alive message. ff_rtsp_send_cmd_with_content_async calls ff_http_auth_create_response. ff_http_auth_create_response calls make_digest_auth. make_digest_auth calls av_get_random_seed. av_get_random_seed calls get_generic_seed. It looks like get_generic_seed takes approx. 1 second to complete.

Change History (7)

comment:1 Changed 6 years ago by reimar

That seems not surprising, with the low clock precision in Windows that probably can take some time.
Calling timeBeginPeriod(1); somewhere might improve things, but is a hack.
The proper solution would be trying to dynamically load and use SystemFunction036 (aka RtlGenRandom?) from advapi32.dll:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa387694%28v=vs.85%29.aspx

comment:2 Changed 6 years ago by michael

that may help getting seeds quicker but idependant of this
no code should call the seed function ad infinitum
it rather should call it to get a seed and use this to seed a PRNG, secure or insecure one depending on the need.

comment:3 follow-up: Changed 6 years ago by reimar

There is no such thing as a "secure PRNG", particularly those in lavu have a laughably small state and without regular re-seeding are not suitable even for hash-based authentication IMO.
Plus, it is used relatively rarely in normal use cases.
Thus I consider the code correct in using that function.

comment:4 Changed 6 years ago by reimar

Forgot to say: even a more suitable PRNG would be not much of a help, you'd still have to initialize the state.
A 50 second startup delay can hardly be considered any less broken than a 2 second hang every 30 seconds.
A different solution is of course to generate the keep-alive asynchronous from a separate thread, but that seems quite messy.

comment:5 in reply to: ↑ 3 Changed 6 years ago by michael

Replying to reimar:

There is no such thing as a "secure PRNG", particularly those in lavu have a laughably small state and without regular re-seeding are not suitable even for hash-based authentication IMO.

I wonder if you dont maybe overestimate the security of concatenating 2 32bit seeds of my generic seed generator compared to a better seeded SHA1 based PRNG.

comment:6 Changed 6 years ago by michael

Of course if you can get strong random numbers quickly on all supported platforms then calling the seed function every 30seconds is no problem.

comment:7 Changed 5 years ago by michael

  • Resolution set to fixed
  • Status changed from new to closed

This should have been fixed by Martin Storsjö in 1093383d6cf7112d54b849e29c739e957d157b25

Note: See TracTickets for help on using tickets.