From dc2f2f157be13e9166aa17cb04f20c2bd55025f5 Mon Sep 17 00:00:00 2001 From: Kurt Kartaltepe Date: Mon, 30 Jan 2023 19:20:38 -0800 Subject: [PATCH] obs-qsv11: Remove Windows references from common files This cleans up the fairly arbitrary Windows includes and types and unused functions from the common code and replaces them with platform independent equivalents, or platform specific implementations in common_utils. This removes the Windows 8 support to avoid adding an additional platform function to query this. OBS only supports Windows 10 officially, so it's about time we removed it. --- plugins/obs-qsv11/QSV_Encoder.cpp | 14 +++--- plugins/obs-qsv11/QSV_Encoder.h | 2 +- plugins/obs-qsv11/QSV_Encoder_Internal.cpp | 53 ++++++---------------- plugins/obs-qsv11/QSV_Encoder_Internal.h | 1 - plugins/obs-qsv11/common_utils.h | 1 + plugins/obs-qsv11/common_utils_windows.cpp | 7 +++ plugins/obs-qsv11/obs-qsv11-plugin-main.c | 3 +- plugins/obs-qsv11/obs-qsv11.c | 51 +++++++-------------- 8 files changed, 47 insertions(+), 85 deletions(-) diff --git a/plugins/obs-qsv11/QSV_Encoder.cpp b/plugins/obs-qsv11/QSV_Encoder.cpp index abfee9765..26a9a1845 100644 --- a/plugins/obs-qsv11/QSV_Encoder.cpp +++ b/plugins/obs-qsv11/QSV_Encoder.cpp @@ -59,13 +59,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "QSV_Encoder.h" #include "QSV_Encoder_Internal.h" +#include "common_utils.h" #include #include #include -#include -#include -#include -#include #define do_log(level, format, ...) \ blog(level, "[qsv encoder: '%s'] " format, "msdk_impl", ##__VA_ARGS__) @@ -295,7 +292,7 @@ enum qsv_cpu_platform qsv_get_cpu_platform() using std::string; int cpuInfo[4]; - __cpuid(cpuInfo, 0); + util_cpuid(cpuInfo, 0); string vendor; vendor += string((char *)&cpuInfo[1], 4); @@ -305,9 +302,10 @@ enum qsv_cpu_platform qsv_get_cpu_platform() if (vendor != "GenuineIntel") return QSV_CPU_PLATFORM_UNKNOWN; - __cpuid(cpuInfo, 1); - BYTE model = ((cpuInfo[0] >> 4) & 0xF) + ((cpuInfo[0] >> 12) & 0xF0); - BYTE family = ((cpuInfo[0] >> 8) & 0xF) + ((cpuInfo[0] >> 20) & 0xFF); + util_cpuid(cpuInfo, 1); + uint8_t model = ((cpuInfo[0] >> 4) & 0xF) + ((cpuInfo[0] >> 12) & 0xF0); + uint8_t family = + ((cpuInfo[0] >> 8) & 0xF) + ((cpuInfo[0] >> 20) & 0xFF); // See Intel 64 and IA-32 Architectures Software Developer's Manual, // Vol 3C Table 35-1 diff --git a/plugins/obs-qsv11/QSV_Encoder.h b/plugins/obs-qsv11/QSV_Encoder.h index 35aa56c4c..9d2bb0277 100644 --- a/plugins/obs-qsv11/QSV_Encoder.h +++ b/plugins/obs-qsv11/QSV_Encoder.h @@ -56,10 +56,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #pragma once -#include #include "mfxstructures.h" #include "mfxadapter.h" #include +#include #ifdef __cplusplus extern "C" { diff --git a/plugins/obs-qsv11/QSV_Encoder_Internal.cpp b/plugins/obs-qsv11/QSV_Encoder_Internal.cpp index 6a572fecc..4a47b9d7f 100644 --- a/plugins/obs-qsv11/QSV_Encoder_Internal.cpp +++ b/plugins/obs-qsv11/QSV_Encoder_Internal.cpp @@ -58,7 +58,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "QSV_Encoder.h" #include "mfxastructures.h" #include "mfxvideo++.h" -#include #include #define do_log(level, format, ...) \ @@ -87,50 +86,25 @@ QSV_Encoder_Internal::QSV_Encoder_Internal(mfxIMPL &impl, mfxVersion &version, mfxIMPL tempImpl; mfxStatus sts; - m_bIsWindows8OrGreater = IsWindows8OrGreater(); - m_bUseD3D11 = false; + m_bUseD3D11 = true; m_bD3D9HACK = true; - m_bUseTexAlloc = (m_bUseD3D11 || m_bD3D9HACK); + m_bUseTexAlloc = true; - if (m_bIsWindows8OrGreater) { - tempImpl = impl | MFX_IMPL_VIA_D3D11; - sts = m_session.Init(tempImpl, &version); - if (sts == MFX_ERR_NONE) { - m_session.QueryVersion(&version); - m_session.Close(); + tempImpl = impl | MFX_IMPL_VIA_D3D11; + sts = m_session.Init(tempImpl, &version); + if (sts == MFX_ERR_NONE) { + m_session.QueryVersion(&version); + m_session.Close(); - // Use D3D11 surface - // m_bUseD3D11 = ((version.Major > 1) || - // (version.Major == 1 && version.Minor >= 8)); - m_bUseD3D11 = true; - if (m_bUseD3D11) - blog(LOG_INFO, "\timpl: D3D11\n" - "\tsurf: D3D11"); - else - blog(LOG_INFO, "\timpl: D3D11\n" - "\tsurf: SysMem"); + blog(LOG_INFO, "\timpl: D3D11\n" + "\tsurf: D3D11"); - m_impl = tempImpl; - m_ver = version; - return; - } - } else if (m_bD3D9HACK) { - tempImpl = impl | MFX_IMPL_VIA_D3D9; - sts = m_session.Init(tempImpl, &version); - if (sts == MFX_ERR_NONE) { - m_session.QueryVersion(&version); - m_session.Close(); - - blog(LOG_INFO, "\timpl: D3D09\n" - "\tsurf: Hack"); - - m_impl = tempImpl; - m_ver = version; - return; - } + m_impl = tempImpl; + m_ver = version; + return; } - // Either windows 7 or D3D11 failed at this point. + // D3D11 failed at this point. tempImpl = impl | MFX_IMPL_VIA_D3D9; sts = m_session.Init(tempImpl, &version); if (sts == MFX_ERR_NONE) { @@ -142,6 +116,7 @@ QSV_Encoder_Internal::QSV_Encoder_Internal(mfxIMPL &impl, mfxVersion &version, m_impl = tempImpl; m_ver = version; + m_bUseD3D11 = false; } } diff --git a/plugins/obs-qsv11/QSV_Encoder_Internal.h b/plugins/obs-qsv11/QSV_Encoder_Internal.h index 2b34034cc..ddcc6e4aa 100644 --- a/plugins/obs-qsv11/QSV_Encoder_Internal.h +++ b/plugins/obs-qsv11/QSV_Encoder_Internal.h @@ -129,7 +129,6 @@ private: int m_nTaskIdx; int m_nFirstSyncTask; mfxBitstream m_outBitstream; - bool m_bIsWindows8OrGreater; bool m_bUseD3D11; bool m_bD3D9HACK; bool m_bUseTexAlloc; diff --git a/plugins/obs-qsv11/common_utils.h b/plugins/obs-qsv11/common_utils.h index bfbac1fbe..12536190a 100644 --- a/plugins/obs-qsv11/common_utils.h +++ b/plugins/obs-qsv11/common_utils.h @@ -143,3 +143,4 @@ void mfxGetTime(mfxTime *timestamp); //void mfxInitTime(); might need this for Windows double TimeDiffMsec(mfxTime tfinish, mfxTime tstart); +extern "C" void util_cpuid(int cpuinfo[4], int flags); diff --git a/plugins/obs-qsv11/common_utils_windows.cpp b/plugins/obs-qsv11/common_utils_windows.cpp index 6f4c0cdd5..db73f001f 100644 --- a/plugins/obs-qsv11/common_utils_windows.cpp +++ b/plugins/obs-qsv11/common_utils_windows.cpp @@ -9,6 +9,8 @@ #include "common_directx9.h" #endif +#include + /* ======================================================= * Windows implementation of OS-specific utility functions */ @@ -118,6 +120,11 @@ double TimeDiffMsec(mfxTime tfinish, mfxTime tstart) freq; } +void util_cpuid(int cpuinfo[4], int flags) +{ + return __cpuid(cpuinfo, flags); +} + /* (Lain) Functions currently unused */ #if 0 void ClearYUVSurfaceVMem(mfxMemId memId) diff --git a/plugins/obs-qsv11/obs-qsv11-plugin-main.c b/plugins/obs-qsv11/obs-qsv11-plugin-main.c index 87660cd62..b3e17931a 100644 --- a/plugins/obs-qsv11/obs-qsv11-plugin-main.c +++ b/plugins/obs-qsv11/obs-qsv11-plugin-main.c @@ -53,6 +53,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include @@ -85,7 +86,7 @@ size_t adapter_count = 0; static bool enum_luids(void *param, uint32_t idx, uint64_t luid) { struct dstr *cmd = param; - dstr_catf(cmd, " %llX", luid); + dstr_catf(cmd, " %" PRIx64, luid); UNUSED_PARAMETER(idx); return true; } diff --git a/plugins/obs-qsv11/obs-qsv11.c b/plugins/obs-qsv11/obs-qsv11.c index 4c5aa8d8b..1c82601fb 100644 --- a/plugins/obs-qsv11/obs-qsv11.c +++ b/plugins/obs-qsv11/obs-qsv11.c @@ -55,21 +55,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include +#include #include #include #include +#include #include #include #include -#include -#include - -#ifndef _STDINT_H_INCLUDED -#define _STDINT_H_INCLUDED -#endif #include "QSV_Encoder.h" -#include #define do_log(level, format, ...) \ blog(level, "[qsv encoder: '%s'] " format, \ @@ -103,7 +98,7 @@ struct obs_qsv { /* ------------------------------------------------------------------------- */ -static SRWLOCK g_QsvLock = SRWLOCK_INIT; +static pthread_mutex_t g_QsvLock = PTHREAD_MUTEX_INITIALIZER; static unsigned short g_verMajor; static unsigned short g_verMinor; static int64_t g_pts2dtsShift; @@ -139,10 +134,10 @@ static void obs_qsv_stop(void *data); static void clear_data(struct obs_qsv *obsqsv) { if (obsqsv->context) { - AcquireSRWLockExclusive(&g_QsvLock); + pthread_mutex_lock(&g_QsvLock); qsv_encoder_close(obsqsv->context); obsqsv->context = NULL; - ReleaseSRWLockExclusive(&g_QsvLock); + pthread_mutex_unlock(&g_QsvLock); // bfree(obsqsv->sei); bfree(obsqsv->extra_data); @@ -885,9 +880,9 @@ static void *obs_qsv_create(enum qsv_codec codec, obs_data_t *settings, } if (update_settings(obsqsv, settings)) { - AcquireSRWLockExclusive(&g_QsvLock); + pthread_mutex_lock(&g_QsvLock); obsqsv->context = qsv_encoder_open(&obsqsv->params, codec); - ReleaseSRWLockExclusive(&g_QsvLock); + pthread_mutex_unlock(&g_QsvLock); if (obsqsv->context == NULL) warn("qsv failed to load"); @@ -918,9 +913,9 @@ static void *obs_qsv_create(enum qsv_codec codec, obs_data_t *settings, GopPicSize - (GopPicSize / interval) * interval; blog(LOG_INFO, - "\tinterval: %d\n" - "\tGopPictSize: %d\n" - "\tg_pts2dtsShift: %d", + "\tinterval: %" PRId64 "\n" + "\tGopPictSize: %" PRId64 "\n" + "\tg_pts2dtsShift: %" PRId64, interval, GopPicSize, g_pts2dtsShift); } else g_pts2dtsShift = -1; @@ -952,20 +947,6 @@ static void *obs_qsv_create_hevc(obs_data_t *settings, obs_encoder_t *encoder) return obs_qsv_create(QSV_CODEC_HEVC, settings, encoder); } -static HANDLE get_lib(const char *lib) -{ - HMODULE mod = GetModuleHandleA(lib); - if (mod) - return mod; - - mod = LoadLibraryA(lib); - if (!mod) - blog(LOG_INFO, "Failed to load %s", lib); - return mod; -} - -typedef HRESULT(WINAPI *CREATEDXGIFACTORY1PROC)(REFIID, void **); - static void *obs_qsv_create_tex(enum qsv_codec codec, obs_data_t *settings, obs_encoder_t *encoder, const char *fallback_id) { @@ -1376,7 +1357,7 @@ static bool obs_qsv_encode(void *data, struct encoder_frame *frame, if (!frame || !packet || !received_packet) return false; - AcquireSRWLockExclusive(&g_QsvLock); + pthread_mutex_lock(&g_QsvLock); video_t *video = obs_encoder_video(obsqsv->encoder); const struct video_output_info *voi = video_output_get_info(video); @@ -1400,7 +1381,7 @@ static bool obs_qsv_encode(void *data, struct encoder_frame *frame, if (ret < 0) { warn("encode failed"); - ReleaseSRWLockExclusive(&g_QsvLock); + pthread_mutex_unlock(&g_QsvLock); return false; } @@ -1411,7 +1392,7 @@ static bool obs_qsv_encode(void *data, struct encoder_frame *frame, else if (obsqsv->codec == QSV_CODEC_HEVC) parse_packet_hevc(obsqsv, packet, pBS, voi, received_packet); - ReleaseSRWLockExclusive(&g_QsvLock); + pthread_mutex_unlock(&g_QsvLock); return true; } @@ -1432,7 +1413,7 @@ static bool obs_qsv_encode_tex(void *data, uint32_t handle, int64_t pts, if (!packet || !received_packet) return false; - AcquireSRWLockExclusive(&g_QsvLock); + pthread_mutex_lock(&g_QsvLock); video_t *video = obs_encoder_video(obsqsv->encoder); const struct video_output_info *voi = video_output_get_info(video); @@ -1448,7 +1429,7 @@ static bool obs_qsv_encode_tex(void *data, uint32_t handle, int64_t pts, if (ret < 0) { warn("encode failed"); - ReleaseSRWLockExclusive(&g_QsvLock); + pthread_mutex_unlock(&g_QsvLock); return false; } @@ -1459,7 +1440,7 @@ static bool obs_qsv_encode_tex(void *data, uint32_t handle, int64_t pts, else if (obsqsv->codec == QSV_CODEC_HEVC) parse_packet_hevc(obsqsv, packet, pBS, voi, received_packet); - ReleaseSRWLockExclusive(&g_QsvLock); + pthread_mutex_unlock(&g_QsvLock); return true; }