obs-qsv11: Fix VPL initialization on intel-mediaSDK

VPL does not have a consistent initialization process for the various
backends it dispatches to. So this resolves the new VPL dispatcher
failing to initialize the video session when it dispatches to
intel-mediaSDK backend. On the oneVPL-intel-gpu backend VA-API sessions
are correctly initialized so this wasnt noticed when tested on newer
hardware.
This commit is contained in:
Kurt Kartaltepe 2023-08-12 10:12:46 -07:00 committed by Ryan Foster
parent 4d3f9323b5
commit b6b8f5b80a
4 changed files with 70 additions and 4 deletions

View file

@ -15,6 +15,8 @@ find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
pkg_check_modules(_LIBVA libva)
pkg_check_modules(_LIBVA_DRM libva-drm)
pkg_check_modules(_LIBVA_WAYLAND libva-wayland)
pkg_check_modules(_LIBVA_X11 libva-x11)
endif()
find_path(
@ -35,14 +37,29 @@ find_library(
HINTS ${_LIBVA_DRM_LIBRARY_DIRS}
PATHS /usr/lib /usr/local/lib /opt/local/lib)
find_library(
LIBVA_WAYLAND_LIB
NAMES ${_LIBVA_WAYLAND_LIBRARIES} libva-wayland
HINTS ${_LIBVA_WAYLAND_LIBRARY_DIRS}
PATHS /usr/lib /usr/local/lib /opt/local/lib)
find_library(
LIBVA_X11_LIB
NAMES ${_LIBVA_X11_LIBRARIES} libva-x11
HINTS ${_LIBVA_X11_LIBRARY_DIRS}
PATHS /usr/lib /usr/local/lib /opt/local/lib)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Libva REQUIRED_VARS LIBVA_INCLUDE_DIR LIBVA_LIB LIBVA_DRM_LIB)
mark_as_advanced(LIBVA_INCLUDE_DIR LIBVA_LIB LIBVA_DRM_LIB)
find_package_handle_standard_args(Libva REQUIRED_VARS LIBVA_INCLUDE_DIR LIBVA_LIB LIBVA_DRM_LIB LIBVA_WAYLAND_LIB
LIBVA_X11_LIB)
mark_as_advanced(LIBVA_INCLUDE_DIR LIBVA_LIB LIBVA_DRM_LIB LIBVA_WAYLAND_LIB LIBVA_X11_LIB)
if(LIBVA_FOUND)
set(LIBVA_INCLUDE_DIRS ${LIBVA_INCLUDE_DIR})
set(LIBVA_LIBRARIES ${LIBVA_LIB})
set(LIBVA_DRM_LIBRARIES ${LIBVA_DRM_LIB})
set(LIBVA_WAYLAND_LIBRARIES ${LIBVA_WAYLAND_LIB})
set(LIBVA_X11_LIBRARIES ${LIBVA_X11_LIB})
if(NOT TARGET Libva::va)
if(IS_ABSOLUTE "${LIBVA_LIBRARIES}")
@ -67,4 +84,28 @@ if(LIBVA_FOUND)
set_target_properties(Libva::drm PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBVA_INCLUDE_DIRS}")
endif()
if(NOT TARGET Libva::wayland)
if(IS_ABSOLUTE "${LIBVA_WAYLAND_LIBRARIES}")
add_library(Libva::wayland UNKNOWN IMPORTED)
set_target_properties(Libva::wayland PROPERTIES IMPORTED_LOCATION "${LIBVA_WAYLAND_LIBRARIES}")
else()
add_library(Libva::wayland INTERFACE IMPORTED)
set_target_properties(Libva::wayland PROPERTIES IMPORTED_LIBNAME "${LIBVA_WAYLAND_LIBRARIES}")
endif()
set_target_properties(Libva::wayland PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBVA_INCLUDE_DIRS}")
endif()
if(NOT TARGET Libva::x11)
if(IS_ABSOLUTE "${LIBVA_X11_LIBRARIES}")
add_library(Libva::x11 UNKNOWN IMPORTED)
set_target_properties(Libva::x11 PROPERTIES IMPORTED_LOCATION "${LIBVA_X11_LIBRARIES}")
else()
add_library(Libva::x11 INTERFACE IMPORTED)
set_target_properties(Libva::x11 PROPERTIES IMPORTED_LIBNAME "${LIBVA_X11_LIBRARIES}")
endif()
set_target_properties(Libva::x11 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${LIBVA_INCLUDE_DIRS}")
endif()
endif()

View file

@ -58,5 +58,5 @@ elseif(OS_LINUX)
target_sources(obs-qsv11 PRIVATE common_utils_linux.cpp)
target_link_libraries(obs-qsv11 PRIVATE Libva::va Libva::drm)
target_link_libraries(obs-qsv11 PRIVATE Libva::va Libva::drm Libva::wayland Libva::x11)
endif()

View file

@ -55,7 +55,7 @@ elseif(OS_LINUX)
target_sources(obs-qsv11 PRIVATE common_utils_linux.cpp)
target_link_libraries(obs-qsv11 PRIVATE Libva::va Libva::drm)
target_link_libraries(obs-qsv11 PRIVATE Libva::va Libva::drm Libva::wayland Libva::x11)
endif()
set_target_properties(obs-qsv11 PROPERTIES FOLDER "plugins/obs-qsv11")

View file

@ -5,6 +5,8 @@
#include <util/c99defs.h>
#include <util/dstr.h>
#include <va/va_drm.h>
#include <va/va_x11.h>
#include <va/va_wayland.h>
#include <va/va_str.h>
#include <stdio.h>
#include <stdlib.h>
@ -13,6 +15,9 @@
#include <string.h>
#include <dirent.h>
#include <obs.h>
#include <obs-nix-platform.h>
mfxStatus simple_alloc(mfxHDL pthis, mfxFrameAllocRequest *request,
mfxFrameAllocResponse *response)
{
@ -102,9 +107,29 @@ mfxStatus Initialize(mfxVersion ver, mfxSession *pSession,
cfg, (const mfxU8 *)"mfxImplDescription.AccelerationMode",
impl);
mfxHDL vaDisplay = nullptr;
if (obs_get_nix_platform() == OBS_NIX_PLATFORM_X11_EGL) {
vaDisplay =
vaGetDisplay((Display *)obs_get_nix_platform_display());
} else if (obs_get_nix_platform() == OBS_NIX_PLATFORM_WAYLAND) {
vaDisplay = vaGetDisplayWl(
(wl_display *)obs_get_nix_platform_display());
}
sts = MFXCreateSession(loader, 0, pSession);
MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
// VPL expects the VADisplay to be initialized.
int major;
int minor;
if (vaInitialize(vaDisplay, &major, &minor) != VA_STATUS_SUCCESS) {
vaTerminate(vaDisplay);
return MFX_ERR_DEVICE_FAILED;
}
sts = MFXVideoCORE_SetHandle(*pSession, MFX_HANDLE_VA_DISPLAY,
vaDisplay);
MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
return sts;
}