diff --git a/libavformat/hls.c b/libavformat/hls.c index af890bd4ad..4a7d003f72 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -165,6 +165,7 @@ struct variant { }; typedef struct HLSContext { + AVClass *class; int n_variants; struct variant **variants; int n_playlists; @@ -173,6 +174,7 @@ typedef struct HLSContext { struct rendition **renditions; int cur_seq_no; + int live_start_index; int first_packet; int64_t first_timestamp; int64_t cur_timestamp; @@ -1237,10 +1239,12 @@ static int select_cur_seq_no(HLSContext *c, struct playlist *pls) * require us to download a segment to inspect its timestamps. */ return c->cur_seq_no; - /* If this is a live stream with more than 3 segments, start at the - * third last segment. */ - if (pls->n_segments > 3) - return pls->start_seq_no + pls->n_segments - 3; + /* If this is a live stream, start live_start_index segments from the + * start or end */ + if (c->live_start_index < 0) + return pls->start_seq_no + FFMAX(pls->n_segments + c->live_start_index, 0); + else + return pls->start_seq_no + FFMIN(c->live_start_index, pls->n_segments - 1); } /* Otherwise just start on the first segment. */ @@ -1714,9 +1718,25 @@ static int hls_probe(AVProbeData *p) return 0; } +#define OFFSET(x) offsetof(HLSContext, x) +#define FLAGS AV_OPT_FLAG_DECODING_PARAM +static const AVOption hls_options[] = { + {"live_start_index", "segment index to start live streams at (negative values are from the end)", + OFFSET(live_start_index), FF_OPT_TYPE_INT, {.i64 = -3}, INT_MIN, INT_MAX, FLAGS}, + {NULL} +}; + +static const AVClass hls_class = { + .class_name = "hls,applehttp", + .item_name = av_default_item_name, + .option = hls_options, + .version = LIBAVUTIL_VERSION_INT, +}; + AVInputFormat ff_hls_demuxer = { .name = "hls,applehttp", .long_name = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"), + .priv_class = &hls_class, .priv_data_size = sizeof(HLSContext), .read_probe = hls_probe, .read_header = hls_read_header,