diff options
author | Haihao Xiang <haihao.xiang@intel.com> | 2019-01-10 14:28:52 +0800 |
---|---|---|
committer | Víctor Manuel Jáquez Leal <vjaquez@igalia.com> | 2019-01-11 09:57:44 +0000 |
commit | 9aa68dea517f49b267d222585df71b92462fc1c8 (patch) | |
tree | cbd7a45aa699e2b7bf6d47649edf36bc134901b3 | |
parent | 5fc160fa5959b7cb2b5495916378ebedee8006ec (diff) | |
download | gstreamer-plugins-bad-9aa68dea517f49b267d222585df71b92462fc1c8.tar.gz |
msdk: set the right BRCParamMultiplier
BRCParamMultiplier in mfxInfoMFX is a parameter which specifies a
multiplier for bitrate control parameters [1], it impacts TargetKbps,
MaxKbps, BufferSizeInKB and InitialDelayInKB.
[1]: https://software.intel.com/en-us/node/628473
-rw-r--r-- | sys/msdk/gstmsdkenc.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/sys/msdk/gstmsdkenc.c b/sys/msdk/gstmsdkenc.c index 72e81928a..8f1bfa8ba 100644 --- a/sys/msdk/gstmsdkenc.c +++ b/sys/msdk/gstmsdkenc.c @@ -151,8 +151,23 @@ ensure_bitrate_control (GstMsdkEnc * thiz) mfx->RateControlMethod = thiz->rate_control; /* No effect in CQP varient algorithms */ - mfx->TargetKbps = thiz->bitrate; - mfx->MaxKbps = thiz->max_vbv_bitrate; + if ((mfx->RateControlMethod != MFX_RATECONTROL_CQP) && + (thiz->bitrate > G_MAXUINT16 || thiz->max_vbv_bitrate > G_MAXUINT16)) { + mfxU32 max_val = MAX (thiz->max_vbv_bitrate, thiz->bitrate); + + mfx->BRCParamMultiplier = (mfxU16) ((max_val + 0x10000) / 0x10000); + mfx->TargetKbps = (mfxU16) (thiz->bitrate / mfx->BRCParamMultiplier); + mfx->MaxKbps = (mfxU16) (thiz->max_vbv_bitrate / mfx->BRCParamMultiplier); + mfx->BufferSizeInKB = + (mfxU16) (mfx->BufferSizeInKB / mfx->BRCParamMultiplier); + /* Currently InitialDelayInKB is not used in this plugin */ + mfx->InitialDelayInKB = + (mfxU16) (mfx->InitialDelayInKB / mfx->BRCParamMultiplier); + } else { + mfx->TargetKbps = thiz->bitrate; + mfx->MaxKbps = thiz->max_vbv_bitrate; + mfx->BRCParamMultiplier = 1; + } switch (mfx->RateControlMethod) { case MFX_RATECONTROL_CQP: @@ -488,13 +503,15 @@ gst_msdkenc_init_encoder (GstMsdkEnc * thiz) thiz->tasks = g_new0 (MsdkEncTask, thiz->num_tasks); for (i = 0; i < thiz->num_tasks; i++) { thiz->tasks[i].output_bitstream.Data = _aligned_alloc (32, - thiz->param.mfx.BufferSizeInKB * 1024); + thiz->param.mfx.BufferSizeInKB * thiz->param.mfx.BRCParamMultiplier * + 1024); if (!thiz->tasks[i].output_bitstream.Data) { GST_ERROR_OBJECT (thiz, "Memory allocation failed"); goto failed; } thiz->tasks[i].output_bitstream.MaxLength = - thiz->param.mfx.BufferSizeInKB * 1024; + thiz->param.mfx.BufferSizeInKB * thiz->param.mfx.BRCParamMultiplier * + 1024; } thiz->next_task = 0; |