Projects
Multimedia
obs-studio
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 130
View file
obs-studio.changes
Changed
@@ -1,4 +1,20 @@ ------------------------------------------------------------------- +Wed Oct 29 09:25:35 UTC 2025 - darix <packman@nordisch.org> + +- Add https://patch-diff.githubusercontent.com/raw/obsproject/obs-studio/pull/12328.patch + to fix building with Qt6 > 6.9 + +------------------------------------------------------------------- +Wed Oct 29 09:17:07 UTC 2025 - darix <packman@nordisch.org> + +- Update to version 32.0.2: + * libobs: Update version to 32.0.2 + * mac-syphon: Use opaque effect on non-OpenGL renderer + * libobs-opengl: Treat pixel format 0 in IOSurface as 32BGRA + * obs-browser: Update version to 2.26.3 + * frontend: Use Qt parent-child ownership in OAuth dialog + +------------------------------------------------------------------- Sat Sep 27 09:55:01 UTC 2025 - darix <packman@nordisch.org> - Update to version 32.0.1:
View file
obs-studio.spec
Changed
@@ -39,7 +39,7 @@ %endif Name: obs-studio -Version: 32.0.1 +Version: 32.0.2 Release: 0 Summary: A recording/broadcasting program Group: Productivity/Multimedia/Video/Editors and Convertors @@ -55,6 +55,8 @@ Patch1: 0001-Prefix-modinfo-with-sbin-since-not-in-normal-path.patch Patch2: libx264-optional.patch Patch3: ffmpeg-x11-linking.patch +# quilt refreshed version of https://patch-diff.githubusercontent.com/raw/obsproject/obs-studio/pull/12328.patch +Patch4: 12328.patch BuildRequires: update-desktop-files BuildRequires: cmake >= 2.8.12 BuildRequires: extra-cmake-modules @@ -74,6 +76,7 @@ BuildRequires: pipewire-devel BuildRequires: libpulse-devel BuildRequires: cmake(Qt6Core) +BuildRequires: cmake(Qt6GuiPrivate) BuildRequires: cmake(Qt6Svg) BuildRequires: qt6-base-private-devel BuildRequires: libudev-devel
View file
12328.patch
Added
@@ -0,0 +1,111 @@ +From 26dfacbd4f5217258a2f1c5472a544c65a182d10 Mon Sep 17 00:00:00 2001 +From: tytan652 <tytan652@tytanium.xyz> +Date: Tue, 1 Jul 2025 20:53:48 +0200 +Subject: PATCH frontend: Cleanup Qt GuiPrivate linkage + +Remove unneeded linkages and guard needed ones for Qt versions earlier +than 6.9.0. +--- + frontend/cmake/os-freebsd.cmake | 6 +++++- + frontend/cmake/os-linux.cmake | 6 +++++- + frontend/plugins/aja-output-ui/CMakeLists.txt | 3 --- + frontend/plugins/decklink-output-ui/CMakeLists.txt | 3 --- + frontend/plugins/frontend-tools/CMakeLists.txt | 2 -- + 5 files changed, 10 insertions(+), 10 deletions(-) + +Index: obs-studio/frontend/cmake/os-freebsd.cmake +=================================================================== +--- obs-studio.orig/frontend/cmake/os-freebsd.cmake ++++ obs-studio/frontend/cmake/os-freebsd.cmake +@@ -3,7 +3,11 @@ target_sources( + PRIVATE utility/platform-x11.cpp utility/system-info-posix.cpp utility/CrashHandler_FreeBSD.cpp + ) + target_compile_definitions(obs-studio PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}") +-target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate Qt::DBus procstat) ++target_link_libraries(obs-studio PRIVATE Qt::DBus procstat) ++ ++if(Qt6_VERSION AND Qt6_VERSION VERSION_LESS "6.9.0") ++ target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate) ++endif() + + find_package(Libpci REQUIRED) + target_link_libraries(obs-studio PRIVATE Libpci::pci) +Index: obs-studio/frontend/cmake/os-linux.cmake +=================================================================== +--- obs-studio.orig/frontend/cmake/os-linux.cmake ++++ obs-studio/frontend/cmake/os-linux.cmake +@@ -3,7 +3,11 @@ target_compile_definitions( + obs-studio + PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}" $<$<BOOL:${ENABLE_PORTABLE_CONFIG}>:ENABLE_PORTABLE_CONFIG> + ) +-target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate Qt::DBus) ++target_link_libraries(obs-studio PRIVATE Qt::DBus) ++ ++if(Qt6_VERSION AND Qt6_VERSION VERSION_LESS "6.9.0") ++ target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate) ++endif() + + find_package(Libpci REQUIRED) + target_link_libraries(obs-studio PRIVATE Libpci::pci) +Index: obs-studio/frontend/plugins/aja-output-ui/CMakeLists.txt +=================================================================== +--- obs-studio.orig/frontend/plugins/aja-output-ui/CMakeLists.txt ++++ obs-studio/frontend/plugins/aja-output-ui/CMakeLists.txt +@@ -10,8 +10,6 @@ find_package(LibAJANTV2 REQUIRED) + find_package(Qt6 REQUIRED Widgets) + + if(OS_LINUX OR OS_FREEBSD OR OS_OPENBSD) +- find_package(Qt6 REQUIRED Gui) +- + find_package(X11 REQUIRED) + endif() + +@@ -47,7 +45,6 @@ target_link_libraries( + Qt::Widgets + AJA::LibAJANTV2 + $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:X11::X11> +- $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:Qt::GuiPrivate> + ) + + target_link_options(aja-output-ui PRIVATE $<$<PLATFORM_ID:Windows>:/IGNORE:4099>) +Index: obs-studio/frontend/plugins/decklink-output-ui/CMakeLists.txt +=================================================================== +--- obs-studio.orig/frontend/plugins/decklink-output-ui/CMakeLists.txt ++++ obs-studio/frontend/plugins/decklink-output-ui/CMakeLists.txt +@@ -8,8 +8,6 @@ endif() + find_package(Qt6 REQUIRED Widgets) + + if(OS_LINUX OR OS_FREEBSD OR OS_OPENBSD) +- find_package(Qt6 REQUIRED Gui) +- + find_package(X11 REQUIRED) + endif() + +@@ -38,7 +36,6 @@ target_link_libraries( + Qt::Widgets + "$<$<PLATFORM_ID:Darwin>:$<LINK_LIBRARY:FRAMEWORK,Cocoa.framework>>" + $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:X11::X11> +- $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:Qt::GuiPrivate> + ) + + if(OS_WINDOWS) +Index: obs-studio/frontend/plugins/frontend-tools/CMakeLists.txt +=================================================================== +--- obs-studio.orig/frontend/plugins/frontend-tools/CMakeLists.txt ++++ obs-studio/frontend/plugins/frontend-tools/CMakeLists.txt +@@ -3,7 +3,6 @@ cmake_minimum_required(VERSION 3.28...3. + find_package(Qt6 REQUIRED Widgets) + + if(OS_LINUX OR OS_FREEBSD OR OS_OPENBSD) +- find_package(Qt6 REQUIRED Gui) + find_package(X11 REQUIRED) + endif() + +@@ -65,7 +64,6 @@ target_link_libraries( + Qt::Widgets + "$<$<PLATFORM_ID:Darwin>:$<LINK_LIBRARY:FRAMEWORK,Cocoa>>" + $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:X11::X11> +- $<$<PLATFORM_ID:Linux,FreeBSD,OpenBSD>:Qt::GuiPrivate> + ) + + add_subdirectory("${CMAKE_SOURCE_DIR}/shared/obs-scripting" "${CMAKE_BINARY_DIR}/shared/obs-scripting")
View file
_service
Changed
@@ -1,7 +1,7 @@ <services> <service name="tar_scm" mode="manual"> <param name="versionformat">@PARENT_TAG@</param> - <param name="revision">32.0.1</param> + <param name="revision">32.0.2</param> <param name="url">https://github.com/obsproject/obs-studio.git</param> <param name="versionrewrite-pattern">(\.\d+)-(a-z.*)</param> <param name="versionrewrite-replacement">\1~\2</param>
View file
_servicedata
Changed
@@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/obsproject/obs-studio.git</param> - <param name="changesrevision">0b1229632063a13dfd26cf1cd9dd43431d8c68f6</param> + <param name="changesrevision">c025f210d36ada93c6b9ef2affd0f671b34c9775</param> </service> </servicedata> \ No newline at end of file
View file
obs-studio-32.0.1.tar.xz/.pc
Deleted
-(directory)
View file
obs-studio-32.0.1.tar.xz/.pc/.quilt_patches
Deleted
@@ -1,1 +0,0 @@ -.quilt-patches
View file
obs-studio-32.0.1.tar.xz/.pc/.quilt_series
Deleted
@@ -1,1 +0,0 @@ -series
View file
obs-studio-32.0.1.tar.xz/.pc/.version
Deleted
@@ -1,1 +0,0 @@ -2
View file
obs-studio-32.0.1.tar.xz/.quilt-patches
Deleted
-(symlink to ..)
View file
obs-studio-32.0.1.tar.xz/frontend/dialogs/OAuthLogin.cpp -> obs-studio-32.0.2.tar.xz/frontend/dialogs/OAuthLogin.cpp
Changed
@@ -31,7 +31,7 @@ OBSBasic::InitBrowserPanelSafeBlock(); - cefWidget = cef->create_widget(nullptr, url, panel_cookies); + cefWidget = cef->create_widget(this, url, panel_cookies); if (!cefWidget) { fail = true; return; @@ -71,7 +71,9 @@ void OAuthLogin::reject() { #ifdef BROWSER_AVAILABLE - delete cefWidget; + if (cefWidget) { + cefWidget->closeBrowser(); + } #endif QDialog::reject(); } @@ -79,7 +81,9 @@ void OAuthLogin::accept() { #ifdef BROWSER_AVAILABLE - delete cefWidget; + if (cefWidget) { + cefWidget->closeBrowser(); + } #endif QDialog::accept(); }
View file
obs-studio-32.0.1.tar.xz/libobs-opengl/gl-cocoa.m -> obs-studio-32.0.2.tar.xz/libobs-opengl/gl-cocoa.m
Changed
@@ -482,15 +482,19 @@ break; } + /* Versions of Syphon before 2dc6d31 provide IOSurfaces with pixel format 0. + * A pixel format of 0 means they are invalid, but in practice the IOSurfaces provided by Syphon are always + * 32BGRA. Historically, OBS had a bug that accidentally treated any invalid surface as 32BGRA, so those + * invalid surfaces were never noticed. To keep Syphon working, we need to keep this (wrong) behavior. + * This is suboptimal as IOSurfaces that are actually invalid (possibly coming from somewhere else) also + * get treated as valid 32BGRA, but it is how it is. */ + case 0: case kCVPixelFormatType_32BGRA: { color_format = convert_gs_format(GS_BGRA); internal_format = convert_gs_internal_format(GS_BGRA); texture_type = GL_UNSIGNED_INT_8_8_8_8_REV; break; } - case 0: - blog(LOG_ERROR, "Invalid IOSurface Buffer"); - goto fail; default: blog(LOG_ERROR, "Unexpected pixel format: %d (%c%c%c%c)", pixelFormat, pixelFormat >> 24, pixelFormat >> 16, pixelFormat >> 8, pixelFormat);
View file
obs-studio-32.0.1.tar.xz/libobs/obs-config.h -> obs-studio-32.0.2.tar.xz/libobs/obs-config.h
Changed
@@ -41,7 +41,7 @@ * * Reset to zero each major or minor version */ -#define LIBOBS_API_PATCH_VER 1 +#define LIBOBS_API_PATCH_VER 2 #define MAKE_SEMANTIC_VERSION(major, minor, patch) ((major << 24) | (minor << 16) | patch)
View file
obs-studio-32.0.1.tar.xz/plugins/mac-syphon/syphon.m -> obs-studio-32.0.2.tar.xz/plugins/mac-syphon/syphon.m
Changed
@@ -15,7 +15,8 @@ IOSurfaceRef ref; gs_samplerstate_t *sampler; - gs_effect_t *effect; + gs_effect_t *effect_default; + gs_effect_t *effect_opaque; gs_vertbuffer_t *vertbuffer; gs_texture_t *tex; uint32_t width, height; @@ -314,13 +315,15 @@ s->vertbuffer = create_vertbuffer(); if (gs_get_device_type() == GS_DEVICE_OPENGL) { - s->effect = obs_get_base_effect(OBS_EFFECT_DEFAULT_RECT); + s->effect_default = obs_get_base_effect(OBS_EFFECT_DEFAULT_RECT); + s->effect_opaque = NULL; } else { - s->effect = obs_get_base_effect(OBS_EFFECT_DEFAULT); + s->effect_default = obs_get_base_effect(OBS_EFFECT_DEFAULT); + s->effect_opaque = obs_get_base_effect(OBS_EFFECT_OPAQUE); } obs_leave_graphics(); - return s->sampler != NULL && s->vertbuffer != NULL && s->effect != NULL; + return s->sampler != NULL && s->vertbuffer != NULL && s->effect_default != NULL; } static inline bool create_syphon_listeners(syphon_t s) @@ -647,9 +650,16 @@ gs_load_vertexbuffer(s->vertbuffer); gs_load_indexbuffer(NULL); gs_load_samplerstate(s->sampler, 0); - const char *tech_name = s->allow_transparency ? "Draw" : "DrawOpaque"; - gs_technique_t *tech = gs_effect_get_technique(s->effect, tech_name); - gs_effect_set_texture(gs_effect_get_param_by_name(s->effect, "image"), s->tex); + gs_technique_t *tech; + if (gs_get_device_type() == GS_DEVICE_OPENGL) { + const char *tech_name = s->allow_transparency ? "Draw" : "DrawOpaque"; + tech = gs_effect_get_technique(s->effect_default, tech_name); + gs_effect_set_texture(gs_effect_get_param_by_name(s->effect_default, "image"), s->tex); + } else { + gs_effect_t *draw_effect = s->allow_transparency ? s->effect_default : s->effect_opaque; + tech = gs_effect_get_technique(draw_effect, "Draw"); + gs_effect_set_texture(gs_effect_get_param_by_name(draw_effect, "image"), s->tex); + } gs_technique_begin(tech); gs_technique_begin_pass(tech, 0);
View file
obs-studio-32.0.1.tar.xz/plugins/obs-browser/browser-version.h -> obs-studio-32.0.2.tar.xz/plugins/obs-browser/browser-version.h
Changed
@@ -2,7 +2,7 @@ #define OBS_BROWSER_VERSION_MAJOR 2 #define OBS_BROWSER_VERSION_MINOR 26 -#define OBS_BROWSER_VERSION_PATCH 2 +#define OBS_BROWSER_VERSION_PATCH 3 #ifndef MAKE_SEMANTIC_VERSION #define MAKE_SEMANTIC_VERSION(major, minor, patch) ((major << 24) | (minor << 16) | patch)
View file
obs-studio-32.0.1.tar.xz/plugins/obs-browser/panel/browser-panel-client.cpp -> obs-studio-32.0.2.tar.xz/plugins/obs-browser/panel/browser-panel-client.cpp
Changed
@@ -220,7 +220,7 @@ void QCefBrowserClient::OnBeforeClose(CefRefPtr<CefBrowser>) { if (widget) { - widget->CloseSafely(); + widget->finishCloseBrowser(); } }
View file
obs-studio-32.0.1.tar.xz/plugins/obs-browser/panel/browser-panel-internal.hpp -> obs-studio-32.0.2.tar.xz/plugins/obs-browser/panel/browser-panel-internal.hpp
Changed
@@ -51,7 +51,7 @@ virtual bool zoomPage(int direction) override; virtual void executeJavaScript(const std::string &script) override; - void CloseSafely(); + void finishCloseBrowser(); void Resize(); #ifdef __linux__
View file
obs-studio-32.0.1.tar.xz/plugins/obs-browser/panel/browser-panel.cpp -> obs-studio-32.0.2.tar.xz/plugins/obs-browser/panel/browser-panel.cpp
Changed
@@ -35,6 +35,36 @@ static int zoomLvls = {25, 33, 50, 67, 75, 80, 90, 100, 110, 125, 150, 175, 200, 250, 300, 400}; +namespace { +void detachBrowserWindow(CefRefPtr<CefBrowserHost> host) +{ +#ifdef _WIN32 + HWND hwnd = (HWND)host->GetWindowHandle(); + if (hwnd) { + ShowWindow(hwnd, SW_HIDE); + SetParent(hwnd, nullptr); + } +#elif __APPLE__ + SEL retain = sel_getUid("retain"); + SEL release = sel_getUid("release"); + SEL removeFromSuperview = sel_getUid("removeFromSuperview"); + void *(*msgSend)(id, SEL) = (void *(*)(id, SEL))objc_msgSend; + + id view = static_cast<id>(host->GetWindowHandle()); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + if (view && view->isa) { + msgSend(view, retain); + msgSend(view, removeFromSuperview); + msgSend(view, release); + } +#pragma clang diagnostic pop +#else + UNUSED_PARAMETER(host); +#endif +} +} // namespace + /* ------------------------------------------------------------------------- */ class CookieCheck : public CefCookieVisitor { @@ -158,61 +188,49 @@ void QCefWidgetInternal::closeBrowser() { - CefRefPtr<CefBrowser> browser = cefBrowser; - if (!!browser) { - auto destroyBrowser = =(CefRefPtr<CefBrowser> cefBrowser) { - CefRefPtr<CefClient> client = cefBrowser->GetHost()->GetClient(); - QCefBrowserClient *bc = reinterpret_cast<QCefBrowserClient *>(client.get()); + if (!cefBrowser) { + return; + } - cefBrowser->GetHost()->CloseBrowser(true); + CefRefPtr<CefBrowserHost> host{cefBrowser->GetHost()}; -#if CHROME_VERSION_BUILD >= 6533 - QEventLoop loop; + if (!host) { + return; + } - connect(this, &QCefWidgetInternal::readyToClose, &loop, &QEventLoop::quit); + QEventLoop browserCloseLoop; - QTimer::singleShot(1000, &loop, &QEventLoop::quit); + // Ensure that the native window used by CEF is not attached to the widget view hierarchy while the browser + // is closed. + // + // If the host window is not considered "destroyed" by the time CEF destroys the web contents of the associated + // browser object, it will close the host window itself. The "host" window in this case would be OBS Studio's + // main window however. So to ensure this cannot happen, the native window needs to be detached from the Qt + // view hierarchy so there is no associated host window to close. + auto preCloseBrowser = &host() { + detachBrowserWindow(host); + }; - loop.exec(); -#endif - if (bc) { - bc->widget = nullptr; - } - }; - - /* So you're probably wondering what's going on here. If you - * call CefBrowserHost::CloseBrowser, and it fails to unload - * the web page *before* WM_NCDESTROY is called on the browser - * HWND, it will call an internal CEF function - * CefBrowserPlatformDelegateNativeWin::CloseHostWindow, which - * will attempt to close the browser's main window itself. - * Problem is, this closes the root window containing the - * browser's HWND rather than the browser's specific HWND for - * whatever mysterious reason. If the browser is in a dock - * widget, then the window it closes is, unfortunately, the - * main program's window, causing the entire program to shut - * down. - * - * So, instead, before closing the browser, we need to decouple - * the browser from the widget. To do this, we hide it, then - * remove its parent. */ -#ifdef _WIN32 - HWND hwnd = (HWND)cefBrowser->GetHost()->GetWindowHandle(); - if (hwnd) { - ShowWindow(hwnd, SW_HIDE); - SetParent(hwnd, nullptr); - } -#elif __APPLE__ - // felt hacky, might delete later - void *view = (id)cefBrowser->GetHost()->GetWindowHandle(); - if (*((bool *)view)) - ((void (*)(id, SEL))objc_msgSend)((id)view, sel_getUid("removeFromSuperview")); -#endif + auto closeBrowser = &host() { + host->CloseBrowser(true); + }; + + connect(this, &QCefWidgetInternal::readyToClose, &browserCloseLoop, &QEventLoop::quit); + + QTimer::singleShot(0, &browserCloseLoop, preCloseBrowser); + QTimer::singleShot(0, &browserCloseLoop, closeBrowser); + QTimer::singleShot(1000, &browserCloseLoop, &QEventLoop::quit); - destroyBrowser(browser); - browser = nullptr; - cefBrowser = nullptr; + browserCloseLoop.exec(); + + CefRefPtr<CefClient> client{host->GetClient()}; + + if (client) { + QCefBrowserClient *browserClient{static_cast<QCefBrowserClient *>(client.get())}; + browserClient->widget = nullptr; } + + cefBrowser = nullptr; } #ifdef __linux__ @@ -388,7 +406,7 @@ #endif } -void QCefWidgetInternal::CloseSafely() +void QCefWidgetInternal::finishCloseBrowser() { emit readyToClose(); }
View file
series
Changed
@@ -1,3 +1,4 @@ 0001-Prefix-modinfo-with-sbin-since-not-in-normal-path.patch libx264-optional.patch ffmpeg-x11-linking.patch +12328.patch
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.