@ -76,7 +76,23 @@ static int write_packet(Muxer *mux, OutputStream *ost, AVPacket *pkt)
if ( ost - > type = = AVMEDIA_TYPE_VIDEO & & ost - > vsync_method = = VSYNC_DROP )
pkt - > pts = pkt - > dts = AV_NOPTS_VALUE ;
av_packet_rescale_ts ( pkt , pkt - > time_base , ost - > st - > time_base ) ;
// rescale timestamps to the stream timebase
if ( ost - > type = = AVMEDIA_TYPE_AUDIO & & ! ost - > enc ) {
// use av_rescale_delta() for streamcopying audio, to preserve
// accuracy with coarse input timebases
int duration = av_get_audio_frame_duration2 ( ost - > st - > codecpar , pkt - > size ) ;
if ( ! duration )
duration = ost - > st - > codecpar - > frame_size ;
pkt - > dts = av_rescale_delta ( pkt - > time_base , pkt - > dts ,
( AVRational ) { 1 , ost - > st - > codecpar - > sample_rate } , duration ,
& ms - > ts_rescale_delta_last , ost - > st - > time_base ) ;
pkt - > pts = pkt - > dts ;
pkt - > duration = av_rescale_q ( pkt - > duration , pkt - > time_base , ost - > st - > time_base ) ;
} else
av_packet_rescale_ts ( pkt , pkt - > time_base , ost - > st - > time_base ) ;
pkt - > time_base = ost - > st - > time_base ;
if ( ! ( s - > oformat - > flags & AVFMT_NOTIMESTAMPS ) ) {
@ -392,7 +408,7 @@ int of_streamcopy(OutputStream *ost, const AVPacket *pkt, int64_t dts)
OutputFile * of = output_files [ ost - > file_index ] ;
MuxStream * ms = ms_from_ost ( ost ) ;
int64_t start_time = ( of - > start_time = = AV_NOPTS_VALUE ) ? 0 : of - > start_time ;
int64_t ost_tb_start_time = av_rescale_q ( start_time , AV_TIME_BASE_Q , ost - > mux_timebase ) ;
int64_t ts_offset ;
AVPacket * opkt = ms - > pkt ;
int ret ;
@ -425,27 +441,17 @@ int of_streamcopy(OutputStream *ost, const AVPacket *pkt, int64_t dts)
if ( ret < 0 )
return ret ;
opkt - > time_base = os t- > mux_ timebase;
ts_offset = av_rescale_q ( start_time , AV_TIME_BASE_Q , opk t- > time_ base ) ;
if ( pkt - > pts ! = AV_NOPTS_VALUE )
opkt - > pts = av_rescale_q ( pkt - > pts , pkt - > time_base , opkt - > time_base ) - ost_tb_start_time ;
opkt - > pts - = ts_offset ;
if ( pkt - > dts = = AV_NOPTS_VALUE ) {
opkt - > dts = av_rescale_q ( dts , AV_TIME_BASE_Q , opkt - > time_base ) ;
} else if ( ost - > st - > codecpar - > codec_type = = AVMEDIA_TYPE_AUDIO ) {
int duration = av_get_audio_frame_duration2 ( ost - > par_in , pkt - > size ) ;
if ( ! duration )
duration = ost - > par_in - > frame_size ;
opkt - > dts = av_rescale_delta ( pkt - > time_base , pkt - > dts ,
( AVRational ) { 1 , ost - > par_in - > sample_rate } , duration ,
& ms - > ts_rescale_delta_last , opkt - > time_base ) ;
/* dts will be set immediately afterwards to what pts is now */
opkt - > pts = opkt - > dts - ost_tb_start_time ;
} else
opkt - > dts = av_rescale_q ( pkt - > dts , pkt - > time_base , opkt - > time_base ) ;
opkt - > dts - = ost_tb_start_time ;
opkt - > duration = av_rescale_q ( pkt - > duration , pkt - > time_base , opkt - > time_base ) ;
opkt - > pts = opkt - > dts - ts_offset ;
}
opkt - > dts - = ts_offset ;
{
int ret = trigger_fix_sub_duration_heartbeat ( ost , pkt ) ;
@ -511,10 +517,6 @@ static int thread_start(Muxer *mux)
MuxStream * ms = ms_from_ost ( ost ) ;
AVPacket * pkt ;
/* try to improve muxing time_base (only possible if nothing has been written yet) */
if ( ! av_fifo_can_read ( ms - > muxing_queue ) )
ost - > mux_timebase = ost - > st - > time_base ;
while ( av_fifo_read ( ms - > muxing_queue , & pkt , 1 ) > = 0 ) {
ret = thread_submit_packet ( mux , ost , pkt ) ;
if ( pkt ) {