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:
Anssi Hannula 2013-12-30 11:40:20 +02:00
parent 4e85202bcc
commit d549b0910c

View File

@ -963,14 +963,33 @@ static int read_data(void *opaque, uint8_t *buf, int buf_size)
int ret, i;
int just_opened = 0;
restart:
if (!v->needed)
return AVERROR_EOF;
restart:
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
* the last playlist reload, reload the playlists now. */
int64_t reload_interval = default_reload_interval(v);
reload_interval = default_reload_interval(v);
reload:
if (!v->finished &&
@ -1029,20 +1048,6 @@ reload:
c->end_of_segment = 1;
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;
}