1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-10 06:10:52 +02:00

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().
This commit is contained in:
Anton Khirnov
2022-03-31 16:34:29 +02:00
parent 86e1c0303c
commit 662364b2ef
2 changed files with 6 additions and 6 deletions

View File

@@ -894,8 +894,6 @@ static void output_packet(OutputFile *of, AVPacket *pkt,
/* apply the output bitstream filters */ /* apply the output bitstream filters */
if (ost->bsf_ctx) { 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); ret = av_bsf_send_packet(ost->bsf_ctx, eof ? NULL : pkt);
if (ret < 0) if (ret < 0)
goto finish; goto finish;
@@ -2043,11 +2041,11 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
return; return;
} }
if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && if (!ost->streamcopy_started && !(pkt->flags & AV_PKT_FLAG_KEY) &&
!ost->copy_initial_nonkeyframes && !ost->seen_kf) !ost->copy_initial_nonkeyframes)
return; return;
if (!ost->frame_number && !ost->copy_prior_start) { if (!ost->streamcopy_started && !ost->copy_prior_start) {
int64_t comp_start = start_time; int64_t comp_start = start_time;
if (copy_ts && f->start_time != AV_NOPTS_VALUE) if (copy_ts && f->start_time != AV_NOPTS_VALUE)
comp_start = FFMAX(start_time, f->start_time + f->ts_offset); 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; ost->sync_opts += opkt->duration;
output_packet(of, opkt, ost, 0); output_packet(of, opkt, ost, 0);
ost->streamcopy_started = 1;
} }
int guess_input_channel_layout(InputStream *ist) int guess_input_channel_layout(InputStream *ist)

View File

@@ -536,7 +536,7 @@ typedef struct OutputStream {
int inputs_done; int inputs_done;
const char *attachment_filename; const char *attachment_filename;
int seen_kf; int streamcopy_started;
int copy_initial_nonkeyframes; int copy_initial_nonkeyframes;
int copy_prior_start; int copy_prior_start;
char *disposition; char *disposition;