diff --git a/obs-studio/7206.patch b/obs-studio/7206.patch new file mode 100644 index 0000000..521b7ec --- /dev/null +++ b/obs-studio/7206.patch @@ -0,0 +1,624 @@ +diff --git a/plugins/obs-ffmpeg/CMakeLists.txt b/plugins/obs-ffmpeg/CMakeLists.txt +index 3eba00932..778d93ffb 100644 +--- a/plugins/obs-ffmpeg/CMakeLists.txt ++++ b/plugins/obs-ffmpeg/CMakeLists.txt +@@ -108,10 +108,12 @@ if(OS_WINDOWS) + jim-nvenc-ver.h + obs-ffmpeg.rc) + elseif(OS_LINUX OR OS_FREEBSD) ++ add_subdirectory(obs-amf-test) ++ + find_package(Libva REQUIRED) + find_package(Libpci REQUIRED) + +- target_sources(obs-ffmpeg PRIVATE obs-ffmpeg-vaapi.c vaapi-utils.c vaapi-utils.h) ++ target_sources(obs-ffmpeg PRIVATE obs-ffmpeg-vaapi.c vaapi-utils.c vaapi-utils.h texture-amf.cpp) + target_link_libraries(obs-ffmpeg PRIVATE Libva::va Libva::drm Libpci::pci) + endif() + +diff --git a/plugins/obs-ffmpeg/cmake/legacy.cmake b/plugins/obs-ffmpeg/cmake/legacy.cmake +index 5540676ea..78b8c30a1 100644 +--- a/plugins/obs-ffmpeg/cmake/legacy.cmake ++++ b/plugins/obs-ffmpeg/cmake/legacy.cmake +@@ -106,9 +106,10 @@ if(OS_WINDOWS) + obs-ffmpeg.rc) + + elseif(OS_POSIX AND NOT OS_MACOS) ++ add_subdirectory(obs-amf-test) + find_package(Libva REQUIRED) + find_package(Libpci REQUIRED) +- target_sources(obs-ffmpeg PRIVATE obs-ffmpeg-vaapi.c vaapi-utils.c vaapi-utils.h) ++ target_sources(obs-ffmpeg PRIVATE obs-ffmpeg-vaapi.c vaapi-utils.c vaapi-utils.h texture-amf.cpp) + target_link_libraries(obs-ffmpeg PRIVATE Libva::va Libva::drm LIBPCI::LIBPCI) + endif() + +diff --git a/plugins/obs-ffmpeg/obs-amf-test/CMakeLists.txt b/plugins/obs-ffmpeg/obs-amf-test/CMakeLists.txt +index e00cef1cf..07cf1e0fc 100644 +--- a/plugins/obs-ffmpeg/obs-amf-test/CMakeLists.txt ++++ b/plugins/obs-ffmpeg/obs-amf-test/CMakeLists.txt +@@ -6,8 +6,14 @@ find_package(AMF 1.4.29 REQUIRED) + + target_include_directories(obs-amf-test PRIVATE ${CMAKE_SOURCE_DIR}/libobs) + +-target_sources(obs-amf-test PRIVATE obs-amf-test.cpp) +-target_link_libraries(obs-amf-test d3d11 dxgi dxguid AMF::AMF) ++if(OS_WINDOWS) ++ target_sources(obs-amf-test PRIVATE obs-amf-test.cpp) ++ target_link_libraries(obs-amf-test d3d11 dxgi dxguid AMF::AMF) ++elseif(OS_POSIX AND NOT OS_MACOS) ++ find_package(Vulkan REQUIRED) ++ target_sources(obs-amf-test PRIVATE obs-amf-test-linux.cpp) ++ target_link_libraries(obs-amf-test dl Vulkan::Vulkan AMF::AMF) ++endif() + + set_target_properties(obs-amf-test PROPERTIES FOLDER "plugins/obs-ffmpeg") + +diff --git a/plugins/obs-ffmpeg/obs-amf-test/obs-amf-test-linux.cpp b/plugins/obs-ffmpeg/obs-amf-test/obs-amf-test-linux.cpp +new file mode 100644 +index 000000000..db437d851 +--- /dev/null ++++ b/plugins/obs-ffmpeg/obs-amf-test/obs-amf-test-linux.cpp +@@ -0,0 +1,140 @@ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++using namespace amf; ++ ++struct adapter_caps { ++ bool is_amd = false; ++ bool supports_avc = false; ++ bool supports_hevc = false; ++ bool supports_av1 = false; ++}; ++ ++static AMFFactory *amf_factory = nullptr; ++static std::map adapter_info; ++ ++static bool has_encoder(AMFContextPtr &amf_context, const wchar_t *encoder_name) ++{ ++ AMFComponentPtr encoder; ++ AMF_RESULT res = amf_factory->CreateComponent(amf_context, encoder_name, ++ &encoder); ++ return res == AMF_OK; ++} ++ ++static bool get_adapter_caps(uint32_t adapter_idx) ++{ ++ if (adapter_idx) ++ return false; ++ ++ adapter_caps &caps = adapter_info[adapter_idx]; ++ ++ AMF_RESULT res; ++ AMFContextPtr amf_context; ++ res = amf_factory->CreateContext(&amf_context); ++ if (res != AMF_OK) ++ return true; ++ ++ AMFContext1 *context1 = NULL; ++ res = amf_context->QueryInterface(AMFContext1::IID(), ++ (void **)&context1); ++ if (res != AMF_OK) ++ return false; ++ res = context1->InitVulkan(nullptr); ++ context1->Release(); ++ if (res != AMF_OK) ++ return false; ++ ++ caps.is_amd = true; ++ caps.supports_avc = has_encoder(amf_context, AMFVideoEncoderVCE_AVC); ++ caps.supports_hevc = has_encoder(amf_context, AMFVideoEncoder_HEVC); ++ caps.supports_av1 = has_encoder(amf_context, AMFVideoEncoder_AV1); ++ ++ return true; ++} ++ ++int main(void) ++try { ++ AMF_RESULT res; ++ VkResult vkres; ++ ++ VkApplicationInfo app_info = {}; ++ app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; ++ app_info.pApplicationName = "obs-amf-test"; ++ app_info.apiVersion = VK_API_VERSION_1_2; ++ ++ VkInstanceCreateInfo info = {}; ++ info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; ++ info.pApplicationInfo = &app_info; ++ ++ VkInstance instance; ++ vkres = vkCreateInstance(&info, nullptr, &instance); ++ if (vkres != VK_SUCCESS) ++ throw "Failed to initialize Vulkan"; ++ ++ uint32_t device_count; ++ vkres = vkEnumeratePhysicalDevices(instance, &device_count, nullptr); ++ if (vkres != VK_SUCCESS || !device_count) ++ throw "Failed to enumerate Vulkan devices"; ++ ++ VkPhysicalDevice *devices = new VkPhysicalDevice[device_count]; ++ vkres = vkEnumeratePhysicalDevices(instance, &device_count, devices); ++ if (vkres != VK_SUCCESS) ++ throw "Failed to enumerate Vulkan devices"; ++ ++ VkPhysicalDeviceDriverProperties driver_props = {}; ++ driver_props.sType = ++ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES; ++ VkPhysicalDeviceProperties2 device_props = {}; ++ device_props.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; ++ device_props.pNext = &driver_props; ++ vkGetPhysicalDeviceProperties2(devices[0], &device_props); ++ ++ if (strcmp(driver_props.driverName, "AMD proprietary driver")) ++ throw "Not running AMD proprietary driver"; ++ ++ vkDestroyInstance(instance, nullptr); ++ ++ /* --------------------------------------------------------- */ ++ /* try initializing amf, I guess */ ++ ++ void *amf_module = dlopen(AMF_DLL_NAMEA, RTLD_LAZY); ++ if (!amf_module) ++ throw "Failed to load AMF lib"; ++ ++ auto init = (AMFInit_Fn)dlsym(amf_module, AMF_INIT_FUNCTION_NAME); ++ if (!init) ++ throw "Failed to get init func"; ++ ++ res = init(AMF_FULL_VERSION, &amf_factory); ++ if (res != AMF_OK) ++ throw "AMFInit failed"; ++ ++ uint32_t idx = 0; ++ while (get_adapter_caps(idx++)) ++ ; ++ ++ for (auto &[idx, caps] : adapter_info) { ++ printf("[%u]\n", idx); ++ printf("is_amd=%s\n", caps.is_amd ? "true" : "false"); ++ printf("supports_avc=%s\n", ++ caps.supports_avc ? "true" : "false"); ++ printf("supports_hevc=%s\n", ++ caps.supports_hevc ? "true" : "false"); ++ printf("supports_av1=%s\n", ++ caps.supports_av1 ? "true" : "false"); ++ } ++ ++ return 0; ++} catch (const char *text) { ++ printf("[error]\nstring=%s\n", text); ++ return 0; ++} +diff --git a/plugins/obs-ffmpeg/obs-ffmpeg.c b/plugins/obs-ffmpeg/obs-ffmpeg.c +index da0b2c2b4..92421c6f3 100644 +--- a/plugins/obs-ffmpeg/obs-ffmpeg.c ++++ b/plugins/obs-ffmpeg/obs-ffmpeg.c +@@ -360,6 +360,9 @@ static bool hevc_vaapi_supported(void) + #ifdef _WIN32 + extern void jim_nvenc_load(bool h264, bool hevc, bool av1); + extern void jim_nvenc_unload(void); ++#endif ++ ++#if defined(_WIN32) || defined(__linux__) + extern void amf_load(void); + extern void amf_unload(void); + #endif +@@ -434,7 +437,7 @@ bool obs_module_load(void) + #endif + } + +-#ifdef _WIN32 ++#if defined(_WIN32) || defined(__linux__) + amf_load(); + #endif + +@@ -475,8 +478,11 @@ void obs_module_unload(void) + obs_ffmpeg_unload_logging(); + #endif + +-#ifdef _WIN32 ++#if defined(_WIN32) || defined(__linux__) + amf_unload(); ++#endif ++ ++#ifdef _WIN32 + jim_nvenc_unload(); + #endif + } +diff --git a/plugins/obs-ffmpeg/texture-amf-opts.hpp b/plugins/obs-ffmpeg/texture-amf-opts.hpp +index b1c37d200..d28e3f77e 100644 +--- a/plugins/obs-ffmpeg/texture-amf-opts.hpp ++++ b/plugins/obs-ffmpeg/texture-amf-opts.hpp +@@ -321,7 +321,7 @@ static void amf_apply_opt(amf_base *enc, obs_option *opt) + val = atoi(opt->value); + } + +- os_utf8_to_wcs(opt->name, 0, wname, _countof(wname)); ++ os_utf8_to_wcs(opt->name, 0, wname, amf_countof(wname)); + if (is_bool) { + bool bool_val = (bool)val; + set_amf_property(enc, wname, bool_val); +diff --git a/plugins/obs-ffmpeg/texture-amf.cpp b/plugins/obs-ffmpeg/texture-amf.cpp +index abd1d6f92..871087710 100644 +--- a/plugins/obs-ffmpeg/texture-amf.cpp ++++ b/plugins/obs-ffmpeg/texture-amf.cpp +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -18,6 +19,7 @@ + #include + #include + ++#ifdef _WIN32 + #include + #include + #include +@@ -25,6 +27,8 @@ + #include + #include + #include ++#endif ++ + #include + #include + #include +@@ -55,8 +59,10 @@ struct amf_error { + + struct handle_tex { + uint32_t handle; ++#ifdef _WIN32 + ComPtr tex; + ComPtr km; ++#endif + }; + + struct adapter_caps { +@@ -72,7 +78,7 @@ static std::map caps; + static bool h264_supported = false; + static AMFFactory *amf_factory = nullptr; + static AMFTrace *amf_trace = nullptr; +-static HMODULE amf_module = nullptr; ++static void *amf_module = nullptr; + static uint64_t amf_version = 0; + + /* ========================================================================= */ +@@ -120,9 +126,11 @@ struct amf_base { + virtual void init() = 0; + }; + +-using d3dtex_t = ComPtr; + using buf_t = std::vector; + ++#ifdef _WIN32 ++using d3dtex_t = ComPtr; ++ + struct amf_texencode : amf_base, public AMFSurfaceObserver { + volatile bool destroying = false; + +@@ -159,6 +167,7 @@ struct amf_texencode : amf_base, public AMFSurfaceObserver { + throw amf_error("InitDX11 failed", res); + } + }; ++#endif + + struct amf_fallback : amf_base, public AMFSurfaceObserver { + volatile bool destroying = false; +@@ -186,9 +195,21 @@ struct amf_fallback : amf_base, public AMFSurfaceObserver { + + void init() override + { ++#if defined(_WIN32) + AMF_RESULT res = amf_context->InitDX11(nullptr, AMF_DX11_1); + if (res != AMF_OK) + throw amf_error("InitDX11 failed", res); ++#elif defined(__linux__) ++ AMFContext1 *context1 = NULL; ++ AMF_RESULT res = amf_context->QueryInterface( ++ AMFContext1::IID(), (void **)&context1); ++ if (res != AMF_OK) ++ throw amf_error("CreateContext1 failed", res); ++ res = context1->InitVulkan(nullptr); ++ context1->Release(); ++ if (res != AMF_OK) ++ throw amf_error("InitVulkan failed", res); ++#endif + } + }; + +@@ -230,13 +251,18 @@ static void set_amf_property(amf_base *enc, const wchar_t *name, const T &value) + : (enc->codec == amf_codec_type::HEVC) \ + ? AMF_VIDEO_ENCODER_HEVC_##name \ + : AMF_VIDEO_ENCODER_AV1_##name) ++#define get_opt_name_enum(name) \ ++ ((enc->codec == amf_codec_type::AVC) ? (int)AMF_VIDEO_ENCODER_##name \ ++ : (enc->codec == amf_codec_type::HEVC) \ ++ ? (int)AMF_VIDEO_ENCODER_HEVC_##name \ ++ : (int)AMF_VIDEO_ENCODER_AV1_##name) + #define set_opt(name, value) set_amf_property(enc, get_opt_name(name), value) + #define get_opt(name, value) get_amf_property(enc, get_opt_name(name), value) + #define set_avc_opt(name, value) set_avc_property(enc, name, value) + #define set_hevc_opt(name, value) set_hevc_property(enc, name, value) + #define set_av1_opt(name, value) set_av1_property(enc, name, value) + #define set_enum_opt(name, value) \ +- set_amf_property(enc, get_opt_name(name), get_opt_name(name##_##value)) ++ set_amf_property(enc, get_opt_name(name), get_opt_name_enum(name##_##value)) + #define set_avc_enum(name, value) \ + set_avc_property(enc, name, AMF_VIDEO_ENCODER_##name##_##value) + #define set_hevc_enum(name, value) \ +@@ -247,6 +273,7 @@ static void set_amf_property(amf_base *enc, const wchar_t *name, const T &value) + /* ------------------------------------------------------------------------- */ + /* Implementation */ + ++#ifdef _WIN32 + static HMODULE get_lib(const char *lib) + { + HMODULE mod = GetModuleHandleA(lib); +@@ -393,6 +420,7 @@ static void get_tex_from_handle(amf_texencode *enc, uint32_t handle, + *km_out = km.Detach(); + *tex_out = tex.Detach(); + } ++#endif + + static constexpr amf_int64 macroblock_size = 16; + +@@ -504,7 +532,7 @@ static void convert_to_encoder_packet(amf_base *enc, AMFDataPtr &data, + enc->packet_data = AMFBufferPtr(data); + data->GetProperty(L"PTS", &packet->pts); + +- const wchar_t *get_output_type; ++ const wchar_t *get_output_type = NULL; + switch (enc->codec) { + case amf_codec_type::AVC: + get_output_type = AMF_VIDEO_ENCODER_OUTPUT_DATA_TYPE; +@@ -638,6 +666,7 @@ static void amf_encode_base(amf_base *enc, AMFSurface *amf_surf, + static bool amf_encode_tex(void *data, uint32_t handle, int64_t pts, + uint64_t lock_key, uint64_t *next_key, + encoder_packet *packet, bool *received_packet) ++#ifdef _WIN32 + try { + amf_texencode *enc = (amf_texencode *)data; + ID3D11DeviceContext *context = enc->context; +@@ -714,6 +743,18 @@ try { + *received_packet = false; + return false; + } ++#else ++{ ++ UNUSED_PARAMETER(data); ++ UNUSED_PARAMETER(handle); ++ UNUSED_PARAMETER(pts); ++ UNUSED_PARAMETER(lock_key); ++ UNUSED_PARAMETER(next_key); ++ UNUSED_PARAMETER(packet); ++ UNUSED_PARAMETER(received_packet); ++ return false; ++} ++#endif + + static buf_t alloc_buf(amf_fallback *enc) + { +@@ -1177,6 +1218,7 @@ static const char *amf_avc_get_name(void *) + + static inline int get_avc_preset(amf_base *enc, const char *preset) + { ++ UNUSED_PARAMETER(enc); + if (astrcmpi(preset, "quality") == 0) + return AMF_VIDEO_ENCODER_QUALITY_PRESET_QUALITY; + else if (astrcmpi(preset, "speed") == 0) +@@ -1287,7 +1329,7 @@ static bool amf_avc_init(void *data, obs_data_t *settings) + set_avc_property(enc, B_PIC_PATTERN, bf); + + } else if (bf != 0) { +- warn("B-Frames set to %lld but b-frames are not " ++ warn("B-Frames set to %" PRId64 " but b-frames are not " + "supported by this device", + bf); + bf = 0; +@@ -1332,12 +1374,12 @@ static bool amf_avc_init(void *data, obs_data_t *settings) + + info("settings:\n" + "\trate_control: %s\n" +- "\tbitrate: %d\n" +- "\tcqp: %d\n" ++ "\tbitrate: %" PRId64 "\n" ++ "\tcqp: %" PRId64 "\n" + "\tkeyint: %d\n" + "\tpreset: %s\n" + "\tprofile: %s\n" +- "\tb-frames: %d\n" ++ "\tb-frames: %" PRId64 "\n" + "\twidth: %d\n" + "\theight: %d\n" + "\tparams: %s", +@@ -1407,6 +1449,7 @@ static void amf_avc_create_internal(amf_base *enc, obs_data_t *settings) + + static void *amf_avc_create_texencode(obs_data_t *settings, + obs_encoder_t *encoder) ++#ifdef _WIN32 + try { + check_texture_encode_capability(encoder, amf_codec_type::AVC); + +@@ -1429,6 +1472,12 @@ try { + blog(LOG_ERROR, "[texture-amf-h264] %s: %s", __FUNCTION__, err); + return obs_encoder_create_rerouted(encoder, "h264_fallback_amf"); + } ++#else ++{ ++ UNUSED_PARAMETER(settings); ++ return obs_encoder_create_rerouted(encoder, "h264_fallback_amf"); ++} ++#endif + + static void *amf_avc_create_fallback(obs_data_t *settings, + obs_encoder_t *encoder) +@@ -1521,6 +1570,7 @@ static const char *amf_hevc_get_name(void *) + + static inline int get_hevc_preset(amf_base *enc, const char *preset) + { ++ UNUSED_PARAMETER(enc); + if (astrcmpi(preset, "balanced") == 0) + return AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_BALANCED; + else if (astrcmpi(preset, "speed") == 0) +@@ -1640,8 +1690,8 @@ static bool amf_hevc_init(void *data, obs_data_t *settings) + + info("settings:\n" + "\trate_control: %s\n" +- "\tbitrate: %d\n" +- "\tcqp: %d\n" ++ "\tbitrate: %" PRId64 "\n" ++ "\tcqp: %" PRId64 "\n" + "\tkeyint: %d\n" + "\tpreset: %s\n" + "\tprofile: %s\n" +@@ -1758,6 +1808,7 @@ static void amf_hevc_create_internal(amf_base *enc, obs_data_t *settings) + + static void *amf_hevc_create_texencode(obs_data_t *settings, + obs_encoder_t *encoder) ++#ifdef _WIN32 + try { + check_texture_encode_capability(encoder, amf_codec_type::HEVC); + +@@ -1780,6 +1831,12 @@ try { + blog(LOG_ERROR, "[texture-amf-h265] %s: %s", __FUNCTION__, err); + return obs_encoder_create_rerouted(encoder, "h265_fallback_amf"); + } ++#else ++{ ++ UNUSED_PARAMETER(settings); ++ return obs_encoder_create_rerouted(encoder, "h265_fallback_amf"); ++} ++#endif + + static void *amf_hevc_create_fallback(obs_data_t *settings, + obs_encoder_t *encoder) +@@ -1868,6 +1925,7 @@ static const char *amf_av1_get_name(void *) + + static inline int get_av1_preset(amf_base *enc, const char *preset) + { ++ UNUSED_PARAMETER(enc); + if (astrcmpi(preset, "highquality") == 0) + return AMF_VIDEO_ENCODER_AV1_QUALITY_PRESET_HIGH_QUALITY; + else if (astrcmpi(preset, "quality") == 0) +@@ -2001,8 +2059,8 @@ static bool amf_av1_init(void *data, obs_data_t *settings) + + info("settings:\n" + "\trate_control: %s\n" +- "\tbitrate: %d\n" +- "\tcqp: %d\n" ++ "\tbitrate: %" PRId64 "\n" ++ "\tcqp: %" PRId64 "\n" + "\tkeyint: %d\n" + "\tpreset: %s\n" + "\tprofile: %s\n" +@@ -2066,6 +2124,7 @@ static void amf_av1_create_internal(amf_base *enc, obs_data_t *settings) + + static void *amf_av1_create_texencode(obs_data_t *settings, + obs_encoder_t *encoder) ++#ifdef _WIN32 + try { + check_texture_encode_capability(encoder, amf_codec_type::AV1); + +@@ -2088,6 +2147,12 @@ try { + blog(LOG_ERROR, "[texture-amf-av1] %s: %s", __FUNCTION__, err); + return obs_encoder_create_rerouted(encoder, "av1_fallback_amf"); + } ++#else ++{ ++ UNUSED_PARAMETER(settings); ++ return obs_encoder_create_rerouted(encoder, "av1_fallback_amf"); ++} ++#endif + + static void *amf_av1_create_fallback(obs_data_t *settings, + obs_encoder_t *encoder) +@@ -2185,9 +2250,16 @@ static bool enum_luids(void *param, uint32_t idx, uint64_t luid) + return true; + } + ++#ifdef _WIN32 ++#define OBS_AMF_TEST "obs-amf-test.exe" ++#else ++#define OBS_AMF_TEST "obs-amf-test" ++#endif ++ + extern "C" void amf_load(void) + try { + AMF_RESULT res; ++#ifdef _WIN32 + HMODULE amf_module_test; + + /* Check if the DLL is present before running the more expensive */ +@@ -2197,16 +2269,24 @@ try { + if (!amf_module_test) + throw "No AMF library"; + FreeLibrary(amf_module_test); ++#else ++ void *amf_module_test = os_dlopen(AMF_DLL_NAMEA); ++ if (!amf_module_test) ++ throw "No AMF library"; ++ os_dlclose(amf_module_test); ++#endif + + /* ----------------------------------- */ + /* Check for supported codecs */ + +- BPtr test_exe = os_get_executable_path_ptr("obs-amf-test.exe"); ++ BPtr test_exe = os_get_executable_path_ptr(OBS_AMF_TEST); + std::stringstream cmd; + std::string caps_str; + + cmd << test_exe; ++#ifdef _WIN32 + enum_graphics_device_luids(enum_luids, &cmd); ++#endif + + os_process_pipe_t *pp = os_process_pipe_create(cmd.str().c_str(), "r"); + if (!pp) +@@ -2266,12 +2346,12 @@ try { + /* ----------------------------------- */ + /* Init AMF */ + +- amf_module = LoadLibraryW(AMF_DLL_NAME); ++ amf_module = os_dlopen(AMF_DLL_NAMEA); + if (!amf_module) + throw "AMF library failed to load"; + + AMFInit_Fn init = +- (AMFInit_Fn)GetProcAddress(amf_module, AMF_INIT_FUNCTION_NAME); ++ (AMFInit_Fn)os_dlsym(amf_module, AMF_INIT_FUNCTION_NAME); + if (!init) + throw "Failed to get AMFInit address"; + +@@ -2283,7 +2363,7 @@ try { + if (res != AMF_OK) + throw amf_error("GetTrace failed", res); + +- AMFQueryVersion_Fn get_ver = (AMFQueryVersion_Fn)GetProcAddress( ++ AMFQueryVersion_Fn get_ver = (AMFQueryVersion_Fn)os_dlsym( + amf_module, AMF_QUERY_VERSION_FUNCTION_NAME); + if (!get_ver) + throw "Failed to get AMFQueryVersion address"; +@@ -2322,7 +2402,7 @@ try { + } catch (const amf_error &err) { + /* doing an error here because it means at least the library has loaded + * successfully, so they probably have AMD at this point */ +- blog(LOG_ERROR, "%s: %s: 0x%lX", __FUNCTION__, err.str, ++ blog(LOG_ERROR, "%s: %s: 0x%uX", __FUNCTION__, err.str, + (uint32_t)err.res); + } + diff --git a/obs-studio/PKGBUILD b/obs-studio/PKGBUILD index a8ea954..7379b09 100644 --- a/obs-studio/PKGBUILD +++ b/obs-studio/PKGBUILD @@ -7,12 +7,16 @@ pkgname=obs-studio pkgver=29.1.3 -pkgrel=01 -pkgdesc="Free and open source software for video recording and live streaming. w/o systemd pipewire pulseaudio" -depends=('ffmpeg' 'jansson' 'libxinerama' 'libxkbcommon-x11' 'mbedtls' 'rnnoise' 'pciutils' - 'qt5-svg' 'curl' 'jack2' 'gtk-update-icon-cache' 'libxcomposite') -makedepends=('cmake' 'libfdk-aac' 'x264' 'swig' 'python' 'luajit' 'sndio') +pkgrel=03 +pkgdesc="Free and open source software for video recording and live streaming Includes new AMF encoding patch w/o systemd pipewire pulseaudio" +depends=('ffmpeg' 'jansson' 'libxinerama' + 'libxkbcommon-x11' 'mbedtls' 'rnnoise' 'pciutils' + 'qt5-svg' 'curl' 'jack2' + 'gtk-update-icon-cache' 'libxcomposite' 'amf-headers' 'vulkan-headers') +makedepends=('git' 'cmake' 'libfdk-aac' 'x264' 'swig' 'python' 'luajit' 'sndio' 'amf-headers' 'vulkan-headers') url="https://obsproject.com" +provides=("obs-studio=$pkgver") +conflicts=("obs-studio-git" "obs-studio-rc" 'obs-studio-amf') url2="https://github.com/obsproject/obs-studio" optdepends=('libfdk-aac: FDK AAC codec support' 'libva-intel-driver: hardware encoding' @@ -22,21 +26,25 @@ optdepends=('libfdk-aac: FDK AAC codec support' 'python: scripting support' 'sndio: Sndio input client' 'v4l2loopback-dkms: virtual camera support') -provides=("obs-studio=$pkgver") -conflicts=("obs-studio-git" "obs-studio-rc") - -source=($pkgname-$pkgver.tar.gz::https://github.com/jp9000/obs-studio/archive/$pkgver.tar.gz +_commit=17484b914851f8dab6dae235ef2357db37936cc9 # tags/29.1.3 +#source=(obs-studio::git+https://github.com/obsproject/obs-studio.git#tag=$pkgver +source=(obs-studio::git+https://github.com/obsproject/obs-studio.git#commit=$_commit +# $pkgname-$pkgver.tar.gz::https://github.com/jp9000/obs-studio/archive/$pkgver.tar.gz fix_python_binary_loading.patch - ignore_unused_submodules.patch) + ignore_unused_submodules.patch + 7206.patch + com.obsproject.Studio.desktop) prepare() { - cd $pkgname-$pkgver - patch -Np1 < "$srcdir"/fix_python_binary_loading.patch - patch -Np1 < "$srcdir"/ignore_unused_submodules.patch + cd $pkgname + patch -Np1 < "$srcdir"/fix_python_binary_loading.patch + patch -Np1 < "$srcdir"/ignore_unused_submodules.patch +## new AMF encoding patch + patch -Np1 <"$srcdir"/7206.patch } build() { - cmake -B build -S $pkgname-$pkgver \ + cmake -B build -S $pkgname \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_INSTALL_LIBDIR=lib \ -DENABLE_BROWSER=OFF \ @@ -47,6 +55,7 @@ build() { -DENABLE_AJA=OFF \ -DENABLE_JACK=ON \ -DENABLE_ALSA=ON \ + -DENABLE_NEW_MPEGTS_OUTPUT=OFF \ -DENABLE_LIBFDK=ON \ -DOBS_VERSION_OVERRIDE="$pkgver" \ -DENABLE_PIPEWIRE=FALSE \ @@ -56,11 +65,9 @@ build() { } package() { -# cd $pkgname/build -# -# make install DESTDIR="$pkgdir" - DESTDIR="$pkgdir" cmake --install build + DESTDIR="$pkgdir" cmake --install build + install -Dm0644 -t "$pkgdir/usr/share/applications/" "com.obsproject.Studio.desktop" } #---- arch license gpg-key & sha256sums ---- @@ -69,9 +76,12 @@ arch=(x86_64) license=(GPL2) -sha256sums=(9d9cfbdbdd255f48a23feeefb60089769a65f52bbca24fa31d74125f3bbb0e90 # obs-studio-29.1.3.tar.gz +sha256sums=(SKIP # obs-studio git +# 9d9cfbdbdd255f48a23feeefb60089769a65f52bbca24fa31d74125f3bbb0e90 # obs-studio-29.1.3.tar.gz bdfbd062f080bc925588aec1989bb1df34bf779cc2fc08ac27236679cf612abd # fix_python_binary_loading.patch - 60b0ee1f78df632e1a8c13cb0a7a5772b2a4b092c4a2a78f23464a7d239557c3) # ignore_unused_submodules.patch + 60b0ee1f78df632e1a8c13cb0a7a5772b2a4b092c4a2a78f23464a7d239557c3 # ignore_unused_submodules.patch + c594d11588b0dc84b2ef3bcb29cf08a574d81ab755d7b319dff9e6890c4a4127 # 7206.patch + 155c6342fc95617f6add6240f06541b6725cbed3f0baa1b77ae6d85832f77f30) # com.obsproject.Studio.desktop -## e98ebe372411f325ca088387dcd667cf59e274064549b77e361fc1eb71ebc4c6 obs-studio-29.1.3-01-x86_64.pkg.tar.lz +## 9a9150b4f772866a7e58ffdd201aad00b717da06a44de9fa59e3e2f970057c24 obs-studio-29.1.3-03-x86_64.pkg.tar.lz diff --git a/obs-studio/PKGBUILD-aur b/obs-studio/PKGBUILD-aur index ce49a60..fba42f7 100644 --- a/obs-studio/PKGBUILD-aur +++ b/obs-studio/PKGBUILD-aur @@ -1,89 +1,64 @@ -# Maintainer: Benjamin Klettbach +# Maintainer: José Miguel Sarasola # Contributor: Jonathan Steel -# Contributor: ArcticVanguard -# Contributor: ledti -pkgname=obs-studio-git -pkgver=28.1.0.beta1 -pkgrel=2 -pkgdesc="Free and open source software for video recording and live streaming." -arch=("i686" "x86_64") -url="https://github.com/obsproject/obs-studio" -license=("GPL2") -depends=("ffmpeg" "jansson" "libxinerama" "libxkbcommon-x11" "mbedtls" - "qt6-svg" "curl" "jack" "gtk-update-icon-cache" - "speexdsp" "pciutils" "libajantv2" "librist") -makedepends=("cmake" "git" "libfdk-aac" "libxcomposite" "x264" - "vlc" "swig" "luajit" "python" "cef-minimal-obs-bin" "wayland" - "qt6-wayland" "pipewire" "xdg-desktop-portal") -optdepends=("libfdk-aac: FDK AAC codec support" - "libxcomposite: XComposite capture support" - "libva-intel-driver: hardware encoding" - "libva-mesa-driver: hardware encoding" - "vlc: VLC Media Source" - "luajit: Lua scripting" - "python: Python scripting" - "v4l2loopback-dkms: Virtual webcam" - "pipewire: Pipewire capture" - "pipewire-media-session: Pipewire capture" - "xdg-desktop-portal: Pipewire capture") -provides=("obs-studio=$pkgver") -conflicts=("obs-studio") -source=("$pkgname::git+https://github.com/obsproject/obs-studio.git#branch=master" - "git+https://github.com/Mixer/ftl-sdk.git" - "git+https://github.com/obsproject/obs-browser.git" - "git+https://github.com/obsproject/obs-vst.git" - "git+https://github.com/obsproject/obs-websocket.git" - "git+https://github.com/chriskohlhoff/asio.git" - "git+https://github.com/nlohmann/json.git" - "git+https://github.com/nayuki/QR-Code-generator.git" - "git+https://github.com/zaphoyd/websocketpp.git" - "fix_python_binary_loading.patch") -md5sums=("SKIP" "SKIP" "SKIP" "SKIP" "SKIP" "SKIP" "SKIP" "SKIP" "SKIP" - "051b90f05e26bff99236b8fb1ad377d1") +# Contributor: Benjamin Klettbach -pkgver() { - cd $pkgname - git describe --long --tags | cut -d- -f1-2 | sed "s/-/\./" -} +pkgname=obs-studio-amf +pkgver=29.1.3 +pkgrel=1 +pkgdesc="Free, open source software for live streaming and recording. Includes new AMF encoding patch & browser plugin" +arch=('x86_64') +url="https://obsproject.com" +license=('GPL2') +depends=('ffmpeg' 'jansson' 'libxinerama' 'libxkbcommon-x11' 'mbedtls' 'rnnoise' 'pciutils' 'nss' + 'qt6-svg' 'qt6-wayland' 'xdg-desktop-portal' 'curl' 'jack' 'gtk-update-icon-cache' 'pipewire' 'libxcomposite' 'amf-amdgpu-pro') +makedepends=('cmake' 'libfdk-aac' 'x264' 'swig' 'python' 'luajit' 'sndio' 'git' 'nlohmann-json' 'websocketpp' 'asio' 'amf-headers') +provides=("obs-studio=$pkgver" "obs-websocket") +conflicts=("obs-studio" "obs-studio-tytan652" "obs-websocket") +optdepends=('libfdk-aac: FDK AAC codec support' + 'libva-intel-driver: hardware encoding' + 'libva-mesa-driver: hardware encoding' + 'luajit: scripting support' + 'python: scripting support' + 'sndio: Sndio input client' + 'v4l2loopback-dkms: virtual camera support') +source=(obs-studio::git+https://github.com/obsproject/obs-studio.git#tag=$pkgver + cef_binary_5060_linux64.tar.bz2::https://cdn-fastly.obsproject.com/downloads/cef_binary_5060_linux64.tar.bz2 + 7206.patch + com.obsproject.Studio.desktop) +md5sums=('SKIP' + '815a03f3436ff29d7d8ef406b1ee0cec' + '6dcf01430679459b744b03f915512935' + '2f0f4b1f1814716d345a8f028b987361') prepare() { - cd $pkgname - gitconf="protocol.file.allow=always" - - patch -Np1 < "$srcdir"/fix_python_binary_loading.patch - git config submodule.plugins/obs-outputs/ftl-sdk.url $srcdir/ftl-sdk - git config submodule.plugins/obs-browser.url $srcdir/obs-browser - git config submodule.plugins/obs-vst.url $srcdir/obs-vst - git config submodule.plugins/obs-websocket.url $srcdir/obs-websocket - git -c $gitconf submodule update - - cd plugins/obs-websocket - git config submodule.deps/asio.url $srcdir/asio - git config submodule.deps/json.url $srcdir/json - git config submodule.deps/qr.url $srcdir/QR-Code-generator - git config submodule.deps/websocketpp.url $srcdir/websocketpp - git -c $gitconf submodule update + tar -xjf ./cef_binary_5060_linux64.tar.bz2 + cd obs-studio + git submodule update --init --recursive + patch -Np1 <"$srcdir"/7206.patch } build() { - cd $pkgname + cd obs-studio + mkdir -p build + cd build - mkdir -p build; cd build + cmake -DCMAKE_INSTALL_PREFIX="/usr" \ + -DENABLE_VST=ON \ + -DENABLE_VLC=OFF \ + -DENABLE_BROWSER=ON \ + -DCEF_ROOT_DIR="../../cef_binary_5060_linux64" \ + -DENABLE_AJA=OFF \ + -DENABLE_JACK=ON \ + -DENABLE_NEW_MPEGTS_OUTPUT=OFF \ + -DOBS_VERSION_OVERRIDE="$pkgver-$pkgrel" .. - cmake \ - -DCMAKE_INSTALL_PREFIX=/usr \ - -DCMAKE_INSTALL_LIBDIR=lib \ - -DBUILD_BROWSER=ON \ - -DCEF_ROOT_DIR="/opt/cef-obs" \ - .. - - make + make } package() { - cd $pkgname/build + cd obs-studio/build + make install DESTDIR="$pkgdir" - make install DESTDIR="$pkgdir" + cd ../.. + install -Dm0644 -t "$pkgdir/usr/share/applications/" "com.obsproject.Studio.desktop" } - -# vim: ts=2:sw=2:expandtab diff --git a/obs-studio/com.obsproject.Studio.desktop b/obs-studio/com.obsproject.Studio.desktop new file mode 100644 index 0000000..c43d008 --- /dev/null +++ b/obs-studio/com.obsproject.Studio.desktop @@ -0,0 +1,97 @@ +[Desktop Entry] +Version=1.0 +Name=OBS Studio +GenericName=Streaming/Recording Software +Comment=Free and Open Source Streaming/Recording Software +Exec=env XCURSOR_SIZE=24 VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/amd_pro_icd64.json obs +Icon=com.obsproject.Studio +Terminal=false +Type=Application +Categories=AudioVideo;Recorder; +StartupNotify=true +StartupWMClass=obs + +GenericName[an_ES]=Programa de retransmisión/gravación +Comment[an_ES]=Program de retransmisión/gravación libre y de codigo ubierto +GenericName[ar_SA]=برامج البث / التسجيل +Comment[ar_SA]=برنامج بث / تسجيل مجاني ومفتوح المصدر +GenericName[bn_BD]=স্ট্রিমিং/রেকর্ডিং সফটওয়্যার +Comment[bn_BD]=ফ্রি এবং মুক্ত সোর্স স্ট্রিমিং/রেকর্ডিং সফ্টওয়্যার +GenericName[ca_ES]=Programa de retransmissió/enregistrament +Comment[ca_ES]=Programa de retransmissió/enregistrament de codi lliure i gratuït +GenericName[cs_CZ]=Software pro vysílání a nahrávání +Comment[cs_CZ]=Svobodný software pro vysílání a nahrávání +GenericName[da_DK]=Streaming-/optagelsessoftware +Comment[da_DK]=Gratis og open-source streaming-/optagelsessoftware +GenericName[de_DE]=Streaming-/Aufnahme-Software +Comment[de_DE]=Freie und Open-Source-Streaming-/Aufnahme-Software +GenericName[el_GR]=Λογισμικό Ροής/Καταγραφής +Comment[el_GR]=Δωρεαν Λογισμικό Streaming/Kαταγραφή ανοιχτου κωδικα +GenericName[en_GB]=Streaming/Recording Software +Comment[en_GB]=Free and Open Source Streaming/Recording Software +GenericName[es_ES]=Disfusion digital/ Software de grabacion +Comment[es_ES]=Difusion Digital/Software de grabacion Gratis y con Fuentes Abiertas +GenericName[et_EE]=Video voogesituse ja salvestuse tarkvara +Comment[et_EE]=Tasuta ja avatud lähtekoodiga video voogesituse ja salvestuse tarkvara +GenericName[fa_IR]=نرم افزار جریان/ضبط +Comment[fa_IR]=نرم افزار منبع باز و رایگان جریان/ضبط +GenericName[fi_FI]=Striimaus-/tallennusohjelmisto +Comment[fi_FI]=Ilmainen ja avoimen lähdekoodin striimaus-/tallennusohjelmisto +GenericName[fil_PH]=Software para sa Streaming/Recording +Comment[fil_PH]=Libre at Open Source na Streaming/Recording Software +GenericName[fr_FR]=Logiciel de diffusion/enregistrement +Comment[fr_FR]=Logiciel de diffusion/enregistrement gratuit et Open Source +GenericName[gd_GB]=Bathar-bog sruthaidh/clàraidh +Comment[gd_GB]=Bathar-bog sruthaidh/clàraidh saor le bun-tùs fosgailte +GenericName[he_IL]=תוכנה לשידורים חיים והקלטה +Comment[he_IL]=תכנה חינמית בקוד פתוח לשידורים חיים ולהקלטה +GenericName[hi_IN]=स्ट्रीमिंग/रिकॉर्डिंग सॉफ्टवेयर +Comment[hi_IN]=स्वतंत्र एवं खुले स्रोत वाला स्ट्रीमिंग/रिकॉर्डिंग सॉफ्टवेयर +GenericName[hr_HR]=Softver za emitiranje/snimanje +Comment[hr_HR]=Slobodan softver otvorenog koda za emitiranje/snimanje +GenericName[hu_HU]=Közvetítő/rögzítő szoftver +Comment[hu_HU]=Szabad és nyílt forráskódú közvetítő/rögzítő szoftver +GenericName[id_ID]=Perangkat Lunak Streaming/Perekaman +Comment[id_ID]=Perangkat Lunak Streaming/Perekaman Gratis dan Sumber Terbuka +GenericName[it_IT]=Software per dirette e registrazione schermo +Comment[it_IT]=Software Libero e Open Source Streaming/Registrazione +GenericName[ja_JP]=配信/録画ソフトウェア +Comment[ja_JP]=無料のオープンソース配信/録画ソフトウェア +GenericName[ka_GE]=ვიდეოს ეთერში გამშვები/ჩამწერი პროგრამა +Comment[ka_GE]=თავისუფალი და ღია წყაროს მქონე, ვიდეოს ეთერში გამშვები/ჩამწერი პროგრამა +GenericName[kmr_TR]=Nermalava weşandin/tomarkirin-ê +Comment[kmr_TR]=Nermalava weşandin/tomarkirin-ê belaş û çavkaniya azad +GenericName[ko_KR]=방송 및 녹화 프로그램 +Comment[ko_KR]=무료 오픈소스 방송 및 녹화 프로그램 +GenericName[ms_MY]=Perisian Penstriman/Rakaman +Comment[ms_MY]=Perisian Penstriman/Rakaman Bersumber Terbuka dan Bebas +GenericName[nb_NO]=Strømming- og Opptaksprogramvare +Comment[nb_NO]=Gratis Strømming- og Opptaksprogramvare med Åpen Kildekode +GenericName[nl_NL]=Streaming/Opname Software +Comment[nl_NL]=Vrij en Open Source Streaming/Opname Sofware +GenericName[pl_PL]=Oprogramowanie do transmisji strumieniowej/nagrywania +Comment[pl_PL]=Darmowe i otwarte oprogramowanie do transmisji strumieniowej/nagrywania +GenericName[pt_BR]=Software de Streaming/Gravação +Comment[pt_BR]=Software de Streaming/Gravação de Código Aberto e Livre +GenericName[pt_PT]=Programa de transmissão/gravação +Comment[pt_PT]=Programa de transmissão/gravação livre e de código aberto +GenericName[ro_RO]=Program de Streaming/Înregistrare +Comment[ro_RO]=Program de streaming / înregistrare gratuit și open source +GenericName[ru_RU]=Программа для видеостриминга и видеозаписи +Comment[ru_RU]=Свободное и открытое ПО для видеостриминга и видеозаписи +GenericName[sk_SK]=Streamovací/Nahrávací Software +Comment[sk_SK]=Bezplatný a otvorený streamovací/nahrávací software +GenericName[sl_SI]=Pretočna/snemalna programska oprema +Comment[sl_SI]=Brezplačni in odprtokodna programska oprema za pretakanje/snemanje +GenericName[sv_SE]=Programvara för strömning/inspelning +Comment[sv_SE]=Fri programvara för strömning/inspelning med öppen källkod +GenericName[tr_TR]=Yayın/Kayıt Yazılımı +Comment[tr_TR]=Ücretsiz ve Açık Kaynaklı Yayın/Kayıt Yazılımı +GenericName[uk_UA]=Програма для трансляцій/запису +Comment[uk_UA]=Вільне та відкрите програмне забезпечення для трансляцій/запису +GenericName[vi_VN]=Phần mềm ghi hình/phát luồng +Comment[vi_VN]=Phần mềm ghi hình / phát luồng mở và miễn phí +GenericName[zh_CN]=直播/录像软件 +Comment[zh_CN]=自由且开源的用于直播串流以及视频录制的软件 +GenericName[zh_TW]=串流與錄影軟體 +Comment[zh_TW]=免費,開源的串流與錄影軟體 diff --git a/obs-studio/deps b/obs-studio/deps index 030bda8..2b5ff0d 100644 --- a/obs-studio/deps +++ b/obs-studio/deps @@ -15,5 +15,8 @@ luajit sndio libgit2 jack2 +git +amf-headers +vulkan-headers