Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2022-08-10 11:44:30 +0300
committerAnton Khirnov <anton@khirnov.net>2022-08-13 13:41:05 +0300
commit274c8d58820b1bdf6ac6a51ae7f1a040da2bf96f (patch)
tree60d4703fa4a15e79ddfd7fed0bff7e8d9971a67f /fftools
parent86e9cef77ba8a1481a6b83fd73638f24b645bdb4 (diff)
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
Diffstat (limited to 'fftools')
-rw-r--r--fftools/ffmpeg.c17
-rw-r--r--fftools/ffmpeg.h6
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;