[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:35:36 EEST 2021
James Almer:
> 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.
>
That would add a dereference and a branch more for every packet; the
above avoids this.
>> }
>> 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?
>
You overlooked my above comment, I presume.
> It also kinda feels like a superfluous field. Anyone can do
> avcodec_descriptor_get(avctx->codec_id) if required.
>
Agreed.
>> + 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