mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-11 17:55:21 +00:00
avformat/hls: avoid unnecessary segment retrievals
Check if the playlist is still needed just before requesting the next segment instead of after exhausting the previous segment. Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
This commit is contained in:
parent
4e85202bcc
commit
d549b0910c
@ -963,14 +963,33 @@ static int read_data(void *opaque, uint8_t *buf, int buf_size)
|
|||||||
int ret, i;
|
int ret, i;
|
||||||
int just_opened = 0;
|
int just_opened = 0;
|
||||||
|
|
||||||
|
restart:
|
||||||
if (!v->needed)
|
if (!v->needed)
|
||||||
return AVERROR_EOF;
|
return AVERROR_EOF;
|
||||||
|
|
||||||
restart:
|
|
||||||
if (!v->input) {
|
if (!v->input) {
|
||||||
|
int64_t reload_interval;
|
||||||
|
|
||||||
|
/* Check that the playlist is still needed before opening a new
|
||||||
|
* segment. */
|
||||||
|
if (v->ctx && v->ctx->nb_streams &&
|
||||||
|
v->parent->nb_streams >= v->stream_offset + v->ctx->nb_streams) {
|
||||||
|
v->needed = 0;
|
||||||
|
for (i = v->stream_offset; i < v->stream_offset + v->ctx->nb_streams;
|
||||||
|
i++) {
|
||||||
|
if (v->parent->streams[i]->discard < AVDISCARD_ALL)
|
||||||
|
v->needed = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!v->needed) {
|
||||||
|
av_log(v->parent, AV_LOG_INFO, "No longer receiving playlist %d\n",
|
||||||
|
v->index);
|
||||||
|
return AVERROR_EOF;
|
||||||
|
}
|
||||||
|
|
||||||
/* If this is a live stream and the reload interval has elapsed since
|
/* If this is a live stream and the reload interval has elapsed since
|
||||||
* the last playlist reload, reload the playlists now. */
|
* the last playlist reload, reload the playlists now. */
|
||||||
int64_t reload_interval = default_reload_interval(v);
|
reload_interval = default_reload_interval(v);
|
||||||
|
|
||||||
reload:
|
reload:
|
||||||
if (!v->finished &&
|
if (!v->finished &&
|
||||||
@ -1029,20 +1048,6 @@ reload:
|
|||||||
c->end_of_segment = 1;
|
c->end_of_segment = 1;
|
||||||
c->cur_seq_no = v->cur_seq_no;
|
c->cur_seq_no = v->cur_seq_no;
|
||||||
|
|
||||||
if (v->ctx && v->ctx->nb_streams &&
|
|
||||||
v->parent->nb_streams >= v->stream_offset + v->ctx->nb_streams) {
|
|
||||||
v->needed = 0;
|
|
||||||
for (i = v->stream_offset; i < v->stream_offset + v->ctx->nb_streams;
|
|
||||||
i++) {
|
|
||||||
if (v->parent->streams[i]->discard < AVDISCARD_ALL)
|
|
||||||
v->needed = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!v->needed) {
|
|
||||||
av_log(v->parent, AV_LOG_INFO, "No longer receiving playlist %d\n",
|
|
||||||
v->index);
|
|
||||||
return AVERROR_EOF;
|
|
||||||
}
|
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user