@ -691,6 +691,17 @@ static void write_m3u8_head_block(HLSContext *hls, AVIOContext *out, int version
av_log ( hls , AV_LOG_VERBOSE , " EXT-X-MEDIA-SEQUENCE:% " PRId64 " \n " , sequence ) ;
}
static void hls_rename_temp_file ( AVFormatContext * s , AVFormatContext * oc )
{
size_t len = strlen ( oc - > filename ) ;
char final_filename [ sizeof ( oc - > filename ) ] ;
av_strlcpy ( final_filename , oc - > filename , len ) ;
final_filename [ len - 4 ] = ' \0 ' ;
ff_rename ( oc - > filename , final_filename , s ) ;
oc - > filename [ len - 4 ] = ' \0 ' ;
}
static int hls_window ( AVFormatContext * s , int last )
{
HLSContext * hls = s - > priv_data ;
@ -833,15 +844,6 @@ static int hls_start(AVFormatContext *s)
char * filename , iv_string [ KEYSIZE * 2 + 1 ] ;
int err = 0 ;
if ( ( c - > flags & HLS_TEMP_FILE ) & & oc - > filename [ 0 ] ! = 0 ) {
size_t len = strlen ( oc - > filename ) ;
char final_filename [ sizeof ( oc - > filename ) ] ;
av_strlcpy ( final_filename , oc - > filename , len ) ;
final_filename [ len - 4 ] = ' \0 ' ;
ff_rename ( oc - > filename , final_filename , s ) ;
oc - > filename [ len - 4 ] = ' \0 ' ;
}
if ( c - > flags & HLS_SINGLE_FILE ) {
av_strlcpy ( oc - > filename , c - > basename ,
sizeof ( oc - > filename ) ) ;
@ -1325,6 +1327,17 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
new_start_pos = avio_tell ( hls - > avf - > pb ) ;
hls - > size = new_start_pos - hls - > start_pos ;
if ( ( hls - > flags & HLS_TEMP_FILE ) & & oc - > filename [ 0 ] ) {
if ( ! ( hls - > flags & HLS_SINGLE_FILE ) | | ( hls - > max_seg_size < = 0 ) )
if ( hls - > avf - > oformat - > priv_class & & hls - > avf - > priv_data )
av_opt_set ( hls - > avf - > priv_data , " mpegts_flags " , " resend_headers " , 0 ) ;
ff_format_io_close ( s , & oc - > pb ) ;
if ( hls - > vtt_avf )
ff_format_io_close ( s , & hls - > vtt_avf - > pb ) ;
hls_rename_temp_file ( s , oc ) ;
}
ret = hls_append_segment ( s , hls , hls - > duration , hls - > start_pos , hls - > size ) ;
hls - > start_pos = new_start_pos ;
if ( ret < 0 ) {
@ -1336,21 +1349,14 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
hls - > duration = 0 ;
if ( hls - > flags & HLS_SINGLE_FILE ) {
if ( hls - > avf - > oformat - > priv_class & & hls - > avf - > priv_data )
av_opt_set ( hls - > avf - > priv_data , " mpegts_flags " , " resend_headers " , 0 ) ;
hls - > number + + ;
} else if ( hls - > max_seg_size > 0 ) {
if ( hls - > avf - > oformat - > priv_class & & hls - > avf - > priv_data )
av_opt_set ( hls - > avf - > priv_data , " mpegts_flags " , " resend_headers " , 0 ) ;
if ( hls - > start_pos > = hls - > max_seg_size ) {
hls - > sequence + + ;
ff_format_io_close ( s , & oc - > pb ) ;
if ( ( hls - > flags & ( HLS_SECOND_LEVEL_SEGMENT_SIZE | HLS_SECOND_LEVEL_SEGMENT_DURATION ) ) & &
strlen ( hls - > current_segment_final_filename_fmt ) ) {
ff_rename ( old_filename , hls - > avf - > filename , hls ) ;
}
if ( hls - > vtt_avf )
ff_format_io_close ( s , & hls - > vtt_avf - > pb ) ;
ret = hls_start ( s ) ;
hls - > start_pos = 0 ;
/* When split segment by byte, the duration is short than hls_time,
@ -1359,13 +1365,10 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
}
hls - > number + + ;
} else {
ff_format_io_close ( s , & oc - > pb ) ;
if ( ( hls - > flags & ( HLS_SECOND_LEVEL_SEGMENT_SIZE | HLS_SECOND_LEVEL_SEGMENT_DURATION ) ) & &
strlen ( hls - > current_segment_final_filename_fmt ) ) {
ff_rename ( old_filename , hls - > avf - > filename , hls ) ;
}
if ( hls - > vtt_avf )
ff_format_io_close ( s , & hls - > vtt_avf - > pb ) ;
ret = hls_start ( s ) ;
}
@ -1402,6 +1405,11 @@ static int hls_write_trailer(struct AVFormatContext *s)
if ( oc - > pb ) {
hls - > size = avio_tell ( hls - > avf - > pb ) - hls - > start_pos ;
ff_format_io_close ( s , & oc - > pb ) ;
if ( ( hls - > flags & HLS_TEMP_FILE ) & & oc - > filename [ 0 ] ) {
hls_rename_temp_file ( s , oc ) ;
}
/* after av_write_trailer, then duration + 1 duration per packet */
hls_append_segment ( s , hls , hls - > duration + hls - > dpp , hls - > start_pos , hls - > size ) ;
}
@ -1411,15 +1419,6 @@ static int hls_write_trailer(struct AVFormatContext *s)
ff_rename ( old_filename , hls - > avf - > filename , hls ) ;
}
if ( ( hls - > flags & HLS_TEMP_FILE ) & & oc - > filename [ 0 ] ! = 0 ) {
size_t len = strlen ( oc - > filename ) ;
char final_filename [ sizeof ( oc - > filename ) ] ;
av_strlcpy ( final_filename , oc - > filename , len ) ;
final_filename [ len - 4 ] = ' \0 ' ;
ff_rename ( oc - > filename , final_filename , s ) ;
oc - > filename [ len - 4 ] = ' \0 ' ;
}
if ( vtt_oc ) {
if ( vtt_oc - > pb )
av_write_trailer ( vtt_oc ) ;