|
|
|
@ -660,6 +660,19 @@ static void set_http_options(AVDictionary **options, HLSContext *c) |
|
|
|
|
av_dict_set(options, "method", c->method, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void write_m3u8_head_block(HLSContext *hls, AVIOContext *out, int version, |
|
|
|
|
int target_duration, int64_t sequence) |
|
|
|
|
{ |
|
|
|
|
avio_printf(out, "#EXTM3U\n"); |
|
|
|
|
avio_printf(out, "#EXT-X-VERSION:%d\n", version); |
|
|
|
|
if (hls->allowcache == 0 || hls->allowcache == 1) { |
|
|
|
|
avio_printf(out, "#EXT-X-ALLOW-CACHE:%s\n", hls->allowcache == 0 ? "NO" : "YES"); |
|
|
|
|
} |
|
|
|
|
avio_printf(out, "#EXT-X-TARGETDURATION:%d\n", target_duration); |
|
|
|
|
avio_printf(out, "#EXT-X-MEDIA-SEQUENCE:%"PRId64"\n", sequence); |
|
|
|
|
av_log(hls, AV_LOG_VERBOSE, "EXT-X-MEDIA-SEQUENCE:%"PRId64"\n", sequence); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int hls_window(AVFormatContext *s, int last) |
|
|
|
|
{ |
|
|
|
|
HLSContext *hls = s->priv_data; |
|
|
|
@ -699,21 +712,13 @@ static int hls_window(AVFormatContext *s, int last) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
hls->discontinuity_set = 0; |
|
|
|
|
avio_printf(out, "#EXTM3U\n"); |
|
|
|
|
avio_printf(out, "#EXT-X-VERSION:%d\n", version); |
|
|
|
|
if (hls->allowcache == 0 || hls->allowcache == 1) { |
|
|
|
|
avio_printf(out, "#EXT-X-ALLOW-CACHE:%s\n", hls->allowcache == 0 ? "NO" : "YES"); |
|
|
|
|
} |
|
|
|
|
avio_printf(out, "#EXT-X-TARGETDURATION:%d\n", target_duration); |
|
|
|
|
avio_printf(out, "#EXT-X-MEDIA-SEQUENCE:%"PRId64"\n", sequence); |
|
|
|
|
write_m3u8_head_block(hls, out, version, target_duration, sequence); |
|
|
|
|
if (hls->pl_type == PLAYLIST_TYPE_EVENT) { |
|
|
|
|
avio_printf(out, "#EXT-X-PLAYLIST-TYPE:EVENT\n"); |
|
|
|
|
} else if (hls->pl_type == PLAYLIST_TYPE_VOD) { |
|
|
|
|
avio_printf(out, "#EXT-X-PLAYLIST-TYPE:VOD\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
av_log(s, AV_LOG_VERBOSE, "EXT-X-MEDIA-SEQUENCE:%"PRId64"\n", |
|
|
|
|
sequence); |
|
|
|
|
if((hls->flags & HLS_DISCONT_START) && sequence==hls->start_sequence && hls->discontinuity_set==0 ){ |
|
|
|
|
avio_printf(out, "#EXT-X-DISCONTINUITY\n"); |
|
|
|
|
hls->discontinuity_set = 1; |
|
|
|
@ -775,16 +780,7 @@ static int hls_window(AVFormatContext *s, int last) |
|
|
|
|
if( hls->vtt_m3u8_name ) { |
|
|
|
|
if ((ret = s->io_open(s, &sub_out, hls->vtt_m3u8_name, AVIO_FLAG_WRITE, &options)) < 0) |
|
|
|
|
goto fail; |
|
|
|
|
avio_printf(sub_out, "#EXTM3U\n"); |
|
|
|
|
avio_printf(sub_out, "#EXT-X-VERSION:%d\n", version); |
|
|
|
|
if (hls->allowcache == 0 || hls->allowcache == 1) { |
|
|
|
|
avio_printf(sub_out, "#EXT-X-ALLOW-CACHE:%s\n", hls->allowcache == 0 ? "NO" : "YES"); |
|
|
|
|
} |
|
|
|
|
avio_printf(sub_out, "#EXT-X-TARGETDURATION:%d\n", target_duration); |
|
|
|
|
avio_printf(sub_out, "#EXT-X-MEDIA-SEQUENCE:%"PRId64"\n", sequence); |
|
|
|
|
|
|
|
|
|
av_log(s, AV_LOG_VERBOSE, "EXT-X-MEDIA-SEQUENCE:%"PRId64"\n", |
|
|
|
|
sequence); |
|
|
|
|
write_m3u8_head_block(hls, sub_out, version, target_duration, sequence); |
|
|
|
|
|
|
|
|
|
for (en = hls->segments; en; en = en->next) { |
|
|
|
|
avio_printf(sub_out, "#EXTINF:%f,\n", en->duration); |
|
|
|
|