Commit 4e0860e3 authored by Steven Liu's avatar Steven Liu

avformat/hls: continue to play enabled playlist when have failed playlist

fix ticket: 7811
Signed-off-by: 's avatarSteven Liu <lq@chinaffmpeg.org>
parent cc614660
...@@ -116,6 +116,7 @@ struct playlist { ...@@ -116,6 +116,7 @@ struct playlist {
int n_segments; int n_segments;
struct segment **segments; struct segment **segments;
int needed; int needed;
int broken;
int cur_seq_no; int cur_seq_no;
int64_t cur_seg_offset; int64_t cur_seg_offset;
int64_t last_load_time; int64_t last_load_time;
...@@ -1815,15 +1816,21 @@ static int hls_read_header(AVFormatContext *s) ...@@ -1815,15 +1816,21 @@ static int hls_read_header(AVFormatContext *s)
if (c->n_playlists > 1 || c->playlists[0]->n_segments == 0) { if (c->n_playlists > 1 || c->playlists[0]->n_segments == 0) {
for (i = 0; i < c->n_playlists; i++) { for (i = 0; i < c->n_playlists; i++) {
struct playlist *pls = c->playlists[i]; struct playlist *pls = c->playlists[i];
if ((ret = parse_playlist(c, pls->url, pls, NULL)) < 0) if ((ret = parse_playlist(c, pls->url, pls, NULL)) < 0) {
av_log(s, AV_LOG_WARNING, "parse_playlist error %s [%s]\n", av_err2str(ret), pls->url);
pls->broken = 1;
if (c->n_playlists > 1)
continue;
goto fail; goto fail;
}
} }
} }
if (c->variants[0]->playlists[0]->n_segments == 0) { for (i = 0; i < c->n_variants; i++) {
av_log(s, AV_LOG_WARNING, "Empty segment\n"); if (c->variants[i]->playlists[0]->n_segments == 0) {
ret = AVERROR_EOF; av_log(s, AV_LOG_WARNING, "Empty segment [%s]\n", c->variants[i]->playlists[0]->url);
goto fail; c->variants[i]->playlists[0]->broken = 1;
}
} }
/* If this isn't a live stream, calculate the total duration of the /* If this isn't a live stream, calculate the total duration of the
...@@ -1994,6 +2001,9 @@ static int recheck_discard_flags(AVFormatContext *s, int first) ...@@ -1994,6 +2001,9 @@ static int recheck_discard_flags(AVFormatContext *s, int first)
cur_needed = playlist_needed(c->playlists[i]); cur_needed = playlist_needed(c->playlists[i]);
if (pls->broken) {
continue;
}
if (cur_needed && !pls->needed) { if (cur_needed && !pls->needed) {
pls->needed = 1; pls->needed = 1;
changed = 1; changed = 1;
......
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