@ -360,8 +360,15 @@ static int seg_write_header(AVFormatContext *s)
oc - > interrupt_callback = s - > interrupt_callback ;
seg - > avf = oc ;
oc - > streams = s - > streams ;
oc - > nb_streams = s - > nb_streams ;
for ( i = 0 ; i < s - > nb_streams ; i + + ) {
AVStream * st ;
if ( ! ( st = avformat_new_stream ( oc , NULL ) ) ) {
ret = AVERROR ( ENOMEM ) ;
goto fail ;
}
avcodec_copy_context ( st - > codec , s - > streams [ i ] - > codec ) ;
st - > sample_aspect_ratio = s - > streams [ i ] - > sample_aspect_ratio ;
}
if ( av_get_frame_filename ( oc - > filename , sizeof ( oc - > filename ) ,
s - > filename , seg - > segment_idx + + ) < 0 ) {
@ -381,11 +388,7 @@ static int seg_write_header(AVFormatContext *s)
fail :
if ( ret ) {
if ( oc ) {
oc - > streams = NULL ;
oc - > nb_streams = 0 ;
avformat_free_context ( oc ) ;
}
if ( seg - > list )
segment_list_close ( s ) ;
}
@ -396,7 +399,7 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
{
SegmentContext * seg = s - > priv_data ;
AVFormatContext * oc = seg - > avf ;
AVStream * st = oc - > streams [ pkt - > stream_index ] ;
AVStream * st = s - > streams [ pkt - > stream_index ] ;
int64_t end_pts ;
int ret ;
@ -424,12 +427,10 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
( double ) ( pkt - > pts + pkt - > duration ) * av_q2d ( st - > time_base ) ) ;
}
ret = oc - > oformat - > write_packet ( oc , pkt ) ;
ret = ff_write_chained ( oc , pkt - > stream_index , pkt , s ) ;
fail :
if ( ret < 0 ) {
oc - > streams = NULL ;
oc - > nb_streams = 0 ;
if ( seg - > list )
avio_close ( seg - > list_pb ) ;
avformat_free_context ( oc ) ;
@ -449,8 +450,6 @@ static int seg_write_trailer(struct AVFormatContext *s)
av_opt_free ( seg ) ;
av_freep ( & seg - > times ) ;
oc - > streams = NULL ;
oc - > nb_streams = 0 ;
avformat_free_context ( oc ) ;
return ret ;
}