From 6194d7e56454897b9c5d9d52e82376b2a6e6b85c Mon Sep 17 00:00:00 2001 From: wm4 Date: Wed, 24 Jan 2018 08:02:25 +0100 Subject: [PATCH] avformat, hls: add a flag to signal unavailability of seeking The seek function can just return an error if seeking is unavailable, but often this is too late. Add a flag that signals that the stream is unseekable, and use it in HLS. --- doc/APIchanges | 3 +++ libavformat/avformat.h | 5 +++++ libavformat/hls.c | 8 ++++++-- libavformat/version.h | 4 ++-- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index c27f104c95..59e3b20c08 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,9 @@ libavutil: 2017-10-21 API changes, most recent first: +2018-01-xx - xxxxxxx - lavf 58.6.100 - avformat.h + Add AVFMTCTX_UNSEEKABLE (for HLS demuxer). + 2018-xx-xx - xxxxxxx - lavu 56.9.100 - aes_ctr.h Add method to set the 16-byte IV. diff --git a/libavformat/avformat.h b/libavformat/avformat.h index e5740be2b4..60ab9fbc80 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1275,6 +1275,11 @@ typedef struct AVProgram { #define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present (streams are added dynamically) */ +#define AVFMTCTX_UNSEEKABLE 0x0002 /**< signal that the stream is definitely + not seekable, and attempts to call the + seek function will fail. For some + network protocols (e.g. HLS), this can + change dynamically at runtime. */ typedef struct AVChapter { int id; ///< unique ID to identify the chapter diff --git a/libavformat/hls.c b/libavformat/hls.c index ff7bdecc93..6e1a2e3f1e 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -930,6 +930,11 @@ fail: av_free(new_url); if (close_in) ff_format_io_close(c->ctx, &in); + c->ctx->ctx_flags = c->ctx->ctx_flags & ~(unsigned)AVFMTCTX_UNSEEKABLE; + if (!c->n_variants || !c->variants[0]->n_playlists || + !(c->variants[0]->playlists[0]->finished || + c->variants[0]->playlists[0]->type == PLS_TYPE_EVENT)) + c->ctx->ctx_flags |= AVFMTCTX_UNSEEKABLE; return ret; } @@ -2213,8 +2218,7 @@ static int hls_read_seek(AVFormatContext *s, int stream_index, int stream_subdemuxer_index; int64_t first_timestamp, seek_timestamp, duration; - if ((flags & AVSEEK_FLAG_BYTE) || - !(c->variants[0]->playlists[0]->finished || c->variants[0]->playlists[0]->type == PLS_TYPE_EVENT)) + if ((flags & AVSEEK_FLAG_BYTE) || (c->ctx->ctx_flags & AVFMTCTX_UNSEEKABLE)) return AVERROR(ENOSYS); first_timestamp = c->first_timestamp == AV_NOPTS_VALUE ? diff --git a/libavformat/version.h b/libavformat/version.h index 148fc75faa..5ff8a89ae0 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,8 +32,8 @@ // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 58 -#define LIBAVFORMAT_VERSION_MINOR 5 -#define LIBAVFORMAT_VERSION_MICRO 101 +#define LIBAVFORMAT_VERSION_MINOR 6 +#define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \