We truncated the diff of some files because they were too big.
If you want to see the full diff for every file, click here.
Changes of Revision 28
obs-studio.changes
Changed
x
1
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
51
}
52
53
QScrollBar::handle:vertical {
54
- min-height: 20px;
55
+ min-height: 20px;
56
}
57
58
QScrollBar::handle:horizontal {
59
60
}
61
62
QSlider::add-page:vertical {
63
- background-color: palette(highlight);
64
+ background-color: palette(highlight);
65
border-radius: 2px;
66
}
67
68
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
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
152
/* Mute CheckBox */
153
154
MuteCheckBox {
155
- outline: none;
156
+ outline: none;
157
}
158
159
MuteCheckBox::indicator {
160
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
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
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
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
33
}
34
35
OBSMissingFiles {
36
- qproperty-warningIcon: url(./Dark/alert.svg);
37
+ qproperty-warningIcon: url(./Dark/alert.svg);
38
}
39
40
/* Source Icons */
41
42
43
SceneTree {
44
qproperty-gridItemWidth: 150;
45
- qproperty-gridItemHeight: 27;
46
+ qproperty-gridItemHeight: 27;
47
}
48
49
*gridMode="true" SceneTree::item {
50
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
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
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
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
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
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
51
}
52
53
QScrollBar::handle:vertical {
54
- min-height: 20px;
55
+ min-height: 20px;
56
}
57
58
QScrollBar::handle:horizontal {
59
60
}
61
62
QSlider::add-page:vertical {
63
- background-color: palette(highlight);
64
+ background-color: palette(highlight);
65
border-radius: 2px;
66
}
67
68
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
125
/* Mute CheckBox */
126
127
MuteCheckBox {
128
- outline: none;
129
+ outline: none;
130
}
131
132
MuteCheckBox::indicator {
133
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
178
}
179
180
OBSHotkeyLabelhotkeyPairHover=true {
181
- color: rgb(53,82,222);
182
+ color: rgb(53,82,222);
183
}
184
185
OBSHotkeyWidget QPushButton {
186
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
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
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
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
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
51
}
52
53
QScrollBar::handle:vertical {
54
- min-height: 20px;
55
+ min-height: 20px;
56
}
57
58
QScrollBar::handle:horizontal {
59
60
}
61
62
QSlider::add-page:vertical {
63
- background-color: palette(highlight);
64
+ background-color: palette(highlight);
65
border-radius: 2px;
66
}
67
68
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
125
/* Mute CheckBox */
126
127
MuteCheckBox {
128
- outline: none;
129
+ outline: none;
130
}
131
132
MuteCheckBox::indicator {
133
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
178
}
179
180
OBSHotkeyLabelhotkeyPairHover=true {
181
- color: rgb(53,82,222);
182
+ color: rgb(53,82,222);
183
}
184
185
OBSHotkeyWidget QPushButton {
186
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
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
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
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
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
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
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
69
}
70
71
QScrollBar::handle:vertical {
72
- min-height: 20px;
73
+ min-height: 20px;
74
}
75
76
QScrollBar::handle:horizontal {
77
78
79
QPushButtontoolButton="true":disabled,
80
QToolButton:disabled {
81
- background-color: transparent;
82
+ background-color: transparent;
83
}
84
85
QPushButtontoolButton="true":last-child,
86
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
96
}
97
98
QSlider::add-page:vertical {
99
- background-color: palette(highlight);
100
+ background-color: palette(highlight);
101
border-radius: 2px;
102
}
103
104
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
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
186
/* Mute CheckBox */
187
188
MuteCheckBox {
189
- outline: none;
190
+ outline: none;
191
}
192
193
MuteCheckBox::indicator {
194
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
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
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
27
28
SceneTree {
29
qproperty-gridItemWidth: 150;
30
- qproperty-gridItemHeight: 24;
31
+ qproperty-gridItemHeight: 24;
32
}
33
34
/* Save icon */
35
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
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
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
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
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
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
51
}
52
53
QScrollBar::handle:vertical {
54
- min-height: 20px;
55
+ min-height: 20px;
56
}
57
58
QScrollBar::handle:horizontal {
59
60
}
61
62
QSlider::add-page:vertical {
63
- background-color: palette(highlight);
64
+ background-color: palette(highlight);
65
border-radius: 2px;
66
}
67
68
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
125
/* Mute CheckBox */
126
127
MuteCheckBox {
128
- outline: none;
129
+ outline: none;
130
}
131
132
MuteCheckBox::indicator {
133
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
178
}
179
180
OBSHotkeyLabelhotkeyPairHover=true {
181
- color: rgb(53,82,222);
182
+ color: rgb(53,82,222);
183
}
184
185
OBSHotkeyWidget QPushButton {
186
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
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
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
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
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
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
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
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
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
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
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
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
2
3
disableSaving--;
4
5
- if (vcamEnabled && vcamConfig.internal == VCamInternalType::Preview)
6
+ if (vcamEnabled)
7
outputHandler->UpdateVirtualCamOutputSource();
8
9
if (api) {
10
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 = ∩︀
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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