diff --git a/plugins/obs-qsv11/QSV_Encoder.cpp b/plugins/obs-qsv11/QSV_Encoder.cpp index 87451545f..1d47748a7 100644 --- a/plugins/obs-qsv11/QSV_Encoder.cpp +++ b/plugins/obs-qsv11/QSV_Encoder.cpp @@ -280,17 +280,8 @@ enum qsv_cpu_platform qsv_get_cpu_platform() case 0x45: case 0x46: return QSV_CPU_PLATFORM_HSW; - - case 0x3d: - case 0x47: - case 0x4f: - case 0x56: - return QSV_CPU_PLATFORM_BDW; - - case 0x4e: - case 0x5e: - return QSV_CPU_PLATFORM_SKL; } - //assume newer revisions are at least as capable as Skylake + + //assume newer revisions are at least as capable as Haswell return QSV_CPU_PLATFORM_INTEL; } diff --git a/plugins/obs-qsv11/QSV_Encoder.h b/plugins/obs-qsv11/QSV_Encoder.h index 7546fe222..ffd2a693b 100644 --- a/plugins/obs-qsv11/QSV_Encoder.h +++ b/plugins/obs-qsv11/QSV_Encoder.h @@ -76,9 +76,8 @@ static const struct qsv_rate_control_info qsv_ratecontrols[] = { {"CQP", false}, {"AVBR", false}, {"ICQ", true}, - {"LA_CBR", true}, - {"LA_VBR", true}, {"LA_ICQ", true}, + {"LA", true}, {0, false} }; static const char * const qsv_profile_names[] = { @@ -118,7 +117,6 @@ typedef struct mfxU16 nKeyIntSec; mfxU16 nbFrames; mfxU16 nICQQuality; - bool bMBBRC; } qsv_param_t; enum qsv_cpu_platform { @@ -129,8 +127,6 @@ enum qsv_cpu_platform { QSV_CPU_PLATFORM_SLM, QSV_CPU_PLATFORM_CHT, QSV_CPU_PLATFORM_HSW, - QSV_CPU_PLATFORM_BDW, - QSV_CPU_PLATFORM_SKL, QSV_CPU_PLATFORM_INTEL }; diff --git a/plugins/obs-qsv11/QSV_Encoder_Internal.cpp b/plugins/obs-qsv11/QSV_Encoder_Internal.cpp index 3bf060dc2..77f9cb9ee 100644 --- a/plugins/obs-qsv11/QSV_Encoder_Internal.cpp +++ b/plugins/obs-qsv11/QSV_Encoder_Internal.cpp @@ -198,7 +198,6 @@ 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; @@ -213,7 +212,6 @@ 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; @@ -245,10 +243,6 @@ 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; } @@ -259,17 +253,28 @@ 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; diff --git a/plugins/obs-qsv11/obs-qsv11.c b/plugins/obs-qsv11/obs-qsv11.c index 300aa0a05..2980c97a2 100644 --- a/plugins/obs-qsv11/obs-qsv11.c +++ b/plugins/obs-qsv11/obs-qsv11.c @@ -146,7 +146,7 @@ static void obs_qsv_defaults(obs_data_t *settings) obs_data_set_default_string(settings, "target_usage", "balanced"); obs_data_set_default_int(settings, "bitrate", 2500); obs_data_set_default_int(settings, "max_bitrate", 3000); - obs_data_set_default_string(settings, "profile", "high"); + obs_data_set_default_string(settings, "profile", "main"); obs_data_set_default_int(settings, "async_depth", 4); obs_data_set_default_string(settings, "rate_control", "CBR"); @@ -156,10 +156,9 @@ static void obs_qsv_defaults(obs_data_t *settings) obs_data_set_default_int(settings, "qpp", 23); obs_data_set_default_int(settings, "qpb", 23); obs_data_set_default_int(settings, "icq_quality", 23); - obs_data_set_default_int(settings, "la_depth", 15); + obs_data_set_default_int(settings, "la_depth", 40); obs_data_set_default_int(settings, "keyint_sec", 3); - obs_data_set_default_int(settings, "bframes", 1); } static inline void add_strings(obs_property_t *list, const char *const *strings) @@ -181,14 +180,6 @@ static inline void add_strings(obs_property_t *list, const char *const *strings) #define TEXT_ICQ_QUALITY obs_module_text("ICQQuality") #define TEXT_LA_DEPTH obs_module_text("LookAheadDepth") #define TEXT_KEYINT_SEC obs_module_text("KeyframeIntervalSec") -#define TEXT_BFRAMES obs_module_text("B Frames") -#define TEXT_MBBRC obs_module_text("Content Adaptive Quantization") - -static inline bool is_skl_or_greater_platform() -{ - enum qsv_cpu_platform plat = qsv_get_cpu_platform(); - return (plat >= QSV_CPU_PLATFORM_SKL); -} static bool rate_control_modified(obs_properties_t *ppts, obs_property_t *p, obs_data_t *settings) @@ -228,17 +219,10 @@ static bool rate_control_modified(obs_properties_t *ppts, obs_property_t *p, obs_property_set_visible(p, bVisible); bVisible = astrcmpi(rate_control, "LA_ICQ") == 0 || - astrcmpi(rate_control, "LA_CBR") == 0 || - astrcmpi(rate_control, "LA_VBR") == 0; + astrcmpi(rate_control, "LA") == 0; p = obs_properties_get(ppts, "la_depth"); obs_property_set_visible(p, bVisible); - bVisible = astrcmpi(rate_control, "CBR") == 0 || - astrcmpi(rate_control, "VBR") == 0 || - astrcmpi(rate_control, "AVBR") == 0; - p = obs_properties_get(ppts, "mbbrc"); - obs_property_set_visible(p, bVisible); - return true; } @@ -287,10 +271,6 @@ static obs_properties_t *obs_qsv_props(void *unused) obs_properties_add_int(props, "qpb", "QPB", 1, 51, 1); obs_properties_add_int(props, "icq_quality", TEXT_ICQ_QUALITY, 1, 51, 1); obs_properties_add_int(props, "la_depth", TEXT_LA_DEPTH, 10, 100, 1); - obs_properties_add_int(props, "bframes", TEXT_BFRAMES, 0, 3, 1); - - if (is_skl_or_greater_platform()) - obs_properties_add_bool(props, "mbbrc", TEXT_MBBRC); return props; } @@ -315,8 +295,7 @@ static void update_params(struct obs_qsv *obsqsv, obs_data_t *settings) int la_depth = (int)obs_data_get_int(settings, "la_depth"); int keyint_sec = (int)obs_data_get_int(settings, "keyint_sec"); bool cbr_override = obs_data_get_bool(settings, "cbr"); - int bFrames = (int)obs_data_get_int(settings, "bframes"); - bool mbbrc = obs_data_get_bool(settings, "mbbrc"); + int bFrames = 7; if (obs_data_has_user_value(settings, "bf")) bFrames = (int)obs_data_get_int(settings, "bf"); @@ -362,10 +341,8 @@ static void update_params(struct obs_qsv *obsqsv, obs_data_t *settings) obsqsv->params.nRateControl = MFX_RATECONTROL_ICQ; else if (astrcmpi(rate_control, "LA_ICQ") == 0) obsqsv->params.nRateControl = MFX_RATECONTROL_LA_ICQ; - else if (astrcmpi(rate_control, "LA_VBR") == 0) + else if (astrcmpi(rate_control, "LA") == 0) obsqsv->params.nRateControl = MFX_RATECONTROL_LA; - else if (astrcmpi(rate_control, "LA_CBR") == 0) - obsqsv->params.nRateControl = MFX_RATECONTROL_LA_HRD; obsqsv->params.nAsyncDepth = (mfxU16)async_depth; obsqsv->params.nAccuracy = (mfxU16)accuracy; @@ -383,7 +360,6 @@ static void update_params(struct obs_qsv *obsqsv, obs_data_t *settings) obsqsv->params.nbFrames = (mfxU16)bFrames; obsqsv->params.nKeyIntSec = (mfxU16)keyint_sec; obsqsv->params.nICQQuality = (mfxU16)icq_quality; - obsqsv->params.bMBBRC = mbbrc; info("settings:\n\trate_control: %s", rate_control); @@ -407,8 +383,7 @@ static void update_params(struct obs_qsv *obsqsv, obs_data_t *settings) (int)obsqsv->params.nICQQuality); if (obsqsv->params.nRateControl == MFX_RATECONTROL_LA_ICQ || - obsqsv->params.nRateControl == MFX_RATECONTROL_LA || - obsqsv->params.nRateControl == MFX_RATECONTROL_LA_HRD) + obsqsv->params.nRateControl == MFX_RATECONTROL_LA) blog(LOG_INFO, "\tLookahead Depth:%d", (int)obsqsv->params.nLADEPTH);