mirror of https://git.ffmpeg.org/ffmpeg.git
tcp: Use a default timeout of 5 sec for opening a connection but not for receiving packets
This should be closer to how tcp behaved longer ago and should fix the issue with idle connections timing out. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
efa9e6b423
commit
68b7b534be
|
@ -34,6 +34,7 @@ typedef struct TCPContext {
|
||||||
const AVClass *class;
|
const AVClass *class;
|
||||||
int fd;
|
int fd;
|
||||||
int listen;
|
int listen;
|
||||||
|
int open_timeout;
|
||||||
int rw_timeout;
|
int rw_timeout;
|
||||||
int listen_timeout;
|
int listen_timeout;
|
||||||
} TCPContext;
|
} TCPContext;
|
||||||
|
@ -43,7 +44,7 @@ typedef struct TCPContext {
|
||||||
#define E AV_OPT_FLAG_ENCODING_PARAM
|
#define E AV_OPT_FLAG_ENCODING_PARAM
|
||||||
static const AVOption options[] = {
|
static const AVOption options[] = {
|
||||||
{"listen", "listen on port instead of connecting", OFFSET(listen), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, D|E },
|
{"listen", "listen on port instead of connecting", OFFSET(listen), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, D|E },
|
||||||
{"timeout", "timeout of socket i/o operations", OFFSET(rw_timeout), AV_OPT_TYPE_INT, {.i64 = 5000000}, 0, INT_MAX, D|E },
|
{"timeout", "timeout of socket i/o operations", OFFSET(rw_timeout), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, D|E },
|
||||||
{"listen_timeout", "connection awaiting timeout", OFFSET(listen_timeout), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, D|E },
|
{"listen_timeout", "connection awaiting timeout", OFFSET(listen_timeout), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, D|E },
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
@ -66,6 +67,7 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
|
||||||
int ret;
|
int ret;
|
||||||
char hostname[1024],proto[1024],path[1024];
|
char hostname[1024],proto[1024],path[1024];
|
||||||
char portstr[10];
|
char portstr[10];
|
||||||
|
s->open_timeout = 5000000;
|
||||||
|
|
||||||
av_url_split(proto, sizeof(proto), NULL, 0, hostname, sizeof(hostname),
|
av_url_split(proto, sizeof(proto), NULL, 0, hostname, sizeof(hostname),
|
||||||
&port, path, sizeof(path), uri);
|
&port, path, sizeof(path), uri);
|
||||||
|
@ -86,7 +88,10 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
|
||||||
s->listen_timeout = strtol(buf, NULL, 10);
|
s->listen_timeout = strtol(buf, NULL, 10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
h->rw_timeout = s->rw_timeout;
|
if (s->rw_timeout >= 0) {
|
||||||
|
s->open_timeout =
|
||||||
|
h->rw_timeout = s->rw_timeout;
|
||||||
|
}
|
||||||
hints.ai_family = AF_UNSPEC;
|
hints.ai_family = AF_UNSPEC;
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
snprintf(portstr, sizeof(portstr), "%d", port);
|
snprintf(portstr, sizeof(portstr), "%d", port);
|
||||||
|
@ -120,7 +125,7 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((ret = ff_listen_connect(fd, cur_ai->ai_addr, cur_ai->ai_addrlen,
|
if ((ret = ff_listen_connect(fd, cur_ai->ai_addr, cur_ai->ai_addrlen,
|
||||||
h->rw_timeout / 1000, h)) < 0) {
|
s->open_timeout / 1000, h)) < 0) {
|
||||||
|
|
||||||
if (ret == AVERROR_EXIT)
|
if (ret == AVERROR_EXIT)
|
||||||
goto fail1;
|
goto fail1;
|
||||||
|
|
Loading…
Reference in New Issue