diff --git a/plugins/obs-qsv11/QSV_Encoder.cpp b/plugins/obs-qsv11/QSV_Encoder.cpp index 3c79d4864..abfee9765 100644 --- a/plugins/obs-qsv11/QSV_Encoder.cpp +++ b/plugins/obs-qsv11/QSV_Encoder.cpp @@ -106,9 +106,11 @@ qsv_t *qsv_encoder_open(qsv_param_t *pParams, enum qsv_codec codec) } } + bool isDGPU = adapters[adapter_idx].is_dgpu; impl = impl_list[adapter_idx]; - QSV_Encoder_Internal *pEncoder = new QSV_Encoder_Internal(impl, ver); + QSV_Encoder_Internal *pEncoder = + new QSV_Encoder_Internal(impl, ver, isDGPU); mfxStatus sts = pEncoder->Open(pParams, codec); if (sts != MFX_ERR_NONE) { @@ -197,6 +199,12 @@ qsv_t *qsv_encoder_open(qsv_param_t *pParams, enum qsv_codec codec) return (qsv_t *)pEncoder; } +bool qsv_encoder_is_dgpu(qsv_t *pContext) +{ + QSV_Encoder_Internal *pEncoder = (QSV_Encoder_Internal *)pContext; + return pEncoder->IsDGPU(); +} + int qsv_encoder_headers(qsv_t *pContext, uint8_t **pSPS, uint8_t **pPPS, uint16_t *pnSPS, uint16_t *pnPPS) { diff --git a/plugins/obs-qsv11/QSV_Encoder.h b/plugins/obs-qsv11/QSV_Encoder.h index 997da0869..35aa56c4c 100644 --- a/plugins/obs-qsv11/QSV_Encoder.h +++ b/plugins/obs-qsv11/QSV_Encoder.h @@ -173,6 +173,7 @@ int qsv_param_default_preset(qsv_param_t *, const char *preset, int qsv_encoder_reconfig(qsv_t *, qsv_param_t *); void qsv_encoder_version(unsigned short *major, unsigned short *minor); qsv_t *qsv_encoder_open(qsv_param_t *, enum qsv_codec codec); +bool qsv_encoder_is_dgpu(qsv_t *); int qsv_encoder_encode(qsv_t *, uint64_t, uint8_t *, uint8_t *, uint32_t, uint32_t, mfxBitstream **pBS); int qsv_encoder_encode_tex(qsv_t *, uint64_t, uint32_t, uint64_t, uint64_t *, diff --git a/plugins/obs-qsv11/QSV_Encoder_Internal.cpp b/plugins/obs-qsv11/QSV_Encoder_Internal.cpp index 109722632..43356270c 100644 --- a/plugins/obs-qsv11/QSV_Encoder_Internal.cpp +++ b/plugins/obs-qsv11/QSV_Encoder_Internal.cpp @@ -71,7 +71,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mfxHDL QSV_Encoder_Internal::g_DX_Handle = NULL; mfxU16 QSV_Encoder_Internal::g_numEncodersOpen = 0; -QSV_Encoder_Internal::QSV_Encoder_Internal(mfxIMPL &impl, mfxVersion &version) +QSV_Encoder_Internal::QSV_Encoder_Internal(mfxIMPL &impl, mfxVersion &version, + bool isDGPU) : m_pmfxSurfaces(NULL), m_pmfxENC(NULL), m_nSPSBufferSize(1024), @@ -80,7 +81,8 @@ QSV_Encoder_Internal::QSV_Encoder_Internal(mfxIMPL &impl, mfxVersion &version) m_pTaskPool(NULL), m_nTaskIdx(0), m_nFirstSyncTask(0), - m_outBitstream() + m_outBitstream(), + m_isDGPU(isDGPU) { mfxIMPL tempImpl; mfxStatus sts; @@ -238,7 +240,7 @@ mfxStatus QSV_Encoder_Internal::InitParams(qsv_param_t *pParams, m_mfxEncParams.mfx.LowPower = MFX_CODINGOPTION_OFF; enum qsv_cpu_platform qsv_platform = qsv_get_cpu_platform(); - if ((qsv_platform >= QSV_CPU_PLATFORM_ICL || + if ((m_isDGPU || qsv_platform >= QSV_CPU_PLATFORM_ICL || qsv_platform == QSV_CPU_PLATFORM_UNKNOWN) && (pParams->nbFrames == 0) && (m_ver.Major == 1 && m_ver.Minor >= 31)) { diff --git a/plugins/obs-qsv11/QSV_Encoder_Internal.h b/plugins/obs-qsv11/QSV_Encoder_Internal.h index 0b7197ef0..df5ad45d4 100644 --- a/plugins/obs-qsv11/QSV_Encoder_Internal.h +++ b/plugins/obs-qsv11/QSV_Encoder_Internal.h @@ -63,7 +63,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. class QSV_Encoder_Internal { public: - QSV_Encoder_Internal(mfxIMPL &impl, mfxVersion &version); + QSV_Encoder_Internal(mfxIMPL &impl, mfxVersion &version, bool isDGPU); ~QSV_Encoder_Internal(); mfxStatus Open(qsv_param_t *pParams, enum qsv_codec codec); @@ -82,6 +82,8 @@ public: mfxStatus ReconfigureEncoder(); bool UpdateParams(qsv_param_t *pParams); + bool IsDGPU() const { return m_isDGPU; } + protected: mfxStatus InitParams(qsv_param_t *pParams, enum qsv_codec codec); mfxStatus AllocateSurfaces(); @@ -130,6 +132,7 @@ private: bool m_bIsWindows8OrGreater; bool m_bUseD3D11; bool m_bD3D9HACK; + bool m_isDGPU; static mfxU16 g_numEncodersOpen; static mfxHDL g_DX_Handle; // we only want one handle for all instances to use; diff --git a/plugins/obs-qsv11/obs-qsv11.c b/plugins/obs-qsv11/obs-qsv11.c index 5d1be3d71..755c5174f 100644 --- a/plugins/obs-qsv11/obs-qsv11.c +++ b/plugins/obs-qsv11/obs-qsv11.c @@ -1057,12 +1057,15 @@ static inline bool valid_av1_format(enum video_format format) return format == VIDEO_FORMAT_NV12 || format == VIDEO_FORMAT_P010; } -static inline void cap_resolution(obs_encoder_t *encoder, +static inline void cap_resolution(struct obs_qsv *obsqsv, struct video_scale_info *info) { enum qsv_cpu_platform qsv_platform = qsv_get_cpu_platform(); - uint32_t width = obs_encoder_get_width(encoder); - uint32_t height = obs_encoder_get_height(encoder); + uint32_t width = obs_encoder_get_width(obsqsv->encoder); + uint32_t height = obs_encoder_get_height(obsqsv->encoder); + + if (qsv_encoder_is_dgpu(obsqsv->context)) + qsv_platform = QSV_CPU_PLATFORM_UNKNOWN; info->height = height; info->width = width; @@ -1092,7 +1095,7 @@ static void obs_qsv_video_info(void *data, struct video_scale_info *info) } info->format = pref_format; - cap_resolution(obsqsv->encoder, info); + cap_resolution(obsqsv, info); } static void obs_qsv_video_plus_hdr_info(void *data, @@ -1110,7 +1113,7 @@ static void obs_qsv_video_plus_hdr_info(void *data, } info->format = pref_format; - cap_resolution(obsqsv->encoder, info); + cap_resolution(obsqsv, info); } static mfxU64 ts_obs_to_mfx(int64_t ts, const struct video_output_info *voi)