aboutsummaryrefslogtreecommitdiffstats
path: root/fftools/ffmpeg.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2022-03-31 16:34:29 +0200
committerAnton Khirnov <anton@khirnov.net>2022-04-13 12:07:54 +0200
commit662364b2efb3540c5b4a2b140601fab7a9c90367 (patch)
tree49fb516db3f254fdababfff27ddcd5da6f01242f /fftools/ffmpeg.c
parent86e1c0303cd6c33d8ff833e8c2fc84163baede06 (diff)
downloadffmpeg-662364b2efb3540c5b4a2b140601fab7a9c90367.tar.gz
fftools/ffmpeg: stop using OutputStream.frame_number for streamcopy
This field is currently used by checks - skipping packets before the first keyframe - skipping packets before start time to test whether any packets have been output already. But since frame_number is incremented after the bitstream filters are applied (which may involve delay), this use is incorrect. The keyframe check works around this by adding an extra flag, the start-time check does not. Simplify both checks by replacing the seen_kf flag with a flag tracking whether any packets have been output by do_streamcopy().
Diffstat (limited to 'fftools/ffmpeg.c')
-rw-r--r--fftools/ffmpeg.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 13be32f0cf..29b01f9d93 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -894,8 +894,6 @@ static void output_packet(OutputFile *of, AVPacket *pkt,
/* apply the output bitstream filters */
if (ost->bsf_ctx) {
- if (pkt->flags & AV_PKT_FLAG_KEY)
- ost->seen_kf = 1;
ret = av_bsf_send_packet(ost->bsf_ctx, eof ? NULL : pkt);
if (ret < 0)
goto finish;
@@ -2043,11 +2041,11 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
return;
}
- if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
- !ost->copy_initial_nonkeyframes && !ost->seen_kf)
+ if (!ost->streamcopy_started && !(pkt->flags & AV_PKT_FLAG_KEY) &&
+ !ost->copy_initial_nonkeyframes)
return;
- if (!ost->frame_number && !ost->copy_prior_start) {
+ 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);
@@ -2101,6 +2099,8 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
ost->sync_opts += opkt->duration;
output_packet(of, opkt, ost, 0);
+
+ ost->streamcopy_started = 1;
}
int guess_input_channel_layout(InputStream *ist)