[FFmpeg-devel] [PATCH 2/4 v2] ffmpeg: ensure a keyframe was not seen before skipping packets
James Almer
jamrial at gmail.com
Wed Feb 23 17:03:53 EET 2022
A keyframe could be buffered in the bsf and not be output until more packets
had been fed to it.
Signed-off-by: James Almer <jamrial at gmail.com>
---
Changed the check from pkt to !eof, since a packet is always provided.
fftools/ffmpeg.c | 4 +++-
fftools/ffmpeg.h | 1 +
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 44043ef203..2b61c0d5aa 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -890,6 +890,8 @@ static void output_packet(OutputFile *of, AVPacket *pkt,
/* apply the output bitstream filters */
if (ost->bsf_ctx) {
+ if (!eof && 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;
@@ -2035,7 +2037,7 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
}
if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
- !ost->copy_initial_nonkeyframes)
+ !ost->copy_initial_nonkeyframes && !ost->seen_kf)
return;
if (!ost->frame_number && !ost->copy_prior_start) {
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 82f3db6b6d..6a19dc9c7c 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -534,6 +534,7 @@ typedef struct OutputStream {
int inputs_done;
const char *attachment_filename;
+ int seen_kf;
int copy_initial_nonkeyframes;
int copy_prior_start;
char *disposition;
--
2.35.1
More information about the ffmpeg-devel
mailing list