1
0
Эх сурвалжийг харах

obs-qsv11: Remove statics, fix buffer misuse

This whole "array of pointers" thing is very dumb and dangerous.
jp9000 3 жил өмнө
parent
commit
dd61943ddf

+ 24 - 25
plugins/obs-qsv11/QSV_Encoder_Internal.cpp

@@ -61,6 +61,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include <VersionHelpers.h>
 #include <obs-module.h>
 
+#include <vector>
+
 #define do_log(level, format, ...) \
 	blog(level, "[qsv encoder: '%s'] " format, "msdk_impl", ##__VA_ARGS__)
 
@@ -298,8 +300,7 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,
 		(mfxU16)(pParams->nKeyIntSec * pParams->nFpsNum /
 			 (float)pParams->nFpsDen);
 
-	static mfxExtBuffer *extendedBuffers[7];
-	int iBuffers = 0;
+	std::vector<mfxExtBuffer *> extendedBuffers;
 
 	if (m_ver.Major == 1 && m_ver.Minor >= 8) {
 		memset(&m_co2, 0, sizeof(mfxExtCodingOption2));
@@ -322,7 +323,7 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,
 				m_co2.LookAheadDepth = pParams->nLADEPTH;
 			}
 		}
-		extendedBuffers[iBuffers++] = (mfxExtBuffer *)&m_co2;
+		extendedBuffers.push_back((mfxExtBuffer *)&m_co2);
 	}
 
 	if ((m_mfxEncParams.mfx.LowPower == MFX_CODINGOPTION_ON) ||
@@ -331,12 +332,7 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,
 		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;
-	}
-
-	if (iBuffers > 0) {
-		m_mfxEncParams.ExtParam = extendedBuffers;
-		m_mfxEncParams.NumExtParam = (mfxU16)iBuffers;
+		extendedBuffers.push_back((mfxExtBuffer *)&m_co3);
 	}
 
 	if (codec == QSV_CODEC_HEVC) {
@@ -347,8 +343,8 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,
 			m_ExtHEVCParam.PicWidthInLumaSamples = pParams->nWidth;
 			m_ExtHEVCParam.PicHeightInLumaSamples =
 				pParams->nHeight;
-			extendedBuffers[iBuffers++] =
-				(mfxExtBuffer *)&m_ExtHEVCParam;
+			extendedBuffers.push_back(
+				(mfxExtBuffer *)&m_ExtHEVCParam);
 		}
 	}
 
@@ -362,7 +358,7 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,
 	m_ExtVideoSignalInfo.TransferCharacteristics =
 		pParams->TransferCharacteristics;
 	m_ExtVideoSignalInfo.MatrixCoefficients = pParams->MatrixCoefficients;
-	extendedBuffers[iBuffers++] = (mfxExtBuffer *)&m_ExtVideoSignalInfo;
+	extendedBuffers.push_back((mfxExtBuffer *)&m_ExtVideoSignalInfo);
 
 /* TODO: Ask Intel why this is MFX_ERR_UNSUPPORTED */
 #if 0
@@ -374,7 +370,7 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,
 		pParams->ChromaSampleLocTypeTopField;
 	m_ExtChromaLocInfo.ChromaSampleLocTypeBottomField =
 		pParams->ChromaSampleLocTypeBottomField;
-	extendedBuffers[iBuffers++] = (mfxExtBuffer *)&m_ExtChromaLocInfo;
+	extendedBuffers.push_back((mfxExtBuffer *)&m_ExtChromaLocInfo);
 #endif
 
 	if (pParams->MaxContentLightLevel > 0) {
@@ -406,8 +402,8 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,
 			pParams->MaxDisplayMasteringLuminance;
 		m_ExtMasteringDisplayColourVolume.MinDisplayMasteringLuminance =
 			pParams->MinDisplayMasteringLuminance;
-		extendedBuffers[iBuffers++] =
-			(mfxExtBuffer *)&m_ExtMasteringDisplayColourVolume;
+		extendedBuffers.push_back(
+			(mfxExtBuffer *)&m_ExtMasteringDisplayColourVolume);
 
 		memset(&m_ExtContentLightLevelInfo, 0,
 		       sizeof(m_ExtContentLightLevelInfo));
@@ -421,8 +417,8 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,
 			pParams->MaxContentLightLevel;
 		m_ExtContentLightLevelInfo.MaxPicAverageLightLevel =
 			pParams->MaxPicAverageLightLevel;
-		extendedBuffers[iBuffers++] =
-			(mfxExtBuffer *)&m_ExtContentLightLevelInfo;
+		extendedBuffers.push_back(
+			(mfxExtBuffer *)&m_ExtContentLightLevelInfo);
 	}
 
 	// Width must be a multiple of 16
@@ -436,6 +432,9 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,
 	else
 		m_mfxEncParams.IOPattern = MFX_IOPATTERN_IN_SYSTEM_MEMORY;
 
+	m_mfxEncParams.ExtParam = extendedBuffers.data();
+	m_mfxEncParams.NumExtParam = (mfxU16)extendedBuffers.size();
+
 	mfxStatus sts = m_pmfxENC->Query(&m_mfxEncParams, &m_mfxEncParams);
 	if (sts == MFX_ERR_UNSUPPORTED || sts == MFX_ERR_UNDEFINED_BEHAVIOR) {
 		if (m_mfxEncParams.mfx.LowPower == MFX_CODINGOPTION_ON) {
@@ -533,8 +532,8 @@ mfxStatus QSV_Encoder_Internal::GetVideoParam(enum qsv_codec codec)
 	opt.Header.BufferId = MFX_EXTBUFF_CODING_OPTION_SPSPPS;
 	opt.Header.BufferSz = sizeof(mfxExtCodingOptionSPSPPS);
 
-	static mfxExtBuffer *extendedBuffers[1];
-	m_parameter.ExtParam = extendedBuffers;
+	std::vector<mfxExtBuffer *> extendedBuffers;
+	extendedBuffers.reserve(2);
 
 	opt.SPSBuffer = m_SPSBuffer;
 	opt.PPSBuffer = m_PPSBuffer;
@@ -548,14 +547,14 @@ mfxStatus QSV_Encoder_Internal::GetVideoParam(enum qsv_codec codec)
 		opt_vps.VPSBuffer = m_VPSBuffer;
 		opt_vps.VPSBufSize = 1024;
 
-		extendedBuffers[0] = (mfxExtBuffer *)&opt_vps;
-		extendedBuffers[1] = (mfxExtBuffer *)&opt;
-		m_parameter.NumExtParam = 2;
-	} else {
-		extendedBuffers[0] = (mfxExtBuffer *)&opt;
-		m_parameter.NumExtParam = 1;
+		extendedBuffers.push_back((mfxExtBuffer *)&opt_vps);
 	}
 
+	extendedBuffers.push_back((mfxExtBuffer *)&opt);
+
+	m_parameter.ExtParam = extendedBuffers.data();
+	m_parameter.NumExtParam = (mfxU16)extendedBuffers.size();
+
 	mfxStatus sts = m_pmfxENC->GetVideoParam(&m_parameter);
 	MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);