From cc20762ec30e3021b4593fb89c681f5000ddb1fe Mon Sep 17 00:00:00 2001
From: Tim Hunt <tnhunt@gmail.com>
Date: Thu, 13 Apr 2017 15:35:07 +0100
Subject: [PATCH] avformat/hls allow playback of variant streams when some
missing
ticket #2617
---
libavformat/hls.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
@@ -1611,7 +1611,7 @@ static int hls_read_header(AVFormatContext *s)
void *u = (s->flags & AVFMT_FLAG_CUSTOM_IO) ? NULL : s->pb;
HLSContext *c = s->priv_data;
int ret = 0, i;
- int highest_cur_seq_no = 0;
+ int highest_cur_seq_no = 0, found_segments;
c->ctx = s;
c->interrupt_callback = &s->interrupt_callback;
@@ -1652,14 +1652,20 @@ static int hls_read_header(AVFormatContext *s)
/* If the playlist only contained playlists (Master Playlist),
* parse each individual playlist. */
if (c->n_playlists > 1 || c->playlists[0]->n_segments == 0) {
+ found_segments = -1;
+
for (i = 0; i < c->n_playlists; i++) {
struct playlist *pls = c->playlists[i];
- if ((ret = parse_playlist(c, pls->url, pls, NULL)) < 0)
- goto fail;
+ if (parse_playlist(c, pls->url, pls, NULL) == 0 && pls->n_segments > 0)
+ found_segments = 1;
}
- }
- if (c->variants[0]->playlists[0]->n_segments == 0) {
+ if(found_segments == -1) {
+ av_log(NULL, AV_LOG_WARNING, "Empty playlist\n");
+ ret = AVERROR_EOF;
+ goto fail;
+ }
+ } else if (c->variants[0]->playlists[0]->n_segments == 0) {
av_log(NULL, AV_LOG_WARNING, "Empty playlist\n");
ret = AVERROR_EOF;
goto fail;
@@ -1805,7 +1811,6 @@ static int hls_read_header(AVFormatContext *s)
}
update_noheader_flag(s);
-
return 0;
fail:
hls_close(s);
--
2.7.4