[FFmpeg-devel] [PATCH 4/5] avcodec/encode: Set AV_PKT_FLAG_KEY based upon AV_CODEC_PROP_INTRA_ONLY
Andreas Rheinhardt
andreas.rheinhardt at outlook.com
Wed Sep 22 01:18:15 EEST 2021
Currently, the AV_PKT_FLAG_KEY is automatically set for audio encoders;
yet this is wrong, as both MLP and TrueHD have non-keyframes. So set it
based upon AV_CODEC_PROP_INTRA_ONLY (from the corresponding
AVCodecDescriptor) instead. This also sets it for some video codecs,
which is intended.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
I was surprised that this did not necessitate FATE changes.
Btw: AVCodecContext.codec_descriptor is always set by avcodec_open2(),
yet marked as unused for encoding in its doxy. Shall I make document
the current behaviour?
libavcodec/encode.c | 7 +++----
libavcodec/internal.h | 7 +++++++
2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/libavcodec/encode.c b/libavcodec/encode.c
index 98dfbfdff3..dd25cf999b 100644
--- a/libavcodec/encode.c
+++ b/libavcodec/encode.c
@@ -235,12 +235,9 @@ static int encode_simple_internal(AVCodecContext *avctx, AVPacket *avpkt)
}
}
if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) {
- /* NOTE: if we add any audio encoders which output non-keyframe packets,
- * this needs to be moved to the encoders, but for now we can do it
- * here to simplify things */
- avpkt->flags |= AV_PKT_FLAG_KEY;
avpkt->dts = avpkt->pts;
}
+ avpkt->flags |= avci->intra_only_flag;
}
if (avci->draining && !got_packet)
@@ -553,6 +550,8 @@ int ff_encode_preinit(AVCodecContext *avctx)
}
avctx->sw_pix_fmt = frames_ctx->sw_format;
}
+ if (avctx->codec_descriptor->props & AV_CODEC_PROP_INTRA_ONLY)
+ avctx->internal->intra_only_flag = AV_PKT_FLAG_KEY;
return 0;
}
diff --git a/libavcodec/internal.h b/libavcodec/internal.h
index dc60e4bf08..8df622968c 100644
--- a/libavcodec/internal.h
+++ b/libavcodec/internal.h
@@ -155,6 +155,13 @@ typedef struct AVCodecInternal {
uint8_t *byte_buffer;
unsigned int byte_buffer_size;
+ /**
+ * This is set to AV_PKT_FLAG_KEY for encoders that encode intra-only
+ * formats (i.e. whose codec descriptor has AV_CODEC_PROP_INTRA_ONLY set).
+ * This is used to set said flag generically for said encoders.
+ */
+ int intra_only_flag;
+
void *frame_thread_encoder;
EncodeSimpleContext es;
--
2.30.2
More information about the ffmpeg-devel
mailing list