@ -669,12 +669,28 @@ static void close_all_output_streams(OutputStream *ost, OSTFinished this_stream,
}
}
static void write_packet ( OutputFile * of , AVPacket * pkt , OutputStream * ost )
static void write_packet ( OutputFile * of , AVPacket * pkt , OutputStream * ost , int unqueue )
{
AVFormatContext * s = of - > ctx ;
AVStream * st = ost - > st ;
int ret ;
/*
* Audio encoders may split the packets - - # frames in ! = # packets out .
* But there is no reordering , so we can limit the number of output packets
* by simply dropping them here .
* Counting encoded video frames needs to be done separately because of
* reordering , see do_video_out ( ) .
* Do not count the packet when unqueued because it has been counted when queued .
*/
if ( ! ( st - > codecpar - > codec_type = = AVMEDIA_TYPE_VIDEO & & ost - > encoding_needed ) & & ! unqueue ) {
if ( ost - > frame_number > = ost - > max_frames ) {
av_packet_unref ( pkt ) ;
return ;
}
ost - > frame_number + + ;
}
if ( ! of - > header_written ) {
AVPacket tmp_pkt = { 0 } ;
/* the muxer is not initialized yet, buffer the packet */
@ -703,20 +719,6 @@ static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost)
( st - > codecpar - > codec_type = = AVMEDIA_TYPE_AUDIO & & audio_sync_method < 0 ) )
pkt - > pts = pkt - > dts = AV_NOPTS_VALUE ;
/*
* Audio encoders may split the packets - - # frames in ! = # packets out .
* But there is no reordering , so we can limit the number of output packets
* by simply dropping them here .
* Counting encoded video frames needs to be done separately because of
* reordering , see do_video_out ( )
*/
if ( ! ( st - > codecpar - > codec_type = = AVMEDIA_TYPE_VIDEO & & ost - > encoding_needed ) ) {
if ( ost - > frame_number > = ost - > max_frames ) {
av_packet_unref ( pkt ) ;
return ;
}
ost - > frame_number + + ;
}
if ( st - > codecpar - > codec_type = = AVMEDIA_TYPE_VIDEO ) {
int i ;
uint8_t * sd = av_packet_get_side_data ( pkt , AV_PKT_DATA_QUALITY_STATS ,
@ -861,10 +863,10 @@ static void output_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost)
goto finish ;
idx + + ;
} else
write_packet ( of , pkt , ost ) ;
write_packet ( of , pkt , ost , 0 ) ;
}
} else
write_packet ( of , pkt , ost ) ;
write_packet ( of , pkt , ost , 0 ) ;
finish :
if ( ret < 0 & & ret ! = AVERROR_EOF ) {
@ -2972,7 +2974,7 @@ static int check_init_output_file(OutputFile *of, int file_index)
while ( av_fifo_size ( ost - > muxing_queue ) ) {
AVPacket pkt ;
av_fifo_generic_read ( ost - > muxing_queue , & pkt , sizeof ( pkt ) , NULL ) ;
write_packet ( of , & pkt , ost ) ;
write_packet ( of , & pkt , ost , 1 ) ;
}
}