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.tags/n4.0
@@ -15,6 +15,9 @@ libavutil: 2017-10-21 | |||||
API changes, most recent first: | 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 | 2018-xx-xx - xxxxxxx - lavu 56.9.100 - aes_ctr.h | ||||
Add method to set the 16-byte IV. | Add method to set the 16-byte IV. | ||||
@@ -1275,6 +1275,11 @@ typedef struct AVProgram { | |||||
#define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present | #define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present | ||||
(streams are added dynamically) */ | (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 { | typedef struct AVChapter { | ||||
int id; ///< unique ID to identify the chapter | int id; ///< unique ID to identify the chapter | ||||
@@ -930,6 +930,11 @@ fail: | |||||
av_free(new_url); | av_free(new_url); | ||||
if (close_in) | if (close_in) | ||||
ff_format_io_close(c->ctx, &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; | return ret; | ||||
} | } | ||||
@@ -2213,8 +2218,7 @@ static int hls_read_seek(AVFormatContext *s, int stream_index, | |||||
int stream_subdemuxer_index; | int stream_subdemuxer_index; | ||||
int64_t first_timestamp, seek_timestamp, duration; | 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); | return AVERROR(ENOSYS); | ||||
first_timestamp = c->first_timestamp == AV_NOPTS_VALUE ? | first_timestamp = c->first_timestamp == AV_NOPTS_VALUE ? | ||||
@@ -32,8 +32,8 @@ | |||||
// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) | // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) | ||||
// Also please add any ticket numbers that you believe might be affected here | // Also please add any ticket numbers that you believe might be affected here | ||||
#define LIBAVFORMAT_VERSION_MAJOR 58 | #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, \ | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | ||||
LIBAVFORMAT_VERSION_MINOR, \ | LIBAVFORMAT_VERSION_MINOR, \ | ||||