diff options
author | Aman Gupta <aman@tmm1.net> | 2017-12-25 20:37:55 -0800 |
---|---|---|
committer | Aman Gupta <aman@tmm1.net> | 2017-12-26 14:53:19 -0800 |
commit | 1dd82edea5ab689f9a94e14cb2cf6d382cbf9ee6 (patch) | |
tree | 9219d44099cae636f80a858bc85ab549c6b0dbc3 | |
parent | 039007c928b4207b8bdde31c80c57dc7b917dd2f (diff) | |
download | ffmpeg-1dd82edea5ab689f9a94e14cb2cf6d382cbf9ee6.tar.gz |
avformat/hls: enable http_multiple only for http/1.1 servers
Some http/1.0 implementations, like python's SimpleHTTPServer, can only support one client connection at a time. Making a second request while the first is still connected leads to a deadlock.
This change enables multiple connections for http/1.1 servers only, which need to support keepalive by default and should have no problem with concurrent requests.
Signed-off-by: Aman Gupta <aman@tmm1.net>
-rw-r--r-- | doc/demuxers.texi | 2 | ||||
-rw-r--r-- | libavformat/hls.c | 13 |
2 files changed, 11 insertions, 4 deletions
diff --git a/doc/demuxers.texi b/doc/demuxers.texi index 81ab399cdc..6080167233 100644 --- a/doc/demuxers.texi +++ b/doc/demuxers.texi @@ -323,7 +323,7 @@ Enabled by default. @item http_multiple Use multiple HTTP connections for downloading HTTP segments. -Enabled by default. +Enabled by default for HTTP/1.1 servers. @end table @section image2 diff --git a/libavformat/hls.c b/libavformat/hls.c index 2d46c2ac69..dccc7c7dd2 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -1452,7 +1452,7 @@ reload: if (ret) return ret; - if (c->http_multiple && av_strstart(seg->url, "http", NULL) && v->input_next_requested) { + if (c->http_multiple == 1 && v->input_next_requested) { FFSWAP(AVIOContext *, v->input, v->input_next); v->input_next_requested = 0; ret = 0; @@ -1471,8 +1471,15 @@ reload: just_opened = 1; } + if (c->http_multiple == -1) { + uint8_t *http_version_opt = NULL; + av_opt_get(v->input, "http_version", AV_OPT_SEARCH_CHILDREN, &http_version_opt); + c->http_multiple = http_version_opt && strncmp((const char *)http_version_opt, "1.1", 3) == 0; + } + seg = next_segment(v); - if (c->http_multiple && !v->input_next_requested && seg) { + if (c->http_multiple == 1 && !v->input_next_requested && + seg && av_strstart(seg->url, "http", NULL)) { ret = open_input(c, v, seg, &v->input_next); if (ret < 0) { if (ff_check_interrupt(c->interrupt_callback)) @@ -2306,7 +2313,7 @@ static const AVOption hls_options[] = { {"http_persistent", "Use persistent HTTP connections", OFFSET(http_persistent), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS }, {"http_multiple", "Use multiple HTTP connections for fetching segments", - OFFSET(http_multiple), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS}, + OFFSET(http_multiple), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, FLAGS}, {NULL} }; |