obs-qsv: Expose additional QSV encoder settings through GUI

- Allow user to change # of B frames. New Default -> 1
- Allow user to enable Content Adaptive Quantization (MBBRC) if CPU is Skylake or newer.
- Allow user to choose LA_CBR as a rate control.
- LA depth: New Default -> 15, only when LA rate control is used.
This commit is contained in:
Bird, Christopher
2018-08-08 10:39:57 -07:00
parent 3caf5d04d3
commit 58812bc0b3
4 changed files with 59 additions and 26 deletions

View File

@@ -190,6 +190,7 @@ bool QSV_Encoder_Internal::InitParams(qsv_param_t * pParams)
{
memset(&m_mfxEncParams, 0, sizeof(m_mfxEncParams));
m_mfxEncParams.mfx.CodecId = MFX_CODEC_AVC;
m_mfxEncParams.mfx.GopOptFlag = MFX_GOP_STRICT;
m_mfxEncParams.mfx.NumSlice = 1;
@@ -204,6 +205,7 @@ bool QSV_Encoder_Internal::InitParams(qsv_param_t * pParams)
m_mfxEncParams.mfx.FrameInfo.CropY = 0;
m_mfxEncParams.mfx.FrameInfo.CropW = pParams->nWidth;
m_mfxEncParams.mfx.FrameInfo.CropH = pParams->nHeight;
m_mfxEncParams.mfx.GopRefDist = pParams->nbFrames + 1;
m_mfxEncParams.mfx.RateControlMethod = pParams->nRateControl;
@@ -235,6 +237,10 @@ bool QSV_Encoder_Internal::InitParams(qsv_param_t * pParams)
case MFX_RATECONTROL_LA_ICQ:
m_mfxEncParams.mfx.ICQQuality = pParams->nICQQuality;
break;
case MFX_RATECONTROL_LA_HRD:
m_mfxEncParams.mfx.TargetKbps = pParams->nTargetBitRate;
m_mfxEncParams.mfx.MaxKbps = pParams->nTargetBitRate;
break;
default:
break;
}
@@ -245,28 +251,17 @@ bool QSV_Encoder_Internal::InitParams(qsv_param_t * pParams)
static mfxExtBuffer* extendedBuffers[2];
int iBuffers = 0;
if (pParams->nAsyncDepth == 1) {
m_mfxEncParams.mfx.NumRefFrame = 1;
// low latency, I and P frames only
m_mfxEncParams.mfx.GopRefDist = 1;
memset(&m_co, 0, sizeof(mfxExtCodingOption));
m_co.Header.BufferId = MFX_EXTBUFF_CODING_OPTION;
m_co.Header.BufferSz = sizeof(mfxExtCodingOption);
m_co.MaxDecFrameBuffering = 1;
extendedBuffers[iBuffers++] = (mfxExtBuffer*)&m_co;
}
else
m_mfxEncParams.mfx.GopRefDist = pParams->nbFrames + 1;
memset(&m_co2, 0, sizeof(mfxExtCodingOption2));
m_co2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION2;
m_co2.Header.BufferSz = sizeof(m_co2);
if (pParams->bMBBRC)
m_co2.MBBRC = MFX_CODINGOPTION_ON;
if (pParams->nRateControl == MFX_RATECONTROL_LA_ICQ ||
pParams->nRateControl == MFX_RATECONTROL_LA) {
pParams->nRateControl == MFX_RATECONTROL_LA)
memset(&m_co2, 0, sizeof(mfxExtCodingOption2));
m_co2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION;
m_co2.Header.BufferSz = sizeof(m_co2);
m_co2.LookAheadDepth = pParams->nLADEPTH;
extendedBuffers[iBuffers++] = (mfxExtBuffer*)& m_co2;
}
extendedBuffers[iBuffers++] = (mfxExtBuffer*)& m_co2;
if (iBuffers > 0) {
m_mfxEncParams.ExtParam = extendedBuffers;