[FFmpeg-devel] [PATCH] libavcodec/qsvenc.c fixed handling of closed gop flag

Elio Blanca eblanca at libero.it
Fri Apr 24 10:45:54 EEST 2020


Hello,
this is my very first message to this list, so first of all: thank you for your huge work!

Now, to the issue: I made this patch for libavcodec/qsvenc.c in order to honor the GopOptFlag flag for hevc_qsv encodings (maybe others will be affected though).
In statement 513 (the third fix) a wrong value was assigned in case of not-closed-gop. Zero is not an allowed value, as the enum mfx.GopOptFlag refers to uses only 1 and 2. What the encoding engine will do when feeded with a non-valid value is unpredictable.
Then, in statements 148 and 150 I changed those 'if' replacing '&' with '==' because of the enum, which is different from a bitmask.

Apart from those, it sound to me quite suspicious having to set -flags 0 in my command line in order NOT to get closed gops, as the default is a closed gop (I see weird having this as default).
Further, I usually avoid using a signed 'int' for a flag field, which needs to be handled with bitmasks, so into libavcodec/avcodec.h I would change those 'int flags;' and 'int flags2;' using unsigned instead; unless, of course, there are solid reasons to have them defined this way.

Elio



diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index 9bf8574e30..d363dae633 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -145,9 +145,9 @@ static void dump_video_param(AVCodecContext *avctx, QSVEncContext *q,
 
     av_log(avctx, AV_LOG_VERBOSE, "GopPicSize: %"PRIu16"; GopRefDist: %"PRIu16"; GopOptFlag: ",
            info->GopPicSize, info->GopRefDist);
-    if (info->GopOptFlag & MFX_GOP_CLOSED)
+    if (info->GopOptFlag == MFX_GOP_CLOSED)
         av_log(avctx, AV_LOG_VERBOSE, "closed ");
-    if (info->GopOptFlag & MFX_GOP_STRICT)
+    if (info->GopOptFlag == MFX_GOP_STRICT)
         av_log(avctx, AV_LOG_VERBOSE, "strict ");
     av_log(avctx, AV_LOG_VERBOSE, "; IdrInterval: %"PRIu16"\n", info->IdrInterval);
 
@@ -510,7 +510,7 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q)
     q->param.mfx.GopPicSize         = FFMAX(0, avctx->gop_size);
     q->param.mfx.GopRefDist         = FFMAX(-1, avctx->max_b_frames) + 1;
     q->param.mfx.GopOptFlag         = avctx->flags & AV_CODEC_FLAG_CLOSED_GOP ?
-                                      MFX_GOP_CLOSED : 0;
+                                      MFX_GOP_CLOSED : MFX_GOP_STRICT;
     q->param.mfx.IdrInterval        = q->idr_interval;
     q->param.mfx.NumSlice           = avctx->slices;
     q->param.mfx.NumRefFrame        = FFMAX(0, avctx->refs);



More information about the ffmpeg-devel mailing list