0
0
mirror of https://github.com/mpv-player/mpv.git synced 2024-09-20 03:52:22 +02:00

stream_lavf: set --network-timeout to 60 seconds by default

Until now, we've made FFmpeg use the default network timeout - which is
apparently infinite. I don't know if this was changed at some point,
although it seems likely, as I was sure there was a more useful default.

For most use cases, a smaller timeout is more useful (for example
recording something in the background), so force a timeout of 1 minute.

See: #5793
This commit is contained in:
wm4 2019-11-14 13:46:03 +01:00
parent ac7f67b3f2
commit 5a99015acf
4 changed files with 23 additions and 12 deletions

View File

@ -4280,9 +4280,10 @@ Network
Specify a referrer path or URL for HTTP requests.
``--network-timeout=<seconds>``
Specify the network timeout in seconds. This affects at least HTTP. The
special value 0 (default) uses the FFmpeg/Libav defaults. If a protocol
is used which does not support timeouts, this option is silently ignored.
Specify the network timeout in seconds (default: 60 seconds). This affects
at least HTTP. The special value 0 uses the FFmpeg/Libav defaults. If a
protocol is used which does not support timeouts, this option is silently
ignored.
.. warning::
@ -4291,8 +4292,10 @@ Network
option accept different units (seconds instead of microseconds, causing
mpv to pass it huge values), it will also overflow FFmpeg internal
calculations. The worst is that merely setting the option will put RTSP
into listening mode, which breaks any client uses. Do not use this
option with RTSP URLs.
into listening mode, which breaks any client uses. At time of this
writing, the fix was not made effective yet. For this reason, this
option is ignored (or should be ignored) on RTSP URLs. You can still
set the timeout option directly with ``--demuxer-lavf-o``.
``--rtsp-transport=<lavf|udp|tcp|http>``
Select RTSP transport method (default: tcp). This selects the underlying

View File

@ -925,7 +925,8 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
AVDictionary *dopts = NULL;
if ((priv->avif_flags & AVFMT_NOFILE) || priv->format_hack.no_stream) {
mp_setup_av_network_options(&dopts, demuxer->global, demuxer->log);
mp_setup_av_network_options(&dopts, priv->avif->name,
demuxer->global, demuxer->log);
// This might be incorrect.
demuxer->seekable = true;
} else {

View File

@ -243,6 +243,7 @@ char *mp_file_get_path(void *talloc_ctx, bstr url);
// stream_lavf.c
struct AVDictionary;
void mp_setup_av_network_options(struct AVDictionary **dict,
const char *target_fmt,
struct mpv_global *global,
struct mp_log *log);

View File

@ -69,6 +69,7 @@ const struct m_sub_options stream_lavf_conf = {
.size = sizeof(struct stream_lavf_params),
.defaults = &(const struct stream_lavf_params){
.useragent = (char *)mpv_version,
.timeout = 60,
},
};
@ -180,8 +181,8 @@ static int interrupt_cb(void *ctx)
static const char * const prefix[] = { "lavf://", "ffmpeg://" };
void mp_setup_av_network_options(AVDictionary **dict, struct mpv_global *global,
struct mp_log *log)
void mp_setup_av_network_options(AVDictionary **dict, const char *target_fmt,
struct mpv_global *global, struct mp_log *log)
{
void *temp = talloc_new(NULL);
struct stream_lavf_params *opts =
@ -220,10 +221,15 @@ void mp_setup_av_network_options(AVDictionary **dict, struct mpv_global *global,
av_dict_set(dict, "headers", cust_headers, 0);
av_dict_set(dict, "icy", "1", 0);
// So far, every known protocol uses microseconds for this
// Except rtsp.
if (opts->timeout > 0) {
char buf[80];
snprintf(buf, sizeof(buf), "%lld", (long long)(opts->timeout * 1e6));
av_dict_set(dict, "timeout", buf, 0);
if (target_fmt && strcmp(target_fmt, "rtsp") == 0) {
mp_verbose(log, "Broken FFmpeg RTSP API => not setting timeout.\n");
} else {
char buf[80];
snprintf(buf, sizeof(buf), "%lld", (long long)(opts->timeout * 1e6));
av_dict_set(dict, "timeout", buf, 0);
}
}
if (opts->http_proxy && opts->http_proxy[0])
av_dict_set(dict, "http_proxy", opts->http_proxy, 0);
@ -292,7 +298,7 @@ static int open_f(stream_t *stream)
av_dict_set(&dict, "reconnect", "1", 0);
av_dict_set(&dict, "reconnect_delay_max", "7", 0);
mp_setup_av_network_options(&dict, stream->global, stream->log);
mp_setup_av_network_options(&dict, NULL, stream->global, stream->log);
AVIOInterruptCB cb = {
.callback = interrupt_cb,