Browse Source

obs-qsv11: Only reinitialize bitrate

Gale 2 years ago
parent
commit
4b6af813dc

+ 5 - 5
plugins/obs-qsv11/QSV_Encoder.cpp

@@ -267,12 +267,12 @@ int qsv_param_apply_profile(qsv_param_t *, const char *profile)
 int qsv_encoder_reconfig(qsv_t *pContext, qsv_param_t *pParams)
 {
 	QSV_Encoder_Internal *pEncoder = (QSV_Encoder_Internal *)pContext;
-	mfxStatus sts = pEncoder->Reset(pParams);
+	pEncoder->UpdateParams(pParams);
+	mfxStatus sts = pEncoder->ReconfigureEncoder();
 
-	if (sts == MFX_ERR_NONE)
-		return 0;
-	else
-		return -1;
+	if (sts != MFX_ERR_NONE)
+		return false;
+	return true;
 }
 
 enum qsv_cpu_platform qsv_get_cpu_platform()

+ 17 - 0
plugins/obs-qsv11/QSV_Encoder_Internal.cpp

@@ -333,6 +333,23 @@ bool QSV_Encoder_Internal::InitParams(qsv_param_t *pParams)
 	return true;
 }
 
+bool QSV_Encoder_Internal::UpdateParams(qsv_param_t *pParams)
+{
+	switch (pParams->nRateControl) {
+	case MFX_RATECONTROL_CBR:
+		m_mfxEncParams.mfx.TargetKbps = pParams->nTargetBitRate;
+	default:
+		break;
+	}
+
+	return true;
+}
+
+mfxStatus QSV_Encoder_Internal::ReconfigureEncoder()
+{
+	return m_pmfxENC->Reset(&m_mfxEncParams);
+}
+
 mfxStatus QSV_Encoder_Internal::AllocateSurfaces()
 {
 	// Query number of required surfaces for encoder

+ 2 - 0
plugins/obs-qsv11/QSV_Encoder_Internal.h

@@ -75,6 +75,8 @@ public:
 			     mfxBitstream **pBS);
 	mfxStatus ClearData();
 	mfxStatus Reset(qsv_param_t *pParams);
+	mfxStatus ReconfigureEncoder();
+	bool UpdateParams(qsv_param_t *pParams);
 
 protected:
 	bool InitParams(qsv_param_t *pParams);

+ 6 - 13
plugins/obs-qsv11/obs-qsv11.c

@@ -602,22 +602,15 @@ static void load_headers(struct obs_qsv *obsqsv)
 static bool obs_qsv_update(void *data, obs_data_t *settings)
 {
 	struct obs_qsv *obsqsv = data;
-	bool success = update_settings(obsqsv, settings);
-	int ret;
-
-	if (success) {
-		AcquireSRWLockExclusive(&g_QsvLock);
-
-		ret = qsv_encoder_reconfig(obsqsv->context, &obsqsv->params);
-		if (ret != 0)
-			warn("Failed to reconfigure: %d", ret);
+	obsqsv->params.nTargetBitRate =
+		(mfxU16)obs_data_get_int(settings, "bitrate");
 
-		ReleaseSRWLockExclusive(&g_QsvLock);
-
-		return ret == 0;
+	if (!qsv_encoder_reconfig(obsqsv->context, &obsqsv->params)) {
+		warn("Failed to reconfigure");
+		return false;
 	}
 
-	return false;
+	return true;
 }
 
 static void *obs_qsv_create(obs_data_t *settings, obs_encoder_t *encoder)