mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-09-21 12:49:40 +08:00
obs-qsv11: Fix encoder capping resolution on dgpus
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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 *,
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user