+ assert(hls);
+
+ /* */
+ int segment_duration = -1;
+ do
+ {
+ /* Next line */
+ line = ReadLine(p_begin, &p_read, p_end - p_begin);
+ if (line == NULL)
+ break;
+ p_begin = p_read;
+
+ if (strncmp(line, "#EXTINF", 7) == 0)
+ err = parse_SegmentInformation(hls, line, &segment_duration);
+ else if (strncmp(line, "#EXT-X-TARGETDURATION", 21) == 0)
+ err = parse_TargetDuration(s, hls, line);
+ else if (strncmp(line, "#EXT-X-MEDIA-SEQUENCE", 21) == 0)
+ err = parse_MediaSequence(s, hls, line);
+ else if (strncmp(line, "#EXT-X-KEY", 10) == 0)
+ err = parse_Key(s, hls, line);
+ else if (strncmp(line, "#EXT-X-PROGRAM-DATE-TIME", 24) == 0)
+ err = parse_ProgramDateTime(s, hls, line);
+ else if (strncmp(line, "#EXT-X-ALLOW-CACHE", 18) == 0)
+ err = parse_AllowCache(s, hls, line);
+ else if (strncmp(line, "#EXT-X-DISCONTINUITY", 20) == 0)
+ err = parse_Discontinuity(s, hls, line);
+ else if (strncmp(line, "#EXT-X-VERSION", 14) == 0)
+ err = parse_Version(s, hls, line);
+ else if (strncmp(line, "#EXT-X-ENDLIST", 14) == 0)
+ err = parse_EndList(s, hls);
+ else if ((strncmp(line, "#", 1) != 0) && (*line != '\0') )
+ {
+ err = parse_AddSegment(s, hls, segment_duration, line);
+ segment_duration = -1; /* reset duration */
+ }
+
+ free(line);
+ line = NULL;
+
+ if (p_begin >= p_end)
+ break;
+
+ } while ((err == VLC_SUCCESS) && vlc_object_alive(s));
+
+ free(line);
+ }
+
+ return err;
+}
+
+static int get_HTTPLiveMetaPlaylist(stream_t *s, vlc_array_t **streams)
+{
+ stream_sys_t *p_sys = s->p_sys;
+ assert(*streams);
+
+ /* Download new playlist file from server */
+ uint8_t *buffer = NULL;
+ ssize_t len = read_M3U8_from_url(s, &p_sys->m3u8, &buffer);
+ if (len < 0)
+ return VLC_EGENERIC;