Sfoglia il codice sorgente

obs-qsv11: Fix RepeatPPS bug

Gale 2 anni fa
parent
commit
550ccc63f2

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

@@ -136,6 +136,7 @@ typedef struct {
 	mfxU16 MaxPicAverageLightLevel;
 	bool bCQM;
 	bool video_fmt_10bit;
+	bool bRepeatHeaders;
 } qsv_param_t;
 
 enum qsv_cpu_platform {

+ 5 - 4
plugins/obs-qsv11/QSV_Encoder_Internal.cpp

@@ -312,14 +312,15 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,
 	memset(&m_co2, 0, sizeof(mfxExtCodingOption2));
 	m_co2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION2;
 	m_co2.Header.BufferSz = sizeof(m_co2);
-	m_co2.RepeatPPS = MFX_CODINGOPTION_OFF;
+	if (pParams->bRepeatHeaders)
+		m_co2.RepeatPPS = MFX_CODINGOPTION_ON;
+	else
+		m_co2.RepeatPPS = MFX_CODINGOPTION_OFF;
 
 	memset(&m_co3, 0, sizeof(mfxExtCodingOption3));
 	m_co3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3;
 	m_co3.Header.BufferSz = sizeof(m_co3);
 
-	if (codec != QSV_CODEC_AVC)
-		m_co2.RepeatPPS = MFX_CODINGOPTION_ON;
 	if (pParams->nbFrames > 1)
 		m_co2.BRefType = MFX_B_REF_PYRAMID;
 
@@ -349,7 +350,7 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams,
 			m_co3.ScenarioInfo = MFX_SCENARIO_GAME_STREAMING;
 		}
 		// CQM to follow UI setting
-		if (pParams->bCQM) {
+		if (pParams->bCQM && !pParams->bRepeatHeaders) {
 			m_co3.AdaptiveCQM = MFX_CODINGOPTION_ON;
 			if (m_co3.ScenarioInfo != MFX_SCENARIO_GAME_STREAMING) {
 				m_co3.ScenarioInfo =

+ 3 - 0
plugins/obs-qsv11/obs-qsv11.c

@@ -187,6 +187,7 @@ static void obs_qsv_defaults(obs_data_t *settings, int ver,
 	obs_data_set_default_string(settings, "latency", "normal");
 	obs_data_set_default_int(settings, "bframes", 3);
 	obs_data_set_default_bool(settings, "enhancements", true);
+	obs_data_set_default_bool(settings, "repeat_headers", false);
 }
 
 static void obs_qsv_defaults_h264_v1(obs_data_t *settings)
@@ -550,6 +551,7 @@ static void update_params(struct obs_qsv *obsqsv, obs_data_t *settings)
 	bool cbr_override = obs_data_get_bool(settings, "cbr");
 	int bFrames = (int)obs_data_get_int(settings, "bframes");
 	bool enhancements = obs_data_get_bool(settings, "enhancements");
+	bool repeat_headers = obs_data_get_bool(settings, "repeat_headers");
 	const char *codec = "";
 
 	if (obs_data_has_user_value(settings, "bf"))
@@ -733,6 +735,7 @@ static void update_params(struct obs_qsv *obsqsv, obs_data_t *settings)
 	obsqsv->params.nKeyIntSec = (mfxU16)keyint_sec;
 	obsqsv->params.nICQQuality = (mfxU16)icq_quality;
 	obsqsv->params.bCQM = enhancements;
+	obsqsv->params.bRepeatHeaders = repeat_headers;
 
 	info("settings:\n"
 	     "\tcodec:          %s\n"