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.
pull/277/head
wm4 7 years ago
parent 637dfa3942
commit 6194d7e564
  1. 3
      doc/APIchanges
  2. 5
      libavformat/avformat.h
  3. 8
      libavformat/hls.c
  4. 4
      libavformat/version.h

@ -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.

@ -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

@ -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 ?

@ -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, \

Loading…
Cancel
Save