Changes of Revision 28

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