@ -88,6 +88,7 @@ typedef enum HLSFlags {
HLS_SECOND_LEVEL_SEGMENT_SIZE = ( 1 < < 10 ) , // include segment size (bytes) in segment filenames when use_localtime e.g.: %%014s
HLS_SECOND_LEVEL_SEGMENT_SIZE = ( 1 < < 10 ) , // include segment size (bytes) in segment filenames when use_localtime e.g.: %%014s
HLS_TEMP_FILE = ( 1 < < 11 ) ,
HLS_TEMP_FILE = ( 1 < < 11 ) ,
HLS_PERIODIC_REKEY = ( 1 < < 12 ) ,
HLS_PERIODIC_REKEY = ( 1 < < 12 ) ,
HLS_INDEPENDENT_SEGMENTS = ( 1 < < 13 ) ,
} HLSFlags ;
} HLSFlags ;
typedef enum {
typedef enum {
@ -1190,6 +1191,10 @@ static int hls_window(AVFormatContext *s, int last, VariantStream *vs)
sequence = 0 ;
sequence = 0 ;
}
}
if ( hls - > flags & HLS_INDEPENDENT_SEGMENTS ) {
hls - > version = 6 ;
}
if ( hls - > segment_type = = SEGMENT_TYPE_FMP4 ) {
if ( hls - > segment_type = = SEGMENT_TYPE_FMP4 ) {
hls - > version = 7 ;
hls - > version = 7 ;
}
}
@ -1219,6 +1224,9 @@ static int hls_window(AVFormatContext *s, int last, VariantStream *vs)
avio_printf ( out , " #EXT-X-DISCONTINUITY \n " ) ;
avio_printf ( out , " #EXT-X-DISCONTINUITY \n " ) ;
vs - > discontinuity_set = 1 ;
vs - > discontinuity_set = 1 ;
}
}
if ( vs - > has_video & & ( hls - > flags & HLS_INDEPENDENT_SEGMENTS ) ) {
avio_printf ( out , " #EXT-X-INDEPENDENT-SEGMENTS \n " ) ;
}
for ( en = vs - > segments ; en ; en = en - > next ) {
for ( en = vs - > segments ; en ; en = en - > next ) {
if ( ( hls - > encrypt | | hls - > key_info_file ) & & ( ! key_uri | | strcmp ( en - > key_uri , key_uri ) | |
if ( ( hls - > encrypt | | hls - > key_info_file ) & & ( ! key_uri | | strcmp ( en - > key_uri , key_uri ) | |
av_strcasecmp ( en - > iv_string , iv_string ) ) ) {
av_strcasecmp ( en - > iv_string , iv_string ) ) ) {
@ -1731,6 +1739,14 @@ static int hls_write_header(AVFormatContext *s)
vs - > start_pts = AV_NOPTS_VALUE ;
vs - > start_pts = AV_NOPTS_VALUE ;
vs - > current_segment_final_filename_fmt [ 0 ] = ' \0 ' ;
vs - > current_segment_final_filename_fmt [ 0 ] = ' \0 ' ;
if ( hls - > flags & HLS_SPLIT_BY_TIME & & hls - > flags & HLS_INDEPENDENT_SEGMENTS ) {
// Independent segments cannot be guaranteed when splitting by time
hls - > flags & = ~ HLS_INDEPENDENT_SEGMENTS ;
av_log ( s , AV_LOG_WARNING ,
" 'split_by_time' and 'independent_segments' cannot be enabled together. "
" Disabling 'independent_segments' flag \n " ) ;
}
if ( hls - > flags & HLS_PROGRAM_DATE_TIME ) {
if ( hls - > flags & HLS_PROGRAM_DATE_TIME ) {
time_t now0 ;
time_t now0 ;
time ( & now0 ) ;
time ( & now0 ) ;
@ -2322,6 +2338,7 @@ static const AVOption options[] = {
{ " second_level_segment_duration " , " include segment duration in segment filenames when use_localtime " , 0 , AV_OPT_TYPE_CONST , { . i64 = HLS_SECOND_LEVEL_SEGMENT_DURATION } , 0 , UINT_MAX , E , " flags " } ,
{ " second_level_segment_duration " , " include segment duration in segment filenames when use_localtime " , 0 , AV_OPT_TYPE_CONST , { . i64 = HLS_SECOND_LEVEL_SEGMENT_DURATION } , 0 , UINT_MAX , E , " flags " } ,
{ " second_level_segment_size " , " include segment size in segment filenames when use_localtime " , 0 , AV_OPT_TYPE_CONST , { . i64 = HLS_SECOND_LEVEL_SEGMENT_SIZE } , 0 , UINT_MAX , E , " flags " } ,
{ " second_level_segment_size " , " include segment size in segment filenames when use_localtime " , 0 , AV_OPT_TYPE_CONST , { . i64 = HLS_SECOND_LEVEL_SEGMENT_SIZE } , 0 , UINT_MAX , E , " flags " } ,
{ " periodic_rekey " , " reload keyinfo file periodically for re-keying " , 0 , AV_OPT_TYPE_CONST , { . i64 = HLS_PERIODIC_REKEY } , 0 , UINT_MAX , E , " flags " } ,
{ " periodic_rekey " , " reload keyinfo file periodically for re-keying " , 0 , AV_OPT_TYPE_CONST , { . i64 = HLS_PERIODIC_REKEY } , 0 , UINT_MAX , E , " flags " } ,
{ " independent_segments " , " add EXT-X-INDEPENDENT-SEGMENTS, whenever applicable " , 0 , AV_OPT_TYPE_CONST , { . i64 = HLS_INDEPENDENT_SEGMENTS } , 0 , UINT_MAX , E , " flags " } ,
{ " use_localtime " , " set filename expansion with strftime at segment creation " , OFFSET ( use_localtime ) , AV_OPT_TYPE_BOOL , { . i64 = 0 } , 0 , 1 , E } ,
{ " use_localtime " , " set filename expansion with strftime at segment creation " , OFFSET ( use_localtime ) , AV_OPT_TYPE_BOOL , { . i64 = 0 } , 0 , 1 , E } ,
{ " use_localtime_mkdir " , " create last directory component in strftime-generated filename " , OFFSET ( use_localtime_mkdir ) , AV_OPT_TYPE_BOOL , { . i64 = 0 } , 0 , 1 , E } ,
{ " use_localtime_mkdir " , " create last directory component in strftime-generated filename " , OFFSET ( use_localtime_mkdir ) , AV_OPT_TYPE_BOOL , { . i64 = 0 } , 0 , 1 , E } ,
{ " hls_playlist_type " , " set the HLS playlist type " , OFFSET ( pl_type ) , AV_OPT_TYPE_INT , { . i64 = PLAYLIST_TYPE_NONE } , 0 , PLAYLIST_TYPE_NB - 1 , E , " pl_type " } ,
{ " hls_playlist_type " , " set the HLS playlist type " , OFFSET ( pl_type ) , AV_OPT_TYPE_INT , { . i64 = PLAYLIST_TYPE_NONE } , 0 , PLAYLIST_TYPE_NB - 1 , E , " pl_type " } ,