[FFmpeg-cvslog] avcodec/encode: Set AV_PKT_FLAG_KEY based upon AV_CODEC_PROP_INTRA_ONLY

Andreas Rheinhardt git at videolan.org
Tue Sep 28 03:12:09 EEST 2021


ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Wed Sep 22 00:04:31 2021 +0200| [3f11eac75741888c7b2b6f93c458766f2613bab5] | committer: Andreas Rheinhardt

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 at gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=3f11eac75741888c7b2b6f93c458766f2613bab5
---

 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 2111f2b9ae..b6180f15a5 100644
--- a/libavcodec/internal.h
+++ b/libavcodec/internal.h
@@ -153,6 +153,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-cvslog mailing list