Skip to content

Commit

Permalink
obs-qsv11: Fix CBR Spike
Browse files Browse the repository at this point in the history
  • Loading branch information
thyintel committed Aug 1, 2024
1 parent 0f4e33c commit 8a8fa0a
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 2 deletions.
44 changes: 42 additions & 2 deletions plugins/obs-qsv11/QSV_Encoder_Internal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,23 @@ mfxStatus QSV_Encoder_Internal::Open(qsv_param_t *pParams, enum qsv_codec codec)
return sts;
}

PRAGMA_WARN_PUSH
PRAGMA_WARN_DEPRECATION
static inline bool IsOptimizedBRCSupport(const mfxPlatform &platform,
mfxU16 rateControl)
{
#if defined(_WIN32)
if (rateControl == MFX_RATECONTROL_CBR &&
(platform.CodeName >= MFX_PLATFORM_LUNARLAKE &&
platform.CodeName != MFX_PLATFORM_ALDERLAKE_N))
return true;
#endif
(void)platform;
(void)rateControl;
return false;
}
PRAGMA_WARN_POP

mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,
enum qsv_codec codec)
{
Expand Down Expand Up @@ -233,8 +250,15 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,
switch (pParams->nRateControl) {
case MFX_RATECONTROL_CBR:
m_mfxEncParams.mfx.TargetKbps = pParams->nTargetBitRate;
m_mfxEncParams.mfx.BufferSizeInKB =
(pParams->nTargetBitRate / 8) * 2;

if (IsOptimizedBRCSupport(platform, pParams->nRateControl)) {
m_mfxEncParams.mfx.BufferSizeInKB =
(pParams->nTargetBitRate / 8) * 1;
} else {
m_mfxEncParams.mfx.BufferSizeInKB =
(pParams->nTargetBitRate / 8) * 2;
}

m_mfxEncParams.mfx.InitialDelayInKB =
(pParams->nTargetBitRate / 8) * 1;
break;
Expand Down Expand Up @@ -304,6 +328,22 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,

extendedBuffers.push_back((mfxExtBuffer *)&m_co2);

if (IsOptimizedBRCSupport(platform, pParams->nRateControl)) {
memset(&m_co3, 0, sizeof(mfxExtCodingOption3));
m_co3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3;
m_co3.Header.BufferSz = sizeof(m_co3);
m_co3.WinBRCSize = pParams->nFpsNum / pParams->nFpsDen;

if (codec == QSV_CODEC_AVC || codec == QSV_CODEC_HEVC) {
m_co3.WinBRCMaxAvgKbps =
mfxU16(1.3 * pParams->nTargetBitRate);
} else if (codec == QSV_CODEC_AV1) {
m_co3.WinBRCMaxAvgKbps =
mfxU16(1.2 * pParams->nTargetBitRate);
}
extendedBuffers.push_back((mfxExtBuffer *)&m_co3);
}

if (codec == QSV_CODEC_HEVC) {
if ((pParams->nWidth & 15) || (pParams->nHeight & 15)) {
memset(&m_ExtHEVCParam, 0, sizeof(m_ExtHEVCParam));
Expand Down
1 change: 1 addition & 0 deletions plugins/obs-qsv11/QSV_Encoder_Internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ class QSV_Encoder_Internal {
mfxU16 m_nPPSBufferSize;
mfxVideoParam m_parameter;
std::vector<mfxExtBuffer *> extendedBuffers;
mfxExtCodingOption3 m_co3;
mfxExtCodingOption2 m_co2;
mfxExtCodingOption m_co;
mfxExtHEVCParam m_ExtHEVCParam{};
Expand Down

0 comments on commit 8a8fa0a

Please sign in to comment.