libavformat/hls: add an option to start from a given segment in a live stream
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
81487781e7
commit
bcf44c91c3
@ -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 {
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user