avformat/hlsenc: improve to write m3u8 head block
Signed-off-by: Steven Liu <lq@chinaffmpeg.org>
This commit is contained in:
		
							parent
							
								
									25f4f08ba5
								
							
						
					
					
						commit
						1033f56b07
					
				@ -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);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user