avcodec/encode: Set AV_PKT_FLAG_KEY based upon AV_CODEC_PROP_INTRA_ONLY

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.

Reviewed-by: James Almer <jamrial@gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
pull/369/head
Andreas Rheinhardt 3 years ago
parent f09fd1c6c7
commit 3f11eac757
  1. 7
      libavcodec/encode.c
  2. 7
      libavcodec/internal.h

@ -235,12 +235,9 @@ static int encode_simple_internal(AVCodecContext *avctx, AVPacket *avpkt)
} }
} }
if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) { 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->dts = avpkt->pts;
} }
avpkt->flags |= avci->intra_only_flag;
} }
if (avci->draining && !got_packet) if (avci->draining && !got_packet)
@ -553,6 +550,8 @@ int ff_encode_preinit(AVCodecContext *avctx)
} }
avctx->sw_pix_fmt = frames_ctx->sw_format; 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; return 0;
} }

@ -153,6 +153,13 @@ typedef struct AVCodecInternal {
uint8_t *byte_buffer; uint8_t *byte_buffer;
unsigned int byte_buffer_size; 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; void *frame_thread_encoder;
EncodeSimpleContext es; EncodeSimpleContext es;

Loading…
Cancel
Save