+ /* */
+ 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(hls, segment_duration, line);
+ segment_duration = -1; /* reset duration */
+ }
+
+ free(line);
+ line = NULL;
+
+ if (p_begin >= p_end)
+ break;
+
+ } while (err == VLC_SUCCESS);