Commit bcf44c91 authored by Rodger Combs's avatar Rodger Combs Committed by Michael Niedermayer

libavformat/hls: add an option to start from a given segment in a live stream

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 81487781
...@@ -165,6 +165,7 @@ struct variant { ...@@ -165,6 +165,7 @@ struct variant {
}; };
typedef struct HLSContext { typedef struct HLSContext {
AVClass *class;
int n_variants; int n_variants;
struct variant **variants; struct variant **variants;
int n_playlists; int n_playlists;
...@@ -173,6 +174,7 @@ typedef struct HLSContext { ...@@ -173,6 +174,7 @@ typedef struct HLSContext {
struct rendition **renditions; struct rendition **renditions;
int cur_seq_no; int cur_seq_no;
int live_start_index;
int first_packet; int first_packet;
int64_t first_timestamp; int64_t first_timestamp;
int64_t cur_timestamp; int64_t cur_timestamp;
...@@ -1237,10 +1239,12 @@ static int select_cur_seq_no(HLSContext *c, struct playlist *pls) ...@@ -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. */ * require us to download a segment to inspect its timestamps. */
return c->cur_seq_no; return c->cur_seq_no;
/* If this is a live stream with more than 3 segments, start at the /* If this is a live stream, start live_start_index segments from the
* third last segment. */ * start or end */
if (pls->n_segments > 3) if (c->live_start_index < 0)
return pls->start_seq_no + pls->n_segments - 3; 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. */ /* Otherwise just start on the first segment. */
...@@ -1714,9 +1718,25 @@ static int hls_probe(AVProbeData *p) ...@@ -1714,9 +1718,25 @@ static int hls_probe(AVProbeData *p)
return 0; 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 = { AVInputFormat ff_hls_demuxer = {
.name = "hls,applehttp", .name = "hls,applehttp",
.long_name = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"), .long_name = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"),
.priv_class = &hls_class,
.priv_data_size = sizeof(HLSContext), .priv_data_size = sizeof(HLSContext),
.read_probe = hls_probe, .read_probe = hls_probe,
.read_header = hls_read_header, .read_header = hls_read_header,
......
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