瀏覽代碼

obs-qsv11: Enable VDEnc on ICL+

Enable AVC VDEnc (fixed function encode) on ICL+
brittneysclark 5 年之前
父節點
當前提交
45df89ef93

+ 2 - 0
plugins/obs-qsv11/QSV_Encoder.cpp

@@ -320,6 +320,8 @@ enum qsv_cpu_platform qsv_get_cpu_platform()
 	case 0x8e:
 	case 0x8e:
 	case 0x9e:
 	case 0x9e:
 		return QSV_CPU_PLATFORM_KBL;
 		return QSV_CPU_PLATFORM_KBL;
+	case 0x66:
+		return QSV_CPU_PLATFORM_CNL;
 	case 0x7d:
 	case 0x7d:
 	case 0x7e:
 	case 0x7e:
 		return QSV_CPU_PLATFORM_ICL;
 		return QSV_CPU_PLATFORM_ICL;

+ 1 - 0
plugins/obs-qsv11/QSV_Encoder.h

@@ -118,6 +118,7 @@ enum qsv_cpu_platform {
 	QSV_CPU_PLATFORM_BDW,
 	QSV_CPU_PLATFORM_BDW,
 	QSV_CPU_PLATFORM_SKL,
 	QSV_CPU_PLATFORM_SKL,
 	QSV_CPU_PLATFORM_KBL,
 	QSV_CPU_PLATFORM_KBL,
+	QSV_CPU_PLATFORM_CNL,
 	QSV_CPU_PLATFORM_ICL,
 	QSV_CPU_PLATFORM_ICL,
 	QSV_CPU_PLATFORM_INTEL
 	QSV_CPU_PLATFORM_INTEL
 };
 };

+ 30 - 1
plugins/obs-qsv11/QSV_Encoder_Internal.cpp

@@ -211,6 +211,17 @@ bool QSV_Encoder_Internal::InitParams(qsv_param_t *pParams)
 	m_mfxEncParams.mfx.FrameInfo.CropH = pParams->nHeight;
 	m_mfxEncParams.mfx.FrameInfo.CropH = pParams->nHeight;
 	m_mfxEncParams.mfx.GopRefDist = pParams->nbFrames + 1;
 	m_mfxEncParams.mfx.GopRefDist = pParams->nbFrames + 1;
 
 
+	enum qsv_cpu_platform qsv_platform = qsv_get_cpu_platform();
+	if ((qsv_platform >= QSV_CPU_PLATFORM_ICL) &&
+	    (pParams->nbFrames == 0) &&
+	    (m_ver.Major == 1 && m_ver.Minor >= 31)) {
+		m_mfxEncParams.mfx.LowPower = MFX_CODINGOPTION_ON;
+		if (pParams->nRateControl == MFX_RATECONTROL_LA_ICQ ||
+		    pParams->nRateControl == MFX_RATECONTROL_LA_HRD ||
+		    pParams->nRateControl == MFX_RATECONTROL_LA)
+			pParams->nRateControl = MFX_RATECONTROL_VBR;
+	}
+
 	m_mfxEncParams.mfx.RateControlMethod = pParams->nRateControl;
 	m_mfxEncParams.mfx.RateControlMethod = pParams->nRateControl;
 
 
 	switch (pParams->nRateControl) {
 	switch (pParams->nRateControl) {
@@ -268,10 +279,23 @@ bool QSV_Encoder_Internal::InitParams(qsv_param_t *pParams)
 			m_co2.MBBRC = MFX_CODINGOPTION_ON;
 			m_co2.MBBRC = MFX_CODINGOPTION_ON;
 		if (pParams->nbFrames > 1)
 		if (pParams->nbFrames > 1)
 			m_co2.BRefType = MFX_B_REF_PYRAMID;
 			m_co2.BRefType = MFX_B_REF_PYRAMID;
+		if (m_mfxEncParams.mfx.LowPower == MFX_CODINGOPTION_ON) {
+			m_co2.RepeatPPS = MFX_CODINGOPTION_OFF;
+			if (pParams->nRateControl == MFX_RATECONTROL_CBR ||
+			    pParams->nRateControl == MFX_RATECONTROL_VBR) {
+				m_co2.LookAheadDepth = pParams->nLADEPTH;
+			}
+		}
 		extendedBuffers[iBuffers++] = (mfxExtBuffer *)&m_co2;
 		extendedBuffers[iBuffers++] = (mfxExtBuffer *)&m_co2;
 	}
 	}
 
 
-	if (pParams->bCQM) {
+	if (m_mfxEncParams.mfx.LowPower == MFX_CODINGOPTION_ON) {
+		memset(&m_co3, 0, sizeof(mfxExtCodingOption3));
+		m_co3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3;
+		m_co3.Header.BufferSz = sizeof(m_co3);
+		m_co3.ScenarioInfo = MFX_SCENARIO_GAME_STREAMING;
+		extendedBuffers[iBuffers++] = (mfxExtBuffer *)&m_co3;
+	} else if (pParams->bCQM) {
 		if (m_ver.Major == 1 && m_ver.Minor >= 16) {
 		if (m_ver.Major == 1 && m_ver.Minor >= 16) {
 			memset(&m_co3, 0, sizeof(mfxExtCodingOption3));
 			memset(&m_co3, 0, sizeof(mfxExtCodingOption3));
 			m_co3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3;
 			m_co3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3;
@@ -297,6 +321,11 @@ bool QSV_Encoder_Internal::InitParams(qsv_param_t *pParams)
 	else
 	else
 		m_mfxEncParams.IOPattern = MFX_IOPATTERN_IN_SYSTEM_MEMORY;
 		m_mfxEncParams.IOPattern = MFX_IOPATTERN_IN_SYSTEM_MEMORY;
 
 
+	mfxStatus sts = m_pmfxENC->Query(&m_mfxEncParams, &m_mfxEncParams);
+	if (sts == MFX_ERR_UNSUPPORTED || sts == MFX_ERR_UNDEFINED_BEHAVIOR) {
+		m_mfxEncParams.mfx.LowPower = MFX_CODINGOPTION_OFF;
+	}
+
 	return true;
 	return true;
 }
 }
 
 

+ 4 - 1
plugins/obs-qsv11/libmfx/include/msdk/include/mfxstructures.h

@@ -642,7 +642,10 @@ enum {
     MFX_SCENARIO_VIDEO_CONFERENCE    = 2,
     MFX_SCENARIO_VIDEO_CONFERENCE    = 2,
     MFX_SCENARIO_ARCHIVE             = 3,
     MFX_SCENARIO_ARCHIVE             = 3,
     MFX_SCENARIO_LIVE_STREAMING      = 4,
     MFX_SCENARIO_LIVE_STREAMING      = 4,
-    MFX_SCENARIO_CAMERA_CAPTURE      = 5
+    MFX_SCENARIO_CAMERA_CAPTURE      = 5,
+    MFX_SCENARIO_VIDEO_SURVEILLANCE  = 6,
+    MFX_SCENARIO_GAME_STREAMING      = 7,
+    MFX_SCENARIO_REMOTE_GAMING       = 8
 };
 };
 
 
 /* ContentInfo */
 /* ContentInfo */