[FFmpeg-devel] [PATCH v2 5/5] avformat/hls: add http_multiple option
Anssi Hannula
anssi.hannula at iki.fi
Sun Dec 17 22:53:03 EET 2017
Hi!
Aman Gupta kirjoitti 2017-12-13 02:35:
> From: Aman Gupta <aman at tmm1.net>
>
> This improves network throughput of the hls demuxer by avoiding
> the latency introduced by downloading segments one at a time.
>
> The problem is particularly noticable over high-latency network
> connections: for instance, if RTT is 250ms, there will a 250ms idle
> period between when one segment response is read and the next one
> starts.
>
> The obvious solution to this is to use HTTP pipelining, where a
> second request can be sent (on the persistent http/1.1 connection)
> before the first response is fully read. Unfortunately the way the
> http protocol is implemented in avformat makes implementing pipleining
> very complex.
>
> Instead, this commit simulates pipelining using two separate persistent
> http connections. This has the advantage of working independently of
> the http_persistent option, and can be used with http/1.0 servers as
> well. The pair of connections is swapped every time a new segment
> starts
> downloading, and a request for the next segment is sent on the
> secondary
> connection right away. This means the second response will be ready and
> waiting by the time the current response is fully read.
Thanks, seems like an OK idea and the code seems straight-forward.
Why is this a defaults-to-disabled option, instead of defaulting to
enabled or just not having an option at all?
I guess there may be a good reason, but I'd like to hear your thoughts
on that.
> ---
> doc/demuxers.texi | 3 +++
> libavformat/hls.c | 51
> ++++++++++++++++++++++++++++++++++++++++++++++++---
> 2 files changed, 51 insertions(+), 3 deletions(-)
>
> diff --git a/doc/demuxers.texi b/doc/demuxers.texi
> index 18ff7101ac..f2181fbb93 100644
> --- a/doc/demuxers.texi
> +++ b/doc/demuxers.texi
> @@ -319,6 +319,9 @@ Default value is 1000.
>
> @item http_persistent
> Use persistent HTTP connections. Applicable only for HTTP streams.
> +
> + at item http_multiple
> +Use multiple HTTP connections for downloading HTTP segments.
> @end table
>
> @section image2
> diff --git a/libavformat/hls.c b/libavformat/hls.c
> index f75c8f5eaa..487fa9a82f 100644
> --- a/libavformat/hls.c
> +++ b/libavformat/hls.c
[...]
> @@ -1426,11 +1440,20 @@ reload:
> if (ret)
> return ret;
>
> - ret = open_input(c, v, seg, &v->input);
> + if (c->http_multiple && v->input_next_requested) {
> + AVIOContext *tmp = v->input;
> + v->input = v->input_next;
> + v->input_next = tmp;
Use FFSWAP().
[...]
--
Anssi Hannula
More information about the ffmpeg-devel
mailing list