|
|
|
@ -111,7 +111,7 @@ struct playlist { |
|
|
|
|
int start_seq_no; |
|
|
|
|
int n_segments; |
|
|
|
|
struct segment **segments; |
|
|
|
|
int needed, cur_needed; |
|
|
|
|
int needed; |
|
|
|
|
int cur_seq_no; |
|
|
|
|
int64_t cur_seg_offset; |
|
|
|
|
int64_t last_load_time; |
|
|
|
@ -1258,11 +1258,31 @@ static int64_t default_reload_interval(struct playlist *pls) |
|
|
|
|
pls->target_duration; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int playlist_needed(struct playlist *pls) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
/* If there is no context or streams yet, the playlist is needed */ |
|
|
|
|
if (!pls->ctx || !pls->n_main_streams) |
|
|
|
|
return 1; |
|
|
|
|
|
|
|
|
|
/* check if any of the streams in the playlist are needed */ |
|
|
|
|
for (i = 0; i < pls->n_main_streams; i++) { |
|
|
|
|
if (pls->main_streams[i]->discard < AVDISCARD_ALL) { |
|
|
|
|
/* some stream needed => playlist needed */ |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* No streams were needed */ |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int read_data(void *opaque, uint8_t *buf, int buf_size) |
|
|
|
|
{ |
|
|
|
|
struct playlist *v = opaque; |
|
|
|
|
HLSContext *c = v->parent->priv_data; |
|
|
|
|
int ret, i; |
|
|
|
|
int ret; |
|
|
|
|
int just_opened = 0; |
|
|
|
|
int reload_count = 0; |
|
|
|
|
|
|
|
|
@ -1276,15 +1296,8 @@ restart: |
|
|
|
|
|
|
|
|
|
/* Check that the playlist is still needed before opening a new
|
|
|
|
|
* segment. */ |
|
|
|
|
if (v->ctx && v->ctx->nb_streams) { |
|
|
|
|
v->needed = 0; |
|
|
|
|
for (i = 0; i < v->n_main_streams; i++) { |
|
|
|
|
if (v->main_streams[i]->discard < AVDISCARD_ALL) { |
|
|
|
|
v->needed = 1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
v->needed = playlist_needed(v); |
|
|
|
|
|
|
|
|
|
if (!v->needed) { |
|
|
|
|
av_log(v->parent, AV_LOG_INFO, "No longer receiving playlist %d\n", |
|
|
|
|
v->index); |
|
|
|
@ -1841,20 +1854,15 @@ static int recheck_discard_flags(AVFormatContext *s, int first) |
|
|
|
|
{ |
|
|
|
|
HLSContext *c = s->priv_data; |
|
|
|
|
int i, changed = 0; |
|
|
|
|
int cur_needed; |
|
|
|
|
|
|
|
|
|
/* Check if any new streams are needed */ |
|
|
|
|
for (i = 0; i < c->n_playlists; i++) |
|
|
|
|
c->playlists[i]->cur_needed = 0; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < s->nb_streams; i++) { |
|
|
|
|
AVStream *st = s->streams[i]; |
|
|
|
|
struct playlist *pls = c->playlists[s->streams[i]->id]; |
|
|
|
|
if (st->discard < AVDISCARD_ALL) |
|
|
|
|
pls->cur_needed = 1; |
|
|
|
|
} |
|
|
|
|
for (i = 0; i < c->n_playlists; i++) { |
|
|
|
|
struct playlist *pls = c->playlists[i]; |
|
|
|
|
if (pls->cur_needed && !pls->needed) { |
|
|
|
|
|
|
|
|
|
cur_needed = playlist_needed(c->playlists[i]); |
|
|
|
|
|
|
|
|
|
if (cur_needed && !pls->needed) { |
|
|
|
|
pls->needed = 1; |
|
|
|
|
changed = 1; |
|
|
|
|
pls->cur_seq_no = select_cur_seq_no(c, pls); |
|
|
|
@ -1866,7 +1874,7 @@ static int recheck_discard_flags(AVFormatContext *s, int first) |
|
|
|
|
pls->seek_stream_index = -1; |
|
|
|
|
} |
|
|
|
|
av_log(s, AV_LOG_INFO, "Now receiving playlist %d, segment %d\n", i, pls->cur_seq_no); |
|
|
|
|
} else if (first && !pls->cur_needed && pls->needed) { |
|
|
|
|
} else if (first && !cur_needed && pls->needed) { |
|
|
|
|
if (pls->input) |
|
|
|
|
ff_format_io_close(pls->parent, &pls->input); |
|
|
|
|
pls->needed = 0; |
|
|
|
|