Commit 6194d7e5 authored by wm4's avatar wm4

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.
parent 637dfa39
...@@ -15,6 +15,9 @@ libavutil: 2017-10-21 ...@@ -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 { ...@@ -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: ...@@ -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, ...@@ -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) || if ((flags & AVSEEK_FLAG_BYTE) || (c->ctx->ctx_flags & AVFMTCTX_UNSEEKABLE))
!(c->variants[0]->playlists[0]->finished || c->variants[0]->playlists[0]->type == PLS_TYPE_EVENT))
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 @@ ...@@ -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_MINOR 6
#define LIBAVFORMAT_VERSION_MICRO 101 #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, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment