summaryrefslogtreecommitdiff
path: root/fftools
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2022-02-15 09:44:21 -0300
committerJames Almer <jamrial@gmail.com>2022-02-28 12:11:24 -0300
commitd75e7a9a83b2774900bcb5c58236c108d11af041 (patch)
tree02f12f0864eeb70be4615a700e5b554aeed34577 /fftools
parentafe485ee6b3bbcd4b0e106eb9fc4dcf4846db1b8 (diff)
ffmpeg: ensure a keyframe was not seen before skipping packets
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@gmail.com>
Diffstat (limited to 'fftools')
-rw-r--r--fftools/ffmpeg.c4
-rw-r--r--fftools/ffmpeg.h1
2 files changed, 4 insertions, 1 deletions
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 66e5ec8c8e..d5cd010a9c 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -889,6 +889,8 @@ 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;
@@ -2026,7 +2028,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 1b8bbace3f..cc8f767e5d 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -535,6 +535,7 @@ typedef struct OutputStream {
int inputs_done;
const char *attachment_filename;
+ int seen_kf;
int copy_initial_nonkeyframes;
int copy_prior_start;
char *disposition;