Projects
home:frispete
obs-studio
Sign Up
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 28
View file
obs-studio.changes
Changed
@@ -1,4 +1,57 @@ ------------------------------------------------------------------- +Thu Jun 01 18:46:53 UTC 2023 - hpj@urpla.net + +- Update to version 29.1.2: + * libobs: Update version to 29.1.2 + * obs-outputs: Remove support for "RTMP Go Away" feature (#8959) + * UI: Fix crash on patronJsonThread + * deps/media-playback: Just null the first frame pointer on decode + * deps/media-playback: Check `is_active` when frame preloading + * deps/media-playback: Fix crash when interrupting stingers + * UI: Disallow exiting settings with no track in advanced mode + * UI: Disallow exiting settings with no track in simple mode + * UI: Fix crash when receiving multiple SIGINT + * libobs: Adds obs.hpp to exported header files + * UI: Only defer property updates for input and transition sources + * win-dshow: Remove obsolete translation + * win-capture: Remove obsolete translation + * obs-qsv11: Add missing translation + * obs-outputs: Add missing translations + * obs-filters: Remove obsolete translation in expander-filter + * obs-filters: Add missing translation in chroma-key-filter + * obs-ffmpeg: Add missing translations + * obs-ffmpeg: Add missing translations + * obs-ffmpeg: Remove obsolete translations + * mac-videotoolbox: Remove obsolete translation + * mac-syphon: Remove obsolete translations + * mac-avcapture: Add missing translation + * linux-pulseaudio: Add missing translation + * linux-capture: Remove obsolete translation + * linux-alsa: Add missing translations + * UI: Fix missing translations + * CI: Enable GPU priority setting for Windows builds + * libobs-d3d11: Set priority to high instead of realtime if HAGS enabled + * libobs-d3d11: Refactor set_priority to use included header + * libobs: Remove registry-based HAGS logging + * libobs-d3d11: Log HAGS status + * UI: Fix 0,0 size transform bug when resizing sources + * libobs: Prevent setting invalid scene item scale values + * libobs: Rework logic for detecting monitoring feedback in PulseAudio + * libobs: Fix PulseAudio monitoring when device is set to default + * mac-videotoolbox: Fix incorrect keyframe interval calculation + * UI: Re-raise missing files dialog on macOS after file is selected + * UI: Remove tabs for About error statements + * UI: Process Qt events once after destroy queue finishes + * UI: Only update vcam output if necessary + * UI: Reset VCam when clearing scene data + * deps/obs-scripting: Set file/chunk name when loading lua scripts + * UI: Fix scene grid mode button color + * UI: Normalize theme qss files + * UI: Fix crash when double-clicking projector + * obs-ffmpeg: Fix compilation when ENABLE_HEVC is not set + * UI: Reset service selection to custom if name not found + +------------------------------------------------------------------- Tue May 30 21:07:32 UTC 2023 - Hans-Peter Jansen <hp@urpla.net> - Relax some compile flags to not error out for Leaps
View file
obs-studio.spec
Changed
@@ -8,7 +8,7 @@ %endif Name: obs-studio -Version: 29.1.1 +Version: 29.1.2 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">refs/tags/29.1.1</param> + <param name="revision">refs/tags/29.1.2</param> <param name="url">https://github.com/obsproject/obs-studio.git</param> <param name="scm">git</param> <param name="changesgenerate">enable</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">abb80571351438bebd018a45d896b26f95881fbe</param> + <param name="changesrevision">e15a92e16fc3827027a956f6d6a1223b41aced61</param> </service> </servicedata> \ No newline at end of file
View file
obs-studio-29.1.1.tar.xz/.github/workflows/main.yml -> obs-studio-29.1.2.tar.xz/.github/workflows/main.yml
Changed
@@ -29,6 +29,7 @@ YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }} YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }} YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }} + GPU_PRIORITY_VAL: ${{ secrets.GPU_PRIORITY_VAL }} concurrency: group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
View file
obs-studio-29.1.1.tar.xz/CI/windows/02_build_obs.ps1 -> obs-studio-29.1.2.tar.xz/CI/windows/02_build_obs.ps1
Changed
@@ -83,6 +83,7 @@ "-DYOUTUBE_CLIENTID_HASH=${Env:YOUTUBE_CLIENTID_HASH}", "-DYOUTUBE_SECRET=${Env:YOUTUBE_SECRET}", "-DYOUTUBE_SECRET_HASH=${Env:YOUTUBE_SECRET_HASH}", + "-DGPU_PRIORITY_VAL=${Env:GPU_PRIORITY_VAL}", "-DCOPIED_DEPENDENCIES=OFF", "-DCOPY_DEPENDENCIES=ON", "-DBUILD_FOR_DISTRIBUTION=$(if (Test-Path Env:BUILD_FOR_DISTRIBUTION) { "ON" } else { "OFF" })", @@ -109,6 +110,7 @@ "-DYOUTUBE_CLIENTID_HASH=`"${Env:YOUTUBE_CLIENTID_HASH}`"", "-DYOUTUBE_SECRET=`"${Env:YOUTUBE_SECRET}`"", "-DYOUTUBE_SECRET_HASH=`"${Env:YOUTUBE_SECRET_HASH}`"", + "-DGPU_PRIORITY_VAL=`"${Env:GPU_PRIORITY_VAL}`"", "-DCOPIED_DEPENDENCIES=OFF", "-DCOPY_DEPENDENCIES=ON", "-DBUILD_FOR_DISTRIBUTION=`"$(if (Test-Path Env:BUILD_FOR_DISTRIBUTION) { "ON" } else { "OFF" })`"",
View file
obs-studio-29.1.1.tar.xz/UI/data/locale/en-US.ini -> obs-studio-29.1.2.tar.xz/UI/data/locale/en-US.ini
Changed
@@ -102,7 +102,6 @@ LogViewer="Log Viewer" ShowOnStartup="Show on startup" OpenFile="Open file" -AddValue="Add %1" AddSource="Add Source" RemoveScene="Remove Selected Scene" RemoveSource="Remove Selected Source(s)" @@ -206,7 +205,6 @@ Basic.AutoConfig.StreamPage.Server="Server" Basic.AutoConfig.StreamPage.StreamKey="Stream Key" Basic.AutoConfig.StreamPage.StreamKey.ToolTip="RIST: enter the encryption passphrase.\nRTMP: enter the key provided by the service.\nSRT: enter the streamid if the service uses one." -Basic.AutoConfig.StreamPage.StreamKey.LinkToSite="(Link)" Basic.AutoConfig.StreamPage.EncoderKey="Encoder Key" Basic.AutoConfig.StreamPage.ConnectedAccount="Connected account" Basic.AutoConfig.StreamPage.PerformBandwidthTest="Estimate bitrate with bandwidth test (may take a few minutes)" @@ -264,8 +262,6 @@ Updater.UpdateNow="Update Now" Updater.RemindMeLater="Remind me Later" Updater.Skip="Skip Version" -Updater.Running.Title="Program currently active" -Updater.Running.Text="Outputs are currently active, please shut down any active outputs before attempting to update" Updater.NoUpdatesAvailable.Title="No updates available" Updater.NoUpdatesAvailable.Text="No updates are currently available" Updater.BranchNotFound.Title="Update Channel Removed" @@ -275,8 +271,6 @@ Updater.RepairConfirm.Title="Confirm Integrity Check" Updater.RepairConfirm.Text="Starting the integrity check will scan your OBS installation for corruption and redownload broken/modified files. This may take a moment.\n\nDo you wish to proceed?" Updater.FailedToLaunch="Failed to launch updater" -Updater.GameCaptureActive.Title="Game capture active" -Updater.GameCaptureActive.Text="Game capture hook library is currently in use. Please close any games/programs being captured (or restart Windows) and try again." # quick transitions QuickTransitions.SwapScenes="Swap Preview/Program Scenes After Transitioning" @@ -460,6 +454,8 @@ Remux.ExitUnfinishedTitle="Remuxing in progress" Remux.ExitUnfinished="Remuxing is not finished, stopping now may render the target file unusable.\nAre you sure you want to stop remuxing?" Remux.HelpText="Drop files in this window to remux, or select an empty \"OBS Recording\" cell to browse for a file." +Remux.NoFilesAddedTitle="No remuxing file added" +Remux.NoFilesAdded="No file is added to remux. Drop a folder containing one or more video files." # missing file dialog MissingFiles="Missing Files" @@ -498,10 +494,6 @@ MacPermissions.Item.Accessibility.Details="For keyboard shortcuts (hotkeys) to work while other apps are focused, please enable this permission." MacPermissions.Continue="Continue" -# update dialog -UpdateAvailable="New Update Available" -UpdateAvailable.Text="Version %1.%2.%3 is now available. <a href='%4'>Click here to download</a>" - # Source leak error message SourceLeak.Title="Source Cleanup Error" SourceLeak.Text="There was a problem while changing scene collections and some sources could not be unloaded. This issue is typically caused by plugins that are not releasing resources properly. Please ensure that any plugins you are using are up to date.\n\nOBS Studio will now exit to prevent any potential data corruption." @@ -796,7 +788,6 @@ Basic.MainMenu.View.Toolbars="&Toolbars" Basic.MainMenu.View.ListboxToolbars="Scene/Source List Buttons" Basic.MainMenu.View.ContextBar="Source Toolbar" -Basic.MainMenu.View.SceneTransitions="S&cene Transitions" Basic.MainMenu.View.SourceIcons="Source &Icons" Basic.MainMenu.View.StatusBar="&Status Bar" Basic.MainMenu.View.Fullscreen.Interface="Fullscreen Interface" @@ -818,7 +809,6 @@ Basic.MainMenu.SceneCollection.Import="Import Scene Collection" Basic.MainMenu.SceneCollection.Export="Export Scene Collection" Basic.MainMenu.Profile.Exists="The profile already exists" -Basic.MainMenu.SceneCollection.Exists="The scene collection already exists" # basic mode help menu Basic.MainMenu.Tools="&Tools" @@ -913,7 +903,6 @@ # basic mode 'stream' settings Basic.Settings.Stream="Stream" -Basic.Settings.Stream.StreamType="Stream Type" Basic.Settings.Stream.Custom.UseAuthentication="Use authentication" Basic.Settings.Stream.Custom.Username="Username" Basic.Settings.Stream.Custom.Password="Password" @@ -954,7 +943,6 @@ Basic.Settings.Output.Encoder.Video="Video Encoder" Basic.Settings.Output.Encoder.Audio="Audio Encoder" Basic.Settings.Output.SelectDirectory="Select Recording Directory" -Basic.Settings.Output.SelectFile="Select Recording File" Basic.Settings.Output.DynamicBitrate="Dynamically change bitrate to manage congestion" Basic.Settings.Output.DynamicBitrate.Beta="Dynamically change bitrate to manage congestion (Beta)" Basic.Settings.Output.DynamicBitrate.TT="Instead of dropping frames to reduce congestion, dynamically changes bitrate on the fly.\n\nNote that this can increase delay to viewers if there is significant sudden congestion.\nWhen the bitrate drops, it can take up to a few minutes to restore.\n\nCurrently only supported for RTMP." @@ -1204,7 +1192,6 @@ Basic.Settings.Advanced.FormatWarning="Warning: Color formats other than NV12/P010 are primarily intended for recording, and are not recommended when streaming. Streaming may incur increased CPU usage due to color format conversion." Basic.Settings.Advanced.FormatWarningPreciseSdr="Warning: High-precision formats are more commonly used with HDR color spaces." Basic.Settings.Advanced.FormatWarning2100="Warning: Rec. 2100 should use a format with more precision." -Basic.Settings.Advanced.Audio.BufferingTime="Audio Buffering Time" Basic.Settings.Advanced.Video.ColorFormat="Color Format" Basic.Settings.Advanced.Video.ColorFormat.NV12="NV12 (8-bit, 4:2:0, 2 planes)" Basic.Settings.Advanced.Video.ColorFormat.I420="I420 (8-bit, 4:2:0, 3 planes)" @@ -1332,6 +1319,8 @@ # Output warnings OutputWarnings.NoTracksSelected="You must select at least one track" +OutputWarnings.NoTracksSelectedOnExit.Title="Output Settings Error" +OutputWarnings.NoTracksSelectedOnExit.Text="All outputs must have at least one audio track selected." OutputWarnings.MP4Recording="Warning: Recordings saved to MP4/MOV will be unrecoverable if the file cannot be finalized (e.g. as a result of BSODs, power losses, etc.). If you want to record multiple audio tracks consider using MKV and remux the recording to MP4/MOV after it is finished (File → Remux Recordings)" OutputWarnings.CannotPause="Warning: Recordings cannot be paused if the recording encoder is set to \"(Use stream encoder)\"" OutputWarnings.CodecIncompatible="The audio or video encoder selection was reset due to incompatibility. Please select a compatible encoder from the list." @@ -1369,6 +1358,7 @@ About.GetInvolved="Get Involved" About.Authors="Authors" About.License="License" +About.Error="Error! File could not be read.\n\nGo to: %1" About.Contribute="Support the OBS Project" # Drag-drop URL @@ -1407,7 +1397,6 @@ # Context Bar ContextBar.NoSelectedSource="No source selected" ContextBar.ResetTransform="Reset Transform" -ContextBar.FitToCanvas="Fit to Canvas" # Context Bar Media Controls ContextBar.MediaControls.PlayMedia="Play Media" @@ -1416,7 +1405,6 @@ ContextBar.MediaControls.RestartMedia="Restart Media" ContextBar.MediaControls.PlaylistNext="Next in Playlist" ContextBar.MediaControls.PlaylistPrevious="Previous in Playlist" -ContextBar.MediaControls.MediaProperties="Media Properties" ContextBar.MediaControls.BlindSeek="Media Seek Widget" # YouTube Actions and Auth
View file
obs-studio-29.1.1.tar.xz/UI/data/themes/Acri.qss -> obs-studio-29.1.2.tar.xz/UI/data/themes/Acri.qss
Changed
@@ -36,7 +36,7 @@ alternateBase: rgb(11,10,11); text: rgb(255,254,255); - + button: rgb(22,36,88); buttonText: rgb(255,254,255); @@ -62,14 +62,14 @@ windowText: rgb(153,153,153); text: rgb(153,153,153); button: rgb(27,29,34); - + buttonText: rgb(24,24,25); brightText: rgb(24,24,25); } OBSTheme::inactive { text: rgb(255,254,255); - + highlight: rgb(25,28,34); highlightText: rgb(255,255,255); } @@ -171,11 +171,11 @@ /* Top Menu Bar Items */ QMenuBar::item { - background-color: transparent; + background-color: transparent; } QMenuBar::item:selected { - background: rgb(19,26,48); + background: rgb(19,26,48); } /* Item Lists */ @@ -212,7 +212,7 @@ SourceTree::item { border-radius: 4px; color: palette(text); - border: 0px solid transparent; + border: 0px solid transparent; } QMenu::item:selected, @@ -420,7 +420,7 @@ } QScrollBar::handle:vertical { - min-height: 20px; + min-height: 20px; } QScrollBar::handle:horizontal { @@ -891,7 +891,7 @@ } QSlider::add-page:vertical { - background-color: palette(highlight); + background-color: palette(highlight); border-radius: 2px; } @@ -929,16 +929,16 @@ } VolumeMeter { - qproperty-backgroundNominalColor: rgb(66,116,12); - qproperty-backgroundWarningColor: rgb(152,143,15); - qproperty-backgroundErrorColor: rgb(128,32,4); - qproperty-foregroundNominalColor: rgb(132,216,43); - qproperty-foregroundWarningColor: rgb(228,215,23); - qproperty-foregroundErrorColor: rgb(215,65,22); - qproperty-magnitudeColor: rgb(49,54,59); - qproperty-majorTickColor: rgb(239,240,241); - qproperty-minorTickColor: rgb(118,121,124); - qproperty-peakDecayRate: 23.4; + qproperty-backgroundNominalColor: rgb(66,116,12); + qproperty-backgroundWarningColor: rgb(152,143,15); + qproperty-backgroundErrorColor: rgb(128,32,4); + qproperty-foregroundNominalColor: rgb(132,216,43); + qproperty-foregroundWarningColor: rgb(228,215,23); + qproperty-foregroundErrorColor: rgb(215,65,22); + qproperty-magnitudeColor: rgb(49,54,59); + qproperty-majorTickColor: rgb(239,240,241); + qproperty-minorTickColor: rgb(118,121,124); + qproperty-peakDecayRate: 23.4; } /* Status Bar */ @@ -1107,44 +1107,44 @@ QCheckBox::indicator, QGroupBox::indicator { - width: 18px; - height: 18px; + width: 18px; + height: 18px; } QGroupBox::indicator { - margin-left: 2px; + margin-left: 2px; } QCheckBox::indicator:unchecked, QGroupBox::indicator:unchecked { - image: url(./Yami/checkbox_unchecked.svg); + image: url(./Yami/checkbox_unchecked.svg); } QCheckBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:hover { - border: none; - image: url(./Yami/checkbox_unchecked_focus.svg); + border: none; + image: url(./Yami/checkbox_unchecked_focus.svg); } QCheckBox::indicator:checked, QGroupBox::indicator:checked { - image: url(./Yami/checkbox_checked.svg); + image: url(./Yami/checkbox_checked.svg); } QCheckBox::indicator:checked:hover, QGroupBox::indicator:checked:hover { - border: none; - image: url(./Yami/checkbox_checked_focus.svg); + border: none; + image: url(./Yami/checkbox_checked_focus.svg); } QCheckBox::indicator:checked:disabled, QGroupBox::indicator:checked:disabled { - image: url(./Yami/checkbox_checked_disabled.svg); + image: url(./Yami/checkbox_checked_disabled.svg); } QCheckBox::indicator:unchecked:disabled, QGroupBox::indicator:unchecked:disabled { - image: url(./Yami/checkbox_unchecked_disabled.svg); + image: url(./Yami/checkbox_unchecked_disabled.svg); } /* Locked CheckBox */ @@ -1212,7 +1212,7 @@ /* Mute CheckBox */ MuteCheckBox { - outline: none; + outline: none; } MuteCheckBox::indicator { @@ -1221,35 +1221,35 @@ } MuteCheckBox::indicator:checked { - image: url(./Dark/mute.svg); + image: url(./Dark/mute.svg); } MuteCheckBox::indicator:unchecked { - image: url(./Dark/settings/audio.svg); + image: url(./Dark/settings/audio.svg); } MuteCheckBox::indicator:unchecked:hover { - image: url(./Dark/settings/audio.svg); + image: url(./Dark/settings/audio.svg); } MuteCheckBox::indicator:unchecked:focus { - image: url(./Dark/settings/audio.svg); + image: url(./Dark/settings/audio.svg); } MuteCheckBox::indicator:checked:hover { - image: url(./Dark/mute.svg); + image: url(./Dark/mute.svg); } MuteCheckBox::indicator:checked:focus { - image: url(./Dark/mute.svg); + image: url(./Dark/mute.svg); } MuteCheckBox::indicator:checked:disabled { - image: url(./Dark/mute.svg); + image: url(./Dark/mute.svg); } MuteCheckBox::indicator:unchecked:disabled { - image: url(./Dark/settings/audio.svg); + image: url(./Dark/settings/audio.svg);
View file
obs-studio-29.1.1.tar.xz/UI/data/themes/Dark.qss -> obs-studio-29.1.2.tar.xz/UI/data/themes/Dark.qss
Changed
@@ -132,8 +132,8 @@ /* Dock Widget */ QDockWidget { - titlebar-close-icon: url('./Dark/close.svg'); - titlebar-normal-icon: url('./Dark/popout.svg'); + titlebar-close-icon: url('./Dark/close.svg'); + titlebar-normal-icon: url('./Dark/popout.svg'); } QDockWidget::title { @@ -262,8 +262,8 @@ QPushButtontoolButton="true", QToolButton { - background: transparent; - border: none; + background: transparent; + border: none; padding: 1px; margin: 1px; } @@ -750,7 +750,7 @@ /* Preview background color */ OBSQTDisplay { - qproperty-displayBackgroundColor: rgb(76,76,76); + qproperty-displayBackgroundColor: rgb(76,76,76); } /* Preview/Program labels */ @@ -826,7 +826,7 @@ } OBSMissingFiles { - qproperty-warningIcon: url(./Dark/alert.svg); + qproperty-warningIcon: url(./Dark/alert.svg); } /* Source Icons */ @@ -854,7 +854,7 @@ SceneTree { qproperty-gridItemWidth: 150; - qproperty-gridItemHeight: 27; + qproperty-gridItemHeight: 27; } *gridMode="true" SceneTree::item { @@ -863,9 +863,9 @@ border: none; border-radius: 3px; padding: 4px; - padding-left: 10px; - padding-right: 10px; - margin: 1px; + padding-left: 10px; + padding-right: 10px; + margin: 1px; } *gridMode="true" SceneTree::item:selected { @@ -893,25 +893,25 @@ /* Studio Mode T-Bar */ QSliderthemeID="tBarSlider" { - height: 24px; + height: 24px; } QSlider::groove:horizontalthemeID="tBarSlider" { - border: 1px solid rgb(76,76,76); - height: 5px; - background: palette(base); + border: 1px solid rgb(76,76,76); + height: 5px; + background: palette(base); } QSlider::sub-page:horizontalthemeID="tBarSlider" { - background: palette(base);; - border: 1px solid rgb(76,76,76); + background: palette(base);; + border: 1px solid rgb(76,76,76); } QSlider::handle:horizontalthemeID="tBarSlider" { - background-color: rgb(210,210,210); - width: 12px; - height: 24px; - margin: -24px 0px; + background-color: rgb(210,210,210); + width: 12px; + height: 24px; + margin: -24px 0px; } /* Media icons */
View file
obs-studio-29.1.1.tar.xz/UI/data/themes/Grey.qss -> obs-studio-29.1.2.tar.xz/UI/data/themes/Grey.qss
Changed
@@ -36,7 +36,7 @@ alternateBase: rgb(11,10,11); text: rgb(255,254,255); - + button: rgb(67,67,67); buttonText: rgb(255,254,255); @@ -62,14 +62,14 @@ windowText: rgb(153,153,153); text: rgb(153,153,153); button: rgb(27,29,34); - + buttonText: rgb(43,46,56); brightText: rgb(43,46,56); } OBSTheme::inactive { text: rgb(255,254,255); - + highlight: rgb(25,28,34); highlightText: rgb(255,255,255); } @@ -171,11 +171,11 @@ /* Top Menu Bar Items */ QMenuBar::item { - background-color: transparent; + background-color: transparent; } QMenuBar::item:selected { - background: rgb(40,76,184); + background: rgb(40,76,184); } /* Item Lists */ @@ -212,7 +212,7 @@ SourceTree::item { border-radius: 4px; color: palette(text); - border: 0px solid transparent; + border: 0px solid transparent; } QMenu::item:selected, @@ -420,7 +420,7 @@ } QScrollBar::handle:vertical { - min-height: 20px; + min-height: 20px; } QScrollBar::handle:horizontal { @@ -880,7 +880,7 @@ } QSlider::add-page:vertical { - background-color: palette(highlight); + background-color: palette(highlight); border-radius: 2px; } @@ -1095,44 +1095,44 @@ QCheckBox::indicator, QGroupBox::indicator { - width: 18px; - height: 18px; + width: 18px; + height: 18px; } QGroupBox::indicator { - margin-left: 2px; + margin-left: 2px; } QCheckBox::indicator:unchecked, QGroupBox::indicator:unchecked { - image: url(./Yami/checkbox_unchecked.svg); + image: url(./Yami/checkbox_unchecked.svg); } QCheckBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:hover { - border: none; - image: url(./Yami/checkbox_unchecked_focus.svg); + border: none; + image: url(./Yami/checkbox_unchecked_focus.svg); } QCheckBox::indicator:checked, QGroupBox::indicator:checked { - image: url(./Yami/checkbox_checked.svg); + image: url(./Yami/checkbox_checked.svg); } QCheckBox::indicator:checked:hover, QGroupBox::indicator:checked:hover { - border: none; - image: url(./Yami/checkbox_checked_focus.svg); + border: none; + image: url(./Yami/checkbox_checked_focus.svg); } QCheckBox::indicator:checked:disabled, QGroupBox::indicator:checked:disabled { - image: url(./Yami/checkbox_checked_disabled.svg); + image: url(./Yami/checkbox_checked_disabled.svg); } QCheckBox::indicator:unchecked:disabled, QGroupBox::indicator:unchecked:disabled { - image: url(./Yami/checkbox_unchecked_disabled.svg); + image: url(./Yami/checkbox_unchecked_disabled.svg); } /* Locked CheckBox */ @@ -1200,7 +1200,7 @@ /* Mute CheckBox */ MuteCheckBox { - outline: none; + outline: none; } MuteCheckBox::indicator { @@ -1209,35 +1209,35 @@ } MuteCheckBox::indicator:checked { - image: url(./Dark/mute.svg); + image: url(./Dark/mute.svg); } MuteCheckBox::indicator:unchecked { - image: url(./Dark/settings/audio.svg); + image: url(./Dark/settings/audio.svg); } MuteCheckBox::indicator:unchecked:hover { - image: url(./Dark/settings/audio.svg); + image: url(./Dark/settings/audio.svg); } MuteCheckBox::indicator:unchecked:focus { - image: url(./Dark/settings/audio.svg); + image: url(./Dark/settings/audio.svg); } MuteCheckBox::indicator:checked:hover { - image: url(./Dark/mute.svg); + image: url(./Dark/mute.svg); } MuteCheckBox::indicator:checked:focus { - image: url(./Dark/mute.svg); + image: url(./Dark/mute.svg); } MuteCheckBox::indicator:checked:disabled { - image: url(./Dark/mute.svg); + image: url(./Dark/mute.svg); } MuteCheckBox::indicator:unchecked:disabled { - image: url(./Dark/settings/audio.svg); + image: url(./Dark/settings/audio.svg); } #hotkeyFilterReset { @@ -1254,7 +1254,7 @@ } OBSHotkeyLabelhotkeyPairHover=true { - color: rgb(53,82,222); + color: rgb(53,82,222); } OBSHotkeyWidget QPushButton { @@ -1324,17 +1324,21 @@ } *gridMode="true" SceneTree::item:selected { - background-color: rgb(51,69,163); + background-color: rgb(40,76,184); } *gridMode="true" SceneTree::item:checked { - background-color: rgb(51,69,163); + background-color: rgb(40,76,184); } *gridMode="true" SceneTree::item:hover { background-color: rgb(89,89,89);
View file
obs-studio-29.1.1.tar.xz/UI/data/themes/Light.qss -> obs-studio-29.1.2.tar.xz/UI/data/themes/Light.qss
Changed
@@ -36,7 +36,7 @@ alternateBase: rgb(11,10,11); text: rgb(2,2,2); - + button: rgb(243,243,243); buttonText: rgb(2,2,2); @@ -62,14 +62,14 @@ windowText: rgb(74,74,74); text: rgb(74,74,74); button: rgb(27,29,34); - + buttonText: rgb(43,46,56); brightText: rgb(43,46,56); } OBSTheme::inactive { text: rgb(255,254,255); - + highlight: rgb(25,28,34); highlightText: rgb(255,255,255); } @@ -171,11 +171,11 @@ /* Top Menu Bar Items */ QMenuBar::item { - background-color: transparent; + background-color: transparent; } QMenuBar::item:selected { - background: rgb(140,181,255); + background: rgb(140,181,255); } /* Item Lists */ @@ -212,7 +212,7 @@ SourceTree::item { border-radius: 4px; color: palette(text); - border: 0px solid transparent; + border: 0px solid transparent; } QMenu::item:selected, @@ -420,7 +420,7 @@ } QScrollBar::handle:vertical { - min-height: 20px; + min-height: 20px; } QScrollBar::handle:horizontal { @@ -880,7 +880,7 @@ } QSlider::add-page:vertical { - background-color: palette(highlight); + background-color: palette(highlight); border-radius: 2px; } @@ -1095,44 +1095,44 @@ QCheckBox::indicator, QGroupBox::indicator { - width: 18px; - height: 18px; + width: 18px; + height: 18px; } QGroupBox::indicator { - margin-left: 2px; + margin-left: 2px; } QCheckBox::indicator:unchecked, QGroupBox::indicator:unchecked { - image: url(./Light/checkbox_unchecked.svg); + image: url(./Light/checkbox_unchecked.svg); } QCheckBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:hover { - border: none; - image: url(./Light/checkbox_unchecked_focus.svg); + border: none; + image: url(./Light/checkbox_unchecked_focus.svg); } QCheckBox::indicator:checked, QGroupBox::indicator:checked { - image: url(./Light/checkbox_checked.svg); + image: url(./Light/checkbox_checked.svg); } QCheckBox::indicator:checked:hover, QGroupBox::indicator:checked:hover { - border: none; - image: url(./Light/checkbox_checked_focus.svg); + border: none; + image: url(./Light/checkbox_checked_focus.svg); } QCheckBox::indicator:checked:disabled, QGroupBox::indicator:checked:disabled { - image: url(./Light/checkbox_checked_disabled.svg); + image: url(./Light/checkbox_checked_disabled.svg); } QCheckBox::indicator:unchecked:disabled, QGroupBox::indicator:unchecked:disabled { - image: url(./Light/checkbox_unchecked_disabled.svg); + image: url(./Light/checkbox_unchecked_disabled.svg); } /* Locked CheckBox */ @@ -1200,7 +1200,7 @@ /* Mute CheckBox */ MuteCheckBox { - outline: none; + outline: none; } MuteCheckBox::indicator { @@ -1209,35 +1209,35 @@ } MuteCheckBox::indicator:checked { - image: url(./Light/mute.svg); + image: url(./Light/mute.svg); } MuteCheckBox::indicator:unchecked { - image: url(./Light/settings/audio.svg); + image: url(./Light/settings/audio.svg); } MuteCheckBox::indicator:unchecked:hover { - image: url(./Light/settings/audio.svg); + image: url(./Light/settings/audio.svg); } MuteCheckBox::indicator:unchecked:focus { - image: url(./Light/settings/audio.svg); + image: url(./Light/settings/audio.svg); } MuteCheckBox::indicator:checked:hover { - image: url(./Light/mute.svg); + image: url(./Light/mute.svg); } MuteCheckBox::indicator:checked:focus { - image: url(./Light/mute.svg); + image: url(./Light/mute.svg); } MuteCheckBox::indicator:checked:disabled { - image: url(./Light/mute.svg); + image: url(./Light/mute.svg); } MuteCheckBox::indicator:unchecked:disabled { - image: url(./Light/settings/audio.svg); + image: url(./Light/settings/audio.svg); } #hotkeyFilterReset { @@ -1254,7 +1254,7 @@ } OBSHotkeyLabelhotkeyPairHover=true { - color: rgb(53,82,222); + color: rgb(53,82,222); } OBSHotkeyWidget QPushButton { @@ -1324,17 +1324,21 @@ } *gridMode="true" SceneTree::item:selected { - background-color: rgb(51,69,163); + background-color: rgb(140,181,255); } *gridMode="true" SceneTree::item:checked { - background-color: rgb(51,69,163); + background-color: rgb(140,181,255); } *gridMode="true" SceneTree::item:hover { background-color: rgb(254,254,255);
View file
obs-studio-29.1.1.tar.xz/UI/data/themes/Rachni.qss -> obs-studio-29.1.2.tar.xz/UI/data/themes/Rachni.qss
Changed
@@ -36,7 +36,7 @@ alternateBase: rgb(11,10,11); text: rgb(255,254,255); - + button: rgb(0,187,210); buttonText: rgb(255,254,255); @@ -51,7 +51,7 @@ primaryLight: rgb(0,188,212); primaryDark: rgb(25,27,38); - secondary: rgb(240,96,146); + secondary: rgb(240,96,146); highlight: rgb(42,130,218); highlightText: rgb(255,254,255); @@ -64,14 +64,14 @@ windowText: rgb(153,153,153); text: rgb(153,153,153); button: rgb(27,29,34); - + buttonText: rgb(35,38,41); brightText: rgb(35,38,41); } OBSTheme::inactive { text: rgb(255,254,255); - + highlight: rgb(25,28,34); highlightText: rgb(255,255,255); } @@ -173,11 +173,11 @@ /* Top Menu Bar Items */ QMenuBar::item { - background-color: transparent; + background-color: transparent; } QMenuBar::item:selected { - background: rgb(0,188,212); + background: rgb(0,188,212); } /* Item Lists */ @@ -214,7 +214,7 @@ SourceTree::item { border-radius: 4px; color: palette(text); - border: 0px solid transparent; + border: 0px solid transparent; } QMenu::item:selected, @@ -355,7 +355,7 @@ } QGroupBox::title { - color: rgb(240,98,146); + color: rgb(240,98,146); subcontrol-origin: margin; left: 8px; top: 8px; @@ -423,7 +423,7 @@ } QScrollBar::handle:vertical { - min-height: 20px; + min-height: 20px; } QScrollBar::handle:horizontal { @@ -470,7 +470,7 @@ QPushButtontoolButton="true":disabled, QToolButton:disabled { - background-color: transparent; + background-color: transparent; } QPushButtontoolButton="true":last-child, @@ -627,7 +627,7 @@ QDateTimeEdit:hover, QDateTimeEdit:selected { background-color: palette(base); - border: 2px solid rgb(0,188,212); + border: 2px solid rgb(0,188,212); } QComboBox::drop-down, @@ -884,7 +884,7 @@ } QSlider::add-page:vertical { - background-color: palette(highlight); + background-color: palette(highlight); border-radius: 2px; } @@ -922,15 +922,15 @@ } VolumeMeter { - qproperty-backgroundNominalColor: rgb(0, 128, 79); - qproperty-backgroundWarningColor: rgb(128, 57, 0); - qproperty-backgroundErrorColor: rgb(128, 9, 0); - qproperty-foregroundNominalColor: rgb(119, 255, 143); - qproperty-foregroundWarningColor: rgb(255, 157, 76); - qproperty-foregroundErrorColor: rgb(255, 89, 76); - qproperty-magnitudeColor: palette(window); - qproperty-majorTickColor: palette(window-text); - qproperty-minorTickColor: palette(mid); + qproperty-backgroundNominalColor: rgb(0, 128, 79); + qproperty-backgroundWarningColor: rgb(128, 57, 0); + qproperty-backgroundErrorColor: rgb(128, 9, 0); + qproperty-foregroundNominalColor: rgb(119, 255, 143); + qproperty-foregroundWarningColor: rgb(255, 157, 76); + qproperty-foregroundErrorColor: rgb(255, 89, 76); + qproperty-magnitudeColor: palette(window); + qproperty-majorTickColor: palette(window-text); + qproperty-minorTickColor: palette(mid); } /* Status Bar */ @@ -1099,44 +1099,44 @@ QCheckBox::indicator, QGroupBox::indicator { - width: 18px; - height: 18px; + width: 18px; + height: 18px; } QGroupBox::indicator { - margin-left: 2px; + margin-left: 2px; } QCheckBox::indicator:unchecked, QGroupBox::indicator:unchecked { - image: url(./Yami/checkbox_unchecked.svg); + image: url(./Yami/checkbox_unchecked.svg); } QCheckBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:hover { - border: none; - image: url(./Yami/checkbox_unchecked_focus.svg); + border: none; + image: url(./Yami/checkbox_unchecked_focus.svg); } QCheckBox::indicator:checked, QGroupBox::indicator:checked { - image: url(./Yami/checkbox_checked.svg); + image: url(./Yami/checkbox_checked.svg); } QCheckBox::indicator:checked:hover, QGroupBox::indicator:checked:hover { - border: none; - image: url(./Yami/checkbox_checked_focus.svg); + border: none; + image: url(./Yami/checkbox_checked_focus.svg); } QCheckBox::indicator:checked:disabled, QGroupBox::indicator:checked:disabled { - image: url(./Yami/checkbox_checked_disabled.svg); + image: url(./Yami/checkbox_checked_disabled.svg); } QCheckBox::indicator:unchecked:disabled, QGroupBox::indicator:unchecked:disabled { - image: url(./Yami/checkbox_unchecked_disabled.svg); + image: url(./Yami/checkbox_unchecked_disabled.svg); } /* Locked CheckBox */ @@ -1204,7 +1204,7 @@ /* Mute CheckBox */ MuteCheckBox { - outline: none; + outline: none; } MuteCheckBox::indicator { @@ -1213,35 +1213,35 @@ } MuteCheckBox::indicator:checked { - image: url(./Dark/mute.svg); + image: url(./Dark/mute.svg); }
View file
obs-studio-29.1.1.tar.xz/UI/data/themes/System.qss -> obs-studio-29.1.2.tar.xz/UI/data/themes/System.qss
Changed
@@ -174,13 +174,13 @@ } * themeID="aboutHLayout" { - background-color: #DCD9D7; + background-color: #DCD9D7; } /* Preview background color */ OBSQTDisplay { - qproperty-displayBackgroundColor: rgb(76, 76, 76); + qproperty-displayBackgroundColor: rgb(76, 76, 76); } /* Preview/Program labels */ @@ -244,7 +244,7 @@ } OBSMissingFiles { - qproperty-warningIcon: url(:res/images/alert.svg); + qproperty-warningIcon: url(:res/images/alert.svg); } /* Source Icons */ @@ -272,7 +272,7 @@ SceneTree { qproperty-gridItemWidth: 150; - qproperty-gridItemHeight: 24; + qproperty-gridItemHeight: 24; } /* Save icon */ @@ -284,25 +284,25 @@ /* Studio Mode T-Bar */ QSliderthemeID="tBarSlider" { - height: 24px; + height: 24px; } QSlider::groove:horizontalthemeID="tBarSlider" { - border: 1px solid #4c4c4c; - height: 5px; - background: #DCD9D7; + border: 1px solid #4c4c4c; + height: 5px; + background: #DCD9D7; } QSlider::sub-page:horizontalthemeID="tBarSlider" { - background: #DCD9D7; - border: 1px solid #4c4c4c; + background: #DCD9D7; + border: 1px solid #4c4c4c; } QSlider::handle:horizontalthemeID="tBarSlider" { - background-color: #4c4c4c; - width: 12px; - height: 24px; - margin: -24px 0px; + background-color: #4c4c4c; + width: 12px; + height: 24px; + margin: -24px 0px; } /* Source Context */ @@ -358,18 +358,18 @@ } #ytEventList QLabel { - background-color: #e1e1e1; - border: 1px solid #ddd; + background-color: #e1e1e1; + border: 1px solid #ddd; } #ytEventList QLabel:hover { background-color: #eee; - border: 1px solid #777; + border: 1px solid #777; } #ytEventList QLabelisSelectedEvent=true { background-color: #ccc; - border: 1px solid #444; + border: 1px solid #444; } /* Calendar Widget */
View file
obs-studio-29.1.1.tar.xz/UI/data/themes/Yami.qss -> obs-studio-29.1.2.tar.xz/UI/data/themes/Yami.qss
Changed
@@ -36,7 +36,7 @@ alternateBase: rgb(11,10,11); text: rgb(255,254,255); - + button: rgb(60,64,75); buttonText: rgb(255,254,255); @@ -62,14 +62,14 @@ windowText: rgb(153,153,153); text: rgb(153,153,153); button: rgb(27,29,34); - + buttonText: rgb(43,46,56); brightText: rgb(43,46,56); } OBSTheme::inactive { text: rgb(255,254,255); - + highlight: rgb(25,28,34); highlightText: rgb(255,255,255); } @@ -171,11 +171,11 @@ /* Top Menu Bar Items */ QMenuBar::item { - background-color: transparent; + background-color: transparent; } QMenuBar::item:selected { - background: rgb(40,76,184); + background: rgb(40,76,184); } /* Item Lists */ @@ -212,7 +212,7 @@ SourceTree::item { border-radius: 4px; color: palette(text); - border: 0px solid transparent; + border: 0px solid transparent; } QMenu::item:selected, @@ -424,7 +424,7 @@ } QScrollBar::handle:vertical { - min-height: 20px; + min-height: 20px; } QScrollBar::handle:horizontal { @@ -884,7 +884,7 @@ } QSlider::add-page:vertical { - background-color: palette(highlight); + background-color: palette(highlight); border-radius: 2px; } @@ -1099,44 +1099,44 @@ QCheckBox::indicator, QGroupBox::indicator { - width: 18px; - height: 18px; + width: 18px; + height: 18px; } QGroupBox::indicator { - margin-left: 2px; + margin-left: 2px; } QCheckBox::indicator:unchecked, QGroupBox::indicator:unchecked { - image: url(./Yami/checkbox_unchecked.svg); + image: url(./Yami/checkbox_unchecked.svg); } QCheckBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:hover { - border: none; - image: url(./Yami/checkbox_unchecked_focus.svg); + border: none; + image: url(./Yami/checkbox_unchecked_focus.svg); } QCheckBox::indicator:checked, QGroupBox::indicator:checked { - image: url(./Yami/checkbox_checked.svg); + image: url(./Yami/checkbox_checked.svg); } QCheckBox::indicator:checked:hover, QGroupBox::indicator:checked:hover { - border: none; - image: url(./Yami/checkbox_checked_focus.svg); + border: none; + image: url(./Yami/checkbox_checked_focus.svg); } QCheckBox::indicator:checked:disabled, QGroupBox::indicator:checked:disabled { - image: url(./Yami/checkbox_checked_disabled.svg); + image: url(./Yami/checkbox_checked_disabled.svg); } QCheckBox::indicator:unchecked:disabled, QGroupBox::indicator:unchecked:disabled { - image: url(./Yami/checkbox_unchecked_disabled.svg); + image: url(./Yami/checkbox_unchecked_disabled.svg); } /* Locked CheckBox */ @@ -1204,7 +1204,7 @@ /* Mute CheckBox */ MuteCheckBox { - outline: none; + outline: none; } MuteCheckBox::indicator { @@ -1213,35 +1213,35 @@ } MuteCheckBox::indicator:checked { - image: url(./Dark/mute.svg); + image: url(./Dark/mute.svg); } MuteCheckBox::indicator:unchecked { - image: url(./Dark/settings/audio.svg); + image: url(./Dark/settings/audio.svg); } MuteCheckBox::indicator:unchecked:hover { - image: url(./Dark/settings/audio.svg); + image: url(./Dark/settings/audio.svg); } MuteCheckBox::indicator:unchecked:focus { - image: url(./Dark/settings/audio.svg); + image: url(./Dark/settings/audio.svg); } MuteCheckBox::indicator:checked:hover { - image: url(./Dark/mute.svg); + image: url(./Dark/mute.svg); } MuteCheckBox::indicator:checked:focus { - image: url(./Dark/mute.svg); + image: url(./Dark/mute.svg); } MuteCheckBox::indicator:checked:disabled { - image: url(./Dark/mute.svg); + image: url(./Dark/mute.svg); } MuteCheckBox::indicator:unchecked:disabled { - image: url(./Dark/settings/audio.svg); + image: url(./Dark/settings/audio.svg); } #hotkeyFilterReset { @@ -1258,7 +1258,7 @@ } OBSHotkeyLabelhotkeyPairHover=true { - color: rgb(53,82,222); + color: rgb(53,82,222); } OBSHotkeyWidget QPushButton { @@ -1328,17 +1328,21 @@ } *gridMode="true" SceneTree::item:selected { - background-color: rgb(51,69,163); + background-color: rgb(40,76,184); } *gridMode="true" SceneTree::item:checked { - background-color: rgb(51,69,163); + background-color: rgb(40,76,184); } *gridMode="true" SceneTree::item:hover { background-color: rgb(79,83,94);
View file
obs-studio-29.1.1.tar.xz/UI/obs-app.cpp -> obs-studio-29.1.2.tar.xz/UI/obs-app.cpp
Changed
@@ -3238,7 +3238,8 @@ recv(sigintFd1, &tmp, sizeof(tmp), 0); OBSBasic *main = reinterpret_cast<OBSBasic *>(GetMainWindow()); - main->close(); + if (main) + main->close(); #endif }
View file
obs-studio-29.1.1.tar.xz/UI/properties-view.cpp -> obs-studio-29.1.2.tar.xz/UI/properties-view.cpp
Changed
@@ -88,19 +88,33 @@ void OBSPropertiesView::ReloadProperties() { + deferUpdate = false; if (weakObj || rawObj) { OBSObject strongObj = GetObject(); void *obj = strongObj ? strongObj.Get() : rawObj; - if (obj) + if (obj) { properties.reset(reloadCallback(obj)); + + if (obs_obj_get_type(obj) == OBS_OBJ_TYPE_SOURCE) { + enum obs_source_type type = obs_source_get_type( + (obs_source_t *)obj); + if (type == OBS_SOURCE_TYPE_INPUT || + type == OBS_SOURCE_TYPE_TRANSITION) { + uint32_t flags = + obs_properties_get_flags( + properties.get()); + deferUpdate = + (flags & + OBS_PROPERTIES_DEFER_UPDATE) != + 0; + } + } + } } else { properties.reset(reloadCallback((void *)type.c_str())); obs_properties_apply_settings(properties.get(), settings); } - uint32_t flags = obs_properties_get_flags(properties.get()); - deferUpdate = (flags & OBS_PROPERTIES_DEFER_UPDATE) != 0; - RefreshProperties(); }
View file
obs-studio-29.1.1.tar.xz/UI/window-basic-about.cpp -> obs-studio-29.1.2.tar.xz/UI/window-basic-about.cpp
Changed
@@ -133,8 +133,9 @@ void OBSAbout::ShowAuthors() { std::string path; - QString error = "Error! File could not be read.\n\n \ - Go to: https://github.com/obsproject/obs-studio/blob/master/AUTHORS"; + QString error = + QTStr("About.Error") + .arg("https://github.com/obsproject/obs-studio/blob/master/AUTHORS"); #ifdef __APPLE__ if (!GetDataFilePath("AUTHORS", path)) { @@ -160,8 +161,9 @@ void OBSAbout::ShowLicense() { std::string path; - QString error = "Error! File could not be read.\n\n \ - Go to: https://github.com/obsproject/obs-studio/blob/master/COPYING"; + QString error = + QTStr("About.Error") + .arg("https://github.com/obsproject/obs-studio/blob/master/COPYING"); if (!GetDataFilePath("license/gplv2.txt", path)) { ui->textBrowser->setPlainText(error);
View file
obs-studio-29.1.1.tar.xz/UI/window-basic-main-outputs.cpp -> obs-studio-29.1.2.tar.xz/UI/window-basic-main-outputs.cpp
Changed
@@ -348,6 +348,7 @@ switch (main->vcamConfig.type) { case VCamOutputType::InternalOutput: + DestroyVirtualCameraScene(); switch (main->vcamConfig.internal) { case VCamInternalType::Default: source = obs_get_output_source(0); @@ -360,10 +361,11 @@ } break; case VCamOutputType::SceneOutput: + DestroyVirtualCameraScene(); source = obs_get_source_by_name(main->vcamConfig.scene.c_str()); break; case VCamOutputType::SourceOutput: - OBSSource s = + OBSSourceAutoRelease s = obs_get_source_by_name(main->vcamConfig.source.c_str()); if (!vCamSourceScene) @@ -380,7 +382,6 @@ if (!vCamSourceSceneItem) { vCamSourceSceneItem = obs_scene_add(vCamSourceScene, s); - obs_source_release(s); obs_sceneitem_set_bounds_type(vCamSourceSceneItem, OBS_BOUNDS_SCALE_INNER); @@ -410,6 +411,11 @@ obs_view_destroy(virtualCamView); virtualCamView = nullptr; + DestroyVirtualCameraScene(); +} + +void BasicOutputHandler::DestroyVirtualCameraScene() +{ if (!vCamSourceScene) return; @@ -1786,6 +1792,10 @@ unsigned int cy = 0; int idx = 0; + /* Hack to allow recordings without any audio tracks selected. It is no + * longer possible to select such a configuration in settings, but legacy + * configurations might still have this configured and we don't want to + * just break them. */ if (tracks == 0) tracks = config_get_int(main->Config(), "AdvOut", "TrackIndex");
View file
obs-studio-29.1.1.tar.xz/UI/window-basic-main-outputs.hpp -> obs-studio-29.1.2.tar.xz/UI/window-basic-main-outputs.hpp
Changed
@@ -64,6 +64,7 @@ virtual void UpdateVirtualCamOutputSource(); virtual void DestroyVirtualCamView(); + virtual void DestroyVirtualCameraScene(); inline bool Active() const {
View file
obs-studio-29.1.1.tar.xz/UI/window-basic-main-transitions.cpp -> obs-studio-29.1.2.tar.xz/UI/window-basic-main-transitions.cpp
Changed
@@ -426,7 +426,8 @@ ui->transitionRemove->setEnabled(configurable); ui->transitionProps->setEnabled(configurable); - if (vcamEnabled && vcamConfig.internal == VCamInternalType::Default) + if (vcamEnabled && vcamConfig.type == VCamOutputType::InternalOutput && + vcamConfig.internal == VCamInternalType::Default) outputHandler->UpdateVirtualCamOutputSource(); if (api)
View file
obs-studio-29.1.1.tar.xz/UI/window-basic-main.cpp -> obs-studio-29.1.2.tar.xz/UI/window-basic-main.cpp
Changed
@@ -1280,7 +1280,7 @@ disableSaving--; - if (vcamEnabled && vcamConfig.internal == VCamInternalType::Preview) + if (vcamEnabled) outputHandler->UpdateVirtualCamOutputSource(); if (api) { @@ -2793,6 +2793,9 @@ if (updateCheckThread && updateCheckThread->isRunning()) updateCheckThread->wait(); + if (patronJsonThread && patronJsonThread->isRunning()) + patronJsonThread->wait(); + delete screenshotData; delete previewProjector; delete studioProgramProjector; @@ -4857,6 +4860,14 @@ for (int i = 0; i < MAX_CHANNELS; i++) obs_set_output_source(i, nullptr); + /* Reset VCam to default to clear its private scene and any references + * it holds. It will be reconfigured during loading. */ + if (vcamEnabled) { + vcamConfig.type = VCamOutputType::InternalOutput; + vcamConfig.internal = VCamInternalType::Default; + outputHandler->UpdateVirtualCamOutputSource(); + } + lastScene = nullptr; swapScene = nullptr; programScene = nullptr; @@ -4887,6 +4898,11 @@ QApplication::sendPostedEvents(nullptr); } while (obs_wait_for_destroy_queue()); + /* Pump Qt events one final time to give remaining signals time to be + * processed (since this happens after the destroy thread finishes and + * the audio/video threads have processed their tasks). */ + QApplication::sendPostedEvents(nullptr); + unsetCursor(); /* If scene data wasn't actually cleared, e.g. faulty plugin holding a @@ -5274,7 +5290,8 @@ SetCurrentScene(source); - if (vcamEnabled && vcamConfig.internal == VCamInternalType::Preview) + if (vcamEnabled && vcamConfig.type == VCamOutputType::InternalOutput && + vcamConfig.internal == VCamInternalType::Preview) outputHandler->UpdateVirtualCamOutputSource(); if (api)
View file
obs-studio-29.1.1.tar.xz/UI/window-basic-preview.cpp -> obs-studio-29.1.2.tar.xz/UI/window-basic-preview.cpp
Changed
@@ -1492,9 +1492,17 @@ obs_source_t *source = obs_sceneitem_get_source(stretchItem); + uint32_t source_cx = obs_source_get_width(source); + uint32_t source_cy = obs_source_get_height(source); + + /* if the source's internal size has been set to 0 for whatever reason + * while resizing, do not update transform, otherwise source will be + * stuck invisible until a complete transform reset */ + if (!source_cx || !source_cy) + return; + vec2 baseSize; - vec2_set(&baseSize, float(obs_source_get_width(source)), - float(obs_source_get_height(source))); + vec2_set(&baseSize, float(source_cx), float(source_cy)); vec2 size; vec2_set(&size, br.x - tl.x, br.y - tl.y);
View file
obs-studio-29.1.1.tar.xz/UI/window-basic-settings-stream.cpp -> obs-studio-29.1.2.tar.xz/UI/window-basic-settings-stream.cpp
Changed
@@ -140,11 +140,10 @@ QTStr("Basic.Settings.Stream.Custom.Password.ToolTip")); } else { int idx = ui->service->findText(service); - if (idx == -1) { - if (service && *service) - ui->service->insertItem(1, service); - idx = 1; - } + /* 29.1 crash workaround: Fall back to "Custom" if service not found. */ + if (idx == -1) + idx = 0; + ui->service->setCurrentIndex(idx); lastServiceIdx = idx;
View file
obs-studio-29.1.1.tar.xz/UI/window-basic-settings.cpp -> obs-studio-29.1.2.tar.xz/UI/window-basic-settings.cpp
Changed
@@ -3853,14 +3853,8 @@ SaveCheckBox(ui->simpleReplayBuf, "SimpleOutput", "RecRB"); SaveSpinBox(ui->simpleRBSecMax, "SimpleOutput", "RecRBTime"); SaveSpinBox(ui->simpleRBMegsMax, "SimpleOutput", "RecRBSize"); - config_set_int( - main->Config(), "SimpleOutput", "RecTracks", - (ui->simpleOutRecTrack1->isChecked() ? (1 << 0) : 0) | - (ui->simpleOutRecTrack2->isChecked() ? (1 << 1) : 0) | - (ui->simpleOutRecTrack3->isChecked() ? (1 << 2) : 0) | - (ui->simpleOutRecTrack4->isChecked() ? (1 << 3) : 0) | - (ui->simpleOutRecTrack5->isChecked() ? (1 << 4) : 0) | - (ui->simpleOutRecTrack6->isChecked() ? (1 << 5) : 0)); + config_set_int(main->Config(), "SimpleOutput", "RecTracks", + SimpleOutGetSelectedAudioTracks()); curAdvStreamEncoder = GetComboData(ui->advOutEncoder); @@ -3892,14 +3886,8 @@ SaveSpinBox(ui->advOutSplitFileTime, "AdvOut", "RecSplitFileTime"); SaveSpinBox(ui->advOutSplitFileSize, "AdvOut", "RecSplitFileSize"); - config_set_int( - main->Config(), "AdvOut", "RecTracks", - (ui->advOutRecTrack1->isChecked() ? (1 << 0) : 0) | - (ui->advOutRecTrack2->isChecked() ? (1 << 1) : 0) | - (ui->advOutRecTrack3->isChecked() ? (1 << 2) : 0) | - (ui->advOutRecTrack4->isChecked() ? (1 << 3) : 0) | - (ui->advOutRecTrack5->isChecked() ? (1 << 4) : 0) | - (ui->advOutRecTrack6->isChecked() ? (1 << 5) : 0)); + config_set_int(main->Config(), "AdvOut", "RecTracks", + AdvOutGetSelectedAudioTracks()); config_set_int(main->Config(), "AdvOut", "FLVTrack", CurrentFLVTrack()); @@ -4219,6 +4207,7 @@ bool invalidEncoder = false; bool invalidFormat = false; + bool invalidTracks = false; if (simple) { if (ui->simpleOutRecEncoder->currentIndex() == -1 || ui->simpleOutStrEncoder->currentIndex() == -1 || @@ -4228,12 +4217,24 @@ if (ui->simpleOutRecFormat->currentIndex() == -1) invalidFormat = true; + + QString qual = + ui->simpleOutRecQuality->currentData().toString(); + QString format = + ui->simpleOutRecFormat->currentData().toString(); + if (SimpleOutGetSelectedAudioTracks() == 0 && + qual != "Stream" && format != "flv") + invalidTracks = true; } else { if (ui->advOutRecEncoder->currentIndex() == -1 || ui->advOutEncoder->currentIndex() == -1 || ui->advOutRecAEncoder->currentIndex() == -1 || ui->advOutAEncoder->currentIndex() == -1) invalidEncoder = true; + + QString format = ui->advOutRecFormat->currentData().toString(); + if (AdvOutGetSelectedAudioTracks() == 0 && format != "flv") + invalidTracks = true; } if (invalidEncoder) { @@ -4246,6 +4247,12 @@ this, QTStr("CodecCompat.ContainerMissingOnExit.Title"), QTStr("CodecCompat.ContainerMissingOnExit.Text")); return false; + } else if (invalidTracks) { + OBSMessageBox::warning( + this, + QTStr("OutputWarnings.NoTracksSelectedOnExit.Title"), + QTStr("OutputWarnings.NoTracksSelectedOnExit.Text")); + return false; } return true; @@ -6159,6 +6166,28 @@ return 0; } +int OBSBasicSettings::SimpleOutGetSelectedAudioTracks() +{ + int tracks = (ui->simpleOutRecTrack1->isChecked() ? (1 << 0) : 0) | + (ui->simpleOutRecTrack2->isChecked() ? (1 << 1) : 0) | + (ui->simpleOutRecTrack3->isChecked() ? (1 << 2) : 0) | + (ui->simpleOutRecTrack4->isChecked() ? (1 << 3) : 0) | + (ui->simpleOutRecTrack5->isChecked() ? (1 << 4) : 0) | + (ui->simpleOutRecTrack6->isChecked() ? (1 << 5) : 0); + return tracks; +} + +int OBSBasicSettings::AdvOutGetSelectedAudioTracks() +{ + int tracks = (ui->advOutRecTrack1->isChecked() ? (1 << 0) : 0) | + (ui->advOutRecTrack2->isChecked() ? (1 << 1) : 0) | + (ui->advOutRecTrack3->isChecked() ? (1 << 2) : 0) | + (ui->advOutRecTrack4->isChecked() ? (1 << 3) : 0) | + (ui->advOutRecTrack5->isChecked() ? (1 << 4) : 0) | + (ui->advOutRecTrack6->isChecked() ? (1 << 5) : 0); + return tracks; +} + /* Using setEditable(true) on a QComboBox when there's a custom style in use * does not work properly, so instead completely recreate the widget, which * seems to work fine. */
View file
obs-studio-29.1.1.tar.xz/UI/window-basic-settings.hpp -> obs-studio-29.1.2.tar.xz/UI/window-basic-settings.hpp
Changed
@@ -375,6 +375,8 @@ QIcon GetAdvancedIcon() const; int CurrentFLVTrack(); + int SimpleOutGetSelectedAudioTracks(); + int AdvOutGetSelectedAudioTracks(); OBSService GetStream1Service();
View file
obs-studio-29.1.1.tar.xz/UI/window-basic-transform.cpp -> obs-studio-29.1.2.tar.xz/UI/window-basic-transform.cpp
Changed
@@ -246,8 +246,10 @@ obs_sceneitem_get_crop(item, &crop); obs_source_t *source = obs_sceneitem_get_source(item); - float width = float(obs_source_get_width(source)); - float height = float(obs_source_get_height(source)); + uint32_t source_cx = obs_source_get_width(source); + uint32_t source_cy = obs_source_get_height(source); + float width = float(source_cx); + float height = float(source_cy); int alignIndex = AlignToList(osi.alignment); int boundsAlignIndex = AlignToList(osi.bounds_alignment); @@ -260,6 +262,10 @@ ui->sizeY->setValue(osi.scale.y * height); ui->align->setCurrentIndex(alignIndex); + bool valid_size = source_cx != 0 && source_cy != 0; + ui->sizeX->setEnabled(valid_size); + ui->sizeY->setEnabled(valid_size); + ui->boundsType->setCurrentIndex(int(osi.bounds_type)); ui->boundsAlign->setCurrentIndex(boundsAlignIndex); ui->boundsWidth->setValue(osi.bounds.x); @@ -308,15 +314,23 @@ return; obs_source_t *source = obs_sceneitem_get_source(item); - double width = double(obs_source_get_width(source)); - double height = double(obs_source_get_height(source)); + uint32_t source_cx = obs_source_get_width(source); + uint32_t source_cy = obs_source_get_height(source); + double width = double(source_cx); + double height = double(source_cy); obs_transform_info oti; + obs_sceneitem_get_info(item, &oti); + + /* do not scale a source if it has 0 width/height */ + if (source_cx != 0 && source_cy != 0) { + oti.scale.x = float(ui->sizeX->value() / width); + oti.scale.y = float(ui->sizeY->value() / height); + } + oti.pos.x = float(ui->positionX->value()); oti.pos.y = float(ui->positionY->value()); oti.rot = float(ui->rotation->value()); - oti.scale.x = float(ui->sizeX->value() / width); - oti.scale.y = float(ui->sizeY->value() / height); oti.alignment = listToAlignui->align->currentIndex(); oti.bounds_type = (obs_bounds_type)ui->boundsType->currentIndex();
View file
obs-studio-29.1.1.tar.xz/UI/window-missing-files.cpp -> obs-studio-29.1.2.tar.xz/UI/window-missing-files.cpp
Changed
@@ -164,6 +164,11 @@ container, QTStr("MissingFiles.SelectFile"), currentPath, nullptr); +#ifdef __APPLE__ + // TODO: Revisit when QTBUG-42661 is fixed + container->window()->raise(); +#endif + if (!newPath.isEmpty()) { container->setProperty(PATH_LIST_PROP, QStringList() << newPath);
View file
obs-studio-29.1.1.tar.xz/UI/window-projector.cpp -> obs-studio-29.1.2.tar.xz/UI/window-projector.cpp
Changed
@@ -229,6 +229,10 @@ if (!transitionOnDoubleClick) return; + // Only MultiView projectors handle double click + if (this->type != ProjectorType::Multiview) + return; + OBSBasic *main = (OBSBasic *)obs_frontend_get_main_window(); if (!main->IsPreviewProgramMode()) return;
View file
obs-studio-29.1.1.tar.xz/deps/media-playback/media-playback/media.c -> obs-studio-29.1.2.tar.xz/deps/media-playback/media-playback/media.c
Changed
@@ -293,6 +293,14 @@ } } + /* kind of a cheap fix, but because a stinger might be + * interrupted and restart playback, the request_preload signal + * might happen when the current frame is invalid, so clear out + * these pointers to signify they're not valid. (the obsframe + * structure is only used in the media thread, so this isn't a + * threading issue) */ + m->obsframe.data0 = NULL; + if (m->has_video && !mp_decode_frame(&m->v)) return false; if (m->has_audio && !mp_decode_frame(&m->a)) @@ -840,8 +848,11 @@ if (pause) continue; - if (preload_frame) + /* see note in mp_media_prepare_frames() for context on the + * pointer check */ + if (preload_frame && m->obsframe.data0 && !is_active) { m->v_preload_cb(m->opaque, &m->obsframe); + } /* frames are ready */ if (is_active && !timeout) {
View file
obs-studio-29.1.1.tar.xz/deps/obs-scripting/obs-scripting-lua.c -> obs-studio-29.1.2.tar.xz/deps/obs-scripting/obs-scripting-lua.c
Changed
@@ -129,7 +129,8 @@ goto fail; } - if (luaL_loadbuffer(script, file_data, strlen(file_data), NULL) != 0) { + if (luaL_loadbuffer(script, file_data, strlen(file_data), + data->base.path.array) != 0) { script_warn(&data->base, "Error loading file: %s", lua_tostring(script, -1)); bfree(file_data);
View file
obs-studio-29.1.1.tar.xz/docs/sphinx/reference-properties.rst -> obs-studio-29.1.2.tar.xz/docs/sphinx/reference-properties.rst
Changed
@@ -51,7 +51,9 @@ - OBS_PROPERTIES_DEFER_UPDATE - A hint that tells the front-end to defers updating the settings until the user has finished editing all properties rather than - immediately updating any settings + immediately updating any settings. Currently only + works for properties of input and transition sources, + this flag is a no-op for other properties at this time. ---------------------
View file
obs-studio-29.1.1.tar.xz/libobs-d3d11/d3d11-subsystem.cpp -> obs-studio-29.1.2.tar.xz/libobs-d3d11/d3d11-subsystem.cpp
Changed
@@ -26,6 +26,7 @@ #include <d3d9.h> #include "d3d11-subsystem.hpp" #include <shellscalingapi.h> +#include <d3dkmthk.h> struct UnsupportedHWError : HRError { inline UnsupportedHWError(const char *str, HRESULT hr) @@ -472,39 +473,18 @@ } #if USE_GPU_PRIORITY -static bool set_priority(ID3D11Device *device) +static bool set_priority(ID3D11Device *device, bool hags_enabled) { - typedef enum _D3DKMT_SCHEDULINGPRIORITYCLASS { - D3DKMT_SCHEDULINGPRIORITYCLASS_IDLE, - D3DKMT_SCHEDULINGPRIORITYCLASS_BELOW_NORMAL, - D3DKMT_SCHEDULINGPRIORITYCLASS_NORMAL, - D3DKMT_SCHEDULINGPRIORITYCLASS_ABOVE_NORMAL, - D3DKMT_SCHEDULINGPRIORITYCLASS_HIGH, - D3DKMT_SCHEDULINGPRIORITYCLASS_REALTIME - } D3DKMT_SCHEDULINGPRIORITYCLASS; - ComQIPtr<IDXGIDevice> dxgiDevice(device); if (!dxgiDevice) { blog(LOG_DEBUG, "%s: Failed to get IDXGIDevice", __FUNCTION__); return false; } - HMODULE gdi32 = GetModuleHandleW(L"GDI32"); - if (!gdi32) { - blog(LOG_DEBUG, "%s: Failed to get GDI32", __FUNCTION__); - return false; - } - - NTSTATUS(WINAPI * d3dkmt_spspc)(HANDLE, D3DKMT_SCHEDULINGPRIORITYCLASS); - d3dkmt_spspc = (decltype(d3dkmt_spspc))GetProcAddress( - gdi32, "D3DKMTSetProcessSchedulingPriorityClass"); - if (!d3dkmt_spspc) { - blog(LOG_DEBUG, "%s: Failed to get d3dkmt_spspc", __FUNCTION__); - return false; - } - - NTSTATUS status = d3dkmt_spspc(GetCurrentProcess(), - D3DKMT_SCHEDULINGPRIORITYCLASS_REALTIME); + NTSTATUS status = D3DKMTSetProcessSchedulingPriorityClass( + GetCurrentProcess(), + hags_enabled ? D3DKMT_SCHEDULINGPRIORITYCLASS_HIGH + : D3DKMT_SCHEDULINGPRIORITYCLASS_REALTIME); if (status != 0) { blog(LOG_DEBUG, "%s: Failed to set process priority class: %d", __FUNCTION__, (int)status); @@ -521,9 +501,45 @@ blog(LOG_INFO, "D3D11 GPU priority setup success"); return true; } - #endif +static bool adapter_hags_enabled(DXGI_ADAPTER_DESC *desc) +{ + D3DKMT_OPENADAPTERFROMLUID d3dkmt_openluid{}; + bool hags_enabled = false; + NTSTATUS res; + + d3dkmt_openluid.AdapterLuid = desc->AdapterLuid; + + res = D3DKMTOpenAdapterFromLuid(&d3dkmt_openluid); + if (FAILED(res)) { + blog(LOG_DEBUG, "Failed opening D3DKMT adapter: %x", res); + return hags_enabled; + } + + D3DKMT_WDDM_2_7_CAPS caps = {}; + D3DKMT_QUERYADAPTERINFO args = {}; + args.hAdapter = d3dkmt_openluid.hAdapter; + args.Type = KMTQAITYPE_WDDM_2_7_CAPS; + args.pPrivateDriverData = ∩︀ + args.PrivateDriverDataSize = sizeof(caps); + res = D3DKMTQueryAdapterInfo(&args); + + /* On Windows 10 pre-2004 this will fail, but HAGS isn't supported + * there anyway. */ + if (SUCCEEDED(res)) + hags_enabled = caps.HwSchEnabled; + + D3DKMT_CLOSEADAPTER d3dkmt_close = {d3dkmt_openluid.hAdapter}; + res = D3DKMTCloseAdapter(&d3dkmt_close); + if (FAILED(res)) { + blog(LOG_DEBUG, "Failed closing D3DKMT adapter %x: %x", + d3dkmt_openluid.hAdapter, res); + } + + return hags_enabled; +} + static bool CheckFormat(ID3D11Device *device, DXGI_FORMAT format) { constexpr UINT required = D3D11_FORMAT_SUPPORT_TEXTURE2D | @@ -573,9 +589,16 @@ blog(LOG_INFO, "DXGI increase maximum frame latency failed"); } + /* Log HAGS status */ + bool hags_enabled = adapter_hags_enabled(&desc); + if (hags_enabled) { + blog(LOG_WARNING, + "Hardware-Accelerated GPU Scheduling enabled on adapter!"); + } + /* adjust gpu thread priority on non-intel GPUs */ #if USE_GPU_PRIORITY - if (desc.VendorId != 0x8086 && !set_priority(device)) { + if (desc.VendorId != 0x8086 && !set_priority(device, hags_enabled)) { blog(LOG_INFO, "D3D11 GPU priority setup " "failed (not admin?)"); }
View file
obs-studio-29.1.1.tar.xz/libobs/CMakeLists.txt -> obs-studio-29.1.2.tar.xz/libobs/CMakeLists.txt
Changed
@@ -283,6 +283,7 @@ obs-source.h obs-ui.h obs.h + obs.hpp util/base.h util/bmem.h util/c99defs.h
View file
obs-studio-29.1.1.tar.xz/libobs/audio-monitoring/pulse/pulseaudio-wrapper.c -> obs-studio-29.1.2.tar.xz/libobs/audio-monitoring/pulse/pulseaudio-wrapper.c
Changed
@@ -54,7 +54,6 @@ } else { *id = bzalloc(strlen(pdo->default_sink_name) + 9); strcat(*id, pdo->default_sink_name); - strcat(*id, ".monitor"); bfree(pdo->default_sink_name); } @@ -62,9 +61,14 @@ pulseaudio_unref(); } +/** + * Checks whether a sound source (id1) is the .monitor device for the + * selected monitoring output (id2). + */ bool devices_match(const char *id1, const char *id2) { bool match; + char *name_default = NULL; char *name1 = NULL; char *name2 = NULL; @@ -72,18 +76,28 @@ return false; if (strcmp(id1, "default") == 0) { - get_default_id(&name1); - id1 = name1; + get_default_id(&name_default); + name1 = bzalloc(strlen(name_default) + 9); + strcat(name1, name_default); + strcat(name1, ".monitor"); + } else { + name1 = bstrdup(id1); } + if (strcmp(id2, "default") == 0) { - get_default_id(&name2); + if (!name_default) + get_default_id(&name_default); + name2 = bzalloc(strlen(name_default) + 9); + strcat(name2, name_default); + strcat(name2, ".monitor"); } else { name2 = bzalloc(strlen(id2) + 9); strcat(name2, id2); strcat(name2, ".monitor"); } - match = strcmp(id1, name2) == 0; + match = strcmp(name1, name2) == 0; + bfree(name_default); bfree(name1); bfree(name2); return match;
View file
obs-studio-29.1.1.tar.xz/libobs/obs-config.h -> obs-studio-29.1.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-29.1.1.tar.xz/libobs/obs-scene.c -> obs-studio-29.1.2.tar.xz/libobs/obs-scene.c
Changed
@@ -2732,7 +2732,9 @@ if (item && info) { item->pos = info->pos; item->rot = info->rot; - item->scale = info->scale; + if (isfinite(info->scale.x) && isfinite(info->scale.y)) { + item->scale = info->scale; + } item->align = info->alignment; item->bounds_type = info->bounds_type; item->bounds_align = info->bounds_alignment;
View file
obs-studio-29.1.1.tar.xz/libobs/obs-windows.c -> obs-studio-29.1.2.tar.xz/libobs/obs-windows.c
Changed
@@ -180,8 +180,6 @@ L"SOFTWARE\\Policies\\Microsoft\\Windows\\GameDVR" #define WIN10_GAME_DVR_REG_KEY L"System\\GameConfigStore" #define WIN10_GAME_MODE_REG_KEY L"Software\\Microsoft\\GameBar" -#define WIN10_HAGS_REG_KEY \ - L"SYSTEM\\CurrentControlSet\\Control\\GraphicsDrivers" static void log_gaming_features(void) { @@ -193,7 +191,6 @@ struct reg_dword game_dvr_enabled; struct reg_dword game_dvr_bg_recording; struct reg_dword game_mode_enabled; - struct reg_dword hags_enabled; get_reg_dword(HKEY_CURRENT_USER, WIN10_GAME_BAR_REG_KEY, L"AppCaptureEnabled", &game_bar_enabled); @@ -205,8 +202,6 @@ L"HistoricalCaptureEnabled", &game_dvr_bg_recording); get_reg_dword(HKEY_CURRENT_USER, WIN10_GAME_MODE_REG_KEY, L"AutoGameModeEnabled", &game_mode_enabled); - get_reg_dword(HKEY_LOCAL_MACHINE, WIN10_HAGS_REG_KEY, L"HwSchMode", - &hags_enabled); if (game_mode_enabled.status != ERROR_SUCCESS) { get_reg_dword(HKEY_CURRENT_USER, WIN10_GAME_MODE_REG_KEY, @@ -241,15 +236,6 @@ // On by default in newer Windows 10 builds (no registry key set) blog(LOG_INFO, "\tGame Mode: Probably On (no reg key set)"); } - - if (hags_enabled.status == ERROR_SUCCESS) { - blog(LOG_INFO, "\tHardware GPU Scheduler: %s", - (hags_enabled.return_value == 2) ? "On" : "Off"); - } else if (win_build >= 22000) { - // On by default in Windows 11 (no registry key set) - blog(LOG_INFO, - "\tHardware GPU Scheduler: Probably On (no reg key set)"); - } } static const char *get_str_for_state(int state)
View file
obs-studio-29.1.1.tar.xz/plugins/linux-alsa/data/locale/en-US.ini -> obs-studio-29.1.2.tar.xz/plugins/linux-alsa/data/locale/en-US.ini
Changed
@@ -1,2 +1,4 @@ AlsaInput="Audio Capture Device (ALSA)" Device="Device" +PCM="PCM" +Rate="Rate"
View file
obs-studio-29.1.1.tar.xz/plugins/linux-capture/data/locale/en-US.ini -> obs-studio-29.1.2.tar.xz/plugins/linux-capture/data/locale/en-US.ini
Changed
@@ -10,6 +10,5 @@ CropRight="Crop Right" CropBottom="Crop Bottom" SwapRedBlue="Swap red and blue" -LockX="Lock X server when capturing" IncludeXBorder="Include X Border" ExcludeAlpha="Use alpha-less texture format (Mesa workaround)"
View file
obs-studio-29.1.1.tar.xz/plugins/linux-pulseaudio/data/locale/en-US.ini -> obs-studio-29.1.2.tar.xz/plugins/linux-pulseaudio/data/locale/en-US.ini
Changed
@@ -1,3 +1,4 @@ PulseInput="Audio Input Capture (PulseAudio)" PulseOutput="Audio Output Capture (PulseAudio)" Device="Device" +Default="Default"
View file
obs-studio-29.1.1.tar.xz/plugins/mac-avcapture/data/locale/en-US.ini -> obs-studio-29.1.2.tar.xz/plugins/mac-avcapture/data/locale/en-US.ini
Changed
@@ -12,3 +12,4 @@ Auto="Auto" Unknown="Unknown (%1)" EnableAudio="Enable audio if supported by device" +Resolution="Resolution"
View file
obs-studio-29.1.1.tar.xz/plugins/mac-syphon/data/locale/en-US.ini -> obs-studio-29.1.2.tar.xz/plugins/mac-syphon/data/locale/en-US.ini
Changed
@@ -1,8 +1,5 @@ Syphon="Syphon Client" Source="Source" -LaunchSyphonInject="Launch SyphonInject" -Inject="Inject" -Application="Application" SyphonLicense="Syphon License" Crop="Crop" Crop.origin.x="Crop left"
View file
obs-studio-29.1.1.tar.xz/plugins/mac-videotoolbox/data/locale/en-US.ini -> obs-studio-29.1.2.tar.xz/plugins/mac-videotoolbox/data/locale/en-US.ini
Changed
@@ -5,7 +5,6 @@ VTHEVCEncSW="Apple VT HEVC Software Encoder" VTProResEncHW="Apple VT ProRes Hardware Encoder" VTProResEncSW="Apple VT ProRes Software Encoder" -VTEncoder="VideoToolbox Encoder" Bitrate="Bitrate" Quality="Quality" UseMaxBitrate="Limit bitrate"
View file
obs-studio-29.1.1.tar.xz/plugins/mac-videotoolbox/encoder.c -> obs-studio-29.1.2.tar.xz/plugins/mac-videotoolbox/encoder.c
Changed
@@ -626,8 +626,9 @@ kVTCompressionPropertyKey_AllowFrameReordering, kVTCompressionPropertyKey_ProfileLevel}; - float key_frame_interval = - enc->keyint * ((float)enc->fps_num / enc->fps_den); + SInt32 key_frame_interval = + (SInt32)(enc->keyint * + ((float)enc->fps_num / enc->fps_den)); float expected_framerate = (float)enc->fps_num / enc->fps_den; CFNumberRef MaxKeyFrameInterval = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type,
View file
obs-studio-29.1.1.tar.xz/plugins/obs-ffmpeg/data/locale/en-US.ini -> obs-studio-29.1.2.tar.xz/plugins/obs-ffmpeg/data/locale/en-US.ini
Changed
@@ -1,4 +1,8 @@ FFmpegOutput="FFmpeg Output" +FFmpegMuxer="FFmpeg Muxer" +FFmpegHlsMuxer="FFmpeg HLS Muxer" +FFmpegMpegts="FFmpeg MPEG-TS" +FFmpegMpegtsMuxer="FFmpeg MPEG-TS Muxer" FFmpegAAC="FFmpeg AAC" FFmpegOpus="FFmpeg Opus" FFmpegALAC="FFmpeg ALAC (24-bit)" @@ -17,13 +21,14 @@ KeyframeIntervalSec="Keyframe Interval (0=auto)" Lossless="Lossless" Level="Level" +FilePath="File Path" AMFOpts="AMF/FFmpeg Options" AMFOpts.ToolTip="Use to specify custom AMF or FFmpeg options. For example, \"level=5.2 profile=main\". Check the AMF encoder docs for more details." +GPU="GPU" BFrames="Max B-frames" -VAAPI.Codec="VAAPI Codec" VAAPI.Device="VAAPI Device" NVENC.LookAhead="Look-ahead" @@ -35,7 +40,6 @@ NVENC.I010Unsupported="NVENC does not support I010. Use P010 instead." NVENC.10bitUnsupported="Cannot perform 10-bit encode on this encoder." NVENC.16bitUnsupported="Cannot perform 16-bit encode on this encoder." -NVENC.TooManyBFrames="Max B-frames setting (%d) is more than encoder supports (%d)." NVENC.NoAV1FallbackPossible="AV1 encoding is not available with the current settings. Try disabling any re-scaling or GPU options that may be set. Check the log for more details." NVENC.Preset2.p1="P1: Fastest (Lowest Quality)" NVENC.Preset2.p2="P2: Faster (Lower Quality)" @@ -44,6 +48,13 @@ NVENC.Preset2.p5="P5: Slow (Good Quality)" NVENC.Preset2.p6="P6: Slower (Better Quality)" NVENC.Preset2.p7="P7: Slowest (Best Quality)" +NVENC.Preset2.mq="MQ" +NVENC.Preset2.hq="HQ" +NVENC.Preset2.default="Default" +NVENC.Preset2.hp="HP" +NVENC.Preset2.ll="LL" +NVENC.Preset2.llhq="LLHQ" +NVENC.Preset2.llhp="LLHP" NVENC.Tuning.hq="High Quality" NVENC.Tuning.ll="Low Latency" NVENC.Tuning.ull="Ultra Low Latency" @@ -65,7 +76,6 @@ BufferingMB="Network Buffering" HardwareDecode="Use hardware decoding when available" ClearOnMediaEnd="Show nothing when playback ends" -Advanced="Advanced" RestartWhenActivated="Restart playback when source becomes active" CloseFileWhenInactive="Close file when inactive" CloseFileWhenInactive.ToolTip="Closes the file when the source is not being displayed on the stream or\nrecording. This allows the file to be changed when the source isn't active,\nbut there may be some startup delay when the source reactivates." @@ -96,8 +106,6 @@ Encoder.Error="Failed to open %1: %2" Encoder.Timeout="Encoder %1 is taking too long to encode (timeout: %2 seconds)" -AMF.Error="Failed to open AMF codec: %1" -AMF.GenericError="Try installing the latest <a href=\"https://obsproject.com/go/amd-drivers\">AMD driver</a> and closing other recording software that might be using the AMD encoder such as the Radeon Software or Windows Game DVR." AMF.8bitUnsupportedHdr="OBS does not support 8-bit output of Rec. 2100." AMF.10bitUnsupportedAvc="Cannot perform 10-bit encode on AMD H.264 encoder." AMF.16bitUnsupported="Cannot perform 16-bit encode on this encoder."
View file
obs-studio-29.1.1.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c -> obs-studio-29.1.2.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c
Changed
@@ -287,6 +287,8 @@ hevc_vaapi_video_info(enc, &info); } else +#else + UNUSED_PARAMETER(hevc); #endif { h264_vaapi_video_info(enc, &info); @@ -564,6 +566,8 @@ &enc->header_size, &enc->sei, &enc->sei_size); } else +#else + UNUSED_PARAMETER(hevc); #endif { obs_extract_avc_headers( @@ -649,6 +653,8 @@ FF_PROFILE_HEVC_MAIN); } else +#else + UNUSED_PARAMETER(hevc); #endif { obs_data_set_default_int(settings, "profile",
View file
obs-studio-29.1.1.tar.xz/plugins/obs-filters/chroma-key-filter.c -> obs-studio-29.1.2.tar.xz/plugins/obs-filters/chroma-key-filter.c
Changed
@@ -447,7 +447,8 @@ obs_property_list_add_string(p, obs_module_text("Green"), "green"); obs_property_list_add_string(p, obs_module_text("Blue"), "blue"); obs_property_list_add_string(p, obs_module_text("Magenta"), "magenta"); - obs_property_list_add_string(p, obs_module_text("Custom"), "custom"); + obs_property_list_add_string(p, obs_module_text("CustomColor"), + "custom"); obs_property_set_modified_callback(p, key_type_changed); @@ -486,7 +487,8 @@ obs_property_list_add_string(p, obs_module_text("Green"), "green"); obs_property_list_add_string(p, obs_module_text("Blue"), "blue"); obs_property_list_add_string(p, obs_module_text("Magenta"), "magenta"); - obs_property_list_add_string(p, obs_module_text("Custom"), "custom"); + obs_property_list_add_string(p, obs_module_text("CustomColor"), + "custom"); obs_property_set_modified_callback(p, key_type_changed);
View file
obs-studio-29.1.1.tar.xz/plugins/obs-filters/data/locale/en-US.ini -> obs-studio-29.1.2.tar.xz/plugins/obs-filters/data/locale/en-US.ini
Changed
@@ -111,7 +111,6 @@ Expander.Detector="Detection" Expander.RMS="RMS" Expander.Peak="Peak" -Expander.None="None" Expander.Presets="Presets" Expander.Presets.Expander="Expander" Expander.Presets.Gate="Gate"
View file
obs-studio-29.1.1.tar.xz/plugins/obs-filters/expander-filter.c -> obs-studio-29.1.2.tar.xz/plugins/obs-filters/expander-filter.c
Changed
@@ -45,7 +45,6 @@ #define TEXT_DETECTOR MT_("Expander.Detector") #define TEXT_PEAK MT_("Expander.Peak") #define TEXT_RMS MT_("Expander.RMS") -#define TEXT_NONE MT_("Expander.None") #define TEXT_PRESETS MT_("Expander.Presets") #define TEXT_PRESETS_EXP MT_("Expander.Presets.Expander") #define TEXT_PRESETS_GATE MT_("Expander.Presets.Gate")
View file
obs-studio-29.1.1.tar.xz/plugins/obs-outputs/data/locale/en-US.ini -> obs-studio-29.1.2.tar.xz/plugins/obs-outputs/data/locale/en-US.ini
Changed
@@ -1,5 +1,8 @@ RTMPStream="RTMP Stream" RTMPStream.DropThreshold="Drop Threshold" +RTMPStream.BindIP="Bind IP" +RTMPStream.NewSocketLoop="New Socket Loop" +RTMPStream.LowLatencyMode="Low Latency Mode" FLVOutput="FLV File Output" FLVOutput.FilePath="File Path" Default="Default" @@ -12,3 +15,6 @@ NoData="Hostname found, but no data of the requested type. This can occur if you have bound to an IPv6 address and your streaming service only has IPv4 addresses (see Settings → Advanced)." AddressNotAvailable="Address not available. You may have tried to bind to an invalid IP address (see Settings → Advanced)." SSLCertVerifyFailed="The RTMP server sent an invalid SSL certificate." + +FTLStream="FTL Stream" +FTLStream.PeakBitrate="Peak Bitrate"
View file
obs-studio-29.1.1.tar.xz/plugins/obs-outputs/rtmp-stream.c -> obs-studio-29.1.2.tar.xz/plugins/obs-outputs/rtmp-stream.c
Changed
@@ -98,11 +98,6 @@ return os_atomic_load_bool(&stream->disconnected); } -static inline bool silently_reconnecting(struct rtmp_stream *stream) -{ - return os_atomic_load_bool(&stream->silent_reconnect); -} - static void rtmp_stream_destroy(void *data) { struct rtmp_stream *stream = data; @@ -262,27 +257,6 @@ return new_packet; } -static inline void peek_next_packet(struct rtmp_stream *stream, - struct encoder_packet *packet) -{ - pthread_mutex_lock(&stream->packets_mutex); - circlebuf_peek_front(&stream->packets, packet, - sizeof(struct encoder_packet)); - pthread_mutex_unlock(&stream->packets_mutex); -} - -static void reinsert_packet_at_front(struct rtmp_stream *stream, - struct encoder_packet *packet) -{ - pthread_mutex_lock(&stream->packets_mutex); - circlebuf_push_front(&stream->packets, packet, - sizeof(struct encoder_packet)); - pthread_mutex_unlock(&stream->packets_mutex); - os_sem_post(stream->send_sem); -} - -#define RTMP_PACKET_TYPE_RECONNECT 0x20 - static bool process_recv_data(struct rtmp_stream *stream, size_t size) { UNUSED_PARAMETER(size); @@ -301,9 +275,7 @@ } if (packet.m_body) { - if (packet.m_packetType == RTMP_PACKET_TYPE_RECONNECT) { - os_atomic_set_bool(&stream->silent_reconnect, true); - } + /* do processing here */ RTMPPacket_Free(&packet); } return true; @@ -635,7 +607,6 @@ } static void dbr_set_bitrate(struct rtmp_stream *stream); -static bool rtmp_stream_start(void *data); #ifdef _WIN32 #define socklen_t int @@ -687,14 +658,6 @@ } } - /* silent reconnect signal received from server, reconnect on - * next keyframe */ - if (silently_reconnecting(stream) && - packet.type == OBS_ENCODER_VIDEO && packet.keyframe) { - reinsert_packet_at_front(stream, &packet); - break; - } - if (stream->dbr_enabled) { dbr_frame.send_beg = os_gettime_ns(); dbr_frame.size = packet.size; @@ -730,8 +693,6 @@ } else if (encode_error) { info("Encoder error, disconnecting"); send_footers(stream); // Y2023 spec - } else if (silently_reconnecting(stream)) { - info("Silent reconnect signal received from server"); } else { info("User stopped the stream"); send_footers(stream); // Y2023 spec @@ -751,14 +712,6 @@ set_output_error(stream); - if (silently_reconnecting(stream)) { - /* manually close the socket to prevent librtmp from sending - * unpublish / deletestream messages when we call RTMP_Close, - * since we want to re-use this stream when we reconnect */ - RTMPSockBuf_Close(&stream->rtmp.m_sb); - stream->rtmp.m_sb.sb_socket = -1; - } - RTMP_Close(&stream->rtmp); /* reset bitrate on stop */ @@ -771,35 +724,18 @@ if (!stopping(stream)) { pthread_detach(stream->send_thread); - if (!silently_reconnecting(stream)) - obs_output_signal_stop(stream->output, - OBS_OUTPUT_DISCONNECTED); + obs_output_signal_stop(stream->output, OBS_OUTPUT_DISCONNECTED); } else if (encode_error) { obs_output_signal_stop(stream->output, OBS_OUTPUT_ENCODE_ERROR); } else { obs_output_end_data_capture(stream->output); } - if (!silently_reconnecting(stream)) { - free_packets(stream); - os_event_reset(stream->stop_event); - os_atomic_set_bool(&stream->active, false); - } - + free_packets(stream); + os_event_reset(stream->stop_event); + os_atomic_set_bool(&stream->active, false); stream->sent_headers = false; - /* reset bitrate on stop */ - if (stream->dbr_enabled) { - if (stream->dbr_cur_bitrate != stream->dbr_orig_bitrate) { - stream->dbr_cur_bitrate = stream->dbr_orig_bitrate; - dbr_set_bitrate(stream); - } - } - - if (silently_reconnecting(stream)) { - rtmp_stream_start(stream); - } - return NULL; } @@ -1020,8 +956,7 @@ int ret; obs_output_t *context = stream->output; - if (!silently_reconnecting(stream)) - reset_semaphore(stream); + reset_semaphore(stream); ret = pthread_create(&stream->send_thread, NULL, send_thread, stream); if (ret != 0) { @@ -1136,8 +1071,7 @@ return OBS_OUTPUT_DISCONNECTED; } - if (!silently_reconnecting(stream)) - obs_output_begin_data_capture(stream->output, 0); + obs_output_begin_data_capture(stream->output, 0); return OBS_OUTPUT_SUCCESS; } @@ -1219,12 +1153,6 @@ } #endif -static void add_connect_data(char **penc, char *pend) -{ - const AVal val = AVC("supportsGoAway"); - *penc = AMF_EncodeNamedBoolean(*penc, pend, &val, true); -} - static int try_connect(struct rtmp_stream *stream) { if (dstr_is_empty(&stream->path)) { @@ -1250,7 +1178,6 @@ set_rtmp_dstr(&stream->rtmp.Link.pubPasswd, &stream->password); set_rtmp_dstr(&stream->rtmp.Link.flashVer, &stream->encoder_name); stream->rtmp.Link.swfUrl = stream->rtmp.Link.tcUrl; - stream->rtmp.Link.customConnectEncode = add_connect_data; if (dstr_is_empty(&stream->bind_ip) || dstr_cmp(&stream->bind_ip, "default") == 0) { @@ -1409,17 +1336,9 @@ os_set_thread_name("rtmp-stream: connect_thread"); - if (!silently_reconnecting(stream)) { - if (!init_connect(stream)) { - obs_output_signal_stop(stream->output, - OBS_OUTPUT_BAD_PATH); - os_atomic_set_bool(&stream->silent_reconnect, false); - return NULL; - } - } else { - struct encoder_packet packet; - peek_next_packet(stream, &packet); - stream->start_dts_offset = get_ms_time(&packet, packet.dts); + if (!init_connect(stream)) { + obs_output_signal_stop(stream->output, OBS_OUTPUT_BAD_PATH); + return NULL; } // HDR streaming disabled for AV1 and HEVC
View file
obs-studio-29.1.1.tar.xz/plugins/obs-outputs/rtmp-stream.h -> obs-studio-29.1.2.tar.xz/plugins/obs-outputs/rtmp-stream.h
Changed
@@ -68,7 +68,6 @@ volatile bool active; volatile bool disconnected; volatile bool encode_error; - volatile bool silent_reconnect; pthread_t send_thread; int max_shutdown_time_sec;
View file
obs-studio-29.1.1.tar.xz/plugins/obs-qsv11/data/locale/en-US.ini -> obs-studio-29.1.2.tar.xz/plugins/obs-qsv11/data/locale/en-US.ini
Changed
@@ -13,3 +13,4 @@ 8bitUnsupportedHdr="OBS does not support 8-bit output of Rec. 2100." 10bitUnsupportedAvc="Cannot perform 10-bit encode on Intel QSV H.264 encoder." 16bitUnsupported="Cannot perform 16-bit encode on this encoder." +BFrames="B Frames"
View file
obs-studio-29.1.1.tar.xz/plugins/obs-qsv11/obs-qsv11.c -> obs-studio-29.1.2.tar.xz/plugins/obs-qsv11/obs-qsv11.c
Changed
@@ -228,7 +228,7 @@ #define TEXT_CONVERGENCE obs_module_text("Convergence") #define TEXT_ICQ_QUALITY obs_module_text("ICQQuality") #define TEXT_KEYINT_SEC obs_module_text("KeyframeIntervalSec") -#define TEXT_BFRAMES obs_module_text("B Frames") +#define TEXT_BFRAMES obs_module_text("BFrames") #define TEXT_PERCEPTUAL_ENHANCEMENTS \ obs_module_text("SubjectiveVideoEnhancements")
View file
obs-studio-29.1.1.tar.xz/plugins/win-capture/data/locale/en-US.ini -> obs-studio-29.1.2.tar.xz/plugins/win-capture/data/locale/en-US.ini
Changed
@@ -18,7 +18,6 @@ Monitor="Display" PrimaryMonitor="Primary Monitor" Method="Capture Method" -Method.Auto="Automatic" Method.DXGI="DXGI Desktop Duplication" Method.WindowsGraphicsCapture="Windows 10 (1903 and up)" GameCapture="Game Capture"
View file
obs-studio-29.1.1.tar.xz/plugins/win-dshow/data/locale/en-US.ini -> obs-studio-29.1.2.tar.xz/plugins/win-dshow/data/locale/en-US.ini
Changed
@@ -11,7 +11,6 @@ ColorRange.Default="Default" ColorRange.Partial="Limited" ColorRange.Full="Full" -ConfigureAudio="Configure Audio" ConfigureVideo="Configure Video" ConfigureCrossbar="Configure Crossbar" ResFPSType="Resolution/FPS Type"
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
.