[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:38:12 EEST 2021


On 9/21/2021 7:35 PM, Andreas Rheinhardt wrote:
> 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.

I don't consider this a problem, but doing so would make patch 5/5 not 
possible, so i guess it's fine as is.

>>
> 
> 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.

Ah, I did, yes. My bad.

> 
>> 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;
>>>
>>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> 



More information about the ffmpeg-devel mailing list