obs-qsv11: Fix encoder capping resolution on dgpus

This commit is contained in:
Jim
2022-11-28 08:36:46 -08:00
parent 9435458c46
commit 5c0773e128
5 changed files with 27 additions and 10 deletions
+9 -1
View File
@@ -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)
{
+1
View File
@@ -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 *,
+5 -3
View File
@@ -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)) {
+4 -1
View File
@@ -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;
+8 -5
View File
@@ -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)