[FFmpeg-devel] [PATCH 4/5] avcodec/encode: Set AV_PKT_FLAG_KEY based upon AV_CODEC_PROP_INTRA_ONLY
James Almer
jamrial at gmail.com
Wed Sep 22 01:30:35 EEST 2021
On 9/21/2021 7:18 PM, Andreas Rheinhardt wrote:
> 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;
You could do the check you added to ff_encode_preinit() here, inside the
audio media type check, instead of adding another single use field to
AVCodecInternal.
> }
>
> 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)
fwiw, the doxy for AVCodecContext says codec_descriptor is unused for
encoding, but i see it's set unconditionally in avcodec_open2(). Should
the doxy be amended?
It also kinda feels like a superfluous field. Anyone can do
avcodec_descriptor_get(avctx->codec_id) if required.
> + 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;
>
More information about the ffmpeg-devel
mailing list