[FFmpeg-devel] [PATCH 5/6] http: add 'timeout' AVOption
Andrey Utkin
andrey.krieger.utkin at gmail.com
Thu Sep 13 02:43:32 CEST 2012
This option is passed though to underlying tcp protocol context
---
libavformat/http.c | 20 ++++++++++++++++++--
1 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/libavformat/http.c b/libavformat/http.c
index 376ff9e..54b385b 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -57,6 +57,7 @@ typedef struct {
uint8_t *post_data;
int post_datalen;
int is_akamai;
+ int rw_timeout;
} HTTPContext;
#define OFFSET(x) offsetof(HTTPContext, x)
@@ -69,6 +70,7 @@ static const AVOption options[] = {
{"user-agent", "override User-Agent header", OFFSET(user_agent), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC},
{"multiple_requests", "use persistent connections", OFFSET(multiple_requests), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, D|E },
{"post_data", "custom HTTP post data", OFFSET(post_data), AV_OPT_TYPE_BINARY, .flags = D|E },
+{"timeout", "timeout of socket i/o operations", OFFSET(rw_timeout), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, D|E },
{NULL}
};
#define HTTP_CLASS(flavor)\
@@ -146,8 +148,15 @@ static int http_open_cnx(URLContext *h)
ff_url_join(buf, sizeof(buf), lower_proto, NULL, hostname, port, NULL);
if (!s->hd) {
+ AVDictionary *opts = NULL;
+ char opts_format[20];
+ if (s->rw_timeout != -1) {
+ snprintf(opts_format, sizeof(opts_format), "%d", s->rw_timeout);
+ av_dict_set(&opts, "timeout", opts_format, 0);
+ } /* if option is not given, don't pass it and let tcp use its own default */
err = ffurl_open(&s->hd, buf, AVIO_FLAG_READ_WRITE,
- &h->interrupt_callback, NULL);
+ &h->interrupt_callback, &opts);
+ av_dict_free(&opts);
if (err < 0)
goto fail;
}
@@ -698,6 +707,8 @@ static int http_proxy_open(URLContext *h, const char *uri, int flags)
HTTPAuthType cur_auth_type;
char *authstr;
int new_loc;
+ AVDictionary *opts = NULL;
+ char opts_format[20];
h->is_streamed = 1;
@@ -711,8 +722,13 @@ static int http_proxy_open(URLContext *h, const char *uri, int flags)
ff_url_join(lower_url, sizeof(lower_url), "tcp", NULL, hostname, port,
NULL);
redo:
+ if (s->rw_timeout != -1) {
+ snprintf(opts_format, sizeof(opts_format), "%d", s->rw_timeout);
+ av_dict_set(&opts, "timeout", opts_format, 0);
+ } /* if option is not given, don't pass it and let tcp use its own default */
ret = ffurl_open(&s->hd, lower_url, AVIO_FLAG_READ_WRITE,
- &h->interrupt_callback, NULL);
+ &h->interrupt_callback, &opts);
+ av_dict_free(&opts);
if (ret < 0)
return ret;
--
1.7.8.6
More information about the ffmpeg-devel
mailing list