From 49aa7d21026051dc353a8658509d2ba81520bf78 Mon Sep 17 00:00:00 2001 From: Andreas Hakon Date: Tue, 14 May 2019 16:42:08 +0100 Subject: [PATCH] libavcodec/qsvenc: fix mpeg2 encoding Commit "lavc/qsvenc: enable QVBR mode" generated a regression with the MPEG-2 QSV HW Encoder on the Windows platform. See trac #7839. This patch fixes the problem by running a runtime check during initialization. When using the MPEG-2 encoder the extended CO3 buffer is not added to the context. Signed-off-by: Andreas Hakon --- libavcodec/qsvenc.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index a03ab69..9d26db0 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -267,10 +267,12 @@ static void dump_video_param(AVCodecContext *avctx, QSVEncContext *q, #endif #endif +#if QSV_HAVE_CO3 #if QSV_HAVE_GPB if (avctx->codec_id == AV_CODEC_ID_HEVC) av_log(avctx, AV_LOG_VERBOSE,"GPB: %s\n", print_threestate(co3->GPB)); #endif +#endif if (avctx->codec_id == AV_CODEC_ID_H264) { av_log(avctx, AV_LOG_VERBOSE, "Entropy coding: %s; MaxDecFrameBuffering: %"PRIu16"\n", @@ -598,9 +600,11 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) q->param.mfx.MaxKbps = max_bitrate_kbps / brc_param_multiplier; q->param.mfx.BRCParamMultiplier = brc_param_multiplier; #if QSV_HAVE_QVBR +#if QSV_HAVE_CO3 if (q->param.mfx.RateControlMethod == MFX_RATECONTROL_QVBR) q->extco3.QVBRQuality = av_clip(avctx->global_quality, 0, 51); #endif +#endif break; case MFX_RATECONTROL_CQP: quant = avctx->global_quality / FF_QP2LAMBDA; @@ -751,13 +755,16 @@ FF_ENABLE_DEPRECATION_WARNINGS #endif } #if QSV_HAVE_CO3 - q->extco3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3; - q->extco3.Header.BufferSz = sizeof(q->extco3); + if (avctx->codec_id != AV_CODEC_ID_MPEG2VIDEO ) { + av_log(avctx,AV_LOG_DEBUG,"Initializing the MFX context with the Extended Coding Option 3 (extco3)\n"); + q->extco3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3; + q->extco3.Header.BufferSz = sizeof(q->extco3); #if QSV_HAVE_GPB - if (avctx->codec_id == AV_CODEC_ID_HEVC) - q->extco3.GPB = q->gpb ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF; + if (avctx->codec_id == AV_CODEC_ID_HEVC) + q->extco3.GPB = q->gpb ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF; #endif - q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco3; + q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco3; + } #endif } -- 1.7.10.4