diff options
author | Zhong Li <zhongli_dev@126.com> | 2019-10-26 22:18:31 +0800 |
---|---|---|
committer | Zhong Li <zhongli_dev@126.com> | 2019-11-03 16:45:35 +0800 |
commit | 33583803e107b6d532def0f9d949364b01b6ad5a (patch) | |
tree | 5c64d79eff6ad3d2fe35ef89cd5e269f6aae91a1 /libavcodec/qsvenc.c | |
parent | e786e37326d4274c1dfbc37a6478680684c779c9 (diff) | |
download | ffmpeg-33583803e107b6d532def0f9d949364b01b6ad5a.tar.gz |
lavc/qsvenc: enable vp9 encoder
1. must enable low_power mode since just VDENC can be supported by iHD
driver right now
2. Coding option1 and extra_data are not supported by MSDK
3. IVF header will be inserted in MSDK by default, but it is not needed
for FFmpeg, so disable it.
Signed-off-by: Zhong Li <zhongli_dev@126.com>
Diffstat (limited to 'libavcodec/qsvenc.c')
-rw-r--r-- | libavcodec/qsvenc.c | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index dcff778607..93d49ba21d 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -637,7 +637,8 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) // The HEVC encoder plugin currently fails with some old libmfx version if coding options // are provided. Can't find the extract libmfx version which fixed it, just enable it from // V1.28 in order to keep compatibility security. - if ((avctx->codec_id != AV_CODEC_ID_HEVC) || QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 28)) { + if (((avctx->codec_id != AV_CODEC_ID_HEVC) || QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 28)) + && (avctx->codec_id != AV_CODEC_ID_VP9)) { q->extco.Header.BufferId = MFX_EXTBUFF_CODING_OPTION; q->extco.Header.BufferSz = sizeof(q->extco); @@ -761,6 +762,15 @@ FF_ENABLE_DEPRECATION_WARNINGS #endif } +#if QSV_HAVE_EXT_VP9_PARAM + if (avctx->codec_id == AV_CODEC_ID_VP9) { + q->extvp9param.Header.BufferId = MFX_EXTBUFF_VP9_PARAM; + q->extvp9param.Header.BufferSz = sizeof(q->extvp9param); + q->extvp9param.WriteIVFHeaders = MFX_CODINGOPTION_OFF; + q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extvp9param; + } +#endif + if (!check_enc_param(avctx,q)) { av_log(avctx, AV_LOG_ERROR, "some encoding parameters are not supported by the QSV " @@ -789,6 +799,53 @@ static int qsv_retrieve_enc_jpeg_params(AVCodecContext *avctx, QSVEncContext *q) return 0; } +static int qsv_retrieve_enc_vp9_params(AVCodecContext *avctx, QSVEncContext *q) +{ + int ret = 0; +#if QSV_HAVE_EXT_VP9_PARAM + mfxExtVP9Param vp9_extend_buf = { + .Header.BufferId = MFX_EXTBUFF_VP9_PARAM, + .Header.BufferSz = sizeof(vp9_extend_buf), + }; +#endif + +#if QSV_HAVE_CO2 + mfxExtCodingOption2 co2 = { + .Header.BufferId = MFX_EXTBUFF_CODING_OPTION2, + .Header.BufferSz = sizeof(co2), + }; +#endif + +#if QSV_HAVE_CO3 + mfxExtCodingOption3 co3 = { + .Header.BufferId = MFX_EXTBUFF_CODING_OPTION3, + .Header.BufferSz = sizeof(co3), + }; +#endif + + mfxExtBuffer *ext_buffers[] = { + (mfxExtBuffer*)&vp9_extend_buf, +#if QSV_HAVE_CO2 + (mfxExtBuffer*)&co2, +#endif +#if QSV_HAVE_CO3 + (mfxExtBuffer*)&co3, +#endif + }; + + q->param.ExtParam = ext_buffers; + q->param.NumExtParam = FF_ARRAY_ELEMS(ext_buffers); + + ret = MFXVideoENCODE_GetVideoParam(q->session, &q->param); + if (ret < 0) + return ff_qsv_print_error(avctx, ret, + "Error calling GetVideoParam"); + + q->packet_size = q->param.mfx.BufferSizeInKB * q->param.mfx.BRCParamMultiplier * 1000; + + return 0; +} + static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q) { AVCPBProperties *cpb_props; @@ -1112,6 +1169,9 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q) case AV_CODEC_ID_MJPEG: ret = qsv_retrieve_enc_jpeg_params(avctx, q); break; + case AV_CODEC_ID_VP9: + ret = qsv_retrieve_enc_vp9_params(avctx, q); + break; default: ret = qsv_retrieve_enc_params(avctx, q); break; |