0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-20 13:08:50 +02:00

obs-qsv11: Remove statics, fix buffer misuse

This whole "array of pointers" thing is very dumb and dangerous.
This commit is contained in:
jp9000 2022-11-22 17:27:10 -08:00
parent fceee90aa9
commit dd61943ddf

View File

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