From bd840d4638c56c57744895c2155080225987083e Mon Sep 17 00:00:00 2001 From: BurroCargado Date: Thu, 5 May 2022 16:34:31 +0900 Subject: [PATCH 1/2] decoder/plugins/FFmpegDecoder: fix IsSeekable() AVFMTCTX_UNSEEKABLE signals the stream is not seekable according to FFmpeg source code description: https://github.com/FFmpeg/FFmpeg/blob/8e98dfc57fd05c49095dd964456a7acbb6da634c/libavformat/avformat.h#L1181 --- src/decoder/plugins/FfmpegDecoderPlugin.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/decoder/plugins/FfmpegDecoderPlugin.cxx b/src/decoder/plugins/FfmpegDecoderPlugin.cxx index f9915554a..773cf071a 100644 --- a/src/decoder/plugins/FfmpegDecoderPlugin.cxx +++ b/src/decoder/plugins/FfmpegDecoderPlugin.cxx @@ -471,7 +471,7 @@ static bool IsSeekable(const AVFormatContext &format_context) noexcept { #if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(58, 6, 100) - return (format_context.ctx_flags & AVFMTCTX_UNSEEKABLE) != 0; + return (format_context.ctx_flags & AVFMTCTX_UNSEEKABLE) == 0; #else (void)format_context; return false; From 11d1f56062cc6985228ef76fa9a046e2292217e3 Mon Sep 17 00:00:00 2001 From: BurroCargado Date: Sat, 7 May 2022 09:50:41 +0900 Subject: [PATCH 2/2] Fix seeking HLS on-demand streaming not working This issue occurs when playing HLS streaming delivered from a server that does not support partial requests. The issue is reproduced as follows(using Ubuntu 20.04 PC): 1. Prepare HLS example content. $ mkdir test $ ffmpeg -i example.flac -vn -c:a aac -b:a 128000 -f hls -hls_list_size 0 test/output.m3u8 (ffmpeg 4.2.4 is used) 2. Prepare web server without partial requests support. (Docker version 20.10.12 and NGINX official Docker image is used) $ docker run --name tmp-nginx-container -d nginx $ docker cp tmp-nginx-container:/etc/nginx/conf.d/default.conf . $ docker rm -f tmp-nginx-container Edit default.conf and add "max_ranges 0;" to "location / {...}". This disables partial requests support, removes 'Accept-Ranges: bytes' header from the server response. Then, run the server: $ docker run --name test-nginx -v $PWD/test:/usr/share/nginx/html:ro -v $PWD/default.conf:/etc/nginx/conf.d/default.conf -d -p 8080:80 nginx 3. Setup MPD to Play the next URL. http://address-of-the-server:8080/output.m3u8 Seeking this stream results in "exception: Not seekable". --- src/decoder/plugins/FfmpegDecoderPlugin.cxx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/decoder/plugins/FfmpegDecoderPlugin.cxx b/src/decoder/plugins/FfmpegDecoderPlugin.cxx index 773cf071a..d575a6eb1 100644 --- a/src/decoder/plugins/FfmpegDecoderPlugin.cxx +++ b/src/decoder/plugins/FfmpegDecoderPlugin.cxx @@ -533,9 +533,8 @@ FfmpegDecode(DecoderClient &client, InputStream *input, : FromFfmpegTimeChecked(format_context.duration, AV_TIME_BASE_Q); client.Ready(audio_format, - input - ? input->IsSeekable() - : IsSeekable(format_context), + (input ? input->IsSeekable() : false) + || IsSeekable(format_context), total_time); FfmpegParseMetaData(client, format_context, audio_stream);