mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-12-12 18:10:13 +01:00
fftools/ffmpeg_mux: stop rescaling timestamps in of_streamcopy()
This function converts packet timestamps from the input stream timebase to OutputStream.mux_timebase, which may or may not be equal to the actual output AVStream timebase (and even when it is, this may not always be the optimal choice due to bitstream filtering). Just keep the timestamps in input stream timebase, they will be rescaled as needed before bitstream filtering and/or sending the packet to the muxer. Move the av_rescale_delta() call for audio (needed to preserve accuracy with coarse demuxer timebases) to write_packet. Drop now-unused OutputStream.mux_timebase.
This commit is contained in:
@@ -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 = ost->mux_timebase;
|
||||
ts_offset = av_rescale_q(start_time, AV_TIME_BASE_Q, opkt->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) {
|
||||
|
||||
Reference in New Issue
Block a user