diff options
author | Linjie Fu <linjie.fu@intel.com> | 2019-10-15 15:56:23 +0800 |
---|---|---|
committer | Zhong Li <zhongli_dev@126.com> | 2019-11-03 16:22:47 +0800 |
commit | e786e37326d4274c1dfbc37a6478680684c779c9 (patch) | |
tree | 31dbb33c8a9c7b208721abd3773e2086d195e360 | |
parent | 53c21c2d6bebba887be9a30de204875fb41b1169 (diff) | |
download | ffmpeg-e786e37326d4274c1dfbc37a6478680684c779c9.tar.gz |
lavc/qsvenc: Fix bitrate_limit to allow AVC encode in limited bitrate
MFXVideoENCODE_Query calls CheckVideoParamQueryLike in MSDK and
will determine whether to set param.mfx.TargetKbps to the allowed
minTargetKbps according to the bitrate_limit in extco2 buffer.
Thus q->param.ExtParam must be set before MFXVideoENCODE_Query in case
minTargetKbps is written to TargetKbps by default.
1080P AVC encoding with option "-bitrate_limit 0 -b:v 100k":
Before patch:
902 kbps
After patch:
156 kbps
Signed-off-by: Linjie Fu <linjie.fu@intel.com>
-rw-r--r-- | libavcodec/qsvenc.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index ba85d645ca..dcff778607 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -1052,25 +1052,6 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q) if (ret < 0) return ret; - ret = MFXVideoENCODE_Query(q->session, &q->param, &q->param); - if (ret == MFX_WRN_PARTIAL_ACCELERATION) { - av_log(avctx, AV_LOG_WARNING, "Encoder will work with partial HW acceleration\n"); - } else if (ret < 0) { - return ff_qsv_print_error(avctx, ret, - "Error querying encoder params"); - } - - ret = MFXVideoENCODE_QueryIOSurf(q->session, &q->param, &q->req); - if (ret < 0) - return ff_qsv_print_error(avctx, ret, - "Error querying (IOSurf) the encoding parameters"); - - if (opaque_alloc) { - ret = qsv_init_opaque_alloc(avctx, q); - if (ret < 0) - return ret; - } - if (avctx->hwaccel_context) { AVQSVContext *qsv = avctx->hwaccel_context; int i, j; @@ -1100,6 +1081,25 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q) q->param.NumExtParam = q->nb_extparam_internal; } + ret = MFXVideoENCODE_Query(q->session, &q->param, &q->param); + if (ret == MFX_WRN_PARTIAL_ACCELERATION) { + av_log(avctx, AV_LOG_WARNING, "Encoder will work with partial HW acceleration\n"); + } else if (ret < 0) { + return ff_qsv_print_error(avctx, ret, + "Error querying encoder params"); + } + + ret = MFXVideoENCODE_QueryIOSurf(q->session, &q->param, &q->req); + if (ret < 0) + return ff_qsv_print_error(avctx, ret, + "Error querying (IOSurf) the encoding parameters"); + + if (opaque_alloc) { + ret = qsv_init_opaque_alloc(avctx, q); + if (ret < 0) + return ret; + } + ret = MFXVideoENCODE_Init(q->session, &q->param); if (ret < 0) return ff_qsv_print_error(avctx, ret, |