summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaihao Xiang <haihao.xiang@intel.com>2019-01-10 14:28:52 +0800
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>2019-01-11 09:57:44 +0000
commit9aa68dea517f49b267d222585df71b92462fc1c8 (patch)
treecbd7a45aa699e2b7bf6d47649edf36bc134901b3
parent5fc160fa5959b7cb2b5495916378ebedee8006ec (diff)
downloadgstreamer-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.c25
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;