Projects
home:darix:branches:Multimedia
obs-studio
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 10
View file
obs-studio.changes
Changed
@@ -1,4 +1,33 @@ ------------------------------------------------------------------- +Fri Nov 01 23:28:55 UTC 2024 - packman@nordisch.org + +- Update to version 31.0.0~beta3: + * obs-websocket: Update version to 5.5.4 + * UI: Add trash and general icon + * UI: Add trash icon + * UI/themes: Fix missing icon in system theme + * UI/themes: Fix control button pressed color in Rachni theme + * graphics-hook: Fix null pointer dereference + * UI: Update profile encoder information after module load + * UI: Open active profile directory via File menu + * librtmp: Use /etc/ssl/certs/ path on FreeBSD + * UI/importers: Translate capture sources depending on WS + * UI: Add TikTok Live Studio Virtual Camera to DLL blocklist + * UI: Restore frontend API events being dispatched during initialization + * UI: Remove LineEditAutoResize widget + * UI: Remove SendChatMessage from YoutubeApiWrappers + * UI: Remove custom YouTube chat input + * linux-pipewire: Fix memory leaks + * cmake: Install desktop files and icons on FreeBSD + * cmake/plugins: Enable -Wswitch on GCC + * UI: Split out Whats New dialog, fix crash on shutdown + * cmake: Fix target_add_resource ARGN support on Linux + * UI: Log Twitch 403 error bodies + * UI: Don't load Restream UI before CEF is ready + * CI: Enable WebRTC on FreeBSD + * build-aux: Remove CEF stripping workaround + +------------------------------------------------------------------- Mon Oct 21 19:14:48 UTC 2024 - packman@nordisch.org - Update to version 31.0.0~beta2:
View file
obs-studio.spec
Changed
@@ -28,7 +28,7 @@ %endif Name: obs-studio -Version: 31.0.0~beta2 +Version: 31.0.0~beta3 Release: 0 Summary: A recording/broadcasting program Group: Productivity/Multimedia/Video/Editors and Convertors
View file
_service
Changed
@@ -1,7 +1,7 @@ <services> <service name="tar_scm" mode="disabled"> <param name="versionformat">@PARENT_TAG@</param> - <param name="revision">31.0.0-beta2</param> + <param name="revision">31.0.0-beta3</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">e8968ba7152120129eddb8f78850819a01530a1b</param> + <param name="changesrevision">24ea5570876f86710812a7a7303497d708adbec0</param> </service> </servicedata> \ No newline at end of file
View file
obs-studio-31.0.0~beta2.tar.xz/UI/lineedit-autoresize.cpp
Deleted
@@ -1,92 +0,0 @@ -#include "moc_lineedit-autoresize.cpp" - -LineEditAutoResize::LineEditAutoResize() : m_maxLength(32767) -{ - connect(this, &LineEditAutoResize::textChanged, this, &LineEditAutoResize::checkTextLength); - connect(document()->documentLayout(), &QAbstractTextDocumentLayout::documentSizeChanged, this, - &LineEditAutoResize::resizeVertically); -} - -void LineEditAutoResize::checkTextLength() -{ - QString text = toPlainText(); - if (text.length() > m_maxLength) { - setPlainText(text.left(m_maxLength)); - QTextCursor cursor = textCursor(); - cursor.setPosition(m_maxLength); - setTextCursor(cursor); - } -} - -int LineEditAutoResize::maxLength() -{ - return m_maxLength; -} - -void LineEditAutoResize::setMaxLength(int length) -{ - m_maxLength = length; -} - -void LineEditAutoResize::keyPressEvent(QKeyEvent *event) -{ - /* Always allow events with modifiers, for example to Copy content */ - Qt::KeyboardModifiers modifiers = event->modifiers(); - if (modifiers != Qt::NoModifier && modifiers != Qt::ShiftModifier) { - QTextEdit::keyPressEvent(event); - return; - } - - switch (event->key()) { - /* Always ignore the return key and send the signal instead */ - case Qt::Key_Return: - event->ignore(); - emit returnPressed(); - break; - /* Always allow navigation and deletion */ - case Qt::Key_Left: - case Qt::Key_Right: - case Qt::Key_Up: - case Qt::Key_Down: - case Qt::Key_PageUp: - case Qt::Key_PageDown: - case Qt::Key_Delete: - case Qt::Key_Backspace: - QTextEdit::keyPressEvent(event); - break; - /* Allow only if the content is not already at max length. - * Some keys with modifiers should still be allowed though - * (for example for Copy), and we don't want to make assumptions - * about which modifiers are okay and which aren't, so let's - * allow all. Actions that will still exceed the limit (like - * Paste) can be caught in a later step. */ - default: - if (toPlainText().length() >= m_maxLength && event->modifiers() == Qt::NoModifier && - !textCursor().hasSelection()) - event->ignore(); - else - QTextEdit::keyPressEvent(event); - break; - } -} - -void LineEditAutoResize::resizeVertically(const QSizeF &newSize) -{ - QMargins margins = contentsMargins(); - setMaximumHeight(newSize.height() + margins.top() + margins.bottom()); -} - -QString LineEditAutoResize::text() -{ - return toPlainText(); -} - -void LineEditAutoResize::setText(const QString &text) -{ - QMetaObject::invokeMethod(this, "SetPlainText", Qt::QueuedConnection, Q_ARG(const QString &, text)); -} - -void LineEditAutoResize::SetPlainText(const QString &text) -{ - setPlainText(text); -}
View file
obs-studio-31.0.0~beta2.tar.xz/UI/lineedit-autoresize.hpp
Deleted
@@ -1,32 +0,0 @@ -#pragma once - -#include <QTextEdit> -#include <QAbstractTextDocumentLayout> -#include <QKeyEvent> - -class LineEditAutoResize : public QTextEdit { - Q_OBJECT - - Q_PROPERTY(int maxLength READ maxLength WRITE setMaxLength) - -public: - LineEditAutoResize(); - int maxLength(); - void setMaxLength(int length); - QString text(); - void setText(const QString &text); - -private: - int m_maxLength; - -signals: - void returnPressed(); - -private slots: - void checkTextLength(); - void resizeVertically(const QSizeF &newSize); - void SetPlainText(const QString &text); - -protected: - virtual void keyPressEvent(QKeyEvent *event) override; -};
View file
obs-studio-31.0.0~beta2.tar.xz/.cirrus.yml -> obs-studio-31.0.0~beta3.tar.xz/.cirrus.yml
Changed
@@ -14,6 +14,7 @@ ffmpeg qt6-base qt6-svg jansson libsysinfo e2fsprogs-libuuid pulseaudio alsa-lib pipewire v4l_compat libpci librist srt nlohmann-json uthash qr-code-generator websocketpp asio vlc swig luajit jackit sndio fdk-aac + libdatachannel script: - cmake -S $(pwd) @@ -23,7 +24,6 @@ -DENABLE_JACK:BOOL=ON -DENABLE_SNDIO:BOOL=ON -DENABLE_LIBFDK:BOOL=ON - -DENABLE_WEBRTC:BOOL=OFF - cmake --build build --config RelWithDebInfo
View file
obs-studio-31.0.0~beta2.tar.xz/UI/auth-restream.cpp -> obs-studio-31.0.0~beta3.tar.xz/UI/auth-restream.cpp
Changed
@@ -123,6 +123,8 @@ void RestreamAuth::LoadUI() { + if (!cef) + return; if (uiLoaded) return; if (!GetChannelInfo())
View file
obs-studio-31.0.0~beta2.tar.xz/UI/auth-twitch.cpp -> obs-studio-31.0.0~beta3.tar.xz/UI/auth-twitch.cpp
Changed
@@ -92,10 +92,11 @@ if (error_code == 403) { OBSMessageBox::warning(OBSBasic::Get(), Str("TwitchAuth.TwoFactorFail.Title"), Str("TwitchAuth.TwoFactorFail.Text"), true); - blog(LOG_WARNING, "%s: %s", __FUNCTION__, + blog(LOG_WARNING, "%s: %s. API response: %s", __FUNCTION__, "Got 403 from Twitch, user probably does not " "have two-factor authentication enabled on " - "their account"); + "their account", + output.empty() ? "<none>" : output.c_str()); return false; }
View file
obs-studio-31.0.0~beta2.tar.xz/UI/auth-youtube.cpp -> obs-studio-31.0.0~beta3.tar.xz/UI/auth-youtube.cpp
Changed
@@ -169,18 +169,16 @@ uiLoaded = true; } -void YoutubeAuth::SetChatId(const QString &chat_id, const std::string &api_chat_id) +void YoutubeAuth::SetChatId(const QString &chat_id) { #ifdef BROWSER_AVAILABLE QString chat_url = QString(YOUTUBE_CHAT_POPOUT_URL).arg(chat_id); if (chat && chat->cefWidget) { chat->cefWidget->setURL(chat_url.toStdString()); - chat->SetApiChatId(api_chat_id); } #else UNUSED_PARAMETER(chat_id); - UNUSED_PARAMETER(api_chat_id); #endif } @@ -188,7 +186,6 @@ { #ifdef BROWSER_AVAILABLE if (chat && chat->cefWidget) { - chat->SetApiChatId(""); chat->cefWidget->setURL(YOUTUBE_CHAT_PLACEHOLDER_URL); } #endif @@ -323,46 +320,6 @@ } #ifdef BROWSER_AVAILABLE -YoutubeChatDock::YoutubeChatDock(const QString &title) : BrowserDock(title) -{ - lineEdit = new LineEditAutoResize(); - lineEdit->setVisible(false); - lineEdit->setMaxLength(200); - lineEdit->setPlaceholderText(QTStr("YouTube.Chat.Input.Placeholder")); - sendButton = new QPushButton(QTStr("YouTube.Chat.Input.Send")); - sendButton->setVisible(false); - - chatLayout = new QHBoxLayout(); - chatLayout->setContentsMargins(0, 0, 0, 0); - chatLayout->addWidget(lineEdit, 1); - chatLayout->addWidget(sendButton); - - QWidget::connect(lineEdit, &LineEditAutoResize::returnPressed, this, &YoutubeChatDock::SendChatMessage); - QWidget::connect(sendButton, &QPushButton::pressed, this, &YoutubeChatDock::SendChatMessage); -} - -void YoutubeChatDock::SetWidget(QCefWidget *widget_) -{ - QVBoxLayout *layout = new QVBoxLayout(); - layout->setContentsMargins(0, 0, 0, 0); - layout->addWidget(widget_, 1); - layout->addLayout(chatLayout); - - QWidget *widget = new QWidget(); - widget->setLayout(layout); - setWidget(widget); - - cefWidget.reset(widget_); - - QWidget::connect(cefWidget.get(), &QCefWidget::urlChanged, this, &YoutubeChatDock::YoutubeCookieCheck); -} - -void YoutubeChatDock::SetApiChatId(const std::string &id) -{ - this->apiChatId = id; - QMetaObject::invokeMethod(this, "EnableChatInput", Qt::QueuedConnection, Q_ARG(bool, !id.empty())); -} - void YoutubeChatDock::YoutubeCookieCheck() { QPointer<YoutubeChatDock> this_ = this; @@ -372,8 +329,6 @@ bool loginStateChanged = (currentlyLoggedIn && !previouslyLoggedIn) || (!currentlyLoggedIn && previouslyLoggedIn); if (loginStateChanged) { - QMetaObject::invokeMethod(this_, "EnableChatInput", Qt::QueuedConnection, - Q_ARG(bool, !currentlyLoggedIn)); OBSBasic *main = OBSBasic::Get(); if (main->GetYouTubeAppDock() != nullptr) { QMetaObject::invokeMethod(main->GetYouTubeAppDock(), "SettingsUpdated", @@ -385,40 +340,4 @@ panel_cookies->CheckForCookie("https://www.youtube.com", "SID", cb); } } - -void YoutubeChatDock::SendChatMessage() -{ - const QString message = lineEdit->text(); - if (message == "") - return; - - OBSBasic *main = OBSBasic::Get(); - YoutubeApiWrappers *apiYouTube(dynamic_cast<YoutubeApiWrappers *>(main->GetAuth())); - - ExecuteFuncSafeBlock(&() { - lineEdit->setText(""); - lineEdit->setPlaceholderText(QTStr("YouTube.Chat.Input.Sending")); - if (apiYouTube->SendChatMessage(apiChatId, message)) { - os_sleep_ms(3000); - } else { - QString error = apiYouTube->GetLastError(); - apiYouTube->GetTranslatedError(error); - QMetaObject::invokeMethod(this, "ShowErrorMessage", Qt::QueuedConnection, - Q_ARG(const QString &, error)); - } - lineEdit->setPlaceholderText(QTStr("YouTube.Chat.Input.Placeholder")); - }); -} - -void YoutubeChatDock::ShowErrorMessage(const QString &error) -{ - QMessageBox::warning(this, QTStr("YouTube.Chat.Error.Title"), QTStr("YouTube.Chat.Error.Text").arg(error)); -} - -void YoutubeChatDock::EnableChatInput(bool visible) -{ - bool setVisible = visible && !isLoggedIn; - lineEdit->setVisible(setVisible); - sendButton->setVisible(setVisible); -} #endif
View file
obs-studio-31.0.0~beta2.tar.xz/UI/auth-youtube.hpp -> obs-studio-31.0.0~beta3.tar.xz/UI/auth-youtube.hpp
Changed
@@ -9,28 +9,23 @@ #ifdef BROWSER_AVAILABLE #include "window-dock-browser.hpp" -#include "lineedit-autoresize.hpp" #include <QHBoxLayout> class YoutubeChatDock : public BrowserDock { Q_OBJECT private: - std::string apiChatId; bool isLoggedIn; - LineEditAutoResize *lineEdit; - QPushButton *sendButton; - QHBoxLayout *chatLayout; public: - YoutubeChatDock(const QString &title); - void SetWidget(QCefWidget *widget_); - void SetApiChatId(const std::string &id); + YoutubeChatDock(const QString &title) : BrowserDock(title) {} + inline void SetWidget(QCefWidget *widget_) + { + BrowserDock::SetWidget(widget_); + QWidget::connect(cefWidget.get(), &QCefWidget::urlChanged, this, &YoutubeChatDock::YoutubeCookieCheck); + } private slots: void YoutubeCookieCheck(); - void SendChatMessage(); - void ShowErrorMessage(const QString &error); - void EnableChatInput(bool visible); }; #endif @@ -59,7 +54,7 @@ YoutubeAuth(const Def &d); ~YoutubeAuth(); - void SetChatId(const QString &chat_id, const std::string &api_chat_id); + void SetChatId(const QString &chat_id); void ResetChat(); void ReloadChat();
View file
obs-studio-31.0.0~beta2.tar.xz/UI/cmake/os-freebsd.cmake -> obs-studio-31.0.0~beta3.tar.xz/UI/cmake/os-freebsd.cmake
Changed
@@ -9,3 +9,36 @@ target_link_libraries(obs-studio PRIVATE Python::Python) target_link_options(obs-studio PRIVATE LINKER:-no-as-needed) endif() + +configure_file(cmake/linux/com.obsproject.Studio.metainfo.xml.in com.obsproject.Studio.metainfo.xml) + +install( + FILES "${CMAKE_CURRENT_BINARY_DIR}/com.obsproject.Studio.metainfo.xml" + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo" +) + +install(FILES cmake/linux/com.obsproject.Studio.desktop DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") + +install( + FILES cmake/linux/icons/obs-logo-128.png + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps" + RENAME com.obsproject.Studio.png +) + +install( + FILES cmake/linux/icons/obs-logo-256.png + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps" + RENAME com.obsproject.Studio.png +) + +install( + FILES cmake/linux/icons/obs-logo-512.png + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/512x512/apps" + RENAME com.obsproject.Studio.png +) + +install( + FILES cmake/linux/icons/obs-logo-scalable.svg + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps" + RENAME com.obsproject.Studio.svg +)
View file
obs-studio-31.0.0~beta2.tar.xz/UI/cmake/ui-elements.cmake -> obs-studio-31.0.0~beta3.tar.xz/UI/cmake/ui-elements.cmake
Changed
@@ -48,8 +48,6 @@ hotkey-edit.hpp item-widget-helpers.cpp item-widget-helpers.hpp - lineedit-autoresize.cpp - lineedit-autoresize.hpp log-viewer.cpp log-viewer.hpp media-controls.cpp
View file
obs-studio-31.0.0~beta2.tar.xz/UI/cmake/ui-windows.cmake -> obs-studio-31.0.0~beta3.tar.xz/UI/cmake/ui-windows.cmake
Changed
@@ -58,4 +58,6 @@ window-projector.hpp window-remux.cpp window-remux.hpp + window-whats-new.cpp + window-whats-new.hpp )
View file
obs-studio-31.0.0~beta2.tar.xz/UI/data/locale/en-US.ini -> obs-studio-31.0.0~beta3.tar.xz/UI/data/locale/en-US.ini
Changed
@@ -1551,23 +1551,12 @@ YouTube.Actions.AutoStartStreamingWarning="Auto-start is disabled for this event, click \"Go Live\" to start your broadcast." YouTube.Actions.AutoStopStreamingWarning="You will not be able to reconnect.<br>Your stream will stop and you will no longer be live." -YouTube.Chat.Input.Send="Send" -YouTube.Chat.Input.Placeholder="Enter message here..." -YouTube.Chat.Input.Sending="Sending..." -YouTube.Chat.Error.Title="Error while sending message" -YouTube.Chat.Error.Text="The message couldn't be sent: %1" - # YouTube API errors in format "YouTube.Errors.<error reason>" YouTube.Errors.liveStreamingNotEnabled="Live streaming is not enabled on the selected YouTube channel.<br/><br/>See <a href='https://www.youtube.com/features'>youtube.com/features</a> for more information." YouTube.Errors.livePermissionBlocked="Live streaming is unavailable on the selected YouTube Channel.<br/>Please note that it may take up to 24 hours for live streaming to become available after enabling it in your channel settings.<br/><br/>See <a href='https://www.youtube.com/features'>youtube.com/features</a> for details." YouTube.Errors.errorExecutingTransition="Transition failed due to a backend error. Please try again in a few seconds." YouTube.Errors.errorStreamInactive="YouTube is not receiving data for your stream. Please check your configuration and try again." YouTube.Errors.invalidTransition="The attempted transition was invalid. This may be due to the stream not having finished a previous transition. Please wait a few seconds and try again." -# Chat errors -YouTube.Errors.liveChatDisabled="Live chat is disabled on this stream." -YouTube.Errors.liveChatEnded="Live stream has ended." -YouTube.Errors.messageTextInvalid="The message text is not valid." -YouTube.Errors.rateLimitExceeded="You are sending messages too quickly." # Browser Dock YouTube.DocksRemoval.Title="Clear Legacy YouTube Browser Docks" YouTube.DocksRemoval.Text="These browser docks will be removed as deprecated:\n\n%1\nUse \"Docks/YouTube Live Control Room\" instead."
View file
obs-studio-31.0.0~beta2.tar.xz/UI/data/themes/System.obt -> obs-studio-31.0.0~beta3.tar.xz/UI/data/themes/System.obt
Changed
@@ -179,6 +179,7 @@ OBSBasicSettings { qproperty-generalIcon: url(:settings/images/settings/general.svg); + qproperty-appearanceIcon: url(:settings/images/settings/appearance.svg); qproperty-streamIcon: url(:settings/images/settings/stream.svg); qproperty-outputIcon: url(:settings/images/settings/output.svg); qproperty-audioIcon: url(:settings/images/settings/audio.svg);
View file
obs-studio-31.0.0~beta2.tar.xz/UI/data/themes/Yami_Rachni.ovt -> obs-studio-31.0.0~beta3.tar.xz/UI/data/themes/Yami_Rachni.ovt
Changed
@@ -219,3 +219,13 @@ qproperty-majorTickColor: palette(window-text); qproperty-minorTickColor: palette(mid); } + +/* Primary Control Button Checked Coloring */ +#streamButton:!hover:!pressed:checked, +#recordButton:!hover:!pressed:checked, +#replayBufferButton:!hover:!pressed:checked, +#virtualCamButton:!hover:!pressed:checked, +#modeSwitch:!hover:!pressed:checked, +#broadcastButton:!hover:!pressed:checked { + background: var(--primary_light); +}
View file
obs-studio-31.0.0~beta3.tar.xz/UI/forms/images/trash.svg
Added
@@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg"> + <path d="m 5.984375 0.00390625 l -1 0.99609375 l -3 0.003906 s -1 0 -1 1 l 0.015625 0.996094 h 15 l -0.015625 -0.996094 c 0 -1 -1 -1 -1 -1 l -3 -0.003906 l -1 -0.99609375 z m -3.984375 3.99609375 v 9 c 0 3 3 3 3 3 h 7 c 3 0 3 -3 3 -3 v -9 h -2 v 9 c 0 1 -1 1 -1 1 h -7 s -1 0 -1 -1 v -9 z m 4 1 v 7 h 1 v -7 z m 2 0 v 7 h 1 v -7 z m 2 0 v 7 h 1 v -7 z m 0 0" fill="#202020"/> +</svg>
View file
obs-studio-31.0.0~beta2.tar.xz/UI/forms/obs.qrc -> obs-studio-31.0.0~beta3.tar.xz/UI/forms/obs.qrc
Changed
@@ -2,6 +2,7 @@ <qresource prefix="/res"> <file>images/save.svg</file> <file>images/media-pause.svg</file> + <file>images/trash.svg</file> <file>images/filter.svg</file> <file>images/mute.svg</file> <file>images/refresh.svg</file> @@ -31,6 +32,7 @@ <file>images/revert.svg</file> <file>images/alert.svg</file> <file>images/warning.svg</file> + <file>images/settings/general.svg</file> <file>images/sources/brush.svg</file> <file>images/sources/camera.svg</file> <file>images/sources/gamepad.svg</file>
View file
obs-studio-31.0.0~beta2.tar.xz/UI/importers/studio.cpp -> obs-studio-31.0.0~beta3.tar.xz/UI/importers/studio.cpp
Changed
@@ -16,6 +16,9 @@ ******************************************************************************/ #include "importers.hpp" +#if !defined(_WIN32) && !defined(__APPLE__) +#include <obs-nix-platform.h> +#endif using namespace std; using namespace json11; @@ -109,7 +112,13 @@ ClearTranslation("av_capture_input", "v4l2_input"); ClearTranslation("dshow_input", "v4l2_input"); - ClearTranslation("window_capture", "xcomposite_input"); + if (obs_get_nix_platform() == OBS_NIX_PLATFORM_X11_EGL) { + ClearTranslation("game_capture", "xcomposite_input"); + ClearTranslation("window_capture", "xcomposite_input"); + } else { + ClearTranslation("game_capture", "pipewire-screen-capture-source"); + ClearTranslation("window_capture", "pipewire-screen-capture-source"); + } if (id == "monitor_capture") { source"id" = "xshm_input";
View file
obs-studio-31.0.0~beta2.tar.xz/UI/win-dll-blocklist.c -> obs-studio-31.0.0~beta3.tar.xz/UI/win-dll-blocklist.c
Changed
@@ -186,6 +186,11 @@ // that results in crashes. // Reference: https://github.com/obsproject/obs-studio/issues/10245 {L"\\streamdeckplugin.dll", 0, 1706745600, TS_LESS_THAN}, + + // TikTok Live Studio Virtual Camera, causes freezing and other issues during enumeration + // Different versions seem to be installed in different places, so we have to match on DLL only. + // Reference: https://www.hanselman.com/blog/webcam-randomly-pausing-in-obs-discord-and-websites-lsvcam-and-tiktok-studio + {L"\\lsvcam.dll", 0, 0, TS_IGNORE}, }; static bool is_module_blocked(wchar_t *dll, uint32_t timestamp)
View file
obs-studio-31.0.0~beta2.tar.xz/UI/window-basic-main-profiles.cpp -> obs-studio-31.0.0~beta3.tar.xz/UI/window-basic-main-profiles.cpp
Changed
@@ -699,14 +699,12 @@ config_save_safe(App()->GetUserConfig(), "tmp", nullptr); InitBasicConfigDefaults(); - InitBasicConfigDefaults2(); if (reset) { + UpdateProfileEncoders(); ResetProfileData(); } - CheckForSimpleModeX264Fallback(); - RefreshProfiles(); UpdateTitleBar(); @@ -731,6 +729,12 @@ } } +void OBSBasic::UpdateProfileEncoders() +{ + InitBasicConfigDefaults2(); + CheckForSimpleModeX264Fallback(); +} + void OBSBasic::ResetProfileData() { ResetVideo();
View file
obs-studio-31.0.0~beta2.tar.xz/UI/window-basic-main.cpp -> obs-studio-31.0.0~beta3.tar.xz/UI/window-basic-main.cpp
Changed
@@ -68,6 +68,7 @@ #include "window-youtube-actions.hpp" #include "youtube-api-wrappers.hpp" #endif +#include "window-whats-new.hpp" #include "context-bar-controls.hpp" #include "obs-proxy-style.hpp" #include "display-helpers.hpp" @@ -128,6 +129,8 @@ namespace { +QPointer<OBSWhatsNew> obsWhatsNew; + template<typename OBSRef> struct SignalContainer { OBSRef ref; vector<shared_ptr<OBSSignal>> handlers; @@ -164,8 +167,6 @@ item->setData(static_cast<int>(QtDataRole::OBSRef), QVariant::fromValue(val)); } -constexpr std::string_view OBSProfilePath = "/obs-studio/basic/profiles/"; - static void AddExtraModulePaths() { string plugins_path, plugins_data_path; @@ -1897,7 +1898,7 @@ return false; } - return InitBasicConfigDefaults(); + return true; } void OBSBasic::InitOBSCallbacks() @@ -2122,9 +2123,7 @@ emit VirtualCamEnabled(); } - InitBasicConfigDefaults2(); - - CheckForSimpleModeX264Fallback(); + UpdateProfileEncoders(); LogEncoders(); @@ -2189,6 +2188,15 @@ SetupNewSceneCollection(sceneCollectionName); disableSaving++; } + + disableSaving--; + if (foundCollection || configuredCollection) { + OnEvent(OBS_FRONTEND_EVENT_SCENE_COLLECTION_LIST_CHANGED); + OnEvent(OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED); + } + OnEvent(OBS_FRONTEND_EVENT_SCENE_CHANGED); + OnEvent(OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED); + disableSaving++; } loaded = true; @@ -2544,37 +2552,11 @@ if (closing) return; - std::string info_url = QT_TO_UTF8(url); - - QDialog *dlg = new QDialog(this); - dlg->setAttribute(Qt::WA_DeleteOnClose, true); - dlg->setWindowTitle("What's New"); - dlg->resize(700, 600); - - Qt::WindowFlags flags = dlg->windowFlags(); - Qt::WindowFlags helpFlag = Qt::WindowContextHelpButtonHint; - dlg->setWindowFlags(flags & (~helpFlag)); - - QCefWidget *cefWidget = cef->create_widget(nullptr, info_url); - if (!cefWidget) { - return; + if (obsWhatsNew) { + obsWhatsNew->close(); } - connect(cefWidget, &QCefWidget::titleChanged, dlg, &QDialog::setWindowTitle); - - QPushButton *close = new QPushButton(QTStr("Close")); - connect(close, &QAbstractButton::clicked, dlg, &QDialog::accept); - - QHBoxLayout *bottomLayout = new QHBoxLayout(); - bottomLayout->addStretch(); - bottomLayout->addWidget(close); - bottomLayout->addStretch(); - - QVBoxLayout *topLayout = new QVBoxLayout(dlg); - topLayout->addWidget(cefWidget); - topLayout->addLayout(bottomLayout); - - dlg->show(); + obsWhatsNew = new OBSWhatsNew(this, QT_TO_UTF8(url)); #else UNUSED_PARAMETER(url); #endif @@ -7641,13 +7623,14 @@ void OBSBasic::on_actionShowProfileFolder_triggered() { - std::string userProfilePath; - userProfilePath.reserve(App()->userProfilesLocation.u8string().size() + OBSProfilePath.size()); - userProfilePath.append(App()->userProfilesLocation.u8string()).append(OBSProfilePath); - - const QString userProfileLocation = QString::fromStdString(userProfilePath); + try { + const OBSProfile ¤tProfile = GetCurrentProfile(); + QString currentProfileLocation = QString::fromStdString(currentProfile.path.u8string()); - QDesktopServices::openUrl(QUrl::fromLocalFile(userProfileLocation)); + QDesktopServices::openUrl(QUrl::fromLocalFile(currentProfileLocation)); + } catch (const std::invalid_argument &error) { + blog(LOG_ERROR, "%s", error.what()); + } } int OBSBasic::GetTopSelectedSourceItem()
View file
obs-studio-31.0.0~beta2.tar.xz/UI/window-basic-main.hpp -> obs-studio-31.0.0~beta3.tar.xz/UI/window-basic-main.hpp
Changed
@@ -1301,6 +1301,7 @@ void RefreshProfiles(bool refreshCache = false); void ActivateProfile(const OBSProfile &profile, bool reset = false); + void UpdateProfileEncoders(); std::vector<std::string> GetRestartRequirements(const ConfigFile &config) const; void ResetProfileData(); void CheckForSimpleModeX264Fallback();
View file
obs-studio-31.0.0~beta3.tar.xz/UI/window-whats-new.cpp
Added
@@ -0,0 +1,74 @@ +#include "moc_window-whats-new.cpp" + +#include <QPushButton> +#include <QHBoxLayout> +#include <QVBoxLayout> + +#include "window-basic-main.hpp" + +#ifdef BROWSER_AVAILABLE +#include <browser-panel.hpp> +extern QCef *cef; +#endif + +/* ------------------------------------------------------------------------- */ + +OBSWhatsNew::OBSWhatsNew(QWidget *parent, const std::string &url) : QDialog(parent) +{ +#ifdef BROWSER_AVAILABLE + if (!cef) { + return; + } + + setWindowTitle("What's New"); + setAttribute(Qt::WA_DeleteOnClose, true); + resize(700, 600); + + Qt::WindowFlags flags = windowFlags(); + Qt::WindowFlags helpFlag = Qt::WindowContextHelpButtonHint; + setWindowFlags(flags & (~helpFlag)); + + OBSBasic::InitBrowserPanelSafeBlock(); + + cefWidget = cef->create_widget(nullptr, url); + if (!cefWidget) { + return; + } + + connect(cefWidget, &QCefWidget::titleChanged, this, &OBSWhatsNew::setWindowTitle); + + QPushButton *close = new QPushButton(QTStr("Close")); + connect(close, &QAbstractButton::clicked, this, &QDialog::accept); + + QHBoxLayout *bottomLayout = new QHBoxLayout(); + bottomLayout->addStretch(); + bottomLayout->addWidget(close); + bottomLayout->addStretch(); + + QVBoxLayout *topLayout = new QVBoxLayout(this); + topLayout->addWidget(cefWidget); + topLayout->addLayout(bottomLayout); + + show(); +#else + UNUSED_PARAMETER(url); +#endif +} + +OBSWhatsNew::~OBSWhatsNew() {} + +void OBSWhatsNew::reject() +{ +#ifdef BROWSER_AVAILABLE + delete cefWidget; +#endif + QDialog::reject(); +} + +void OBSWhatsNew::accept() +{ +#ifdef BROWSER_AVAILABLE + delete cefWidget; +#endif + QDialog::accept(); +}
View file
obs-studio-31.0.0~beta3.tar.xz/UI/window-whats-new.hpp
Added
@@ -0,0 +1,20 @@ +#pragma once + +#include <QPointer> +#include <QDialog> +#include <string> + +class QCefWidget; + +class OBSWhatsNew : public QDialog { + Q_OBJECT + + QCefWidget *cefWidget = nullptr; + +public: + OBSWhatsNew(QWidget *parent, const std::string &url); + ~OBSWhatsNew(); + + virtual void reject() override; + virtual void accept() override; +};
View file
obs-studio-31.0.0~beta2.tar.xz/UI/window-youtube-actions.cpp -> obs-studio-31.0.0~beta3.tar.xz/UI/window-youtube-actions.cpp
Changed
@@ -406,15 +406,13 @@ blog(LOG_DEBUG, "No stream created."); return false; } - json11::Json json; - if (!apiYouTube->BindStream(broadcast.id, stream.id, json)) { + if (!apiYouTube->BindStream(broadcast.id, stream.id)) { blog(LOG_DEBUG, "No stream binded."); return false; } if (broadcast.privacy != "private") { - const std::string apiLiveChatId = json"snippet""liveChatId".string_value(); - apiYouTube->SetChatId(broadcast.id, apiLiveChatId); + apiYouTube->SetChatId(broadcast.id); } else { apiYouTube->ResetChat(); } @@ -440,7 +438,6 @@ std::string boundStreamId = json"items".array_items()0"contentDetails""boundStreamId".string_value(); std::string broadcastPrivacy = json"items".array_items()0"status""privacyStatus".string_value(); - std::string apiLiveChatId = json"items".array_items()0"snippet""liveChatId".string_value(); stream.id = boundStreamId.c_str(); if (!stream.id.isEmpty() && apiYouTube->FindStream(stream.id, json)) { @@ -457,14 +454,14 @@ blog(LOG_DEBUG, "No stream created."); return false; } - if (!apiYouTube->BindStream(selectedBroadcast, stream.id, json)) { + if (!apiYouTube->BindStream(selectedBroadcast, stream.id)) { blog(LOG_DEBUG, "No stream binded."); return false; } } if (broadcastPrivacy != "private") - apiYouTube->SetChatId(selectedBroadcast, apiLiveChatId); + apiYouTube->SetChatId(selectedBroadcast); else apiYouTube->ResetChat();
View file
obs-studio-31.0.0~beta2.tar.xz/UI/youtube-api-wrappers.cpp -> obs-studio-31.0.0~beta3.tar.xz/UI/youtube-api-wrappers.cpp
Changed
@@ -29,7 +29,6 @@ #define YOUTUBE_LIVE_TOKEN_URL "https://oauth2.googleapis.com/token" #define YOUTUBE_LIVE_VIDEOCATEGORIES_URL YOUTUBE_LIVE_API_URL "/videoCategories" #define YOUTUBE_LIVE_VIDEOS_URL YOUTUBE_LIVE_API_URL "/videos" -#define YOUTUBE_LIVE_CHAT_MESSAGES_URL YOUTUBE_LIVE_API_URL "/liveChat/messages" #define YOUTUBE_LIVE_THUMBNAIL_URL "https://www.googleapis.com/upload/youtube/v3/thumbnails/set" #define DEFAULT_BROADCASTS_PER_QUERY "50" // acceptable values are 0 to 50, inclusive @@ -246,7 +245,7 @@ return stream.id.isEmpty() ? false : true; } -bool YoutubeApiWrappers::BindStream(const QString broadcast_id, const QString stream_id, json11::Json &json_out) +bool YoutubeApiWrappers::BindStream(const QString broadcast_id, const QString stream_id) { lastErrorMessage.clear(); lastErrorReason.clear(); @@ -256,6 +255,7 @@ const QString url = url_template.arg(broadcast_id, stream_id); const Json data = Json::object{}; this->broadcast_id = broadcast_id; + Json json_out; return InsertCommand(QT_TO_UTF8(url), "application/json", "", data.dump().c_str(), json_out); } @@ -518,18 +518,3 @@ return true; } - -bool YoutubeApiWrappers::SendChatMessage(const std::string &chat_id, const QString &message) -{ - QByteArray url = YOUTUBE_LIVE_CHAT_MESSAGES_URL "?part=snippet"; - - json11::Json json_in = Json::object{ - {"snippet", Json::object{ - {"liveChatId", chat_id}, - {"type", "textMessageEvent"}, - {"textMessageDetails", Json::object{{"messageText", QT_TO_UTF8(message)}}}, - }}}; - - json11::Json json_out; - return InsertCommand(url, "application/json", "POST", json_in.dump().c_str(), json_out); -}
View file
obs-studio-31.0.0~beta2.tar.xz/UI/youtube-api-wrappers.hpp -> obs-studio-31.0.0~beta3.tar.xz/UI/youtube-api-wrappers.hpp
Changed
@@ -55,7 +55,7 @@ bool GetChannelDescription(ChannelDescription &channel_description); bool InsertBroadcast(BroadcastDescription &broadcast); bool InsertStream(StreamDescription &stream); - bool BindStream(const QString broadcast_id, const QString stream_id, json11::Json &json_out); + bool BindStream(const QString broadcast_id, const QString stream_id); bool GetBroadcastsList(json11::Json &json_out, const QString &page, const QString &status); bool GetVideoCategoriesList(QVector<CategoryDescription> &category_list_out); bool SetVideoCategory(const QString &video_id, const QString &video_title, const QString &video_description, @@ -66,7 +66,6 @@ bool ResetBroadcast(const QString &broadcast_id, json11::Json &json_out); bool StartLatestBroadcast(); bool StopLatestBroadcast(); - bool SendChatMessage(const std::string &chat_id, const QString &message); void SetBroadcastId(QString &broadcast_id); QString GetBroadcastId();
View file
obs-studio-31.0.0~beta2.tar.xz/build-aux/com.obsproject.Studio.json -> obs-studio-31.0.0~beta3.tar.xz/build-aux/com.obsproject.Studio.json
Changed
@@ -98,8 +98,7 @@ , "post-install": "install -d /app/plugins", - "install -d /app/extensions/Plugins", - "rm -rf /app/cef # Skip stripping original CEF library" + "install -d /app/extensions/Plugins" , "sources": {
View file
obs-studio-31.0.0~beta2.tar.xz/cmake/linux/compilerconfig.cmake -> obs-studio-31.0.0~beta3.tar.xz/cmake/linux/compilerconfig.cmake
Changed
@@ -33,6 +33,7 @@ -Wno-unused-function -Wno-unused-label -Wparentheses + -Wswitch -Wuninitialized -Wunreachable-code -Wunused-parameter
View file
obs-studio-31.0.0~beta2.tar.xz/cmake/linux/helpers.cmake -> obs-studio-31.0.0~beta3.tar.xz/cmake/linux/helpers.cmake
Changed
@@ -271,7 +271,7 @@ # Helper function to add a specific resource to a bundle function(target_add_resource target resource) get_property(obs_module_list GLOBAL PROPERTY OBS_MODULES_ENABLED) - if(${ARGN}) + if(ARGN) set(target_destination "${ARGN}") elseif(${target} IN_LIST obs_module_list) set(target_destination "${OBS_DATA_DESTINATION}/obs-plugins/${target}")
View file
obs-studio-31.0.0~beta2.tar.xz/plugins/linux-pipewire/camera-portal.c -> obs-studio-31.0.0~beta3.tar.xz/plugins/linux-pipewire/camera-portal.c
Changed
@@ -221,6 +221,7 @@ clear_params(&device->pending_list, SPA_ID_INVALID); clear_params(&device->param_list, SPA_ID_INVALID); + g_clear_pointer(&device->info, pw_node_info_free); g_clear_pointer(&device->proxy, pw_proxy_destroy); g_clear_pointer(&device->properties, pw_properties_free); bfree(device);
View file
obs-studio-31.0.0~beta2.tar.xz/plugins/linux-pipewire/pipewire.c -> obs-studio-31.0.0~beta3.tar.xz/plugins/linux-pipewire/pipewire.c
Changed
@@ -173,6 +173,11 @@ pw_thread_loop_stop(obs_pw->thread_loop); } + if (obs_pw->registry) { + pw_proxy_destroy((struct pw_proxy *)obs_pw->registry); + obs_pw->registry = NULL; + } + g_clear_pointer(&obs_pw->context, pw_context_destroy); g_clear_pointer(&obs_pw->thread_loop, pw_thread_loop_destroy);
View file
obs-studio-31.0.0~beta2.tar.xz/plugins/obs-nvenc/nvenc-helpers.c -> obs-studio-31.0.0~beta3.tar.xz/plugins/obs-nvenc/nvenc-helpers.c
Changed
@@ -179,6 +179,7 @@ RETURN_CASE(NV_ENC_ERR_RESOURCE_REGISTER_FAILED); RETURN_CASE(NV_ENC_ERR_RESOURCE_NOT_REGISTERED); RETURN_CASE(NV_ENC_ERR_RESOURCE_NOT_MAPPED); + RETURN_CASE(NV_ENC_ERR_NEED_MORE_OUTPUT); } #undef RETURN_CASE
View file
obs-studio-31.0.0~beta2.tar.xz/plugins/obs-outputs/librtmp/rtmp.c -> obs-studio-31.0.0~beta3.tar.xz/plugins/obs-outputs/librtmp/rtmp.c
Changed
@@ -339,7 +339,7 @@ CFRelease(anchors); -#elif defined(__linux__) +#elif defined(__linux__) || defined(__FreeBSD__) if (mbedtls_x509_crt_parse_path(chain, "/etc/ssl/certs/") < 0) { RTMP_Log(RTMP_LOGERROR, "mbedtls_x509_crt_parse_path: Couldn't parse " "/etc/ssl/certs");
View file
obs-studio-31.0.0~beta2.tar.xz/plugins/obs-qsv11/CMakeLists.txt -> obs-studio-31.0.0~beta3.tar.xz/plugins/obs-qsv11/CMakeLists.txt
Changed
@@ -35,6 +35,13 @@ target_compile_definitions(obs-qsv11 PRIVATE $<$<PLATFORM_ID:Windows>:DX11_D3D>) +target_compile_options( + obs-qsv11 + PRIVATE + $<$<COMPILE_LANG_AND_ID:C,GNU,Clang>:-Wno-error=switch> + $<$<COMPILE_LANG_AND_ID:CXX,GNU,Clang>:-Wno-error=switch> +) + target_link_libraries( obs-qsv11 PRIVATE
View file
obs-studio-31.0.0~beta2.tar.xz/plugins/obs-websocket/CMakeLists.txt -> obs-studio-31.0.0~beta3.tar.xz/plugins/obs-websocket/CMakeLists.txt
Changed
@@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16...3.25) -set(obs-websocket_VERSION 5.5.3) +set(obs-websocket_VERSION 5.5.4) set(OBS_WEBSOCKET_RPC_VERSION 1) include(cmake/obs-websocket-api.cmake)
View file
obs-studio-31.0.0~beta2.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Config.cpp -> obs-studio-31.0.0~beta3.tar.xz/plugins/obs-websocket/src/requesthandler/RequestHandler_Config.cpp
Changed
@@ -289,9 +289,7 @@ if (std::find(profiles.begin(), profiles.end(), profileName) != profiles.end()) return RequestResult::Error(RequestStatus::ResourceAlreadyExists); - QMainWindow *mainWindow = static_cast<QMainWindow *>(obs_frontend_get_main_window()); - QMetaObject::invokeMethod(mainWindow, "NewProfile", Qt::BlockingQueuedConnection, - Q_ARG(QString, QString::fromStdString(profileName))); + obs_frontend_create_profile(profileName.c_str()); return RequestResult::Success(); } @@ -324,9 +322,7 @@ if (profiles.size() < 2) return RequestResult::Error(RequestStatus::NotEnoughResources); - QMainWindow *mainWindow = static_cast<QMainWindow *>(obs_frontend_get_main_window()); - QMetaObject::invokeMethod(mainWindow, "DeleteProfile", Qt::BlockingQueuedConnection, - Q_ARG(QString, QString::fromStdString(profileName))); + obs_frontend_delete_profile(profileName.c_str()); return RequestResult::Success(); }
View file
obs-studio-31.0.0~beta2.tar.xz/plugins/win-capture/graphics-hook/d3d10-capture.cpp -> obs-studio-31.0.0~beta3.tar.xz/plugins/win-capture/graphics-hook/d3d10-capture.cpp
Changed
@@ -333,7 +333,7 @@ if (capture_should_init()) { d3d10_init(swap); } - if (capture_ready()) { + if (data.handle != nullptr && capture_ready()) { ID3D10Resource *backbuffer; hr = dxgi_backbuffer->QueryInterface(__uuidof(ID3D10Resource), (void **)&backbuffer);
View file
obs-studio-31.0.0~beta2.tar.xz/plugins/win-capture/graphics-hook/d3d11-capture.cpp -> obs-studio-31.0.0~beta3.tar.xz/plugins/win-capture/graphics-hook/d3d11-capture.cpp
Changed
@@ -301,7 +301,7 @@ if (capture_should_init()) { d3d11_init(swap); } - if (capture_ready()) { + if (data.handle != nullptr && capture_ready()) { ID3D11Resource *backbuffer; hr = dxgi_backbuffer->QueryInterface(__uuidof(ID3D11Resource), (void **)&backbuffer);
View file
obs-studio-31.0.0~beta2.tar.xz/plugins/win-capture/graphics-hook/d3d12-capture.cpp -> obs-studio-31.0.0~beta3.tar.xz/plugins/win-capture/graphics-hook/d3d12-capture.cpp
Changed
@@ -315,7 +315,7 @@ if (capture_should_init()) { d3d12_init(swap); } - if (capture_ready()) { + if (data.handle != nullptr && capture_ready()) { d3d12_shtex_capture(swap); } }
View file
obs-studio-31.0.0~beta2.tar.xz/plugins/win-capture/graphics-hook/d3d9-capture.cpp -> obs-studio-31.0.0~beta3.tar.xz/plugins/win-capture/graphics-hook/d3d9-capture.cpp
Changed
@@ -543,7 +543,7 @@ if (capture_should_init()) { d3d9_init(device); } - if (capture_ready()) { + if (data.handle != nullptr && capture_ready()) { if (data.device != device) { d3d9_free(); return;
View file
obs-studio-31.0.0~beta2.tar.xz/shared/obs-hook-config/graphics-hook-ver.h -> obs-studio-31.0.0~beta3.tar.xz/shared/obs-hook-config/graphics-hook-ver.h
Changed
@@ -13,7 +13,7 @@ #define HOOK_VER_MAJOR 1 #define HOOK_VER_MINOR 8 -#define HOOK_VER_PATCH 4 +#define HOOK_VER_PATCH 5 #ifndef STRINGIFY #define STRINGIFY(s) #s
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
.