diff options
author | Anton Khirnov <anton@khirnov.net> | 2022-08-10 10:44:30 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2022-08-13 12:41:05 +0200 |
commit | 274c8d58820b1bdf6ac6a51ae7f1a040da2bf96f (patch) | |
tree | 60d4703fa4a15e79ddfd7fed0bff7e8d9971a67f | |
parent | 86e9cef77ba8a1481a6b83fd73638f24b645bdb4 (diff) | |
download | ffmpeg-274c8d58820b1bdf6ac6a51ae7f1a040da2bf96f.tar.gz |
fftools/ffmpeg: pre-compute the streamcopy start pts before transcoding starts
InputFile.ts_offset can change during transcoding, due to discontinuity
correction. This should not affect the streamcopy starting timestamp.
Cf. bf2590aed3e64d44a5e2430fdbe89f91f5e55bfe
-rw-r--r-- | fftools/ffmpeg.c | 17 | ||||
-rw-r--r-- | fftools/ffmpeg.h | 6 |
2 files changed, 18 insertions, 5 deletions
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 2e04b2ae81..97db61c251 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -1879,12 +1879,9 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p return; if (!ost->streamcopy_started && !ost->copy_prior_start) { - int64_t comp_start = start_time; - if (copy_ts && f->start_time != AV_NOPTS_VALUE) - comp_start = FFMAX(start_time, f->start_time + f->ts_offset); if (pkt->pts == AV_NOPTS_VALUE ? - ist->pts < comp_start : - pkt->pts < av_rescale_q(comp_start, AV_TIME_BASE_Q, ist->st->time_base)) + ist->pts < ost->ts_copy_start : + pkt->pts < av_rescale_q(ost->ts_copy_start, AV_TIME_BASE_Q, ist->st->time_base)) return; } @@ -2741,6 +2738,7 @@ static int init_output_stream_streamcopy(OutputStream *ost) { OutputFile *of = output_files[ost->file_index]; InputStream *ist = get_input_stream(ost); + InputFile *ifile = input_files[ist->file_index]; AVCodecParameters *par = ost->st->codecpar; AVCodecContext *codec_ctx; AVRational sar; @@ -2805,6 +2803,15 @@ static int init_output_stream_streamcopy(OutputStream *ost) if (ost->st->duration <= 0 && ist->st->duration > 0) ost->st->duration = av_rescale_q(ist->st->duration, ist->st->time_base, ost->st->time_base); + if (!ost->copy_prior_start) { + ost->ts_copy_start = (of->start_time == AV_NOPTS_VALUE) ? + 0 : of->start_time; + if (copy_ts && ifile->start_time != AV_NOPTS_VALUE) { + ost->ts_copy_start = FFMAX(ost->ts_copy_start, + ifile->start_time + ifile->ts_offset); + } + } + if (ist->st->nb_side_data) { for (i = 0; i < ist->st->nb_side_data; i++) { const AVPacketSideData *sd_src = &ist->st->side_data[i]; diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 2ac7cbe522..8b2e73d642 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -484,6 +484,12 @@ typedef struct OutputStream { int64_t last_mux_dts; /* pts of the last frame received from the filters, in AV_TIME_BASE_Q */ int64_t last_filter_pts; + + // timestamp from which the streamcopied streams should start, + // in AV_TIME_BASE_Q; + // everything before it should be discarded + int64_t ts_copy_start; + // the timebase of the packets sent to the muxer AVRational mux_timebase; AVRational enc_timebase; |