Changes of Revision 43

obs-studio.changes Changed
x
 
1
@@ -1,4 +1,150 @@
2
 -------------------------------------------------------------------
3
+Tue Feb 28 00:38:38 UTC 2017 - jimmy@boombatower.com
4
+
5
+- Update to version 18.0.0:
6
+  * UI: Add more command line options
7
+  * obs-browser: Update submodule to latest version
8
+  * Revert "Revert "win-capture: Use FindWindowEx to traverse window list""
9
+  * CI: Add in inital appveyor config
10
+  * CI: Move browser source before building app
11
+  * CI: Build VLC plugin for OSX on travis
12
+  * rtmp-services: remove shut down services
13
+  * CI: Build Windows version and upload artifacts
14
+  * obs-browser: Update browser ref
15
+  * CI: Update permissions on CEF app plist before packaging
16
+  * cmake: Enable COPY_DEPENDENCIES by default on Windows
17
+  * rtmp-services: Update Vaughn Live ingests
18
+  * libobs: Log correct amount of memory on 32bit (windows)
19
+  * UI: Convert to wide before outputting debug text (win)
20
+  * UI: Protect debug text static string var with mutex
21
+  * libobs: Add ability to get output congestion
22
+  * obs-output: Add ability to get congestion to rtmp output
23
+  * obs-outputs: Increase default drop threshold
24
+  * UI: Add connection status square to status bar
25
+  * UI: Add separate timers to status bar
26
+  * UI: Add option to always minimize to tray
27
+  * UI: Hide/show dialogs when minimizing to tray
28
+  * UI: Do not quit program when last windows are projectors
29
+  * UI: Add option to save projectors
30
+  * UI: Add auto-start replay buf. opt. when stream starts
31
+  * UI: Fix scaling in viewport when source flipped
32
+  * UI: Fix linux display/resize bug with preview widget
33
+  * rtmp-services: Add Restream.io Los Angeles server
34
+  * libobs: Add optional ultrawide -> wide scaling techniques
35
+  * obs-filters: Add option to undistort ultrawide -> wide
36
+  * obs-filters: Add "Color Grading" filter
37
+  * rtmp-services: Add new beam.pro ingests
38
+  * CI: Add post install script to OBS installer to fix CEF permissions
39
+  * rtmp-services: Add Web.TV streaming service
40
+  * Add VST Plugin
41
+  * obs-filters: Fix compiler warnings
42
+  * UI: Remove unused variables
43
+  * UI: Clarify "Always minimize to tray" option
44
+  * obs-filters: Rename "Color Grade" filter to "LUT Filter"
45
+  * obs-filters: Change "LUT Filter" to "Apply LUT"
46
+  * CI: Fix VLC download
47
+  * CI: Unzip VLC quietly
48
+  * rtmp-services: Update twitch/hitbox ingest and youtube recommendations
49
+  * CI: Fix OSX post-install script
50
+  * UI: Fix locale text alignment
51
+  * UI: Make advanced settings pane a bit more compact
52
+  * libobs: Mark last video ts even when buffering off
53
+  * libobs: Mark parameter as constant if not modifying
54
+  * libobs: Use original audio structure for audio signal
55
+  * libobs: Implement audio monitoring
56
+  * win-wasapi: Mark audio outputs as unmonitorable
57
+  * UI: Add audio monitoring to settings/adv audio props.
58
+  * UI: Prevent thread stalls with fader/volume widgets
59
+  * obs-transitions: Convert premultiplied alpha to straight
60
+  * UI: Add 24 NTSC as a common FPS value
61
+  * obs-ffmpeg: Do not use HW accel by default on mac
62
+  * rtmp-services: Update twitch ingests
63
+  * obs-ffmpeg: Fix compiler warnings
64
+  * UI: Fix compiler warning
65
+  * UI: Change volume meter update interval to 30fps
66
+  * UI: Add warning if starting the output fails
67
+  * obs-ffmpeg: Be more verbose when custom params fail
68
+  * obs-ffmpeg: Fix custom audio codec parameters
69
+  * CI: Retry failed downloads
70
+  * UI: fix ffmpeg output file extension
71
+  * UI: Clean up general pane of settings dialog
72
+  * UI: Add function to get remote file
73
+  * UI: Add front-end auto-updater
74
+  * UI: Update installer to latest version
75
+  * UI: Add latest installer fixes from R1CH
76
+  * obs-ffmpeg: Add 'save' to replay buffer proc handler
77
+  * win-capture: Fall back to GetWindow if FindWindowEx fails
78
+  * libobs: Fix audio monitoring delaying perpetually
79
+  * rtmp-services: Update max video bitrate for beam
80
+  * libobs/util: Use a mutex with config files
81
+  * win-capture: Blacklist chrome/firefox from game capture
82
+  * win-dshow: Add LGP timestamp fix
83
+  * UI: Trigger frontend api scene change after transition
84
+  * Add AUTHORS file
85
+  * mailmap: Disambiguate between a few authors
86
+  * mailmap: Disambiguate between another author
87
+  * rtmp-services: Add "Pandora TV Korea"
88
+  * UI: Trigger scene list change event when scene removed
89
+  * CI: Speedup msbuild by using all CPU cores
90
+  * UI: Improve accessibility text on main window
91
+  * CI: Download VLC repo instead of cloning from git
92
+  * CI: Disable test discovery on AppVeyor
93
+  * CI: Cache dependencies downloads on AppVeyor
94
+  * CI: Disable deps download in AppVeyor and use cache
95
+  * CI: Download deps if they aren't in build cache
96
+  * UI: Use blake2b instead of SHA1 for updater
97
+  * UI: Make installer execute 64bit on 64bit windows
98
+  * obs-text: Fix issue drawing some chinese characters
99
+  * obs-filters: Add audio compression filter
100
+  * obs-outputs: Port windows socket loop from OBS Classic
101
+  * librtmp: Clean up our extra RTMP fields on close
102
+  * UI: Add options for new socket loop
103
+  * UI: Make sure size-specific spacers are fixed
104
+  * UI: Fix some settings layouts on non-windows systems
105
+  * win-capture: Add hook exception for theHunter: COTW
106
+  * obs-ffmpeg/ffmpeg-mux: Fix failing when no video
107
+  * image-source: Add solid color source
108
+  * image-source: Add missing locale
109
+  * Fix various null pointer issues detected by Coverity
110
+  * obs-ffmpeg: Allow saving with different video codecs
111
+  * UI: Add support for other codecs
112
+  * graphics-hook: Account for sizeof(wchar_t) in len
113
+  * obs-qsv11: Fix various issues detected by Coverity
114
+  * obs-ffmpeg: Make gop size configurable
115
+  * UI: Add gop size option for custom ffmpeg output
116
+  * libff: Add override for codec compatability check
117
+  * UI: Add codec compatability checkbox to ffmpeg output
118
+  * UI: Add warning about recording to mp4 format
119
+  * CI: Fetch git tags on OSX build
120
+  * CI: Exit on errors when building the OSX package
121
+  * UI: Fix typo in general settings
122
+  * enc-amf: Update to version 1.4.3.9
123
+  * CI: Build on Linux
124
+  * libobs: Update version to 18.0.0
125
+  * libobs: Fix bug where scenes would not properly mix audio
126
+  * UI: If scene/source names exist, start from 2
127
+  * CI: Don't skip_join for Travis IRC notifications
128
+  * obs-frontend-api: Use virtual destructor (fix memory leak)
129
+  * libobs: Add missing mutex unlock in audio monitoring
130
+  * CI: Get some codesigning and sparkle stuff in place
131
+  * CI: Use combined cert for signing OSX
132
+  * CI: Set keychain timeout & allow productsign
133
+  * CI: Add some logging to the before deploy script on OSX
134
+  * CI: Possibly fix OSX cert import issue
135
+  * CI: OSX - Brew install jack
136
+  * CI: Notify on failure and only for fixed builds
137
+  * CI: Reformat Travis CI IRC notification
138
+  * UI: Hide auto update option for linux
139
+  * obs-filters: Change attack/release ms limit to 300 (from 100)
140
+  * obs-filters: Increase max compressor release/attack values
141
+  * Update translations from Crowdin
142
+  * AUTHORS: Update with data from Git and Crowdin
143
+  * UI: Update Simple Mode AMD Presets
144
+  * enc-amf: Update to hotfix 1.4.3.10
145
+  * CI: OSX Set builds to stable on tagged builds
146
+  * CI: Update public OSX install key
147
+
148
+-------------------------------------------------------------------
149
 Wed Jan 18 14:48:26 UTC 2017 - jimmy@boombatower.com
150
 
151
 - Update to version 17.0.2:
152
obs-studio.spec Changed
8
 
1
@@ -1,5 +1,5 @@
2
 Name:           obs-studio
3
-Version:        17.0.2
4
+Version:        18.0.0
5
 Release:        0
6
 Summary:        A recording/broadcasting program
7
 
8
_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/17.0.2</param>
6
+    <param name="revision">refs/tags/18.0.0</param>
7
     <param name="url">git://github.com/jp9000/obs-studio.git</param>
8
     <param name="scm">git</param>
9
     <param name="changesgenerate">enable</param>
10
_servicedata Changed
9
 
1
@@ -1,6 +1,6 @@
2
 <servicedata>
3
   <service name="tar_scm">
4
     <param name="url">git://github.com/jp9000/obs-studio.git</param>
5
-    <param name="changesrevision">841dfade55dff65a4080dbdfd5672f3318de6f08</param>
6
+    <param name="changesrevision">5312ffa8157c4210cf57026f90eeb09e81a5a461</param>
7
   </service>
8
 </servicedata>
9
obs-studio-17.0.2.tar.xz/.mailmap -> obs-studio-18.0.0.tar.xz/.mailmap Changed
8
 
1
@@ -3,3 +3,6 @@
2
 Benjamin Klettbach <b.klettbach@gmail.com>
3
 BtbN <btbn@btbn.de>
4
 John Bradley <jrb@turrettech.com>
5
+HomeWorld <homeworld@gmail.com> hwdro <pdarvaru@yahoo.com>
6
+Michael Fabian Dirks <info@xaymar.com> <michael.dirks@xaymar.com>
7
+Martell Malone <martellmalone@gmail.com>
8
obs-studio-17.0.2.tar.xz/.travis.yml -> obs-studio-18.0.0.tar.xz/.travis.yml Changed
56
 
1
@@ -1,18 +1,29 @@
2
-os: osx
3
+language: cpp
4
+
5
 env:
6
-  matrix:
7
-  - CMAKE_PREFIX_PATH=/usr/local/opt/qt5/lib/cmake
8
   global:
9
   # AWS S3 creds
10
   # access key
11
   - secure: "MfhOg+84yb4ZHB2tM8PIPFQX2Y+WLN0I0iiAgyLC4KaHPUoNOyloe9yk6OjV7Lj7SZWqTlQUsqHa8S9mOUswGIody1Ydglo4RvyGOKCd8I6b2ri/jE8qHVuD9sO+sNlIxq4YqqG/qReTsbSs2YEgLneZUCYLCk/fihl8L6eVuSc="
12
   # secret
13
   - secure: "JRQVU2zgC3hY6CEY+Crmh/upp93En0BzKaLcsuBT538johNlK7m5hn3m2UOw63seLvBvVaKKWUDj9N986a3DwcXxWPMyF/9ctXgNWy39WzaVWxrbVR5nQB1fdiRp5YEgkoVN+gEm3OVF7sV5AGzh5/8CvEdRCoTLIGgMGHxW9mc="
14
-language: cpp
15
-before_install: "./CI/install-dependencies-osx.sh"
16
-before_script: "./CI/before-script-osx.sh"
17
+
18
+matrix:
19
+  include:
20
+    - os: osx
21
+      env: CMAKE_PREFIX_PATH=/usr/local/opt/qt5/lib/cmake
22
+      before_install: "./CI/install-dependencies-osx.sh"
23
+      before_script: "./CI/before-script-osx.sh"
24
+      before_deploy: "./CI/before-deploy-osx.sh"
25
+
26
+    - os: linux
27
+      dist: trusty
28
+      sudo: required
29
+      before_install: "./CI/install-dependencies-linux.sh"
30
+      before_script: "./CI/before-script-linux.sh"
31
+
32
 script: cd ./build && make -j4 && cd -
33
-before_deploy: "./CI/before-deploy-osx.sh"
34
+
35
 deploy:
36
   provider: s3
37
   access_key_id: $AWS_ACCESS_KEY
38
@@ -24,12 +35,15 @@
39
   acl: public_read
40
   on:
41
     repo: jp9000/obs-studio
42
+    condition: "$TRAVIS_OS_NAME = osx"
43
 
44
 # The channel name "azubu.il.us.quakenet.org#obs-dev" is encrypted against jp9000/obs-studio to prevent IRC spam of forks
45
 notifications:
46
   irc:
47
-    skip_join: true
48
+    skip_join: false
49
     template:
50
-      - "%{message} %{build_url}"
51
+      - "[Travis CI|%{result}] %{repository_name}/%{branch} (%{author} - %{commit_subject}) %{build_url}"
52
     channels:
53
       - secure: k9j7+ogVODMlveZdd5pP73AVLCFl1VbzVaVon0ECn3EQcxnLSpiZbc6l+PnIUKgee5pRKtUB4breufgmr4puq3s69YeQiOVKk5gx2yJGZ5jGacbSne0xTspzPxapiEbVUkcJ2L7gKntDG4+SUiW67dtt4G26O7zsErDF/lY/woQ=
54
+    on_failure: always
55
+    on_success: change
56
obs-studio-18.0.0.tar.xz/AUTHORS Added
201
 
1
@@ -0,0 +1,472 @@
2
+Contributors are sorted by their amount of commits / validated strings.
3
+
4
+Contributors:
5
+Jim
6
+Palana
7
+fryshorts
8
+BtbN
9
+John Bradley
10
+Gol-D-Ace
11
+Zachary Lund
12
+Richard Stanway
13
+Colin Edwards
14
+Michael Fabian Dirks
15
+Martell Malone
16
+Christoph Hohmann
17
+HomeWorld
18
+dodgepong
19
+cg2121
20
+derrod
21
+Ryan Foster
22
+Radzaquiel
23
+Socapex
24
+Skyler Lipthay
25
+SuslikV
26
+Arkkis
27
+Cephas Reis
28
+GoaLitiuM
29
+Danni
30
+Jess Mayo
31
+Kris Moore
32
+Carl Fürstenberg
33
+juvester
34
+Anry
35
+CoDEmanX
36
+Ján Mlynek
37
+Manuel Kroeber
38
+sorayuki
39
+Alexandre Vicenzi
40
+Benjamin Klettbach
41
+bl
42
+Bl00drav3n
43
+Blackhive
44
+Charles Ray Shisler III
45
+Jeremiah Senkpiel
46
+John R. Bradley
47
+Kilian von Pflugk
48
+Serge Paquet
49
+shiina424
50
+shousa
51
+Timo Gurr
52
+adray
53
+Andrei Nistor
54
+Andrew Surzhynskyi
55
+Azat Khasanshin
56
+Ben Torell
57
+bootkiller
58
+Brian S. Stephan
59
+Eric Bataille
60
+Joseph El-Khouri
61
+jpk
62
+Kurt Kartaltepe
63
+Lexsus
64
+Lionheart Zhang
65
+paibox
66
+Robin Hielscher
67
+skwerlman
68
+taesheren
69
+Take Vos
70
+Taylor Blau
71
+Warren Turkal
72
+yogpstop
73
+Aarni Koskela
74
+Aesen Vismea
75
+Akagi201
76
+Alexander Uhlmann
77
+Alexandre Biny
78
+Andreas Reischuck
79
+Anthony Catel
80
+Anthony Super
81
+Asgeir Mortensen
82
+Autumin
83
+Aydin Akan
84
+Bernd Buschinski
85
+bla
86
+boombatower
87
+Caitlin Potter
88
+Caleb Anderson
89
+CallumHoward
90
+Cam
91
+CommanderRoot
92
+Copy Liu
93
+cryptonaut
94
+Dan Dascalescu
95
+David Cooper
96
+David McMackins II
97
+dennis
98
+Derrick Lambert
99
+Emil Sayahi
100
+EpicCoder
101
+Ethan Lee
102
+Frank Gehann
103
+Giorgio Pellero
104
+Grigorii Chirkov
105
+Guillermo A. Amaral
106
+Gökberk Yaltıraklı
107
+Haden F
108
+Iblis Lin
109
+Jake Probst
110
+Jamy Timmermans
111
+Jimmy Berry
112
+Jkoan
113
+Joel Bethke
114
+Julian Miller
115
+Kazuki Oishi
116
+ka’imi
117
+Kevin
118
+Kevin Tardif
119
+Lasse Dalegaard
120
+lemmi
121
+Lioncash
122
+Lucian Poston
123
+Lukas Monka
124
+Luke Yelavich
125
+mape
126
+Marc Chambers
127
+Mark Vaughn
128
+Mathias Panzenböck
129
+Matthew McNamara
130
+MedicMomcilo
131
+michael bishop
132
+Michael Hoang
133
+Momcilo Medic
134
+nd
135
+Nicolas F
136
+Night
137
+Olle Kelderman
138
+pantonvich
139
+partouf
140
+Peter SZTANOJEV
141
+pipll
142
+raincomplex
143
+repeat
144
+Ricardo Constantino
145
+Rodrigo Ipince
146
+rpslack
147
+Ryan Sullivan
148
+sam8641
149
+Seth Murphy
150
+Seung-Woo Kim
151
+Simon
152
+Teemu Kauhanen
153
+thekrzos
154
+Thomas McGrew
155
+TotalCaesar659
156
+vic
157
+vividnightmare
158
+wayne wang
159
+Weikardzaena
160
+Will Jamieson
161
+William Casarin
162
+Younes SERRAJ
163
+Ziemas
164
+
165
+Translations:
166
+Arabic
167
+    Abdullah AL-Qahtani (Za7ef_SA)
168
+    majdcomp
169
+    ZILZAL
170
+    BWU Wheelman (Wheelman)
171
+    Saleh Luxmaroc (salehoukiki)
172
+    Gol D. Ace (goldace)
173
+    معتصم دعنا (rozana-media)
174
+    chaironeko
175
+    dodgepong
176
+    FC Barcelona HD (kurdnews)
177
+Basque
178
+    Alexander Gabilondo (alexgabi)
179
+    Xabier Aramendi (azpidatziak)
180
+    Osoitz
181
+    txaro
182
+    etxondoko
183
+    Gol D. Ace (goldace)
184
+    dodgepong
185
+Bulgarian
186
+    kalmarin
187
+    Seyhan Halil (yildirim17)
188
+    Viktor Kitov (viktorkitov)
189
+    Stanislav_Evtimov
190
+    Ivan (SKDown)
191
+Catalan
192
+    Jaime Muñoz Martín (jmmartin_5)
193
+    jmontane
194
+    Nil Campamà (Soifam)
195
+    Aleix Vidal i Gaya (leixet)
196
+    Gol D. Ace (goldace)
197
+Chinese Simplified
198
+    Bob Liu (Akagi201)
199
+    PabloLiu (719018105)
200
+    Sasasu
201
obs-studio-17.0.2.tar.xz/CI/before-deploy-osx.sh -> obs-studio-18.0.0.tar.xz/CI/before-deploy-osx.sh Changed
61
 
1
@@ -1,10 +1,56 @@
2
+hr() {
3
+  echo "───────────────────────────────────────────────────"
4
+  echo $1
5
+  echo "───────────────────────────────────────────────────"
6
+}
7
+
8
+# Exit if something fails
9
+set -e
10
+
11
+# Generate file name variables
12
 export GIT_HASH=$(git rev-parse --short HEAD)
13
 export FILE_DATE=$(date +%Y-%m-%d.%H:%M:%S)
14
 export FILENAME=$FILE_DATE-$GIT_HASH-osx.pkg
15
-mkdir nightly
16
+
17
 cd ./build
18
-sudo python ../CI/install/osx/build_app.py
19
+
20
+# Move the CEF plugin out before running build_app so that it doesn't get packaged twice
21
+hr "Moving CEF out to preserve linking"
22
+mv ./rundir/RelWithDebInfo/obs-plugins/CEF.app ./
23
+mv ./rundir/RelWithDebInfo/obs-plugins/obs-browser.so ./
24
+
25
+# Package everything into a nice .app
26
+hr "Packaging .app"
27
+STABLE=False
28
+if [ -n "${TRAVIS_TAG}" ]; then
29
+  STABLE=TRUE
30
+fi
31
+
32
+sudo python ../CI/install/osx/build_app.py --public-key ../CI/install/osx/OBSPublicDSAKey.pem --sparkle-framework ../../sparkle/Sparkle.framework --base-url "https://obsproject.com/osx_update" --stable $STABLE
33
+
34
+# Move the CEF plugin back to where it belongs
35
+hr "Moving CEF back"
36
+mv ./CEF.app ./rundir/RelWithDebInfo/obs-plugins/
37
+mv ./obs-browser.so ./rundir/RelWithDebInfo/obs-plugins/
38
+
39
+# Package app
40
+hr "Generating .pkg"
41
 packagesbuild ../CI/install/osx/CMakeLists.pkgproj
42
 
43
-sudo cp OBS.pkg ./$FILENAME
44
+# Signing stuff
45
+hr "Decrypting Cert"
46
+openssl aes-256-cbc -K $encrypted_dd3c7f5e9db9_key -iv $encrypted_dd3c7f5e9db9_iv -in ../CI/osxcert/Certificates.p12.enc -out Certificates.p12 -d
47
+hr "Creating Keychain"
48
+security create-keychain -p mysecretpassword build.keychain
49
+security default-keychain -s build.keychain
50
+security unlock-keychain -p mysecretpassword build.keychain
51
+security set-keychain-settings -t 3600 -u build.keychain
52
+hr "Importing certs into keychain"
53
+security import ./Certificates.p12 -k build.keychain -T /usr/bin/productsign -P ""
54
+hr "Signing Package"
55
+productsign --sign 'Developer ID Installer: Hugh Bailey (2MMRE5MTB8)' ./OBS.pkg ./$FILENAME
56
+
57
+# Move to the folder that travis uses to upload artifacts from
58
+hr "Moving package to nightly folder for distribution"
59
+mkdir ../nightly
60
 sudo mv ./$FILENAME ../nightly
61
obs-studio-18.0.0.tar.xz/CI/before-deploy-win.cmd Added
6
 
1
@@ -0,0 +1,3 @@
2
+xcopy /e C:\projects\obs-studio\build32\rundir\RelWithDebInfo C:\projects\obs-studio\build\
3
+robocopy C:\projects\obs-studio\build64\rundir\RelWithDebInfo C:\projects\obs-studio\build\ /E /XC /XN /XO
4
+7z a build.zip C:\projects\obs-studio\build\*
5
\ No newline at end of file
6
obs-studio-18.0.0.tar.xz/CI/before-script-linux.sh Added
7
 
1
@@ -0,0 +1,5 @@
2
+#!/bin/sh
3
+set -ex
4
+
5
+mkdir build && cd build
6
+cmake ..
7
obs-studio-17.0.2.tar.xz/CI/before-script-osx.sh -> obs-studio-18.0.0.tar.xz/CI/before-script-osx.sh Changed
8
 
1
@@ -1,3 +1,3 @@
2
 mkdir build
3
 cd build
4
-cmake -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 -DDepsPath=/tmp/obsdeps -DBUILD_BROWSER=ON -DCEF_ROOT_DIR=$PWD/../../cef_binary_3.2883.1540.gedbfb20_macosx64 ..
5
\ No newline at end of file
6
+cmake -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 -DDepsPath=/tmp/obsdeps -DVLCPath=$PWD/../../vlc-master -DBUILD_BROWSER=ON -DCEF_ROOT_DIR=$PWD/../../cef_binary_3.2883.1540.gedbfb20_macosx64 ..
7
\ No newline at end of file
8
obs-studio-18.0.0.tar.xz/CI/install-dependencies-linux.sh Added
39
 
1
@@ -0,0 +1,37 @@
2
+#!/bin/sh
3
+set -ex
4
+
5
+sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next -y
6
+sudo apt-get -qq update
7
+sudo apt-get install -y \
8
+        build-essential \
9
+        checkinstall \
10
+        cmake \
11
+        libasound2-dev \
12
+        libavcodec-ffmpeg-dev \
13
+        libavdevice-ffmpeg-dev \
14
+        libavfilter-ffmpeg-dev \
15
+        libavformat-ffmpeg-dev \
16
+        libavutil-ffmpeg-dev \
17
+        libcurl4-openssl-dev \
18
+        libfontconfig-dev \
19
+        libfreetype6-dev \
20
+        libgl1-mesa-dev \
21
+        libjack-jackd2-dev \
22
+        libjansson-dev \
23
+        libpulse-dev \
24
+        libqt5x11extras5-dev \
25
+        libspeexdsp-dev \
26
+        libswresample-ffmpeg-dev \
27
+        libswscale-ffmpeg-dev \
28
+        libudev-dev \
29
+        libv4l-dev \
30
+        libvlc-dev \
31
+        libx11-dev \
32
+        libx264-dev \
33
+        libxcb-shm0-dev \
34
+        libxcb-xinerama0-dev \
35
+        libxcomposite-dev \
36
+        libxinerama-dev \
37
+        pkg-config \
38
+        qtbase5-dev
39
obs-studio-17.0.2.tar.xz/CI/install-dependencies-osx.sh -> obs-studio-18.0.0.tar.xz/CI/install-dependencies-osx.sh Changed
43
 
1
@@ -1,17 +1,36 @@
2
-curl -L -O https://s3-us-west-2.amazonaws.com/obs-nightly/Packages.pkg
3
+# Exit if something fails
4
+set -e
5
+
6
+git fetch --tags
7
+
8
+# Leave obs-studio folder
9
+cd ../
10
+
11
+# Install Packages app so we can build a package later
12
+# http://s.sudre.free.fr/Software/Packages/about.html
13
+curl -L -O https://s3-us-west-2.amazonaws.com/obs-nightly/Packages.pkg -f --retry 5 -C -
14
 sudo installer -pkg ./Packages.pkg -target /
15
 
16
 brew update
17
 
18
 #Base OBS Deps
19
-brew install qt5
20
+brew install qt5 jack
21
 
22
-curl -L -O https://s3-us-west-2.amazonaws.com/obs-nightly/osx-deps.tar.gz
23
+# Fetch and untar prebuilt OBS deps that are compatible with older versions of OSX
24
+curl -L -O https://s3-us-west-2.amazonaws.com/obs-nightly/osx-deps.tar.gz -f --retry 5 -C -
25
 tar -xf ./osx-deps.tar.gz -C /tmp
26
 
27
+# Fetch vlc codebase
28
+curl -L -o vlc-master.zip https://github.com/videolan/vlc/archive/master.zip -f --retry 5 -C -
29
+unzip -q ./vlc-master.zip
30
+
31
+# Get sparkle
32
+curl -L -o ./sparkle.tar.bz2 https://github.com/sparkle-project/Sparkle/releases/download/1.16.0/Sparkle-1.16.0.tar.bz2
33
+mkdir ./sparkle
34
+tar -xf ./sparkle.tar.bz2 -C ./sparkle
35
+
36
 # CEF Stuff
37
-cd ../
38
-curl -kLO http://opensource.spotify.com/cefbuilds/cef_binary_3.2883.1540.gedbfb20_macosx64.tar.bz2
39
+curl -kLO http://opensource.spotify.com/cefbuilds/cef_binary_3.2883.1540.gedbfb20_macosx64.tar.bz2 -f --retry 5 -C -
40
 tar -xf ./cef_binary_3.2883.1540.gedbfb20_macosx64.tar.bz2
41
 cd ./cef_binary_3.2883.1540.gedbfb20_macosx64
42
 mkdir build
43
obs-studio-17.0.2.tar.xz/CI/install/osx/CMakeLists.pkgproj -> obs-studio-18.0.0.tar.xz/CI/install/osx/CMakeLists.pkgproj Changed
24
 
1
@@ -573,7 +573,12 @@
2
            <key>PACKAGE_SCRIPTS</key>
3
            <dict>
4
                <key>POSTINSTALL_PATH</key>
5
-               <dict/>
6
+               <dict>
7
+                   <key>PATH</key>
8
+                   <string>post-install.sh</string>
9
+                   <key>PATH_TYPE</key>
10
+                   <integer>3</integer>
11
+               </dict>
12
                <key>PREINSTALL_PATH</key>
13
                <dict/>
14
                <key>RESOURCES</key>
15
@@ -632,7 +637,7 @@
16
            ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KPHRp
17
            dGxlPjwvdGl0bGU+CjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29u
18
            dGVudD0iQ29jb2EgSFRNTCBXcml0ZXIiPgo8bWV0YSBuYW1lPSJD
19
-           b2NvYVZlcnNpb24iIGNvbnRlbnQ9IjE1MDQuNzYiPgo8c3R5bGUg
20
+           b2NvYVZlcnNpb24iIGNvbnRlbnQ9IjE1MDQuODEiPgo8c3R5bGUg
21
            dHlwZT0idGV4dC9jc3MiPgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5
22
            Pgo8L2JvZHk+CjwvaHRtbD4K
23
            </data>
24
obs-studio-17.0.2.tar.xz/CI/install/osx/OBSPublicDSAKey.pem -> obs-studio-18.0.0.tar.xz/CI/install/osx/OBSPublicDSAKey.pem Changed
72
 
1
@@ -1,36 +1,36 @@
2
 -----BEGIN PUBLIC KEY-----
3
-MIIGSDCCBDoGByqGSM44BAEwggQtAoICAQDDTtoCl3zVYY4jq2ZvJhY+jZB23BdR
4
-k+oTQH0lIUuIBjJR+S8NZqylr4SIGF2S76sCDdpK5P7Waj1y5WyBIJQDCPA7UI1T
5
-P8UeZgxLazl+oVPnDhUeiEWCNkZIcn746/pPgdoG5KNjb6CUNQ8X+zkUzq6LJ7w9
6
-Sn02g1FPf0HUlR0D9bx8KweetAZrBGYNP2Mv0RvUSE3TS+t1zJadOp7GsMcoRBxD
7
-XnJXirBiTjGu3pUZ5bJSLEw+Jm46DdEj0f+SSMpPjgRAG3Pn8ac7U+CVonGHEIRB
8
-4+yjHTqF9aPtsABIbAeSh63U54yYcmYuF/ioxTNjXXsNGNm5ZAeGq1/o0iT2eesu
9
-nC6yUYggWSBVZEdTD4uI9iYsYnpjbp+fAUoD53MxTRgKqdOESdtZTJ0HSUqTjngH
10
-kwzpvxN7WmCpxISzAjs5bknu90DcdP2R4KrJfiJJzAMFp0hmwuy4OaUX0+BWZzvW
11
-KxCbHsvJL2asHkX4kQpoGVnYmEglH0vOLuK3iJi96jDcGBDGGPO0OXgu6P00iALT
12
-JF1KylJNnyH0K1a7EbS1QJlF50+zW+okc5Da1iy4vktTP7gPxBHZWeFHPMRZOp1H
13
-CZeP6Lipf9NpE5dqzMuHLFmxWeKn/7CQ2T9LyeTIajbeGqRsoSII3qEgQd/nDM3k
14
-NYt6e7dKx6rk6QIhAJ8/wlS8dyJEnvMwVRqn5ER05q7NuHocmGGiX2V/ONLnAoIC
15
-AQCTFu8RESwHSQ4uR3O0CjlvQKwqEM3Vlv+nyEqYvfqJNAfxrncpV0TF05GvUV7M
16
-e31solt3eK31qjK1H3AMaD8ToCinSYMLaoyMt0AfGljGK5cNZKXn/xFVM4mq71id
17
-RzrIfmL2327+kH7wC/8sk7R3FB/mxPV1fRhKuBqG+Y6x9NX7vz57JnIio20OQKCE
18
-Sn7a18QWHgmt+e+n9R6x7JiVOj+ZTwuPPXpomNB6nPVnQftf3lwB7ug1wJyBxAqy
19
-NkIhzkAk4RDn4NzhP70ULD80GdS36swCIOg08uTSsYA6FMgrD6JLpmKC4Uha8vPM
20
-421qxX8Si/Dk3r4one6NUr2WD0sy754MKOCZ5aD8XUB2ylLzfvdSEaGo+G/IyPtC
21
-o71PMnIStEPXH6GkvzxJv17zvhqQcyKBciqxR7GCQhbwMimp96EPIA3/2UDXQ9UE
22
-O+/JulJKVEuu4HhWLW8+s+qKhyTyP1dRd0qzLoLj81JA3FcotB1Lncas8mtv+eET
23
-Z1tKuDy8f4esOh0fuGNrDiMnm3y+cnsa41k4XLDLPrqGbJHxiRTlGwCMLxLEMcFa
24
-0gjYU3UFFiEvNG0vFWr4h57taLBoyKoyBON+Cmn5hsrKs1J1kTBTc1EvDF5mXjoX
25
-RhlrPxd/6b5aa12d3xIYofcp70RyPBM1AZ7jfWeSgKhN6AOCAgYAAoICAQClbOeZ
26
-cnCCsOaZyXp7aiZmDmJ4dtvCRXc+uD+VzRHlg/8X3BYQ01KUMc5/m+fFT7x8w12w
27
-FEN/txOxTB+NzQBlnRFHWjBOioxHWqAnYLuADP4nZM+1bwaMUBCRUX0MHZbaMMSR
28
-/dBa45Y9quc4JTV8rpfIzXdw1NZjDmnKYwKQxQ6eD/WymJFNpWKkaniMda0HQVCU
29
-eBEEpLjW4UE1YUFQgKuIKUdZ1eBxeXHgX6uDpU53reK8gC5ry8xZXryJlcqhKyQ8
30
-TrDarZgmxhzAvAwPbtCutiOpPaVpCQCdgi4PgA3sAgmdGENXDqTxcSCbCcmCYMzl
31
-pJLh+giO74OwZMqWvHwHPY5wgZbx9Tnw4JS+gsjl3K3XUeY1+J6cgrFCK/9iaRUx
32
-7lBroEgQoi+O+yM9ikPeGZYKwgobWslmNuMdYvbZl+hQF+eo7dgnABl+WHLkHogv
33
-O0wfbENlYECAHXJ/ncyRWoiyd3d/HrZBwMfMFv0hv9JdQ1EjVePXGh9+cDxO0W+Y
34
-ZJhXsXEmQ82+Pg9cCVywLKdbNWi4qPgwYEKKagq4ack6JHCcwbLMmNTz/PaDZpfP
35
-wCCxYzVxKksGnV2tb2quAW1/GB+H9FcPSHvE1MMsPhRwAGAm4+aKuL1IvrvLh8fj
36
-0tZk6dhMjtrBOkZMfnBbSKDKQlcHvXM25yIjgA==
37
+MIIGPDCCBC4GByqGSM44BAEwggQhAoICAQCZZZ2y7H2GJmMfP4KQihJTJOoiGNUw
38
+mue6sqMbH+utRykRnSKBZux6R665eRFMpNgrgFO1TLLGbdD2U31KiGtCvFJOmOl3
39
++QP055BuXjEG36NU7AWEFLAlbDlr/2D3oumq3Ib3iMnnr9RrVztJ2VFOvVio1eWr
40
+ZxboVwKPK8D6BqsWiv15vbYlJnTC4Fls6ySmdjVBxwoPlTaMu1ysi5DfbIZ93s5u
41
+aQt1FvXuWtPBWjyVUORcNbcWf49E5R2pV0OSBK95Hw2/wXz4vmj+w92dTePGnVaW
42
+Me4CoF5PIeZILwp6DCLStX4eW2WG1NChJTC8zeQ/3bMMoGyKM/MadyvrDqMywsKY
43
+caxkIwHrDKOEdXXGo80dIwZMMLipPA8DKhx5ojphfkeXjIhKSx+49knXT3ED5okE
44
+Wai7tGUXj/8D8sGh+7b+AVsdujvr4v8WQaZiKUOZ2IIHOg3VLz9T9v0zet1Yt987
45
+KNymFcp2CHeJ6KnDP/ZGQ6Nl0HsPxUgscsXV+R2FEc8Q1j0Ukkuxnopa0E4/huUu
46
+gjyRzpXD734qFMDf7LcXca6qNjBor6gVj5sRyRKCpZ+KQfMUlr8jp506ztYSyeJu
47
+dxJV30tQgztwkbrs02CqOt4Z3Peo6sdht7hWKSPVwmja3tq8/TfUSSoo6wKYN9/w
48
+Mf3dVeRF8hCzJQIVAJnzuzmzQhCKPiQnl3jh5qGII2XfAoICAQCCVATAff89ceHj
49
+ROHEbHTQFpVxJ/kRZPfxnU46DSw79Tih7tthV68oakPSOTP3cx/Tga0GwogarZ9N
50
+F2VVan5w9OQSSewXsr5UDT5bnmJF+h+JB7TMy+sXZBYobUqjlUd5VtKc8RsN86P4
51
+s7xbK0mA+hfe+27r18JT81/eH3xUfh7UOUGSdMN2Ch9f7RFSMZIgUAZUzu2K3ODp
52
+hPgtc2QJ8QVAp7GLvQgw8ZUME/ChZslyBIyJvYgUIxfxlgRWYro5pQT7/ngkgdXo
53
+wlghHKkldwMuY3zaFdhPnFNuEUEtc18ILsbz0+AnagCUd6n+3safskCRqLIHMOY6
54
+iLBSZPX9hJQhVCqSqz1VNDDww8FNa/fojJ1Lr/TI0I+0Ib2pCiY2LChXUqGY5SLZ
55
+2KNs5qFsyZP+I0L8YsGwqvUYyFwk7Ok224n0NtaOwqpLCrtXd/i6DaDNiaoJuwJC
56
+1ELCfaZivorgkC5rhBt2H7qWUAR+EtrFE/gb0k/G5EIhjYql7onGbX+G2re38vQA
57
+fg1pzguhig2dafP/BxMLZrn1Gg61xzmEYPuS9gclktaf675srv8GVb46VkOxXL+D
58
+YvTmpJPP7UUOVlmAMCo4j4y09MW3jq9TDp42VTLeZVubyjslGnavlnq1O+ZyXUye
59
+1FMeby65sIbSHHHwoFnRv3hLSEXI5gOCAgYAAoICAQCUkYnZkPfHfOJZI403xUYP
60
+CE/bLpkza074Xo6EXElsWRnpQgNTx+JFOvItgj3v0OkIqDin9UredKOwfkiftslV
61
+jxUVKA6I5kwnGvCpvTpQMLyLjq+VQr+J2D6eId6tV/iajhdu5r4JThU8KllT7Ywb
62
+NAur34ftLNCVAMRUaDNeEoHfePgderW384e+lbvpmtifmBluammGSxxRtUsdjvJZ
63
+BFkhaJu86CKxcU7D1lbPVOtV/jaxz6d16VdGcfBdi2LzXZzZtYpT9XGPX3NF+xii
64
+spAURWsoe11LTRXF+eJhgCm5iIDN3kh1HEQKYKAVpmrcM0aFzk/NpS+tFyU72vaq
65
+IRSSJw/aa1oELOAakG5oPldc4RcYWl32sbnVwXHO7TZvgTrBSC10o65MAC5CHP/s
66
+b07heDYAIt7re7szvOYq+c/9zAMAlu3pcO8MqaXYMmybdHBXHQ2b+DdJWHmIUWcX
67
+CbUzr09vzGkJAvqsXqbmJPr8aixrO75DhT0iDTILLWe/GWK51nf+Tg0pNxVgGyAl
68
+BqvRqqo7SSDu9FMkwQesFFHhuoHLyEHwVPJ+sMQTNwQcm9c6YuW8EYDRSkeKLWYk
69
+3fkjG+Pe9uVE8a1taDg3FjSY0UqjUT6XMw+i0Lajyus2L6wFBwrrGM6E4xa6x1CC
70
+MGjmuSOlPA1umQsToIcO4g==
71
 -----END PUBLIC KEY-----
72
obs-studio-18.0.0.tar.xz/CI/install/osx/post-install.sh Added
7
 
1
@@ -0,0 +1,5 @@
2
+#!/usr/bin/env bash
3
+
4
+# Fix permissions on CEF
5
+chmod 744 "/Library/Application Support/obs-studio/plugins/obs-browser/bin/CEF.app/Contents/Info.plist"
6
+chmod 744 "/Library/Application Support/obs-studio/plugins/obs-browser/bin/CEF.app/Contents/Frameworks/CEF Helper.app/Contents/Info.plist"
7
obs-studio-18.0.0.tar.xz/CI/osxcert Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/CI/osxcert/Certificates.p12.enc Added
obs-studio-17.0.2.tar.xz/UI/CMakeLists.txt -> obs-studio-18.0.0.tar.xz/UI/CMakeLists.txt Changed
54
 
1
@@ -14,6 +14,8 @@
2
 
3
 project(obs)
4
 
5
+set(ENABLE_WIN_UPDATER FALSE CACHE BOOL "Enable the windows updater")
6
+
7
 if(DEFINED QTDIR${_lib_suffix})
8
    list(APPEND CMAKE_PREFIX_PATH "${QTDIR${_lib_suffix}}")
9
 elseif(DEFINED QTDIR)
10
@@ -52,9 +54,27 @@
11
 add_definitions(${LIBCURL_DEFINITIONS})
12
 
13
 if(WIN32)
14
+   include_directories(${OBS_JANSSON_INCLUDE_DIRS})
15
+   include_directories(${BLAKE2_INCLUDE_DIR})
16
+
17
    set(obs_PLATFORM_SOURCES
18
        platform-windows.cpp
19
+       win-update/update-window.cpp
20
+       win-update/win-update.cpp
21
+       win-update/win-update-helpers.cpp
22
        obs.rc)
23
+   set(obs_PLATFORM_HEADERS
24
+       win-update/update-window.hpp
25
+       win-update/win-update.hpp
26
+       win-update/win-update-helpers.hpp)
27
+   set(obs_PLATFORM_LIBRARIES
28
+       crypt32
29
+       blake2
30
+       ${OBS_JANSSON_IMPORT})
31
+
32
+   if(ENABLE_WIN_UPDATER)
33
+       add_definitions(-DENABLE_WIN_UPDATER)
34
+   endif()
35
 elseif(APPLE)
36
    set(obs_PLATFORM_SOURCES
37
        platform-osx.mm)
38
@@ -132,6 +152,7 @@
39
    qt-wrappers.cpp)
40
 
41
 set(obs_HEADERS
42
+   ${obs_PLATFORM_HEADERS}
43
    obs-app.hpp
44
    platform.hpp
45
    window-main.hpp
46
@@ -184,6 +205,7 @@
47
    forms/OBSBasicSettings.ui
48
    forms/OBSBasicSourceSelect.ui
49
    forms/OBSBasicInteraction.ui
50
+   forms/OBSUpdate.ui
51
    forms/OBSRemux.ui)
52
 
53
 set(obs_QRC
54
obs-studio-17.0.2.tar.xz/UI/adv-audio-control.cpp -> obs-studio-18.0.0.tar.xz/UI/adv-audio-control.cpp Changed
100
 
1
@@ -2,9 +2,11 @@
2
 #include <QGridLayout>
3
 #include <QLabel>
4
 #include <QSpinBox>
5
+#include <QComboBox>
6
 #include <QCheckBox>
7
 #include <QSlider>
8
 #include "qt-wrappers.hpp"
9
+#include "obs-app.hpp"
10
 #include "adv-audio-control.hpp"
11
 
12
 #ifndef NSEC_PER_MSEC
13
@@ -30,6 +32,9 @@
14
    volume                         = new QSpinBox();
15
    forceMono                      = new QCheckBox();
16
    panning                        = new QSlider(Qt::Horizontal);
17
+#if defined(_WIN32) || defined(__APPLE__)
18
+   monitoringType                 = new QComboBox();
19
+#endif
20
    syncOffset                     = new QSpinBox();
21
    mixer1                         = new QCheckBox();
22
    mixer2                         = new QCheckBox();
23
@@ -87,6 +92,19 @@
24
    syncOffset->setMaximum(20000);
25
    syncOffset->setValue(int(cur_sync / NSEC_PER_MSEC));
26
 
27
+   int idx;
28
+#if defined(_WIN32) || defined(__APPLE__)
29
+   monitoringType->addItem(QTStr("Basic.AdvAudio.Monitoring.None"),
30
+           (int)OBS_MONITORING_TYPE_NONE);
31
+   monitoringType->addItem(QTStr("Basic.AdvAudio.Monitoring.MonitorOnly"),
32
+           (int)OBS_MONITORING_TYPE_MONITOR_ONLY);
33
+   monitoringType->addItem(QTStr("Basic.AdvAudio.Monitoring.Both"),
34
+           (int)OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT);
35
+   int mt = (int)obs_source_get_monitoring_type(source);
36
+   idx = monitoringType->findData(mt);
37
+   monitoringType->setCurrentIndex(idx);
38
+#endif
39
+
40
    mixer1->setText("1");
41
    mixer1->setChecked(mixers & (1<<0));
42
    mixer2->setText("2");
43
@@ -120,6 +138,10 @@
44
            this, SLOT(panningChanged(int)));
45
    QWidget::connect(syncOffset, SIGNAL(valueChanged(int)),
46
            this, SLOT(syncOffsetChanged(int)));
47
+#if defined(_WIN32) || defined(__APPLE__)
48
+   QWidget::connect(monitoringType, SIGNAL(currentIndexChanged(int)),
49
+           this, SLOT(monitoringTypeChanged(int)));
50
+#endif
51
    QWidget::connect(mixer1, SIGNAL(clicked(bool)),
52
            this, SLOT(mixer1Changed(bool)));
53
    QWidget::connect(mixer2, SIGNAL(clicked(bool)),
54
@@ -135,12 +157,16 @@
55
 
56
    int lastRow = layout->rowCount();
57
 
58
-   layout->addWidget(nameLabel, lastRow, 0);
59
-   layout->addWidget(volume, lastRow, 1);
60
-   layout->addWidget(forceMonoContainer, lastRow, 2);
61
-   layout->addWidget(panningContainer, lastRow, 3);
62
-   layout->addWidget(syncOffset, lastRow, 4);
63
-   layout->addWidget(mixerContainer, lastRow, 5);
64
+   idx = 0;
65
+   layout->addWidget(nameLabel, lastRow, idx++);
66
+   layout->addWidget(volume, lastRow, idx++);
67
+   layout->addWidget(forceMonoContainer, lastRow, idx++);
68
+   layout->addWidget(panningContainer, lastRow, idx++);
69
+   layout->addWidget(syncOffset, lastRow, idx++);
70
+#if defined(_WIN32) || defined(__APPLE__)
71
+   layout->addWidget(monitoringType, lastRow, idx++);
72
+#endif
73
+   layout->addWidget(mixerContainer, lastRow, idx++);
74
    layout->layout()->setAlignment(mixerContainer,
75
            Qt::AlignHCenter | Qt::AlignVCenter);
76
 }
77
@@ -152,6 +178,9 @@
78
    forceMonoContainer->deleteLater();
79
    panningContainer->deleteLater();
80
    syncOffset->deleteLater();
81
+#if defined(_WIN32) || defined(__APPLE__)
82
+   monitoringType->deleteLater();
83
+#endif
84
    mixerContainer->deleteLater();
85
 }
86
 
87
@@ -264,6 +293,12 @@
88
                int64_t(milliseconds) * NSEC_PER_MSEC);
89
 }
90
 
91
+void OBSAdvAudioCtrl::monitoringTypeChanged(int index)
92
+{
93
+   int mt = monitoringType->itemData(index).toInt();
94
+   obs_source_set_monitoring_type(source, (obs_monitoring_type)mt);
95
+}
96
+
97
 static inline void setMixer(obs_source_t *source, const int mixerIdx,
98
        const bool checked)
99
 {
100
obs-studio-17.0.2.tar.xz/UI/adv-audio-control.hpp -> obs-studio-18.0.0.tar.xz/UI/adv-audio-control.hpp Changed
25
 
1
@@ -9,6 +9,7 @@
2
 class QSpinBox;
3
 class QCheckBox;
4
 class QSlider;
5
+class QComboBox;
6
 
7
 class OBSAdvAudioCtrl : public QObject {
8
    Q_OBJECT
9
@@ -27,6 +28,7 @@
10
    QPointer<QLabel>       labelL;
11
    QPointer<QLabel>       labelR;
12
    QPointer<QSpinBox>     syncOffset;
13
+   QPointer<QComboBox>    monitoringType;
14
    QPointer<QCheckBox>    mixer1;
15
    QPointer<QCheckBox>    mixer2;
16
    QPointer<QCheckBox>    mixer3;
17
@@ -60,6 +62,7 @@
18
    void downmixMonoChanged(bool checked);
19
    void panningChanged(int val);
20
    void syncOffsetChanged(int milliseconds);
21
+   void monitoringTypeChanged(int index);
22
    void mixer1Changed(bool checked);
23
    void mixer2Changed(bool checked);
24
    void mixer3Changed(bool checked);
25
obs-studio-17.0.2.tar.xz/UI/data/locale/ar-SA.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/ar-SA.ini Changed
25
 
1
@@ -49,6 +49,7 @@
2
 Top="أعلى"
3
 Bottom="أسفل"
4
 
5
+
6
 QuickTransitions.SwapScenes="التبديل بين مشهدي المعاينة و الاخراج بعد عملية الانتقال"
7
 QuickTransitions.SwapScenesTT="يقوم بتبديل مشهد المعاينة مع مشهد الاخراج بعد عملية الانتقال بين المشاهد (اذا كان مشهد الاخراج الاصلي لازال موجوداً) \n هذا لن يقوم بالتراجع عن اي تغييرات قمت بها على مشهد الاخراج الأصلي."
8
 QuickTransitions.DuplicateScene="استنساخ المشهد"
9
@@ -87,6 +88,7 @@
10
 ConfirmRemove.Title="تأكيد الإزالة"
11
 ConfirmRemove.Text="هل أنت متأكد من رغبتك في إزالة '$1' ?"
12
 
13
+
14
 Output.ConnectFail.Title="فشل في الاتصال"
15
 Output.ConnectFail.BadPath="مسار أو رابط الاتصال غير صالح. الرجاء التحقق من الإعدادات للتحقق من كونه صالح."
16
 Output.ConnectFail.ConnectFailed="فشل الاتصال بالسيرفر"
17
@@ -147,6 +149,7 @@
18
 
19
 Deinterlacing.Discard="تجاهل"
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="أضف المشهد"
23
 Basic.Main.AddSceneDlg.Text="الرجاء إدخال اسم المشهد"
24
 
25
obs-studio-17.0.2.tar.xz/UI/data/locale/bg-BG.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/bg-BG.ini Changed
25
 
1
@@ -45,6 +45,7 @@
2
 
3
 
4
 
5
+
6
 TitleBar.Profile="Профил"
7
 TitleBar.Scenes="Сцени"
8
 
9
@@ -61,6 +62,7 @@
10
 ConfirmRemove.Title="Потвърди премахване"
11
 ConfirmRemove.Text="Наистина ли искате да премахнете \"$1\"?"
12
 
13
+
14
 Output.ConnectFail.Title="Неуспешно свързване"
15
 Output.ConnectFail.BadPath="Невалиден път или URL. Проверете дали настройките ви са валидни."
16
 Output.ConnectFail.ConnectFailed="Неуспешна връзка със сървъра"
17
@@ -112,6 +114,7 @@
18
 
19
 
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Добави сцена"
23
 Basic.Main.AddSceneDlg.Text="Моля, въведете името на сцената"
24
 
25
obs-studio-17.0.2.tar.xz/UI/data/locale/ca-ES.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/ca-ES.ini Changed
130
 
1
@@ -57,12 +57,25 @@
2
 Import="Importa"
3
 Export="Exporta"
4
 
5
+Updater.Title="Nova actualització disponible"
6
+Updater.Text="Hi ha una nova actualització disponible:"
7
+Updater.UpdateNow="Actualitza ara"
8
+Updater.RemindMeLater="Recordeu-m'ho més tard"
9
+Updater.Skip="Omet la versió"
10
+Updater.Running.Title="Programa actualment actiu"
11
+Updater.Running.Text="Les sortides estan actives actualment, apagueu qualsevol sortida activa abans d'intentar actualitzar"
12
+Updater.NoUpdatesAvailable.Title="No hi ha actualitzacions disponibles"
13
+Updater.NoUpdatesAvailable.Text="Actualment no hi ha actualitzacions disponibles"
14
+Updater.FailedToLaunch="No s'han pogut executar l'actualitzador"
15
+Updater.GameCaptureActive.Title="Captura de joc activa"
16
+Updater.GameCaptureActive.Text="La llibreria de captura de jocs està actualment en ús. Tanqueu qualsevol joc/programa que estigui sent capturat (o reinicieu Windows) i proveu-ho de nou."
17
+
18
 QuickTransitions.SwapScenes="Canvia la vista prèvia i sortida d'escenes després de la transició"
19
 QuickTransitions.SwapScenesTT="Canvia la vista prèvia i sortida d'escenes després de la transició (si encara existeix l'escena original de la sortida). \nAixò no desfarà qualsevol canvi que pugui haver fet a l'escena original de la sortida."
20
 QuickTransitions.DuplicateScene="Duplica l'escena"
21
-QuickTransitions.DuplicateSceneTT="Al editar la misma escena, permite la edición transformar/visibilidad de fuentes sin modificar las salida.\nPer editar les propietats de les fonts sense modificar la sortida, activi 'Duplicar Fonts'.\nCanviant aquest valor restablirà l'escena actual de sortida (si encara existeix)."
22
+QuickTransitions.DuplicateSceneTT="En editar la mateixa escena, permet editar la visibilitat i transformació de les fonts sense modificar la sortida.\nPer editar les propietats de les fonts sense modificar la sortida, activeu «Duplicar Fonts».\nSi canvieu aquest valor es restablirà l'escena actual de la sortida (si encara existeix)."
23
 QuickTransitions.EditProperties="Duplica les fonts"
24
-QuickTransitions.EditPropertiesTT="En editar la mateixa escena, permeti editar propietats de fonts sense modificar la sortida.\n Això només es pot utilitzar si està activat 'Duplicar l'escena'.\nCertes fonts (tals com a fonts de captura o els mitjans de comunicació) no són compatibles amb això i no es poden editar per separat.\nCanviant aquest valor restablirà l'escena actual de sortida (si encara existeix).\n\nAdvertiment: com es duplicaran les fonts, això requerirà un extra de recursos del sistema i de vídeo."
25
+QuickTransitions.EditPropertiesTT="En editar la mateixa escena, permet editar les propietats de les fonts sense modificar la sortida.\nAixò només es pot utilitzar si s'ha activat «Duplicar l'escena».\nAlgunes fonts (com dispositius de captura o mèdia) no ho permeten i no es poden editar per separat.\nSi canvieu aquest valor es restablirà l'escena actual de la sortida (si encara existeix).\n\nAtenció: com que es duplicaran les fonts, poden ser necessaris més recursos del sistema o de vídeo."
26
 QuickTransitions.HotkeyName="Transició Ràpida: %1"
27
 
28
 Basic.AddTransition="Afegir transició configurable"
29
@@ -97,6 +110,11 @@
30
 ConfirmRemove.Text="Esteu segur que voleu suprimir «$1»?"
31
 ConfirmRemove.TextMultiple="¿Segur que vols esborrar %1 elements?"
32
 
33
+Output.StartStreamFailed="No s'ha pogut iniciar la transmissió"
34
+Output.StartRecordingFailed="No s'ha pogut iniciar la gravació"
35
+Output.StartReplayFailed="No s'ha pogut iniciar la memòria intermèdia de reproducció"
36
+Output.StartFailedGeneric="Error en iniciar la sortida. Comproveu el registre per més detalls.\n\nAvís: Si utilitzeu els codificadors NVENC o AMD, assegureu-vos que els controladors de vídeo estan actualitzats."
37
+
38
 Output.ConnectFail.Title="Error en connectar"
39
 Output.ConnectFail.BadPath="Ruta o adreça URL no vàlida.  Si us plau, comproveu la configuració per confirmar que són vàlids."
40
 Output.ConnectFail.ConnectFailed="No ha pogut connectar al servidor"
41
@@ -173,6 +191,11 @@
42
 Deinterlacing.TopFieldFirst="Camp superior primer"
43
 Deinterlacing.BottomFieldFirst="Camp inferior primer"
44
 
45
+VolControl.SliderUnmuted="Control lliscant del volum per '%1': %2"
46
+VolControl.SliderMuted="Control lliscant del volum per '%1': %2 (silenciat)"
47
+VolControl.Mute="Silencia '%1'"
48
+VolControl.Properties="Propietats per '%1'"
49
+
50
 Basic.Main.AddSceneDlg.Title="Afegeix una escena"
51
 Basic.Main.AddSceneDlg.Text="Introduïu el nom de l'escena"
52
 
53
@@ -351,8 +374,10 @@
54
 Basic.Settings.General="General"
55
 Basic.Settings.General.Theme="Tema"
56
 Basic.Settings.General.Language="Llengua"
57
+Basic.Settings.General.EnableAutoUpdates="Comprova si hi ha actualitzacions automàticament a l'inici"
58
 Basic.Settings.General.WarnBeforeStartingStream="Mostra diàleg de confirmació quan s'iniciï una transmissió"
59
 Basic.Settings.General.WarnBeforeStoppingStream="Mostra diàleg de confirmació quan s'aturi una transmissió"
60
+Basic.Settings.General.Projectors="Projectors"
61
 Basic.Settings.General.HideProjectorCursor="Amaga el cursor sobre projectors"
62
 Basic.Settings.General.ProjectorAlwaysOnTop="Projectors sempre en la part superior"
63
 Basic.Settings.General.Snapping="Ajustament d'alineació de la font"
64
@@ -362,8 +387,12 @@
65
 Basic.Settings.General.SnapDistance="Ajusta la sensibilitat"
66
 Basic.Settings.General.RecordWhenStreaming="Enregistra automàticament quan es transmet"
67
 Basic.Settings.General.KeepRecordingWhenStreamStops="Mantenir l'enregistrament quan s'atura la transmissió"
68
-Basic.Settings.General.SysTrayEnabled="Activar icona a la safata del sistema"
69
+Basic.Settings.General.ReplayBufferWhileStreaming="Inicia la reproducció de la memòria intermèdia automàticament durant la transmissió"
70
+Basic.Settings.General.KeepReplayBufferStreamStops="Mantén activa la memòria intermèdia de reproducció quan la transmissió s'aturi"
71
+Basic.Settings.General.SysTray="Safata del sistema"
72
 Basic.Settings.General.SysTrayWhenStarted="Minimitzar a la safata del sistema en iniciar"
73
+Basic.Settings.General.SystemTrayHideMinimize="Minimitza sempre a la safata del sistema en lloc de la barra de tasques"
74
+Basic.Settings.General.SaveProjectors="Desa els projectors en sortir"
75
 
76
 Basic.Settings.Stream="Directe"
77
 Basic.Settings.Stream.StreamType="Tipus de directe"
78
@@ -452,6 +481,8 @@
79
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="Codificador d'àudio"
80
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Configuració de codificador d'àudio (si escau)"
81
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Configuració del convertidor (si escau)"
82
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Interval de fotogrames clau (fotogrames)"
83
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Mostra tots els codificadors (encara que siguin potencialment incompatibles)"
84
 
85
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
86
 
87
@@ -505,12 +536,16 @@
88
 Basic.Settings.Advanced.Video.ColorRange="Gamma de color YUV"
89
 Basic.Settings.Advanced.Video.ColorRange.Partial="Parcial"
90
 Basic.Settings.Advanced.Video.ColorRange.Full="Màxima"
91
+Basic.Settings.Advanced.Audio.MonitoringDevice="Dispositiu de monitorització d'àudio"
92
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Per defecte"
93
 Basic.Settings.Advanced.StreamDelay="Retard del directe"
94
 Basic.Settings.Advanced.StreamDelay.Duration="Durada (en segons)"
95
 Basic.Settings.Advanced.StreamDelay.Preserve="Preservar el punt de tall (augmenta retard) quan s'estigui reconnectant"
96
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Ús de memòria estimat: %1 MB"
97
 Basic.Settings.Advanced.Network="Xarxa"
98
 Basic.Settings.Advanced.Network.BindToIP="Enllaçar amb"
99
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Activa el nou codi de xarxa"
100
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Mode de baixa latència"
101
 
102
 Basic.AdvAudio="&Propietats avançades d'àudio"
103
 Basic.AdvAudio.Name="Nom"
104
@@ -518,6 +553,10 @@
105
 Basic.AdvAudio.Mono="Mescla a Mono"
106
 Basic.AdvAudio.Panning="Balanç"
107
 Basic.AdvAudio.SyncOffset="Correcció de sincronització (ms)"
108
+Basic.AdvAudio.Monitoring="Monitorització d'àudio"
109
+Basic.AdvAudio.Monitoring.None="Monitorització desactivada"
110
+Basic.AdvAudio.Monitoring.MonitorOnly="Només monitorizació (silencia la sortida)"
111
+Basic.AdvAudio.Monitoring.Both="Monitorització i sortida"
112
 Basic.AdvAudio.AudioTracks="Pistes"
113
 
114
 Basic.Settings.Hotkeys="Dreceres de teclat"
115
@@ -526,7 +565,7 @@
116
 Basic.Hotkeys.SelectScene="Canviar a escena"
117
 
118
 Basic.SystemTray.Show="Mostra"
119
-Basic.SystemTray.Hide="Oculta"
120
+Basic.SystemTray.Hide="Amaga"
121
 
122
 Basic.SystemTray.Message.Reconnecting="Desconnectat. Tornant a connectar..."
123
 
124
@@ -576,4 +615,5 @@
125
 
126
 OutputWarnings.NoTracksSelected="Heu de seleccionar almenys una cançó"
127
 OutputWarnings.MultiTrackRecording="Advertiment: Alguns formats (com FLV) no suporten múltiples cançons per gravació"
128
+OutputWarnings.MP4Recording="Advertència: Els enregistraments desats en MP4 seran irrecuperables si l'arxiu no va poder finalitzar (p.ex. com a resultat de BSODs, pèrdues de potència, etc.). Si voleu enregistrar diverses pistes d'àudio utilitzi MKV i multiplexeu l'enregistrament a MP4 després que acabi (Fitxer-> Multiplexació d'enregistraments)"
129
 
130
obs-studio-17.0.2.tar.xz/UI/data/locale/cs-CZ.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/cs-CZ.ini Changed
113
 
1
@@ -57,6 +57,19 @@
2
 Import="Importovat"
3
 Export="Exportovat"
4
 
5
+Updater.Title="Aktualizace"
6
+Updater.Text="K dispozici je nová verze:"
7
+Updater.UpdateNow="Aktualizovat nyní"
8
+Updater.RemindMeLater="Upozornit později"
9
+Updater.Skip="Přeskočit verzi"
10
+Updater.Running.Title="Program je stále aktivní"
11
+Updater.Running.Text="Některé výstupy jsou stále aktivní, zastavte je, prosím, před další pokusem o aktualizaci"
12
+Updater.NoUpdatesAvailable.Title="Žádná aktualizace"
13
+Updater.NoUpdatesAvailable.Text="Není dostupná žádná novější verze"
14
+Updater.FailedToLaunch="Nepodařilo se spustit aktualizátor"
15
+Updater.GameCaptureActive.Title="Snímání hry"
16
+Updater.GameCaptureActive.Text="Knihovna pro snímání her je aktivní. Ukončete prosím všechny snímané hry/programy (nebo restartujte Windows) a zkuste to znovu."
17
+
18
 QuickTransitions.SwapScenes="Prohodit scény náhledu a výstupu po přechodu"
19
 QuickTransitions.SwapScenesTT="Prohodí scény náhledu a výstupu po přechodu (pokud originální výstupní scéna stále existuje).\nTato funkce nevrátí provedené změny, které byly provedeny v originální scéně výstupu."
20
 QuickTransitions.DuplicateScene="Duplikovat scénu"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="Opravdu si přejete odebrat '$1'?"
23
 ConfirmRemove.TextMultiple="Opravdu si přejete odebrat %1 položky ?"
24
 
25
+Output.StartStreamFailed="Chyba při spouštění vysílání"
26
+Output.StartRecordingFailed="Chyba při spouštění nahrávání"
27
+Output.StartReplayFailed="Chyba při spouštění nahrávání do paměti"
28
+Output.StartFailedGeneric="Nastala chyba při začátku nahrávání. Zkontrolujte, prosím, textový záznam pro další podrobnosti.\n\nPoznámka: Pokud používáte enkodér NVENC či AMD, zkontrolujte zda používáte aktuální verzi grafického ovladače."
29
+
30
 Output.ConnectFail.Title="Spojení se nezdařilo"
31
 Output.ConnectFail.BadPath="Chybná cesta nebo adresa připojení. Zkontrolujte, prosím, správnost svých nastavení."
32
 Output.ConnectFail.ConnectFailed="K serveru se nepodařilo připojit"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="Svrchní řádek dříve"
35
 Deinterlacing.BottomFieldFirst="Spodní řádek dříve"
36
 
37
+VolControl.SliderUnmuted="Posuvník hlasitosti pro '%1': %2"
38
+VolControl.SliderMuted="Posuvník hlasitosti pro '%1': %2 (ztlumeno)"
39
+VolControl.Mute="Ztlumit '%1'"
40
+VolControl.Properties="Vlastnosti pro \"%1\""
41
+
42
 Basic.Main.AddSceneDlg.Title="Přidat scénu"
43
 Basic.Main.AddSceneDlg.Text="Prosím, zadejte jméno scény"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="Hlavní"
47
 Basic.Settings.General.Theme="Vzhled"
48
 Basic.Settings.General.Language="Jazyk"
49
+Basic.Settings.General.EnableAutoUpdates="Automaticky kontrolovat aktualizace při spuštění"
50
 Basic.Settings.General.WarnBeforeStartingStream="Vyžadovat potvrzení pro spuštění vysílání"
51
 Basic.Settings.General.WarnBeforeStoppingStream="Vyžadovat potvrzení pro ukončení vysílání"
52
+Basic.Settings.General.Projectors="Projektory"
53
 Basic.Settings.General.HideProjectorCursor="Skrýt kurzor přes projektor"
54
 Basic.Settings.General.ProjectorAlwaysOnTop="Zobrazovat projektor vždy navrchu"
55
 Basic.Settings.General.Snapping="Přichycování zdrojů"
56
@@ -362,8 +387,12 @@
57
 Basic.Settings.General.SnapDistance="Citlivost přichycení"
58
 Basic.Settings.General.RecordWhenStreaming="Automaticky nahrávat při vysílání"
59
 Basic.Settings.General.KeepRecordingWhenStreamStops="Pokračovat v nahrávání i po zastavení vysílání"
60
-Basic.Settings.General.SysTrayEnabled="Zobrazit ikonu v oznamovací oblasti"
61
+Basic.Settings.General.ReplayBufferWhileStreaming="Automaticky zapnout záznam do paměti se začátkem vysílání"
62
+Basic.Settings.General.KeepReplayBufferStreamStops="Ponechat záznam do paměti aktivní i po ukončení vysílání"
63
+Basic.Settings.General.SysTray="Systémová lišta"
64
 Basic.Settings.General.SysTrayWhenStarted="Minimalizovat do systémové lišty při spuštění"
65
+Basic.Settings.General.SystemTrayHideMinimize="Vždy minimalizovat do systémové lišty místo hlavního panelu"
66
+Basic.Settings.General.SaveProjectors="Při ukončení uložit projektory"
67
 
68
 Basic.Settings.Stream="Vysílání"
69
 Basic.Settings.Stream.StreamType="Typ vysílání"
70
@@ -452,6 +481,8 @@
71
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="Enkodér zvuku"
72
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Nastavení enkodéru zvuku (pokud existuje)"
73
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Nastavení směšovače (pokud existuje)"
74
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Interval klíčových snímků (snímky)"
75
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Zobrazit všechny kodeky (i když je možné, že nejsou kompatibilní)"
76
 
77
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
78
 
79
@@ -505,12 +536,16 @@
80
 Basic.Settings.Advanced.Video.ColorRange="Oblast barev YUV"
81
 Basic.Settings.Advanced.Video.ColorRange.Partial="Částečné"
82
 Basic.Settings.Advanced.Video.ColorRange.Full="Plné"
83
+Basic.Settings.Advanced.Audio.MonitoringDevice="Zařízení pro monitorování zvuku"
84
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Výchozí"
85
 Basic.Settings.Advanced.StreamDelay="Zpoždění vysílání"
86
 Basic.Settings.Advanced.StreamDelay.Duration="Délka (vteřiny)"
87
 Basic.Settings.Advanced.StreamDelay.Preserve="Zachovat zpoždění při obnovení spojení (zvýšení zpoždění)"
88
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Přibližné využití paměti: %1 MB"
89
 Basic.Settings.Advanced.Network="Síť"
90
 Basic.Settings.Advanced.Network.BindToIP="Svázat s adresou"
91
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Použít nový síťový kód"
92
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Režim nízké odezvy"
93
 
94
 Basic.AdvAudio="Rozšířené vlastnosti zvuku"
95
 Basic.AdvAudio.Name="Název"
96
@@ -518,6 +553,10 @@
97
 Basic.AdvAudio.Mono="Převést na Mono"
98
 Basic.AdvAudio.Panning="Pozicování"
99
 Basic.AdvAudio.SyncOffset="Zpoždění synchronizace (ms)"
100
+Basic.AdvAudio.Monitoring="Monitorování zvuku"
101
+Basic.AdvAudio.Monitoring.None="Monitorování vypnuto"
102
+Basic.AdvAudio.Monitoring.MonitorOnly="Pouhé monitorování (ztlumit výstup)"
103
+Basic.AdvAudio.Monitoring.Both="Monitorovat a odesílat na výstup"
104
 Basic.AdvAudio.AudioTracks="Stopy"
105
 
106
 Basic.Settings.Hotkeys="Zkratky"
107
@@ -576,4 +615,5 @@
108
 
109
 OutputWarnings.NoTracksSelected="Musíte vybrat alespoň jednu stopu"
110
 OutputWarnings.MultiTrackRecording="Varování: Některé formáty (např. FLV) nepodporují více zvukových stop na nahrávku"
111
+OutputWarnings.MP4Recording="Varování: Nahrávky uložené v MP4 nebude možné obnovit, pokud soubor nemohl být dokončen (např. po BSOD, výpadku napájení atp.). Pokud chcete nahrávat více zvukových stop, promyslete použití MKV a poté převodení do MP4 (Soubor -> Převést nahrávky)"
112
 
113
obs-studio-17.0.2.tar.xz/UI/data/locale/da-DK.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/da-DK.ini Changed
126
 
1
@@ -57,6 +57,19 @@
2
 Import="Importér"
3
 Export="Eksportér"
4
 
5
+Updater.Title="Ny opdatering tilgængelig"
6
+Updater.Text="Der er en ny opdatering tilgængelig:"
7
+Updater.UpdateNow="Opdater nu"
8
+Updater.RemindMeLater="Påmind mig senere"
9
+Updater.Skip="Spring versionen over"
10
+Updater.Running.Title="Program er aktivt i øjeblikket"
11
+Updater.Running.Text="Outputs er aktive i øjeblikket. Luk venligst alle aktive outputs før forsøg på opdatering"
12
+Updater.NoUpdatesAvailable.Title="Ingen opdateringer tilgængelige"
13
+Updater.NoUpdatesAvailable.Text="Ingen opdateringer er tilgængelige i øjeblikket"
14
+Updater.FailedToLaunch="Kunne ikke starte opdatering"
15
+Updater.GameCaptureActive.Title="Spil capture aktiv"
16
+Updater.GameCaptureActive.Text="Spil capture fangstbibliotek er i brug i øjeblikket. Luk venligst alle spil/programmer der bliver captured (eller genstart windows) og prøv igen."
17
+
18
 QuickTransitions.SwapScenes="Byt om på forhåndsvisning/output scener efter overgang"
19
 QuickTransitions.SwapScenesTT="Ombytter uddrag- og output-scener efter omskiftning (hvis oprindelige output-scene stadig eksisterer).\nDette vil ikke omgøre eventuelle ændringer, der måtte været udført på den oprindelige output-scene."
20
 QuickTransitions.DuplicateScene="Dupliker scene"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="Er du sikker på du ønsker at fjerne '$1'?"
23
 ConfirmRemove.TextMultiple="Er du sikker på at du vil fjerne %1 elementer?"
24
 
25
+Output.StartStreamFailed="Kunne ikke starte streaming"
26
+Output.StartRecordingFailed="Kunne ikke begynde optagelsen"
27
+Output.StartReplayFailed="Kunne ikke starte replay buffer"
28
+Output.StartFailedGeneric="Start af output mislykkedes. Kontroller venligst loggen for oplysninger.\n\nBemærk: Hvis du bruger NVENC eller AMD encoder, så sørg for at dine video drivere er opdateret."
29
+
30
 Output.ConnectFail.Title="Kunne ikke oprette forbindelse"
31
 Output.ConnectFail.BadPath="Ugyldig sti eller forbindelses URL.  Kontroller indstillinger for at bekræfte, at de er gyldige."
32
 Output.ConnectFail.ConnectFailed="Kunne ikke forbinde til server"
33
@@ -143,8 +161,8 @@
34
 UpdateAvailable="Ny opdatering tilgængelig"
35
 UpdateAvailable.Text="Version %1.%2.%3 er nu tilgængelig.  <a href='%4'>Klik her for at downloade</a>"
36
 
37
-Basic.DesktopDevice1="Desktop lyd"
38
-Basic.DesktopDevice2="Desktop lyd 2"
39
+Basic.DesktopDevice1="Skrivebordslyd"
40
+Basic.DesktopDevice2="Skrivebordslyd 2"
41
 Basic.AuxDevice1="Mic/Aux"
42
 Basic.AuxDevice2="Mic/Aux 2"
43
 Basic.AuxDevice3="Mic/Aux 3"
44
@@ -173,6 +191,7 @@
45
 Deinterlacing.TopFieldFirst="Øverste felt først"
46
 Deinterlacing.BottomFieldFirst="Nederste felt først"
47
 
48
+
49
 Basic.Main.AddSceneDlg.Title="Tilføje scene"
50
 Basic.Main.AddSceneDlg.Text="Angiv navnet på scene"
51
 
52
@@ -314,7 +333,7 @@
53
 Basic.MainMenu.Edit.Order="Rækkefølge (&O)"
54
 Basic.MainMenu.Edit.Order.MoveUp="Flyt Op (&U)"
55
 Basic.MainMenu.Edit.Order.MoveDown="Flyt Ned (&D)"
56
-Basic.MainMenu.Edit.Order.MoveToTop="Flyt til &Toppen"
57
+Basic.MainMenu.Edit.Order.MoveToTop="Flyt til &toppen"
58
 Basic.MainMenu.Edit.Order.MoveToBottom="Flyt til &Bunden"
59
 Basic.MainMenu.Edit.AdvAudio="&Avancerede lydegenskaber"
60
 
61
@@ -351,8 +370,10 @@
62
 Basic.Settings.General="Generelt"
63
 Basic.Settings.General.Theme="Tema"
64
 Basic.Settings.General.Language="Sprog"
65
+Basic.Settings.General.EnableAutoUpdates="Automatisk søgning efter opdateringer ved opstart"
66
 Basic.Settings.General.WarnBeforeStartingStream="Vis bekræftelses-dialog ved opstart af stream"
67
 Basic.Settings.General.WarnBeforeStoppingStream="Vis bekræftelses-dialog ved afslutning af stream"
68
+Basic.Settings.General.Projectors="Projektorer"
69
 Basic.Settings.General.HideProjectorCursor="Skjul markør over projektorer"
70
 Basic.Settings.General.ProjectorAlwaysOnTop="Hav altid projektorer øverst"
71
 Basic.Settings.General.Snapping="Kilde justeringsfastgørelse"
72
@@ -362,8 +383,12 @@
73
 Basic.Settings.General.SnapDistance="Fastgørings-følsomhed"
74
 Basic.Settings.General.RecordWhenStreaming="Optag automatisk ved streaming"
75
 Basic.Settings.General.KeepRecordingWhenStreamStops="Bliv ved med at optage når stream stopper"
76
-Basic.Settings.General.SysTrayEnabled="Aktiver proceslinje-ikon"
77
+Basic.Settings.General.ReplayBufferWhileStreaming="Start automatisk replay buffer ved streaming"
78
+Basic.Settings.General.KeepReplayBufferStreamStops="Hold replay buffer aktiv når stream stopper"
79
+Basic.Settings.General.SysTray="Processlinjen"
80
 Basic.Settings.General.SysTrayWhenStarted="Minimer til proceslinjen ved start"
81
+Basic.Settings.General.SystemTrayHideMinimize="Minimer altid til processlinjen i stedet for værktøjslinjen"
82
+Basic.Settings.General.SaveProjectors="Gem projektorer ved afslutning"
83
 
84
 Basic.Settings.Stream="Stream"
85
 Basic.Settings.Stream.StreamType="Streamtype"
86
@@ -423,6 +448,8 @@
87
 Basic.Settings.Output.Adv.Audio.Track2="Spor 2"
88
 Basic.Settings.Output.Adv.Audio.Track3="Spor 3"
89
 Basic.Settings.Output.Adv.Audio.Track4="Spor 4"
90
+Basic.Settings.Output.Adv.Audio.Track5="Sport 5"
91
+Basic.Settings.Output.Adv.Audio.Track6="Spor 6"
92
 
93
 Basic.Settings.Output.Adv.Recording="Optagelse"
94
 Basic.Settings.Output.Adv.Recording.Type="Type"
95
@@ -479,8 +506,8 @@
96
 Basic.Settings.Audio="Lyd"
97
 Basic.Settings.Audio.SampleRate="Sample Rate"
98
 Basic.Settings.Audio.Channels="Kanaler"
99
-Basic.Settings.Audio.DesktopDevice="Desktop lydenhed"
100
-Basic.Settings.Audio.DesktopDevice2="Desktop lydenhed 2"
101
+Basic.Settings.Audio.DesktopDevice="Skrivebord lydenhed"
102
+Basic.Settings.Audio.DesktopDevice2="Skrivebord lydenhed 2"
103
 Basic.Settings.Audio.AuxDevice="Mic/Auxiliary lydenhed"
104
 Basic.Settings.Audio.AuxDevice2="Mic/Auxiliary lydenhed 2"
105
 Basic.Settings.Audio.AuxDevice3="Mic/Auxiliary lydenhed 3"
106
@@ -503,6 +530,8 @@
107
 Basic.Settings.Advanced.Video.ColorRange="YUV farveområde"
108
 Basic.Settings.Advanced.Video.ColorRange.Partial="Delvis"
109
 Basic.Settings.Advanced.Video.ColorRange.Full="Fuld"
110
+Basic.Settings.Advanced.Audio.MonitoringDevice="Lyd overvågningsenhed"
111
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Standard"
112
 Basic.Settings.Advanced.StreamDelay="Stream forsinkelse"
113
 Basic.Settings.Advanced.StreamDelay.Duration="Varighed (sekunder)"
114
 Basic.Settings.Advanced.StreamDelay.Preserve="Bevar afskæringspunkt (forøg forsinkelse) ved forbindelsesgendannelse"
115
@@ -516,6 +545,10 @@
116
 Basic.AdvAudio.Mono="Nedmix til Mono"
117
 Basic.AdvAudio.Panning="Panorering"
118
 Basic.AdvAudio.SyncOffset="Synkr-forskydning (ms)"
119
+Basic.AdvAudio.Monitoring="Lydovervågning"
120
+Basic.AdvAudio.Monitoring.None="Overvågning fra"
121
+Basic.AdvAudio.Monitoring.MonitorOnly="Kun overvågning (mute output)"
122
+Basic.AdvAudio.Monitoring.Both="Overvåg og output"
123
 Basic.AdvAudio.AudioTracks="Spor"
124
 
125
 Basic.Settings.Hotkeys="Genvejstaster"
126
obs-studio-17.0.2.tar.xz/UI/data/locale/de-DE.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/de-DE.ini Changed
117
 
1
@@ -57,6 +57,19 @@
2
 Import="Importieren"
3
 Export="Exportieren"
4
 
5
+Updater.Title="Neues Update verfügbar"
6
+Updater.Text="Es ist ein neues Update verfügbar:"
7
+Updater.UpdateNow="Jetzt updaten"
8
+Updater.RemindMeLater="Später erinnern"
9
+Updater.Skip="Version überspringen"
10
+Updater.Running.Title="Programm derzeit aktiv"
11
+Updater.Running.Text="Ausgänge sind derzeit aktiv. Bitte beenden Sie alle aktiven Ausgänge, bevor Sie versuchen OBS zu aktualisieren."
12
+Updater.NoUpdatesAvailable.Title="Keine Updates verfügbar"
13
+Updater.NoUpdatesAvailable.Text="Zurzeit sind keine Updates verfügbar"
14
+Updater.FailedToLaunch="Konnte den Updater nicht starten"
15
+Updater.GameCaptureActive.Title="Spielaufnahme aktiv"
16
+Updater.GameCaptureActive.Text="Spielaufnahme Hook Bibliothek wird zurzeit verwendet. Bitte schließen Sie alle derzeitigen Spiele / Programme die aufgenommen werden (oder starten Sie Windows neu) und versuchen Sie es erneut."
17
+
18
 QuickTransitions.SwapScenes="Tausche Vorschau/Ausgabe-Szenen nach dem Übergang"
19
 QuickTransitions.SwapScenesTT="Vertauscht die Vorschau- und Ausgabe-Szenen nach dem Übergang (falls die ursprüngliche Ausgabe-Szene noch vorhanden ist).\nEventuelle Änderungen an der original Ausgabe-Szene werden hierbei nicht rückgängig gemacht."
20
 QuickTransitions.DuplicateScene="Dupliziere Szene"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="Sind Sie sicher, dass Sie '$1' entfernen möchten?"
23
 ConfirmRemove.TextMultiple="Sind Sie sicher, dass Sie %1 Elemente löschen möchten?"
24
 
25
+Output.StartStreamFailed="Fehler beim Start des Streams"
26
+Output.StartRecordingFailed="Fehler beim Starten der Aufnahme"
27
+Output.StartReplayFailed="Fehler beim Starten des Replaypuffers"
28
+Output.StartFailedGeneric="Start der Ausgabe fehlgeschlagen. Bitte überprüfen Sie die Logdatei für Details.\n\nHinweis: Wenn Sie die NVENC- oder AMD-Encoder verwenden, stellen Sie sicher, dass Ihre Videotreiber aktuell sind."
29
+
30
 Output.ConnectFail.Title="Verbindung fehlgeschlagen"
31
 Output.ConnectFail.BadPath="Ungültiger Pfad oder Verbindungs-URL. Bitte überprüfen Sie Ihre Einstellungen und stellen Sie sicher, dass diese korrekt sind."
32
 Output.ConnectFail.ConnectFailed="Verbindung zum Server fehlgeschlagen"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="Oberes Feld zuerst"
35
 Deinterlacing.BottomFieldFirst="Unteres Feld zuerst"
36
 
37
+VolControl.SliderUnmuted="Lautstärke-Schieberegler für '%1': %2"
38
+VolControl.SliderMuted="Lautstärke-Schieberegler für '%1': %2 (derzeit stumm geschaltet)"
39
+VolControl.Mute="'%1' stumm schalten"
40
+VolControl.Properties="Eigenschaften von '%1'"
41
+
42
 Basic.Main.AddSceneDlg.Title="Szene hinzufügen"
43
 Basic.Main.AddSceneDlg.Text="Bitte geben Sie einen Namen für die Szene ein"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="Allgemein"
47
 Basic.Settings.General.Theme="Motiv"
48
 Basic.Settings.General.Language="Sprache"
49
+Basic.Settings.General.EnableAutoUpdates="Beim Start nach Updates suchen"
50
 Basic.Settings.General.WarnBeforeStartingStream="Bestätigungsdialog beim Streamstart anzeigen"
51
 Basic.Settings.General.WarnBeforeStoppingStream="Bestätigungsdialog beim Streamstop anzeigen"
52
+Basic.Settings.General.Projectors="Projektoren"
53
 Basic.Settings.General.HideProjectorCursor="Mauszeiger über Projektoren verstecken"
54
 Basic.Settings.General.ProjectorAlwaysOnTop="Projektoren immer im Vordergrund anzeigen"
55
 Basic.Settings.General.Snapping="Quellenausrichtung"
56
@@ -360,10 +385,14 @@
57
 Basic.Settings.General.CenterSnapping="Quellen zur horizontalen und vertikalen Mitte ausrichten"
58
 Basic.Settings.General.SourceSnapping="Quellen an anderen Quellen ausrichten"
59
 Basic.Settings.General.SnapDistance="Ausrichtungsempfindlichkeit"
60
-Basic.Settings.General.RecordWhenStreaming="Stream automatisch aufnehmen"
61
+Basic.Settings.General.RecordWhenStreaming="Livestream automatisch aufnehmen"
62
 Basic.Settings.General.KeepRecordingWhenStreamStops="Weiter aufnehmen, wenn der Livestream stoppt"
63
-Basic.Settings.General.SysTrayEnabled="Symbol in der Taskleiste aktivieren"
64
-Basic.Settings.General.SysTrayWhenStarted="Beim Start zur Taskleiste minimieren"
65
+Basic.Settings.General.ReplayBufferWhileStreaming="Replaypuffer automatisch starten, beim Streamen"
66
+Basic.Settings.General.KeepReplayBufferStreamStops="Replaypuffer weiter aktiv lassen, wenn der Livestream stoppt"
67
+Basic.Settings.General.SysTray="Infobereich"
68
+Basic.Settings.General.SysTrayWhenStarted="Beim Start zum Infobereich minimieren"
69
+Basic.Settings.General.SystemTrayHideMinimize="Immer zum Infobereich. statt zur Taskleiste minimieren"
70
+Basic.Settings.General.SaveProjectors="Projektoren beim Beenden speichern"
71
 
72
 Basic.Settings.Stream="Stream"
73
 Basic.Settings.Stream.StreamType="Stream Typ"
74
@@ -452,6 +481,8 @@
75
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="Audio-Codierer"
76
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Audio Codierer-Einstellungen (falls gewünscht)"
77
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxer Einstellungen (falls vorhanden)"
78
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Keyframeintervall (Frames)"
79
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Zeige alle Codecs (auch wenn möglicherweise nicht kompatibel)"
80
 
81
 FilenameFormatting.completer="%DD-%MM-%CCYY %hh-%mm-%ss\n%DD-%MM-%YY %hh-%mm-%ss\n%d-%m-%Y %H-%M-%S\n%d-%m-%y %H-%M-%S\n%a %d-%m-%Y %H-%M-%S\n%A %d-%m-%Y %H-%M-%S\n%d-%b-%Y %H-%M-%S\n%d-%B-%Y %H-%M-%S"
82
 
83
@@ -505,12 +536,16 @@
84
 Basic.Settings.Advanced.Video.ColorRange="YUV Farbbereich"
85
 Basic.Settings.Advanced.Video.ColorRange.Partial="Begrenzt"
86
 Basic.Settings.Advanced.Video.ColorRange.Full="Voll"
87
+Basic.Settings.Advanced.Audio.MonitoringDevice="Audiomonitoringgerät"
88
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Standard"
89
 Basic.Settings.Advanced.StreamDelay="Stream-Verzögerung"
90
 Basic.Settings.Advanced.StreamDelay.Duration="Dauer (Sekunden)"
91
 Basic.Settings.Advanced.StreamDelay.Preserve="Lückenloses Wiederverbinden (erhöht Verzögerung, um Videoverlust zu vermeiden)"
92
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Geschätzte Speichernutzung: %1 MB"
93
 Basic.Settings.Advanced.Network="Netzwerk"
94
 Basic.Settings.Advanced.Network.BindToIP="Interface"
95
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Neuen Netzwerkcode aktivieren"
96
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Niedriger Latenzmodus"
97
 
98
 Basic.AdvAudio="Erweiterte Audioeigenschaften"
99
 Basic.AdvAudio.Name="Name"
100
@@ -518,6 +553,10 @@
101
 Basic.AdvAudio.Mono="Heruntermischen zu Mono"
102
 Basic.AdvAudio.Panning="Schwenken"
103
 Basic.AdvAudio.SyncOffset="Sync Verschiebung (ms)"
104
+Basic.AdvAudio.Monitoring="Audiomonitoring"
105
+Basic.AdvAudio.Monitoring.None="Monitor aus"
106
+Basic.AdvAudio.Monitoring.MonitorOnly="Nur Monitor (Ausgabe stumm schalten)"
107
+Basic.AdvAudio.Monitoring.Both="Monitor und Ausgabe"
108
 Basic.AdvAudio.AudioTracks="Spuren"
109
 
110
 Basic.Settings.Hotkeys="Hotkeys"
111
@@ -576,4 +615,5 @@
112
 
113
 OutputWarnings.NoTracksSelected="Sie müssen mindestens eine Spur auswählen"
114
 OutputWarnings.MultiTrackRecording="Warnung: Bestimmte Formate (z. B. FLV) unterstützen nicht mehrere Spuren pro Aufnahme"
115
+OutputWarnings.MP4Recording="Warnung: Aufnahmen, die in MP4 gespeichert werden, sind nicht wiederherstellbar, wenn die Datei nicht abgeschlossen werden kann (zum Beispiel als Folge von BSODs, Stromausfälle, etc). Wenn Sie mehrere Audiospuren aufnehmen möchten, sollten Sie MKV verwenden und die Aufnahme zu MP4 remuxen, nachdem sie fertig ist. (Datei-> Remuxe Aufnahmen)"
116
 
117
obs-studio-17.0.2.tar.xz/UI/data/locale/el-GR.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/el-GR.ini Changed
25
 
1
@@ -49,6 +49,7 @@
2
 Seconds="Δευτερόλεπτα"
3
 
4
 
5
+
6
 Basic.TransitionDuration="Διάρκεια"
7
 Basic.TogglePreviewProgramMode="Λειτουργία στούντιο"
8
 
9
@@ -69,6 +70,7 @@
10
 ConfirmRemove.Title="Επιβεβαίωση Αφαίρεσης"
11
 ConfirmRemove.Text="Είστε βέβαιοι ότι θέλετε να καταργήσετε \"$1\";"
12
 
13
+
14
 Output.ConnectFail.Title="Η σύνδεση απέτυχε"
15
 Output.ConnectFail.BadPath="Μη έγκυρη Διαδρομή ή URL Σύνδεσης.  Παρακαλώ ελέγξτε τις ρυθμίσεις σας και επιβεβαιώστε ότι είναι έγκυρες."
16
 Output.ConnectFail.ConnectFailed="Απέτυχε η σύνδεση στον διακομιστή"
17
@@ -121,6 +123,7 @@
18
 
19
 
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Προσθήκη Σκηνής"
23
 Basic.Main.AddSceneDlg.Text="Παρακαλώ εισάγετε το όνομα της σκηνής"
24
 
25
obs-studio-17.0.2.tar.xz/UI/data/locale/en-US.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/en-US.ini Changed
122
 
1
@@ -62,6 +62,20 @@
2
 Import="Import"
3
 Export="Export"
4
 
5
+# updater
6
+Updater.Title="New update available"
7
+Updater.Text="There is a new update available:"
8
+Updater.UpdateNow="Update Now"
9
+Updater.RemindMeLater="Remind me Later"
10
+Updater.Skip="Skip Version"
11
+Updater.Running.Title="Program currently active"
12
+Updater.Running.Text="Outputs are currently active, please shut down any active outputs before attempting to update"
13
+Updater.NoUpdatesAvailable.Title="No updates available"
14
+Updater.NoUpdatesAvailable.Text="No updates are currently available"
15
+Updater.FailedToLaunch="Failed to launch updater"
16
+Updater.GameCaptureActive.Title="Game capture active"
17
+Updater.GameCaptureActive.Text="Game capture hook library is currently in use.  Please close any games/programs being captured (or restart windows) and try again."
18
+
19
 # quick transitions
20
 QuickTransitions.SwapScenes="Swap Preview/Output Scenes After Transitioning"
21
 QuickTransitions.SwapScenesTT="Swaps the preview and output scenes after transitioning (if the output's original scene still exists).\nThis will not undo any changes that may have been made to the output's original scene."
22
@@ -111,6 +125,12 @@
23
 ConfirmRemove.Text="Are you sure you wish to remove '$1'?"
24
 ConfirmRemove.TextMultiple="Are you sure you wish to remove %1 items?"
25
 
26
+# output start messages
27
+Output.StartStreamFailed="Failed to start streaming"
28
+Output.StartRecordingFailed="Failed to start recording"
29
+Output.StartReplayFailed="Failed to start replay buffer"
30
+Output.StartFailedGeneric="Starting the output failed.  Please check the log for details.\n\nNote: If you are using the NVENC or AMD encoders, make sure your video drivers are up to date."
31
+
32
 # output connect messages
33
 Output.ConnectFail.Title="Failed to connect"
34
 Output.ConnectFail.BadPath="Invalid Path or Connection URL.  Please check your settings to confirm that they are valid."
35
@@ -199,6 +219,12 @@
36
 Deinterlacing.TopFieldFirst="Top Field First"
37
 Deinterlacing.BottomFieldFirst="Bottom Field First"
38
 
39
+# volume control accessibility text
40
+VolControl.SliderUnmuted="Volume slider for '%1': %2"
41
+VolControl.SliderMuted="Volume slider for '%1': %2 (currently muted)"
42
+VolControl.Mute="Mute '%1'"
43
+VolControl.Properties="Properties for '%1'"
44
+
45
 # add scene dialog
46
 Basic.Main.AddSceneDlg.Title="Add Scene"
47
 Basic.Main.AddSceneDlg.Text="Please enter the name of the scene"
48
@@ -401,8 +427,10 @@
49
 Basic.Settings.General="General"
50
 Basic.Settings.General.Theme="Theme"
51
 Basic.Settings.General.Language="Language"
52
+Basic.Settings.General.EnableAutoUpdates="Automatically check for updates on startup"
53
 Basic.Settings.General.WarnBeforeStartingStream="Show confirmation dialog when starting streams"
54
 Basic.Settings.General.WarnBeforeStoppingStream="Show confirmation dialog when stopping streams"
55
+Basic.Settings.General.Projectors="Projectors"
56
 Basic.Settings.General.HideProjectorCursor="Hide cursor over projectors"
57
 Basic.Settings.General.ProjectorAlwaysOnTop="Make projectors always on top"
58
 Basic.Settings.General.Snapping="Source Alignment Snapping"
59
@@ -412,8 +440,12 @@
60
 Basic.Settings.General.SnapDistance="Snap Sensitivity"
61
 Basic.Settings.General.RecordWhenStreaming="Automatically record when streaming"
62
 Basic.Settings.General.KeepRecordingWhenStreamStops="Keep recording when stream stops"
63
-Basic.Settings.General.SysTrayEnabled="Enable system tray icon"
64
+Basic.Settings.General.ReplayBufferWhileStreaming="Automatically start replay buffer when streaming"
65
+Basic.Settings.General.KeepReplayBufferStreamStops="Keep replay buffer active when stream stops"
66
+Basic.Settings.General.SysTray="System Tray"
67
 Basic.Settings.General.SysTrayWhenStarted="Minimize to system tray when started"
68
+Basic.Settings.General.SystemTrayHideMinimize="Always minimize to system tray instead of task bar"
69
+Basic.Settings.General.SaveProjectors="Save projectors on exit"
70
 
71
 # basic mode 'stream' settings
72
 Basic.Settings.Stream="Stream"
73
@@ -506,12 +538,14 @@
74
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="Audio Encoder"
75
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Audio Encoder Settings (if any)"
76
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxer Settings (if any)"
77
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Keyframe interval (frames)"
78
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Show all codecs (even if potentially incompatible)"
79
 
80
 # basic mode 'output' settings - advanced section - recording subsection - completer
81
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
82
 
83
 # basic mode 'output' settings - advanced section - recording subsection - TT
84
-FilenameFormatting.TT="%CCYY       Year, four digits\n%YY      Year, last two digits (00-99)\n%MM      Month as a decimal number (01-12)\n%DD      Day of the month, zero-padded (01-31)\n%hh      Hour in 24h format (00-23)\n%mm     Minute (00-59)\n%ss     Second (00-61)\n%%      A % sign\n%a        Abbreviated weekday name\n%A        Full weekday name\n%b       Abbreviated month name\n%B      Full month name\n%d     Day of the month, zero-padded (01-31)\n%H       Hour in 24h format (00-23)\n%I      Hour in 12h format (01-12)\n%m      Month as a decimal number (01-12)\n%M       Minute (00-59)\n%p      AM or PM designation\n%S        Second (00-61)\n%y      Year, last two digits (00-99)\n%Y       Year\n%z        ISO 8601 offset from UTC or timezone\n      name or abbreviation\n%Z        Timezone name or abbreviation\n"
85
+FilenameFormatting.TT="%CCYY   Year, four digits\n%YY      Year, last two digits (00-99)\n%MM      Month as a decimal number (01-12)\n%DD      Day of the month, zero-padded (01-31)\n%hh      Hour in 24h format (00-23)\n%mm     Minute (00-59)\n%ss     Second (00-61)\n%%      A % sign\n%a        Abbreviated weekday name\n%A        Full weekday name\n%b       Abbreviated month name\n%B      Full month name\n%d     Day of the month, zero-padded (01-31)\n%H       Hour in 24h format (00-23)\n%I      Hour in 12h format (01-12)\n%m      Month as a decimal number (01-12)\n%M       Minute (00-59)\n%p      AM or PM designation\n%S        Second (00-61)\n%y      Year, last two digits (00-99)\n%Y       Year\n%z        ISO 8601 offset from UTC or timezone\n      name or abbreviation\n%Z        Timezone name or abbreviation\n"
86
 
87
 # basic mode 'video' settings
88
 Basic.Settings.Video="Video"
89
@@ -565,12 +599,16 @@
90
 Basic.Settings.Advanced.Video.ColorRange="YUV Color Range"
91
 Basic.Settings.Advanced.Video.ColorRange.Partial="Partial"
92
 Basic.Settings.Advanced.Video.ColorRange.Full="Full"
93
+Basic.Settings.Advanced.Audio.MonitoringDevice="Audio Monitoring Device"
94
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Default"
95
 Basic.Settings.Advanced.StreamDelay="Stream Delay"
96
 Basic.Settings.Advanced.StreamDelay.Duration="Duration (seconds)"
97
 Basic.Settings.Advanced.StreamDelay.Preserve="Preserve cutoff point (increase delay) when reconnecting"
98
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Estimated Memory Usage: %1 MB"
99
 Basic.Settings.Advanced.Network="Network"
100
 Basic.Settings.Advanced.Network.BindToIP="Bind to IP"
101
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Enable new networking code"
102
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Low latency mode"
103
 
104
 # advanced audio properties
105
 Basic.AdvAudio="Advanced Audio Properties"
106
@@ -579,6 +617,10 @@
107
 Basic.AdvAudio.Mono="Downmix to Mono"
108
 Basic.AdvAudio.Panning="Panning"
109
 Basic.AdvAudio.SyncOffset="Sync Offset (ms)"
110
+Basic.AdvAudio.Monitoring="Audio Monitoring"
111
+Basic.AdvAudio.Monitoring.None="Monitor Off"
112
+Basic.AdvAudio.Monitoring.MonitorOnly="Monitor Only (mute output)"
113
+Basic.AdvAudio.Monitoring.Both="Monitor and Output"
114
 Basic.AdvAudio.AudioTracks="Tracks"
115
 
116
 # basic mode 'hotkeys' settings
117
@@ -645,3 +687,4 @@
118
 # Output warnings
119
 OutputWarnings.NoTracksSelected="You must select at least one track"
120
 OutputWarnings.MultiTrackRecording="Warning: Certain formats (such as FLV) do not support multiple tracks per recording"
121
+OutputWarnings.MP4Recording="Warning: Recordings saved to MP4 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 after it is finished (File->Remux Recordings)"
122
obs-studio-17.0.2.tar.xz/UI/data/locale/es-ES.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/es-ES.ini Changed
113
 
1
@@ -57,6 +57,19 @@
2
 Import="Importar"
3
 Export="Exportar"
4
 
5
+Updater.Title="Nueva actualización disponible"
6
+Updater.Text="Hay una nueva versión disponible:"
7
+Updater.UpdateNow="Actualizar ahora"
8
+Updater.RemindMeLater="Recordármelo más tarde"
9
+Updater.Skip="Saltar Versión"
10
+Updater.Running.Title="Programa actualmente activo"
11
+Updater.Running.Text="Las salidas están activas actualmente, por favor apague cualquier salida activa antes de intentar actualizar"
12
+Updater.NoUpdatesAvailable.Title="No hay actualizaciones disponibles"
13
+Updater.NoUpdatesAvailable.Text="No hay actualizaciones disponibles actualmente"
14
+Updater.FailedToLaunch="No se pudo iniciar el actualizador"
15
+Updater.GameCaptureActive.Title="Captura de juego activa"
16
+Updater.GameCaptureActive.Text="La libreria de captura de juegos esta actualmente en uso. Por favor, cierra cualquier juego/programa que este siendo capturado (o reinicia windows) e intentalo de nuevo."
17
+
18
 QuickTransitions.SwapScenes="Cambiar vista previa y salida escenas después de la transición"
19
 QuickTransitions.SwapScenesTT="Cambia la vista previa y salida escenas después de la transición (si todavía existe la escena original de la salida). \nEsto no deshará cualquier cambio que pueda haber hecho a la escena original de la salida."
20
 QuickTransitions.DuplicateScene="Duplicar escena"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="¿Seguro que desea eliminar '$1'?"
23
 ConfirmRemove.TextMultiple="¿Seguro que quieres eliminar %1 elementos?"
24
 
25
+Output.StartStreamFailed="No se pudo iniciar la emisión"
26
+Output.StartRecordingFailed="No se pudo iniciar grabación"
27
+Output.StartReplayFailed="No se pudo iniciar el buffer de replay"
28
+Output.StartFailedGeneric="No se pudo iniciar la salida. Por favor compruebe los logs para mas detalles. \n\nNota: Si estas usando los codificadores de NVENC o AMD, asegúrate que tus drivers de vídeo están actualizados."
29
+
30
 Output.ConnectFail.Title="Error al conectarse"
31
 Output.ConnectFail.BadPath="URL ruta de acceso o conexión no válida.  Por favor, compruebe su configuración para confirmar que está correcta."
32
 Output.ConnectFail.ConnectFailed="No se pudo conectar al servidor"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="Campo Superior Primero"
35
 Deinterlacing.BottomFieldFirst="Campo Inferior Primero"
36
 
37
+VolControl.SliderUnmuted="Deslizador de volumen para '%1': %2"
38
+VolControl.SliderMuted="Deslizador de volumen para '%1': %2 (silenciado)"
39
+VolControl.Mute="Silenciar '%1'"
40
+VolControl.Properties="Propiedades para '%1'"
41
+
42
 Basic.Main.AddSceneDlg.Title="Añadir escena"
43
 Basic.Main.AddSceneDlg.Text="Por favor, introduzca el nombre de la escena"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="General"
47
 Basic.Settings.General.Theme="Tema"
48
 Basic.Settings.General.Language="Idioma"
49
+Basic.Settings.General.EnableAutoUpdates="Comprobar actualizaciones automáticamente al inicio"
50
 Basic.Settings.General.WarnBeforeStartingStream="Mostrar diálogo de confirmación cuando se inicia una transmisión"
51
 Basic.Settings.General.WarnBeforeStoppingStream="Mostrar diálogo de confirmación cuando se para una transmisión"
52
+Basic.Settings.General.Projectors="Proyectores"
53
 Basic.Settings.General.HideProjectorCursor="Ocultar el cursor sobre proyectores"
54
 Basic.Settings.General.ProjectorAlwaysOnTop="Proyectores siempre en la parte superior"
55
 Basic.Settings.General.Snapping="Ajuste de alineación de la fuente"
56
@@ -362,8 +387,12 @@
57
 Basic.Settings.General.SnapDistance="Ajustar la sensibilidad"
58
 Basic.Settings.General.RecordWhenStreaming="Grabar automáticamente cuando se transmite"
59
 Basic.Settings.General.KeepRecordingWhenStreamStops="Mantener la grabación cuando se detiene la trasmision"
60
-Basic.Settings.General.SysTrayEnabled="Activar icono en la bandeja del sistema"
61
+Basic.Settings.General.ReplayBufferWhileStreaming="Iniciar la reproducción del búfer automáticamente durante la transmisión"
62
+Basic.Settings.General.KeepReplayBufferStreamStops="Mantener activo el búfer de reproducción cuando la transmisión se detenga"
63
+Basic.Settings.General.SysTray="Bandeja del sistema"
64
 Basic.Settings.General.SysTrayWhenStarted="Minimizar a la bandeja del sistema al iniciar"
65
+Basic.Settings.General.SystemTrayHideMinimize="Minimizar siempre en la bandeja del sistema en lugar de la barra de tareas"
66
+Basic.Settings.General.SaveProjectors="Guardar los proyectores al salir"
67
 
68
 Basic.Settings.Stream="Emision"
69
 Basic.Settings.Stream.StreamType="Tipo de Emision"
70
@@ -452,6 +481,8 @@
71
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="Codificador de audio"
72
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Configuración de codificador de vídeo (si existe)"
73
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Ajustes de Muxer (en caso de que haya)"
74
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Intervalo de fotogramas clave (en Fotogramas)"
75
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Mostrar todos los codecs (aunque sean potencialmente incompatibles)"
76
 
77
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
78
 
79
@@ -505,12 +536,16 @@
80
 Basic.Settings.Advanced.Video.ColorRange="Gama de Color YUV"
81
 Basic.Settings.Advanced.Video.ColorRange.Partial="Parcial"
82
 Basic.Settings.Advanced.Video.ColorRange.Full="Completo"
83
+Basic.Settings.Advanced.Audio.MonitoringDevice="Dispositivo de monitorización de audio"
84
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Por defecto"
85
 Basic.Settings.Advanced.StreamDelay="Retraso de la transmisión"
86
 Basic.Settings.Advanced.StreamDelay.Duration="Duración (segundos)"
87
 Basic.Settings.Advanced.StreamDelay.Preserve="Preservar el punto de corte (aumento de retraso) al volver a conectar"
88
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Uso estimado de memoria: %1 MB"
89
 Basic.Settings.Advanced.Network="Red"
90
 Basic.Settings.Advanced.Network.BindToIP="Enlazar con IP"
91
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Habilitar el nuevo código de red"
92
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Modo de baja latencia"
93
 
94
 Basic.AdvAudio="Propiedades de Audio avanzadas"
95
 Basic.AdvAudio.Name="Nombre"
96
@@ -518,6 +553,10 @@
97
 Basic.AdvAudio.Mono="Remezclar a Mono"
98
 Basic.AdvAudio.Panning="Panorámica"
99
 Basic.AdvAudio.SyncOffset="Sincronización Offset (ms)"
100
+Basic.AdvAudio.Monitoring="Monitorización de audio"
101
+Basic.AdvAudio.Monitoring.None="Monitorización desactivada"
102
+Basic.AdvAudio.Monitoring.MonitorOnly="Solo monitorización (silenciar la salida)"
103
+Basic.AdvAudio.Monitoring.Both="Monitorización y salida"
104
 Basic.AdvAudio.AudioTracks="Pistas"
105
 
106
 Basic.Settings.Hotkeys="Atajos"
107
@@ -576,4 +615,5 @@
108
 
109
 OutputWarnings.NoTracksSelected="Debe seleccionar al menos una pista"
110
 OutputWarnings.MultiTrackRecording="ADVERTENCIA: Ciertos formatos (como FLV) no admiten varias pistas por grabación"
111
+OutputWarnings.MP4Recording="ADVERTENCIA: Las grabaciones guardadas en MP4 será irrecuperables si el archivo no puede finalizarse (e.g. como resultado de BSODs, pérdidas de potencia, etcetera). Si quieres grabar varias pistas de audio utiliza MKV y reune la grabación a mp4 después de que termine (archivo-> Remux de grabaciones)"
112
 
113
obs-studio-17.0.2.tar.xz/UI/data/locale/et-EE.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/et-EE.ini Changed
25
 
1
@@ -49,6 +49,7 @@
2
 Top="Ülalt"
3
 Bottom="Alt"
4
 
5
+
6
 QuickTransitions.SwapScenes="Vaheta üleminekul eelvaade ja väljund"
7
 QuickTransitions.SwapScenesTT="Vahetab pärast üleminekut eelvaate ja väljundi stseenid (kui väljundi esialgne stseen on veel olemas).\nEsialgsele stseenile tehtud muudatusi ei pöörata tagasi."
8
 QuickTransitions.DuplicateScene="Tee stseenist koopia"
9
@@ -85,6 +86,7 @@
10
 ConfirmRemove.Title="Ümbernimetamise kinnitamine"
11
 ConfirmRemove.Text="Kas soovid kindlasti eemaldada '$1'?"
12
 
13
+
14
 Output.ConnectFail.Title="Ühendamine ei õnnestunud"
15
 Output.ConnectFail.BadPath="Vigane rada või ühenduse URL. Palun veendu, et valitud sätted on õiged."
16
 Output.ConnectFail.ConnectFailed="Serveriga ühendamine ebaõnnestus"
17
@@ -120,6 +122,7 @@
18
 
19
 
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Stseeni lisamine"
23
 Basic.Main.AddSceneDlg.Text="Sisesta stseeni nimi"
24
 
25
obs-studio-17.0.2.tar.xz/UI/data/locale/eu-ES.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/eu-ES.ini Changed
114
 
1
@@ -57,6 +57,19 @@
2
 Import="Inportatu"
3
 Export="Esportatu"
4
 
5
+Updater.Title="Eguneraketa berria eskuragarri"
6
+Updater.Text="Eguneraketa berri bat eskuragarri dago:"
7
+Updater.UpdateNow="Eguneratu orain"
8
+Updater.RemindMeLater="Gogoratu geroago"
9
+Updater.Skip="Baztertu bertsioa"
10
+Updater.Running.Title="Uneko programa aktiboa"
11
+Updater.Running.Text="Une honetan irteerak aktibo daude, itzali aktibo dauden irteerak eguneratzen saiatu aurretik"
12
+Updater.NoUpdatesAvailable.Title="Ez dago eguneraketarik eskuragarri"
13
+Updater.NoUpdatesAvailable.Text="Une honetan ez dago eguneraketarik eskuragarri"
14
+Updater.FailedToLaunch="Huts egin du eguneratzailea abiarazten"
15
+Updater.GameCaptureActive.Title="Jolasen kaptura aktiboa"
16
+Updater.GameCaptureActive.Text="Jolasen kapturaren liburutegia erabiltzen ari da. Itxi kapturatzen ari den  jolasa/programa (edo berrabiarazi Windows) eta saiatu berriro."
17
+
18
 QuickTransitions.SwapScenes="Trukatu Aurrebista/Irteera-eszenak trantsizioen ondoren"
19
 QuickTransitions.SwapScenesTT="Trukatu aurrebistak eta irteera-eszenak trantsizioen ondoren (baldin eta irteerakoaren jatorrizkoa eszena badago).\n Honek ez du desegingo irteerakoaren jatorrizko eszenari egindako aldaketak."
20
 QuickTransitions.DuplicateScene="Bikoiztu eszena"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="Ziur zaude '$1' kendu nahi duzula?"
23
 ConfirmRemove.TextMultiple="Seguru zaude %1 elementuak ezabatu nahi dituzula?"
24
 
25
+Output.StartStreamFailed="Huts egin du transmisioak"
26
+Output.StartRecordingFailed="Huts egin du grabazioak"
27
+Output.StartReplayFailed="Huts egin du erreprodukzio bufferrak"
28
+Output.StartFailedGeneric="Huts egin du irteeraren abioak. Begiratu erregistroa zehaztasunak ikusteko.\n\nOharra: NVENC edo AMD kodetzaileak erabiltzen ari bazara segurtatu haien kontrolatzaileak eguneratuta daudela."
29
+
30
 Output.ConnectFail.Title="Huts egin du konektatzean"
31
 Output.ConnectFail.BadPath="Helburu edo konexio-URL okerra. Egiaztatu zure ezarpenak baliozkoak direla baieztatzeko."
32
 Output.ConnectFail.ConnectFailed="Huts egin du zerbitzariarekin konektatzean"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="Goiko eremua lehenik"
35
 Deinterlacing.BottomFieldFirst="Beheko eremua lehenik"
36
 
37
+VolControl.SliderUnmuted="Bolumen graduatzailea '%1'-rentzat: %2"
38
+VolControl.SliderMuted="Bolumen graduatzailea '%1'-rentzat: %2 (une honetan mutu)"
39
+VolControl.Mute="Mututu '%1'"
40
+VolControl.Properties="'%1'-ren ezaugarriak"
41
+
42
 Basic.Main.AddSceneDlg.Title="Gehitu eszena"
43
 Basic.Main.AddSceneDlg.Text="Sartu eszenaren izena"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="Orokorra"
47
 Basic.Settings.General.Theme="Gaia"
48
 Basic.Settings.General.Language="Hizkuntza"
49
+Basic.Settings.General.EnableAutoUpdates="Abiaraztean begiratu automatikoki eguneraketarik ba ote dagoen"
50
 Basic.Settings.General.WarnBeforeStartingStream="Erakutsi baieztapen elkarrizketa transmisioak hasterakoan"
51
-Basic.Settings.General.WarnBeforeStoppingStream="Erakutsi baieztapen elkarrizketa transmisioak gelditzerakoan"
52
+Basic.Settings.General.WarnBeforeStoppingStream="Erakutsi baieztapen elkarrizketa transmisioak gelditzean"
53
+Basic.Settings.General.Projectors="Projektoreak"
54
 Basic.Settings.General.HideProjectorCursor="Ezkutatu kurtsorea proiekzioetan"
55
 Basic.Settings.General.ProjectorAlwaysOnTop="Proiektoreak beti gainean"
56
 Basic.Settings.General.Snapping="Iturburuaren lerrokatzearen doitzea"
57
@@ -362,8 +387,12 @@
58
 Basic.Settings.General.SnapDistance="Doitu sentikortasuna"
59
 Basic.Settings.General.RecordWhenStreaming="Grabatu automatikoki transmisioa egitean"
60
 Basic.Settings.General.KeepRecordingWhenStreamStops="Mantendu grabazioa transmisioa gelditzean"
61
-Basic.Settings.General.SysTrayEnabled="Gaitu sistemaren erretiluko ikonoa"
62
+Basic.Settings.General.ReplayBufferWhileStreaming="Hasi erreprodukzio bufferra automatikoki transmititzean"
63
+Basic.Settings.General.KeepReplayBufferStreamStops="Mantendu erreprodukzio bufferra aktiboa transmisioa gelditzean"
64
+Basic.Settings.General.SysTray="Sistemaren erretilua"
65
 Basic.Settings.General.SysTrayWhenStarted="Minimizatu sistemaren erretilura hastean"
66
+Basic.Settings.General.SystemTrayHideMinimize="Minimizatu beti sistemaren erretilura ataza barrara egin ordez"
67
+Basic.Settings.General.SaveProjectors="Gorde proiekzioak irtetean"
68
 
69
 Basic.Settings.Stream="Transmisioa"
70
 Basic.Settings.Stream.StreamType="Transmisio-mota"
71
@@ -452,6 +481,8 @@
72
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="Audio kodetzailea"
73
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Audio kodetzailearen ezarpenak (egonez gero)"
74
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Bihurtzailearen ezarpenak (egonez gero)"
75
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Gako-fotogramen tartea (fotogramak)"
76
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Erakutsi kodek guztiak (bateragarriak ez balira ere)"
77
 
78
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
79
 
80
@@ -505,12 +536,16 @@
81
 Basic.Settings.Advanced.Video.ColorRange="YUV kolore-barrutia"
82
 Basic.Settings.Advanced.Video.ColorRange.Partial="Partziala"
83
 Basic.Settings.Advanced.Video.ColorRange.Full="Osoa"
84
+Basic.Settings.Advanced.Audio.MonitoringDevice="Audioa kontrolatzeko gailua"
85
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Lehenetsia"
86
 Basic.Settings.Advanced.StreamDelay="Taansmisio-atzerapena"
87
 Basic.Settings.Advanced.StreamDelay.Duration="Iraupena (segundoak)"
88
 Basic.Settings.Advanced.StreamDelay.Preserve="Mantendu ebaketa puntua (handitu atzerapena) birkonektatzean"
89
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Estimatutako memoria erabilpena: %1 MB"
90
 Basic.Settings.Advanced.Network="Sarea"
91
 Basic.Settings.Advanced.Network.BindToIP="IP bidez lotu"
92
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Gaitu sare kode berria"
93
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Latentzia txikiko modua"
94
 
95
 Basic.AdvAudio="Audio propietate aurreratuak"
96
 Basic.AdvAudio.Name="Izena"
97
@@ -518,6 +553,10 @@
98
 Basic.AdvAudio.Mono="Nahasketa monora murriztu"
99
 Basic.AdvAudio.Panning="Panoramika"
100
 Basic.AdvAudio.SyncOffset="Sinkronizazioaren desplazamendua (ms)"
101
+Basic.AdvAudio.Monitoring="Adioaren kontrola"
102
+Basic.AdvAudio.Monitoring.None="Audioa itzalita"
103
+Basic.AdvAudio.Monitoring.MonitorOnly="Kontrola bakarrik (irteera mututua)"
104
+Basic.AdvAudio.Monitoring.Both="Kontrola eta irteera"
105
 Basic.AdvAudio.AudioTracks="Pistak"
106
 
107
 Basic.Settings.Hotkeys="Laster-teklak"
108
@@ -576,4 +615,5 @@
109
 
110
 OutputWarnings.NoTracksSelected="Gutxienez pista bat hautatu behar duzu"
111
 OutputWarnings.MultiTrackRecording="Oharra: Zenbait formatuk (esaterako FLV-k) ez ditu pista anitzak onartzen grabazioan"
112
+OutputWarnings.MP4Recording="Kontuz: MP4 formatuz gordetako grabazioak izan daitezke berreskuraezinak fitxategia ezin bada bukatu (esate baterako energia etenagatik). Hainbat audio pista grabatu nahi baduzu erabil dezakezu MKV formatua eta mp4 bihurtu grabazioa bukatu ondoren (Fitxategia->Bihurtu grabazioak)"
113
 
114
obs-studio-17.0.2.tar.xz/UI/data/locale/fi-FI.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/fi-FI.ini Changed
113
 
1
@@ -57,6 +57,19 @@
2
 Import="Tuo"
3
 Export="Vie"
4
 
5
+Updater.Title="Uusi päivitys on saatavilla"
6
+Updater.Text="Uusi päivitys on saatavilla:"
7
+Updater.UpdateNow="Päivitä nyt"
8
+Updater.RemindMeLater="Muistuta myöhemmin"
9
+Updater.Skip="Ohita versio"
10
+Updater.Running.Title="Ohjelma on käytössä"
11
+Updater.Running.Text="Tallentaminen/lähetys on aktiivinen. Sulje kaikki ulostulo ennen päivityksen jatkamista"
12
+Updater.NoUpdatesAvailable.Title="Päivityksiä ei ole saatavilla"
13
+Updater.NoUpdatesAvailable.Text="Päivityksiä ei ole tällä hetkellä saatavilla"
14
+Updater.FailedToLaunch="Päivittäjän käynnistäminen epäonnistui"
15
+Updater.GameCaptureActive.Title="Game capture on aktiivinen"
16
+Updater.GameCaptureActive.Text="Game capture -kirjasto on yhä käytössä. Sulje kaikki pelit/ohjelmat, joita on kaapattu tai käynnistä tietokone uudelleen."
17
+
18
 QuickTransitions.SwapScenes="Vaihda esikatselu- ja ulostulo-skenet siirtymän jälkeen"
19
 QuickTransitions.SwapScenesTT="Vaihda esikatselu- ja ulostulo-skenet siirtymän jälkeen (jos ulostulon alkuperäinen skene on yhä olemassa).\nTämä ei peruuta muutoksia joita on tehty alkuperäiseen skeneen."
20
 QuickTransitions.DuplicateScene="Kahdenna skene"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="Haluatko varmasti poistaa '$1'?"
23
 ConfirmRemove.TextMultiple="Haluatko varmasti poistaa %1 kohdetta?"
24
 
25
+Output.StartStreamFailed="Lähetyksen aloittaminen epäonnistui"
26
+Output.StartRecordingFailed="Tallennuksen aloittaminen epäonnistui"
27
+Output.StartReplayFailed="Toistopuskurin käynnistäminen epäonnistui"
28
+Output.StartFailedGeneric="Ulostulon käynnistäminen epäonnistui. Tarkista loki lisätietoja varten.\n\nHuomio: Jos käytät NVENC tai AMD -enkoodereita, varmista, että näytönohjaimen ajurit on päivitetty ajantasalle."
29
+
30
 Output.ConnectFail.Title="Yhdistäminen epäonnistui"
31
 Output.ConnectFail.BadPath="Viallinen polku tai yhteysosoite.  Tarkista, että asetuksesi ovat kunnossa."
32
 Output.ConnectFail.ConnectFailed="Palvelimelle yhdistäminen epäonnistui"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="Ylin kenttä ensin"
35
 Deinterlacing.BottomFieldFirst="Alin kenttä ensin"
36
 
37
+VolControl.SliderUnmuted="Äänenvoimakkuus \"%1\": %2"
38
+VolControl.SliderMuted="Äänenvoimakkuus \"%1\": %2 (mykistetty)"
39
+VolControl.Mute="Mykistä %1"
40
+VolControl.Properties="Ominaisuudet %1:lle"
41
+
42
 Basic.Main.AddSceneDlg.Title="Lisää skene"
43
 Basic.Main.AddSceneDlg.Text="Aseta skenen nimi"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="Yleiset"
47
 Basic.Settings.General.Theme="Teema"
48
 Basic.Settings.General.Language="Kieli"
49
+Basic.Settings.General.EnableAutoUpdates="Tarkista päivitykset automaattisesti käynnistäessä"
50
 Basic.Settings.General.WarnBeforeStartingStream="Näytä varmistus-ikkuna kun lähetys aloitetaan"
51
 Basic.Settings.General.WarnBeforeStoppingStream="Näytä varmistus-ikkuna kun lähetys pysäytetään"
52
+Basic.Settings.General.Projectors="Peilaukset"
53
 Basic.Settings.General.HideProjectorCursor="Piilota osoitin peilattaessa"
54
 Basic.Settings.General.ProjectorAlwaysOnTop="Pidä peilatut esikatselut aina päällimmäisenä"
55
 Basic.Settings.General.Snapping="Lähteiden kiinnitys"
56
@@ -362,8 +387,12 @@
57
 Basic.Settings.General.SnapDistance="Kiinnityksen herkkyys"
58
 Basic.Settings.General.RecordWhenStreaming="Tallenna automaattisesti kun lähetetään"
59
 Basic.Settings.General.KeepRecordingWhenStreamStops="Jatka tallennusta lähetyksen loputtua"
60
-Basic.Settings.General.SysTrayEnabled="Ota järjestelmäkuvake käyttöön"
61
+Basic.Settings.General.ReplayBufferWhileStreaming="Käynnistä toistopuskuri automaattisesti lähetettäessä"
62
+Basic.Settings.General.KeepReplayBufferStreamStops="Pidä toistopuskuri käytössä kun lähetys loppuu"
63
+Basic.Settings.General.SysTray="Ilmaisinalue"
64
 Basic.Settings.General.SysTrayWhenStarted="Pienennä ilmaisinalueelle käynnistyessä"
65
+Basic.Settings.General.SystemTrayHideMinimize="Pienennä aina tilapalkkiin tehtäväpalkin sijaan"
66
+Basic.Settings.General.SaveProjectors="Tallenna peilaus poistuessa"
67
 
68
 Basic.Settings.Stream="Lähetys"
69
 Basic.Settings.Stream.StreamType="Lähetystyyppi"
70
@@ -452,6 +481,8 @@
71
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="Äänienkooderi"
72
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Äänienkooderin asetukset"
73
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muunnon asetukset"
74
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Keyframe-väli (frameina)"
75
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Näytä kaikki koodekit (myös mahdollisesti yhteensopimattomat)"
76
 
77
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
78
 
79
@@ -505,12 +536,16 @@
80
 Basic.Settings.Advanced.Video.ColorRange="YUV värialue"
81
 Basic.Settings.Advanced.Video.ColorRange.Partial="Osittainen"
82
 Basic.Settings.Advanced.Video.ColorRange.Full="Täysi"
83
+Basic.Settings.Advanced.Audio.MonitoringDevice="Äänen monitorointilaite"
84
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Oletusarvo"
85
 Basic.Settings.Advanced.StreamDelay="Lähetyksen viive"
86
 Basic.Settings.Advanced.StreamDelay.Duration="Kesto (sekunteina)"
87
 Basic.Settings.Advanced.StreamDelay.Preserve="Säilytä katkaisupiste (lisää viivettä) uudelleenyhdistettäessä"
88
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Arvioitu muistinkäyttö: %1 MB"
89
 Basic.Settings.Advanced.Network="Verkko"
90
 Basic.Settings.Advanced.Network.BindToIP="Liitä IP:seen"
91
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Käytä uutta verkkokoodia"
92
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Alhaisen latenssin tila"
93
 
94
 Basic.AdvAudio="Äänen lisäominaisuudet"
95
 Basic.AdvAudio.Name="Nimi"
96
@@ -518,6 +553,10 @@
97
 Basic.AdvAudio.Mono="Miksaa yksikanavaiseksi"
98
 Basic.AdvAudio.Panning="Balanssi"
99
 Basic.AdvAudio.SyncOffset="Synkronoinnin viivästys (ms)"
100
+Basic.AdvAudio.Monitoring="Äänen monitorointi"
101
+Basic.AdvAudio.Monitoring.None="Monitorointi pois"
102
+Basic.AdvAudio.Monitoring.MonitorOnly="Vain monitorointi (hiljennä ulostulo)"
103
+Basic.AdvAudio.Monitoring.Both="Monitorointi ja ulostulo"
104
 Basic.AdvAudio.AudioTracks="Raidat"
105
 
106
 Basic.Settings.Hotkeys="Pikanäppäimet"
107
@@ -576,4 +615,5 @@
108
 
109
 OutputWarnings.NoTracksSelected="Sinun täytyy valita ainakin yksi raita"
110
 OutputWarnings.MultiTrackRecording="Varoitus: Jotkin muodot (kuten FLV), eivät tue useampaa raitaa per tallennus"
111
+OutputWarnings.MP4Recording="Varoitus: MP4-muotoon tallentaessa tiedostoista tulee lukukelvottomia, mikäli niitä ei voi viimeistellä. (esim. johtuen BSOD:sta, sähkökatkosta jne.) Jos haluat tallentaa useampaa ääniraitaa, kannattaa käyttää MKV-muotoa ja muuntaa jälkikäteen MP4:ksi. (Tiedosto->Muunna tallenne)"
112
 
113
obs-studio-17.0.2.tar.xz/UI/data/locale/fr-FR.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/fr-FR.ini Changed
107
 
1
@@ -57,6 +57,19 @@
2
 Import="Importer"
3
 Export="Exporter"
4
 
5
+Updater.Title="Nouvelle mise à jour disponible"
6
+Updater.Text="Une nouvelle mise à jour est disponible :"
7
+Updater.UpdateNow="Mettre à jour maintenant"
8
+Updater.RemindMeLater="Me le rappeler ultérieurement"
9
+Updater.Skip="Ignorer la version"
10
+Updater.Running.Title="Programme actuellement en cours d’exécution"
11
+Updater.Running.Text="Des sorties sont actuellement actives, veuillez fermer toutes les sorties actives avant d'essayer de mettre à jour"
12
+Updater.NoUpdatesAvailable.Title="Aucune mise à jour disponible"
13
+Updater.NoUpdatesAvailable.Text="Aucune mise à jour n’est actuellement disponible"
14
+Updater.FailedToLaunch="Impossible de démarrer la mise à jour"
15
+Updater.GameCaptureActive.Title="Capture de jeu active"
16
+Updater.GameCaptureActive.Text="La bibliothèque « hook » de capture de jeu est actuellement active. Veuillez fermer tous les jeux/programmes en cours de capture (ou redémarrez Windows) et réessayez."
17
+
18
 QuickTransitions.SwapScenes="Permuter les scènes d'aperçu et de sortie après la transition"
19
 QuickTransitions.SwapScenesTT="Permute les scènes d'aperçu et de sortie après la transition (si la scène d'origine de la sortie existe toujours). \nCela n'annulera pas les modifications qui auront pu être faites sur la scène d'origine de la sortie."
20
 QuickTransitions.DuplicateScene="Dupliquer la scène"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="Êtes-vous sûr de vouloir supprimer « $1 » ?"
23
 ConfirmRemove.TextMultiple="Voulez-vous vraiment supprimer %1 éléments ?"
24
 
25
+Output.StartStreamFailed="Impossible de démarrer le streaming"
26
+Output.StartRecordingFailed="Impossible de démarrer l'enregistrement"
27
+Output.StartReplayFailed="Impossible de démarrer le tampon de relecture"
28
+Output.StartFailedGeneric="Le démarrage de la sortie a échoué. Veuillez consulter le journal pour plus de détails.\n\nRemarque : si vous utilisez les encodeurs NVENC ou AMD, assurez-vous que vos pilotes vidéo soient à jour."
29
+
30
 Output.ConnectFail.Title="Échec de la connexion"
31
 Output.ConnectFail.BadPath="Adresse de connexion ou chemin invalide. Veuillez vérifier vos paramètres afin de confirmer leur validité."
32
 Output.ConnectFail.ConnectFailed="Échec de la connexion au serveur"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="Champ du haut prioritaire"
35
 Deinterlacing.BottomFieldFirst="Champ du bas prioritaire"
36
 
37
+VolControl.SliderUnmuted="Curseur de volume pour « %1 » : %2"
38
+VolControl.SliderMuted="Curseur de volume pour « %1 » : %2 (actuellement désactivé)"
39
+VolControl.Mute="Muet '%1'"
40
+VolControl.Properties="Propriétés pour '%1'"
41
+
42
 Basic.Main.AddSceneDlg.Title="Ajouter une scène"
43
 Basic.Main.AddSceneDlg.Text="Veuillez entrer le nom de la scène"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="Général"
47
 Basic.Settings.General.Theme="Thème"
48
 Basic.Settings.General.Language="Langue"
49
+Basic.Settings.General.EnableAutoUpdates="Vérifier automatiquement les mises à jour au démarrage"
50
 Basic.Settings.General.WarnBeforeStartingStream="Afficher une boîte de dialogue de confirmation au démarrage d'un stream"
51
 Basic.Settings.General.WarnBeforeStoppingStream="Afficher une boîte de dialogue de confirmation à l'arrêt d'un stream"
52
+Basic.Settings.General.Projectors="Projecteurs"
53
 Basic.Settings.General.HideProjectorCursor="Cacher le curseur sur les projecteurs"
54
 Basic.Settings.General.ProjectorAlwaysOnTop="Projecteurs toujours au premier plan"
55
 Basic.Settings.General.Snapping="Déclenchement d'alignement des sources"
56
@@ -362,8 +387,12 @@
57
 Basic.Settings.General.SnapDistance="Sensibilité du déclenchement"
58
 Basic.Settings.General.RecordWhenStreaming="Enregistrer automatiquement lors d'un stream"
59
 Basic.Settings.General.KeepRecordingWhenStreamStops="Continuer à enregistrer lorsque le stream s’arrête"
60
-Basic.Settings.General.SysTrayEnabled="Afficher une icône dans la zone de notification"
61
+Basic.Settings.General.ReplayBufferWhileStreaming="Démarrer automatiquement le tampon de relecture lors d'un stream"
62
+Basic.Settings.General.KeepReplayBufferStreamStops="Garder le tampon de relecture actif lors de l'arrêt du stream"
63
+Basic.Settings.General.SysTray="Zone de notifications"
64
 Basic.Settings.General.SysTrayWhenStarted="Réduire dans la zone de notification dès le démarrage"
65
+Basic.Settings.General.SystemTrayHideMinimize="Toujours réduire dans la zone de notification au lieu de la barre des tâches"
66
+Basic.Settings.General.SaveProjectors="Enregistrer les projecteurs en quittant"
67
 
68
 Basic.Settings.Stream="Flux"
69
 Basic.Settings.Stream.StreamType="Type de diffusion"
70
@@ -452,6 +481,8 @@
71
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="Encodeur audio"
72
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Paramètres de l'encodeur audio (le cas échéant)"
73
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Paramètres du muxer (le cas échéant)"
74
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Intervalle d'images clés (en images)"
75
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Afficher tous les codecs (même si potentiellement incompatibles)"
76
 
77
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
78
 
79
@@ -505,12 +536,16 @@
80
 Basic.Settings.Advanced.Video.ColorRange="Gamme de couleurs YUV"
81
 Basic.Settings.Advanced.Video.ColorRange.Partial="Partielle"
82
 Basic.Settings.Advanced.Video.ColorRange.Full="Complète"
83
+Basic.Settings.Advanced.Audio.MonitoringDevice="Dispositif de surveillance audio"
84
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Par défaut"
85
 Basic.Settings.Advanced.StreamDelay="Retard du stream"
86
 Basic.Settings.Advanced.StreamDelay.Duration="Durée (en secondes)"
87
 Basic.Settings.Advanced.StreamDelay.Preserve="Préserver le point de coupure (augmente le retard) lors d'une reconnexion"
88
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Utilisation estimée de la mémoire : %1 Mo"
89
 Basic.Settings.Advanced.Network="Carte réseau (adresse IP source du flux)"
90
 Basic.Settings.Advanced.Network.BindToIP="Lier à :"
91
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Activer le nouveau code réseau"
92
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Mode faible latence"
93
 
94
 Basic.AdvAudio="Propriétés audio avancées"
95
 Basic.AdvAudio.Name="Nom"
96
@@ -518,6 +553,10 @@
97
 Basic.AdvAudio.Mono="Passer en mono"
98
 Basic.AdvAudio.Panning="Panoramique polyphonique"
99
 Basic.AdvAudio.SyncOffset="Décalage de la synchronisation (ms)"
100
+Basic.AdvAudio.Monitoring="Surveillance audio"
101
+Basic.AdvAudio.Monitoring.None="Désactivé"
102
+Basic.AdvAudio.Monitoring.MonitorOnly="Surveillance uniquement (couper la sortie)"
103
+Basic.AdvAudio.Monitoring.Both="Surveillance et sortie"
104
 Basic.AdvAudio.AudioTracks="Pistes"
105
 
106
 Basic.Settings.Hotkeys="Raccourcis clavier"
107
obs-studio-17.0.2.tar.xz/UI/data/locale/gl-ES.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/gl-ES.ini Changed
25
 
1
@@ -47,6 +47,7 @@
2
 Bottom="Abaixo"
3
 
4
 
5
+
6
 Basic.AddTransition="Engadir transición configurable"
7
 Basic.RemoveTransition="Eliminar transición configurable"
8
 Basic.TransitionProperties="Propiedades da transición"
9
@@ -75,6 +76,7 @@
10
 ConfirmRemove.Title="Confirmar a eliminación"
11
 ConfirmRemove.Text="Tes a certeza de querer eliminar '$1'?"
12
 
13
+
14
 Output.ConnectFail.Title="Erro ao se conectar"
15
 Output.ConnectFail.BadPath="Camiño ou URL de conexión non válidos. Por favor, comproba a configuración para confirmar de que son correctos."
16
 Output.ConnectFail.ConnectFailed="Erro ao conectar co servidor"
17
@@ -126,6 +128,7 @@
18
 
19
 
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Engadir escena"
23
 Basic.Main.AddSceneDlg.Text="Por favor, insire un nome para a escena"
24
 
25
obs-studio-17.0.2.tar.xz/UI/data/locale/he-IL.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/he-IL.ini Changed
25
 
1
@@ -49,6 +49,7 @@
2
 Top="עליון"
3
 Bottom="תחתון"
4
 
5
+
6
 QuickTransitions.SwapScenes="החלף סצינות תצוגה מקדימה/פלט לאחר המעבר"
7
 QuickTransitions.SwapScenesTT="החלף הסצינות של התצוגה המקדימה ושל הפלט לאחר המעבר (באם הסצינה המקורית של הפלט עדיין קיימת). \n פעולה זו לא תבטל כל שינוי שייתכן ובוצע לסצינה המקורית של הפלט."
8
 QuickTransitions.DuplicateScene="הכפל סצינה"
9
@@ -89,6 +90,7 @@
10
 ConfirmRemove.Text="האם אתה בטוח שברצונך להסיר את '$1'?"
11
 ConfirmRemove.TextMultiple="האם אתה בטוח שברצונך להסיר %1 פריטים?"
12
 
13
+
14
 Output.ConnectFail.Title="ההתחברות נכשלה"
15
 Output.ConnectFail.BadPath="URL לא חוקי של נתיב או חיבור.  נא בדוק את ההגדרות שלך כדי לוודא כי הם נכונים."
16
 Output.ConnectFail.ConnectFailed="ההתחברות לשרת נכשלה"
17
@@ -163,6 +165,7 @@
18
 Deinterlacing.TopFieldFirst="שדה עליון ראשון"
19
 Deinterlacing.BottomFieldFirst="שדה תחתון ראשון"
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="הוסף סצנה"
23
 Basic.Main.AddSceneDlg.Text="אנא הזן את השם של הסצנה"
24
 
25
obs-studio-17.0.2.tar.xz/UI/data/locale/hr-HR.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/hr-HR.ini Changed
33
 
1
@@ -54,6 +54,7 @@
2
 Seconds="Sekundi"
3
 Deprecated="Prevaziđeno"
4
 
5
+
6
 QuickTransitions.SwapScenes="Zameni scene pregleda/izlaza nakon prelaza"
7
 QuickTransitions.SwapScenesTT="Zamenjuje scene pregleda i izlaza nakon prelaza (ako originalna scena izlaza još uvek postoji).\nOvo neće poništiti promene koje su načinjene nad originalnom scenom izlaza."
8
 QuickTransitions.DuplicateScene="Dupliraj scenu"
9
@@ -94,6 +95,7 @@
10
 ConfirmRemove.Text="Da li ste sigurni da želite izbaciti '$1'?"
11
 ConfirmRemove.TextMultiple="Da li ste sigurni da želite izbaciti %1 stavke?"
12
 
13
+
14
 Output.ConnectFail.Title="Neuspešno povezivanje"
15
 Output.ConnectFail.BadPath="Neispravna putanja ili URL konekcije. Molim proverite vaša podešavanja da potvrdite njihovu ispravnost."
16
 Output.ConnectFail.ConnectFailed="Neuspešno povezivanje na server"
17
@@ -168,6 +170,7 @@
18
 Deinterlacing.TopFieldFirst="Prvo gornje polje"
19
 Deinterlacing.BottomFieldFirst="Prvo donje polje"
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Dodaj scenu"
23
 Basic.Main.AddSceneDlg.Text="Molim unesite ime scene"
24
 
25
@@ -346,7 +349,6 @@
26
 Basic.Settings.General.SnapDistance="Osetljivost privlačenja"
27
 Basic.Settings.General.RecordWhenStreaming="Automatsko snimanje pri emitovanju"
28
 Basic.Settings.General.KeepRecordingWhenStreamStops="Nastavi snimati kada se emitovanje zaustavi"
29
-Basic.Settings.General.SysTrayEnabled="Omogući ikonicu u sistemskom panelu"
30
 Basic.Settings.General.SysTrayWhenStarted="Pri pokretanju minimiziraj na ikonicu u sistemskom panelu"
31
 
32
 Basic.Settings.Stream="Strim"
33
obs-studio-17.0.2.tar.xz/UI/data/locale/hu-HU.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/hu-HU.ini Changed
113
 
1
@@ -57,6 +57,19 @@
2
 Import="Importálás"
3
 Export="Exportálás"
4
 
5
+Updater.Title="Új frissítés elérhető"
6
+Updater.Text="Új frissítés elérhető:"
7
+Updater.UpdateNow="Frissítés most"
8
+Updater.RemindMeLater="Emlékeztessen később"
9
+Updater.Skip="Verzió átugrása"
10
+Updater.Running.Title="A program jelenleg aktív"
11
+Updater.Running.Text="Valamely kimenet jelenleg aktív, állítsa le az aktív kimenetet, mielőtt frissíteni próbál"
12
+Updater.NoUpdatesAvailable.Title="Nincs elérhető frissítés"
13
+Updater.NoUpdatesAvailable.Text="Jelenleg nincs elérhető frissítés"
14
+Updater.FailedToLaunch="Frissítő alkalmazás indítása sikertelen"
15
+Updater.GameCaptureActive.Title="Játék felvétel aktív"
16
+Updater.GameCaptureActive.Text="Játékfelvétel hook könyvtár jelenleg használatban. Zárjon be minden játékot/programot, amelyet felvesz (vagy indítsa újra a számítógépét) és próbálkozzon újra."
17
+
18
 QuickTransitions.SwapScenes="Előnézeti/Kimeneti Jelenetek cseréje átmenet után"
19
 QuickTransitions.SwapScenesTT="Az előnézet és a kimeneti jelenet cseréje átmenet után (ha a kimenet eredeti jelenete még létezik).\nEz nincs kihatással a kimenet eredeti jelenetére."
20
 QuickTransitions.DuplicateScene="Jelenet kettőzése"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="\"$1\" eltávolítására készül, biztos benne?"
23
 ConfirmRemove.TextMultiple="\"%1\" elem eltávolítására készül, biztos benne?"
24
 
25
+Output.StartStreamFailed="Stream indítása sikertelen"
26
+Output.StartRecordingFailed="Felvétel indítása sikertelen"
27
+Output.StartReplayFailed="Visszajátszás puffer indítása sikertelen"
28
+Output.StartFailedGeneric="Kimenet indítása sikertelen. Kérem ellenőrizze az eseménynaplóban a részleteket.\n\nMegjegyzés: NVENC vagy AMD kódoló használata esetén, győződjön meg róla, hogy az illesztőprogramok naprakészek!"
29
+
30
 Output.ConnectFail.Title="Csatlakozás sikertelen"
31
 Output.ConnectFail.BadPath="Érvénytelen elérési út vagy kapcsolati URL cím. Kérem, ellenőrizze a beállításokat és győződjön meg az érvényességükről."
32
 Output.ConnectFail.ConnectFailed="Nem sikerült kapcsolódni a szerverhez"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="Felső mező először"
35
 Deinterlacing.BottomFieldFirst="Alsó mező először"
36
 
37
+VolControl.SliderUnmuted="Hangerő csúszka a '%1'-hez: %2"
38
+VolControl.SliderMuted="Hangerő csúszka '%1'-hez: %2 (jelenleg némítva)"
39
+VolControl.Mute="Némítás '%1'"
40
+VolControl.Properties="Tulajdonságok a '%1'-hez"
41
+
42
 Basic.Main.AddSceneDlg.Title="Jelenet hozzáadása"
43
 Basic.Main.AddSceneDlg.Text="Kérem adja meg a jelenet nevét"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="Általános"
47
 Basic.Settings.General.Theme="Téma"
48
 Basic.Settings.General.Language="Nyelv"
49
+Basic.Settings.General.EnableAutoUpdates="Indításkor a frissítések automatikus ellenőrzése"
50
 Basic.Settings.General.WarnBeforeStartingStream="Megerősítő párbeszédpanel megjelenítése stream indításakor"
51
 Basic.Settings.General.WarnBeforeStoppingStream="Megerősítő párbeszédpanel megjelenítése stream leállításakor"
52
+Basic.Settings.General.Projectors="Projektorok"
53
 Basic.Settings.General.HideProjectorCursor="Projektor nézetben a kurzor elrejtése"
54
 Basic.Settings.General.ProjectorAlwaysOnTop="Projektorok mindig legfelül"
55
 Basic.Settings.General.Snapping="Forrás pozicionálásának igazítása"
56
@@ -362,8 +387,12 @@
57
 Basic.Settings.General.SnapDistance="Igazítás érzékenysége"
58
 Basic.Settings.General.RecordWhenStreaming="Automatikus felvétel stream esetén"
59
 Basic.Settings.General.KeepRecordingWhenStreamStops="Felvétel folytatása a stream leállása esetén"
60
-Basic.Settings.General.SysTrayEnabled="Tálca ikon elhelyezése"
61
+Basic.Settings.General.ReplayBufferWhileStreaming="Automatikusan induljon a visszajátszás puffer stream megkezdésekor"
62
+Basic.Settings.General.KeepReplayBufferStreamStops="Visszajátszás puffer aktívan tartása stream leállása esetén"
63
+Basic.Settings.General.SysTray="Tálca"
64
 Basic.Settings.General.SysTrayWhenStarted="Indításkor ikonként a tálcán"
65
+Basic.Settings.General.SystemTrayHideMinimize="Mindig a rendszertálcára minimalizálás tálca helyett"
66
+Basic.Settings.General.SaveProjectors="Projektorok mentése kilépéskor"
67
 
68
 Basic.Settings.Stream="Stream"
69
 Basic.Settings.Stream.StreamType="Stream típusa"
70
@@ -452,6 +481,8 @@
71
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="Audio kódoló"
72
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Audio kódoló beállítások (ha van)"
73
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxer beállítások (ha van)"
74
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Kulcsképkocka időköz (képkockák)"
75
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Minden kodek mutatása (még ha inkompatibilisek is)"
76
 
77
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
78
 
79
@@ -505,12 +536,16 @@
80
 Basic.Settings.Advanced.Video.ColorRange="YUV színtartomány"
81
 Basic.Settings.Advanced.Video.ColorRange.Partial="Részleges"
82
 Basic.Settings.Advanced.Video.ColorRange.Full="Teljes"
83
+Basic.Settings.Advanced.Audio.MonitoringDevice="Hangfigyelő eszköz"
84
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Alapértelmezett"
85
 Basic.Settings.Advanced.StreamDelay="Stream késleltetés"
86
 Basic.Settings.Advanced.StreamDelay.Duration="Időtartam (másodperc)"
87
 Basic.Settings.Advanced.StreamDelay.Preserve="Töréspont megőrzése (Késleltetés növeléssel) újrakapcsolódás esetén"
88
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Becsült memóriahasználat: %1 MB"
89
 Basic.Settings.Advanced.Network="Hálózat"
90
 Basic.Settings.Advanced.Network.BindToIP="IP-hez rendelés"
91
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Új hálózatkezelő kód engedélyezése"
92
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Alacsony késleltetésű mód"
93
 
94
 Basic.AdvAudio="Speciális hangtulajdonságok"
95
 Basic.AdvAudio.Name="Név"
96
@@ -518,6 +553,10 @@
97
 Basic.AdvAudio.Mono="Monora lekeverés"
98
 Basic.AdvAudio.Panning="Keverő"
99
 Basic.AdvAudio.SyncOffset="Szinkron eltolás (ms)"
100
+Basic.AdvAudio.Monitoring="Hangfigyelés"
101
+Basic.AdvAudio.Monitoring.None="Figyelés kikapcsolása"
102
+Basic.AdvAudio.Monitoring.MonitorOnly="Csak figyelés (kimenet némítása)"
103
+Basic.AdvAudio.Monitoring.Both="Figyelés és kimenet"
104
 Basic.AdvAudio.AudioTracks="Sávok"
105
 
106
 Basic.Settings.Hotkeys="Gyorsbillentyűk"
107
@@ -576,4 +615,5 @@
108
 
109
 OutputWarnings.NoTracksSelected="Ki kell jelölnie legalább egy sávot!"
110
 OutputWarnings.MultiTrackRecording="Figyelem: Bizonyos formátumok (mint az FLV) nem támogatják a több sávot felvételenként"
111
+OutputWarnings.MP4Recording="Figyelem: Az MP4-be mentett állományok javíthatatlanok, ha a fájl nem kerül lezárásra (pl: BSOD vagy áramkimaradás esetén, stb.). Ha mindenképpen több hangsávval kíván felvételt készíteni, akkor használja az MKV állományt és remuxolja a felvételt MP4-be, miután elkészült. (Fájl->Felvételek remuxolása)"
112
 
113
obs-studio-17.0.2.tar.xz/UI/data/locale/it-IT.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/it-IT.ini Changed
55
 
1
@@ -57,6 +57,7 @@
2
 Import="Importa"
3
 Export="Esporta"
4
 
5
+
6
 QuickTransitions.SwapScenes="Scambia scene di anteprima/uscita dopo la transizione"
7
 QuickTransitions.SwapScenesTT="Scambia le scene di uscita con quella in anteprima dopo la transizione (ammesso che la scena in uscita originale ci sia ancora).\nQuesto non modificherà eventuali cambiamenti apportati alla scena di uscita originale."
8
 QuickTransitions.DuplicateScene="Duplica scena"
9
@@ -97,6 +98,7 @@
10
 ConfirmRemove.Text="Sei sicuro di voler rimuovere '$1'?"
11
 ConfirmRemove.TextMultiple="Sei sicuro di volere rimuovere %1 elementi?"
12
 
13
+
14
 Output.ConnectFail.Title="Impossibile connettersi"
15
 Output.ConnectFail.BadPath="Percorso o URL di connessione non valido. Controlla le tue impostazioni per confermare che siano valide."
16
 Output.ConnectFail.ConnectFailed="Connessione al server fallita"
17
@@ -173,6 +175,7 @@
18
 Deinterlacing.TopFieldFirst="Priorità livello superiore"
19
 Deinterlacing.BottomFieldFirst="Priorità livello inferiore"
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Aggiungi scena"
23
 Basic.Main.AddSceneDlg.Text="Inserisci il nome della scena"
24
 
25
@@ -362,8 +365,8 @@
26
 Basic.Settings.General.SnapDistance="Sensibilità Snap"
27
 Basic.Settings.General.RecordWhenStreaming="Registra automaticamente quando si è in diretta"
28
 Basic.Settings.General.KeepRecordingWhenStreamStops="Continua a registrare quando la diretta s'interrompe"
29
-Basic.Settings.General.SysTrayEnabled="Abilita icona area di notifica"
30
 Basic.Settings.General.SysTrayWhenStarted="Minimizza all'area di notifica all'avvio"
31
+Basic.Settings.General.SystemTrayHideMinimize="Minimizza sempre nel vassoio di sistema invece che nella barra delle applicazioni"
32
 
33
 Basic.Settings.Stream="Stream"
34
 Basic.Settings.Stream.StreamType="Tipo di stream"
35
@@ -505,6 +508,8 @@
36
 Basic.Settings.Advanced.Video.ColorRange="Gamma di colore YUV"
37
 Basic.Settings.Advanced.Video.ColorRange.Partial="Parziale"
38
 Basic.Settings.Advanced.Video.ColorRange.Full="Intero"
39
+Basic.Settings.Advanced.Audio.MonitoringDevice="Dispositivo monitor audio"
40
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Predefinito"
41
 Basic.Settings.Advanced.StreamDelay="Ritardo Diretta"
42
 Basic.Settings.Advanced.StreamDelay.Duration="Durata (secondi)"
43
 Basic.Settings.Advanced.StreamDelay.Preserve="Preserva il punto di taglio (aumenta ritardo) durante la riconnessione"
44
@@ -518,6 +523,10 @@
45
 Basic.AdvAudio.Mono="Downmix to Mono"
46
 Basic.AdvAudio.Panning="Panning"
47
 Basic.AdvAudio.SyncOffset="Sync Offset (ms)"
48
+Basic.AdvAudio.Monitoring="Monitor audio"
49
+Basic.AdvAudio.Monitoring.None="Monitor spento"
50
+Basic.AdvAudio.Monitoring.MonitorOnly="Solo monitor (uscita silenziata)"
51
+Basic.AdvAudio.Monitoring.Both="Monitor e uscita"
52
 Basic.AdvAudio.AudioTracks="Tracce"
53
 
54
 Basic.Settings.Hotkeys="Tasti di scelta rapida"
55
obs-studio-17.0.2.tar.xz/UI/data/locale/ja-JP.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/ja-JP.ini Changed
113
 
1
@@ -57,6 +57,19 @@
2
 Import="インポート"
3
 Export="エクスポート"
4
 
5
+Updater.Title="利用可能な更新"
6
+Updater.Text="利用可能な更新があります:"
7
+Updater.UpdateNow="今すぐ更新"
8
+Updater.RemindMeLater="後で通知"
9
+Updater.Skip="バージョンをスキップする"
10
+Updater.Running.Title="現在アクティブなプログラム"
11
+Updater.Running.Text="出力が現在アクティブです。更新を試みる前にアクティブな出力をシャットダウンしてください。"
12
+Updater.NoUpdatesAvailable.Title="利用可能な更新はありません"
13
+Updater.NoUpdatesAvailable.Text="現在利用可能な更新はありません"
14
+Updater.FailedToLaunch="アップデータの起動に失敗しました"
15
+Updater.GameCaptureActive.Title="ゲームキャプチャがアクティブ"
16
+Updater.GameCaptureActive.Text="ゲームキャプチャフックライブラリが現在使用中です。キャプチャされているすべてのゲーム/プログラムを閉じて (またはwindowsを再起動して) からもう一度やり直してください。"
17
+
18
 QuickTransitions.SwapScenes="トランジション後にプレビュー/出力シーンを入れ替え"
19
 QuickTransitions.SwapScenesTT="(出力のオリジナルシーンがまだ存在する場合)、トランジション後のプレビューと出力シーンを入れ替えます。\nこれは出力のオリジナルシーンに加えられた可能性があるすべての変更を元に戻しません。"
20
 QuickTransitions.DuplicateScene="シーン複製"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="'$1' を削除してもよろしいですか?"
23
 ConfirmRemove.TextMultiple="選択した %1 項目を削除してもよろしいですか?"
24
 
25
+Output.StartStreamFailed="配信開始に失敗しました"
26
+Output.StartRecordingFailed="録画開始に失敗しました"
27
+Output.StartReplayFailed="リプレイバッファーの開始に失敗しました"
28
+Output.StartFailedGeneric="出力開始に失敗しました。詳細はログを確認してください。\n\n注: NVENCまたはAMDエンコーダを使用している場合は、ビデオドライバが最新のものであるかを確認してください。"
29
+
30
 Output.ConnectFail.Title="接続失敗"
31
 Output.ConnectFail.BadPath="パスかURLが無効です。再確認して下さい。"
32
 Output.ConnectFail.ConnectFailed="サーバーへの接続に失敗しました"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="トップフィールドが先"
35
 Deinterlacing.BottomFieldFirst="ボトムフィールドが先"
36
 
37
+VolControl.SliderUnmuted="'%1' の音量スライダー: %2"
38
+VolControl.SliderMuted="'%1' の音量スライダー: %2 (現在ミュート)"
39
+VolControl.Mute="'%1' をミュート"
40
+VolControl.Properties="'%1' のプロパティ"
41
+
42
 Basic.Main.AddSceneDlg.Title="シーン追加"
43
 Basic.Main.AddSceneDlg.Text="シーンの名前を入力してください"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="一般"
47
 Basic.Settings.General.Theme="テーマ"
48
 Basic.Settings.General.Language="言語"
49
+Basic.Settings.General.EnableAutoUpdates="起動時に自動的に更新を確認する"
50
 Basic.Settings.General.WarnBeforeStartingStream="配信を開始するときに確認ダイアログを表示する"
51
 Basic.Settings.General.WarnBeforeStoppingStream="配信を停止するときに確認ダイアログを表示する"
52
+Basic.Settings.General.Projectors="プロジェクター"
53
 Basic.Settings.General.HideProjectorCursor="プロジェクター上のカーソルを非表示にする"
54
 Basic.Settings.General.ProjectorAlwaysOnTop="プロジェクタを常に手前に表示させる"
55
 Basic.Settings.General.Snapping="ソース配置のスナップ"
56
@@ -362,8 +387,12 @@
57
 Basic.Settings.General.SnapDistance="スナップ感度"
58
 Basic.Settings.General.RecordWhenStreaming="配信時に自動的に録画"
59
 Basic.Settings.General.KeepRecordingWhenStreamStops="配信が停止しても録画を継続"
60
-Basic.Settings.General.SysTrayEnabled="システムトレイアイコンを有効にする"
61
+Basic.Settings.General.ReplayBufferWhileStreaming="配信時に自動的にリプレイバッファーを開始"
62
+Basic.Settings.General.KeepReplayBufferStreamStops="配信停止時にリプレイバッファーをアクティブにしておく"
63
+Basic.Settings.General.SysTray="システムトレイ"
64
 Basic.Settings.General.SysTrayWhenStarted="起動時にシステムトレイへ最小化"
65
+Basic.Settings.General.SystemTrayHideMinimize="タスクバーの代わりにシステムトレイに常に最小化する"
66
+Basic.Settings.General.SaveProjectors="終了時にプロジェクターを保存する"
67
 
68
 Basic.Settings.Stream="配信"
69
 Basic.Settings.Stream.StreamType="配信種別"
70
@@ -452,6 +481,8 @@
71
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="音声エンコーダ"
72
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="音声エンコーダ設定 (ある場合)"
73
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="マルチプレクサーの設定 (ある場合)"
74
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="キーフレーム間隔 (フレーム)"
75
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="すべてのコーデックを表示 (潜在的に互換性がない場合でも)"
76
 
77
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
78
 
79
@@ -505,12 +536,16 @@
80
 Basic.Settings.Advanced.Video.ColorRange="YUV 色範囲"
81
 Basic.Settings.Advanced.Video.ColorRange.Partial="一部"
82
 Basic.Settings.Advanced.Video.ColorRange.Full="全部"
83
+Basic.Settings.Advanced.Audio.MonitoringDevice="音声モニタリングデバイス"
84
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="既定"
85
 Basic.Settings.Advanced.StreamDelay="遅延配信"
86
 Basic.Settings.Advanced.StreamDelay.Duration="継続時間 (秒)"
87
 Basic.Settings.Advanced.StreamDelay.Preserve="再接続時にカットオフポイントを保持する (増加遅延)"
88
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="概算メモリ使用量: %1 MB"
89
 Basic.Settings.Advanced.Network="ネットワーク"
90
 Basic.Settings.Advanced.Network.BindToIP="IP選択"
91
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="新しいネットワークコードを有効にする"
92
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="低遅延モード"
93
 
94
 Basic.AdvAudio="オーディオの詳細プロパティ"
95
 Basic.AdvAudio.Name="名称"
96
@@ -518,6 +553,10 @@
97
 Basic.AdvAudio.Mono="モノラルにダウンミックス"
98
 Basic.AdvAudio.Panning="パンニング"
99
 Basic.AdvAudio.SyncOffset="同期オフセット (ミリ秒)"
100
+Basic.AdvAudio.Monitoring="音声モニタリング"
101
+Basic.AdvAudio.Monitoring.None="モニターオフ"
102
+Basic.AdvAudio.Monitoring.MonitorOnly="モニターのみ (出力はミュート)"
103
+Basic.AdvAudio.Monitoring.Both="モニターと出力"
104
 Basic.AdvAudio.AudioTracks="トラック"
105
 
106
 Basic.Settings.Hotkeys="ホットキー"
107
@@ -576,4 +615,5 @@
108
 
109
 OutputWarnings.NoTracksSelected="少なくとも 1 つのトラックを選択する必要があります"
110
 OutputWarnings.MultiTrackRecording="警告: 特定のフォーマット (FLVなど) は1つの録画で複数のトラックをサポートしていません"
111
+OutputWarnings.MP4Recording="警告: ファイルをファイナライズ出来ない場合 (例えば、BSOD、電力損失などの結果として) はMP4に保存された録画は回復不能になります。 複数の音声トラックを録画する場合はMKVの利用を検討して録画の終了後にMP4に再多重化してください。(ファイル -> 録画の再多重化)"
112
 
113
obs-studio-17.0.2.tar.xz/UI/data/locale/ko-KR.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/ko-KR.ini Changed
112
 
1
@@ -57,6 +57,19 @@
2
 Import="가져오기"
3
 Export="내보내기"
4
 
5
+Updater.Title="사용가능한 판올림이 있습니다"
6
+Updater.Text="새 판올림이 준비되었습니다:"
7
+Updater.UpdateNow="지금 판올림하기"
8
+Updater.RemindMeLater="나중에 다시 알림"
9
+Updater.Skip="이번 버전 건너뛰기"
10
+Updater.Running.Title="현재 활성화된 프로그램"
11
+Updater.Running.Text="판올림 전에 활성화되어 있는 출력을 먼저 꺼주세요"
12
+Updater.NoUpdatesAvailable.Title="가능한 판올림이 없습니다"
13
+Updater.NoUpdatesAvailable.Text="현재 사용가능한 판올림이 없습니다"
14
+Updater.FailedToLaunch="판올림 도우미를 실행할 수 없습니다"
15
+Updater.GameCaptureActive.Title="게임 캡쳐 기능이 활성화 중"
16
+Updater.GameCaptureActive.Text="게임 캡쳐 기능을 현재 사용 중입니다. 캡쳐 중인 게임이나 프로그램을 종료(혹은 윈도우를 재시작) 한 다음 다시 시도하세요."
17
+
18
 QuickTransitions.SwapScenes="전환 후 미리 보기/출력 장면을 교체"
19
 QuickTransitions.SwapScenesTT="(만약 출력 쪽 원본 장면이 있을 때) 전환 작업 이후 미리 보기와 출력 장면을 교체합니다. \n출력 쪽 원본 장면에서 변경한 내용은 사라지지 않습니다."
20
 QuickTransitions.DuplicateScene="장면 복제"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="'$1'을 정말로 제거하시겠습니까?"
23
 ConfirmRemove.TextMultiple="정말로 %1 개의 항목을 제거하겠습니까?"
24
 
25
+Output.StartStreamFailed="방송을 시작하지 못했습니다"
26
+Output.StartRecordingFailed="녹화를 시작하지 못했습니다"
27
+Output.StartReplayFailed="리플레이 버퍼를 시작하지 못했습니다"
28
+Output.StartFailedGeneric="출력을 시작하지 못했습니다. 기록 파일을 확인하십시오.\n\n참고: NVENC 혹은 AMD 인코더를 사용하고 있다면 드라이버를 최신 버전으로 유지하십시오."
29
+
30
 Output.ConnectFail.Title="연결에 실패했음"
31
 Output.ConnectFail.BadPath="잘못된 경로 혹은 연결 주소입니다. 유효한 값인지 설정을 확인하시기 바랍니다. "
32
 Output.ConnectFail.ConnectFailed="서버에 연결하지 못했습니다"
33
@@ -173,6 +191,10 @@
34
 Deinterlacing.TopFieldFirst="상위 필드 우선"
35
 Deinterlacing.BottomFieldFirst="하단 필드 우선"
36
 
37
+VolControl.SliderUnmuted="'%1'의 음량 조절: %2"
38
+VolControl.SliderMuted="'%1'의 음량 조절: %2 (현재 음소거)"
39
+VolControl.Mute="음소거 '%1'"
40
+
41
 Basic.Main.AddSceneDlg.Title="장면 추가"
42
 Basic.Main.AddSceneDlg.Text="장면의 이름을 입력하십시오"
43
 
44
@@ -351,8 +373,10 @@
45
 Basic.Settings.General="일반"
46
 Basic.Settings.General.Theme="테마"
47
 Basic.Settings.General.Language="언어"
48
+Basic.Settings.General.EnableAutoUpdates="프로그램을 시작할 때 자동으로 판올림이 있나 확인"
49
 Basic.Settings.General.WarnBeforeStartingStream="방송을 시작할 때 확인 대화 상자 표시"
50
 Basic.Settings.General.WarnBeforeStoppingStream="방송을 중단할 때 확인 대화 상자 표시"
51
+Basic.Settings.General.Projectors="프로젝터"
52
 Basic.Settings.General.HideProjectorCursor="프로젝터 위 커서 숨기기"
53
 Basic.Settings.General.ProjectorAlwaysOnTop="프로젝터를 항상 위로"
54
 Basic.Settings.General.Snapping="소스를 자석처럼 달라붙여서 정렬"
55
@@ -362,8 +386,12 @@
56
 Basic.Settings.General.SnapDistance="자석 감도"
57
 Basic.Settings.General.RecordWhenStreaming="방송 시 자동으로 녹화"
58
 Basic.Settings.General.KeepRecordingWhenStreamStops="방송을 중단하더라도 녹화는 유지"
59
-Basic.Settings.General.SysTrayEnabled="시스템 트레이 아이콘 활성화"
60
+Basic.Settings.General.ReplayBufferWhileStreaming="방송 시 리플레이 버퍼를 자동으로 시작"
61
+Basic.Settings.General.KeepReplayBufferStreamStops="방송 중단에도 리플레이 버퍼를 계속 활성화"
62
+Basic.Settings.General.SysTray="시스템 트레이"
63
 Basic.Settings.General.SysTrayWhenStarted="시작할 때 시스템 트레이로 최소화"
64
+Basic.Settings.General.SystemTrayHideMinimize="작업 표시줄 대신 시스템 트레이에 항상 최소화"
65
+Basic.Settings.General.SaveProjectors="종료 시 프로젝터 저장"
66
 
67
 Basic.Settings.Stream="방송"
68
 Basic.Settings.Stream.StreamType="방송 형식"
69
@@ -452,6 +480,8 @@
70
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="오디오 인코더"
71
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="오디오 인코더 설정 (지원되는 경우)"
72
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="다중화 설정 (제공되는 경우)"
73
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="키프레임 간격 (프레임 단위)"
74
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="모든 코덱을 표시 (호환이 안되는 것도 포함)"
75
 
76
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
77
 
78
@@ -505,12 +535,16 @@
79
 Basic.Settings.Advanced.Video.ColorRange="YUV 색상 범위"
80
 Basic.Settings.Advanced.Video.ColorRange.Partial="부분"
81
 Basic.Settings.Advanced.Video.ColorRange.Full="전체"
82
+Basic.Settings.Advanced.Audio.MonitoringDevice="오디오 모니터링 장치"
83
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="기본값"
84
 Basic.Settings.Advanced.StreamDelay="방송 지연"
85
 Basic.Settings.Advanced.StreamDelay.Duration="기간 (초)"
86
 Basic.Settings.Advanced.StreamDelay.Preserve="재접속 시 잘려나간 지점 보관 (지연시간 증가)"
87
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="예상되는 메모리 사용량: %1 MB"
88
 Basic.Settings.Advanced.Network="네트워크"
89
 Basic.Settings.Advanced.Network.BindToIP="IP에 고정"
90
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="새로운 네트워크 코드 활성화"
91
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="짧은 지연시간 모드"
92
 
93
 Basic.AdvAudio="오디오 고급 설정"
94
 Basic.AdvAudio.Name="이름"
95
@@ -518,6 +552,10 @@
96
 Basic.AdvAudio.Mono="모노로 강제 송출"
97
 Basic.AdvAudio.Panning="패닝"
98
 Basic.AdvAudio.SyncOffset="싱크 오프셋 (ms)"
99
+Basic.AdvAudio.Monitoring="오디오 모니터링"
100
+Basic.AdvAudio.Monitoring.None="모니터링 끔"
101
+Basic.AdvAudio.Monitoring.MonitorOnly="모니터링만 (출력은 제거)"
102
+Basic.AdvAudio.Monitoring.Both="모니터링과 출력"
103
 Basic.AdvAudio.AudioTracks="트랙"
104
 
105
 Basic.Settings.Hotkeys="단축키"
106
@@ -576,4 +614,5 @@
107
 
108
 OutputWarnings.NoTracksSelected="최소 하나의 트랙을 선택해야 합니다"
109
 OutputWarnings.MultiTrackRecording="경고: 일부 형식(예를 들어 FLV)은 녹화 하나에 여러 개의 트랙을 지원하지 않습니다"
110
+OutputWarnings.MP4Recording="경고: MP4로 녹화를 하면 파일이 마무리가 되지 않았을 때 (예를 들어 컴퓨터가 급작스럽게 꺼지거나 블루 스크린 오류가 일어나는 경우) 복구할 수 없습니다. 여러 개의 오디오 트랙을 녹음하고 싶다면 MKV 확장자로 녹화 한 뒤 재다중화 작업을 통해 mp4로 전환하십시오. (파일->재다중화 녹화)"
111
 
112
obs-studio-17.0.2.tar.xz/UI/data/locale/lt-LT.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/lt-LT.ini Changed
25
 
1
@@ -49,6 +49,7 @@
2
 Top="Iš viršaus"
3
 Bottom="Iš apačios"
4
 
5
+
6
 QuickTransitions.SwapScenes="Sukeisti Peržiūros/Išvesties scenas po Perėjimo"
7
 QuickTransitions.SwapScenesTT="Sukeičia peržiūros ir išvesties scenas po perėjimo įvykdymo (jei originali išvesties scena vis dar egzistuoja).\nTai neatšauks jokių pakeitimų kurie galima buvo atlikti originalioje išvesties scenoje."
8
 QuickTransitions.DuplicateScene="Dubliuoti Sceną"
9
@@ -86,6 +87,7 @@
10
 ConfirmRemove.Title="Pašalinimo patvirtinimas"
11
 ConfirmRemove.Text="Ar tikrai norite pašalinti '$1'?"
12
 
13
+
14
 Output.ConnectFail.Title="Nepavyko prisijungti"
15
 Output.ConnectFail.BadPath="Neteisingas kelias arba jungimosi URL. Prašome patikrinti nustatymus ir įsitikinti, kad jie teisingi."
16
 Output.ConnectFail.ConnectFailed="Nepavyko prisijungti prie serverio"
17
@@ -159,6 +161,7 @@
18
 Deinterlacing.TopFieldFirst="Piršutinis puskadris pirmas"
19
 Deinterlacing.BottomFieldFirst="Apatinis puskadris pirmas"
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Pridėti sceną"
23
 Basic.Main.AddSceneDlg.Text="Įveskite pasirinktą scenos pavadinimą"
24
 
25
obs-studio-17.0.2.tar.xz/UI/data/locale/ms-MY.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/ms-MY.ini Changed
25
 
1
@@ -53,6 +53,7 @@
2
 Minutes="Minit"
3
 Seconds="Saat"
4
 
5
+
6
 QuickTransitions.SwapScenes="Tukar Pratonton/Pengeluaran Adegan Selepas Peralihan"
7
 QuickTransitions.SwapScenesTT="Menukarkan pratonton dan pengeluaran adegan-adegan selepas peralihan(jika pengeluaran adegan mash wujud).\nIni tidak akan mengundurkan sebarang perubahan yang mungkin telah dilakukan pada pengeluaran adegan yang asal."
8
 QuickTransitions.DuplicateScene="Klonkan Adegan"
9
@@ -93,6 +94,7 @@
10
 ConfirmRemove.Text="Adakah anda pasti untuk buang '$1'?"
11
 ConfirmRemove.TextMultiple="Adakah anda yakin untuk buang %1 barang?"
12
 
13
+
14
 Output.ConnectFail.Title="Penyambungan gagal"
15
 Output.ConnectFail.BadPath="Sambungan URL atau Laluan yang tidak sah. Sila semak semula tetapan anda to mengesahkan bahawa semuanya sah."
16
 Output.ConnectFail.ConnectFailed="Penyambungan ke pelayan gagal"
17
@@ -167,6 +169,7 @@
18
 Deinterlacing.TopFieldFirst="Bahagian Atas Dahulu"
19
 Deinterlacing.BottomFieldFirst="Bahagian Bawah Dahulu"
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Tambah Adegan"
23
 Basic.Main.AddSceneDlg.Text="Sila taip nama adegan"
24
 
25
obs-studio-17.0.2.tar.xz/UI/data/locale/nb-NO.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/nb-NO.ini Changed
192
 
1
@@ -48,6 +48,23 @@
2
 Right="Høyre"
3
 Top="Topp"
4
 Bottom="Bunn"
5
+Reset="Tilbakestill"
6
+Hours="Timer"
7
+Minutes="Minutter"
8
+Seconds="Sekunder"
9
+Deprecated="Foreldet"
10
+ReplayBuffer="Omspill Buffer"
11
+Import="Importer"
12
+Export="Eksporter"
13
+
14
+Updater.Title="Ny oppdatering tilgjengelig"
15
+Updater.Text="Det finnes en ny oppdatering:"
16
+Updater.UpdateNow="Oppdater nå"
17
+Updater.RemindMeLater="Påminn meg senere"
18
+Updater.Skip="Hopp over versjon"
19
+Updater.Running.Title="Programmet er aktiv"
20
+Updater.NoUpdatesAvailable.Title="Ingen oppdateringer er tilgjengelig"
21
+Updater.NoUpdatesAvailable.Text="Ingen oppdateringer er tilgjengelig"
22
 
23
 QuickTransitions.SwapScenes="Bytt forhåndsvisnings-/utgangsscener etter overgang"
24
 QuickTransitions.SwapScenesTT="Bytter forhåndsvisnings- og utgangsscenen etter overgang, hvis den originale utgangsscenen fortsatt eksisterer.\nDette vil ikke tilbakestille endringer på den originale utgangsscenen."
25
@@ -87,6 +104,10 @@
26
 
27
 ConfirmRemove.Title="Bekreft Fjerning"
28
 ConfirmRemove.Text="Er du sikker på at du vil fjerne '$1'?"
29
+ConfirmRemove.TextMultiple="Er du sikker du ønsker å fjerne %1 filer?"
30
+
31
+Output.StartStreamFailed="Kan ikke starte streaming"
32
+Output.StartRecordingFailed="Kan ikke starte innspillingen"
33
 
34
 Output.ConnectFail.Title="Tilkobling misklytes"
35
 Output.ConnectFail.BadPath="Ugyldig filbane eller tilkoblings-URL. Vennligst bekreft at instillingene dine er riktige."
36
@@ -101,6 +122,8 @@
37
 Output.RecordNoSpace.Msg="Det er ikke nok diskplass til å fortsette opptaket."
38
 Output.RecordError.Title="Innspillingsfeil"
39
 Output.RecordError.Msg="Det oppstod en uspesifisert feil under opptaket."
40
+Output.ReplayBuffer.NoHotkey.Title="Ingen hurtigtast satt!"
41
+Output.ReplayBuffer.NoHotkey.Msg="Ingen lagrings hurtigtast satt for omspillings buffer. Venligst sett \"Lagre\" hurtigtasten i bruk for å lagre opptak."
42
 
43
 Output.BadPath.Title="Ugyldig Filbane"
44
 Output.BadPath.Text="Den oppgitte fillagringsbanen er ugyldig. Vennligst kontrollér instillingene dine og bekreft at filbanen er gyldig."
45
@@ -144,6 +167,11 @@
46
 
47
 Basic.Main.PreviewConextMenu.Enable="Aktiver forhåndsvisning"
48
 
49
+ScaleFiltering="Skala Filtrering"
50
+ScaleFiltering.Point="Punkt"
51
+ScaleFiltering.Bilinear="Bilineær"
52
+ScaleFiltering.Bicubic="Bikubisk"
53
+ScaleFiltering.Lanczos="Lanczos"
54
 
55
 Deinterlacing="Avsammenfletting"
56
 Deinterlacing.Discard="Forkast"
57
@@ -157,6 +185,7 @@
58
 Deinterlacing.TopFieldFirst="Øverste felt først"
59
 Deinterlacing.BottomFieldFirst="Nederste felt først"
60
 
61
+
62
 Basic.Main.AddSceneDlg.Title="Ny Scene"
63
 Basic.Main.AddSceneDlg.Text="Vennligst gi et navn til scenen."
64
 
65
@@ -251,9 +280,12 @@
66
 Basic.Main.Sources="Kilder"
67
 Basic.Main.Connecting="Kobler til…"
68
 Basic.Main.StartRecording="Start Opptak"
69
+Basic.Main.StartReplayBuffer="Start Omspill Buffer"
70
 Basic.Main.StartStreaming="Start Strømming"
71
 Basic.Main.StopRecording="Stopp Opptak"
72
 Basic.Main.StoppingRecording="Stanser innspilling…"
73
+Basic.Main.StopReplayBuffer="Stopp Omspill Buffer"
74
+Basic.Main.StoppingReplayBuffer="Stopper Omspill Bufferen..."
75
 Basic.Main.StopStreaming="Stopp Strømming"
76
 Basic.Main.StoppingStreaming="Stanser strøm…"
77
 Basic.Main.ForceStopStreaming="Stopp strømming (forkast forsinkelse)"
78
@@ -274,8 +306,12 @@
79
 Basic.MainMenu.Edit.Redo="&Gjør om"
80
 Basic.MainMenu.Edit.UndoAction="&Angre $1"
81
 Basic.MainMenu.Edit.RedoAction="&Gjør om $1"
82
+Basic.MainMenu.Edit.LockPreview="Lås Forhåndsvisning"
83
+Basic.MainMenu.Edit.Scale="Forhåndsvisning & Skalering"
84
+Basic.MainMenu.Edit.Scale.Window="Tilpass til vindu"
85
 Basic.MainMenu.Edit.Transform="&Transformer"
86
 Basic.MainMenu.Edit.Transform.EditTransform="&Redigér transformering..."
87
+Basic.MainMenu.Edit.Transform.CopyTransform="Kopiere transformering"
88
 Basic.MainMenu.Edit.Transform.ResetTransform="&Angre transformering"
89
 Basic.MainMenu.Edit.Transform.Rotate90CW="Rotér 90 grader med klokka"
90
 Basic.MainMenu.Edit.Transform.Rotate90CCW="Rotér 90 grader mot klokka"
91
@@ -292,10 +328,21 @@
92
 Basic.MainMenu.Edit.Order.MoveToBottom="Legg på &bunnen"
93
 Basic.MainMenu.Edit.AdvAudio="&Avanserte lydinstillinger"
94
 
95
+Basic.MainMenu.View="&Vis"
96
+Basic.MainMenu.View.Toolbars="%Verktøylinje"
97
+Basic.MainMenu.View.SceneTransitions="Sceneoverganger"
98
+Basic.MainMenu.View.StatusBar="Statuslinje"
99
 
100
 Basic.MainMenu.SceneCollection="&Scenesamling"
101
 Basic.MainMenu.Profile="&Profil"
102
+Basic.MainMenu.Profile.Import="Importer Profil"
103
+Basic.MainMenu.Profile.Export="Eksporter Profil"
104
+Basic.MainMenu.SceneCollection.Import="Importer Scenesamling"
105
+Basic.MainMenu.SceneCollection.Export="Eskporter Scenesamling"
106
+Basic.MainMenu.Profile.Exists="Profilen eksisterer allerede"
107
+Basic.MainMenu.SceneCollection.Exists="Scenesamlingen eksisterer allerede"
108
 
109
+Basic.MainMenu.Tools="&Verktøy"
110
 
111
 Basic.MainMenu.Help="&Hjelp"
112
 Basic.MainMenu.Help.Website="Besøk &nettsted"
113
@@ -315,6 +362,7 @@
114
 Basic.Settings.General.Language="Språk"
115
 Basic.Settings.General.WarnBeforeStartingStream="Vis bekreftelsesdialogboks når du starter strømming"
116
 Basic.Settings.General.WarnBeforeStoppingStream="Vis bekreftelsesdialogboks når stanser strømming"
117
+Basic.Settings.General.Projectors="Projektorer"
118
 Basic.Settings.General.HideProjectorCursor="Skjul musepekeren over projektorer"
119
 Basic.Settings.General.Snapping="Festing ved kildejustering"
120
 Basic.Settings.General.ScreenSnapping="Fest kilder til kanten av skjermen"
121
@@ -323,6 +371,7 @@
122
 Basic.Settings.General.SnapDistance="Festingfølsomhet"
123
 Basic.Settings.General.RecordWhenStreaming="Spill inn automatisk ved strømming"
124
 Basic.Settings.General.KeepRecordingWhenStreamStops="Fortsett innspilling etter strømming"
125
+Basic.Settings.General.SysTrayWhenStarted="Minimer til systemstatusfelt ved oppstart"
126
 
127
 Basic.Settings.Stream="Strøm"
128
 Basic.Settings.Stream.StreamType="Strømmetype"
129
@@ -337,6 +386,13 @@
130
 Basic.Settings.Output.Mode.Simple="Enkel"
131
 Basic.Settings.Output.Mode.Adv="Avansert"
132
 Basic.Settings.Output.Mode.FFmpeg="FFmpeg-utgang"
133
+Basic.Settings.Output.UseReplayBuffer="Aktiver Omspill Buffer"
134
+Basic.Settings.Output.ReplayBuffer.SecondsMax="Maksimal Omspill Tid (sekunder)"
135
+Basic.Settings.Output.ReplayBuffer.MegabytesMax="Maksimalt Minne (Megabytes)"
136
+Basic.Settings.Output.ReplayBuffer.Estimate="Anslått minne bruk. %1 MB"
137
+Basic.Settings.Output.ReplayBuffer.EstimateUnknown="Kan ikke beregne minnebruk. Vennligst sett maksimalt minnebrukgrense."
138
+Basic.Settings.Output.ReplayBuffer.HotkeyMessage="(Merk: Sørg for å angi en hurtigtast for omspill bufferen i hurtigtast innstillingen)"
139
+Basic.Settings.Output.ReplayBuffer.Suffix="Suffiks"
140
 Basic.Settings.Output.Simple.SavePath="Opptaksbane"
141
 Basic.Settings.Output.Simple.RecordingQuality="Opptakskvalitet"
142
 Basic.Settings.Output.Simple.RecordingQuality.Stream="Samme som strøm"
143
@@ -352,6 +408,7 @@
144
 Basic.Settings.Output.Simple.Warn.MultipleQSV="Advarsel: du kan ikke bruke flere separate QSV-kodere når du strømmer og tar opp samtidig. Hvis du ønsker gjøre begge på samme tid må du endre strømme- eller opptakskoderen."
145
 Basic.Settings.Output.Simple.Encoder.Software="Programvare (x264)"
146
 Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Maskinvare (QSV)"
147
+Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Maskinvare (AMD)"
148
 Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Maskinvare (NVENC)"
149
 Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Programvare (x264 forhåndsinstilling for liten prosessorbruk, øker filstørrelsen)"
150
 Basic.Settings.Output.VideoBitrate="Bildeoverføringshastighet"
151
@@ -373,6 +430,8 @@
152
 Basic.Settings.Output.Adv.Audio.Track2="Spor 2"
153
 Basic.Settings.Output.Adv.Audio.Track3="Spor 3"
154
 Basic.Settings.Output.Adv.Audio.Track4="Spor 4"
155
+Basic.Settings.Output.Adv.Audio.Track5="Spor 5"
156
+Basic.Settings.Output.Adv.Audio.Track6="Spor 6"
157
 
158
 Basic.Settings.Output.Adv.Recording="Opptak"
159
 Basic.Settings.Output.Adv.Recording.Type="Type"
160
@@ -441,6 +500,11 @@
161
 Basic.Settings.Audio.UnknownAudioDevice="[Enhet ikke tilkoblet eller ikke tilgjengelig]"
162
 
163
 Basic.Settings.Advanced="Avansert"
164
+Basic.Settings.Advanced.General.ProcessPriority="Prosessprioritet"
165
+Basic.Settings.Advanced.General.ProcessPriority.High="Høy"
166
+Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Over Normal"
167
+Basic.Settings.Advanced.General.ProcessPriority.Normal="Normal"
168
+Basic.Settings.Advanced.General.ProcessPriority.Idle="Inaktiv"
169
 Basic.Settings.Advanced.FormatWarning="Advarsel: Fargeformater andre enn NV12 er ment for opptak. Disse formatene anbefales ikke ved strømming, da det fører til økt prosessorbruk som følge av fargeformatkonvertering."
170
 Basic.Settings.Advanced.Audio.BufferingTime="Lydbuffertid"
171
 Basic.Settings.Advanced.Video.ColorFormat="Fargeformat"
172
@@ -452,6 +516,8 @@
173
 Basic.Settings.Advanced.StreamDelay.Duration="Varighet (sekunder)"
174
 Basic.Settings.Advanced.StreamDelay.Preserve="Bevar avkuttingspunktet (øk forsinkelse) ved tilbakekobling"
175
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Anslått minnebruk: %1 MB"
176
+Basic.Settings.Advanced.Network="Nettverk"
177
+Basic.Settings.Advanced.Network.BindToIP="Bind til IP"
178
 
179
 Basic.AdvAudio="Avanserte lydinstillinger"
180
 Basic.AdvAudio.Name="Navn"
181
@@ -466,7 +532,10 @@
182
 
183
 Basic.Hotkeys.SelectScene="Bytt til scene"
184
 
185
+Basic.SystemTray.Show="Vis"
186
+Basic.SystemTray.Hide="Skjul"
187
 
188
+Basic.SystemTray.Message.Reconnecting="Frakoblet. Kobler til på nytt..."
189
 
190
 Hotkeys.Insert="Insert"
191
 Hotkeys.Delete="Delete"
192
obs-studio-17.0.2.tar.xz/UI/data/locale/nl-NL.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/nl-NL.ini Changed
90
 
1
@@ -57,6 +57,19 @@
2
 Import="Importeer"
3
 Export="Exporteer"
4
 
5
+Updater.Title="Update beschikbaar"
6
+Updater.Text="Er is een update beschikbaar:"
7
+Updater.UpdateNow="Nu updaten"
8
+Updater.RemindMeLater="Herinner mij later"
9
+Updater.Skip="Sla deze versie over"
10
+Updater.Running.Title="Programma actief"
11
+Updater.Running.Text="Er is momenteel uitvoer actief, stop alle actieve uitvoer voor je probeert te updaten"
12
+Updater.NoUpdatesAvailable.Title="Geen updates beschikbaar"
13
+Updater.NoUpdatesAvailable.Text="Er zijn momenteel geen updates beschikbaar"
14
+Updater.FailedToLaunch="Starten van updater is mislukt"
15
+Updater.GameCaptureActive.Title="Game capture actief"
16
+Updater.GameCaptureActive.Text="Er is momenteel een game capture hook in gebruik. Sluit alle games/programma's af die opgenomen worden (of herstart Windows) en probeer het opnieuw."
17
+
18
 QuickTransitions.SwapScenes="Preview-/uitvoerscenes verwisselen na overgang"
19
 QuickTransitions.SwapScenesTT="Verwisselt de preview- en uitvoercenes na een overgang (als de originele uitvoerscène nog bestaat.)\nDit zal geen veranderingen ongedaan maken die mogelijk zijn gemaakt aan de originele uitvoerscène."
20
 QuickTransitions.DuplicateScene="Scène Dupliceren"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="Weet je zeker dat je '$1' wil verwijderen?"
23
 ConfirmRemove.TextMultiple="Weet je zeker dat je %1 elementen wil verwijderen?"
24
 
25
+Output.StartStreamFailed="Het starten van de stream is mislukt"
26
+Output.StartRecordingFailed="Het starten van de opname is mislukt"
27
+Output.StartReplayFailed="Het starten van de replay buffer is mislukt"
28
+Output.StartFailedGeneric="Het starten van de uitvoer is mislukt. Controleer de logbestanden voor meer informatie.\n\nLet op: Als je gebruik maakt van de NVENC of AMD encoders, controleer of de drivers up to date zijn."
29
+
30
 Output.ConnectFail.Title="Kan geen verbinding maken"
31
 Output.ConnectFail.BadPath="Ongeldig pad of verbindings-url. Controleer a.u.b. of je instellingen geldig zijn."
32
 Output.ConnectFail.ConnectFailed="Kan geen verbinding maken met de server"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="Bovenste Veld Eerst"
35
 Deinterlacing.BottomFieldFirst="Onderste Veld Eerst"
36
 
37
+VolControl.SliderUnmuted="Volumeregelaar voor '%1': %2"
38
+VolControl.SliderMuted="Volumeregelaar voor '%1': %2 (momenteel muted)"
39
+VolControl.Mute="Mute '%1'"
40
+VolControl.Properties="Eigenschappen van '%1'"
41
+
42
 Basic.Main.AddSceneDlg.Title="Scène Toevoegen"
43
 Basic.Main.AddSceneDlg.Text="Voer a.u.b. de naam van de scène in"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="Algemeen"
47
 Basic.Settings.General.Theme="Thema"
48
 Basic.Settings.General.Language="Taal"
49
+Basic.Settings.General.EnableAutoUpdates="Automatisch controleren op updates tijdens het opstarten"
50
 Basic.Settings.General.WarnBeforeStartingStream="Laat bevestigingsvenster zien bij het starten van streams"
51
 Basic.Settings.General.WarnBeforeStoppingStream="Laat bevestiginsvenster zien bij het stoppen van streams"
52
+Basic.Settings.General.Projectors="Projectoren"
53
 Basic.Settings.General.HideProjectorCursor="Verberg cursor boven projectors"
54
 Basic.Settings.General.ProjectorAlwaysOnTop="Houd projectoren altijd bovenaan"
55
 Basic.Settings.General.Snapping="Bronuitlijning"
56
@@ -362,8 +387,12 @@
57
 Basic.Settings.General.SnapDistance="Gevoeligheid"
58
 Basic.Settings.General.RecordWhenStreaming="Stream automatisch opnemen"
59
 Basic.Settings.General.KeepRecordingWhenStreamStops="Opname voortzetten als de stream stopt"
60
-Basic.Settings.General.SysTrayEnabled="Systeemvakicoon weergeven"
61
+Basic.Settings.General.ReplayBufferWhileStreaming="Replay buffer tegelijk starten met stream"
62
+Basic.Settings.General.KeepReplayBufferStreamStops="Replay buffer actief houden als stream stopt"
63
+Basic.Settings.General.SysTray="Systeemvak"
64
 Basic.Settings.General.SysTrayWhenStarted="Naar systeemvak minimaliseren bij opstarten"
65
+Basic.Settings.General.SystemTrayHideMinimize="Altijd minimaliseren naar het systeemvak in plaats van de taakbalk"
66
+Basic.Settings.General.SaveProjectors="Projectors opslaan bij afsluiten"
67
 
68
 Basic.Settings.Stream="Stream"
69
 Basic.Settings.Stream.StreamType="Stream Type"
70
@@ -505,6 +534,8 @@
71
 Basic.Settings.Advanced.Video.ColorRange="YUV-Kleurbereik"
72
 Basic.Settings.Advanced.Video.ColorRange.Partial="Partial"
73
 Basic.Settings.Advanced.Video.ColorRange.Full="Full"
74
+Basic.Settings.Advanced.Audio.MonitoringDevice="Audio monitoring apparaat"
75
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Standaard"
76
 Basic.Settings.Advanced.StreamDelay="Streamvertraging"
77
 Basic.Settings.Advanced.StreamDelay.Duration="Duur (seconden)"
78
 Basic.Settings.Advanced.StreamDelay.Preserve="Hervat op het eindpunt (verhoog vertraging) bij opnieuw verbinden"
79
@@ -518,6 +549,10 @@
80
 Basic.AdvAudio.Mono="Downmixen naar Mono"
81
 Basic.AdvAudio.Panning="Pannen"
82
 Basic.AdvAudio.SyncOffset="Sync Offset (ms)"
83
+Basic.AdvAudio.Monitoring="Audio monitoring"
84
+Basic.AdvAudio.Monitoring.None="Niet monitoren"
85
+Basic.AdvAudio.Monitoring.MonitorOnly="Alleen monitoren (uitvoer gedempt)"
86
+Basic.AdvAudio.Monitoring.Both="Monitoren en uitvoeren"
87
 Basic.AdvAudio.AudioTracks="Sporen"
88
 
89
 Basic.Settings.Hotkeys="Sneltoetsen"
90
obs-studio-17.0.2.tar.xz/UI/data/locale/pl-PL.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/pl-PL.ini Changed
113
 
1
@@ -57,6 +57,19 @@
2
 Import="Importuj"
3
 Export="Eksportuj"
4
 
5
+Updater.Title="Dostępna jest nowa aktualizacja"
6
+Updater.Text="Dostępna jest nowa aktualizacja:"
7
+Updater.UpdateNow="Uaktualnij teraz"
8
+Updater.RemindMeLater="Przypomnij mi później"
9
+Updater.Skip="Pomiń wersję"
10
+Updater.Running.Title="Aplikacja jest uruchomiona"
11
+Updater.Running.Text="Wyjścia są aktualnie aktywne, proszę zamknąć wszystkie aktywne wyjścia przed rozpoczęciem procesu aktualizacji"
12
+Updater.NoUpdatesAvailable.Title="Brak dostępnych aktualizacji"
13
+Updater.NoUpdatesAvailable.Text="Brak dostępnych aktualizacji"
14
+Updater.FailedToLaunch="Nie udało się uruchomić aktualizacji"
15
+Updater.GameCaptureActive.Title="Przechwytywanie gry aktywne"
16
+Updater.GameCaptureActive.Text="Przechwytywanie gry jest aktywne. Proszę o zamknięcie wszelkich przechwytywanych gier/aplikacji (lub ponowne uruchomienie systemu) i spróbowanie później."
17
+
18
 QuickTransitions.SwapScenes="Zamień podgląd/wyjście scen po przejściu"
19
 QuickTransitions.SwapScenesTT="Zamienia podgląd i wyjście scen po przejściu (jeżeli wyjście oryginalnej sceny istnieje).\nNie przywraca to zmian jakie zostały dokonane w oryginalnej scenie."
20
 QuickTransitions.DuplicateScene="Duplikuj scenę"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="Czy na pewno chcesz usunąć '$1'?"
23
 ConfirmRemove.TextMultiple="Liczba elementów do usunięcia: %1. Czy na pewno chcesz je usunąć?"
24
 
25
+Output.StartStreamFailed="Nie udało się rozpocząć streamowania"
26
+Output.StartRecordingFailed="Nie udało się rozpocząć nagrywania"
27
+Output.StartReplayFailed="Nie udało się rozpocząć nagrywania powtórek"
28
+Output.StartFailedGeneric="Nie udało się uruchomić wyjścia. Sprawdź szczegóły w plikach dziennika.\n\nUwaga: Sprawdź, czy posiadasz aktualne sterowniki karty graficznej, jeżeli używasz enkodera NVENC lub AMD."
29
+
30
 Output.ConnectFail.Title="Nie udało się połączyć"
31
 Output.ConnectFail.BadPath="Nieprawidłowa ścieżka lub adres URL połączenia. Sprawdź poprawność ustawień."
32
 Output.ConnectFail.ConnectFailed="Nie udało się połączyć z serwerem"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="Najpierw pole górne"
35
 Deinterlacing.BottomFieldFirst="Najpierw pole dolne"
36
 
37
+VolControl.SliderUnmuted="Suwak głośności dla '%1': %2"
38
+VolControl.SliderMuted="Suwak głośności dla '%1': %2 (obecnie wyciszony)"
39
+VolControl.Mute="Wycisz '%1'"
40
+VolControl.Properties="Właściwości dla '%1'"
41
+
42
 Basic.Main.AddSceneDlg.Title="Dodaj scenę"
43
 Basic.Main.AddSceneDlg.Text="Podaj nazwę sceny"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="Główne"
47
 Basic.Settings.General.Theme="Motyw"
48
 Basic.Settings.General.Language="Język"
49
+Basic.Settings.General.EnableAutoUpdates="Automatycznie sprawdzaj dostępność aktualizacji"
50
 Basic.Settings.General.WarnBeforeStartingStream="Pokaż komunikat potwierdzenia uruchomienia streamowania"
51
 Basic.Settings.General.WarnBeforeStoppingStream="Pokaż komunikat potwierdzenia zatrzymania streamowania"
52
+Basic.Settings.General.Projectors="Projektory"
53
 Basic.Settings.General.HideProjectorCursor="Ukryj kursor podglądu na pełnym ekranie"
54
 Basic.Settings.General.ProjectorAlwaysOnTop="Podgląd na pełnym ekranie zawsze na wierzchu"
55
 Basic.Settings.General.Snapping="Przyciąganie elementów źródłowych"
56
@@ -362,8 +387,12 @@
57
 Basic.Settings.General.SnapDistance="Czułość przyciągania"
58
 Basic.Settings.General.RecordWhenStreaming="Automatyczne nagrywanie streamu"
59
 Basic.Settings.General.KeepRecordingWhenStreamStops="Zachowaj nagranie po zatrzymaniu streamu"
60
-Basic.Settings.General.SysTrayEnabled="Wyświetlaj ikonę w zasobniku systemowym"
61
+Basic.Settings.General.ReplayBufferWhileStreaming="Automatycznie rozpocznij nagrywanie powtórek w przypadku streamowania"
62
+Basic.Settings.General.KeepReplayBufferStreamStops="Kontynuuj nagrywanie powtórek po zatrzymaniu streamowania"
63
+Basic.Settings.General.SysTray="Zasobnik systemowy"
64
 Basic.Settings.General.SysTrayWhenStarted="Minimalizuj do zasobnika systemowego podczas uruchamiania"
65
+Basic.Settings.General.SystemTrayHideMinimize="Zawsze minimalizuj do zasobnika systemowego zamiast do paska zadań"
66
+Basic.Settings.General.SaveProjectors="Zapisz konfigurację podglądów na pełnym ekranie przy zamknięciu aplikacji"
67
 
68
 Basic.Settings.Stream="Stream"
69
 Basic.Settings.Stream.StreamType="Typ streamu"
70
@@ -452,6 +481,8 @@
71
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="Enkoder dźwięku"
72
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Ustawienia enkodera audio (jeśli są)"
73
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Ustawienia muxera (jeżeli są)"
74
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Odstęp między klatkami kluczowymi (klatki)"
75
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Pokaż wszystkie kodeki (nawet potencjalnie niezgodne)"
76
 
77
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
78
 
79
@@ -505,12 +536,16 @@
80
 Basic.Settings.Advanced.Video.ColorRange="Zakres kolorów YUV"
81
 Basic.Settings.Advanced.Video.ColorRange.Partial="Częściowy"
82
 Basic.Settings.Advanced.Video.ColorRange.Full="Pełny"
83
+Basic.Settings.Advanced.Audio.MonitoringDevice="Monitorowane urządzenie audio"
84
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Domyślne"
85
 Basic.Settings.Advanced.StreamDelay="Opóźnienie streamu"
86
 Basic.Settings.Advanced.StreamDelay.Duration="Czas trwania (s)"
87
 Basic.Settings.Advanced.StreamDelay.Preserve="Zachowuj punkt przerwania (zwiększ opóźnienie) podczas ponownego łączenia"
88
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Szacowane zużycie pamięci: %1 MB"
89
 Basic.Settings.Advanced.Network="Sieć"
90
 Basic.Settings.Advanced.Network.BindToIP="Przypisane IP"
91
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Aktywuj nowy kod sieciowy"
92
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Tryb niskich opóźnień"
93
 
94
 Basic.AdvAudio="Zaawansowane ustawienia dźwięku"
95
 Basic.AdvAudio.Name="Nazwa"
96
@@ -518,6 +553,10 @@
97
 Basic.AdvAudio.Mono="Downmix do Mono"
98
 Basic.AdvAudio.Panning="Rozciągnięcie dźwięku"
99
 Basic.AdvAudio.SyncOffset="Przesunięcie dźwięku (ms)"
100
+Basic.AdvAudio.Monitoring="Monitorowanie urządzenia audio"
101
+Basic.AdvAudio.Monitoring.None="Wyłączone"
102
+Basic.AdvAudio.Monitoring.MonitorOnly="Tylko monitorowanie (wyjście wyłączone)"
103
+Basic.AdvAudio.Monitoring.Both="Monitorowanie i przekazywanie na wyjście"
104
 Basic.AdvAudio.AudioTracks="Ścieżki"
105
 
106
 Basic.Settings.Hotkeys="Skróty klawiszowe"
107
@@ -576,4 +615,5 @@
108
 
109
 OutputWarnings.NoTracksSelected="Musisz wybrać przynajmniej jedną ścieżkę"
110
 OutputWarnings.MultiTrackRecording="Ostrzeżenie: Pewne formaty plików (np. FLV) nie obsługują wielu ścieżek dźwiękowych"
111
+OutputWarnings.MP4Recording="Ostrzeżenie: Nagrania zapisanego w formacie mp4 nie będzie można odzyskać, jeśli plik nie zostanie zakończony poprawnie (np. w wyniku BSOD, braku prądu, itp.). Jeśli chcesz nagrać wiele ścieżek audio należy rozważyć użycie formatu mkv i remux nagrania do mp4 po zakończeniu (Plik -> Przepakuj nagrania)."
112
 
113
obs-studio-17.0.2.tar.xz/UI/data/locale/pt-BR.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/pt-BR.ini Changed
43
 
1
@@ -56,6 +56,7 @@
2
 ReplayBuffer="Buffer do Replay"
3
 Export="Exportar"
4
 
5
+
6
 QuickTransitions.SwapScenes="Trocar Cenas de Prévia/Saída após a Transição"
7
 QuickTransitions.SwapScenesTT="Troca a preview e a saída após transicionar (se a a cena original de saída ainda exisitr).\nIsto não irá desfazer nenhuma mudança que foi feita na cena original da saída."
8
 QuickTransitions.DuplicateScene="Duplicar Cena"
9
@@ -96,6 +97,7 @@
10
 ConfirmRemove.Text="Tem certeza que deseja remover '$1'?"
11
 ConfirmRemove.TextMultiple="Você tem certeza que quer remover esses %1 itens?"
12
 
13
+
14
 Output.ConnectFail.Title="Falha ao conectar"
15
 Output.ConnectFail.BadPath="Caminho inválido ou URL inválida. Por favor verifique se as configurações estão válidas."
16
 Output.ConnectFail.ConnectFailed="Falha ao conectar com o Servidor"
17
@@ -172,6 +174,7 @@
18
 Deinterlacing.TopFieldFirst="Campo Superior Primeiro"
19
 Deinterlacing.BottomFieldFirst="Campo Inferior Primeiro"
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Adicionar Cena"
23
 Basic.Main.AddSceneDlg.Text="Por favor, digite o nome da cena"
24
 
25
@@ -361,8 +364,8 @@
26
 Basic.Settings.General.SnapDistance="Sensibilidade de Encaixamento"
27
 Basic.Settings.General.RecordWhenStreaming="Gravar automaticamente quando estiver transmitindo"
28
 Basic.Settings.General.KeepRecordingWhenStreamStops="Continuar gravando quando a transmissão parar"
29
-Basic.Settings.General.SysTrayEnabled="Habilitar o ícone de bandeja do sistema"
30
 Basic.Settings.General.SysTrayWhenStarted="Minimizar para a bandeja do sistema quando iniciar"
31
+Basic.Settings.General.SaveProjectors="Salvar projetores ao sair"
32
 
33
 Basic.Settings.Stream="Stream"
34
 Basic.Settings.Stream.StreamType="Tipo de Stream"
35
@@ -504,6 +507,7 @@
36
 Basic.Settings.Advanced.Video.ColorRange="Gama de cores YUV"
37
 Basic.Settings.Advanced.Video.ColorRange.Partial="Limitado"
38
 Basic.Settings.Advanced.Video.ColorRange.Full="Completo"
39
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Padrão"
40
 Basic.Settings.Advanced.StreamDelay="Atraso da transmissão"
41
 Basic.Settings.Advanced.StreamDelay.Duration="Duração (segundos)"
42
 Basic.Settings.Advanced.StreamDelay.Preserve="Preservar o ponto de corte (aumento de atraso) quando reconectar"
43
obs-studio-17.0.2.tar.xz/UI/data/locale/pt-PT.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/pt-PT.ini Changed
33
 
1
@@ -53,6 +53,7 @@
2
 Minutes="Minutos"
3
 Seconds="Segundos"
4
 
5
+
6
 QuickTransitions.SwapScenes="Trocar pré-visualização/saída de cenas Depois de uma Transição"
7
 QuickTransitions.DuplicateScene="Duplicar cena"
8
 QuickTransitions.EditProperties="Fontes duplicadas"
9
@@ -91,6 +92,7 @@
10
 ConfirmRemove.Text="Tem a certeza que quer remover '$1'?"
11
 ConfirmRemove.TextMultiple="Tem a certeza de que pretende remover %1 itens?"
12
 
13
+
14
 Output.ConnectFail.Title="Falha ao ligar"
15
 Output.ConnectFail.BadPath="Caminho ou endereço de ligação inválido. Por favor, verifique as suas definições para confirmar que são válidas."
16
 Output.ConnectFail.ConnectFailed="Falhou a ligação ao servidor"
17
@@ -160,6 +162,7 @@
18
 Deinterlacing.TopFieldFirst="Campo Superior Primeiro"
19
 Deinterlacing.BottomFieldFirst="Campo Inferior Primeiro"
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Adicionar Cena"
23
 Basic.Main.AddSceneDlg.Text="Por favor introduza o nome da cena"
24
 
25
@@ -328,7 +331,6 @@
26
 Basic.Settings.General.SnapDistance="Sensibilidade do Snap"
27
 Basic.Settings.General.RecordWhenStreaming="Gravar automaticamente quando estiver a transmitir"
28
 Basic.Settings.General.KeepRecordingWhenStreamStops="Continuar a gravar quando a transmissão parar"
29
-Basic.Settings.General.SysTrayEnabled="Ativar ícone da área de notificações"
30
 Basic.Settings.General.SysTrayWhenStarted="Minimizar para a área de notificações quando iniciado"
31
 
32
 Basic.Settings.Stream="Transmissão"
33
obs-studio-17.0.2.tar.xz/UI/data/locale/ro-RO.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/ro-RO.ini Changed
103
 
1
@@ -48,6 +48,13 @@
2
 Right="Dreapta"
3
 Top="Sus"
4
 Bottom="Jos"
5
+Hours="Ore"
6
+Minutes="Minute"
7
+Seconds="Secunde"
8
+Deprecated="Invechit"
9
+Import="Importă"
10
+Export="Exportă"
11
+
12
 
13
 QuickTransitions.SwapScenes="Comută între previzualizare/scenele de ieșire după tranziționare"
14
 QuickTransitions.SwapScenesTT="Schimba previzualizarea si scenele de output dupa tranzitionare (în cazul în care încă există outputul scenei originale). \nAceasta nu va anula nicio modificăre care au fost făcute la outputul scenei originale."
15
@@ -87,6 +94,8 @@
16
 
17
 ConfirmRemove.Title="Confirmă eliminarea"
18
 ConfirmRemove.Text="Sigur dorești să elimini „$1”?"
19
+ConfirmRemove.TextMultiple="Sigur doriți sa eliminați %1 obiecte?"
20
+
21
 
22
 Output.ConnectFail.Title="Eșec la conectare"
23
 Output.ConnectFail.BadPath="URL-ul conexiunii sau calea este invalidă.  Te rugăm să verifici setările pentru a confirma că acestea sunt valide."
24
@@ -118,6 +127,7 @@
25
 Remux.SourceFile="Înregistrare OBS"
26
 Remux.TargetFile="Fișier țintă"
27
 Remux.Remux="Remux"
28
+Remux.OBSRecording="Înregistrare OBS"
29
 Remux.FinishedTitle="Remuxing încheiat"
30
 Remux.Finished="Înregistrare remuxată"
31
 Remux.FinishedError="Înregistrare remuxată, însă fișierul poate fi incomplet"
32
@@ -143,6 +153,9 @@
33
 
34
 Basic.Main.PreviewConextMenu.Enable="Activează previzualizarea"
35
 
36
+ScaleFiltering.Bilinear="Biliniar"
37
+ScaleFiltering.Bicubic="Bicubic"
38
+ScaleFiltering.Lanczos="Lanczos"
39
 
40
 Deinterlacing="Deîntrețesere"
41
 Deinterlacing.Discard="Înlătură"
42
@@ -156,6 +169,7 @@
43
 Deinterlacing.TopFieldFirst="Câmpul de sus prima oară"
44
 Deinterlacing.BottomFieldFirst="Câmpul de jos prima oară"
45
 
46
+
47
 Basic.Main.AddSceneDlg.Title="Adaugă scenă"
48
 Basic.Main.AddSceneDlg.Text="Te rugăm să introduci numele scenei"
49
 
50
@@ -290,7 +304,11 @@
51
 
52
 Basic.MainMenu.SceneCollection="Colecție de &scene"
53
 Basic.MainMenu.Profile="&Profil"
54
+Basic.MainMenu.Profile.Import="Importă Profil"
55
+Basic.MainMenu.Profile.Export="Exportă profil"
56
+Basic.MainMenu.Profile.Exists="Profilul deja există"
57
 
58
+Basic.MainMenu.Tools="&Unelte"
59
 
60
 Basic.MainMenu.Help="&Ajutor"
61
 Basic.MainMenu.Help.Website="Vizitează site-ul &web"
62
@@ -329,6 +347,8 @@
63
 Basic.Settings.Output.Mode.Simple="Simplu"
64
 Basic.Settings.Output.Mode.Adv="Avansat"
65
 Basic.Settings.Output.Mode.FFmpeg="Ieșire FFmpeg"
66
+Basic.Settings.Output.ReplayBuffer.Estimate="Utilizare estimată a memoriei: %1 MB"
67
+Basic.Settings.Output.ReplayBuffer.Suffix="Sufix"
68
 Basic.Settings.Output.Simple.SavePath="Cale de înregistrare"
69
 Basic.Settings.Output.Simple.RecordingQuality="Calitatea înregistrării"
70
 Basic.Settings.Output.Simple.RecordingQuality.Stream="La fel cu cea a streamului"
71
@@ -432,6 +452,11 @@
72
 Basic.Settings.Audio.UnknownAudioDevice="[Dispozitivul nu este disponibil sau nu este conectat]"
73
 
74
 Basic.Settings.Advanced="Avansate"
75
+Basic.Settings.Advanced.General.ProcessPriority="Prioritate Proces"
76
+Basic.Settings.Advanced.General.ProcessPriority.High="Ridicată"
77
+Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Peste Normal"
78
+Basic.Settings.Advanced.General.ProcessPriority.Normal="Normală"
79
+Basic.Settings.Advanced.General.ProcessPriority.Idle="Inactiv"
80
 Basic.Settings.Advanced.FormatWarning="Atentie: Formatele de culori diferite de NV12 sunt facute pentru inregistrare si nu sunt recomandate in cazul streaming-ului. Streaming-ul e posibil sa ceara mai multe resurse CPU datorita conversiei formatului culorii."
81
 Basic.Settings.Advanced.Audio.BufferingTime="Timp de buffering pentru audio"
82
 Basic.Settings.Advanced.Video.ColorFormat="Format de culoare"
83
@@ -443,6 +468,8 @@
84
 Basic.Settings.Advanced.StreamDelay.Duration="Durată (secunde)"
85
 Basic.Settings.Advanced.StreamDelay.Preserve="Păstrează punctul de tăiere (crește întârzierea) la reconectare"
86
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Utilizare estimată a memoriei: %1 MB"
87
+Basic.Settings.Advanced.Network="Rețea"
88
+Basic.Settings.Advanced.Network.BindToIP="Leagă de IP"
89
 
90
 Basic.AdvAudio="Proprietăți audio avansate"
91
 Basic.AdvAudio.Name="Nume"
92
@@ -457,7 +484,10 @@
93
 
94
 Basic.Hotkeys.SelectScene="Comută la scenă"
95
 
96
+Basic.SystemTray.Show="Afișează"
97
+Basic.SystemTray.Hide="Ascunde"
98
 
99
+Basic.SystemTray.Message.Reconnecting="Deconectat. Reconectare..."
100
 
101
 Hotkeys.Insert="Inserează"
102
 Hotkeys.Delete="Șterge"
103
obs-studio-17.0.2.tar.xz/UI/data/locale/ru-RU.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/ru-RU.ini Changed
113
 
1
@@ -57,6 +57,19 @@
2
 Import="Импорт"
3
 Export="Экспорт"
4
 
5
+Updater.Title="Доступно обновление"
6
+Updater.Text="Доступно новое обновление:"
7
+Updater.UpdateNow="Обновить сейчас"
8
+Updater.RemindMeLater="Напомнить позже"
9
+Updater.Skip="Пропустить версию"
10
+Updater.Running.Title="Программа в настоящее время активна"
11
+Updater.Running.Text="Обнаружена активная операция вывода. Перед обновлением необходимо отключить все активные операции вывода"
12
+Updater.NoUpdatesAvailable.Title="Нет доступных обновлений"
13
+Updater.NoUpdatesAvailable.Text="Обновления не обнаружены"
14
+Updater.FailedToLaunch="Не удалось проверить обновления"
15
+Updater.GameCaptureActive.Title="Производится захват игры"
16
+Updater.GameCaptureActive.Text="Библиотека захвата игр уже используется. Закройте захватываемые игры/программы (или перезапустите Windows) и попробуйте ещё раз."
17
+
18
 QuickTransitions.SwapScenes="Замена Просмотра/Вывода Сцены После Перехода"
19
 QuickTransitions.SwapScenesTT="Замена просмотра и вывода сцены после перехода (если выходная оригинальная сцена до сих пор существует).\nЭто будет не отмена каких-либо изменений, что, возможно, было сделано в выходной оригинальной сцены."
20
 QuickTransitions.DuplicateScene="Повторяющиеся Сцены"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="Вы уверены, что хотите удалить '$1'?"
23
 ConfirmRemove.TextMultiple="Вы уверены, что вы хотите удалить %1 элементов?"
24
 
25
+Output.StartStreamFailed="Не удалось запустить вещание"
26
+Output.StartRecordingFailed="Не удалось начать запись"
27
+Output.StartReplayFailed="Не удалось запустить воспроизведение из буфера"
28
+Output.StartFailedGeneric="Сбой вывода. Подробности отражены в журнале.\n\nПримечание: Если вы используете кодировщики NVENC или AMD, убедитесь что у вас установлена последняя версия видеорайвера."
29
+
30
 Output.ConnectFail.Title="Не удалось подключиться"
31
 Output.ConnectFail.BadPath="Неверный путь или URL соединения. Пожалуйста, проверьте настройки, чтобы подтвердить, что они являются действительными."
32
 Output.ConnectFail.ConnectFailed="Не удалось подключиться к серверу"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="Верхнее поле первое"
35
 Deinterlacing.BottomFieldFirst="Нижнее поле первое"
36
 
37
+VolControl.SliderUnmuted="Регулятор громкости '%1': %2"
38
+VolControl.SliderMuted="Регулятор громкости '%1': %2 (сейчас заглушен)"
39
+VolControl.Mute="Заглушить '%1'"
40
+VolControl.Properties="Свойства '%1'"
41
+
42
 Basic.Main.AddSceneDlg.Title="Добавить сцену"
43
 Basic.Main.AddSceneDlg.Text="Пожалуйста, введите название сцены"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="Общие"
47
 Basic.Settings.General.Theme="Тема"
48
 Basic.Settings.General.Language="Язык"
49
+Basic.Settings.General.EnableAutoUpdates="Проверять наличие обновлений при запуске"
50
 Basic.Settings.General.WarnBeforeStartingStream="Показывать окно подтверждения при запуске трансляции"
51
 Basic.Settings.General.WarnBeforeStoppingStream="Показывать окно подтверждения при остановке трансляции"
52
+Basic.Settings.General.Projectors="Проекторы"
53
 Basic.Settings.General.HideProjectorCursor="Скрыть курсор за проекторы"
54
 Basic.Settings.General.ProjectorAlwaysOnTop="Показывать проекторы поверх всего остального"
55
 Basic.Settings.General.Snapping="Привязка расположения источника"
56
@@ -362,8 +387,12 @@
57
 Basic.Settings.General.SnapDistance="Чувствительность привязки"
58
 Basic.Settings.General.RecordWhenStreaming="Автоматическая запись при стриме"
59
 Basic.Settings.General.KeepRecordingWhenStreamStops="Продолжить запись, когда стрим остановится"
60
-Basic.Settings.General.SysTrayEnabled="Показывать иконку в системном трее"
61
+Basic.Settings.General.ReplayBufferWhileStreaming="Автоматически запускать буфер повтора во время трансляции"
62
+Basic.Settings.General.KeepReplayBufferStreamStops="Сохранять буфер повтора активным когда останавливается трансляция"
63
+Basic.Settings.General.SysTray="Системный трей"
64
 Basic.Settings.General.SysTrayWhenStarted="Скрывать окно в системный трей при запуске"
65
+Basic.Settings.General.SystemTrayHideMinimize="Всегда сворачивать в трей вместо панели задач"
66
+Basic.Settings.General.SaveProjectors="Сохранять проекторы при выходе"
67
 
68
 Basic.Settings.Stream="Вещание"
69
 Basic.Settings.Stream.StreamType="Тип вещания"
70
@@ -452,6 +481,8 @@
71
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="Кодировщик аудио"
72
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Настройки кодировщика аудио (если есть)"
73
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Настройки мультиплексора (если есть)"
74
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Интервал ключевых кадров (кадры)"
75
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Показать все кодеки (даже потенциально несовместимые)"
76
 
77
 FilenameFormatting.completer="%DD-%MM-%CCYY %hh-%mm-%ss\n%DD-%MM-%YY %hh-%mm-%ss\n%d-%m-%Y %H-%M-%S\n%d-%m-%y %H-%M-%S\n%a %d-%m-%Y %H-%M-%S\n%A %d-%m-%Y %H-%M-%S\n%d-%b-%Y %H-%M-%S\n%d-%B-%Y %H-%M-%S"
78
 
79
@@ -505,12 +536,16 @@
80
 Basic.Settings.Advanced.Video.ColorRange="Цветовой диапазон YUV"
81
 Basic.Settings.Advanced.Video.ColorRange.Partial="Частичный"
82
 Basic.Settings.Advanced.Video.ColorRange.Full="Полный"
83
+Basic.Settings.Advanced.Audio.MonitoringDevice="Устройство прослушивания аудио"
84
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="По умолчанию"
85
 Basic.Settings.Advanced.StreamDelay="Задержка потока"
86
 Basic.Settings.Advanced.StreamDelay.Duration="Продолжительность (секунд)"
87
 Basic.Settings.Advanced.StreamDelay.Preserve="Сохранить точку отсечки (увеличить задержку) при переподключении"
88
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Предполагаемое использование памяти: %1 МБ"
89
 Basic.Settings.Advanced.Network="Сеть"
90
 Basic.Settings.Advanced.Network.BindToIP="Привязать к IP"
91
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Включить новый сетевой код"
92
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Режим низкой задержки"
93
 
94
 Basic.AdvAudio="Расширенные свойства аудио"
95
 Basic.AdvAudio.Name="Название"
96
@@ -518,6 +553,10 @@
97
 Basic.AdvAudio.Mono="Объединение в один канал"
98
 Basic.AdvAudio.Panning="Панорамирование"
99
 Basic.AdvAudio.SyncOffset="Смещение синхронизации (мс)"
100
+Basic.AdvAudio.Monitoring="Аудио прослушивание"
101
+Basic.AdvAudio.Monitoring.None="Выключить прослушивание"
102
+Basic.AdvAudio.Monitoring.MonitorOnly="Только прослушивание (заглушить вывод)"
103
+Basic.AdvAudio.Monitoring.Both="Прослушивание и вывод"
104
 Basic.AdvAudio.AudioTracks="Дорожки"
105
 
106
 Basic.Settings.Hotkeys="Горячие клавиши"
107
@@ -576,4 +615,5 @@
108
 
109
 OutputWarnings.NoTracksSelected="Вы должны выбрать хотя бы одну звуковую дорожку"
110
 OutputWarnings.MultiTrackRecording="Предупреждение: Некоторые форматы (такие как FLV) не поддерживают множественные звуковые дорожки"
111
+OutputWarnings.MP4Recording="Внимание: Записи, сохраненные в MP4 будут нечитаемы, если файл не будет завершен (например, в результате BSOD'а, потери напряжения в сети и т.д.). Если вы хотите записывать несколько аудио дорожек, рассмотрите использование MKV, и последующее ремультиплексирование в MP4 после завершения записи (Файл -> Ремультиплексирование записей)"
112
 
113
obs-studio-17.0.2.tar.xz/UI/data/locale/sk-SK.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/sk-SK.ini Changed
25
 
1
@@ -46,6 +46,7 @@
2
 Minutes="Minúty"
3
 Seconds="Sekundy"
4
 
5
+
6
 QuickTransitions.DuplicateScene="Duplikovať scénu"
7
 
8
 Basic.TransitionDuration="Trvanie"
9
@@ -73,6 +74,7 @@
10
 ConfirmRemove.Title="Potvrdenie odobratia"
11
 ConfirmRemove.Text="Naozaj si prajete odobrať '$1'?"
12
 
13
+
14
 Output.ConnectFail.Title="Spojenie sa nepodarilo"
15
 Output.ConnectFail.BadPath="Neplatná cesta alebo URL. Prosím, skontrolujte, či sú vaše nastavenia správne."
16
 Output.ConnectFail.ConnectFailed="Spojenie so serverom sa nepodarilo"
17
@@ -107,6 +109,7 @@
18
 
19
 
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Pridať scénu"
23
 Basic.Main.AddSceneDlg.Text="Prosím, zadajte názov scény"
24
 
25
obs-studio-17.0.2.tar.xz/UI/data/locale/sl-SI.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/sl-SI.ini Changed
25
 
1
@@ -31,6 +31,7 @@
2
 
3
 
4
 
5
+
6
 NameExists.Title="Ime že obstaja"
7
 NameExists.Text="Ime je že v uporabi."
8
 
9
@@ -44,6 +45,7 @@
10
 ConfirmRemove.Title="Potrdite odstranitev"
11
 ConfirmRemove.Text="Ali ste prepričani, da želite odstraniti '$ 1'?"
12
 
13
+
14
 Output.ConnectFail.Title="Povezava ni uspela"
15
 Output.ConnectFail.BadPath="Neveljavna pot ali URL povezava. Prosimo, preverite vaše nastavitve za potrditev, da so veljavne."
16
 Output.ConnectFail.ConnectFailed="Ni uspelo povezati s strežnikom"
17
@@ -81,6 +83,7 @@
18
 
19
 
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Dodaj seceno"
23
 Basic.Main.AddSceneDlg.Text="Prosimo, vnesite ime scene"
24
 
25
obs-studio-17.0.2.tar.xz/UI/data/locale/sr-CS.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/sr-CS.ini Changed
33
 
1
@@ -54,6 +54,7 @@
2
 Seconds="Sekundi"
3
 Deprecated="Prevaziđeno"
4
 
5
+
6
 QuickTransitions.SwapScenes="Zameni scene pregleda/izlaza nakon prelaza"
7
 QuickTransitions.SwapScenesTT="Zamenjuje scene pregleda i izlaza nakon prelaza (ako originalna scena izlaza još uvek postoji).\nOvo neće poništiti promene koje su načinjene nad originalnom scenom izlaza."
8
 QuickTransitions.DuplicateScene="Dupliraj scenu"
9
@@ -94,6 +95,7 @@
10
 ConfirmRemove.Text="Da li ste sigurni da želite izbaciti '$1'?"
11
 ConfirmRemove.TextMultiple="Da li ste sigurni da želite izbaciti %1 stavke?"
12
 
13
+
14
 Output.ConnectFail.Title="Neuspešno povezivanje"
15
 Output.ConnectFail.BadPath="Neispravna putanja ili URL konekcije. Molim proverite vaša podešavanja da potvrdite njihovu ispravnost."
16
 Output.ConnectFail.ConnectFailed="Neuspešno povezivanje na server"
17
@@ -168,6 +170,7 @@
18
 Deinterlacing.TopFieldFirst="Prvo gornje polje"
19
 Deinterlacing.BottomFieldFirst="Prvo donje polje"
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Dodaj scenu"
23
 Basic.Main.AddSceneDlg.Text="Molim unesite ime scene"
24
 
25
@@ -346,7 +349,6 @@
26
 Basic.Settings.General.SnapDistance="Osetljivost privlačenja"
27
 Basic.Settings.General.RecordWhenStreaming="Automatsko snimanje pri emitovanju"
28
 Basic.Settings.General.KeepRecordingWhenStreamStops="Nastavi snimati kada se emitovanje zaustavi"
29
-Basic.Settings.General.SysTrayEnabled="Omogući ikonicu u sistemskom panelu"
30
 Basic.Settings.General.SysTrayWhenStarted="Pri pokretanju minimiziraj na ikonicu u sistemskom panelu"
31
 
32
 Basic.Settings.Stream="Strim"
33
obs-studio-17.0.2.tar.xz/UI/data/locale/sr-SP.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/sr-SP.ini Changed
33
 
1
@@ -54,6 +54,7 @@
2
 Seconds="Секунди"
3
 Deprecated="Превазиђено"
4
 
5
+
6
 QuickTransitions.SwapScenes="Замени сцене прегледа/излаза након прелаза"
7
 QuickTransitions.SwapScenesTT="Замењује сцене прегледа и излаза након прелаза (ако оригинална сцена још увек постоји).\nОво неће поништити промене које су начињене над оригиналном сценом излаза."
8
 QuickTransitions.DuplicateScene="Дуплирај сцену"
9
@@ -94,6 +95,7 @@
10
 ConfirmRemove.Text="Да ли сте сигурни да желите избацити '$1'?"
11
 ConfirmRemove.TextMultiple="Да ли сте сигурни да желите избацити %1 ставке?"
12
 
13
+
14
 Output.ConnectFail.Title="Неуспешно повезивање"
15
 Output.ConnectFail.BadPath="Неисправна путања или URL конекције. Молим проверите ваша подешавања да потврдите њихову исправност."
16
 Output.ConnectFail.ConnectFailed="Неуспешно повезивање на сервер"
17
@@ -168,6 +170,7 @@
18
 Deinterlacing.TopFieldFirst="Прво горње поље"
19
 Deinterlacing.BottomFieldFirst="Прво доње поље"
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Додај сцену"
23
 Basic.Main.AddSceneDlg.Text="Молим унесите име сцене"
24
 
25
@@ -346,7 +349,6 @@
26
 Basic.Settings.General.SnapDistance="Осетљивост привлачења"
27
 Basic.Settings.General.RecordWhenStreaming="Аутоматско снимање при емитовању"
28
 Basic.Settings.General.KeepRecordingWhenStreamStops="Настави снимати када се емитовање заустави"
29
-Basic.Settings.General.SysTrayEnabled="Омогући иконицу у системском панелу"
30
 Basic.Settings.General.SysTrayWhenStarted="При покретању минимизирај на иконицу у системском панелу"
31
 
32
 Basic.Settings.Stream="Стрим"
33
obs-studio-17.0.2.tar.xz/UI/data/locale/sv-SE.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/sv-SE.ini Changed
117
 
1
@@ -28,9 +28,9 @@
2
 Mono="Mono"
3
 Stereo="Stereo"
4
 DroppedFrames="Tappade bildrutor %1 (%2%)"
5
-PreviewProjector="Fullskärm projektor (Förhandsvisa)"
6
-SceneProjector="Fullskärm projektor (scen)"
7
-SourceProjector="Fullskärm projektor (källa)"
8
+PreviewProjector="Fullskärmsprojektor (förhandsvisning)"
9
+SceneProjector="Fullskärmsprojektor (scen)"
10
+SourceProjector="Fullskärmsprojektor (källa)"
11
 Clear="Rensa"
12
 Revert="Återgå"
13
 Show="Visa"
14
@@ -57,6 +57,19 @@
15
 Import="Importera"
16
 Export="Exportera"
17
 
18
+Updater.Title="Ny uppdatering tillgänglig"
19
+Updater.Text="Det finns en ny uppdatering tillgänglig:"
20
+Updater.UpdateNow="Uppdatera nu"
21
+Updater.RemindMeLater="Påminn mig senare"
22
+Updater.Skip="Hoppa över version"
23
+Updater.Running.Title="Programmet körs för tillfället"
24
+Updater.Running.Text="Utmatningar pågår för tillfället, stäng ned alla aktiva utmatningar innan du uppdaterar"
25
+Updater.NoUpdatesAvailable.Title="Inga tillgängliga uppdateringar"
26
+Updater.NoUpdatesAvailable.Text="Inga uppdateringar är tillgängliga för närvarande"
27
+Updater.FailedToLaunch="Misslyckades att starta uppdateringen"
28
+Updater.GameCaptureActive.Title="Spelkälla aktiv"
29
+Updater.GameCaptureActive.Text="Hook-biblioteket för spelkällor används för tillfället. Stäng alla spel/program som spelas in (eller starta om Windows) och försök igen."
30
+
31
 QuickTransitions.SwapScenes="Byt plats på Förhandsvisnings-/utdatascenerna efter skifte"
32
 QuickTransitions.SwapScenesTT="Byter plats på förhandsvisnings- och utdatascenerna efter övergång (om utdatans originalscen fortfarande finns). \nDet här kommer inte att ångra några förändringar i utdatans originalscen."
33
 QuickTransitions.DuplicateScene="Duplicera scen"
34
@@ -97,6 +110,11 @@
35
 ConfirmRemove.Text="Vill du verkligen ta bort '$1'?"
36
 ConfirmRemove.TextMultiple="Är du säker på att du vill ta bort %1 poster?"
37
 
38
+Output.StartStreamFailed="Misslyckades att starta strömning"
39
+Output.StartRecordingFailed="Misslyckades att starta inspelning"
40
+Output.StartReplayFailed="Misslyckades att starta reprisbuffert"
41
+Output.StartFailedGeneric="Misslyckades att starta utmatningen.  Kolla loggen för detaljer.\n\nOBS: Om du använder kodarna NVENC eller AMD, se till att dina grafikdrivrutiner är uppdaterade."
42
+
43
 Output.ConnectFail.Title="Anslutning misslyckades"
44
 Output.ConnectFail.BadPath="Ogiltig sökväg eller anslutnings-URL. Kontrollera att dina inställningar är korrekta."
45
 Output.ConnectFail.ConnectFailed="Kunde inte ansluta till servern"
46
@@ -153,7 +171,7 @@
47
 Basic.Scene="Scen"
48
 Basic.DisplayCapture="Bildskärmskälla"
49
 
50
-Basic.Main.PreviewConextMenu.Enable="Förhandsvisa"
51
+Basic.Main.PreviewConextMenu.Enable="Aktivera förhandsvisning"
52
 
53
 ScaleFiltering="Skalningsfiltrering"
54
 ScaleFiltering.Point="Punkt"
55
@@ -173,6 +191,11 @@
56
 Deinterlacing.TopFieldFirst="Övre fältet först"
57
 Deinterlacing.BottomFieldFirst="Nedre fältet först"
58
 
59
+VolControl.SliderUnmuted="Volymreglage för \"%1\": %2"
60
+VolControl.SliderMuted="Volymreglage för \"%1\": %2 (tyst för tillfället)"
61
+VolControl.Mute="Tysta \"%1\""
62
+VolControl.Properties="Egenskaper för \"%1\""
63
+
64
 Basic.Main.AddSceneDlg.Title="Lägg till scen"
65
 Basic.Main.AddSceneDlg.Text="Vänligen ange ett namn för scenen"
66
 
67
@@ -351,8 +374,10 @@
68
 Basic.Settings.General="Allmänt"
69
 Basic.Settings.General.Theme=" Tema"
70
 Basic.Settings.General.Language="Språk"
71
+Basic.Settings.General.EnableAutoUpdates="Sök efter uppdateringar automatiskt vid start"
72
 Basic.Settings.General.WarnBeforeStartingStream="Visa bekräftelsedialog när ström startas"
73
 Basic.Settings.General.WarnBeforeStoppingStream="Visa bekräftelsedialog när ström stoppas"
74
+Basic.Settings.General.Projectors="Projektorer"
75
 Basic.Settings.General.HideProjectorCursor="Dölj pekaren över projektorer"
76
 Basic.Settings.General.ProjectorAlwaysOnTop="Lägg alltid projektorer överst"
77
 Basic.Settings.General.Snapping="Fäst justerbara källor"
78
@@ -362,8 +387,12 @@
79
 Basic.Settings.General.SnapDistance="Fästkänslighet"
80
 Basic.Settings.General.RecordWhenStreaming="Spela automatiskt in vid strömning"
81
 Basic.Settings.General.KeepRecordingWhenStreamStops="Fortsätt spela in när strömmen stoppas"
82
-Basic.Settings.General.SysTrayEnabled="Aktivera ikon i meddelandefältet"
83
+Basic.Settings.General.ReplayBufferWhileStreaming="Starta reprisbufferten automatiskt vid strömning"
84
+Basic.Settings.General.KeepReplayBufferStreamStops="Håll reprisbufferten aktiv när ström stoppas"
85
+Basic.Settings.General.SysTray="Systemfält"
86
 Basic.Settings.General.SysTrayWhenStarted="Minimera till meddelandefältet vid start"
87
+Basic.Settings.General.SystemTrayHideMinimize="Minimera alltid till meddelandefältet i stället för aktivitetsfältet"
88
+Basic.Settings.General.SaveProjectors="Spara projektorer vid avslut"
89
 
90
 Basic.Settings.Stream="Ström"
91
 Basic.Settings.Stream.StreamType="Strömtyp"
92
@@ -505,11 +534,16 @@
93
 Basic.Settings.Advanced.Video.ColorRange="YUV färgområde"
94
 Basic.Settings.Advanced.Video.ColorRange.Partial="Partiell"
95
 Basic.Settings.Advanced.Video.ColorRange.Full="Full"
96
+Basic.Settings.Advanced.Audio.MonitoringDevice="Ljuduppspelningsenhet"
97
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Standard"
98
 Basic.Settings.Advanced.StreamDelay="Strömfördröjning"
99
 Basic.Settings.Advanced.StreamDelay.Duration="Varaktighet (sekunder)"
100
+Basic.Settings.Advanced.StreamDelay.Preserve="Behåll stoppunkten (öka fördröjningen) vid återanslutning"
101
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Uppskattad minnesanvändning: %1 MB"
102
 Basic.Settings.Advanced.Network="Nätverk"
103
 Basic.Settings.Advanced.Network.BindToIP="Bind till IP"
104
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Aktivera ny nätverkskod"
105
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Låg latens-läge"
106
 
107
 Basic.AdvAudio="Avancerade ljudinställningar"
108
 Basic.AdvAudio.Name="Namn"
109
@@ -517,6 +551,7 @@
110
 Basic.AdvAudio.Mono="Nedmixa till mono"
111
 Basic.AdvAudio.Panning="Panorering"
112
 Basic.AdvAudio.SyncOffset="Sync Offset (ms)"
113
+Basic.AdvAudio.Monitoring="Ljuduppspelning"
114
 Basic.AdvAudio.AudioTracks="Spår"
115
 
116
 Basic.Settings.Hotkeys="Kortkommandon"
117
obs-studio-17.0.2.tar.xz/UI/data/locale/ta-IN.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/ta-IN.ini Changed
8
 
1
@@ -92,3 +92,6 @@
2
 
3
 
4
 
5
+
6
+
7
+
8
obs-studio-17.0.2.tar.xz/UI/data/locale/th-TH.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/th-TH.ini Changed
21
 
1
@@ -43,9 +43,11 @@
2
 
3
 
4
 
5
+
6
 ConfirmRemove.Title="ยืนยันการลบ"
7
 ConfirmRemove.Text="คุณแน่ใจแล้วหรือที่จะลบ '$1'?"
8
 
9
+
10
 Output.ConnectFail.Title="ไม่สามารถเชื่อมต่อได้"
11
 Output.ConnectFail.ConnectFailed="ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์"
12
 Output.ConnectFail.Disconnected="ถูกตัดออกจากเซิร์ฟเวอร์"
13
@@ -66,6 +68,7 @@
14
 
15
 
16
 
17
+
18
 Basic.Main.AddSceneDlg.Title="เพิ่มฉาก"
19
 
20
 Basic.Main.DefaultSceneName.Text="ฉาก %1"
21
obs-studio-17.0.2.tar.xz/UI/data/locale/tr-TR.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/tr-TR.ini Changed
93
 
1
@@ -57,6 +57,17 @@
2
 Import="İçe Aktar"
3
 Export="Dışa Aktar"
4
 
5
+Updater.Title="Yeni güncelleme mevcut"
6
+Updater.Text="Mevcut yeni bir güncelleme var:"
7
+Updater.UpdateNow="Şimdi Güncelle"
8
+Updater.RemindMeLater="Daha sonra hatırlat"
9
+Updater.Skip="Sürümü Atla"
10
+Updater.Running.Title="Program şu anda etkin"
11
+Updater.NoUpdatesAvailable.Title="Güncelleme mevcut değil"
12
+Updater.NoUpdatesAvailable.Text="Şu anda mevcut hiçbir güncelleme yok"
13
+Updater.FailedToLaunch="Güncelleyici başlatılamadı"
14
+Updater.GameCaptureActive.Title="Oyun yakalama etkin"
15
+
16
 QuickTransitions.DuplicateScene="Sahneyi Çoğalt"
17
 QuickTransitions.EditProperties="Kaynakları Çoğalt"
18
 QuickTransitions.HotkeyName="Hızlı Geçiş: %1"
19
@@ -93,6 +104,10 @@
20
 ConfirmRemove.Text="'$1''i kaldırmak istediğinizden emin misiniz?"
21
 ConfirmRemove.TextMultiple="%1 öğeyi kaldırmak istediğinizden emin misiniz?"
22
 
23
+Output.StartStreamFailed="Yayın işlemi başarısız oldu"
24
+Output.StartRecordingFailed="Kayıt işlemi başarısız oldu"
25
+Output.StartReplayFailed="Tekrar oynatma arabelleği başarısız oldu"
26
+
27
 Output.ConnectFail.Title="Bağlantı kurulamadı"
28
 Output.ConnectFail.BadPath="Bağlantı adresiniz geçersiz. Ayarlarınızı kontrol edin ve geçerli bir adres giriniz."
29
 Output.ConnectFail.ConnectFailed="Sunucuya bağlanılamadı"
30
@@ -167,6 +182,9 @@
31
 Deinterlacing.TopFieldFirst="Önce Üst Alan"
32
 Deinterlacing.BottomFieldFirst="Önce Alt Alan"
33
 
34
+VolControl.SliderUnmuted="'%1' için ses kaydırıcı: %2"
35
+VolControl.Properties="'%1' için özellikler"
36
+
37
 Basic.Main.AddSceneDlg.Title="Sahne Ekle"
38
 Basic.Main.AddSceneDlg.Text="Lütfen sahne adını giriniz"
39
 
40
@@ -345,8 +363,10 @@
41
 Basic.Settings.General="Genel"
42
 Basic.Settings.General.Theme="Tema"
43
 Basic.Settings.General.Language="Dil"
44
+Basic.Settings.General.EnableAutoUpdates="Başlangıçta güncellemeleri otomatik olarak kontrol et"
45
 Basic.Settings.General.WarnBeforeStartingStream="Yayın başlatırken onay iletişim kutusunu göster"
46
 Basic.Settings.General.WarnBeforeStoppingStream="Yayın durduğunda onay iletişim kutusunu göster"
47
+Basic.Settings.General.Projectors="Projektörler"
48
 Basic.Settings.General.HideProjectorCursor="Projektörler üzerinde imleci gizle"
49
 Basic.Settings.General.ProjectorAlwaysOnTop="Projektörleri her zaman üstte tut"
50
 Basic.Settings.General.Snapping="Kaynak Hizalama"
51
@@ -356,8 +376,12 @@
52
 Basic.Settings.General.SnapDistance="Yaslama Hassasiyeti"
53
 Basic.Settings.General.RecordWhenStreaming="Yayın sırasında otomatik olarak kayıt yap"
54
 Basic.Settings.General.KeepRecordingWhenStreamStops="Yayın durduğunda kaydı tut"
55
-Basic.Settings.General.SysTrayEnabled="Sistem tepsisi simgesini etkinleştir"
56
+Basic.Settings.General.ReplayBufferWhileStreaming="Yayın sırasında tekrar oynatma arabelleğini otomatik olarak başlat"
57
+Basic.Settings.General.KeepReplayBufferStreamStops="Yayın durduğunda tekrar oynatma arabelleğini tut"
58
+Basic.Settings.General.SysTray="Sistem tepsisi"
59
 Basic.Settings.General.SysTrayWhenStarted="Başladığında sistem tepsisine küçült"
60
+Basic.Settings.General.SystemTrayHideMinimize="Her zaman görev çubuğu yerine sistem tepsisine küçült"
61
+Basic.Settings.General.SaveProjectors="Çıkışta projektörleri kaydet"
62
 
63
 Basic.Settings.Stream="Yayın"
64
 Basic.Settings.Stream.StreamType="Yayın Türü"
65
@@ -492,12 +516,16 @@
66
 Basic.Settings.Advanced.Video.ColorRange="YUV Renk Aralığı"
67
 Basic.Settings.Advanced.Video.ColorRange.Partial="Kısmi"
68
 Basic.Settings.Advanced.Video.ColorRange.Full="Tam"
69
+Basic.Settings.Advanced.Audio.MonitoringDevice="Ses İzleme Aygıtı"
70
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="Varsayılan"
71
 Basic.Settings.Advanced.StreamDelay="Yayın Gecikmesi"
72
 Basic.Settings.Advanced.StreamDelay.Duration="Süre (saniye)"
73
 Basic.Settings.Advanced.StreamDelay.Preserve="Tatbik ederken kesim noktasını (gecikme artışı) koru"
74
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Tahmini Bellek Kullanımı: %1 MB"
75
 Basic.Settings.Advanced.Network="Ağ"
76
 Basic.Settings.Advanced.Network.BindToIP="IP Bağla"
77
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Yeni ağ kodunu etkinleştir"
78
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Düşük gecike modu"
79
 
80
 Basic.AdvAudio="Gelişmiş Ses Özellikleri"
81
 Basic.AdvAudio.Name="İsim"
82
@@ -505,6 +533,10 @@
83
 Basic.AdvAudio.Mono="Mono Karıştırmayı Azalt"
84
 Basic.AdvAudio.Panning="Kaydırma"
85
 Basic.AdvAudio.SyncOffset="Eşitleme Uzaklığı (ms)"
86
+Basic.AdvAudio.Monitoring="Ses İzleme"
87
+Basic.AdvAudio.Monitoring.None="Ekran Kapalı"
88
+Basic.AdvAudio.Monitoring.MonitorOnly="Sadece Ekran (sessiz çıkış)"
89
+Basic.AdvAudio.Monitoring.Both="Ekran ve Çıkış"
90
 Basic.AdvAudio.AudioTracks="Parçalar"
91
 
92
 Basic.Settings.Hotkeys="Kısayollar"
93
obs-studio-17.0.2.tar.xz/UI/data/locale/uk-UA.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/uk-UA.ini Changed
118
 
1
@@ -57,6 +57,19 @@
2
 Import="Імпорт"
3
 Export="Експорт"
4
 
5
+Updater.Title="Доступне оновлення"
6
+Updater.Text="Існує нове оновлення:"
7
+Updater.UpdateNow="Оновити зараз"
8
+Updater.RemindMeLater="Нагадати пізніше"
9
+Updater.Skip="Пропустити цю версію"
10
+Updater.Running.Title="Програма зараз активна"
11
+Updater.Running.Text="Вивід активний в даний час, будь ласка, завершіть роботу будь-якого активного Виводу перед спробою оновлення"
12
+Updater.NoUpdatesAvailable.Title="Оновлень немає"
13
+Updater.NoUpdatesAvailable.Text="На даний час оновлень немає"
14
+Updater.FailedToLaunch="Не вдалося перевірити оновлення"
15
+Updater.GameCaptureActive.Title="Захват гри активний"
16
+Updater.GameCaptureActive.Text="Бібліотека для Захвату гри наразі використовується. Будь ласка, закрийте всі ігри/програми для яких використовувався захват (або перезавантажте Windows) та спробуйте знов."
17
+
18
 QuickTransitions.SwapScenes="Поміняти місцями сцени Перегляд/Вивід після Відео-переходу"
19
 QuickTransitions.SwapScenesTT="Міняє місцями сцени Перегляд та Вивід після закінчення Відео-переходу (якщо сцена Вивід ще існує).\nЗміни внесені до обох сцен залишаються."
20
 QuickTransitions.DuplicateScene="Використовувати копію сцени"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="Ви дійсно бажаєте видалити \"$1\"?"
23
 ConfirmRemove.TextMultiple="Ви впевнені, що хочете видалити %1 елементів?"
24
 
25
+Output.StartStreamFailed="Не вдалося розпочати трансляцію"
26
+Output.StartRecordingFailed="Не вдалося розпочати запис"
27
+Output.StartReplayFailed="Не вдалося запустити Буфер Повторів"
28
+Output.StartFailedGeneric="Помилка. Вивід не було розпочато.  За додатковою інформацією, будь ласка зверніться до файлу журналу.\n\nПримітка: якщо ви використовуєте NVENC або AMD енкодер, перевірте чи оновлений драйвер відео."
29
+
30
 Output.ConnectFail.Title="Не вдалося підключитися"
31
 Output.ConnectFail.BadPath="Шлях або URL-адреса недосяжні. Будь ласка, перевірте налаштування програмного забезпечення."
32
 Output.ConnectFail.ConnectFailed="Не вдалося підключитися до сервера"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="Спочатку непарні рядки"
35
 Deinterlacing.BottomFieldFirst="Спочатку парні рядки"
36
 
37
+VolControl.SliderUnmuted="Повзунок гучності для '%1': %2"
38
+VolControl.SliderMuted="Повзунок гучності для '%1': %2 (в даний час звук вимкнено)"
39
+VolControl.Mute="Вимкнути звук '%1'"
40
+VolControl.Properties="Властивості для '%1'"
41
+
42
 Basic.Main.AddSceneDlg.Title="Додати Сцену"
43
 Basic.Main.AddSceneDlg.Text="Будь ласка, введіть назву для Сцени"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="Загальні"
47
 Basic.Settings.General.Theme="Тема"
48
 Basic.Settings.General.Language="Мова"
49
+Basic.Settings.General.EnableAutoUpdates="Автоматично перевіряти наявність оновлень під час запуску"
50
 Basic.Settings.General.WarnBeforeStartingStream="Показувати підтвердження для початку трансляції"
51
 Basic.Settings.General.WarnBeforeStoppingStream="Показувати підтвердження для закінчення трансляції"
52
+Basic.Settings.General.Projectors="Проектор"
53
 Basic.Settings.General.HideProjectorCursor="Приховати курсор у режимі Проектор"
54
 Basic.Settings.General.ProjectorAlwaysOnTop="Режим Проектор відображати поверх всіх вікон"
55
 Basic.Settings.General.Snapping="Прив'язка та вирівнювання"
56
@@ -362,8 +387,12 @@
57
 Basic.Settings.General.SnapDistance="Чутливість примагничування"
58
 Basic.Settings.General.RecordWhenStreaming="Автоматично почати запис з початком трансляції"
59
 Basic.Settings.General.KeepRecordingWhenStreamStops="Не припиняти запис, якщо трансляцію закінчено"
60
-Basic.Settings.General.SysTrayEnabled="Відображати іконку системному треї, та згортати в трей"
61
+Basic.Settings.General.ReplayBufferWhileStreaming="Автоматично запустити Буфер Повторів з початком трансляції"
62
+Basic.Settings.General.KeepReplayBufferStreamStops="Не припиняти Буфер Повторів, якщо трансляцію закінчено"
63
+Basic.Settings.General.SysTray="Системний трей"
64
 Basic.Settings.General.SysTrayWhenStarted="Згорнути програму до трею при запуску"
65
+Basic.Settings.General.SystemTrayHideMinimize="Згортати в трей замість того, щоб мінімізувати до панелі завдань"
66
+Basic.Settings.General.SaveProjectors="Зберегти налаштування режиму Проектор при виході"
67
 
68
 Basic.Settings.Stream="Трансляція"
69
 Basic.Settings.Stream.StreamType="Тип Трансляції"
70
@@ -452,10 +481,12 @@
71
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="Енкодер аудіо"
72
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Енкодер аудіо, параметри користувача"
73
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Мультиплексор, параметри користувача"
74
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="Ключові кадри, період (кадрів)"
75
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="Показати всі кодеки (навіть якщо потенційно несумісні)"
76
 
77
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
78
 
79
-FilenameFormatting.TT="%CCYY       Рік, чотири цифри\n%YY      Рік, останні дві цифри (00-99)\n%MM     Місяць за номером (01-12)\n%DD      День місяця, ноль попереду (01-31)\n%hh     Години у 24-год. форматі (00-23)\n%mm       Мінути (00-59)\n%ss     Секунди (00-61)\n%%     Знак % \n%a     Абревіатура дня тижня\n%A       День тижня повністю\n%b     Абревіатура місяця\n%B      Місяць повністю\n%d     День місяця, ноль попереду (01-31)\n%H      Години у 24-год. форматі (00-23)\n%I        Години у 12-год. форматі (01-12)\n%m        Місяць за номером (01-12)\n%M       Мінути (00-59)\n%p      ДП або ПП позначення\n%S        Секунди (00-61)\n%y     Рік, останні дві цифри (00-99)\n%Y      Рік\n%z     ISO 8601 поправка від UTC або часовий\n     пояс чи абревіатура\n%Z     Часовий пояс чи абревіатура\n"
80
+FilenameFormatting.TT="%CCYY   Рік, чотири цифри\n%YY      Рік, останні дві цифри (00-99)\n%MM     Місяць за номером (01-12)\n%DD      День місяця, ноль попереду (01-31)\n%hh     Години у 24-год. форматі (00-23)\n%mm       Мінути (00-59)\n%ss     Секунди (00-61)\n%%     Знак % \n%a     Абревіатура дня тижня\n%A       День тижня повністю\n%b     Абревіатура місяця\n%B      Місяць повністю\n%d     День місяця, ноль попереду (01-31)\n%H      Години у 24-год. форматі (00-23)\n%I        Години у 12-год. форматі (01-12)\n%m        Місяць за номером (01-12)\n%M       Мінути (00-59)\n%p      ДП або ПП позначення\n%S        Секунди (00-61)\n%y     Рік, останні дві цифри (00-99)\n%Y      Рік\n%z     ISO 8601 поправка від UTC або часовий\n     пояс чи абревіатура\n%Z     Часовий пояс чи абревіатура\n"
81
 
82
 Basic.Settings.Video="Відео"
83
 Basic.Settings.Video.Adapter="Відеокарта:"
84
@@ -505,12 +536,16 @@
85
 Basic.Settings.Advanced.Video.ColorRange="YUV, колірний діапазон"
86
 Basic.Settings.Advanced.Video.ColorRange.Partial="Частковий"
87
 Basic.Settings.Advanced.Video.ColorRange.Full="Повний"
88
+Basic.Settings.Advanced.Audio.MonitoringDevice="Пристрій Тестування Аудіо (на слух)"
89
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="За замовчанням"
90
 Basic.Settings.Advanced.StreamDelay="Затримка трансляції"
91
 Basic.Settings.Advanced.StreamDelay.Duration="Тривалість (секунди)"
92
 Basic.Settings.Advanced.StreamDelay.Preserve="Зберегати точку роз'єднання (збільшує затримку) під час встановлення нового зв'язку"
93
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="Буде використано пам'яті: %1 МБ"
94
 Basic.Settings.Advanced.Network="Мережа"
95
 Basic.Settings.Advanced.Network.BindToIP="Прив'язати до адаптера (IP)"
96
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="Увімкнути новий мережевий код"
97
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="Режим з низькою затримкою"
98
 
99
 Basic.AdvAudio="Розширені Налаштування Аудіо"
100
 Basic.AdvAudio.Name="Назва"
101
@@ -518,6 +553,10 @@
102
 Basic.AdvAudio.Mono="Мікшувати до псевдо-Моно"
103
 Basic.AdvAudio.Panning="Баланс"
104
 Basic.AdvAudio.SyncOffset="Зсув синхронізації (мс)"
105
+Basic.AdvAudio.Monitoring="Тестування Аудіо (на слух)"
106
+Basic.AdvAudio.Monitoring.None="Тест вимкнено"
107
+Basic.AdvAudio.Monitoring.MonitorOnly="Слухати, але не Виводити"
108
+Basic.AdvAudio.Monitoring.Both="Слухати та Виводити"
109
 Basic.AdvAudio.AudioTracks="Доріжки"
110
 
111
 Basic.Settings.Hotkeys="Гарячі клавіші"
112
@@ -576,4 +615,5 @@
113
 
114
 OutputWarnings.NoTracksSelected="Ви повинні вибрати хоча б одну аудіо-доріжку"
115
 OutputWarnings.MultiTrackRecording="Попередження: Певні формати (наприклад, FLV) не підтримують кілька треків на запис"
116
+OutputWarnings.MP4Recording="Попередження: Запис в MP4 може стати невиправно пошкодженим, якщо файл не буде завершено (наприклад, в результаті BSOD, втрати живлення і т.п.). Якщо ви хочете, мати запис декількох звукових доріжок спробуйте використати MKV та зробіть ремультиплексацію запису до mp4 після того, як запис буде закінчено (Файл->Ремультиплексація Записів)"
117
 
118
obs-studio-17.0.2.tar.xz/UI/data/locale/vi-VN.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/vi-VN.ini Changed
33
 
1
@@ -53,6 +53,7 @@
2
 Minutes="Phút"
3
 Seconds="Giây"
4
 
5
+
6
 QuickTransitions.SwapScenes="Hoán đổi cảnh Xem trước/Đầu ra sau khi Chuyển cảnh"
7
 QuickTransitions.SwapScenesTT="Hoán đổi cảnh xem trước và cảnh đầu ra sau khi chuyển cảnh (nếu cảnh đầu ra gốc vẫn tồn tại).\nMọi thay đổi với cảnh đầu ra gốc sẽ không hoàn tác."
8
 QuickTransitions.DuplicateScene="Tạo bản sao cảnh"
9
@@ -88,6 +89,7 @@
10
 ConfirmRemove.Text="Bạn có chắc bạn muốn loại bỏ '$1' không?"
11
 ConfirmRemove.TextMultiple="Bạn có chắc bạn muốn xóa %1 nội dung không?"
12
 
13
+
14
 Output.ConnectFail.Title="Không thể kết nối"
15
 Output.ConnectFail.BadPath="URL không hợp lệ của đường dẫn hoặc kết nối.  Xin vui lòng kiểm tra cài đặt của bạn để xác nhận rằng họ là hợp lệ."
16
 Output.ConnectFail.ConnectFailed="Không thể kết nối tới hệ phục vụ"
17
@@ -160,6 +162,7 @@
18
 Deinterlacing.Yadif="Yadif"
19
 Deinterlacing.Yadif2x="Yadif 2x"
20
 
21
+
22
 Basic.Main.AddSceneDlg.Title="Thêm cảnh"
23
 Basic.Main.AddSceneDlg.Text="Vui lòng nhập tên của cảnh"
24
 
25
@@ -324,7 +327,6 @@
26
 Basic.Settings.General.Language="Ngôn ngữ"
27
 Basic.Settings.General.HideProjectorCursor="Ẩn con trỏ chuột trên màn chiếu"
28
 Basic.Settings.General.ProjectorAlwaysOnTop="Làm cho màn chiếu luôn luôn trên đầu"
29
-Basic.Settings.General.SysTrayEnabled="Bật khay biểu tượng hệ thống"
30
 
31
 Basic.Settings.Stream="Stream"
32
 Basic.Settings.Stream.StreamType="Kiểu Stream"
33
obs-studio-17.0.2.tar.xz/UI/data/locale/zh-CN.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/zh-CN.ini Changed
113
 
1
@@ -57,6 +57,19 @@
2
 Import="导入"
3
 Export="导出"
4
 
5
+Updater.Title="有可用的更新"
6
+Updater.Text="有可用的新版本:"
7
+Updater.UpdateNow="现在更新"
8
+Updater.RemindMeLater="稍后再提醒我"
9
+Updater.Skip="跳过版本"
10
+Updater.Running.Title="程序当前处于活跃状态"
11
+Updater.Running.Text="输出当前处于活动状态, 请关闭任何活跃的输出, 然后尝试更新"
12
+Updater.NoUpdatesAvailable.Title="无可用更新"
13
+Updater.NoUpdatesAvailable.Text="没有更新当前可用"
14
+Updater.FailedToLaunch="启动更新程序失败"
15
+Updater.GameCaptureActive.Title="游戏捕获活跃"
16
+Updater.GameCaptureActive.Text="游戏捕获钩子库正在使用中, 请关闭所有正在被捕获的游戏/程序(或重新启动 windows), 然后重试."
17
+
18
 QuickTransitions.SwapScenes="在过渡动画后交换预览/输出场景"
19
 QuickTransitions.SwapScenesTT="在过渡后,交换预览和输出场景(如果输出的原始场景仍然存在). \n 这个不会撤消任何可能对输出的原始场景的更改."
20
 QuickTransitions.DuplicateScene="复制场景"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="确定要删除 '$1' 吗?"
23
 ConfirmRemove.TextMultiple="您确定要删除 %1 项目吗?"
24
 
25
+Output.StartStreamFailed="启动推流失败"
26
+Output.StartRecordingFailed="启动录像失败"
27
+Output.StartReplayFailed="启动回放缓存失败"
28
+Output.StartFailedGeneric="启动输出失败. 请检查日志来了解细节.\n\n注意: 如果你使用的是 NVENC 或 AMD 编码器, 请确保您的视频驱动程序是最新的."
29
+
30
 Output.ConnectFail.Title="连接失败"
31
 Output.ConnectFail.BadPath="无效的路径或URL。请检查您的设置以确认它们是有效的。"
32
 Output.ConnectFail.ConnectFailed="无法连接到服务器"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="上场优先"
35
 Deinterlacing.BottomFieldFirst="下场优先"
36
 
37
+VolControl.SliderUnmuted="音量滑动条 '%1': %2"
38
+VolControl.SliderMuted="音量滑动条 '%1': %2 (当前静音)"
39
+VolControl.Mute="静音 '%1'"
40
+VolControl.Properties="属性 '%1'"
41
+
42
 Basic.Main.AddSceneDlg.Title="添加场景"
43
 Basic.Main.AddSceneDlg.Text="请输入场景名称"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="通用"
47
 Basic.Settings.General.Theme="主题"
48
 Basic.Settings.General.Language="语言"
49
+Basic.Settings.General.EnableAutoUpdates="启动时自动检查更新"
50
 Basic.Settings.General.WarnBeforeStartingStream="启动流时显示确认对话框"
51
 Basic.Settings.General.WarnBeforeStoppingStream="停止流时显示确认对话框"
52
+Basic.Settings.General.Projectors="投影仪"
53
 Basic.Settings.General.HideProjectorCursor="隐藏投影仪上的光标"
54
 Basic.Settings.General.ProjectorAlwaysOnTop="使投影器总是置顶"
55
 Basic.Settings.General.Snapping="源对齐方式"
56
@@ -362,8 +387,12 @@
57
 Basic.Settings.General.SnapDistance="对齐的敏感性"
58
 Basic.Settings.General.RecordWhenStreaming="当推流时自动录像"
59
 Basic.Settings.General.KeepRecordingWhenStreamStops="当推流停止时保持录像"
60
-Basic.Settings.General.SysTrayEnabled="启用系统托盘图标"
61
+Basic.Settings.General.ReplayBufferWhileStreaming="推流时自动启动重播缓冲区"
62
+Basic.Settings.General.KeepReplayBufferStreamStops="推流停止时重播缓冲区保持活动状态"
63
+Basic.Settings.General.SysTray="系统托盘"
64
 Basic.Settings.General.SysTrayWhenStarted="开始时最小化到系统托盘"
65
+Basic.Settings.General.SystemTrayHideMinimize="总是最小化到系统托盘, 而不是任务栏"
66
+Basic.Settings.General.SaveProjectors="退出时保存投影仪"
67
 
68
 Basic.Settings.Stream="串流"
69
 Basic.Settings.Stream.StreamType="串流类型"
70
@@ -452,6 +481,8 @@
71
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="音频编码器"
72
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="视频编码器设置 (如果有)"
73
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxer 设置 (如果有)"
74
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="关键帧间隔 (帧)"
75
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="显示所有编解码器 (即使可能不兼容)"
76
 
77
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
78
 
79
@@ -505,12 +536,16 @@
80
 Basic.Settings.Advanced.Video.ColorRange="YUV 颜色范围"
81
 Basic.Settings.Advanced.Video.ColorRange.Partial="局部"
82
 Basic.Settings.Advanced.Video.ColorRange.Full="全部"
83
+Basic.Settings.Advanced.Audio.MonitoringDevice="音频监测设备"
84
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="默认"
85
 Basic.Settings.Advanced.StreamDelay="流延迟"
86
 Basic.Settings.Advanced.StreamDelay.Duration="持续时间 (秒)"
87
 Basic.Settings.Advanced.StreamDelay.Preserve="重新连接时保持截止点 (增加延迟)"
88
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="估计的内存使用率: %1 MB"
89
 Basic.Settings.Advanced.Network="网络"
90
 Basic.Settings.Advanced.Network.BindToIP="绑定 IP"
91
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="启用新的网络代码"
92
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="低延迟模式"
93
 
94
 Basic.AdvAudio="高级音频属性"
95
 Basic.AdvAudio.Name="名称"
96
@@ -518,6 +553,10 @@
97
 Basic.AdvAudio.Mono="下降混合为单声道"
98
 Basic.AdvAudio.Panning="平移"
99
 Basic.AdvAudio.SyncOffset="同步偏移 (毫秒)"
100
+Basic.AdvAudio.Monitoring="音频监测"
101
+Basic.AdvAudio.Monitoring.None="关闭监视"
102
+Basic.AdvAudio.Monitoring.MonitorOnly="仅显示器(静音输出)"
103
+Basic.AdvAudio.Monitoring.Both="监视器和输出"
104
 Basic.AdvAudio.AudioTracks="轨道"
105
 
106
 Basic.Settings.Hotkeys="热键"
107
@@ -576,4 +615,5 @@
108
 
109
 OutputWarnings.NoTracksSelected="您必须选择至少一个轨道"
110
 OutputWarnings.MultiTrackRecording="警告: 某些格式 (如 FLV) 不支持每个录像多个轨道"
111
+OutputWarnings.MP4Recording="警告︰ 录制保存到 MP4 将无法恢复,如果该文件不能完成 (例如由于蓝屏死机,掉电等)。如果您想要记录多个音频轨道考虑使用 MKV 然后在它完成后 remux 录制到 mp4 (文件 -> Remux 录制文件)"
112
 
113
obs-studio-17.0.2.tar.xz/UI/data/locale/zh-TW.ini -> obs-studio-18.0.0.tar.xz/UI/data/locale/zh-TW.ini Changed
113
 
1
@@ -57,6 +57,19 @@
2
 Import="匯入"
3
 Export="匯出"
4
 
5
+Updater.Title="有新更新"
6
+Updater.Text="有新更新︰"
7
+Updater.UpdateNow="立即更新"
8
+Updater.RemindMeLater="稍後提醒我"
9
+Updater.Skip="略過此版本"
10
+Updater.Running.Title="程式處於活動狀態"
11
+Updater.Running.Text="輸出處於活動狀態,請關閉活動中的輸出,然後再嘗試更新"
12
+Updater.NoUpdatesAvailable.Title="沒有更新"
13
+Updater.NoUpdatesAvailable.Text="沒有更新"
14
+Updater.FailedToLaunch="啟動更新程式失敗"
15
+Updater.GameCaptureActive.Title="遊戲擷取使用中"
16
+Updater.GameCaptureActive.Text="遊戲擷取函式庫正在使用中。 請關閉所有被擷取的遊戲/程式 (或重新開機 windows),然後重試。"
17
+
18
 QuickTransitions.SwapScenes="轉場後交換預覽/輸出場景"
19
 QuickTransitions.SwapScenesTT="(如果輸出的原始場景仍然存在) 轉場後交換預覽和輸出場景。\n這並不會復原任何對輸出原始場景所作的改動。"
20
 QuickTransitions.DuplicateScene="複製場景"
21
@@ -97,6 +110,11 @@
22
 ConfirmRemove.Text="您確定要刪除「$1」?"
23
 ConfirmRemove.TextMultiple="您確定要移除這%1個項目嘛?"
24
 
25
+Output.StartStreamFailed="無法開始串流"
26
+Output.StartRecordingFailed="無法開始錄影"
27
+Output.StartReplayFailed="無法啟動重播緩衝區"
28
+Output.StartFailedGeneric="啟動輸出失敗。 詳情請看 Log 檔。\n\n注意︰ 如果你使用 NVENC 或 AMD 編碼器,請確保您的視頻驅動程式是最新。"
29
+
30
 Output.ConnectFail.Title="連線失敗"
31
 Output.ConnectFail.BadPath="無效的路徑或 URL。 請確認您的設定是正確的。"
32
 Output.ConnectFail.ConnectFailed="與伺服器連線失敗。"
33
@@ -173,6 +191,11 @@
34
 Deinterlacing.TopFieldFirst="由偶數場開始"
35
 Deinterlacing.BottomFieldFirst="由奇數場開始"
36
 
37
+VolControl.SliderUnmuted="'%1' 的音量滑桿︰ %2"
38
+VolControl.SliderMuted="'%1' 的音量滑桿︰ %2 (目前靜音中)"
39
+VolControl.Mute="靜音 '%1'"
40
+VolControl.Properties="'%1' 的屬性"
41
+
42
 Basic.Main.AddSceneDlg.Title="新增場景"
43
 Basic.Main.AddSceneDlg.Text="請輸入場景名稱"
44
 
45
@@ -351,8 +374,10 @@
46
 Basic.Settings.General="一般"
47
 Basic.Settings.General.Theme="佈景主題"
48
 Basic.Settings.General.Language="語言"
49
+Basic.Settings.General.EnableAutoUpdates="啟動時自動檢查更新"
50
 Basic.Settings.General.WarnBeforeStartingStream="啟動串流時顯示確認對話框"
51
 Basic.Settings.General.WarnBeforeStoppingStream="停止串流時顯示確認對話框"
52
+Basic.Settings.General.Projectors="投影"
53
 Basic.Settings.General.HideProjectorCursor="當游標在投影上時隱藏游標"
54
 Basic.Settings.General.ProjectorAlwaysOnTop="讓投影總是在最上層"
55
 Basic.Settings.General.Snapping="貼齊對準來源"
56
@@ -362,8 +387,12 @@
57
 Basic.Settings.General.SnapDistance="貼齊敏感度"
58
 Basic.Settings.General.RecordWhenStreaming="串流時自動錄製"
59
 Basic.Settings.General.KeepRecordingWhenStreamStops="串流停止時繼續錄製"
60
-Basic.Settings.General.SysTrayEnabled="啟用系統列圖示"
61
+Basic.Settings.General.ReplayBufferWhileStreaming="串流時自動啟動重播緩衝"
62
+Basic.Settings.General.KeepReplayBufferStreamStops="串流停止時依然保持啟用重播緩衝"
63
+Basic.Settings.General.SysTray="系統工具列"
64
 Basic.Settings.General.SysTrayWhenStarted="開始時最小化至系統列"
65
+Basic.Settings.General.SystemTrayHideMinimize="總是最小化到系統列,而非工作列"
66
+Basic.Settings.General.SaveProjectors="退出時保存投影設定"
67
 
68
 Basic.Settings.Stream="串流"
69
 Basic.Settings.Stream.StreamType="串流類型"
70
@@ -452,6 +481,8 @@
71
 Basic.Settings.Output.Adv.FFmpeg.AEncoder="音效編碼器"
72
 Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="音效編碼設定(如果有才啟用)"
73
 Basic.Settings.Output.Adv.FFmpeg.MuxerSettings="Muxer 設定(如果有才啟用)"
74
+Basic.Settings.Output.Adv.FFmpeg.GOPSize="關鍵訊框間隔 (訊框)"
75
+Basic.Settings.Output.Adv.FFmpeg.IgnoreCodecCompat="顯示所有編碼解碼器 (即使可能不相容)"
76
 
77
 FilenameFormatting.completer="%CCYY-%MM-%DD %hh-%mm-%ss\n%YY-%MM-%DD %hh-%mm-%ss\n%Y-%m-%d %H-%M-%S\n%y-%m-%d %H-%M-%S\n%a %Y-%m-%d %H-%M-%S\n%A %Y-%m-%d %H-%M-%S\n%Y-%b-%d %H-%M-%S\n%Y-%B-%d %H-%M-%S\n%Y-%m-%d %I-%M-%S-%p\n%Y-%m-%d %H-%M-%S-%z\n%Y-%m-%d %H-%M-%S-%Z"
78
 
79
@@ -505,12 +536,16 @@
80
 Basic.Settings.Advanced.Video.ColorRange="YUV 顏色範圍"
81
 Basic.Settings.Advanced.Video.ColorRange.Partial="部份"
82
 Basic.Settings.Advanced.Video.ColorRange.Full="完整"
83
+Basic.Settings.Advanced.Audio.MonitoringDevice="音訊監測設備"
84
+Basic.Settings.Advanced.Audio.MonitoringDevice.Default="預設裝置"
85
 Basic.Settings.Advanced.StreamDelay="實況延遲"
86
 Basic.Settings.Advanced.StreamDelay.Duration="延遲(秒)"
87
 Basic.Settings.Advanced.StreamDelay.Preserve="重新連線時維持截止點 (增加延遲)"
88
 Basic.Settings.Advanced.StreamDelay.MemoryUsage="預計記憶體使用率: %1 MB"
89
 Basic.Settings.Advanced.Network="網路"
90
 Basic.Settings.Advanced.Network.BindToIP="綁定到 IP"
91
+Basic.Settings.Advanced.Network.EnableNewSocketLoop="啟用新的網路程式碼"
92
+Basic.Settings.Advanced.Network.EnableLowLatencyMode="低延遲模式"
93
 
94
 Basic.AdvAudio="進階音訊屬性"
95
 Basic.AdvAudio.Name="名稱"
96
@@ -518,6 +553,10 @@
97
 Basic.AdvAudio.Mono="混降為單聲道"
98
 Basic.AdvAudio.Panning="偏移"
99
 Basic.AdvAudio.SyncOffset="同步位移(ms)"
100
+Basic.AdvAudio.Monitoring="音訊監測"
101
+Basic.AdvAudio.Monitoring.None="關閉監測"
102
+Basic.AdvAudio.Monitoring.MonitorOnly="僅監測(輸出為靜音)"
103
+Basic.AdvAudio.Monitoring.Both="監測和輸出"
104
 Basic.AdvAudio.AudioTracks="音軌"
105
 
106
 Basic.Settings.Hotkeys="快捷鍵"
107
@@ -576,4 +615,5 @@
108
 
109
 OutputWarnings.NoTracksSelected="您必須至少選擇一個軌道"
110
 OutputWarnings.MultiTrackRecording="警告:某些格式 (例如 FLV) 不支援多個軌道錄製"
111
+OutputWarnings.MP4Recording="警告︰ 如果檔案無法完成,儲存成 MP4 的紀錄將無法復原 (例如由於 BSOD,斷電等)。如果想要記錄多個音軌請考慮儲存成 MKV 並在完成後重新封裝成 mp4(檔案 -> 重新封裝)"
112
 
113
obs-studio-17.0.2.tar.xz/UI/forms/OBSBasic.ui -> obs-studio-18.0.0.tar.xz/UI/forms/OBSBasic.ui Changed
28
 
1
@@ -608,6 +608,9 @@
2
                <height>0</height>
3
               </size>
4
              </property>
5
+             <property name="accessibleName">
6
+              <string>Transition</string>
7
+             </property>
8
             </widget>
9
            </item>
10
            <item>
11
@@ -754,10 +757,16 @@
12
                <property name="text">
13
                 <string>Basic.TransitionDuration</string>
14
                </property>
15
+               <property name="buddy">
16
+                <cstring>transitionDuration</cstring>
17
+               </property>
18
               </widget>
19
              </item>
20
              <item>
21
               <widget class="QSpinBox" name="transitionDuration">
22
+               <property name="accessibleName">
23
+                <string>Basic.TransitionDuration</string>
24
+               </property>
25
                <property name="suffix">
26
                 <string>ms</string>
27
                </property>
28
obs-studio-17.0.2.tar.xz/UI/forms/OBSBasicSettings.ui -> obs-studio-18.0.0.tar.xz/UI/forms/OBSBasicSettings.ui Changed
201
 
1
@@ -116,221 +116,422 @@
2
         <number>0</number>
3
        </property>
4
        <widget class="QWidget" name="generalPage">
5
-        <layout class="QFormLayout" name="formLayout_2">
6
-         <property name="fieldGrowthPolicy">
7
-          <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
8
+        <layout class="QVBoxLayout" name="verticalLayout_18">
9
+         <property name="leftMargin">
10
+          <number>0</number>
11
          </property>
12
-         <property name="labelAlignment">
13
-          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
14
+         <property name="topMargin">
15
+          <number>0</number>
16
          </property>
17
-         <item row="0" column="0">
18
-          <spacer name="verticalSpacer">
19
-           <property name="orientation">
20
-            <enum>Qt::Vertical</enum>
21
-           </property>
22
-           <property name="sizeHint" stdset="0">
23
-            <size>
24
-             <width>20</width>
25
-             <height>40</height>
26
-            </size>
27
-           </property>
28
-          </spacer>
29
-         </item>
30
-         <item row="1" column="0">
31
-          <widget class="QLabel" name="label">
32
-           <property name="minimumSize">
33
-            <size>
34
-             <width>170</width>
35
-             <height>0</height>
36
-            </size>
37
-           </property>
38
-           <property name="text">
39
-            <string>Basic.Settings.General.Language</string>
40
-           </property>
41
-           <property name="alignment">
42
-            <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
43
-           </property>
44
-           <property name="buddy">
45
-            <cstring>language</cstring>
46
-           </property>
47
-          </widget>
48
-         </item>
49
-         <item row="1" column="1">
50
-          <widget class="QComboBox" name="language"/>
51
-         </item>
52
-         <item row="2" column="0">
53
-          <widget class="QLabel" name="label_42">
54
-           <property name="text">
55
-            <string>Basic.Settings.General.Theme</string>
56
-           </property>
57
-           <property name="buddy">
58
-            <cstring>theme</cstring>
59
-           </property>
60
-          </widget>
61
-         </item>
62
-         <item row="2" column="1">
63
-          <widget class="QComboBox" name="theme"/>
64
-         </item>
65
-         <item row="3" column="1">
66
-          <widget class="QCheckBox" name="warnBeforeStreamStart">
67
-           <property name="text">
68
-            <string>Basic.Settings.General.WarnBeforeStartingStream</string>
69
-           </property>
70
-          </widget>
71
-         </item>
72
-         <item row="4" column="1">
73
-          <widget class="QCheckBox" name="warnBeforeStreamStop">
74
-           <property name="text">
75
-            <string>Basic.Settings.General.WarnBeforeStoppingStream</string>
76
-           </property>
77
-          </widget>
78
-         </item>
79
-         <item row="7" column="1">
80
-          <widget class="QCheckBox" name="recordWhenStreaming">
81
-           <property name="text">
82
-            <string>Basic.Settings.General.RecordWhenStreaming</string>
83
-           </property>
84
-          </widget>
85
-         </item>
86
-         <item row="9" column="1">
87
-          <widget class="QCheckBox" name="systemTrayEnabled">
88
-           <property name="text">
89
-            <string>Basic.Settings.General.SysTrayEnabled</string>
90
-           </property>
91
-          </widget>
92
-         </item>
93
-         <item row="10" column="1">
94
-          <widget class="QCheckBox" name="systemTrayWhenStarted">
95
-           <property name="enabled">
96
-            <bool>false</bool>
97
-           </property>
98
-           <property name="text">
99
-            <string>Basic.Settings.General.SysTrayWhenStarted</string>
100
-           </property>
101
-          </widget>
102
-         </item>
103
-         <item row="11" column="0" colspan="2">
104
-          <widget class="Line" name="line_4">
105
-           <property name="orientation">
106
-            <enum>Qt::Horizontal</enum>
107
-           </property>
108
-          </widget>
109
-         </item>
110
-         <item row="12" column="0" colspan="2">
111
-          <widget class="QGroupBox" name="groupBox_10">
112
-           <property name="enabled">
113
+         <property name="rightMargin">
114
+          <number>0</number>
115
+         </property>
116
+         <property name="bottomMargin">
117
+          <number>0</number>
118
+         </property>
119
+         <item>
120
+          <widget class="QScrollArea" name="scrollArea_2">
121
+           <property name="widgetResizable">
122
             <bool>true</bool>
123
            </property>
124
-           <property name="sizePolicy">
125
-            <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
126
-             <horstretch>0</horstretch>
127
-             <verstretch>0</verstretch>
128
-            </sizepolicy>
129
-           </property>
130
-           <property name="title">
131
-            <string>Basic.Settings.General.Snapping</string>
132
-           </property>
133
-           <property name="flat">
134
-            <bool>false</bool>
135
-           </property>
136
-           <layout class="QFormLayout" name="formLayout_21">
137
-            <property name="labelAlignment">
138
-             <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
139
+           <widget class="QWidget" name="scrollAreaWidgetContents_2">
140
+            <property name="geometry">
141
+             <rect>
142
+              <x>0</x>
143
+              <y>0</y>
144
+              <width>818</width>
145
+              <height>697</height>
146
+             </rect>
147
             </property>
148
-            <item row="0" column="1">
149
-             <widget class="QCheckBox" name="snappingEnabled">
150
-              <property name="text">
151
-               <string>Enable</string>
152
-              </property>
153
-              <property name="checked">
154
-               <bool>true</bool>
155
-              </property>
156
-             </widget>
157
-            </item>
158
-            <item row="2" column="1">
159
-             <widget class="QCheckBox" name="screenSnapping">
160
-              <property name="text">
161
-               <string>Basic.Settings.General.ScreenSnapping</string>
162
-              </property>
163
-              <property name="checked">
164
-               <bool>true</bool>
165
-              </property>
166
-             </widget>
167
-            </item>
168
-            <item row="4" column="1">
169
-             <widget class="QCheckBox" name="centerSnapping">
170
-              <property name="text">
171
-               <string>Basic.Settings.General.CenterSnapping</string>
172
-              </property>
173
-              <property name="checked">
174
-               <bool>true</bool>
175
-              </property>
176
-             </widget>
177
-            </item>
178
-            <item row="3" column="1">
179
-             <widget class="QCheckBox" name="sourceSnapping">
180
-              <property name="text">
181
-               <string>Basic.Settings.General.SourceSnapping</string>
182
-              </property>
183
-              <property name="checked">
184
-               <bool>true</bool>
185
-              </property>
186
-             </widget>
187
-            </item>
188
-            <item row="1" column="1">
189
-             <widget class="QDoubleSpinBox" name="snapDistance">
190
-              <property name="decimals">
191
-               <number>1</number>
192
-              </property>
193
-              <property name="singleStep">
194
-               <double>0.500000000000000</double>
195
-              </property>
196
-              <property name="value">
197
-               <double>10.000000000000000</double>
198
-              </property>
199
-             </widget>
200
-            </item>
201
obs-studio-18.0.0.tar.xz/UI/forms/OBSUpdate.ui Added
105
 
1
@@ -0,0 +1,103 @@
2
+<?xml version="1.0" encoding="UTF-8"?>
3
+<ui version="4.0">
4
+ <class>OBSUpdate</class>
5
+ <widget class="QDialog" name="OBSUpdate">
6
+  <property name="geometry">
7
+   <rect>
8
+    <x>0</x>
9
+    <y>0</y>
10
+    <width>611</width>
11
+    <height>526</height>
12
+   </rect>
13
+  </property>
14
+  <property name="windowTitle">
15
+   <string>Updater.Title</string>
16
+  </property>
17
+  <layout class="QVBoxLayout" name="verticalLayout">
18
+   <item>
19
+    <widget class="QLabel" name="label">
20
+     <property name="text">
21
+      <string>Updater.Text</string>
22
+     </property>
23
+    </widget>
24
+   </item>
25
+   <item>
26
+    <widget class="QTextEdit" name="text">
27
+     <property name="readOnly">
28
+      <bool>true</bool>
29
+     </property>
30
+     <property name="html">
31
+      <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
32
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
33
+p, li { white-space: pre-wrap; }
34
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
35
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
36
+     </property>
37
+    </widget>
38
+   </item>
39
+   <item>
40
+    <widget class="Line" name="line">
41
+     <property name="orientation">
42
+      <enum>Qt::Horizontal</enum>
43
+     </property>
44
+    </widget>
45
+   </item>
46
+   <item>
47
+    <layout class="QHBoxLayout" name="horizontalLayout">
48
+     <item>
49
+      <spacer name="horizontalSpacer">
50
+       <property name="orientation">
51
+        <enum>Qt::Horizontal</enum>
52
+       </property>
53
+       <property name="sizeHint" stdset="0">
54
+        <size>
55
+         <width>40</width>
56
+         <height>20</height>
57
+        </size>
58
+       </property>
59
+      </spacer>
60
+     </item>
61
+     <item>
62
+      <widget class="QPushButton" name="yes">
63
+       <property name="text">
64
+        <string>Updater.UpdateNow</string>
65
+       </property>
66
+       <property name="default">
67
+        <bool>true</bool>
68
+       </property>
69
+      </widget>
70
+     </item>
71
+     <item>
72
+      <widget class="QPushButton" name="no">
73
+       <property name="text">
74
+        <string>Updater.RemindMeLater</string>
75
+       </property>
76
+      </widget>
77
+     </item>
78
+     <item>
79
+      <widget class="QPushButton" name="skip">
80
+       <property name="text">
81
+        <string>Updater.Skip</string>
82
+       </property>
83
+      </widget>
84
+     </item>
85
+     <item>
86
+      <spacer name="horizontalSpacer_2">
87
+       <property name="orientation">
88
+        <enum>Qt::Horizontal</enum>
89
+       </property>
90
+       <property name="sizeHint" stdset="0">
91
+        <size>
92
+         <width>40</width>
93
+         <height>20</height>
94
+        </size>
95
+       </property>
96
+      </spacer>
97
+     </item>
98
+    </layout>
99
+   </item>
100
+  </layout>
101
+ </widget>
102
+ <resources/>
103
+ <connections/>
104
+</ui>
105
obs-studio-17.0.2.tar.xz/UI/frontend-plugins/frontend-tools/data/locale/da-DK.ini -> obs-studio-18.0.0.tar.xz/UI/frontend-plugins/frontend-tools/data/locale/da-DK.ini Changed
11
 
1
@@ -11,6 +11,9 @@
2
 Start="Start"
3
 Stop="Stop"
4
 
5
+Captions="Undertekster (eksperimentel)"
6
+Captions.AudioSource="Lydkilde"
7
+Captions.CurrentSystemLanguage="Aktuelt systemsprog (%1)"
8
 
9
 OutputTimer="Output-timer"
10
 OutputTimer.Stream="Stands streaming efter:"
11
obs-studio-17.0.2.tar.xz/UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini -> obs-studio-18.0.0.tar.xz/UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini Changed
27
 
1
@@ -1,8 +1,25 @@
2
+SceneSwitcher="Automatisk Scene Skifter"
3
+SceneSwitcher.OnNoMatch="Når ingen vindu passer overens:"
4
+SceneSwitcher.OnNoMatch.DontSwitch="Ikke bytt"
5
 SceneSwitcher.OnNoMatch.SwitchTo="Bytt til:"
6
+SceneSwitcher.CheckInterval="Sjekk aktivt vindu hver:"
7
+SceneSwitcher.ActiveOrNotActive="Sceneskifter er:"
8
+InvalidRegex.Title="Ugyldig regulært utrykk"
9
+InvalidRegex.Text="Det regulære utrykket du har angitt er ugyldig."
10
 Active="Aktiv"
11
 Inactive="Inaktiv"
12
 Start="Start"
13
 Stop="Stopp"
14
 
15
+Captions="Bildetekster (eksperimentell)"
16
+Captions.AudioSource="Lyd kilde"
17
+Captions.CurrentSystemLanguage="Någjeldende System Språk"
18
 
19
+OutputTimer="Stoppeklokke"
20
+OutputTimer.Stream="Stopp streaming etter:"
21
+OutputTimer.Record="Stopp opptak etter:"
22
+OutputTimer.Stream.StoppingIn="Streaming stopper om:"
23
+OutputTimer.Record.StoppingIn="Opptak stopper om:"
24
+OutputTimer.Stream.EnableEverytime="Aktiver streaming timer hver gang"
25
+OutputTimer.Record.EnableEverytime="Aktiver opptaks timer hver gang"
26
 
27
obs-studio-17.0.2.tar.xz/UI/frontend-plugins/frontend-tools/data/locale/pt-BR.ini -> obs-studio-18.0.0.tar.xz/UI/frontend-plugins/frontend-tools/data/locale/pt-BR.ini Changed
17
 
1
@@ -11,10 +11,15 @@
2
 Start="Iniciar"
3
 Stop="Parar"
4
 
5
+Captions="Legendas (Experimental)"
6
+Captions.AudioSource="Fonte de Áudio"
7
+Captions.CurrentSystemLanguage="Idioma Atual do Sistema (%1)"
8
 
9
 OutputTimer="Temporizador de saída"
10
 OutputTimer.Stream="Parar a transmissão após:"
11
 OutputTimer.Record="Parar a gravação após:"
12
 OutputTimer.Stream.StoppingIn="A transmissão irá parar em:"
13
 OutputTimer.Record.StoppingIn="A gravação irá parar em:"
14
+OutputTimer.Stream.EnableEverytime="Ativar o timer streaming o tempo todo"
15
+OutputTimer.Record.EnableEverytime="Ativar o timer de gravação o tempo todo"
16
 
17
obs-studio-18.0.0.tar.xz/UI/frontend-plugins/frontend-tools/data/locale/ro-RO.ini Added
15
 
1
@@ -0,0 +1,13 @@
2
+SceneSwitcher="Schimbator automat de scenă"
3
+SceneSwitcher.OnNoMatch="Cand nici o fereastra nu se potriveste:"
4
+SceneSwitcher.OnNoMatch.SwitchTo="Schimbă la:"
5
+Active="Activ"
6
+Inactive="Inactiv"
7
+Start="Pornire"
8
+Stop="Oprire"
9
+
10
+Captions.AudioSource="Sursa audio"
11
+Captions.CurrentSystemLanguage="Limba curentă a sistemului (%1)"
12
+
13
+OutputTimer.Record="Opriți inregistrarea dupa:"
14
+
15
obs-studio-17.0.2.tar.xz/UI/installer/mp-installer.nsi -> obs-studio-18.0.0.tar.xz/UI/installer/mp-installer.nsi Changed
188
 
1
@@ -1,11 +1,18 @@
2
 ; Script generated with the Venis Install Wizard
3
 
4
+Unicode true
5
+
6
 ; Define your application name
7
 !define APPNAME "OBS Studio"
8
-!define APPVERSION "0.16.5"
9
-!define APPNAMEANDVERSION "OBS Studio ${APPVERSION}"
10
+
11
+!ifndef APPVERSION
12
+!define APPVERSION "17.0.2"
13
+!define SHORTVERSION "17.0.2"
14
+!endif
15
+
16
+!define APPNAMEANDVERSION "OBS Studio ${SHORTVERSION}"
17
 ; !define FULL
18
-; !define REALSENSE_PLUGIN
19
+!define REALSENSE_PLUGIN
20
 
21
 ; Additional script dependencies
22
 !include WinVer.nsh
23
@@ -16,9 +23,9 @@
24
 InstallDir "$PROGRAMFILES32\obs-studio"
25
 InstallDirRegKey HKLM "Software\${APPNAME}" ""
26
 !ifdef FULL
27
-OutFile "OBS-Studio-${APPVERSION}-Full-Installer.exe"
28
+OutFile "OBS-Studio-${SHORTVERSION}-Full-Installer.exe"
29
 !else
30
-OutFile "OBS-Studio-${APPVERSION}-Small-Installer.exe"
31
+OutFile "OBS-Studio-${SHORTVERSION}-Small-Installer.exe"
32
 !endif
33
 
34
 ; Use compression
35
@@ -31,12 +38,14 @@
36
 !include "MUI.nsh"
37
 
38
 !define MUI_ABORTWARNING
39
-!define MUI_FINISHPAGE_RUN "$INSTDIR\bin\32bit\obs32.exe"
40
+!define MUI_FINISHPAGE_RUN
41
+!define MUI_FINISHPAGE_RUN_TEXT "Launch OBS Studio ${SHORTVERSION}"
42
+!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchOBS"
43
 
44
 !define MUI_PAGE_CUSTOMFUNCTION_LEAVE PreReqCheck
45
 
46
 !insertmacro MUI_PAGE_WELCOME
47
-!insertmacro MUI_PAGE_LICENSE "data\obs-studio\license\gplv2.txt"
48
+!insertmacro MUI_PAGE_LICENSE "new\core\data\obs-studio\license\gplv2.txt"
49
 !insertmacro MUI_PAGE_DIRECTORY
50
 !ifdef FULL
51
    !insertmacro MUI_PAGE_COMPONENTS
52
@@ -160,25 +169,42 @@
53
    ClearErrors
54
 
55
    ; Check previous instance
56
-   FindProcDLL::FindProc "obs32.exe"
57
+
58
+   OBSInstallerUtils::IsProcessRunning "obs32.exe"
59
    IntCmp $R0 1 0 notRunning1
60
        MessageBox MB_OK|MB_ICONEXCLAMATION "${APPNAME} is already running. Please close it first before installing a new version." /SD IDOK
61
        Quit
62
    notRunning1:
63
+
64
    ${if} ${RunningX64}
65
-       FindProcDLL::FindProc "obs64.exe"
66
+       OBSInstallerUtils::IsProcessRunning "obs64.exe"
67
        IntCmp $R0 1 0 notRunning2
68
            MessageBox MB_OK|MB_ICONEXCLAMATION "${APPNAME} is already running. Please close it first before installing a new version." /SD IDOK
69
            Quit
70
+       notRunning2:
71
    ${endif}
72
-   notRunning2:
73
 
74
+   OBSInstallerUtils::AddInUseFileCheck "$INSTDIR\data\obs-plugins\win-capture\graphics-hook32.dll"
75
+   OBSInstallerUtils::AddInUseFileCheck "$INSTDIR\data\obs-plugins\win-capture\graphics-hook64.dll"
76
+   OBSInstallerUtils::GetAppNameForInUseFiles
77
+   StrCmp $R0 "" gameCaptureNotRunning
78
+       MessageBox MB_OK|MB_ICONEXCLAMATION "Game Capture is still in use by the following applications:$\r$\n$\r$\n$R0$\r$\nPlease close these applications before installing a new version of OBS." /SD IDOK
79
+       Quit
80
+   gameCaptureNotRunning:
81
 FunctionEnd
82
 
83
 Function filesInUse
84
    MessageBox MB_OK|MB_ICONEXCLAMATION "Some files were not able to be installed. If this is the first time you are installing OBS, please disable any anti-virus or other security software and try again. If you are re-installing or updating OBS, close any applications that may be have been hooked, or reboot and try again."  /SD IDOK
85
 FunctionEnd
86
 
87
+Function LaunchOBS
88
+   ${if} ${RunningX64}
89
+       Exec '"$WINDIR\explorer.exe" "$SMPROGRAMS\OBS Studio\OBS Studio (64bit).lnk"'
90
+   ${else}
91
+       Exec '"$WINDIR\explorer.exe" "$SMPROGRAMS\OBS Studio\OBS Studio (32bit).lnk"'
92
+   ${endif}
93
+FunctionEnd
94
+
95
 Var outputErrors
96
 
97
 Section "OBS Studio" SecCore
98
@@ -188,24 +214,23 @@
99
    SetOverwrite on
100
    AllowSkipFiles off
101
 
102
-   KillProcDLL::KillProc "obs-plugins\32bit\cef-bootstrap.exe"
103
-   KillProcDLL::KillProc "obs-plugins\64bit\cef-bootstrap.exe"
104
-
105
    SetShellVarContext all
106
 
107
    ; Set Section Files and Shortcuts
108
    SetOutPath "$INSTDIR"
109
-   File /r "data"
110
+   OBSInstallerUtils::KillProcess "obs-plugins\32bit\cef-bootstrap.exe"
111
+   OBSInstallerUtils::KillProcess "obs-plugins\64bit\cef-bootstrap.exe"
112
+   File /r "new\core\data"
113
    SetOutPath "$INSTDIR\bin"
114
-   File /r "bin\32bit"
115
+   File /r "new\core\bin\32bit"
116
    SetOutPath "$INSTDIR\obs-plugins"
117
-   File /r "obs-plugins\32bit"
118
+   File /r "new\core\obs-plugins\32bit"
119
 
120
    ${if} ${RunningX64}
121
        SetOutPath "$INSTDIR\bin"
122
-       File /r "bin\64bit"
123
+       File /r "new\core\bin\64bit"
124
        SetOutPath "$INSTDIR\obs-plugins"
125
-       File /r "obs-plugins\64bit"
126
+       File /r "new\core\obs-plugins\64bit"
127
    ${endif}
128
 
129
    ClearErrors
130
@@ -223,12 +248,14 @@
131
        Delete "$SMPROGRAMS\OBS Multiplatform\OBS Multiplatform (64bit).lnk"
132
    ${endif}
133
 
134
-   SetOutPath "$INSTDIR\bin\32bit"
135
    ${if} ${RunningX64}
136
+       SetOutPath "$INSTDIR\bin\64bit"
137
        CreateShortCut "$DESKTOP\OBS Studio.lnk" "$INSTDIR\bin\64bit\obs64.exe"
138
    ${else}
139
+       SetOutPath "$INSTDIR\bin\32bit"
140
        CreateShortCut "$DESKTOP\OBS Studio.lnk" "$INSTDIR\bin\32bit\obs32.exe"
141
    ${endif}
142
+   SetOutPath "$INSTDIR\bin\32bit"
143
    CreateDirectory "$SMPROGRAMS\OBS Studio"
144
    CreateShortCut "$SMPROGRAMS\OBS Studio\OBS Studio (32bit).lnk" "$INSTDIR\bin\32bit\obs32.exe"
145
    CreateShortCut "$SMPROGRAMS\OBS Studio\Uninstall.lnk" "$INSTDIR\uninstall.exe"
146
@@ -253,10 +280,12 @@
147
        SetShellVarContext all
148
 
149
        SetOutPath "$INSTDIR\obs-plugins"
150
-       File /r "obs-browser\obs-plugins\32bit"
151
+       OBSInstallerUtils::KillProcess "32bit\cef-bootstrap.exe"
152
+       File /r "new\obs-browser\obs-plugins\32bit"
153
 
154
        ${if} ${RunningX64}
155
-           File /r "obs-browser\obs-plugins\64bit"
156
+           OBSInstallerUtils::KillProcess "64bit\cef-bootstrap.exe"
157
+           File /r "new\obs-browser\obs-plugins\64bit"
158
        ${endif}
159
 
160
        SetOutPath "$INSTDIR\bin\32bit"
161
@@ -269,14 +298,14 @@
162
        SetShellVarContext all
163
 
164
        SetOutPath "$INSTDIR\obs-plugins"
165
-       File /r "realsense\32bit"
166
+       File /r "new\realsense\32bit"
167
 
168
        ${if} ${RunningX64}
169
-           File /r "realsense\64bit"
170
+           File /r "new\realsense\64bit"
171
        ${endif}
172
 
173
        SetOutPath "$INSTDIR\data\obs-plugins"
174
-       File /r "realsense\actual_data\obs-plugins\win-ivcam"
175
+       File /r "new\realsense\data\obs-plugins\win-ivcam"
176
 
177
        ExecWait '"$INSTDIR\data\obs-plugins\win-ivcam\seg_service.exe" /UnregServer'
178
        ExecWait '"$INSTDIR\data\obs-plugins\win-ivcam\seg_service.exe" /RegServer'
179
@@ -371,7 +400,7 @@
180
 !insertmacro MUI_UNFUNCTION_DESCRIPTION_END
181
 
182
 ; Version information
183
-VIProductVersion "0.${APPVERSION}"
184
+VIProductVersion "${APPVERSION}.0"
185
 VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "OBS Studio"
186
 VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "obsproject.com"
187
 VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "(c) 2012-2016"
188
obs-studio-17.0.2.tar.xz/UI/obs-app.cpp -> obs-studio-18.0.0.tar.xz/UI/obs-app.cpp Changed
159
 
1
@@ -20,6 +20,7 @@
2
 #include <wchar.h>
3
 #include <chrono>
4
 #include <ratio>
5
+#include <string>
6
 #include <sstream>
7
 #include <mutex>
8
 #include <util/bmem.h>
9
@@ -51,6 +52,8 @@
10
 #include <signal.h>
11
 #endif
12
 
13
+#include <iostream>
14
+
15
 using namespace std;
16
 
17
 static log_handler_t def_log_handler;
18
@@ -63,6 +66,9 @@
19
 static bool unfiltered_log = false;
20
 bool opt_start_streaming = false;
21
 bool opt_start_recording = false;
22
+bool opt_studio_mode = false;
23
+bool opt_start_replaybuffer = false;
24
+bool opt_minimize_tray = false;
25
 string opt_starting_collection;
26
 string opt_starting_profile;
27
 string opt_starting_scene;
28
@@ -316,8 +322,22 @@
29
    vsnprintf(str, 4095, msg, args);
30
 
31
 #ifdef _WIN32
32
-   OutputDebugStringA(str);
33
-   OutputDebugStringA("\n");
34
+   if (IsDebuggerPresent()) {
35
+       int wNum = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
36
+       if (wNum > 1) {
37
+           static wstring wide_buf;
38
+           static mutex wide_mutex;
39
+
40
+           lock_guard<mutex> lock(wide_mutex);
41
+           wide_buf.reserve(wNum + 1);
42
+           wide_buf.resize(wNum - 1);
43
+           MultiByteToWideChar(CP_UTF8, 0, str, -1, &wide_buf[0],
44
+                   wNum);
45
+           wide_buf.push_back('\n');
46
+
47
+           OutputDebugStringW(wide_buf.c_str());
48
+       }
49
+   }
50
 #else
51
    def_log_handler(log_level, msg, args2, nullptr);
52
 #endif
53
@@ -343,6 +363,8 @@
54
    config_set_default_uint(globalConfig, "General", "MaxLogs", 10);
55
    config_set_default_string(globalConfig, "General", "ProcessPriority",
56
            "Normal");
57
+   config_set_default_bool(globalConfig, "General", "EnableAutoUpdates",
58
+           true);
59
 
60
 #if _WIN32
61
    config_set_default_string(globalConfig, "Video", "Renderer",
62
@@ -378,6 +400,8 @@
63
    config_set_default_bool(globalConfig, "BasicWindow",
64
            "SysTrayWhenStarted", false);
65
    config_set_default_bool(globalConfig, "BasicWindow",
66
+           "SaveProjectors", false);
67
+   config_set_default_bool(globalConfig, "BasicWindow",
68
            "ShowTransitions", true);
69
    config_set_default_bool(globalConfig, "BasicWindow",
70
            "ShowListboxToolbars", true);
71
@@ -426,7 +450,13 @@
72
        return false;
73
    if (!do_mkdir(path))
74
        return false;
75
+
76
+   if (GetConfigPath(path, sizeof(path), "obs-studio/updates") <= 0)
77
+       return false;
78
+   if (!do_mkdir(path))
79
+       return false;
80
 #endif
81
+
82
    if (GetConfigPath(path, sizeof(path), "obs-studio/plugin_config") <= 0)
83
        return false;
84
    if (!do_mkdir(path))
85
@@ -1242,20 +1272,6 @@
86
    profiler_start();
87
    profile_register_root(run_program_init, 0);
88
 
89
-   auto PrintInitProfile = [&]()
90
-   {
91
-       auto snap = GetSnapshot();
92
-
93
-       profiler_snapshot_filter_roots(snap.get(), [](void *data,
94
-                   const char *name, bool *remove)
95
-       {
96
-           *remove = (*static_cast<const char**>(data)) != name;
97
-           return true;
98
-       }, static_cast<void*>(&run_program_init));
99
-
100
-       profiler_print(snap.get());
101
-   };
102
-
103
    ScopeProfiler prof{run_program_init};
104
 
105
    QCoreApplication::addLibraryPath(".");
106
@@ -1749,6 +1765,9 @@
107
        } else if (arg_is(argv[i], "--startrecording", nullptr)) {
108
            opt_start_recording = true;
109
 
110
+       } else if (arg_is(argv[i], "--startreplaybuffer", nullptr)) {
111
+           opt_start_replaybuffer = true;
112
+
113
        } else if (arg_is(argv[i], "--collection", nullptr)) {
114
            if (++i < argc) opt_starting_collection = argv[i];
115
 
116
@@ -1757,6 +1776,42 @@
117
 
118
        } else if (arg_is(argv[i], "--scene", nullptr)) {
119
            if (++i < argc) opt_starting_scene = argv[i];
120
+
121
+       } else if (arg_is(argv[i], "--minimize-to-tray", nullptr)) {
122
+           opt_minimize_tray = true;
123
+
124
+       } else if (arg_is(argv[i], "--studio-mode", nullptr)) {
125
+           opt_studio_mode = true;
126
+
127
+       } else if (arg_is(argv[i], "--help", "-h")) {
128
+           std::cout <<
129
+           "--help, -h: Get list of available commands.\n\n" << 
130
+           "--startstreaming: Automatically start streaming.\n" <<
131
+           "--startrecording: Automatically start recording.\n" <<
132
+           "--startreplaybuffer: Start replay buffer.\n\n" <<
133
+           "--collection <string>: Use specific scene collection."
134
+               << "\n" <<
135
+           "--profile <string>: Use specific profile.\n" <<
136
+           "--scene <string>: Start with specific scene.\n\n" <<
137
+           "--studio-mode: Enable studio mode.\n" <<
138
+           "--minimize-to-tray: Minimize to system tray.\n" <<
139
+           "--portable, -p: Use portable mode.\n\n" <<
140
+           "--verbose: Make log more verbose.\n" <<
141
+           "--unfiltered_log: Make log unfiltered.\n\n" <<
142
+           "--version, -V: Get current version.\n";
143
+
144
+           exit(0);
145
+
146
+       } else if (arg_is(argv[i], "--version", "-V")) {
147
+           std::cout << "OBS Studio - " << 
148
+               App()->GetVersionString() << "\n";
149
+           exit(0);
150
+
151
+       } else {
152
+           std::cout << 
153
+               "Invalid arguments. Use --help or -h to get " << 
154
+               "a list of available command line arguments.\n";
155
+           exit(0);
156
        }
157
    }
158
 
159
obs-studio-17.0.2.tar.xz/UI/obs-app.hpp -> obs-studio-18.0.0.tar.xz/UI/obs-app.hpp Changed
9
 
1
@@ -178,4 +178,7 @@
2
 
3
 extern bool opt_start_streaming;
4
 extern bool opt_start_recording;
5
+extern bool opt_start_replaybuffer;
6
+extern bool opt_minimize_tray;
7
+extern bool opt_studio_mode;
8
 extern std::string opt_starting_scene;
9
obs-studio-17.0.2.tar.xz/UI/obs-frontend-api/obs-frontend-internal.hpp -> obs-studio-18.0.0.tar.xz/UI/obs-frontend-api/obs-frontend-internal.hpp Changed
9
 
1
@@ -6,6 +6,7 @@
2
 #include <string>
3
 
4
 struct obs_frontend_callbacks {
5
+   virtual ~obs_frontend_callbacks() {}
6
    virtual void *obs_frontend_get_main_window(void)=0;
7
    virtual void *obs_frontend_get_main_window_handle(void)=0;
8
 
9
obs-studio-17.0.2.tar.xz/UI/remote-text.cpp -> obs-studio-18.0.0.tar.xz/UI/remote-text.cpp Changed
132
 
1
@@ -22,6 +22,9 @@
2
 
3
 using namespace std;
4
 
5
+static auto curl_deleter = [] (CURL *curl) {curl_easy_cleanup(curl);};
6
+using Curl = unique_ptr<CURL, decltype(curl_deleter)>;
7
+
8
 static size_t string_write(char *ptr, size_t size, size_t nmemb, string &str)
9
 {
10
    size_t total = size * nmemb;
11
@@ -45,9 +48,6 @@
12
        contentTypeString += contentType;
13
    }
14
 
15
-   auto curl_deleter = [] (CURL *curl) {curl_easy_cleanup(curl);};
16
-   using Curl = unique_ptr<CURL, decltype(curl_deleter)>;
17
-
18
    Curl curl{curl_easy_init(), curl_deleter};
19
    if (curl) {
20
        struct curl_slist *header = nullptr;
21
@@ -91,3 +91,110 @@
22
        curl_slist_free_all(header);
23
    }
24
 }
25
+
26
+static size_t header_write(char *ptr, size_t size, size_t nmemb,
27
+       vector<string> &list)
28
+{
29
+   string str;
30
+
31
+   size_t total = size * nmemb;
32
+   if (total)
33
+       str.append(ptr, total);
34
+
35
+   if (str.back() == '\n')
36
+       str.resize(str.size() - 1);
37
+   if (str.back() == '\r')
38
+       str.resize(str.size() - 1);
39
+
40
+   list.push_back(std::move(str));
41
+   return total;
42
+}
43
+
44
+bool GetRemoteFile(
45
+   const char *url,
46
+   std::string &str,
47
+   std::string &error,
48
+   long *responseCode,
49
+   const char *contentType,
50
+   const char *postData,
51
+   std::vector<std::string> extraHeaders,
52
+   std::string *signature)
53
+{
54
+   vector<string> header_in_list;
55
+   char error_in[CURL_ERROR_SIZE];
56
+   CURLcode code = CURLE_FAILED_INIT;
57
+
58
+   error_in[0] = 0;
59
+
60
+   string versionString("User-Agent: obs-basic ");
61
+   versionString += App()->GetVersionString();
62
+
63
+   string contentTypeString;
64
+   if (contentType) {
65
+       contentTypeString += "Content-Type: ";
66
+       contentTypeString += contentType;
67
+   }
68
+
69
+   Curl curl{curl_easy_init(), curl_deleter};
70
+   if (curl) {
71
+       struct curl_slist *header = nullptr;
72
+
73
+       header = curl_slist_append(header,
74
+               versionString.c_str());
75
+
76
+       if (!contentTypeString.empty()) {
77
+           header = curl_slist_append(header,
78
+                   contentTypeString.c_str());
79
+       }
80
+
81
+       for (std::string &h : extraHeaders)
82
+           header = curl_slist_append(header, h.c_str());
83
+
84
+       curl_easy_setopt(curl.get(), CURLOPT_URL, url);
85
+       curl_easy_setopt(curl.get(), CURLOPT_HTTPHEADER,
86
+               header);
87
+       curl_easy_setopt(curl.get(), CURLOPT_ERRORBUFFER,
88
+               error_in);
89
+       curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION,
90
+               string_write);
91
+       curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA,
92
+               &str);
93
+       if (signature) {
94
+           curl_easy_setopt(curl.get(), CURLOPT_HEADERFUNCTION,
95
+                   header_write);
96
+           curl_easy_setopt(curl.get(), CURLOPT_HEADERDATA,
97
+                   &header_in_list);
98
+       }
99
+
100
+#if LIBCURL_VERSION_NUM >= 0x072400
101
+       // A lot of servers don't yet support ALPN
102
+       curl_easy_setopt(curl.get(), CURLOPT_SSL_ENABLE_ALPN, 0);
103
+#endif
104
+
105
+       if (postData) {
106
+           curl_easy_setopt(curl.get(), CURLOPT_POSTFIELDS,
107
+                   postData);
108
+       }
109
+
110
+       code = curl_easy_perform(curl.get());
111
+       if (responseCode)
112
+           curl_easy_getinfo(curl.get(), CURLINFO_RESPONSE_CODE,
113
+                   responseCode);
114
+
115
+       if (code != CURLE_OK) {
116
+           error = error_in;
117
+       } else if (signature) {
118
+           for (string &h : header_in_list) {
119
+               string name = h.substr(0, 13);
120
+               if (name == "X-Signature: ") {
121
+                   *signature = h.substr(13);
122
+                   break;
123
+               }
124
+           }
125
+       }
126
+
127
+       curl_slist_free_all(header);
128
+   }
129
+
130
+   return code == CURLE_OK;
131
+}
132
obs-studio-17.0.2.tar.xz/UI/remote-text.hpp -> obs-studio-18.0.0.tar.xz/UI/remote-text.hpp Changed
23
 
1
@@ -18,6 +18,7 @@
2
 #pragma once
3
 
4
 #include <QThread>
5
+#include <vector>
6
 #include <string>
7
 
8
 class RemoteTextThread : public QThread {
9
@@ -40,3 +41,13 @@
10
        : url(url_), contentType(contentType_), postData(postData_)
11
    {}
12
 };
13
+
14
+bool GetRemoteFile(
15
+   const char *url,
16
+   std::string &str,
17
+   std::string &error,
18
+   long *responseCode = nullptr,
19
+   const char *contentType = nullptr,
20
+   const char *postData = nullptr,
21
+   std::vector<std::string> extraHeaders = std::vector<std::string>(),
22
+   std::string *signature = nullptr);
23
obs-studio-17.0.2.tar.xz/UI/volume-control.cpp -> obs-studio-18.0.0.tar.xz/UI/volume-control.cpp Changed
193
 
1
@@ -1,8 +1,10 @@
2
 #include "volume-control.hpp"
3
 #include "qt-wrappers.hpp"
4
+#include "obs-app.hpp"
5
 #include "mute-checkbox.hpp"
6
 #include "slider-absoluteset-style.hpp"
7
 #include <util/platform.h>
8
+#include <util/threading.h>
9
 #include <QHBoxLayout>
10
 #include <QVBoxLayout>
11
 #include <QPushButton>
12
@@ -16,6 +18,8 @@
13
 
14
 using namespace std;
15
 
16
+QWeakPointer<VolumeMeterTimer> VolumeMeter::updateTimer;
17
+
18
 void VolControl::OBSVolumeChanged(void *data, float db)
19
 {
20
    Q_UNUSED(db);
21
@@ -29,11 +33,10 @@
22
 {
23
    VolControl *volControl = static_cast<VolControl*>(data);
24
 
25
-   QMetaObject::invokeMethod(volControl, "VolumeLevel",
26
-       Q_ARG(float, mag),
27
-       Q_ARG(float, level),
28
-       Q_ARG(float, peak),
29
-       Q_ARG(bool,  muted));
30
+   if (muted)
31
+       level = mag = peak = 0.0f;
32
+
33
+   volControl->volMeter->setLevels(mag, level, peak);
34
 }
35
 
36
 void VolControl::OBSVolumeMuted(void *data, calldata_t *calldata)
37
@@ -84,8 +87,19 @@
38
 
39
 void VolControl::updateText()
40
 {
41
-   volLabel->setText(QString::number(obs_fader_get_db(obs_fader), 'f', 1)
42
-           .append(" dB"));
43
+   QString db = QString::number(obs_fader_get_db(obs_fader), 'f', 1)
44
+           .append(" dB");
45
+   volLabel->setText(db);
46
+
47
+   bool muted = obs_source_muted(source);
48
+   const char *accTextLookup = muted
49
+       ? "VolControl.SliderMuted"
50
+       : "VolControl.SliderUnmuted";
51
+
52
+   QString sourceName = obs_source_get_name(source);
53
+   QString accText = QTStr(accTextLookup).arg(sourceName, db);
54
+
55
+   slider->setAccessibleName(accText);
56
 }
57
 
58
 QString VolControl::GetName() const
59
@@ -124,7 +138,9 @@
60
    QFont font = nameLabel->font();
61
    font.setPointSize(font.pointSize()-1);
62
 
63
-   nameLabel->setText(obs_source_get_name(source));
64
+   QString sourceName = obs_source_get_name(source);
65
+
66
+   nameLabel->setText(sourceName);
67
    nameLabel->setFont(font);
68
    volLabel->setFont(font);
69
    slider->setMinimum(0);
70
@@ -138,7 +154,10 @@
71
    textLayout->setAlignment(nameLabel, Qt::AlignLeft);
72
    textLayout->setAlignment(volLabel,  Qt::AlignRight);
73
 
74
-   mute->setChecked(obs_source_muted(source));
75
+   bool muted = obs_source_muted(source);
76
+   mute->setChecked(muted);
77
+   mute->setAccessibleName(
78
+           QTStr("VolControl.Mute").arg(sourceName));
79
 
80
    volLayout->addWidget(slider);
81
    volLayout->addWidget(mute);
82
@@ -157,6 +176,9 @@
83
        config->setMaximumSize(22, 22);
84
        config->setAutoDefault(false);
85
 
86
+       config->setAccessibleName(QTStr("VolControl.Properties")
87
+               .arg(sourceName));
88
+
89
        connect(config, &QAbstractButton::clicked,
90
                this, &VolControl::EmitConfigClicked);
91
 
92
@@ -255,30 +277,51 @@
93
    peakColor.setRgb(0x3E, 0xF1, 0x2B);
94
    peakHoldColor.setRgb(0x00, 0x00, 0x00);
95
    
96
-   resetTimer = new QTimer(this);
97
-   connect(resetTimer, SIGNAL(timeout()), this, SLOT(resetState()));
98
+   updateTimerRef = updateTimer.toStrongRef();
99
+   if (!updateTimerRef) {
100
+       updateTimerRef = QSharedPointer<VolumeMeterTimer>::create();
101
+       updateTimerRef->start(34);
102
+       updateTimer = updateTimerRef;
103
+   }
104
 
105
-   resetState();
106
+   updateTimerRef->AddVolControl(this);
107
 }
108
 
109
-void VolumeMeter::resetState(void)
110
+VolumeMeter::~VolumeMeter()
111
 {
112
-   setLevels(0.0f, 0.0f, 0.0f);
113
-   if (resetTimer->isActive())
114
-       resetTimer->stop();
115
+   updateTimerRef->RemoveVolControl(this);
116
 }
117
 
118
 void VolumeMeter::setLevels(float nmag, float npeak, float npeakHold)
119
 {
120
-   mag      = nmag;
121
-   peak     = npeak;
122
-   peakHold = npeakHold;
123
+   uint64_t ts = os_gettime_ns();
124
+   QMutexLocker locker(&dataMutex);
125
+
126
+   mag += nmag;
127
+   peak += npeak;
128
+   peakHold += npeakHold;
129
+   multiple += 1.0f;
130
+   lastUpdateTime = ts;
131
+}
132
+
133
+inline void VolumeMeter::calcLevels()
134
+{
135
+   uint64_t ts = os_gettime_ns();
136
+   QMutexLocker locker(&dataMutex);
137
+
138
+   if (lastUpdateTime && ts - lastUpdateTime > 1000000000) {
139
+       mag = peak = peakHold = 0.0f;
140
+       multiple = 1.0f;
141
+       lastUpdateTime = 0;
142
+   }
143
 
144
-   update();
145
+   if (multiple > 0.0f) {
146
+       curMag = mag / multiple;
147
+       curPeak = peak / multiple;
148
+       curPeakHold = peakHold / multiple;
149
 
150
-   if (resetTimer->isActive())
151
-       resetTimer->stop();
152
-   resetTimer->start(1000);
153
+       mag = peak = peakHold = multiple = 0.0f;
154
+   }
155
 }
156
 
157
 void VolumeMeter::paintEvent(QPaintEvent *event)
158
@@ -291,9 +334,11 @@
159
    int width  = size().width();
160
    int height = size().height();
161
 
162
-   int scaledMag      = int((float)width * mag);
163
-   int scaledPeak     = int((float)width * peak);
164
-   int scaledPeakHold = int((float)width * peakHold);
165
+   calcLevels();
166
+
167
+   int scaledMag      = int((float)width * curMag);
168
+   int scaledPeak     = int((float)width * curPeak);
169
+   int scaledPeakHold = int((float)width * curPeakHold);
170
 
171
    gradient.setStart(qreal(scaledMag), 0);
172
    gradient.setFinalStop(qreal(scaledPeak), 0);
173
@@ -324,3 +369,19 @@
174
        scaledPeakHold, height);
175
 
176
 }
177
+
178
+void VolumeMeterTimer::AddVolControl(VolumeMeter *meter)
179
+{
180
+   volumeMeters.push_back(meter);
181
+}
182
+
183
+void VolumeMeterTimer::RemoveVolControl(VolumeMeter *meter)
184
+{
185
+   volumeMeters.removeOne(meter);
186
+}
187
+
188
+void VolumeMeterTimer::timerEvent(QTimerEvent*)
189
+{
190
+   for (VolumeMeter *meter : volumeMeters)
191
+       meter->update();
192
+}
193
obs-studio-17.0.2.tar.xz/UI/volume-control.hpp -> obs-studio-18.0.0.tar.xz/UI/volume-control.hpp Changed
64
 
1
@@ -2,8 +2,13 @@
2
 
3
 #include <obs.hpp>
4
 #include <QWidget>
5
+#include <QSharedPointer>
6
+#include <QTimer>
7
+#include <QMutex>
8
+#include <QList>
9
 
10
 class QPushButton;
11
+class VolumeMeterTimer;
12
 
13
 class VolumeMeter : public QWidget
14
 {
15
@@ -14,12 +19,23 @@
16
    Q_PROPERTY(QColor peakHoldColor READ getPeakHoldColor WRITE setPeakHoldColor DESIGNABLE true)
17
 
18
 private:
19
-   float mag, peak, peakHold;
20
+   static QWeakPointer<VolumeMeterTimer> updateTimer;
21
+   QSharedPointer<VolumeMeterTimer> updateTimerRef;
22
+   float curMag = 0.0f, curPeak = 0.0f, curPeakHold = 0.0f;
23
+
24
+   inline void calcLevels();
25
+
26
+   QMutex dataMutex;
27
+   float mag = 0.0f, peak = 0.0f, peakHold = 0.0f;
28
+   float multiple = 0.0f;
29
+   uint64_t lastUpdateTime = 0;
30
+
31
    QColor bkColor, magColor, peakColor, peakHoldColor;
32
-   QTimer *resetTimer;
33
 
34
 public:
35
    explicit VolumeMeter(QWidget *parent = 0);
36
+   ~VolumeMeter();
37
+
38
    void setLevels(float nmag, float npeak, float npeakHold);
39
    QColor getBkColor() const;
40
    void setBkColor(QColor c);
41
@@ -32,8 +48,20 @@
42
 
43
 protected:
44
    void paintEvent(QPaintEvent *event);
45
-private slots:
46
-   void resetState();
47
+};
48
+
49
+class VolumeMeterTimer : public QTimer {
50
+   Q_OBJECT
51
+
52
+public:
53
+   inline VolumeMeterTimer() : QTimer() {}
54
+
55
+   void AddVolControl(VolumeMeter *meter);
56
+   void RemoveVolControl(VolumeMeter *meter);
57
+
58
+protected:
59
+   virtual void timerEvent(QTimerEvent *event) override;
60
+   QList<VolumeMeter*> volumeMeters;
61
 };
62
 
63
 class QLabel;
64
obs-studio-18.0.0.tar.xz/UI/win-update Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/UI/win-update/update-window.cpp Added
46
 
1
@@ -0,0 +1,44 @@
2
+#include "update-window.hpp"
3
+#include "obs-app.hpp"
4
+
5
+OBSUpdate::OBSUpdate(QWidget *parent, bool manualUpdate, const QString &text)
6
+   : QDialog (parent, Qt::WindowSystemMenuHint |
7
+                      Qt::WindowTitleHint |
8
+                      Qt::WindowCloseButtonHint),
9
+     ui      (new Ui_OBSUpdate)
10
+{
11
+   ui->setupUi(this);
12
+   ui->text->setHtml(text);
13
+
14
+   if (manualUpdate) {
15
+       delete ui->skip;
16
+       ui->skip = nullptr;
17
+
18
+       ui->no->setText(QTStr("Cancel"));
19
+   }
20
+}
21
+
22
+void OBSUpdate::on_yes_clicked()
23
+{
24
+   done(OBSUpdate::Yes);
25
+}
26
+
27
+void OBSUpdate::on_no_clicked()
28
+{
29
+   done(OBSUpdate::No);
30
+}
31
+
32
+void OBSUpdate::on_skip_clicked()
33
+{
34
+   done(OBSUpdate::Skip);
35
+}
36
+
37
+void OBSUpdate::accept()
38
+{
39
+   done(OBSUpdate::Yes);
40
+}
41
+
42
+void OBSUpdate::reject()
43
+{
44
+   done(OBSUpdate::No);
45
+}
46
obs-studio-18.0.0.tar.xz/UI/win-update/update-window.hpp Added
31
 
1
@@ -0,0 +1,29 @@
2
+#pragma once
3
+
4
+#include <QDialog>
5
+#include <memory>
6
+
7
+#include "ui_OBSUpdate.h"
8
+
9
+class OBSUpdate : public QDialog {
10
+   Q_OBJECT
11
+
12
+public:
13
+   enum ReturnVal {
14
+       No,
15
+       Yes,
16
+       Skip
17
+   };
18
+
19
+   OBSUpdate(QWidget *parent, bool manualUpdate, const QString &text);
20
+
21
+public slots:
22
+   void on_yes_clicked();
23
+   void on_no_clicked();
24
+   void on_skip_clicked();
25
+   virtual void accept() override;
26
+   virtual void reject() override;
27
+
28
+private:
29
+   std::unique_ptr<Ui_OBSUpdate> ui;
30
+};
31
obs-studio-18.0.0.tar.xz/UI/win-update/win-update-helpers.cpp Added
42
 
1
@@ -0,0 +1,40 @@
2
+#include "win-update-helpers.hpp"
3
+
4
+void FreeProvider(HCRYPTPROV prov)
5
+{
6
+   CryptReleaseContext(prov, 0);
7
+}
8
+
9
+void FreeHash(HCRYPTHASH hash)
10
+{
11
+   CryptDestroyHash(hash);
12
+}
13
+
14
+void FreeKey(HCRYPTKEY key)
15
+{
16
+   CryptDestroyKey(key);
17
+}
18
+
19
+std::string vstrprintf(const char *format, va_list args)
20
+{
21
+   if (!format)
22
+       return std::string();
23
+
24
+   std::string str;
25
+   int size = (int)vsnprintf(nullptr, 0, format, args);
26
+   str.resize(size);
27
+   vsnprintf(&str[0], size, format, args);
28
+   return str;
29
+}
30
+
31
+std::string strprintf(const char *format, ...)
32
+{
33
+   std::string str;
34
+   va_list args;
35
+
36
+   va_start(args, format);
37
+   str = vstrprintf(format, args);
38
+   va_end(args);
39
+
40
+   return str;
41
+}
42
obs-studio-18.0.0.tar.xz/UI/win-update/win-update-helpers.hpp Added
141
 
1
@@ -0,0 +1,139 @@
2
+#pragma once
3
+
4
+#define WIN32_LEAN_AND_MEAN
5
+#include <windows.h>
6
+#include <Wincrypt.h>
7
+
8
+#include <jansson.h>
9
+
10
+#include <cstdint>
11
+#include <string>
12
+
13
+/* ------------------------------------------------------------------------ */
14
+
15
+template<typename T, void freefunc(T)> class CustomHandle {
16
+   T handle;
17
+
18
+public:
19
+   inline CustomHandle() : handle(0) {}
20
+   inline CustomHandle(T in) : handle(in) {}
21
+   inline ~CustomHandle()
22
+   {
23
+       if (handle)
24
+           freefunc(handle);
25
+   }
26
+
27
+   inline T *operator&() {return &handle;}
28
+   inline operator T() const {return handle;}
29
+   inline T get() const {return handle;}
30
+
31
+   inline CustomHandle<T, freefunc> &operator=(T in)
32
+   {
33
+       if (handle)
34
+           freefunc(handle);
35
+       handle = in;
36
+       return *this;
37
+   }
38
+
39
+   inline bool operator!() const {return !handle;}
40
+};
41
+
42
+void FreeProvider(HCRYPTPROV prov);
43
+void FreeHash(HCRYPTHASH hash);
44
+void FreeKey(HCRYPTKEY key);
45
+
46
+using CryptProvider = CustomHandle<HCRYPTPROV, FreeProvider>;
47
+using CryptHash     = CustomHandle<HCRYPTHASH, FreeHash>;
48
+using CryptKey      = CustomHandle<HCRYPTKEY,  FreeKey>;
49
+
50
+/* ------------------------------------------------------------------------ */
51
+
52
+template<typename T> class LocalPtr {
53
+   T *ptr = nullptr;
54
+
55
+public:
56
+   inline ~LocalPtr()
57
+   {
58
+       if (ptr)
59
+           LocalFree(ptr);
60
+   }
61
+
62
+   inline T **operator&() {return &ptr;}
63
+   inline operator T() const {return ptr;}
64
+   inline T *get() const {return ptr;}
65
+
66
+   inline bool operator!() const {return !ptr;}
67
+
68
+   inline T *operator->() {return ptr;}
69
+};
70
+
71
+/* ------------------------------------------------------------------------ */
72
+
73
+class Json {
74
+   json_t *json;
75
+
76
+public:
77
+   inline Json() : json(nullptr) {}
78
+   explicit inline Json(json_t *json_) : json(json_) {}
79
+   inline Json(const Json &from) : json(json_incref(from.json)) {}
80
+   inline Json(Json &&from) : json(from.json) {from.json = nullptr;}
81
+
82
+   inline ~Json() {
83
+       if (json)
84
+           json_decref(json);
85
+   }
86
+
87
+   inline Json &operator=(json_t *json_)
88
+   {
89
+       if (json)
90
+           json_decref(json);
91
+       json = json_;
92
+       return *this;
93
+   }
94
+   inline Json &operator=(const Json &from)
95
+   {
96
+       if (json)
97
+           json_decref(json);
98
+       json = json_incref(from.json);
99
+       return *this;
100
+   }
101
+   inline Json &operator=(Json &&from)
102
+   {
103
+       if (json)
104
+           json_decref(json);
105
+       json = from.json;
106
+       from.json = nullptr;
107
+       return *this;
108
+   }
109
+
110
+   inline operator json_t *() const {return json;}
111
+
112
+   inline bool operator!() const {return !json;}
113
+
114
+   inline const char *GetString(const char *name,
115
+           const char *def = nullptr) const
116
+   {
117
+       json_t *obj(json_object_get(json, name));
118
+       if (!obj)
119
+           return def;
120
+       return json_string_value(obj);
121
+   }
122
+   inline int64_t GetInt(const char *name, int def = 0) const
123
+   {
124
+       json_t *obj(json_object_get(json, name));
125
+       if (!obj)
126
+           return def;
127
+       return json_integer_value(obj);
128
+   }
129
+   inline json_t *GetObject(const char *name) const
130
+   {
131
+       return json_object_get(json, name);
132
+   }
133
+
134
+   inline json_t *get() const {return json;}
135
+};
136
+
137
+/* ------------------------------------------------------------------------ */
138
+
139
+std::string vstrprintf(const char *format, va_list args);
140
+std::string strprintf(const char *format, ...);
141
obs-studio-18.0.0.tar.xz/UI/win-update/win-update.cpp Added
201
 
1
@@ -0,0 +1,781 @@
2
+#include "win-update-helpers.hpp"
3
+#include "update-window.hpp"
4
+#include "remote-text.hpp"
5
+#include "win-update.hpp"
6
+#include "obs-app.hpp"
7
+
8
+#include <QMessageBox>
9
+
10
+#include <string>
11
+
12
+#include <util/windows/WinHandle.hpp>
13
+#include <util/util.hpp>
14
+#include <jansson.h>
15
+#include <blake2.h>
16
+
17
+#include <time.h>
18
+#include <strsafe.h>
19
+#include <winhttp.h>
20
+#include <shellapi.h>
21
+
22
+using namespace std;
23
+
24
+/* ------------------------------------------------------------------------ */
25
+
26
+#ifndef WIN_MANIFEST_URL
27
+#define WIN_MANIFEST_URL "https://obsproject.com/update_studio/manifest.json"
28
+#endif
29
+
30
+#ifndef WIN_UPDATER_URL
31
+#define WIN_UPDATER_URL "https://obsproject.com/update_studio/updater.exe"
32
+#endif
33
+
34
+static HCRYPTPROV provider = 0;
35
+
36
+#pragma pack(push, r1, 1)
37
+
38
+typedef struct {
39
+   BLOBHEADER blobheader;
40
+   RSAPUBKEY  rsapubkey;
41
+} PUBLICKEYHEADER;
42
+
43
+#pragma pack(pop, r1)
44
+
45
+#define BLAKE2_HASH_LENGTH 20
46
+#define BLAKE2_HASH_STR_LENGTH ((BLAKE2_HASH_LENGTH * 2) + 1)
47
+
48
+#define TEST_BUILD
49
+
50
+// Hard coded 4096 bit RSA public key for obsproject.com in PEM format
51
+static const unsigned char obs_pub[] = {
52
+   0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x50,
53
+   0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d,
54
+   0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x43, 0x49, 0x6a, 0x41, 0x4e, 0x42,
55
+   0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41,
56
+   0x51, 0x45, 0x46, 0x41, 0x41, 0x4f, 0x43, 0x41, 0x67, 0x38, 0x41, 0x4d,
57
+   0x49, 0x49, 0x43, 0x43, 0x67, 0x4b, 0x43, 0x41, 0x67, 0x45, 0x41, 0x6c,
58
+   0x33, 0x73, 0x76, 0x65, 0x72, 0x77, 0x39, 0x48, 0x51, 0x2b, 0x72, 0x59,
59
+   0x51, 0x4e, 0x6e, 0x39, 0x43, 0x61, 0x37, 0x0a, 0x39, 0x4c, 0x55, 0x36,
60
+   0x32, 0x6e, 0x47, 0x36, 0x4e, 0x6f, 0x7a, 0x45, 0x2f, 0x46, 0x73, 0x49,
61
+   0x56, 0x4e, 0x65, 0x72, 0x2b, 0x57, 0x2f, 0x68, 0x75, 0x65, 0x45, 0x38,
62
+   0x57, 0x51, 0x31, 0x6d, 0x72, 0x46, 0x50, 0x2b, 0x32, 0x79, 0x41, 0x2b,
63
+   0x69, 0x59, 0x52, 0x75, 0x74, 0x59, 0x50, 0x65, 0x45, 0x67, 0x70, 0x78,
64
+   0x74, 0x6f, 0x64, 0x48, 0x68, 0x67, 0x6b, 0x52, 0x34, 0x70, 0x45, 0x4b,
65
+   0x0a, 0x56, 0x6e, 0x72, 0x72, 0x31, 0x38, 0x71, 0x34, 0x73, 0x7a, 0x6c,
66
+   0x76, 0x38, 0x39, 0x51, 0x49, 0x37, 0x74, 0x38, 0x6c, 0x4d, 0x6f, 0x4c,
67
+   0x54, 0x6c, 0x46, 0x2b, 0x74, 0x31, 0x49, 0x52, 0x30, 0x56, 0x34, 0x77,
68
+   0x4a, 0x56, 0x33, 0x34, 0x49, 0x33, 0x43, 0x2b, 0x33, 0x35, 0x39, 0x4b,
69
+   0x69, 0x78, 0x6e, 0x7a, 0x4c, 0x30, 0x42, 0x6c, 0x39, 0x61, 0x6a, 0x2f,
70
+   0x7a, 0x44, 0x63, 0x72, 0x58, 0x0a, 0x57, 0x6c, 0x35, 0x70, 0x48, 0x54,
71
+   0x69, 0x6f, 0x4a, 0x77, 0x59, 0x4f, 0x67, 0x4d, 0x69, 0x42, 0x47, 0x4c,
72
+   0x79, 0x50, 0x65, 0x69, 0x74, 0x4d, 0x46, 0x64, 0x6a, 0x6a, 0x54, 0x49,
73
+   0x70, 0x43, 0x4d, 0x2b, 0x6d, 0x78, 0x54, 0x57, 0x58, 0x43, 0x72, 0x5a,
74
+   0x39, 0x64, 0x50, 0x55, 0x4b, 0x76, 0x5a, 0x74, 0x67, 0x7a, 0x6a, 0x64,
75
+   0x2b, 0x49, 0x7a, 0x6c, 0x48, 0x69, 0x64, 0x48, 0x74, 0x4f, 0x0a, 0x4f,
76
+   0x52, 0x42, 0x4e, 0x35, 0x6d, 0x52, 0x73, 0x38, 0x4c, 0x4e, 0x4f, 0x35,
77
+   0x38, 0x6b, 0x37, 0x39, 0x72, 0x37, 0x37, 0x44, 0x63, 0x67, 0x51, 0x59,
78
+   0x50, 0x4e, 0x69, 0x69, 0x43, 0x74, 0x57, 0x67, 0x43, 0x2b, 0x59, 0x34,
79
+   0x4b, 0x37, 0x75, 0x53, 0x5a, 0x58, 0x33, 0x48, 0x76, 0x65, 0x6f, 0x6d,
80
+   0x32, 0x74, 0x48, 0x62, 0x56, 0x58, 0x79, 0x30, 0x4c, 0x2f, 0x43, 0x6c,
81
+   0x37, 0x66, 0x4d, 0x0a, 0x48, 0x4b, 0x71, 0x66, 0x63, 0x51, 0x47, 0x75,
82
+   0x79, 0x72, 0x76, 0x75, 0x64, 0x34, 0x32, 0x4f, 0x72, 0x57, 0x61, 0x72,
83
+   0x41, 0x73, 0x6e, 0x32, 0x70, 0x32, 0x45, 0x69, 0x36, 0x4b, 0x7a, 0x78,
84
+   0x62, 0x33, 0x47, 0x36, 0x45, 0x53, 0x43, 0x77, 0x31, 0x35, 0x6e, 0x48,
85
+   0x41, 0x67, 0x4c, 0x61, 0x6c, 0x38, 0x7a, 0x53, 0x71, 0x37, 0x2b, 0x72,
86
+   0x61, 0x45, 0x2f, 0x78, 0x6b, 0x4c, 0x70, 0x43, 0x0a, 0x62, 0x59, 0x67,
87
+   0x35, 0x67, 0x6d, 0x59, 0x36, 0x76, 0x62, 0x6d, 0x57, 0x6e, 0x71, 0x39,
88
+   0x64, 0x71, 0x57, 0x72, 0x55, 0x7a, 0x61, 0x71, 0x4f, 0x66, 0x72, 0x5a,
89
+   0x50, 0x67, 0x76, 0x67, 0x47, 0x30, 0x57, 0x76, 0x6b, 0x42, 0x53, 0x68,
90
+   0x66, 0x61, 0x45, 0x4f, 0x42, 0x61, 0x49, 0x55, 0x78, 0x41, 0x33, 0x51,
91
+   0x42, 0x67, 0x7a, 0x41, 0x5a, 0x68, 0x71, 0x65, 0x65, 0x64, 0x46, 0x39,
92
+   0x68, 0x0a, 0x61, 0x66, 0x4d, 0x47, 0x4d, 0x4d, 0x39, 0x71, 0x56, 0x62,
93
+   0x66, 0x77, 0x75, 0x75, 0x7a, 0x4a, 0x32, 0x75, 0x68, 0x2b, 0x49, 0x6e,
94
+   0x61, 0x47, 0x61, 0x65, 0x48, 0x32, 0x63, 0x30, 0x34, 0x6f, 0x56, 0x63,
95
+   0x44, 0x46, 0x66, 0x65, 0x4f, 0x61, 0x44, 0x75, 0x78, 0x52, 0x6a, 0x43,
96
+   0x43, 0x62, 0x71, 0x72, 0x35, 0x73, 0x4c, 0x53, 0x6f, 0x31, 0x43, 0x57,
97
+   0x6f, 0x6b, 0x79, 0x6e, 0x6a, 0x4e, 0x0a, 0x43, 0x42, 0x2b, 0x62, 0x32,
98
+   0x72, 0x51, 0x46, 0x37, 0x44, 0x50, 0x50, 0x62, 0x44, 0x34, 0x73, 0x2f,
99
+   0x6e, 0x54, 0x39, 0x4e, 0x73, 0x63, 0x6b, 0x2f, 0x4e, 0x46, 0x7a, 0x72,
100
+   0x42, 0x58, 0x52, 0x4f, 0x2b, 0x64, 0x71, 0x6b, 0x65, 0x42, 0x77, 0x44,
101
+   0x55, 0x43, 0x76, 0x37, 0x62, 0x5a, 0x67, 0x57, 0x37, 0x4f, 0x78, 0x75,
102
+   0x4f, 0x58, 0x30, 0x37, 0x4c, 0x54, 0x71, 0x66, 0x70, 0x35, 0x73, 0x0a,
103
+   0x4f, 0x65, 0x47, 0x67, 0x75, 0x62, 0x75, 0x62, 0x69, 0x77, 0x59, 0x33,
104
+   0x55, 0x64, 0x48, 0x59, 0x71, 0x2b, 0x4c, 0x39, 0x4a, 0x71, 0x49, 0x53,
105
+   0x47, 0x31, 0x74, 0x4d, 0x34, 0x48, 0x65, 0x4b, 0x6a, 0x61, 0x48, 0x6a,
106
+   0x75, 0x31, 0x4d, 0x44, 0x6a, 0x76, 0x48, 0x5a, 0x32, 0x44, 0x62, 0x6d,
107
+   0x4c, 0x77, 0x55, 0x78, 0x75, 0x59, 0x61, 0x36, 0x4a, 0x5a, 0x44, 0x4b,
108
+   0x57, 0x73, 0x37, 0x72, 0x0a, 0x49, 0x72, 0x64, 0x44, 0x77, 0x78, 0x33,
109
+   0x4a, 0x77, 0x61, 0x63, 0x46, 0x36, 0x36, 0x68, 0x33, 0x59, 0x55, 0x57,
110
+   0x36, 0x74, 0x7a, 0x55, 0x5a, 0x68, 0x7a, 0x74, 0x63, 0x6d, 0x51, 0x65,
111
+   0x70, 0x50, 0x2f, 0x75, 0x37, 0x42, 0x67, 0x47, 0x72, 0x6b, 0x4f, 0x50,
112
+   0x50, 0x70, 0x59, 0x41, 0x30, 0x4e, 0x45, 0x4a, 0x38, 0x30, 0x53, 0x65,
113
+   0x41, 0x78, 0x37, 0x68, 0x69, 0x4e, 0x34, 0x76, 0x61, 0x0a, 0x65, 0x45,
114
+   0x51, 0x4b, 0x6e, 0x52, 0x6e, 0x2b, 0x45, 0x70, 0x42, 0x4e, 0x36, 0x55,
115
+   0x42, 0x61, 0x35, 0x66, 0x37, 0x4c, 0x6f, 0x4b, 0x38, 0x43, 0x41, 0x77,
116
+   0x45, 0x41, 0x41, 0x51, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d,
117
+   0x45, 0x4e, 0x44, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x4b,
118
+   0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a
119
+};
120
+static const unsigned int obs_pub_len = 800;
121
+
122
+/* ------------------------------------------------------------------------ */
123
+
124
+static bool QuickWriteFile(const char *file, const void *data, size_t size)
125
+try {
126
+   BPtr<wchar_t> w_file;
127
+   if (os_utf8_to_wcs_ptr(file, 0, &w_file) == 0)
128
+       return false;
129
+
130
+   WinHandle handle = CreateFileW(
131
+           w_file,
132
+           GENERIC_WRITE,
133
+           0,
134
+           nullptr,
135
+           CREATE_ALWAYS,
136
+           FILE_FLAG_WRITE_THROUGH,
137
+           nullptr);
138
+
139
+   if (handle == INVALID_HANDLE_VALUE)
140
+       throw strprintf("Failed to open file '%s': %lu",
141
+               file, GetLastError());
142
+
143
+   DWORD written;
144
+   if (!WriteFile(handle, data, (DWORD)size, &written, nullptr))
145
+       throw strprintf("Failed to write file '%s': %lu",
146
+               file, GetLastError());
147
+
148
+   return true;
149
+
150
+} catch (string text) {
151
+   blog(LOG_WARNING, "%s: %s", __FUNCTION__, text.c_str());
152
+   return false;
153
+}
154
+
155
+static bool QuickReadFile(const char *file, string &data)
156
+try {
157
+   BPtr<wchar_t> w_file;
158
+   if (os_utf8_to_wcs_ptr(file, 0, &w_file) == 0)
159
+       return false;
160
+
161
+   WinHandle handle = CreateFileW(
162
+           w_file,
163
+           GENERIC_READ,
164
+           FILE_SHARE_READ,
165
+           nullptr,
166
+           OPEN_EXISTING,
167
+           0,
168
+           nullptr);
169
+
170
+   if (handle == INVALID_HANDLE_VALUE)
171
+       throw strprintf("Failed to open file '%s': %lu",
172
+               file, GetLastError());
173
+
174
+   DWORD size = GetFileSize(handle, nullptr);
175
+   data.resize(size);
176
+
177
+   DWORD read;
178
+   if (!ReadFile(handle, &data[0], size, &read, nullptr))
179
+       throw strprintf("Failed to write file '%s': %lu",
180
+               file, GetLastError());
181
+
182
+   return true;
183
+
184
+} catch (string text) {
185
+   blog(LOG_WARNING, "%s: %s", __FUNCTION__, text.c_str());
186
+   return false;
187
+}
188
+
189
+static void HashToString(const uint8_t *in, char *out)
190
+{
191
+   const char alphabet[] = "0123456789abcdef";
192
+
193
+   for (int i = 0; i != BLAKE2_HASH_LENGTH; ++i) {
194
+       out[2 * i]     = alphabet[in[i] / 16];
195
+       out[2 * i + 1] = alphabet[in[i] % 16];
196
+   }
197
+
198
+   out[BLAKE2_HASH_LENGTH * 2] = 0;
199
+}
200
+
201
obs-studio-18.0.0.tar.xz/UI/win-update/win-update.hpp Added
25
 
1
@@ -0,0 +1,23 @@
2
+#pragma once
3
+
4
+#include <QThread>
5
+#include <QString>
6
+
7
+class AutoUpdateThread : public QThread {
8
+   Q_OBJECT
9
+
10
+   bool manualUpdate;
11
+   bool user_confirmed = false;
12
+
13
+   virtual void run() override;
14
+
15
+   void info(const QString &title, const QString &text);
16
+   int queryUpdate(bool manualUpdate, const char *text_utf8);
17
+
18
+private slots:
19
+   void infoMsg(const QString &title, const QString &text);
20
+   int queryUpdateSlot(bool manualUpdate, const QString &text);
21
+
22
+public:
23
+   AutoUpdateThread(bool manualUpdate_) : manualUpdate(manualUpdate_) {}
24
+};
25
obs-studio-17.0.2.tar.xz/UI/window-basic-adv-audio.cpp -> obs-studio-18.0.0.tar.xz/UI/window-basic-adv-audio.cpp Changed
40
 
1
@@ -22,26 +22,32 @@
2
    QWidget *widget;
3
    QLabel *label;
4
 
5
+   int idx = 0;
6
    mainLayout = new QGridLayout;
7
    mainLayout->setContentsMargins(0, 0, 0, 0);
8
    label = new QLabel(QTStr("Basic.AdvAudio.Name"));
9
    label->setAlignment(Qt::AlignHCenter);
10
-   mainLayout->addWidget(label, 0, 0);
11
+   mainLayout->addWidget(label, 0, idx++);
12
    label = new QLabel(QTStr("Basic.AdvAudio.Volume"));
13
    label->setAlignment(Qt::AlignHCenter);
14
-   mainLayout->addWidget(label, 0, 1);
15
+   mainLayout->addWidget(label, 0, idx++);
16
    label = new QLabel(QTStr("Basic.AdvAudio.Mono"));
17
    label->setAlignment(Qt::AlignHCenter);
18
-   mainLayout->addWidget(label, 0, 2);
19
+   mainLayout->addWidget(label, 0, idx++);
20
    label = new QLabel(QTStr("Basic.AdvAudio.Panning"));
21
    label->setAlignment(Qt::AlignHCenter);
22
-   mainLayout->addWidget(label, 0, 3);
23
+   mainLayout->addWidget(label, 0, idx++);
24
    label = new QLabel(QTStr("Basic.AdvAudio.SyncOffset"));
25
    label->setAlignment(Qt::AlignHCenter);
26
-   mainLayout->addWidget(label, 0, 4);
27
+   mainLayout->addWidget(label, 0, idx++);
28
+#if defined(_WIN32) || defined(__APPLE__)
29
+   label = new QLabel(QTStr("Basic.AdvAudio.Monitoring"));
30
+   label->setAlignment(Qt::AlignHCenter);
31
+   mainLayout->addWidget(label, 0, idx++);
32
+#endif
33
    label = new QLabel(QTStr("Basic.AdvAudio.AudioTracks"));
34
    label->setAlignment(Qt::AlignHCenter);
35
-   mainLayout->addWidget(label, 0, 5);
36
+   mainLayout->addWidget(label, 0, idx++);
37
 
38
    controlArea = new QWidget;
39
    controlArea->setLayout(mainLayout);
40
obs-studio-17.0.2.tar.xz/UI/window-basic-main-outputs.cpp -> obs-studio-18.0.0.tar.xz/UI/window-basic-main-outputs.cpp Changed
120
 
1
@@ -575,6 +575,8 @@
2
    obs_data_set_int(settings, "AMF.H264.Bitrate.Target", bitrate);
3
    obs_data_set_int(settings, "bitrate", bitrate);
4
    obs_data_set_int(settings, "AMF.H264.FillerData", 1);
5
+   obs_data_set_int(settings, "AMF.H264.VBVBuffer", 1);
6
+   obs_data_set_int(settings, "AMF.H264.VBVBuffer.Size", bitrate);
7
    
8
    // Picture Control Properties
9
    obs_data_set_double(settings, "AMF.H264.KeyframeInterval", 2.0);
10
@@ -596,6 +598,8 @@
11
    obs_data_set_int(settings, "AMF.H264.QP.IFrame", cqp);
12
    obs_data_set_int(settings, "AMF.H264.QP.PFrame", cqp);
13
    obs_data_set_int(settings, "AMF.H264.QP.BFrame", cqp);
14
+   obs_data_set_int(settings, "AMF.H264.VBVBuffer", 1);
15
+   obs_data_set_int(settings, "AMF.H264.VBVBuffer.Size", 50000);
16
 
17
    // Picture Control Properties
18
    obs_data_set_double(settings, "AMF.H264.KeyframeInterval", 2.0);
19
@@ -665,9 +669,17 @@
20
            "DelayPreserve");
21
    const char *bindIP = config_get_string(main->Config(), "Output",
22
            "BindIP");
23
+   bool enableNewSocketLoop = config_get_bool(main->Config(), "Output",
24
+           "NewSocketLoopEnable");
25
+   bool enableLowLatencyMode = config_get_bool(main->Config(), "Output",
26
+           "LowLatencyEnable");
27
 
28
    obs_data_t *settings = obs_data_create();
29
    obs_data_set_string(settings, "bind_ip", bindIP);
30
+   obs_data_set_bool(settings, "new_socket_loop_enabled",
31
+           enableNewSocketLoop);
32
+   obs_data_set_bool(settings, "low_latency_mode_enabled",
33
+           enableLowLatencyMode);
34
    obs_output_update(streamOutput, settings);
35
    obs_data_release(settings);
36
 
37
@@ -837,8 +849,13 @@
38
    UpdateRecording();
39
    if (!ConfigureRecording(false))
40
        return false;
41
-   if (!obs_output_start(fileOutput))
42
+   if (!obs_output_start(fileOutput))  {
43
+       QMessageBox::critical(main,
44
+               QTStr("Output.StartRecordingFailed"),
45
+               QTStr("Output.StartFailedGeneric"));
46
        return false;
47
+   }
48
+
49
    return true;
50
 }
51
 
52
@@ -847,8 +864,13 @@
53
    UpdateRecording();
54
    if (!ConfigureRecording(true))
55
        return false;
56
-   if (!obs_output_start(replayBuffer))
57
+   if (!obs_output_start(replayBuffer)) {
58
+       QMessageBox::critical(main,
59
+               QTStr("Output.StartReplayFailed"),
60
+               QTStr("Output.StartFailedGeneric"));
61
        return false;
62
+   }
63
+
64
    return true;
65
 }
66
 
67
@@ -1152,6 +1174,8 @@
68
    const char *url = config_get_string(main->Config(), "AdvOut", "FFURL");
69
    int vBitrate = config_get_int(main->Config(), "AdvOut",
70
            "FFVBitrate");
71
+   int gopSize = config_get_int(main->Config(), "AdvOut",
72
+           "FFVGOPSize");
73
    bool rescale = config_get_bool(main->Config(), "AdvOut",
74
            "FFRescale");
75
    const char *rescaleRes = config_get_string(main->Config(), "AdvOut",
76
@@ -1184,6 +1208,7 @@
77
    obs_data_set_string(settings, "format_name", formatName);
78
    obs_data_set_string(settings, "format_mime_type", mimeType);
79
    obs_data_set_string(settings, "muxer_settings", muxCustom);
80
+   obs_data_set_int(settings, "gop_size", gopSize);
81
    obs_data_set_int(settings, "video_bitrate", vBitrate);
82
    obs_data_set_string(settings, "video_encoder", vEncoder);
83
    obs_data_set_int(settings, "video_encoder_id", vEncoderId);
84
@@ -1304,9 +1329,17 @@
85
            "DelayPreserve");
86
    const char *bindIP = config_get_string(main->Config(), "Output",
87
            "BindIP");
88
+   bool enableNewSocketLoop = config_get_bool(main->Config(), "Output",
89
+           "NewSocketLoopEnable");
90
+   bool enableLowLatencyMode = config_get_bool(main->Config(), "Output",
91
+           "LowLatencyEnable");
92
 
93
    obs_data_t *settings = obs_data_create();
94
    obs_data_set_string(settings, "bind_ip", bindIP);
95
+   obs_data_set_bool(settings, "new_socket_loop_enabled",
96
+           enableNewSocketLoop);
97
+   obs_data_set_bool(settings, "low_latency_mode_enabled",
98
+           enableLowLatencyMode);
99
    obs_output_update(streamOutput, settings);
100
    obs_data_release(settings);
101
 
102
@@ -1399,11 +1432,14 @@
103
        obs_data_release(settings);
104
    }
105
 
106
-   if (obs_output_start(fileOutput)) {
107
-       return true;
108
+   if (!obs_output_start(fileOutput)) {
109
+       QMessageBox::critical(main,
110
+               QTStr("Output.StartRecordingFailed"),
111
+               QTStr("Output.StartFailedGeneric"));
112
+       return false;
113
    }
114
 
115
-   return false;
116
+   return true;
117
 }
118
 
119
 void AdvancedOutput::StopStreaming(bool force)
120
obs-studio-17.0.2.tar.xz/UI/window-basic-main-scene-collections.cpp -> obs-studio-18.0.0.tar.xz/UI/window-basic-main-scene-collections.cpp Changed
11
 
1
@@ -222,6 +222,9 @@
2
    EnumSceneCollections(addCollection);
3
 
4
    ui->actionRemoveSceneCollection->setEnabled(count > 1);
5
+
6
+   OBSBasic *main = reinterpret_cast<OBSBasic*>(App()->GetMainWindow());
7
+   main->OpenSavedProjectors();
8
 }
9
 
10
 void OBSBasic::on_actionNewSceneCollection_triggered()
11
obs-studio-17.0.2.tar.xz/UI/window-basic-main-transitions.cpp -> obs-studio-18.0.0.tar.xz/UI/window-basic-main-transitions.cpp Changed
38
 
1
@@ -234,8 +234,10 @@
2
            SetCurrentScene(scene);
3
    }
4
 
5
-   if (api)
6
+   if (api) {
7
        api->on_event(OBS_FRONTEND_EVENT_TRANSITION_STOPPED);
8
+       api->on_event(OBS_FRONTEND_EVENT_SCENE_CHANGED);
9
+   }
10
 
11
    swapScene = nullptr;
12
 }
13
@@ -274,19 +276,19 @@
14
 
15
    obs_source_t *transition = obs_get_output_source(0);
16
 
17
-   if (force)
18
+   if (force) {
19
        obs_transition_set(transition, source);
20
-   else
21
+       if (api)
22
+           api->on_event(OBS_FRONTEND_EVENT_SCENE_CHANGED);
23
+   } else {
24
        obs_transition_start(transition, OBS_TRANSITION_MODE_AUTO,
25
                ui->transitionDuration->value(), source);
26
+   }
27
 
28
    if (usingPreviewProgram && sceneDuplicationMode)
29
        obs_scene_release(scene);
30
 
31
    obs_source_release(transition);
32
-
33
-   if (api)
34
-       api->on_event(OBS_FRONTEND_EVENT_SCENE_CHANGED);
35
 }
36
 
37
 static inline void SetComboTransition(QComboBox *combo, obs_source_t *tr)
38
obs-studio-17.0.2.tar.xz/UI/window-basic-main.cpp -> obs-studio-18.0.0.tar.xz/UI/window-basic-main.cpp Changed
201
 
1
@@ -52,6 +52,10 @@
2
 #include "volume-control.hpp"
3
 #include "remote-text.hpp"
4
 
5
+#if defined(_WIN32) && defined(ENABLE_WIN_UPDATER)
6
+#include "win-update/win-update.hpp"
7
+#endif
8
+
9
 #include "ui_OBSBasic.h"
10
 
11
 #include <fstream>
12
@@ -123,6 +127,11 @@
13
    : OBSMainWindow  (parent),
14
      ui             (new Ui::OBSBasic)
15
 {
16
+   setAttribute(Qt::WA_NativeWindow);
17
+
18
+   projectorArray.resize(10, "");
19
+   previewProjectorArray.resize(10, 0);
20
+
21
    setAcceptDrops(true);
22
 
23
    ui->setupUi(this);
24
@@ -262,7 +271,9 @@
25
 static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder,
26
        obs_data_array_t *quickTransitionData, int transitionDuration,
27
        obs_data_array_t *transitions,
28
-       OBSScene &scene, OBSSource &curProgramScene)
29
+       OBSScene &scene, OBSSource &curProgramScene,
30
+       obs_data_array_t *savedProjectorList,
31
+       obs_data_array_t *savedPreviewProjectorList)
32
 {
33
    obs_data_t *saveData = obs_data_create();
34
 
35
@@ -303,6 +314,9 @@
36
    obs_data_set_array(saveData, "sources", sourcesArray);
37
    obs_data_set_array(saveData, "quick_transitions", quickTransitionData);
38
    obs_data_set_array(saveData, "transitions", transitions);
39
+   obs_data_set_array(saveData, "saved_projectors", savedProjectorList);
40
+   obs_data_set_array(saveData, "saved_preview_projectors",
41
+           savedPreviewProjectorList);
42
    obs_data_array_release(sourcesArray);
43
 
44
    obs_data_set_string(saveData, "current_transition",
45
@@ -360,6 +374,36 @@
46
    return sceneOrder;
47
 }
48
 
49
+obs_data_array_t *OBSBasic::SaveProjectors()
50
+{
51
+   obs_data_array_t *saveProjector = obs_data_array_create();
52
+
53
+   for (size_t i = 0; i < projectorArray.size(); i++) {
54
+       obs_data_t *data = obs_data_create();
55
+       obs_data_set_string(data, "saved_projectors",
56
+           projectorArray.at(i).c_str());
57
+       obs_data_array_push_back(saveProjector, data);
58
+       obs_data_release(data);
59
+   }
60
+
61
+   return saveProjector;
62
+}
63
+
64
+obs_data_array_t *OBSBasic::SavePreviewProjectors()
65
+{
66
+   obs_data_array_t *saveProjector = obs_data_array_create();
67
+
68
+   for (size_t i = 0; i < previewProjectorArray.size(); i++) {
69
+       obs_data_t *data = obs_data_create();
70
+       obs_data_set_int(data, "saved_preview_projectors",
71
+           previewProjectorArray.at(i));
72
+       obs_data_array_push_back(saveProjector, data);
73
+       obs_data_release(data);
74
+   }
75
+
76
+   return saveProjector;
77
+}
78
+
79
 void OBSBasic::Save(const char *file)
80
 {
81
    OBSScene scene = GetCurrentScene();
82
@@ -370,9 +414,12 @@
83
    obs_data_array_t *sceneOrder = SaveSceneListOrder();
84
    obs_data_array_t *transitions = SaveTransitions();
85
    obs_data_array_t *quickTrData = SaveQuickTransitions();
86
+   obs_data_array_t *savedProjectorList = SaveProjectors();
87
+   obs_data_array_t *savedPreviewProjectorList = SavePreviewProjectors();
88
    obs_data_t *saveData  = GenerateSaveData(sceneOrder, quickTrData,
89
            ui->transitionDuration->value(), transitions,
90
-           scene, curProgramScene);
91
+           scene, curProgramScene, savedProjectorList,
92
+           savedPreviewProjectorList);
93
 
94
    obs_data_set_bool(saveData, "preview_locked", ui->preview->Locked());
95
    obs_data_set_int(saveData, "scaling_mode",
96
@@ -392,6 +439,8 @@
97
    obs_data_array_release(sceneOrder);
98
    obs_data_array_release(quickTrData);
99
    obs_data_array_release(transitions);
100
+   obs_data_array_release(savedProjectorList);
101
+   obs_data_array_release(savedPreviewProjectorList);
102
 }
103
 
104
 static void LoadAudioDevice(const char *name, int channel, obs_data_t *parent)
105
@@ -491,6 +540,32 @@
106
    }
107
 }
108
 
109
+void OBSBasic::LoadSavedProjectors(obs_data_array_t *array)
110
+{
111
+   size_t num = obs_data_array_count(array);
112
+
113
+   for (size_t i = 0; i < num; i++) {
114
+       obs_data_t *data = obs_data_array_item(array, i);
115
+       projectorArray.at(i) = obs_data_get_string(data,
116
+               "saved_projectors");
117
+
118
+       obs_data_release(data);
119
+   }
120
+}
121
+
122
+void OBSBasic::LoadSavedPreviewProjectors(obs_data_array_t *array)
123
+{
124
+   size_t num = obs_data_array_count(array);
125
+
126
+   for (size_t i = 0; i < num; i++) {
127
+       obs_data_t *data = obs_data_array_item(array, i);
128
+       previewProjectorArray.at(i) = obs_data_get_int(data,
129
+               "saved_preview_projectors");
130
+
131
+       obs_data_release(data);
132
+   }
133
+}
134
+
135
 static void LogFilter(obs_source_t*, obs_source_t *filter, void *v_val)
136
 {
137
    const char *name = obs_source_get_name(filter);
138
@@ -618,6 +693,23 @@
139
    ui->transitionDuration->setValue(newDuration);
140
    SetTransition(curTransition);
141
 
142
+   obs_data_array_t *savedProjectors = obs_data_get_array(data,
143
+           "saved_projectors");
144
+
145
+   if (savedProjectors)
146
+       LoadSavedProjectors(savedProjectors);
147
+
148
+   obs_data_array_release(savedProjectors);
149
+
150
+   obs_data_array_t *savedPreviewProjectors = obs_data_get_array(data,
151
+           "saved_preview_projectors");
152
+
153
+   if (savedPreviewProjectors)
154
+       LoadSavedPreviewProjectors(savedPreviewProjectors);
155
+
156
+   obs_data_array_release(savedPreviewProjectors);
157
+
158
+
159
 retryScene:
160
    curScene = obs_get_source_by_name(sceneName);
161
    curProgramScene = obs_get_source_by_name(programSceneName);
162
@@ -703,6 +795,12 @@
163
        opt_start_recording = false;
164
    }
165
 
166
+   if (opt_start_replaybuffer) {
167
+       QMetaObject::invokeMethod(this, "StartReplayBuffer",
168
+               Qt::QueuedConnection);
169
+       opt_start_replaybuffer = false;
170
+   }
171
+
172
    LogScenes();
173
 
174
    disableSaving--;
175
@@ -876,8 +974,11 @@
176
            GetDefaultVideoSavePath().c_str());
177
    config_set_default_string(basicConfig, "AdvOut", "FFExtension", "mp4");
178
    config_set_default_uint  (basicConfig, "AdvOut", "FFVBitrate", 2500);
179
+   config_set_default_uint  (basicConfig, "AdvOut", "FFVGOPSize", 250);
180
    config_set_default_bool  (basicConfig, "AdvOut", "FFUseRescale",
181
            false);
182
+   config_set_default_bool  (basicConfig, "AdvOut", "FFIgnoreCompat",
183
+           false);
184
    config_set_default_uint  (basicConfig, "AdvOut", "FFABitrate", 160);
185
    config_set_default_uint  (basicConfig, "AdvOut", "FFAudioTrack", 1);
186
 
187
@@ -903,6 +1004,10 @@
188
    config_set_default_uint  (basicConfig, "Output", "MaxRetries", 20);
189
 
190
    config_set_default_string(basicConfig, "Output", "BindIP", "default");
191
+   config_set_default_bool  (basicConfig, "Output", "NewSocketLoopEnable",
192
+           false);
193
+   config_set_default_bool  (basicConfig, "Output", "LowLatencyEnable",
194
+           false);
195
 
196
    int i = 0;
197
    uint32_t scale_cx = cx;
198
@@ -930,6 +1035,11 @@
199
    config_set_default_string(basicConfig, "Video", "ColorRange",
200
            "Partial");
201
obs-studio-17.0.2.tar.xz/UI/window-basic-main.hpp -> obs-studio-18.0.0.tar.xz/UI/window-basic-main.hpp Changed
96
 
1
@@ -38,6 +38,7 @@
2
 
3
 #include <QPointer>
4
 
5
+class QMessageBox;
6
 class QListWidgetItem;
7
 class VolControl;
8
 class QNetworkReply;
9
@@ -110,6 +111,9 @@
10
 
11
    std::vector<OBSSignal> signalHandlers;
12
 
13
+   std::vector<std::string> projectorArray;
14
+   std::vector<int> previewProjectorArray;
15
+
16
    bool loaded = false;
17
    long disableSaving = 1;
18
    bool projectChanged = false;
19
@@ -162,7 +166,6 @@
20
    QPointer<QAction>         showHide;
21
    QPointer<QAction>         exit;
22
    QPointer<QMenu>           trayMenu;
23
-   bool          disableHiding = false;
24
 
25
    void          DrawBackdrop(float cx, float cy);
26
 
27
@@ -197,7 +200,7 @@
28
    bool          QueryRemoveSource(obs_source_t *source);
29
 
30
    void          TimedCheckForUpdates();
31
-   void          CheckForUpdates();
32
+   void          CheckForUpdates(bool manualUpdate);
33
 
34
    void GetFPSCommon(uint32_t &num, uint32_t &den) const;
35
    void GetFPSInteger(uint32_t &num, uint32_t &den) const;
36
@@ -321,6 +324,23 @@
37
 
38
    void ReplayBufferClicked();
39
 
40
+   bool sysTrayMinimizeToTray();
41
+
42
+   void EnumDialogs();
43
+
44
+   QList<QDialog*> visDialogs;
45
+   QList<QDialog*> modalDialogs;
46
+   QList<QMessageBox*> visMsgBoxes;
47
+
48
+   QList<QPoint> visDlgPositions;
49
+
50
+   obs_data_array_t *SaveProjectors();
51
+   void LoadSavedProjectors(obs_data_array_t *savedProjectors);
52
+
53
+   obs_data_array_t *SavePreviewProjectors();
54
+   void LoadSavedPreviewProjectors(
55
+       obs_data_array_t *savedPreviewProjectors);
56
+
57
 public slots:
58
    void StartStreaming();
59
    void StopStreaming();
60
@@ -391,15 +411,7 @@
61
    void IconActivated(QSystemTrayIcon::ActivationReason reason);
62
    void SetShowing(bool showing);
63
 
64
-   inline void ToggleShowHide()
65
-   {
66
-       bool showing = isVisible();
67
-       if (disableHiding && showing)
68
-           return;
69
-       if (showing)
70
-           CloseDialogs();
71
-       SetShowing(!showing);
72
-   }
73
+   void ToggleShowHide();
74
 
75
 private:
76
    /* OBS Callbacks */
77
@@ -480,6 +492,9 @@
78
    void SystemTrayInit();
79
    void SystemTray(bool firstStarted);
80
 
81
+   void OpenSavedProjectors();
82
+   void RemoveSavedProjectors(int monitor);
83
+
84
 protected:
85
    virtual void closeEvent(QCloseEvent *event) override;
86
    virtual void changeEvent(QEvent *event) override;
87
@@ -580,7 +595,7 @@
88
 
89
    void logUploadFinished(const QString &text, const QString &error);
90
 
91
-   void updateFileFinished(const QString &text, const QString &error);
92
+   void updateCheckFinished();
93
 
94
    void AddSourceFromAction();
95
 
96
obs-studio-17.0.2.tar.xz/UI/window-basic-preview.cpp -> obs-studio-18.0.0.tar.xz/UI/window-basic-preview.cpp Changed
43
 
1
@@ -740,18 +740,35 @@
2
        stretchHandle == ItemHandle::TopRight   ||
3
        stretchHandle == ItemHandle::BottomLeft ||
4
        stretchHandle == ItemHandle::BottomRight) {
5
-       if (aspect < baseAspect)
6
-           size.x = size.y * baseAspect;
7
-       else
8
-           size.y = size.x / baseAspect;
9
+       if (aspect < baseAspect) {
10
+           if ((size.y >= 0.0f && size.x >= 0.0f) ||
11
+               (size.y <= 0.0f && size.x <= 0.0f))
12
+               size.x = size.y * baseAspect;
13
+           else
14
+               size.x = size.y * baseAspect * -1.0f;
15
+       } else {
16
+           if ((size.y >= 0.0f && size.x >= 0.0f) ||
17
+               (size.y <= 0.0f && size.x <= 0.0f))
18
+               size.y = size.x / baseAspect;
19
+           else
20
+               size.y = size.x / baseAspect * -1.0f;
21
+       }
22
 
23
    } else if (stretchHandle == ItemHandle::TopCenter ||
24
               stretchHandle == ItemHandle::BottomCenter) {
25
-       size.x = size.y * baseAspect;
26
+       if ((size.y >= 0.0f && size.x >= 0.0f) ||
27
+           (size.y <= 0.0f && size.x <= 0.0f))
28
+           size.x = size.y * baseAspect;
29
+       else
30
+           size.x = size.y * baseAspect * -1.0f;
31
 
32
    } else if (stretchHandle == ItemHandle::CenterLeft ||
33
               stretchHandle == ItemHandle::CenterRight) {
34
-       size.y = size.x / baseAspect;
35
+       if ((size.y >= 0.0f && size.x >= 0.0f) ||
36
+           (size.y <= 0.0f && size.x <= 0.0f))
37
+           size.y = size.x / baseAspect;
38
+       else
39
+           size.y = size.x / baseAspect * -1.0f;
40
    }
41
 
42
    size.x = std::round(size.x);
43
obs-studio-17.0.2.tar.xz/UI/window-basic-settings.cpp -> obs-studio-18.0.0.tar.xz/UI/window-basic-settings.cpp Changed
201
 
1
@@ -273,14 +273,19 @@
2
 
3
    HookWidget(ui->language,             COMBO_CHANGED,  GENERAL_CHANGED);
4
    HookWidget(ui->theme,            COMBO_CHANGED,  GENERAL_CHANGED);
5
+   HookWidget(ui->enableAutoUpdates,    CHECK_CHANGED,  GENERAL_CHANGED);
6
    HookWidget(ui->warnBeforeStreamStart,CHECK_CHANGED,  GENERAL_CHANGED);
7
    HookWidget(ui->warnBeforeStreamStop, CHECK_CHANGED,  GENERAL_CHANGED);
8
    HookWidget(ui->hideProjectorCursor,  CHECK_CHANGED,  GENERAL_CHANGED);
9
    HookWidget(ui->projectorAlwaysOnTop, CHECK_CHANGED,  GENERAL_CHANGED);
10
    HookWidget(ui->recordWhenStreaming,  CHECK_CHANGED,  GENERAL_CHANGED);
11
    HookWidget(ui->keepRecordStreamStops,CHECK_CHANGED,  GENERAL_CHANGED);
12
+   HookWidget(ui->replayWhileStreaming, CHECK_CHANGED,  GENERAL_CHANGED);
13
+   HookWidget(ui->keepReplayStreamStops,CHECK_CHANGED,  GENERAL_CHANGED);
14
    HookWidget(ui->systemTrayEnabled,    CHECK_CHANGED,  GENERAL_CHANGED);
15
    HookWidget(ui->systemTrayWhenStarted,CHECK_CHANGED,  GENERAL_CHANGED);
16
+   HookWidget(ui->systemTrayAlways,     CHECK_CHANGED,  GENERAL_CHANGED);
17
+   HookWidget(ui->saveProjectors,       CHECK_CHANGED,  GENERAL_CHANGED);
18
    HookWidget(ui->snappingEnabled,      CHECK_CHANGED,  GENERAL_CHANGED);
19
    HookWidget(ui->screenSnapping,       CHECK_CHANGED,  GENERAL_CHANGED);
20
    HookWidget(ui->centerSnapping,       CHECK_CHANGED,  GENERAL_CHANGED);
21
@@ -335,7 +340,9 @@
22
    HookWidget(ui->advOutFFFormat,       COMBO_CHANGED,  OUTPUTS_CHANGED);
23
    HookWidget(ui->advOutFFMCfg,         EDIT_CHANGED,   OUTPUTS_CHANGED);
24
    HookWidget(ui->advOutFFVBitrate,     SCROLL_CHANGED, OUTPUTS_CHANGED);
25
+   HookWidget(ui->advOutFFVGOPSize,     SCROLL_CHANGED, OUTPUTS_CHANGED);
26
    HookWidget(ui->advOutFFUseRescale,   CHECK_CHANGED,  OUTPUTS_CHANGED);
27
+   HookWidget(ui->advOutFFIgnoreCompat, CHECK_CHANGED,  OUTPUTS_CHANGED);
28
    HookWidget(ui->advOutFFRescale,      CBEDIT_CHANGED, OUTPUTS_CHANGED);
29
    HookWidget(ui->advOutFFVEncoder,     COMBO_CHANGED,  OUTPUTS_CHANGED);
30
    HookWidget(ui->advOutFFVCfg,         EDIT_CHANGED,   OUTPUTS_CHANGED);
31
@@ -346,7 +353,7 @@
32
    HookWidget(ui->advOutFFTrack4,       CHECK_CHANGED,  OUTPUTS_CHANGED);
33
    HookWidget(ui->advOutFFTrack5,       CHECK_CHANGED,  OUTPUTS_CHANGED);
34
    HookWidget(ui->advOutFFTrack6,       CHECK_CHANGED,  OUTPUTS_CHANGED);
35
-   HookWidget(ui->advOutFFAEncoder,     COMBO_CHANGED,   OUTPUTS_CHANGED);
36
+   HookWidget(ui->advOutFFAEncoder,     COMBO_CHANGED,  OUTPUTS_CHANGED);
37
    HookWidget(ui->advOutFFACfg,         EDIT_CHANGED,   OUTPUTS_CHANGED);
38
    HookWidget(ui->advOutTrack1Bitrate,  COMBO_CHANGED,  OUTPUTS_CHANGED);
39
    HookWidget(ui->advOutTrack1Name,     EDIT_CHANGED,   OUTPUTS_CHANGED);
40
@@ -383,6 +390,9 @@
41
    HookWidget(ui->colorRange,           COMBO_CHANGED,  ADV_CHANGED);
42
    HookWidget(ui->disableOSXVSync,      CHECK_CHANGED,  ADV_CHANGED);
43
    HookWidget(ui->resetOSXVSync,        CHECK_CHANGED,  ADV_CHANGED);
44
+#if defined(_WIN32) || defined(__APPLE__)
45
+   HookWidget(ui->monitoringDevice,     COMBO_CHANGED,  ADV_CHANGED);
46
+#endif
47
    HookWidget(ui->filenameFormatting,   EDIT_CHANGED,   ADV_CHANGED);
48
    HookWidget(ui->overwriteIfExists,    CHECK_CHANGED,  ADV_CHANGED);
49
    HookWidget(ui->simpleRBPrefix,       EDIT_CHANGED,   ADV_CHANGED);
50
@@ -395,6 +405,19 @@
51
    HookWidget(ui->reconnectMaxRetries,  SCROLL_CHANGED, ADV_CHANGED);
52
    HookWidget(ui->processPriority,      COMBO_CHANGED,  ADV_CHANGED);
53
    HookWidget(ui->bindToIP,             COMBO_CHANGED,  ADV_CHANGED);
54
+   HookWidget(ui->enableNewSocketLoop,  CHECK_CHANGED,  ADV_CHANGED);
55
+   HookWidget(ui->enableLowLatencyMode, CHECK_CHANGED,  ADV_CHANGED);
56
+
57
+#if !defined(_WIN32) && !defined(__APPLE__)
58
+   delete ui->monitoringDevice;
59
+   delete ui->monitoringDeviceLabel;
60
+   delete ui->advAudioGroupBox;
61
+   delete ui->enableAutoUpdates;
62
+   ui->monitoringDevice = nullptr;
63
+   ui->monitoringDeviceLabel = nullptr;
64
+   ui->advAudioGroupBox = nullptr;
65
+   ui->enableAutoUpdates = nullptr;
66
+#endif
67
 
68
 #ifdef _WIN32
69
    uint32_t winVer = GetWindowsVersion();
70
@@ -436,6 +459,8 @@
71
    delete ui->processPriorityLabel;
72
    delete ui->processPriority;
73
    delete ui->advancedGeneralGroupBox;
74
+   delete ui->enableNewSocketLoop;
75
+   delete ui->enableLowLatencyMode;
76
    ui->rendererLabel = nullptr;
77
    ui->renderer = nullptr;
78
    ui->adapterLabel = nullptr;
79
@@ -443,6 +468,8 @@
80
    ui->processPriorityLabel = nullptr;
81
    ui->processPriority = nullptr;
82
    ui->advancedGeneralGroupBox = nullptr;
83
+   ui->enableNewSocketLoop = nullptr;
84
+   ui->enableLowLatencyMode = nullptr;
85
 #endif
86
 
87
 #ifndef __APPLE__
88
@@ -527,11 +554,16 @@
89
 
90
    FillSimpleRecordingValues();
91
    FillSimpleStreamingValues();
92
+#if defined(_WIN32) || defined(__APPLE__)
93
+   FillAudioMonitoringDevices();
94
+#endif
95
 
96
    connect(ui->simpleOutRecQuality, SIGNAL(currentIndexChanged(int)),
97
            this, SLOT(SimpleRecordingQualityChanged()));
98
    connect(ui->simpleOutRecQuality, SIGNAL(currentIndexChanged(int)),
99
            this, SLOT(SimpleRecordingQualityLosslessWarning(int)));
100
+   connect(ui->simpleOutRecFormat, SIGNAL(currentIndexChanged(int)),
101
+           this, SLOT(SimpleRecordingEncoderChanged()));
102
    connect(ui->simpleOutStrEncoder, SIGNAL(currentIndexChanged(int)),
103
            this, SLOT(SimpleStreamingEncoderChanged()));
104
    connect(ui->simpleOutStrEncoder, SIGNAL(currentIndexChanged(int)),
105
@@ -586,9 +618,13 @@
106
            this, SLOT(AdvOutRecCheckWarnings()));
107
    connect(ui->advOutRecTrack6, SIGNAL(clicked()),
108
            this, SLOT(AdvOutRecCheckWarnings()));
109
+   connect(ui->advOutRecFormat, SIGNAL(currentIndexChanged(int)),
110
+           this, SLOT(AdvOutRecCheckWarnings()));
111
    AdvOutRecCheckWarnings();
112
 
113
    SimpleRecordingQualityChanged();
114
+
115
+   UpdateAutomaticReplayBufferCheckboxes();
116
 }
117
 
118
 void OBSBasicSettings::SaveCombo(QComboBox *widget, const char *section,
119
@@ -667,15 +703,28 @@
120
        const char *codec = obs_get_encoder_codec(type);
121
        uint32_t caps = obs_get_encoder_caps(type);
122
 
123
-       if (strcmp(codec, "h264") != 0)
124
+       if (obs_get_encoder_type(type) != OBS_ENCODER_VIDEO)
125
            continue;
126
+
127
+       const char* streaming_codecs[] = {
128
+           "h264",
129
+           //"hevc",
130
+       };
131
+       bool is_streaming_codec = false;
132
+       for (const char* test_codec : streaming_codecs) {
133
+           if (strcmp(codec, test_codec) == 0) {
134
+               is_streaming_codec = true;
135
+               break;
136
+           }
137
+       }
138
        if ((caps & OBS_ENCODER_CAP_DEPRECATED) != 0)
139
            continue;
140
 
141
        QString qName = QT_UTF8(name);
142
        QString qType = QT_UTF8(type);
143
 
144
-       ui->advOutEncoder->addItem(qName, qType);
145
+       if (is_streaming_codec)
146
+           ui->advOutEncoder->addItem(qName, qType);
147
        ui->advOutRecEncoder->addItem(qName, qType);
148
    }
149
 }
150
@@ -771,7 +820,9 @@
151
    if (formatDesc == nullptr)
152
        return;
153
 
154
-   OBSFFCodecDesc codecDescs(ff_codec_supported(formatDesc));
155
+   bool ignore_compatability = ui->advOutFFIgnoreCompat->isChecked();
156
+   OBSFFCodecDesc codecDescs(ff_codec_supported(formatDesc,
157
+               ignore_compatability));
158
 
159
    const ff_codec_desc *codec = codecDescs.get();
160
 
161
@@ -875,6 +926,12 @@
162
    LoadLanguageList();
163
    LoadThemeList();
164
 
165
+#if defined(_WIN32) || defined(__APPLE__)
166
+   bool enableAutoUpdates = config_get_bool(GetGlobalConfig(),
167
+           "General", "EnableAutoUpdates");
168
+   ui->enableAutoUpdates->setChecked(enableAutoUpdates);
169
+#endif
170
+
171
    bool recordWhenStreaming = config_get_bool(GetGlobalConfig(),
172
            "BasicWindow", "RecordWhenStreaming");
173
    ui->recordWhenStreaming->setChecked(recordWhenStreaming);
174
@@ -883,6 +940,14 @@
175
            "BasicWindow", "KeepRecordingWhenStreamStops");
176
    ui->keepRecordStreamStops->setChecked(keepRecordStreamStops);
177
 
178
+   bool replayWhileStreaming = config_get_bool(GetGlobalConfig(),
179
+       "BasicWindow", "ReplayBufferWhileStreaming");
180
+   ui->replayWhileStreaming->setChecked(replayWhileStreaming);
181
+
182
+   bool keepReplayStreamStops = config_get_bool(GetGlobalConfig(),
183
+       "BasicWindow", "KeepReplayBufferStreamStops");
184
+   ui->keepReplayStreamStops->setChecked(keepReplayStreamStops);
185
+
186
    bool systemTrayEnabled = config_get_bool(GetGlobalConfig(),
187
            "BasicWindow", "SysTrayEnabled");
188
    ui->systemTrayEnabled->setChecked(systemTrayEnabled);
189
@@ -891,6 +956,14 @@
190
            "BasicWindow", "SysTrayWhenStarted");
191
    ui->systemTrayWhenStarted->setChecked(systemTrayWhenStarted);
192
 
193
+   bool systemTrayAlways = config_get_bool(GetGlobalConfig(),
194
+           "BasicWindow", "SysTrayMinimizeToTray");
195
+   ui->systemTrayAlways->setChecked(systemTrayAlways);
196
+
197
+   bool saveProjectors = config_get_bool(GetGlobalConfig(),
198
+           "BasicWindow", "SaveProjectors");
199
+   ui->saveProjectors->setChecked(saveProjectors);
200
+
201
obs-studio-17.0.2.tar.xz/UI/window-basic-settings.hpp -> obs-studio-18.0.0.tar.xz/UI/window-basic-settings.hpp Changed
26
 
1
@@ -240,6 +240,7 @@
2
 
3
    void FillSimpleRecordingValues();
4
    void FillSimpleStreamingValues();
5
+   void FillAudioMonitoringDevices();
6
 
7
    void RecalcOutputResPixels(const char *resText);
8
 
9
@@ -255,6 +256,7 @@
10
    void on_advOutFFPathBrowse_clicked();
11
    void on_advOutEncoder_currentIndexChanged(int idx);
12
    void on_advOutRecEncoder_currentIndexChanged(int idx);
13
+   void on_advOutFFIgnoreCompat_stateChanged(int state);
14
    void on_advOutFFFormat_currentIndexChanged(int idx);
15
    void on_advOutFFAEncoder_currentIndexChanged(int idx);
16
    void on_advOutFFVEncoder_currentIndexChanged(int idx);
17
@@ -284,6 +286,8 @@
18
 
19
    void UpdateStreamDelayEstimate();
20
 
21
+   void UpdateAutomaticReplayBufferCheckboxes();
22
+
23
    void AdvOutRecCheckWarnings();
24
 
25
    void SimpleRecordingQualityChanged();
26
obs-studio-17.0.2.tar.xz/UI/window-basic-source-select.cpp -> obs-studio-18.0.0.tar.xz/UI/window-basic-source-select.cpp Changed
10
 
1
@@ -204,7 +204,7 @@
2
    QString placeHolderText{QT_UTF8(GetSourceDisplayName(id))};
3
 
4
    QString text{placeHolderText};
5
-   int i = 1;
6
+   int i = 2;
7
    obs_source_t *source = nullptr;
8
    while ((source = obs_get_source_by_name(QT_TO_UTF8(text)))) {
9
        obs_source_release(source);
10
obs-studio-17.0.2.tar.xz/UI/window-basic-status-bar.cpp -> obs-studio-18.0.0.tar.xz/UI/window-basic-status-bar.cpp Changed
201
 
1
@@ -1,4 +1,7 @@
2
 #include <QLabel>
3
+#include <QHBoxLayout>
4
+#include <QPainter>
5
+#include <QPixmap>
6
 #include "obs-app.hpp"
7
 #include "window-basic-main.hpp"
8
 #include "window-basic-status-bar.hpp"
9
@@ -8,30 +11,63 @@
10
    : QStatusBar    (parent),
11
      delayInfo     (new QLabel),
12
      droppedFrames (new QLabel),
13
-     sessionTime   (new QLabel),
14
+     streamTime    (new QLabel),
15
+     recordTime    (new QLabel),
16
      cpuUsage      (new QLabel),
17
-     kbps          (new QLabel)
18
+     transparentPixmap (20, 20),
19
+     greenPixmap       (20, 20),
20
+     grayPixmap        (20, 20),
21
+     redPixmap         (20, 20)
22
 {
23
-   sessionTime->setText(QString("00:00:00"));
24
-   cpuUsage->setText(QString("CPU: 0.0%"));
25
+   streamTime->setText(QString("LIVE: 00:00:00"));
26
+   recordTime->setText(QString("REC: 00:00:00"));
27
+   cpuUsage->setText(QString("CPU: 0.0%, 0.00 fps"));
28
+
29
+   QWidget *brWidget = new QWidget(this);
30
+   QHBoxLayout *brLayout = new QHBoxLayout(brWidget);
31
+   brLayout->setContentsMargins(0, 0, 0, 0);
32
+
33
+   statusSquare = new QLabel(brWidget);
34
+   brLayout->addWidget(statusSquare);
35
+
36
+   kbps = new QLabel(brWidget);
37
+   brLayout->addWidget(kbps);
38
+
39
+   brWidget->setLayout(brLayout);
40
 
41
    delayInfo->setAlignment(Qt::AlignRight);
42
+   delayInfo->setAlignment(Qt::AlignVCenter);
43
    droppedFrames->setAlignment(Qt::AlignRight);
44
-   sessionTime->setAlignment(Qt::AlignRight);
45
+   droppedFrames->setAlignment(Qt::AlignVCenter);
46
+   streamTime->setAlignment(Qt::AlignRight);
47
+   streamTime->setAlignment(Qt::AlignVCenter);
48
+   recordTime->setAlignment(Qt::AlignRight);
49
+   recordTime->setAlignment(Qt::AlignVCenter);
50
    cpuUsage->setAlignment(Qt::AlignRight);
51
+   cpuUsage->setAlignment(Qt::AlignVCenter);
52
    kbps->setAlignment(Qt::AlignRight);
53
+   kbps->setAlignment(Qt::AlignVCenter);
54
 
55
    delayInfo->setIndent(20);
56
    droppedFrames->setIndent(20);
57
-   sessionTime->setIndent(20);
58
+   streamTime->setIndent(20);
59
+   recordTime->setIndent(20);
60
    cpuUsage->setIndent(20);
61
    kbps->setIndent(10);
62
 
63
    addPermanentWidget(droppedFrames);
64
-   addPermanentWidget(sessionTime);
65
+   addPermanentWidget(streamTime);
66
+   addPermanentWidget(recordTime);
67
    addPermanentWidget(cpuUsage);
68
    addPermanentWidget(delayInfo);
69
-   addPermanentWidget(kbps);
70
+   addPermanentWidget(brWidget);
71
+
72
+   transparentPixmap.fill(QColor(0, 0, 0, 0));
73
+   greenPixmap.fill(QColor(0, 255, 0));
74
+   grayPixmap.fill(QColor(72, 72, 72));
75
+   redPixmap.fill(QColor(255, 0, 0));
76
+
77
+   statusSquare->setPixmap(transparentPixmap);
78
 }
79
 
80
 void OBSBasicStatusBar::Activate()
81
@@ -44,13 +80,18 @@
82
        int skipped = video_output_get_skipped_frames(obs_get_video());
83
        int total   = video_output_get_total_frames(obs_get_video());
84
 
85
-       totalSeconds = 0;
86
+       totalStreamSeconds = 0;
87
+       totalRecordSeconds = 0;
88
        lastSkippedFrameCount = 0;
89
        startSkippedFrameCount = skipped;
90
        startTotalFrameCount = total;
91
 
92
        refreshTimer->start(1000);
93
        active = true;
94
+
95
+       if (streamOutput) {
96
+           statusSquare->setPixmap(grayPixmap);
97
+       }
98
    }
99
 }
100
 
101
@@ -60,9 +101,19 @@
102
    if (!main)
103
        return;
104
 
105
+   if (!streamOutput) {
106
+       streamTime->setText(QString("LIVE: 00:00:00"));
107
+       totalStreamSeconds = 0;
108
+   }
109
+
110
+   if (!recordOutput) {
111
+       recordTime->setText(QString("REC: 00:00:00"));
112
+       totalRecordSeconds = 0;
113
+   }
114
+
115
    if (!main->outputHandler->Active()) {
116
        delete refreshTimer;
117
-       sessionTime->setText(QString("00:00:00"));
118
+
119
        delayInfo->setText("");
120
        droppedFrames->setText("");
121
        kbps->setText("");
122
@@ -73,6 +124,8 @@
123
        reconnectTimeout = 0;
124
        active = false;
125
        overloadedNotify = true;
126
+
127
+       statusSquare->setPixmap(transparentPixmap);
128
    }
129
 }
130
 
131
@@ -130,6 +183,7 @@
132
    QString text;
133
    text += QString("kb/s: ") +
134
        QString::number(kbitsPerSec, 'f', 0);
135
+
136
    kbps->setText(text);
137
    kbps->setMinimumWidth(kbps->width());
138
 
139
@@ -153,19 +207,19 @@
140
    cpuUsage->setMinimumWidth(cpuUsage->width());
141
 }
142
 
143
-void OBSBasicStatusBar::UpdateSessionTime()
144
+void OBSBasicStatusBar::UpdateStreamTime()
145
 {
146
-   totalSeconds++;
147
+   totalStreamSeconds++;
148
 
149
-   int seconds      = totalSeconds % 60;
150
-   int totalMinutes = totalSeconds / 60;
151
+   int seconds      = totalStreamSeconds % 60;
152
+   int totalMinutes = totalStreamSeconds / 60;
153
    int minutes      = totalMinutes % 60;
154
    int hours        = totalMinutes / 60;
155
 
156
    QString text;
157
-   text.sprintf("%02d:%02d:%02d", hours, minutes, seconds);
158
-   sessionTime->setText(text);
159
-   sessionTime->setMinimumWidth(sessionTime->width());
160
+   text.sprintf("LIVE: %02d:%02d:%02d", hours, minutes, seconds);
161
+   streamTime->setText(text);
162
+   streamTime->setMinimumWidth(streamTime->width());
163
 
164
    if (reconnectTimeout > 0) {
165
        QString msg = QTStr("Basic.StatusBar.Reconnecting")
166
@@ -188,6 +242,21 @@
167
    }
168
 }
169
 
170
+void OBSBasicStatusBar::UpdateRecordTime()
171
+{
172
+   totalRecordSeconds++;
173
+
174
+   int seconds      = totalRecordSeconds % 60;
175
+   int totalMinutes = totalRecordSeconds / 60;
176
+   int minutes      = totalMinutes % 60;
177
+   int hours        = totalMinutes / 60;
178
+
179
+   QString text;
180
+   text.sprintf("REC: %02d:%02d:%02d", hours, minutes, seconds);
181
+   recordTime->setText(text);
182
+   recordTime->setMinimumWidth(recordTime->width());
183
+}
184
+
185
 void OBSBasicStatusBar::UpdateDroppedFrames()
186
 {
187
    if (!streamOutput)
188
@@ -205,6 +274,37 @@
189
            QString::number(percent, 'f', 1));
190
    droppedFrames->setText(text);
191
    droppedFrames->setMinimumWidth(droppedFrames->width());
192
+
193
+   /* ----------------------------------- *
194
+    * calculate congestion color          */
195
+
196
+   float congestion = obs_output_get_congestion(streamOutput);
197
+   float avgCongestion = (congestion + lastCongestion) * 0.5f;
198
+   if (avgCongestion < congestion)
199
+       avgCongestion = congestion;
200
+   if (avgCongestion > 1.0f)
201
obs-studio-17.0.2.tar.xz/UI/window-basic-status-bar.hpp -> obs-studio-18.0.0.tar.xz/UI/window-basic-status-bar.hpp Changed
48
 
1
@@ -14,9 +14,11 @@
2
 private:
3
    QLabel *delayInfo;
4
    QLabel *droppedFrames;
5
-   QLabel *sessionTime;
6
+   QLabel *streamTime;
7
+   QLabel *recordTime;
8
    QLabel *cpuUsage;
9
    QLabel *kbps;
10
+   QLabel *statusSquare;
11
 
12
    obs_output_t *streamOutput = nullptr;
13
    obs_output_t *recordOutput = nullptr;
14
@@ -24,7 +26,8 @@
15
    bool overloadedNotify = true;
16
 
17
    int retries = 0;
18
-   int totalSeconds = 0;
19
+   int totalStreamSeconds = 0;
20
+   int totalRecordSeconds = 0;
21
 
22
    int reconnectTimeout = 0;
23
 
24
@@ -40,6 +43,13 @@
25
    uint64_t lastBytesSent = 0;
26
    uint64_t lastBytesSentTime = 0;
27
 
28
+   QPixmap transparentPixmap;
29
+   QPixmap greenPixmap;
30
+   QPixmap grayPixmap;
31
+   QPixmap redPixmap;
32
+
33
+   float lastCongestion = 0.0f;
34
+
35
    QPointer<QTimer> refreshTimer;
36
 
37
    obs_output_t *GetOutput();
38
@@ -49,7 +59,8 @@
39
 
40
    void UpdateDelayMsg();
41
    void UpdateBandwidth();
42
-   void UpdateSessionTime();
43
+   void UpdateStreamTime();
44
+   void UpdateRecordTime();
45
    void UpdateDroppedFrames();
46
 
47
    static void OBSOutputReconnect(void *data, calldata_t *params);
48
obs-studio-17.0.2.tar.xz/UI/window-projector.cpp -> obs-studio-18.0.0.tar.xz/UI/window-projector.cpp Changed
45
 
1
@@ -19,6 +19,9 @@
2
 {
3
    setAttribute(Qt::WA_DeleteOnClose, true);
4
 
5
+   //disable application quit when last window closed
6
+   setAttribute(Qt::WA_QuitOnClose, false);
7
+
8
    installEventFilter(CreateShortcutFilter());
9
 
10
    auto addDrawCallback = [this] ()
11
@@ -50,6 +53,7 @@
12
 void OBSProjector::Init(int monitor)
13
 {
14
    QScreen *screen = QGuiApplication::screens()[monitor];
15
+
16
    setGeometry(screen->geometry());
17
 
18
    bool alwaysOnTop = config_get_bool(GetGlobalConfig(),
19
@@ -67,6 +71,8 @@
20
    addAction(action);
21
 
22
    connect(action, SIGNAL(triggered()), this, SLOT(EscapeTriggered()));
23
+
24
+   savedMonitor = monitor;
25
 }
26
 
27
 void OBSProjector::OBSRender(void *data, uint32_t cx, uint32_t cy)
28
@@ -111,6 +117,7 @@
29
 void OBSProjector::OBSSourceRemoved(void *data, calldata_t *params)
30
 {
31
    OBSProjector *window = reinterpret_cast<OBSProjector*>(data);
32
+
33
    window->deleteLater();
34
 
35
    UNUSED_PARAMETER(params);
36
@@ -129,5 +136,8 @@
37
 
38
 void OBSProjector::EscapeTriggered()
39
 {
40
+   OBSBasic *main = reinterpret_cast<OBSBasic*>(App()->GetMainWindow());
41
+   main->RemoveSavedProjectors(savedMonitor);
42
+
43
    deleteLater();
44
 }
45
obs-studio-17.0.2.tar.xz/UI/window-projector.hpp -> obs-studio-18.0.0.tar.xz/UI/window-projector.hpp Changed
18
 
1
@@ -2,6 +2,7 @@
2
 
3
 #include <obs.hpp>
4
 #include "qt-display.hpp"
5
+#include "window-basic-main.hpp"
6
 
7
 class QMouseEvent;
8
 
9
@@ -17,6 +18,8 @@
10
 
11
    void mousePressEvent(QMouseEvent *event) override;
12
 
13
+   int savedMonitor = 0;
14
+
15
 private slots:
16
    void EscapeTriggered();
17
 
18
obs-studio-18.0.0.tar.xz/appveyor.yml Added
43
 
1
@@ -0,0 +1,41 @@
2
+environment:
3
+  CURL_VERSION: 7.39.0
4
+
5
+install:
6
+  - git submodule update --init --recursive
7
+  - if not exist dependencies2015.zip curl -kLO https://obsproject.com/downloads/dependencies2015.zip -f --retry 5 -C -
8
+  - if not exist vlc.zip curl -kLO https://obsproject.com/downloads/vlc.zip -f --retry 5 -C -
9
+  - 7z x dependencies2015.zip -odependencies2015
10
+  - 7z x vlc.zip -ovlc
11
+  - set DepsPath32=%CD%\dependencies2015\win32
12
+  - set DepsPath64=%CD%\dependencies2015\win64
13
+  - set VLCPath=%CD%\vlc
14
+  - set QTDIR32=C:\Qt\5.7\msvc2015
15
+  - set QTDIR64=C:\Qt\5.7\msvc2015_64
16
+  - set build_config=RelWithDebInfo
17
+  - move "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\um\d3d11on12*" "C:\Program Files (x86)\Windows Kits\8.1\Include\um"
18
+  - move "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\um\d3d12*" "C:\Program Files (x86)\Windows Kits\8.1\Include\um"
19
+  - move "C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\shared\dxgi*" "C:\Program Files (x86)\Windows Kits\8.1\Include\shared"
20
+  - mkdir build
21
+  - mkdir build32
22
+  - mkdir build64
23
+  - cd ./build32
24
+  - cmake -G "Visual Studio 14 2015" -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true ..
25
+  - cd ../build64
26
+  - cmake -G "Visual Studio 14 2015 Win64" -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true ..
27
+
28
+build_script:
29
+  - call msbuild /m /p:Configuration=%build_config% C:\projects\obs-studio\build32\obs-studio.sln /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
30
+  - call msbuild /m /p:Configuration=%build_config% C:\projects\obs-studio\build64\obs-studio.sln /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
31
+
32
+before_deploy:
33
+  - C:\projects\obs-studio\CI\before-deploy-win.cmd
34
+
35
+deploy_script:
36
+  - ps: Push-AppveyorArtifact "build.zip" -FileName "$(git describe).zip"
37
+
38
+test: off
39
+
40
+cache:
41
+  - dependencies2015.zip
42
+  - vlc.zip
43
obs-studio-17.0.2.tar.xz/cmake/Modules/CopyMSVCBins.cmake -> obs-studio-18.0.0.tar.xz/cmake/Modules/CopyMSVCBins.cmake Changed
10
 
1
@@ -8,7 +8,7 @@
2
    return()
3
 endif()
4
 
5
-option(COPY_DEPENDENCIES "Automaticaly try copying all dependencies" OFF)
6
+option(COPY_DEPENDENCIES "Automaticaly try copying all dependencies" ON)
7
 if(NOT COPY_DEPENDENCIES)
8
    return()
9
 endif()
10
obs-studio-17.0.2.tar.xz/deps/CMakeLists.txt -> obs-studio-18.0.0.tar.xz/deps/CMakeLists.txt Changed
12
 
1
@@ -8,6 +8,10 @@
2
 add_subdirectory(libff)
3
 add_subdirectory(file-updater)
4
 
5
+if(WIN32)
6
+   add_subdirectory(blake2)
7
+endif()
8
+
9
 if(BUILD_CAPTIONS)
10
    add_subdirectory(libcaption)
11
 endif()
12
obs-studio-18.0.0.tar.xz/deps/blake2 Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/deps/blake2/CMakeLists.txt Added
34
 
1
@@ -0,0 +1,32 @@
2
+cmake_minimum_required(VERSION 3.2)
3
+
4
+project(blake2)
5
+
6
+set(BLAKE2_INCLUDE_DIR
7
+   "${CMAKE_CURRENT_SOURCE_DIR}/src"
8
+       CACHE PATH "blake2 include path")
9
+
10
+include_directories(
11
+   ${LIBblake2_INCLUDE_DIRS}
12
+   src
13
+)
14
+
15
+if(WIN32)
16
+   if(MSVC)
17
+       add_compile_options("$<$<CONFIG:RelWithDebInfo>:/MT>")
18
+   endif()
19
+   add_definitions(
20
+       -Dinline=_inline
21
+       -Drestrict=__restrict)
22
+endif()
23
+
24
+set(blake2_SOURCES
25
+   src/blake2b-ref.c)
26
+
27
+set(blake2_HEADERS
28
+   src/blake2.h
29
+   src/blake2-impl.h)
30
+
31
+add_library(blake2 STATIC
32
+   ${blake2_SOURCES}
33
+   ${blake2_HEADERS})
34
obs-studio-18.0.0.tar.xz/deps/blake2/src Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/deps/blake2/src/blake2-impl.h Added
162
 
1
@@ -0,0 +1,160 @@
2
+/*
3
+   BLAKE2 reference source code package - reference C implementations
4
+
5
+   Copyright 2012, Samuel Neves <sneves@dei.uc.pt>.  You may use this under the
6
+   terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at
7
+   your option.  The terms of these licenses can be found at:
8
+
9
+   - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
10
+   - OpenSSL license   : https://www.openssl.org/source/license.html
11
+   - Apache 2.0        : http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+   More information about the BLAKE2 hash function can be found at
14
+   https://blake2.net.
15
+*/
16
+#ifndef BLAKE2_IMPL_H
17
+#define BLAKE2_IMPL_H
18
+
19
+#include <stdint.h>
20
+#include <string.h>
21
+
22
+#if !defined(__cplusplus) && (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L)
23
+  #if   defined(_MSC_VER)
24
+    #define BLAKE2_INLINE __inline
25
+  #elif defined(__GNUC__)
26
+    #define BLAKE2_INLINE __inline__
27
+  #else
28
+    #define BLAKE2_INLINE
29
+  #endif
30
+#else
31
+  #define BLAKE2_INLINE inline
32
+#endif
33
+
34
+static BLAKE2_INLINE uint32_t load32( const void *src )
35
+{
36
+#if defined(NATIVE_LITTLE_ENDIAN)
37
+  uint32_t w;
38
+  memcpy(&w, src, sizeof w);
39
+  return w;
40
+#else
41
+  const uint8_t *p = ( const uint8_t * )src;
42
+  return (( uint32_t )( p[0] ) <<  0) |
43
+         (( uint32_t )( p[1] ) <<  8) |
44
+         (( uint32_t )( p[2] ) << 16) |
45
+         (( uint32_t )( p[3] ) << 24) ;
46
+#endif
47
+}
48
+
49
+static BLAKE2_INLINE uint64_t load64( const void *src )
50
+{
51
+#if defined(NATIVE_LITTLE_ENDIAN)
52
+  uint64_t w;
53
+  memcpy(&w, src, sizeof w);
54
+  return w;
55
+#else
56
+  const uint8_t *p = ( const uint8_t * )src;
57
+  return (( uint64_t )( p[0] ) <<  0) |
58
+         (( uint64_t )( p[1] ) <<  8) |
59
+         (( uint64_t )( p[2] ) << 16) |
60
+         (( uint64_t )( p[3] ) << 24) |
61
+         (( uint64_t )( p[4] ) << 32) |
62
+         (( uint64_t )( p[5] ) << 40) |
63
+         (( uint64_t )( p[6] ) << 48) |
64
+         (( uint64_t )( p[7] ) << 56) ;
65
+#endif
66
+}
67
+
68
+static BLAKE2_INLINE uint16_t load16( const void *src )
69
+{
70
+#if defined(NATIVE_LITTLE_ENDIAN)
71
+  uint16_t w;
72
+  memcpy(&w, src, sizeof w);
73
+  return w;
74
+#else
75
+  const uint8_t *p = ( const uint8_t * )src;
76
+  return (( uint16_t )( p[0] ) <<  0) |
77
+         (( uint16_t )( p[1] ) <<  8) ;
78
+#endif
79
+}
80
+
81
+static BLAKE2_INLINE void store16( void *dst, uint16_t w )
82
+{
83
+#if defined(NATIVE_LITTLE_ENDIAN)
84
+  memcpy(dst, &w, sizeof w);
85
+#else
86
+  uint8_t *p = ( uint8_t * )dst;
87
+  *p++ = ( uint8_t )w; w >>= 8;
88
+  *p++ = ( uint8_t )w;
89
+#endif
90
+}
91
+
92
+static BLAKE2_INLINE void store32( void *dst, uint32_t w )
93
+{
94
+#if defined(NATIVE_LITTLE_ENDIAN)
95
+  memcpy(dst, &w, sizeof w);
96
+#else
97
+  uint8_t *p = ( uint8_t * )dst;
98
+  p[0] = (uint8_t)(w >>  0);
99
+  p[1] = (uint8_t)(w >>  8);
100
+  p[2] = (uint8_t)(w >> 16);
101
+  p[3] = (uint8_t)(w >> 24);
102
+#endif
103
+}
104
+
105
+static BLAKE2_INLINE void store64( void *dst, uint64_t w )
106
+{
107
+#if defined(NATIVE_LITTLE_ENDIAN)
108
+  memcpy(dst, &w, sizeof w);
109
+#else
110
+  uint8_t *p = ( uint8_t * )dst;
111
+  p[0] = (uint8_t)(w >>  0);
112
+  p[1] = (uint8_t)(w >>  8);
113
+  p[2] = (uint8_t)(w >> 16);
114
+  p[3] = (uint8_t)(w >> 24);
115
+  p[4] = (uint8_t)(w >> 32);
116
+  p[5] = (uint8_t)(w >> 40);
117
+  p[6] = (uint8_t)(w >> 48);
118
+  p[7] = (uint8_t)(w >> 56);
119
+#endif
120
+}
121
+
122
+static BLAKE2_INLINE uint64_t load48( const void *src )
123
+{
124
+  const uint8_t *p = ( const uint8_t * )src;
125
+  return (( uint64_t )( p[0] ) <<  0) |
126
+         (( uint64_t )( p[1] ) <<  8) |
127
+         (( uint64_t )( p[2] ) << 16) |
128
+         (( uint64_t )( p[3] ) << 24) |
129
+         (( uint64_t )( p[4] ) << 32) |
130
+         (( uint64_t )( p[5] ) << 40) ;
131
+}
132
+
133
+static BLAKE2_INLINE void store48( void *dst, uint64_t w )
134
+{
135
+  uint8_t *p = ( uint8_t * )dst;
136
+  p[0] = (uint8_t)(w >>  0);
137
+  p[1] = (uint8_t)(w >>  8);
138
+  p[2] = (uint8_t)(w >> 16);
139
+  p[3] = (uint8_t)(w >> 24);
140
+  p[4] = (uint8_t)(w >> 32);
141
+  p[5] = (uint8_t)(w >> 40);
142
+}
143
+
144
+static BLAKE2_INLINE uint32_t rotr32( const uint32_t w, const unsigned c )
145
+{
146
+  return ( w >> c ) | ( w << ( 32 - c ) );
147
+}
148
+
149
+static BLAKE2_INLINE uint64_t rotr64( const uint64_t w, const unsigned c )
150
+{
151
+  return ( w >> c ) | ( w << ( 64 - c ) );
152
+}
153
+
154
+/* prevents compiler optimizing out memset() */
155
+static BLAKE2_INLINE void secure_zero_memory(void *v, size_t n)
156
+{
157
+  static void *(*const volatile memset_v)(void *, int, size_t) = &memset;
158
+  memset_v(v, 0, n);
159
+}
160
+
161
+#endif
162
obs-studio-18.0.0.tar.xz/deps/blake2/src/blake2.h Added
197
 
1
@@ -0,0 +1,195 @@
2
+/*
3
+   BLAKE2 reference source code package - reference C implementations
4
+
5
+   Copyright 2012, Samuel Neves <sneves@dei.uc.pt>.  You may use this under the
6
+   terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at
7
+   your option.  The terms of these licenses can be found at:
8
+
9
+   - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
10
+   - OpenSSL license   : https://www.openssl.org/source/license.html
11
+   - Apache 2.0        : http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+   More information about the BLAKE2 hash function can be found at
14
+   https://blake2.net.
15
+*/
16
+#ifndef BLAKE2_H
17
+#define BLAKE2_H
18
+
19
+#include <stddef.h>
20
+#include <stdint.h>
21
+
22
+#if defined(_MSC_VER)
23
+#define BLAKE2_PACKED(x) __pragma(pack(push, 1)) x __pragma(pack(pop))
24
+#else
25
+#define BLAKE2_PACKED(x) x __attribute__((packed))
26
+#endif
27
+
28
+#if defined(__cplusplus)
29
+extern "C" {
30
+#endif
31
+
32
+  enum blake2s_constant
33
+  {
34
+    BLAKE2S_BLOCKBYTES = 64,
35
+    BLAKE2S_OUTBYTES   = 32,
36
+    BLAKE2S_KEYBYTES   = 32,
37
+    BLAKE2S_SALTBYTES  = 8,
38
+    BLAKE2S_PERSONALBYTES = 8
39
+  };
40
+
41
+  enum blake2b_constant
42
+  {
43
+    BLAKE2B_BLOCKBYTES = 128,
44
+    BLAKE2B_OUTBYTES   = 64,
45
+    BLAKE2B_KEYBYTES   = 64,
46
+    BLAKE2B_SALTBYTES  = 16,
47
+    BLAKE2B_PERSONALBYTES = 16
48
+  };
49
+
50
+  typedef struct blake2s_state__
51
+  {
52
+    uint32_t h[8];
53
+    uint32_t t[2];
54
+    uint32_t f[2];
55
+    uint8_t  buf[BLAKE2S_BLOCKBYTES];
56
+    size_t   buflen;
57
+    size_t   outlen;
58
+    uint8_t  last_node;
59
+  } blake2s_state;
60
+
61
+  typedef struct blake2b_state__
62
+  {
63
+    uint64_t h[8];
64
+    uint64_t t[2];
65
+    uint64_t f[2];
66
+    uint8_t  buf[BLAKE2B_BLOCKBYTES];
67
+    size_t   buflen;
68
+    size_t   outlen;
69
+    uint8_t  last_node;
70
+  } blake2b_state;
71
+
72
+  typedef struct blake2sp_state__
73
+  {
74
+    blake2s_state S[8][1];
75
+    blake2s_state R[1];
76
+    uint8_t       buf[8 * BLAKE2S_BLOCKBYTES];
77
+    size_t        buflen;
78
+    size_t        outlen;
79
+  } blake2sp_state;
80
+
81
+  typedef struct blake2bp_state__
82
+  {
83
+    blake2b_state S[4][1];
84
+    blake2b_state R[1];
85
+    uint8_t       buf[4 * BLAKE2B_BLOCKBYTES];
86
+    size_t        buflen;
87
+    size_t        outlen;
88
+  } blake2bp_state;
89
+
90
+
91
+  BLAKE2_PACKED(struct blake2s_param__
92
+  {
93
+    uint8_t  digest_length; /* 1 */
94
+    uint8_t  key_length;    /* 2 */
95
+    uint8_t  fanout;        /* 3 */
96
+    uint8_t  depth;         /* 4 */
97
+    uint32_t leaf_length;   /* 8 */
98
+    uint32_t node_offset;  /* 12 */
99
+    uint16_t xof_length;    /* 14 */
100
+    uint8_t  node_depth;    /* 15 */
101
+    uint8_t  inner_length;  /* 16 */
102
+    /* uint8_t  reserved[0]; */
103
+    uint8_t  salt[BLAKE2S_SALTBYTES]; /* 24 */
104
+    uint8_t  personal[BLAKE2S_PERSONALBYTES];  /* 32 */
105
+  });
106
+
107
+  typedef struct blake2s_param__ blake2s_param;
108
+
109
+  BLAKE2_PACKED(struct blake2b_param__
110
+  {
111
+    uint8_t  digest_length; /* 1 */
112
+    uint8_t  key_length;    /* 2 */
113
+    uint8_t  fanout;        /* 3 */
114
+    uint8_t  depth;         /* 4 */
115
+    uint32_t leaf_length;   /* 8 */
116
+    uint32_t node_offset;   /* 12 */
117
+    uint32_t xof_length;    /* 16 */
118
+    uint8_t  node_depth;    /* 17 */
119
+    uint8_t  inner_length;  /* 18 */
120
+    uint8_t  reserved[14];  /* 32 */
121
+    uint8_t  salt[BLAKE2B_SALTBYTES]; /* 48 */
122
+    uint8_t  personal[BLAKE2B_PERSONALBYTES];  /* 64 */
123
+  });
124
+
125
+  typedef struct blake2b_param__ blake2b_param;
126
+
127
+  typedef struct blake2xs_state__
128
+  {
129
+    blake2s_state S[1];
130
+    blake2s_param P[1];
131
+  } blake2xs_state;
132
+
133
+  typedef struct blake2xb_state__
134
+  {
135
+    blake2b_state S[1];
136
+    blake2b_param P[1];
137
+  } blake2xb_state;
138
+
139
+  /* Padded structs result in a compile-time error */
140
+  enum {
141
+    BLAKE2_DUMMY_1 = 1/(sizeof(blake2s_param) == BLAKE2S_OUTBYTES),
142
+    BLAKE2_DUMMY_2 = 1/(sizeof(blake2b_param) == BLAKE2B_OUTBYTES)
143
+  };
144
+
145
+  /* Streaming API */
146
+  int blake2s_init( blake2s_state *S, size_t outlen );
147
+  int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen );
148
+  int blake2s_init_param( blake2s_state *S, const blake2s_param *P );
149
+  int blake2s_update( blake2s_state *S, const void *in, size_t inlen );
150
+  int blake2s_final( blake2s_state *S, void *out, size_t outlen );
151
+
152
+  int blake2b_init( blake2b_state *S, size_t outlen );
153
+  int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen );
154
+  int blake2b_init_param( blake2b_state *S, const blake2b_param *P );
155
+  int blake2b_update( blake2b_state *S, const void *in, size_t inlen );
156
+  int blake2b_final( blake2b_state *S, void *out, size_t outlen );
157
+
158
+  int blake2sp_init( blake2sp_state *S, size_t outlen );
159
+  int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen );
160
+  int blake2sp_update( blake2sp_state *S, const void *in, size_t inlen );
161
+  int blake2sp_final( blake2sp_state *S, void *out, size_t outlen );
162
+
163
+  int blake2bp_init( blake2bp_state *S, size_t outlen );
164
+  int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen );
165
+  int blake2bp_update( blake2bp_state *S, const void *in, size_t inlen );
166
+  int blake2bp_final( blake2bp_state *S, void *out, size_t outlen );
167
+
168
+  /* Variable output length API */
169
+  int blake2xs_init( blake2xs_state *S, const size_t outlen );
170
+  int blake2xs_init_key( blake2xs_state *S, const size_t outlen, const void *key, size_t keylen );
171
+  int blake2xs_update( blake2xs_state *S, const void *in, size_t inlen );
172
+  int blake2xs_final(blake2xs_state *S, void *out, size_t outlen);
173
+
174
+  int blake2xb_init( blake2xb_state *S, const size_t outlen );
175
+  int blake2xb_init_key( blake2xb_state *S, const size_t outlen, const void *key, size_t keylen );
176
+  int blake2xb_update( blake2xb_state *S, const void *in, size_t inlen );
177
+  int blake2xb_final(blake2xb_state *S, void *out, size_t outlen);
178
+
179
+  /* Simple API */
180
+  int blake2s( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
181
+  int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
182
+
183
+  int blake2sp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
184
+  int blake2bp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
185
+
186
+  int blake2xs( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
187
+  int blake2xb( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
188
+
189
+  /* This is simply an alias for blake2b */
190
+  int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
191
+
192
+#if defined(__cplusplus)
193
+}
194
+#endif
195
+
196
+#endif
197
obs-studio-18.0.0.tar.xz/deps/blake2/src/blake2b-ref.c Added
201
 
1
@@ -0,0 +1,379 @@
2
+/*
3
+   BLAKE2 reference source code package - reference C implementations
4
+
5
+   Copyright 2012, Samuel Neves <sneves@dei.uc.pt>.  You may use this under the
6
+   terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at
7
+   your option.  The terms of these licenses can be found at:
8
+
9
+   - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
10
+   - OpenSSL license   : https://www.openssl.org/source/license.html
11
+   - Apache 2.0        : http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+   More information about the BLAKE2 hash function can be found at
14
+   https://blake2.net.
15
+*/
16
+
17
+#include <stdint.h>
18
+#include <string.h>
19
+#include <stdio.h>
20
+
21
+#include "blake2.h"
22
+#include "blake2-impl.h"
23
+
24
+static const uint64_t blake2b_IV[8] =
25
+{
26
+  0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
27
+  0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
28
+  0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
29
+  0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL
30
+};
31
+
32
+static const uint8_t blake2b_sigma[12][16] =
33
+{
34
+  {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 } ,
35
+  { 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3 } ,
36
+  { 11,  8, 12,  0,  5,  2, 15, 13, 10, 14,  3,  6,  7,  1,  9,  4 } ,
37
+  {  7,  9,  3,  1, 13, 12, 11, 14,  2,  6,  5, 10,  4,  0, 15,  8 } ,
38
+  {  9,  0,  5,  7,  2,  4, 10, 15, 14,  1, 11, 12,  6,  8,  3, 13 } ,
39
+  {  2, 12,  6, 10,  0, 11,  8,  3,  4, 13,  7,  5, 15, 14,  1,  9 } ,
40
+  { 12,  5,  1, 15, 14, 13,  4, 10,  0,  7,  6,  3,  9,  2,  8, 11 } ,
41
+  { 13, 11,  7, 14, 12,  1,  3,  9,  5,  0, 15,  4,  8,  6,  2, 10 } ,
42
+  {  6, 15, 14,  9, 11,  3,  0,  8, 12,  2, 13,  7,  1,  4, 10,  5 } ,
43
+  { 10,  2,  8,  4,  7,  6,  1,  5, 15, 11,  9, 14,  3, 12, 13 , 0 } ,
44
+  {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 } ,
45
+  { 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3 }
46
+};
47
+
48
+
49
+static void blake2b_set_lastnode( blake2b_state *S )
50
+{
51
+  S->f[1] = (uint64_t)-1;
52
+}
53
+
54
+/* Some helper functions, not necessarily useful */
55
+static int blake2b_is_lastblock( const blake2b_state *S )
56
+{
57
+  return S->f[0] != 0;
58
+}
59
+
60
+static void blake2b_set_lastblock( blake2b_state *S )
61
+{
62
+  if( S->last_node ) blake2b_set_lastnode( S );
63
+
64
+  S->f[0] = (uint64_t)-1;
65
+}
66
+
67
+static void blake2b_increment_counter( blake2b_state *S, const uint64_t inc )
68
+{
69
+  S->t[0] += inc;
70
+  S->t[1] += ( S->t[0] < inc );
71
+}
72
+
73
+static void blake2b_init0( blake2b_state *S )
74
+{
75
+  size_t i;
76
+  memset( S, 0, sizeof( blake2b_state ) );
77
+
78
+  for( i = 0; i < 8; ++i ) S->h[i] = blake2b_IV[i];
79
+}
80
+
81
+/* init xors IV with input parameter block */
82
+int blake2b_init_param( blake2b_state *S, const blake2b_param *P )
83
+{
84
+  const uint8_t *p = ( const uint8_t * )( P );
85
+  size_t i;
86
+
87
+  blake2b_init0( S );
88
+
89
+  /* IV XOR ParamBlock */
90
+  for( i = 0; i < 8; ++i )
91
+    S->h[i] ^= load64( p + sizeof( S->h[i] ) * i );
92
+
93
+  S->outlen = P->digest_length;
94
+  return 0;
95
+}
96
+
97
+
98
+
99
+int blake2b_init( blake2b_state *S, size_t outlen )
100
+{
101
+  blake2b_param P[1];
102
+
103
+  if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1;
104
+
105
+  P->digest_length = (uint8_t)outlen;
106
+  P->key_length    = 0;
107
+  P->fanout        = 1;
108
+  P->depth         = 1;
109
+  store32( &P->leaf_length, 0 );
110
+  store32( &P->node_offset, 0 );
111
+  store32( &P->xof_length, 0 );
112
+  P->node_depth    = 0;
113
+  P->inner_length  = 0;
114
+  memset( P->reserved, 0, sizeof( P->reserved ) );
115
+  memset( P->salt,     0, sizeof( P->salt ) );
116
+  memset( P->personal, 0, sizeof( P->personal ) );
117
+  return blake2b_init_param( S, P );
118
+}
119
+
120
+
121
+int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen )
122
+{
123
+  blake2b_param P[1];
124
+
125
+  if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1;
126
+
127
+  if ( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1;
128
+
129
+  P->digest_length = (uint8_t)outlen;
130
+  P->key_length    = (uint8_t)keylen;
131
+  P->fanout        = 1;
132
+  P->depth         = 1;
133
+  store32( &P->leaf_length, 0 );
134
+  store32( &P->node_offset, 0 );
135
+  store32( &P->xof_length, 0 );
136
+  P->node_depth    = 0;
137
+  P->inner_length  = 0;
138
+  memset( P->reserved, 0, sizeof( P->reserved ) );
139
+  memset( P->salt,     0, sizeof( P->salt ) );
140
+  memset( P->personal, 0, sizeof( P->personal ) );
141
+
142
+  if( blake2b_init_param( S, P ) < 0 ) return -1;
143
+
144
+  {
145
+    uint8_t block[BLAKE2B_BLOCKBYTES];
146
+    memset( block, 0, BLAKE2B_BLOCKBYTES );
147
+    memcpy( block, key, keylen );
148
+    blake2b_update( S, block, BLAKE2B_BLOCKBYTES );
149
+    secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */
150
+  }
151
+  return 0;
152
+}
153
+
154
+#define G(r,i,a,b,c,d)                      \
155
+  do {                                      \
156
+    a = a + b + m[blake2b_sigma[r][2*i+0]]; \
157
+    d = rotr64(d ^ a, 32);                  \
158
+    c = c + d;                              \
159
+    b = rotr64(b ^ c, 24);                  \
160
+    a = a + b + m[blake2b_sigma[r][2*i+1]]; \
161
+    d = rotr64(d ^ a, 16);                  \
162
+    c = c + d;                              \
163
+    b = rotr64(b ^ c, 63);                  \
164
+  } while(0)
165
+
166
+#define ROUND(r)                    \
167
+  do {                              \
168
+    G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \
169
+    G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \
170
+    G(r,2,v[ 2],v[ 6],v[10],v[14]); \
171
+    G(r,3,v[ 3],v[ 7],v[11],v[15]); \
172
+    G(r,4,v[ 0],v[ 5],v[10],v[15]); \
173
+    G(r,5,v[ 1],v[ 6],v[11],v[12]); \
174
+    G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \
175
+    G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \
176
+  } while(0)
177
+
178
+static void blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] )
179
+{
180
+  uint64_t m[16];
181
+  uint64_t v[16];
182
+  size_t i;
183
+
184
+  for( i = 0; i < 16; ++i ) {
185
+    m[i] = load64( block + i * sizeof( m[i] ) );
186
+  }
187
+
188
+  for( i = 0; i < 8; ++i ) {
189
+    v[i] = S->h[i];
190
+  }
191
+
192
+  v[ 8] = blake2b_IV[0];
193
+  v[ 9] = blake2b_IV[1];
194
+  v[10] = blake2b_IV[2];
195
+  v[11] = blake2b_IV[3];
196
+  v[12] = blake2b_IV[4] ^ S->t[0];
197
+  v[13] = blake2b_IV[5] ^ S->t[1];
198
+  v[14] = blake2b_IV[6] ^ S->f[0];
199
+  v[15] = blake2b_IV[7] ^ S->f[1];
200
+
201
obs-studio-17.0.2.tar.xz/deps/libff/libff/ff-decoder.c -> obs-studio-18.0.0.tar.xz/deps/libff/libff/ff-decoder.c Changed
10
 
1
@@ -178,7 +178,7 @@
2
 
3
    struct ff_frame *frame;
4
 
5
-   if (decoder && decoder->stream) {
6
+   if (decoder->stream) {
7
        if (decoder->frame_queue.size == 0) {
8
            if (!decoder->eof || !decoder->finished) {
9
                // We expected a frame, but there were none
10
obs-studio-17.0.2.tar.xz/deps/libff/libff/ff-util.c -> obs-studio-18.0.0.tar.xz/deps/libff/libff/ff-util.c Changed
61
 
1
@@ -99,7 +99,8 @@
2
 
3
 static void add_codec_to_list(const struct ff_format_desc *format_desc,
4
        struct ff_codec_desc **first, struct ff_codec_desc **current,
5
-       enum AVCodecID id, const AVCodec *codec)
6
+       enum AVCodecID id, const AVCodec *codec,
7
+       bool ignore_compatability)
8
 {
9
    if (codec == NULL)
10
        codec = avcodec_find_encoder(id);
11
@@ -112,11 +113,13 @@
12
    if (!av_codec_is_encoder(codec))
13
        return;
14
 
15
-   // Format doesn't support this codec
16
-   unsigned int tag = av_codec_get_tag(format_desc->codec_tags,
17
-           codec->id);
18
-   if (tag == 0)
19
-       return;
20
+   if (!ignore_compatability) {
21
+       // Format doesn't support this codec
22
+       unsigned int tag = av_codec_get_tag(format_desc->codec_tags,
23
+               codec->id);
24
+       if (tag == 0)
25
+           return;
26
+   }
27
 
28
    struct ff_codec_desc *d = av_mallocz(sizeof(struct ff_codec_desc));
29
 
30
@@ -150,16 +153,17 @@
31
 
32
 static void get_codecs_for_id(const struct ff_format_desc *format_desc,
33
        struct ff_codec_desc **first, struct ff_codec_desc **current,
34
-       enum AVCodecID id)
35
+       enum AVCodecID id, bool ignore_compatability)
36
 {
37
    const AVCodec *codec = NULL;
38
    while ((codec = next_codec_for_id(id, codec)))
39
        add_codec_to_list(format_desc, first, current, codec->id,
40
-               codec);
41
+               codec, ignore_compatability);
42
 }
43
 
44
 const struct ff_codec_desc *ff_codec_supported(
45
-       const struct ff_format_desc *format_desc)
46
+       const struct ff_format_desc *format_desc,
47
+       bool ignore_compatability)
48
 {
49
    const AVCodecDescriptor **codecs;
50
    unsigned int size;
51
@@ -172,7 +176,8 @@
52
 
53
    for(i = 0; i < size; i++) {
54
        const AVCodecDescriptor *codec = codecs[i];
55
-       get_codecs_for_id(format_desc, &first, &current, codec->id);
56
+       get_codecs_for_id(format_desc, &first, &current, codec->id,
57
+               ignore_compatability);
58
    }
59
 
60
    av_free((void *)codecs);
61
obs-studio-17.0.2.tar.xz/deps/libff/libff/ff-util.h -> obs-studio-18.0.0.tar.xz/deps/libff/libff/ff-util.h Changed
11
 
1
@@ -37,7 +37,8 @@
2
 
3
 // Codec Description
4
 const struct ff_codec_desc *ff_codec_supported(
5
-       const struct ff_format_desc *format_desc);
6
+       const struct ff_format_desc *format_desc,
7
+       bool ignore_compatability);
8
 void ff_codec_desc_free(const struct ff_codec_desc *codec_desc);
9
 const char *ff_codec_desc_name(const struct ff_codec_desc *codec_desc);
10
 const char *ff_codec_desc_long_name(const struct ff_codec_desc *codec_desc);
11
obs-studio-17.0.2.tar.xz/libobs-opengl/gl-subsystem.c -> obs-studio-18.0.0.tar.xz/libobs-opengl/gl-subsystem.c Changed
10
 
1
@@ -455,7 +455,7 @@
2
 
3
    /* need a pixel shader to properly bind textures */
4
    if (!device->cur_pixel_shader)
5
-       tex = NULL;
6
+       goto fail;
7
 
8
    if (cur_tex == tex)
9
        return;
10
obs-studio-17.0.2.tar.xz/libobs/CMakeLists.txt -> obs-studio-18.0.0.tar.xz/libobs/CMakeLists.txt Changed
89
 
1
@@ -68,6 +68,13 @@
2
        util/windows/CoTaskMemPtr.hpp
3
        util/windows/HRError.hpp
4
        util/windows/WinHandle.hpp)
5
+   set(libobs_audio_monitoring_SOURCES
6
+       audio-monitoring/win32/wasapi-output.c
7
+       audio-monitoring/win32/wasapi-enum-devices.c
8
+       )
9
+   set(libobs_audio_monitoring_HEADERS
10
+       audio-monitoring/win32/wasapi-output.h
11
+       )
12
    set(libobs_PLATFORM_DEPS winmm)
13
    if(MSVC)
14
        set(libobs_PLATFORM_DEPS
15
@@ -83,6 +90,13 @@
16
        util/platform-cocoa.m)
17
    set(libobs_PLATFORM_HEADERS
18
        util/threading-posix.h)
19
+   set(libobs_audio_monitoring_SOURCES
20
+       audio-monitoring/osx/coreaudio-enum-devices.c
21
+       audio-monitoring/osx/coreaudio-output.c
22
+       )
23
+   set(libobs_audio_monitoring_HEADERS
24
+       audio-monitoring/osx/mac-helpers.h
25
+       )
26
 
27
    set_source_files_properties(${libobs_PLATFORM_SOURCES}
28
        PROPERTIES
29
@@ -93,6 +107,18 @@
30
    mark_as_advanced(COCOA)
31
    include_directories(${COCOA})
32
 
33
+   find_library(COREAUDIO CoreAudio)
34
+   mark_as_advanced(COREAUDIO)
35
+   include_directories(${COREAUDIO})
36
+
37
+   find_library(AUDIOTOOLBOX AudioToolbox)
38
+   mark_as_advanced(AUDIOTOOLBOX)
39
+   include_directories(${AUDIOTOOLBOX})
40
+
41
+   find_library(AUDIOUNIT AudioUnit)
42
+   mark_as_advanced(AUDIOUNIT)
43
+   include_directories(${AUDIOUNIT})
44
+
45
    find_library(APPKIT AppKit)
46
    mark_as_advanced(APPKIT)
47
    include_directories(${APPKIT})
48
@@ -107,6 +133,9 @@
49
 
50
    set(libobs_PLATFORM_DEPS
51
        ${COCOA}
52
+       ${COREAUDIO}
53
+       ${AUDIOUNIT}
54
+       ${AUDIOTOOLBOX}
55
        ${APPKIT}
56
        ${IOKIT}
57
        ${CARBON})
58
@@ -118,6 +147,9 @@
59
        util/platform-nix.c)
60
    set(libobs_PLATFORM_HEADERS
61
        util/threading-posix.h)
62
+   set(libobs_audio_monitoring_SOURCES
63
+       audio-monitoring/null/null-audio-monitoring.c
64
+       )
65
 
66
    if(DBUS_FOUND)
67
        set(libobs_PLATFORM_SOURCES ${libobs_PLATFORM_SOURCES}
68
@@ -334,7 +366,10 @@
69
    ${libobs_graphics_HEADERS}
70
    ${libobs_mediaio_HEADERS}
71
    ${libobs_util_HEADERS}
72
-   ${libobs_libobs_HEADERS})
73
+   ${libobs_libobs_HEADERS}
74
+   ${libobs_audio_monitoring_SOURCES}
75
+   ${libobs_audio_monitoring_HEADERS}
76
+   )
77
 
78
 source_group("callback\\Source Files" FILES ${libobs_callback_SOURCES})
79
 source_group("callback\\Header Files" FILES ${libobs_callback_HEADERS})
80
@@ -346,6 +381,8 @@
81
 source_group("media-io\\Header Files" FILES ${libobs_mediaio_HEADERS})
82
 source_group("util\\Source Files" FILES ${libobs_util_SOURCES})
83
 source_group("util\\Header Files" FILES ${libobs_util_HEADERS})
84
+source_group("audio-monitoring\\Source Files" FILES ${libobs_audio_monitoring_SOURCES})
85
+source_group("audio-monitoring\\Header Files" FILES ${libobs_audio_monitoring_HEADERS})
86
 
87
 if(BUILD_CAPTIONS)
88
    include_directories(${CMAKE_SOURCE_DIR}/deps/libcaption)
89
obs-studio-18.0.0.tar.xz/libobs/audio-monitoring Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/libobs/audio-monitoring/null Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/libobs/audio-monitoring/null/null-audio-monitoring.c Added
25
 
1
@@ -0,0 +1,23 @@
2
+#include "../../obs-internal.h"
3
+
4
+void obs_enum_audio_monitoring_devices(obs_enum_audio_device_cb cb, void *data)
5
+{
6
+   UNUSED_PARAMETER(cb);
7
+   UNUSED_PARAMETER(data);
8
+}
9
+
10
+struct audio_monitor *audio_monitor_create(obs_source_t *source)
11
+{
12
+   UNUSED_PARAMETER(source);
13
+   return NULL;
14
+}
15
+
16
+void audio_monitor_reset(struct audio_monitor *monitor)
17
+{
18
+   UNUSED_PARAMETER(monitor);
19
+}
20
+
21
+void audio_monitor_destroy(struct audio_monitor *monitor)
22
+{
23
+   UNUSED_PARAMETER(monitor);
24
+}
25
obs-studio-18.0.0.tar.xz/libobs/audio-monitoring/osx Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/libobs/audio-monitoring/osx/coreaudio-enum-devices.c Added
98
 
1
@@ -0,0 +1,96 @@
2
+#include <CoreFoundation/CFString.h>
3
+#include <CoreAudio/CoreAudio.h>
4
+
5
+#include "../../obs-internal.h"
6
+#include "../../util/dstr.h"
7
+
8
+#include "mac-helpers.h"
9
+
10
+static inline bool cf_to_cstr(CFStringRef ref, char *buf, size_t size)
11
+{
12
+   if (!ref) return false;
13
+   return (bool)CFStringGetCString(ref, buf, size, kCFStringEncodingUTF8);
14
+}
15
+
16
+static void obs_enum_audio_monitoring_device(obs_enum_audio_device_cb cb,
17
+       void *data, AudioDeviceID id)
18
+{
19
+   UInt32      size    = 0;
20
+   CFStringRef cf_name = NULL;
21
+   CFStringRef cf_uid  = NULL;
22
+   char        name[1024];
23
+   char        uid[1024];
24
+   OSStatus    stat;
25
+
26
+   AudioObjectPropertyAddress addr = {
27
+       kAudioDevicePropertyStreams,
28
+       kAudioDevicePropertyScopeInput,
29
+       kAudioObjectPropertyElementMaster
30
+   };
31
+
32
+   /* check to see if it's a mac input device */
33
+   AudioObjectGetPropertyDataSize(id, &addr, 0, NULL, &size);
34
+   if (!size)
35
+       return;
36
+
37
+   size = sizeof(CFStringRef);
38
+
39
+   addr.mSelector = kAudioDevicePropertyDeviceUID;
40
+   stat = AudioObjectGetPropertyData(id, &addr, 0, NULL, &size, &cf_uid);
41
+   if (!success(stat, "get audio device UID"))
42
+       return;
43
+
44
+   addr.mSelector = kAudioDevicePropertyDeviceNameCFString;
45
+   stat = AudioObjectGetPropertyData(id, &addr, 0, NULL, &size, &cf_name);
46
+   if (!success(stat, "get audio device name"))
47
+       goto fail;
48
+
49
+   if (!cf_to_cstr(cf_name, name, sizeof(name))) {
50
+       blog(LOG_WARNING, "%s: failed to convert name", __FUNCTION__);
51
+       goto fail;
52
+   }
53
+
54
+   if (!cf_to_cstr(cf_uid, uid, sizeof(uid))) {
55
+       blog(LOG_WARNING, "%s: failed to convert uid", __FUNCTION__);
56
+       goto fail;
57
+   }
58
+
59
+   cb(data, name, uid);
60
+
61
+fail:
62
+   if (cf_name)
63
+       CFRelease(cf_name);
64
+   if (cf_uid)
65
+       CFRelease(cf_uid);
66
+}
67
+
68
+void obs_enum_audio_monitoring_devices(obs_enum_audio_device_cb cb, void *data)
69
+{
70
+   AudioObjectPropertyAddress addr = {
71
+       kAudioHardwarePropertyDevices,
72
+       kAudioObjectPropertyScopeGlobal,
73
+       kAudioObjectPropertyElementMaster
74
+   };
75
+
76
+   UInt32        size = 0;
77
+   UInt32        count;
78
+   OSStatus      stat;
79
+   AudioDeviceID *ids;
80
+
81
+   stat = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &addr,
82
+                       0, NULL, &size);
83
+   if (!success(stat, "get data size"))
84
+       return;
85
+
86
+   ids   = malloc(size);
87
+   count = size / sizeof(AudioDeviceID);
88
+
89
+   stat = AudioObjectGetPropertyData(kAudioObjectSystemObject, &addr,
90
+                       0, NULL, &size, ids);
91
+   if (success(stat, "get data")) {
92
+       for (UInt32 i = 0; i < count; i++)
93
+           obs_enum_audio_monitoring_device(cb, data, ids[i]);
94
+   }
95
+
96
+   free(ids);
97
+}
98
obs-studio-18.0.0.tar.xz/libobs/audio-monitoring/osx/coreaudio-output.c Added
201
 
1
@@ -0,0 +1,322 @@
2
+#include <AudioUnit/AudioUnit.h>
3
+#include <AudioToolBox/AudioQueue.h>
4
+#include <CoreFoundation/CFString.h>
5
+#include <CoreAudio/CoreAudio.h>
6
+
7
+#include "../../media-io/audio-resampler.h"
8
+#include "../../util/circlebuf.h"
9
+#include "../../util/threading.h"
10
+#include "../../util/platform.h"
11
+#include "../../obs-internal.h"
12
+#include "../../util/darray.h"
13
+
14
+#include "mac-helpers.h"
15
+
16
+struct audio_monitor {
17
+   obs_source_t          *source;
18
+   AudioQueueRef         queue;
19
+   AudioQueueBufferRef   buffers[3];
20
+
21
+   pthread_mutex_t       mutex;
22
+   struct circlebuf      empty_buffers;
23
+   struct circlebuf      new_data;
24
+   audio_resampler_t     *resampler;
25
+   size_t                buffer_size;
26
+   size_t                wait_size;
27
+   uint32_t              channels;
28
+
29
+   volatile bool         active;
30
+   bool                  paused;
31
+};
32
+
33
+static inline bool fill_buffer(struct audio_monitor *monitor)
34
+{
35
+   AudioQueueBufferRef buf;
36
+   OSStatus stat;
37
+
38
+   if (monitor->new_data.size < monitor->buffer_size) {
39
+       return false;
40
+   }
41
+
42
+   circlebuf_pop_front(&monitor->empty_buffers, &buf, sizeof(buf));
43
+   circlebuf_pop_front(&monitor->new_data, buf->mAudioData,
44
+           monitor->buffer_size);
45
+
46
+   buf->mAudioDataByteSize = monitor->buffer_size;
47
+
48
+   stat = AudioQueueEnqueueBuffer(monitor->queue, buf, 0, NULL);
49
+   if (!success(stat, "AudioQueueEnqueueBuffer")) {
50
+       blog(LOG_WARNING, "%s: %s", __FUNCTION__,
51
+               "Failed to enqueue buffer");
52
+       AudioQueueStop(monitor->queue, false);
53
+   }
54
+   return true;
55
+}
56
+
57
+static void on_audio_playback(void *param, obs_source_t *source,
58
+       const struct audio_data *audio_data, bool muted)
59
+{
60
+   struct audio_monitor *monitor = param;
61
+   float vol = source->user_volume;
62
+   uint32_t bytes;
63
+
64
+   UNUSED_PARAMETER(source);
65
+
66
+   if (!os_atomic_load_bool(&monitor->active)) {
67
+       return;
68
+   }
69
+
70
+   uint8_t *resample_data[MAX_AV_PLANES];
71
+   uint32_t resample_frames;
72
+   uint64_t ts_offset;
73
+   bool success;
74
+
75
+   success = audio_resampler_resample(monitor->resampler, resample_data,
76
+           &resample_frames, &ts_offset,
77
+           (const uint8_t *const *)audio_data->data,
78
+           (uint32_t)audio_data->frames);
79
+   if (!success) {
80
+       return;
81
+   }
82
+
83
+   bytes = sizeof(float) * monitor->channels * resample_frames;
84
+
85
+   if (muted) {
86
+       memset(resample_data[0], 0, bytes);
87
+   } else {
88
+       /* apply volume */
89
+       if (!close_float(vol, 1.0f, EPSILON)) {
90
+           register float *cur = (float*)resample_data[0];
91
+           register float *end = cur +
92
+               resample_frames * monitor->channels;
93
+
94
+           while (cur < end)
95
+               *(cur++) *= vol;
96
+       }
97
+   }
98
+
99
+   pthread_mutex_lock(&monitor->mutex);
100
+   circlebuf_push_back(&monitor->new_data, resample_data[0], bytes);
101
+
102
+   if (monitor->new_data.size >= monitor->wait_size) {
103
+       monitor->wait_size = 0;
104
+
105
+       while (monitor->empty_buffers.size > 0) {
106
+           if (!fill_buffer(monitor)) {
107
+               break;
108
+           }
109
+       }
110
+
111
+       if (monitor->paused) {
112
+           AudioQueueStart(monitor->queue, NULL);
113
+           monitor->paused = false;
114
+       }
115
+   }
116
+
117
+   pthread_mutex_unlock(&monitor->mutex);
118
+}
119
+
120
+static void buffer_audio(void *data, AudioQueueRef aq, AudioQueueBufferRef buf)
121
+{
122
+   struct audio_monitor *monitor = data;
123
+
124
+   pthread_mutex_lock(&monitor->mutex);
125
+   circlebuf_push_back(&monitor->empty_buffers, &buf, sizeof(buf));
126
+   while (monitor->empty_buffers.size > 0) {
127
+       if (!fill_buffer(monitor)) {
128
+           break;
129
+       }
130
+   }
131
+   if (monitor->empty_buffers.size == sizeof(buf) * 3) {
132
+       monitor->paused = true;
133
+       monitor->wait_size = monitor->buffer_size * 3;
134
+       AudioQueuePause(monitor->queue);
135
+   }
136
+   pthread_mutex_unlock(&monitor->mutex);
137
+
138
+   UNUSED_PARAMETER(aq);
139
+}
140
+
141
+static bool audio_monitor_init(struct audio_monitor *monitor)
142
+{
143
+   const struct audio_output_info *info = audio_output_get_info(
144
+           obs->audio.audio);
145
+   uint32_t channels = get_audio_channels(info->speakers);
146
+   OSStatus stat;
147
+
148
+   AudioStreamBasicDescription desc = {
149
+       .mSampleRate = (Float64)info->samples_per_sec,
150
+       .mFormatID = kAudioFormatLinearPCM,
151
+       .mFormatFlags = kAudioFormatFlagIsFloat |
152
+                       kAudioFormatFlagIsPacked,
153
+       .mBytesPerPacket = sizeof(float) * channels,
154
+       .mFramesPerPacket = 1,
155
+       .mBytesPerFrame = sizeof(float) * channels,
156
+       .mChannelsPerFrame = channels,
157
+       .mBitsPerChannel = sizeof(float) * 8
158
+   };
159
+
160
+   monitor->channels = channels;
161
+   monitor->buffer_size =
162
+       channels * sizeof(float) * info->samples_per_sec / 100 * 3;
163
+   monitor->wait_size = monitor->buffer_size * 3;
164
+
165
+   pthread_mutex_init_value(&monitor->mutex);
166
+
167
+   stat = AudioQueueNewOutput(&desc, buffer_audio, monitor, NULL, NULL, 0,
168
+           &monitor->queue);
169
+   if (!success(stat, "AudioStreamBasicDescription")) {
170
+       return false;
171
+   }
172
+
173
+   const char *uid = obs->audio.monitoring_device_id;
174
+   if (!uid || !*uid) {
175
+       return false;
176
+   }
177
+
178
+   if (strcmp(uid, "default") != 0) {
179
+       CFStringRef cf_uid = CFStringCreateWithBytesNoCopy(NULL,
180
+               (const UInt8*)uid, strlen(uid),
181
+               kCFStringEncodingUTF8,
182
+               false, NULL);
183
+
184
+       stat = AudioQueueSetProperty(monitor->queue,
185
+               kAudioQueueProperty_CurrentDevice,
186
+               cf_uid, sizeof(cf_uid));
187
+       CFRelease(cf_uid);
188
+
189
+       if (!success(stat, "set current device")) {
190
+           return false;
191
+       }
192
+   }
193
+
194
+   stat = AudioQueueSetParameter(monitor->queue,
195
+           kAudioQueueParam_Volume, 1.0);
196
+   if (!success(stat, "set volume")) {
197
+       return false;
198
+   }
199
+
200
+   for (size_t i = 0; i < 3; i++) {
201
obs-studio-18.0.0.tar.xz/libobs/audio-monitoring/osx/mac-helpers.h Added
17
 
1
@@ -0,0 +1,15 @@
2
+#pragma once
3
+
4
+static bool success_(OSStatus stat, const char *func, const char *call)
5
+{
6
+   if (stat != noErr) {
7
+       blog(LOG_WARNING, "%s: %s failed: %d",
8
+               func, call, (int)stat);
9
+       return false;
10
+   }
11
+
12
+   return true;
13
+}
14
+
15
+#define success(stat, call) \
16
+   success_(stat, __FUNCTION__, call)
17
obs-studio-18.0.0.tar.xz/libobs/audio-monitoring/win32 Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/libobs/audio-monitoring/win32/wasapi-enum-devices.c Added
107
 
1
@@ -0,0 +1,105 @@
2
+#include "../../obs-internal.h"
3
+
4
+#include "wasapi-output.h"
5
+
6
+#include <propsys.h>
7
+
8
+#ifdef __MINGW32__
9
+
10
+#ifdef DEFINE_PROPERTYKEY
11
+#undef DEFINE_PROPERTYKEY
12
+#endif
13
+#define DEFINE_PROPERTYKEY(id, a, b, c, d, e, f, g, h, i, j, k, l) \
14
+   const PROPERTYKEY id = { { a,b,c, { d,e,f,g,h,i,j,k, } }, l };
15
+DEFINE_PROPERTYKEY(PKEY_Device_FriendlyName, \
16
+   0xa45c254e, 0xdf1c, 0x4efd, 0x80, \
17
+   0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14);
18
+
19
+#else
20
+
21
+#include <functiondiscoverykeys_devpkey.h>
22
+
23
+#endif
24
+
25
+static bool get_device_info(obs_enum_audio_device_cb cb, void *data,
26
+       IMMDeviceCollection *collection, UINT idx)
27
+{
28
+   IPropertyStore *store = NULL;
29
+   IMMDevice *device = NULL;
30
+   PROPVARIANT name_var;
31
+   char utf8_name[512];
32
+   WCHAR *w_id = NULL;
33
+   char utf8_id[512];
34
+   bool cont = true;
35
+   HRESULT hr;
36
+
37
+   hr = collection->lpVtbl->Item(collection, idx, &device);
38
+   if (FAILED(hr)) {
39
+       goto fail;
40
+   }
41
+
42
+   hr = device->lpVtbl->GetId(device, &w_id);
43
+   if (FAILED(hr)) {
44
+       goto fail;
45
+   }
46
+
47
+   hr = device->lpVtbl->OpenPropertyStore(device, STGM_READ, &store);
48
+   if (FAILED(hr)) {
49
+       goto fail;
50
+   }
51
+
52
+   PropVariantInit(&name_var);
53
+   hr = store->lpVtbl->GetValue(store, &PKEY_Device_FriendlyName,
54
+           &name_var);
55
+   if (FAILED(hr)) {
56
+       goto fail;
57
+   }
58
+
59
+   os_wcs_to_utf8(w_id, 0, utf8_id, 512);
60
+   os_wcs_to_utf8(name_var.pwszVal, 0, utf8_name, 512);
61
+
62
+   cont = cb(data, utf8_name, utf8_id);
63
+
64
+fail:
65
+   safe_release(store);
66
+   safe_release(device);
67
+   if (w_id)
68
+       CoTaskMemFree(w_id);
69
+   return cont;
70
+}
71
+
72
+void obs_enum_audio_monitoring_devices(obs_enum_audio_device_cb cb,
73
+       void *data)
74
+{
75
+   IMMDeviceEnumerator *enumerator = NULL;
76
+   IMMDeviceCollection *collection = NULL;
77
+   UINT count;
78
+   HRESULT hr;
79
+
80
+   hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL,
81
+           &IID_IMMDeviceEnumerator, &enumerator);
82
+   if (FAILED(hr)) {
83
+       goto fail;
84
+   }
85
+
86
+   hr = enumerator->lpVtbl->EnumAudioEndpoints(enumerator, eRender,
87
+           DEVICE_STATE_ACTIVE, &collection);
88
+   if (FAILED(hr)) {
89
+       goto fail;
90
+   }
91
+
92
+   hr = collection->lpVtbl->GetCount(collection, &count);
93
+   if (FAILED(hr)) {
94
+       goto fail;
95
+   }
96
+
97
+   for (UINT i = 0; i < count; i++) {
98
+       if (!get_device_info(cb, data, collection, i)) {
99
+           break;
100
+       }
101
+   }
102
+
103
+fail:
104
+   safe_release(enumerator);
105
+   safe_release(collection);
106
+}
107
obs-studio-18.0.0.tar.xz/libobs/audio-monitoring/win32/wasapi-output.c Added
201
 
1
@@ -0,0 +1,416 @@
2
+#include "../../media-io/audio-resampler.h"
3
+#include "../../util/circlebuf.h"
4
+#include "../../util/platform.h"
5
+#include "../../util/darray.h"
6
+#include "../../obs-internal.h"
7
+
8
+#include "wasapi-output.h"
9
+
10
+#define ACTUALLY_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
11
+        EXTERN_C const GUID DECLSPEC_SELECTANY name \
12
+                = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
13
+
14
+ACTUALLY_DEFINE_GUID(CLSID_MMDeviceEnumerator,
15
+   0xBCDE0395, 0xE52F, 0x467C,
16
+   0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E);
17
+ACTUALLY_DEFINE_GUID(IID_IMMDeviceEnumerator,
18
+   0xA95664D2, 0x9614, 0x4F35,
19
+   0xA7, 0x46, 0xDE, 0x8D, 0xB6, 0x36, 0x17, 0xE6);
20
+ACTUALLY_DEFINE_GUID(IID_IAudioClient,
21
+   0x1CB9AD4C, 0xDBFA, 0x4C32,
22
+   0xB1, 0x78, 0xC2, 0xF5, 0x68, 0xA7, 0x03, 0xB2);
23
+ACTUALLY_DEFINE_GUID(IID_IAudioRenderClient,
24
+   0xF294ACFC, 0x3146, 0x4483,
25
+   0xA7, 0xBF, 0xAD, 0xDC, 0xA7, 0xC2, 0x60, 0xE2);
26
+
27
+struct audio_monitor {
28
+   obs_source_t       *source;
29
+   IMMDevice          *device;
30
+   IAudioClient       *client;
31
+   IAudioRenderClient *render;
32
+
33
+   uint64_t           last_recv_time;
34
+   uint64_t           prev_video_ts;
35
+   uint64_t           time_since_prev;
36
+   audio_resampler_t  *resampler;
37
+   uint32_t           sample_rate;
38
+   uint32_t           channels;
39
+   bool               source_has_video : 1;
40
+
41
+   int64_t            lowest_audio_offset;
42
+   struct circlebuf   delay_buffer;
43
+   uint32_t           delay_size;
44
+
45
+   DARRAY(float)      buf;
46
+   pthread_mutex_t    playback_mutex;
47
+};
48
+
49
+/* #define DEBUG_AUDIO */
50
+
51
+static bool process_audio_delay(struct audio_monitor *monitor,
52
+       float **data, uint32_t *frames, uint64_t ts, uint32_t pad)
53
+{
54
+   obs_source_t *s = monitor->source;
55
+   uint64_t last_frame_ts = s->last_frame_ts;
56
+   uint64_t cur_time = os_gettime_ns();
57
+   uint64_t front_ts;
58
+   uint64_t cur_ts;
59
+   int64_t diff;
60
+   uint32_t blocksize = monitor->channels * sizeof(float);
61
+
62
+   /* cut off audio if long-since leftover audio in delay buffer */
63
+   if (cur_time - monitor->last_recv_time > 1000000000)
64
+       circlebuf_free(&monitor->delay_buffer);
65
+   monitor->last_recv_time = cur_time;
66
+
67
+   circlebuf_push_back(&monitor->delay_buffer, &ts, sizeof(ts));
68
+   circlebuf_push_back(&monitor->delay_buffer, frames, sizeof(*frames));
69
+   circlebuf_push_back(&monitor->delay_buffer, *data,
70
+           *frames * blocksize);
71
+
72
+   if (!monitor->prev_video_ts) {
73
+       monitor->prev_video_ts = last_frame_ts;
74
+
75
+   } else if (monitor->prev_video_ts == last_frame_ts) {
76
+       monitor->time_since_prev += (uint64_t)*frames *
77
+           1000000000ULL / (uint64_t)monitor->sample_rate;
78
+   } else {
79
+       monitor->time_since_prev = 0;
80
+   }
81
+
82
+   while (monitor->delay_buffer.size != 0) {
83
+       size_t size;
84
+       bool bad_diff;
85
+
86
+       circlebuf_peek_front(&monitor->delay_buffer, &cur_ts,
87
+               sizeof(ts));
88
+       front_ts = cur_ts -
89
+           ((uint64_t)pad * 1000000000ULL /
90
+            (uint64_t)monitor->sample_rate);
91
+       diff = (int64_t)front_ts - (int64_t)last_frame_ts;
92
+       bad_diff = !last_frame_ts ||
93
+                  llabs(diff) > 5000000000 ||
94
+                  monitor->time_since_prev > 100000000ULL;
95
+
96
+       /* delay audio if rushing */
97
+       if (!bad_diff && diff > 75000000) {
98
+#ifdef DEBUG_AUDIO
99
+           blog(LOG_INFO, "audio rushing, cutting audio, "
100
+                   "diff: %lld, delay buffer size: %lu, "
101
+                   "v: %llu: a: %llu",
102
+                   diff, (int)monitor->delay_buffer.size,
103
+                   last_frame_ts, front_ts);
104
+#endif
105
+           return false;
106
+       }
107
+
108
+       circlebuf_pop_front(&monitor->delay_buffer, NULL, sizeof(ts));
109
+       circlebuf_pop_front(&monitor->delay_buffer, frames,
110
+               sizeof(*frames));
111
+
112
+       size = *frames * blocksize;
113
+       da_resize(monitor->buf, size);
114
+       circlebuf_pop_front(&monitor->delay_buffer,
115
+               monitor->buf.array, size);
116
+
117
+       /* cut audio if dragging */
118
+       if (!bad_diff && diff < -75000000 && monitor->delay_buffer.size > 0) {
119
+#ifdef DEBUG_AUDIO
120
+           blog(LOG_INFO, "audio dragging, cutting audio, "
121
+                   "diff: %lld, delay buffer size: %lu, "
122
+                   "v: %llu: a: %llu",
123
+                   diff, (int)monitor->delay_buffer.size,
124
+                   last_frame_ts, front_ts);
125
+#endif
126
+           continue;
127
+       }
128
+
129
+       *data = monitor->buf.array;
130
+       return true;
131
+   }
132
+
133
+   return false;
134
+}
135
+
136
+static void on_audio_playback(void *param, obs_source_t *source,
137
+       const struct audio_data *audio_data, bool muted)
138
+{
139
+   struct audio_monitor *monitor = param;
140
+   IAudioRenderClient *render = monitor->render;
141
+   uint8_t *resample_data[MAX_AV_PLANES];
142
+   float vol = source->user_volume;
143
+   uint32_t resample_frames;
144
+   uint64_t ts_offset;
145
+   bool success;
146
+   BYTE *output;
147
+
148
+   if (pthread_mutex_trylock(&monitor->playback_mutex) != 0) {
149
+       return;
150
+   }
151
+   if (os_atomic_load_long(&source->activate_refs) == 0) {
152
+       goto unlock;
153
+   }
154
+
155
+   success = audio_resampler_resample(monitor->resampler, resample_data,
156
+           &resample_frames, &ts_offset,
157
+           (const uint8_t *const *)audio_data->data,
158
+           (uint32_t)audio_data->frames);
159
+   if (!success) {
160
+       goto unlock;
161
+   }
162
+
163
+   UINT32 pad = 0;
164
+   monitor->client->lpVtbl->GetCurrentPadding(monitor->client, &pad);
165
+
166
+   if (monitor->source_has_video) {
167
+       uint64_t ts = audio_data->timestamp - ts_offset;
168
+
169
+       if (!process_audio_delay(monitor, (float**)(&resample_data[0]),
170
+                   &resample_frames, ts, pad)) {
171
+           goto unlock;
172
+       }
173
+   }
174
+
175
+   HRESULT hr = render->lpVtbl->GetBuffer(render, resample_frames,
176
+           &output);
177
+   if (FAILED(hr)) {
178
+       goto unlock;
179
+   }
180
+
181
+   if (!muted) {
182
+       /* apply volume */
183
+       if (!close_float(vol, 1.0f, EPSILON)) {
184
+           register float *cur = (float*)resample_data[0];
185
+           register float *end = cur +
186
+               resample_frames * monitor->channels;
187
+
188
+           while (cur < end)
189
+               *(cur++) *= vol;
190
+       }
191
+       memcpy(output, resample_data[0],
192
+               resample_frames * monitor->channels *
193
+               sizeof(float));
194
+   }
195
+
196
+   render->lpVtbl->ReleaseBuffer(render, resample_frames,
197
+           muted ? AUDCLNT_BUFFERFLAGS_SILENT : 0);
198
+
199
+unlock:
200
+   pthread_mutex_unlock(&monitor->playback_mutex);
201
obs-studio-18.0.0.tar.xz/libobs/audio-monitoring/win32/wasapi-output.h Added
15
 
1
@@ -0,0 +1,13 @@
2
+#include <windows.h>
3
+#include <mmdeviceapi.h>
4
+#include <audioclient.h>
5
+
6
+#define KSAUDIO_SPEAKER_4POINT1 (KSAUDIO_SPEAKER_QUAD|SPEAKER_LOW_FREQUENCY)
7
+#define KSAUDIO_SPEAKER_2POINT1 (KSAUDIO_SPEAKER_STEREO|SPEAKER_LOW_FREQUENCY)
8
+
9
+#define safe_release(ptr) \
10
+   do { \
11
+       if (ptr) { \
12
+           ptr->lpVtbl->Release(ptr); \
13
+       } \
14
+   } while (false)
15
obs-studio-17.0.2.tar.xz/libobs/callback/decl.h -> obs-studio-18.0.0.tar.xz/libobs/callback/decl.h Changed
10
 
1
@@ -31,7 +31,7 @@
2
 
3
 static inline void decl_param_free(struct decl_param *param)
4
 {
5
-   if (param)
6
+   if (param->name)
7
        bfree(param->name);
8
    memset(param, 0, sizeof(struct decl_param));
9
 }
10
obs-studio-17.0.2.tar.xz/libobs/data/bicubic_scale.effect -> obs-studio-18.0.0.tar.xz/libobs/data/bicubic_scale.effect Changed
105
 
1
@@ -10,6 +10,7 @@
2
 uniform float3 color_range_min = {0.0, 0.0, 0.0};
3
 uniform float3 color_range_max = {1.0, 1.0, 1.0};
4
 uniform float2 base_dimension_i;
5
+uniform float undistort_factor = 1.0;
6
 
7
 sampler_state textureSampler {
8
    Filter    = Linear;
9
@@ -63,21 +64,41 @@
10
        weight(x + 1.0));
11
 }
12
 
13
-float4 pixel(float xpos, float ypos)
14
+float AspectUndistortX(float x, float a)
15
 {
16
-   return image.Sample(textureSampler, float2(xpos, ypos));
17
+   // The higher the power, the longer the linear part will be.
18
+   return (1.0 - a) * (x * x * x * x * x) + a * x;
19
 }
20
 
21
-float4 get_line(float ypos, float4 xpos, float4 linetaps)
22
+float AspectUndistortU(float u)
23
+{
24
+   // Normalize texture coord to -1.0 to 1.0 range, and back.
25
+   return AspectUndistortX((u - 0.5) * 2.0, undistort_factor) * 0.5 + 0.5;
26
+}
27
+
28
+float2 pixel_coord(float xpos, float ypos)
29
+{
30
+   return float2(AspectUndistortU(xpos), ypos);
31
+}
32
+
33
+float4 pixel(float xpos, float ypos, bool undistort)
34
+{
35
+   if (undistort)
36
+       return image.Sample(textureSampler, pixel_coord(xpos, ypos));
37
+   else
38
+       return image.Sample(textureSampler, float2(xpos, ypos));
39
+}
40
+
41
+float4 get_line(float ypos, float4 xpos, float4 linetaps, bool undistort)
42
 {
43
    return
44
-       pixel(xpos.r, ypos) * linetaps.r +
45
-       pixel(xpos.g, ypos) * linetaps.g +
46
-       pixel(xpos.b, ypos) * linetaps.b +
47
-       pixel(xpos.a, ypos) * linetaps.a;
48
+       pixel(xpos.r, ypos, undistort) * linetaps.r +
49
+       pixel(xpos.g, ypos, undistort) * linetaps.g +
50
+       pixel(xpos.b, ypos, undistort) * linetaps.b +
51
+       pixel(xpos.a, ypos, undistort) * linetaps.a;
52
 }
53
 
54
-float4 DrawBicubic(VertData v_in)
55
+float4 DrawBicubic(VertData v_in, bool undistort)
56
 {
57
    float2 stepxy = base_dimension_i;
58
    float2 pos = v_in.uv + stepxy * 0.5;
59
@@ -100,20 +121,20 @@
60
    );
61
 
62
    return
63
-       get_line(xystart.y                 , xpos, rowtaps) * coltaps.r +
64
-       get_line(xystart.y + stepxy.y      , xpos, rowtaps) * coltaps.g +
65
-       get_line(xystart.y + stepxy.y * 2.0, xpos, rowtaps) * coltaps.b +
66
-       get_line(xystart.y + stepxy.y * 3.0, xpos, rowtaps) * coltaps.a;
67
+       get_line(xystart.y                 , xpos, rowtaps, undistort) * coltaps.r +
68
+       get_line(xystart.y + stepxy.y      , xpos, rowtaps, undistort) * coltaps.g +
69
+       get_line(xystart.y + stepxy.y * 2.0, xpos, rowtaps, undistort) * coltaps.b +
70
+       get_line(xystart.y + stepxy.y * 3.0, xpos, rowtaps, undistort) * coltaps.a;
71
 }
72
 
73
-float4 PSDrawBicubicRGBA(VertData v_in) : TARGET
74
+float4 PSDrawBicubicRGBA(VertData v_in, bool undistort) : TARGET
75
 {
76
-   return DrawBicubic(v_in);
77
+   return DrawBicubic(v_in, undistort);
78
 }
79
 
80
 float4 PSDrawBicubicMatrix(VertData v_in) : TARGET
81
 {
82
-   float4 rgba = DrawBicubic(v_in);
83
+   float4 rgba = DrawBicubic(v_in, false);
84
    float4 yuv;
85
 
86
    yuv.xyz = clamp(rgba.xyz, color_range_min, color_range_max);
87
@@ -125,7 +146,16 @@
88
    pass
89
    {
90
        vertex_shader = VSDefault(v_in);
91
-       pixel_shader  = PSDrawBicubicRGBA(v_in);
92
+       pixel_shader  = PSDrawBicubicRGBA(v_in, false);
93
+   }
94
+}
95
+
96
+technique DrawUndistort
97
+{
98
+   pass
99
+   {
100
+       vertex_shader = VSDefault(v_in);
101
+       pixel_shader  = PSDrawBicubicRGBA(v_in, true);
102
    }
103
 }
104
 
105
obs-studio-17.0.2.tar.xz/libobs/data/lanczos_scale.effect -> obs-studio-18.0.0.tar.xz/libobs/data/lanczos_scale.effect Changed
114
 
1
@@ -10,6 +10,7 @@
2
 uniform float3 color_range_min = {0.0, 0.0, 0.0};
3
 uniform float3 color_range_max = {1.0, 1.0, 1.0};
4
 uniform float2 base_dimension_i;
5
+uniform float undistort_factor = 1.0;
6
 
7
 sampler_state textureSampler
8
 {
9
@@ -64,24 +65,44 @@
10
        weight((x * 2.0 + 2.0 * 2.0 - 3.0) * scale, 3.0));
11
 }
12
 
13
-float4 pixel(float xpos, float ypos)
14
+float AspectUndistortX(float x, float a)
15
 {
16
-   return image.Sample(textureSampler, float2(xpos, ypos));
17
+   // The higher the power, the longer the linear part will be.
18
+   return (1.0 - a) * (x * x * x * x * x) + a * x;
19
+}
20
+
21
+float AspectUndistortU(float u)
22
+{
23
+   // Normalize texture coord to -1.0 to 1.0 range, and back.
24
+   return AspectUndistortX((u - 0.5) * 2.0, undistort_factor) * 0.5 + 0.5;
25
+}
26
+
27
+float2 pixel_coord(float xpos, float ypos)
28
+{
29
+   return float2(AspectUndistortU(xpos), ypos);
30
+}
31
+
32
+float4 pixel(float xpos, float ypos, bool undistort)
33
+{
34
+   if (undistort)
35
+       return image.Sample(textureSampler, pixel_coord(xpos, ypos));
36
+   else
37
+       return image.Sample(textureSampler, float2(xpos, ypos));
38
 }
39
 
40
 float4 get_line(float ypos, float3 xpos1, float3 xpos2, float3 rowtap1,
41
-       float3 rowtap2)
42
+       float3 rowtap2, bool undistort)
43
 {
44
    return
45
-       pixel(xpos1.r, ypos) * rowtap1.r +
46
-       pixel(xpos1.g, ypos) * rowtap2.r +
47
-       pixel(xpos1.b, ypos) * rowtap1.g +
48
-       pixel(xpos2.r, ypos) * rowtap2.g +
49
-       pixel(xpos2.g, ypos) * rowtap1.b +
50
-       pixel(xpos2.b, ypos) * rowtap2.b;
51
+       pixel(xpos1.r, ypos, undistort) * rowtap1.r +
52
+       pixel(xpos1.g, ypos, undistort) * rowtap2.r +
53
+       pixel(xpos1.b, ypos, undistort) * rowtap1.g +
54
+       pixel(xpos2.r, ypos, undistort) * rowtap2.g +
55
+       pixel(xpos2.g, ypos, undistort) * rowtap1.b +
56
+       pixel(xpos2.b, ypos, undistort) * rowtap2.b;
57
 }
58
 
59
-float4 DrawLanczos(FragData v_in)
60
+float4 DrawLanczos(FragData v_in, bool undistort)
61
 {
62
    float2 stepxy = base_dimension_i;
63
    float2 pos = v_in.uv + stepxy * 0.5;
64
@@ -106,22 +127,22 @@
65
    float3 xpos2 = float3(xystart.x + stepxy.x * 3.0, xystart.x + stepxy.x * 4.0, xystart.x + stepxy.x * 5.0);
66
 
67
    return
68
-       get_line(xystart.y                 , xpos1, xpos2, rowtap1, rowtap2) * coltap1.r +
69
-       get_line(xystart.y + stepxy.y      , xpos1, xpos2, rowtap1, rowtap2) * coltap2.r +
70
-       get_line(xystart.y + stepxy.y * 2.0, xpos1, xpos2, rowtap1, rowtap2) * coltap1.g +
71
-       get_line(xystart.y + stepxy.y * 3.0, xpos1, xpos2, rowtap1, rowtap2) * coltap2.g +
72
-       get_line(xystart.y + stepxy.y * 4.0, xpos1, xpos2, rowtap1, rowtap2) * coltap1.b +
73
-       get_line(xystart.y + stepxy.y * 5.0, xpos1, xpos2, rowtap1, rowtap2) * coltap2.b;
74
+       get_line(xystart.y                 , xpos1, xpos2, rowtap1, rowtap2, undistort) * coltap1.r +
75
+       get_line(xystart.y + stepxy.y      , xpos1, xpos2, rowtap1, rowtap2, undistort) * coltap2.r +
76
+       get_line(xystart.y + stepxy.y * 2.0, xpos1, xpos2, rowtap1, rowtap2, undistort) * coltap1.g +
77
+       get_line(xystart.y + stepxy.y * 3.0, xpos1, xpos2, rowtap1, rowtap2, undistort) * coltap2.g +
78
+       get_line(xystart.y + stepxy.y * 4.0, xpos1, xpos2, rowtap1, rowtap2, undistort) * coltap1.b +
79
+       get_line(xystart.y + stepxy.y * 5.0, xpos1, xpos2, rowtap1, rowtap2, undistort) * coltap2.b;
80
 }
81
 
82
-float4 PSDrawLanczosRGBA(FragData v_in) : TARGET
83
+float4 PSDrawLanczosRGBA(FragData v_in, bool undistort) : TARGET
84
 {
85
-   return DrawLanczos(v_in);
86
+   return DrawLanczos(v_in, undistort);
87
 }
88
 
89
 float4 PSDrawLanczosMatrix(FragData v_in) : TARGET
90
 {
91
-   float4 rgba = DrawLanczos(v_in);
92
+   float4 rgba = DrawLanczos(v_in, false);
93
    float4 yuv;
94
 
95
    yuv.xyz = clamp(rgba.xyz, color_range_min, color_range_max);
96
@@ -133,7 +154,16 @@
97
    pass
98
    {
99
        vertex_shader = VSDefault(v_in);
100
-       pixel_shader  = PSDrawLanczosRGBA(v_in);
101
+       pixel_shader  = PSDrawLanczosRGBA(v_in, false);
102
+   }
103
+}
104
+
105
+technique DrawUndistort
106
+{
107
+   pass
108
+   {
109
+       vertex_shader = VSDefault(v_in);
110
+       pixel_shader  = PSDrawLanczosRGBA(v_in, true);
111
    }
112
 }
113
 
114
obs-studio-17.0.2.tar.xz/libobs/obs-config.h -> obs-studio-18.0.0.tar.xz/libobs/obs-config.h Changed
19
 
1
@@ -27,7 +27,7 @@
2
 /*
3
  * Increment if major breaking API changes
4
  */
5
-#define LIBOBS_API_MAJOR_VER  17
6
+#define LIBOBS_API_MAJOR_VER  18
7
 
8
 /*
9
  * Increment if backward-compatible additions
10
@@ -41,7 +41,7 @@
11
  *
12
  * Reset to zero each major or minor version
13
  */
14
-#define LIBOBS_API_PATCH_VER  2
15
+#define LIBOBS_API_PATCH_VER  0
16
 
17
 #define MAKE_SEMANTIC_VERSION(major, minor, patch) \
18
                              ((major << 24) | \
19
obs-studio-17.0.2.tar.xz/libobs/obs-display.c -> obs-studio-18.0.0.tar.xz/libobs/obs-display.c Changed
10
 
1
@@ -149,7 +149,7 @@
2
 {
3
    struct vec4 clear_color;
4
 
5
-   gs_load_swapchain(display ? display->swap : NULL);
6
+   gs_load_swapchain(display->swap);
7
 
8
    if (size_changed)
9
        gs_resize(cx, cy);
10
obs-studio-17.0.2.tar.xz/libobs/obs-internal.h -> obs-studio-18.0.0.tar.xz/libobs/obs-internal.h Changed
53
 
1
@@ -277,8 +277,9 @@
2
    gs_effect_t                     *deinterlace_yadif_2x_effect;
3
 };
4
 
5
+struct audio_monitor;
6
+
7
 struct obs_core_audio {
8
-   /* TODO: sound output subsystem */
9
    audio_t                         *audio;
10
 
11
    DARRAY(struct obs_source*)      render_order;
12
@@ -290,6 +291,11 @@
13
    int                             total_buffering_ticks;
14
 
15
    float                           user_volume;
16
+
17
+   pthread_mutex_t                 monitoring_mutex;
18
+   DARRAY(struct audio_monitor*)   monitors;
19
+   char                            *monitoring_device_name;
20
+   char                            *monitoring_device_id;
21
 };
22
 
23
 /* user sources, output channels, and displays */
24
@@ -546,6 +552,7 @@
25
    volatile bool                   timing_set;
26
    volatile uint64_t               timing_adjust;
27
    uint64_t                        resample_offset;
28
+   uint64_t                        last_audio_ts;
29
    uint64_t                        next_audio_ts_min;
30
    uint64_t                        next_audio_sys_ts_min;
31
    uint64_t                        last_frame_ts;
32
@@ -661,6 +668,9 @@
33
    enum obs_transition_mode        transition_mode;
34
    enum obs_transition_scale_type  transition_scale_type;
35
    struct matrix4                  transition_matrices[2];
36
+
37
+   struct audio_monitor            *monitor;
38
+   enum obs_monitoring_type        monitoring_type;
39
 };
40
 
41
 extern const struct obs_source_info *get_source_info(const char *id);
42
@@ -679,6 +689,10 @@
43
 extern void obs_transition_save(obs_source_t *source, obs_data_t *data);
44
 extern void obs_transition_load(obs_source_t *source, obs_data_t *data);
45
 
46
+struct audio_monitor *audio_monitor_create(obs_source_t *source);
47
+void audio_monitor_reset(struct audio_monitor *monitor);
48
+extern void audio_monitor_destroy(struct audio_monitor *monitor);
49
+
50
 extern void obs_source_destroy(struct obs_source *source);
51
 
52
 enum view_type {
53
obs-studio-17.0.2.tar.xz/libobs/obs-output.c -> obs-studio-18.0.0.tar.xz/libobs/obs-output.c Changed
19
 
1
@@ -2103,3 +2103,17 @@
2
    pthread_mutex_unlock(&output->caption_mutex);
3
 }
4
 #endif
5
+
6
+float obs_output_get_congestion(obs_output_t *output)
7
+{
8
+   if (!obs_output_valid(output, "obs_output_get_congestion"))
9
+       return 0;
10
+
11
+   if (output->info.get_congestion) {
12
+       float val = output->info.get_congestion(output->context.data);
13
+       if (val < 0.0f) val = 0.0f;
14
+       else if (val > 1.0f) val = 1.0f;
15
+       return val;
16
+   }
17
+   return 0;
18
+}
19
obs-studio-17.0.2.tar.xz/libobs/obs-output.h -> obs-studio-18.0.0.tar.xz/libobs/obs-output.h Changed
10
 
1
@@ -64,6 +64,8 @@
2
 
3
    void *type_data;
4
    void (*free_type_data)(void *type_data);
5
+
6
+   float (*get_congestion)(void *data);
7
 };
8
 
9
 EXPORT void obs_register_output_s(const struct obs_output_info *info,
10
obs-studio-17.0.2.tar.xz/libobs/obs-properties.c -> obs-studio-18.0.0.tar.xz/libobs/obs-properties.c Changed
10
 
1
@@ -551,7 +551,7 @@
2
        enum obs_combo_format format)
3
 {
4
    struct list_data *data = get_list_data(p);
5
-   return (data->format == format) ? data : NULL;
6
+   return (data && data->format == format) ? data : NULL;
7
 }
8
 
9
 /* ------------------------------------------------------------------------- */
10
obs-studio-17.0.2.tar.xz/libobs/obs-scene.c -> obs-studio-18.0.0.tar.xz/libobs/obs-scene.c Changed
32
 
1
@@ -883,7 +883,7 @@
2
            uint64_t source_ts =
3
                obs_source_get_audio_timestamp(item->source);
4
 
5
-           if (!timestamp || source_ts < timestamp)
6
+           if (source_ts && (!timestamp || source_ts < timestamp))
7
                timestamp = source_ts;
8
        }
9
 
10
@@ -918,6 +918,11 @@
11
        }
12
 
13
        source_ts = obs_source_get_audio_timestamp(item->source);
14
+       if (!source_ts) {
15
+           item = item->next;
16
+           continue;
17
+       }
18
+
19
        pos = (size_t)ns_to_audio_frames(sample_rate,
20
                source_ts - timestamp);
21
        count = AUDIO_OUTPUT_FRAMES - pos;
22
@@ -1395,8 +1400,7 @@
23
 
24
    scene = item->parent;
25
 
26
-   if (scene)
27
-       full_lock(scene);
28
+   full_lock(scene);
29
 
30
    if (item->removed) {
31
        if (scene)
32
obs-studio-17.0.2.tar.xz/libobs/obs-source-deinterlace.c -> obs-studio-18.0.0.tar.xz/libobs/obs-source-deinterlace.c Changed
9
 
1
@@ -37,6 +37,7 @@
2
        if (source->async_frames.num == 2)
3
            source->async_frames.array[0]->prev_frame = true;
4
        source->deinterlace_offset = 0;
5
+       source->last_frame_ts = next_frame->timestamp;
6
        return true;
7
    }
8
 
9
obs-studio-17.0.2.tar.xz/libobs/obs-source.c -> obs-studio-18.0.0.tar.xz/libobs/obs-source.c Changed
124
 
1
@@ -503,6 +503,8 @@
2
        source->context.data = NULL;
3
    }
4
 
5
+   audio_monitor_destroy(source->monitor);
6
+
7
    obs_hotkey_unregister(source->push_to_talk_key);
8
    obs_hotkey_unregister(source->push_to_mute_key);
9
    obs_hotkey_pair_unregister(source->mute_unmute_key);
10
@@ -1050,7 +1052,7 @@
11
 }
12
 
13
 static void source_signal_audio_data(obs_source_t *source,
14
-       struct audio_data *in, bool muted)
15
+       const struct audio_data *in, bool muted)
16
 {
17
    pthread_mutex_lock(&source->audio_cb_mutex);
18
 
19
@@ -1184,6 +1186,7 @@
20
            in.timestamp = source->next_audio_ts_min;
21
    }
22
 
23
+   source->last_audio_ts = in.timestamp;
24
    source->next_audio_ts_min = in.timestamp +
25
        conv_frames_to_time(sample_rate, in.frames);
26
 
27
@@ -1226,14 +1229,16 @@
28
        source->last_sync_offset = sync_offset;
29
    }
30
 
31
-   if (push_back && source->audio_ts)
32
-       source_output_audio_push_back(source, &in);
33
-   else
34
-       source_output_audio_place(source, &in);
35
+   if (source->monitoring_type != OBS_MONITORING_TYPE_MONITOR_ONLY) {
36
+       if (push_back && source->audio_ts)
37
+           source_output_audio_push_back(source, &in);
38
+       else
39
+           source_output_audio_place(source, &in);
40
+   }
41
 
42
    pthread_mutex_unlock(&source->audio_buf_mutex);
43
 
44
-   source_signal_audio_data(source, &in, source_muted(source, os_time));
45
+   source_signal_audio_data(source, data, source_muted(source, os_time));
46
 }
47
 
48
 enum convert_type {
49
@@ -1879,10 +1884,9 @@
50
 
51
    signal_handler_signal(source->context.signals, "filter_add", &cd);
52
 
53
-   if (source && filter)
54
-       blog(LOG_DEBUG, "- filter '%s' (%s) added to source '%s'",
55
-               filter->context.name, filter->info.id,
56
-               source->context.name);
57
+   blog(LOG_DEBUG, "- filter '%s' (%s) added to source '%s'",
58
+           filter->context.name, filter->info.id,
59
+           source->context.name);
60
 }
61
 
62
 static bool obs_source_filter_remove_refless(obs_source_t *source,
63
@@ -1915,10 +1919,9 @@
64
 
65
    signal_handler_signal(source->context.signals, "filter_remove", &cd);
66
 
67
-   if (source && filter)
68
-       blog(LOG_DEBUG, "- filter '%s' (%s) removed from source '%s'",
69
-               filter->context.name, filter->info.id,
70
-               source->context.name);
71
+   blog(LOG_DEBUG, "- filter '%s' (%s) removed from source '%s'",
72
+           filter->context.name, filter->info.id,
73
+           source->context.name);
74
 
75
    if (filter->info.filter_remove)
76
        filter->info.filter_remove(filter->context.data,
77
@@ -2513,6 +2516,7 @@
78
            next_frame = source->async_frames.array[0];
79
        }
80
 
81
+       source->last_frame_ts = next_frame->timestamp;
82
        return true;
83
    }
84
 
85
@@ -3890,3 +3894,38 @@
86
    da_erase_item(source->audio_cb_list, &info);
87
    pthread_mutex_unlock(&source->audio_cb_mutex);
88
 }
89
+
90
+void obs_source_set_monitoring_type(obs_source_t *source,
91
+       enum obs_monitoring_type type)
92
+{
93
+   bool was_on;
94
+   bool now_on;
95
+
96
+   if (!obs_source_valid(source, "obs_source_set_monitoring_type"))
97
+       return;
98
+   if (source->info.output_flags & OBS_SOURCE_DO_NOT_MONITOR)
99
+       return;
100
+   if (source->monitoring_type == type)
101
+       return;
102
+
103
+   was_on = source->monitoring_type != OBS_MONITORING_TYPE_NONE;
104
+   now_on = type != OBS_MONITORING_TYPE_NONE;
105
+
106
+   if (was_on != now_on) {
107
+       if (!was_on) {
108
+           source->monitor = audio_monitor_create(source);
109
+       } else {
110
+           audio_monitor_destroy(source->monitor);
111
+           source->monitor = NULL;
112
+       }
113
+   }
114
+
115
+   source->monitoring_type = type;
116
+}
117
+
118
+enum obs_monitoring_type obs_source_get_monitoring_type(
119
+       const obs_source_t *source)
120
+{
121
+   return obs_source_valid(source, "obs_source_get_monitoring_type") ?
122
+       source->monitoring_type : OBS_MONITORING_TYPE_NONE;
123
+}
124
obs-studio-17.0.2.tar.xz/libobs/obs-source.h -> obs-studio-18.0.0.tar.xz/libobs/obs-source.h Changed
16
 
1
@@ -120,6 +120,14 @@
2
  */
3
 #define OBS_SOURCE_DEPRECATED (1<<8)
4
 
5
+/**
6
+ * Source cannot have its audio monitored
7
+ *
8
+ * Specifies that this source may cause a feedback loop if audio is monitored.
9
+ * This is used primarily with desktop audio capture sources.
10
+ */
11
+#define OBS_SOURCE_DO_NOT_MONITOR (1<<9)
12
+
13
 /** @} */
14
 
15
 typedef void (*obs_source_enum_proc_t)(obs_source_t *parent,
16
obs-studio-17.0.2.tar.xz/libobs/obs-windows.c -> obs-studio-18.0.0.tar.xz/libobs/obs-windows.c Changed
27
 
1
@@ -157,18 +157,20 @@
2
 
3
 static void log_available_memory(void)
4
 {
5
-   MEMORYSTATUS ms;
6
-   GlobalMemoryStatus(&ms);
7
+   MEMORYSTATUSEX ms;
8
+   ms.dwLength = sizeof(ms);
9
+
10
+   GlobalMemoryStatusEx(&ms);
11
 
12
 #ifdef _WIN64
13
    const char *note = "";
14
 #else
15
-   const char *note = " (NOTE: 2 or 4 gigs max is normal for 32bit programs)";
16
+   const char *note = " (NOTE: 32bit programs cannot use more than 3gb)";
17
 #endif
18
 
19
    blog(LOG_INFO, "Physical Memory: %luMB Total, %luMB Free%s",
20
-           (DWORD)(ms.dwTotalPhys / 1048576),
21
-           (DWORD)(ms.dwAvailPhys / 1048576),
22
+           (DWORD)(ms.ullTotalPhys / 1048576),
23
+           (DWORD)(ms.ullAvailPhys / 1048576),
24
            note);
25
 }
26
 
27
obs-studio-17.0.2.tar.xz/libobs/obs.c -> obs-studio-18.0.0.tar.xz/libobs/obs.c Changed
141
 
1
@@ -488,10 +488,22 @@
2
    struct obs_core_audio *audio = &obs->audio;
3
    int errorcode;
4
 
5
-   /* TODO: sound subsystem */
6
+   pthread_mutexattr_t attr;
7
+
8
+   pthread_mutex_init_value(&audio->monitoring_mutex);
9
+
10
+   if (pthread_mutexattr_init(&attr) != 0)
11
+       return false;
12
+   if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
13
+       return false;
14
+   if (pthread_mutex_init(&audio->monitoring_mutex, &attr) != 0)
15
+       return false;
16
 
17
    audio->user_volume    = 1.0f;
18
 
19
+   audio->monitoring_device_name = bstrdup("Default");
20
+   audio->monitoring_device_id = bstrdup("default");
21
+
22
    errorcode = audio_output_open(&audio->audio, ai);
23
    if (errorcode == AUDIO_OUTPUT_SUCCESS)
24
        return true;
25
@@ -513,6 +525,11 @@
26
    da_free(audio->render_order);
27
    da_free(audio->root_nodes);
28
 
29
+   da_free(audio->monitors);
30
+   bfree(audio->monitoring_device_name);
31
+   bfree(audio->monitoring_device_id);
32
+   pthread_mutex_destroy(&audio->monitoring_mutex);
33
+
34
    memset(audio, 0, sizeof(struct obs_core_audio));
35
 }
36
 
37
@@ -725,6 +742,8 @@
38
 {
39
    obs = bzalloc(sizeof(struct obs_core));
40
 
41
+   pthread_mutex_init_value(&obs->audio.monitoring_mutex);
42
+
43
    obs->name_store_owned = !store;
44
    obs->name_store = store ? store : profiler_name_store_create();
45
    if (!obs->name_store) {
46
@@ -908,11 +927,6 @@
47
    stop_video();
48
    obs_free_video();
49
 
50
-   if (!ovi) {
51
-       obs_free_graphics();
52
-       return OBS_VIDEO_SUCCESS;
53
-   }
54
-
55
    /* align to multiple-of-two and SSE alignment sizes */
56
    ovi->output_width  &= 0xFFFFFFFC;
57
    ovi->output_height &= 0xFFFFFFFE;
58
@@ -1454,6 +1468,7 @@
59
    uint32_t     mixers;
60
    int          di_order;
61
    int          di_mode;
62
+   int          monitoring_type;
63
 
64
    source = obs_source_create(id, name, settings, hotkeys);
65
 
66
@@ -1505,6 +1520,10 @@
67
    obs_source_set_deinterlace_field_order(source,
68
            (enum obs_deinterlace_field_order)di_order);
69
 
70
+   monitoring_type = (int)obs_data_get_int(source_data, "monitoring_type");
71
+   obs_source_set_monitoring_type(source,
72
+           (enum obs_monitoring_type)monitoring_type);
73
+
74
    if (filters) {
75
        size_t count = obs_data_array_count(filters);
76
 
77
@@ -1601,6 +1620,7 @@
78
    uint64_t   ptm_delay   = obs_source_get_push_to_mute_delay(source);
79
    bool       push_to_talk= obs_source_push_to_talk_enabled(source);
80
    uint64_t   ptt_delay   = obs_source_get_push_to_talk_delay(source);
81
+   int        m_type      = (int)obs_source_get_monitoring_type(source);
82
    int        di_mode     = (int)obs_source_get_deinterlace_mode(source);
83
    int        di_order    =
84
        (int)obs_source_get_deinterlace_field_order(source);
85
@@ -1630,6 +1650,7 @@
86
    obs_data_set_obj   (source_data, "hotkeys",  hotkey_data);
87
    obs_data_set_int   (source_data, "deinterlace_mode", di_mode);
88
    obs_data_set_int   (source_data, "deinterlace_field_order", di_order);
89
+   obs_data_set_int   (source_data, "monitoring_type", m_type);
90
 
91
    if (source->info.type == OBS_SOURCE_TYPE_TRANSITION)
92
        obs_transition_save(source, source_data);
93
@@ -1876,3 +1897,47 @@
94
 
95
    return !context->data;
96
 }
97
+
98
+bool obs_set_audio_monitoring_device(const char *name, const char *id)
99
+{
100
+   if (!obs || !name || !id || !*name || !*id)
101
+       return false;
102
+
103
+#ifdef _WIN32
104
+   pthread_mutex_lock(&obs->audio.monitoring_mutex);
105
+
106
+   if (strcmp(id, obs->audio.monitoring_device_id) == 0) {
107
+       pthread_mutex_unlock(&obs->audio.monitoring_mutex);
108
+       return true;
109
+   }
110
+
111
+   if (obs->audio.monitoring_device_name)
112
+       bfree(obs->audio.monitoring_device_name);
113
+   if (obs->audio.monitoring_device_id)
114
+       bfree(obs->audio.monitoring_device_id);
115
+
116
+   obs->audio.monitoring_device_name = bstrdup(name);
117
+   obs->audio.monitoring_device_id = bstrdup(id);
118
+
119
+   for (size_t i = 0; i < obs->audio.monitors.num; i++) {
120
+       struct audio_monitor *monitor = obs->audio.monitors.array[i];
121
+       audio_monitor_reset(monitor);
122
+   }
123
+
124
+   pthread_mutex_unlock(&obs->audio.monitoring_mutex);
125
+   return true;
126
+#else
127
+   return false;
128
+#endif
129
+}
130
+
131
+void obs_get_audio_monitoring_device(const char **name, const char **id)
132
+{
133
+   if (!obs)
134
+       return;
135
+
136
+   if (name)
137
+       *name = obs->audio.monitoring_device_name;
138
+   if (id)
139
+       *id = obs->audio.monitoring_device_id;
140
+}
141
obs-studio-17.0.2.tar.xz/libobs/obs.h -> obs-studio-18.0.0.tar.xz/libobs/obs.h Changed
44
 
1
@@ -582,6 +582,15 @@
2
 EXPORT const char *obs_obj_get_id(void *obj);
3
 EXPORT bool obs_obj_invalid(void *obj);
4
 
5
+typedef bool (*obs_enum_audio_device_cb)(void *data, const char *name,
6
+       const char *id);
7
+
8
+EXPORT void obs_enum_audio_monitoring_devices(obs_enum_audio_device_cb cb,
9
+       void *data);
10
+
11
+EXPORT bool obs_set_audio_monitoring_device(const char *name, const char *id);
12
+EXPORT void obs_get_audio_monitoring_device(const char **name, const char **id);
13
+
14
 
15
 /* ------------------------------------------------------------------------- */
16
 /* View context */
17
@@ -914,6 +923,17 @@
18
 EXPORT enum obs_deinterlace_field_order obs_source_get_deinterlace_field_order(
19
        const obs_source_t *source);
20
 
21
+enum obs_monitoring_type {
22
+   OBS_MONITORING_TYPE_NONE,
23
+   OBS_MONITORING_TYPE_MONITOR_ONLY,
24
+   OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT
25
+};
26
+
27
+EXPORT void obs_source_set_monitoring_type(obs_source_t *source,
28
+       enum obs_monitoring_type type);
29
+EXPORT enum obs_monitoring_type obs_source_get_monitoring_type(
30
+       const obs_source_t *source);
31
+
32
 /* ------------------------------------------------------------------------- */
33
 /* Functions used by sources */
34
 
35
@@ -1465,6 +1485,8 @@
36
        const char *text);
37
 #endif
38
 
39
+EXPORT float obs_output_get_congestion(obs_output_t *output);
40
+
41
 /* ------------------------------------------------------------------------- */
42
 /* Functions used by outputs */
43
 
44
obs-studio-17.0.2.tar.xz/libobs/util/config-file.c -> obs-studio-18.0.0.tar.xz/libobs/util/config-file.c Changed
201
 
1
@@ -18,6 +18,7 @@
2
 #include <stdio.h>
3
 #include <wchar.h>
4
 #include "config-file.h"
5
+#include "threading.h"
6
 #include "platform.h"
7
 #include "base.h"
8
 #include "bmem.h"
9
@@ -57,8 +58,19 @@
10
    char *file;
11
    struct darray sections; /* struct config_section */
12
    struct darray defaults; /* struct config_section */
13
+   pthread_mutex_t mutex;
14
 };
15
 
16
+static inline bool init_mutex(config_t *config)
17
+{
18
+   pthread_mutexattr_t attr;
19
+   if (pthread_mutexattr_init(&attr) != 0)
20
+       return false;
21
+   if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0)
22
+       return false;
23
+   return pthread_mutex_init(&config->mutex, &attr) == 0;
24
+}
25
+
26
 config_t *config_create(const char *file)
27
 {
28
    struct config_data *config;
29
@@ -70,6 +82,12 @@
30
    fclose(f);
31
 
32
    config = bzalloc(sizeof(struct config_data));
33
+
34
+   if (!init_mutex(config)) {
35
+       bfree(config);
36
+       return NULL;
37
+   }
38
+
39
    config->file = bstrdup(file);
40
    return config;
41
 }
42
@@ -278,6 +296,11 @@
43
    if (!*config)
44
        return CONFIG_ERROR;
45
 
46
+   if (!init_mutex(*config)) {
47
+       bfree(*config);
48
+       return CONFIG_ERROR;
49
+   }
50
+
51
    (*config)->file = bstrdup(file);
52
 
53
    errorcode = config_parse_file(&(*config)->sections, file, always_open);
54
@@ -301,6 +324,11 @@
55
    if (!*config)
56
        return CONFIG_ERROR;
57
 
58
+   if (!init_mutex(*config)) {
59
+       bfree(*config);
60
+       return CONFIG_ERROR;
61
+   }
62
+
63
    (*config)->file = NULL;
64
 
65
    lexer_init(&lex);
66
@@ -333,9 +361,13 @@
67
    dstr_init(&str);
68
    dstr_init(&tmp);
69
 
70
+   pthread_mutex_lock(&config->mutex);
71
+
72
    f = os_fopen(config->file, "wb");
73
-   if (!f)
74
+   if (!f) {
75
+       pthread_mutex_unlock(&config->mutex);
76
        return CONFIG_FILENOTFOUND;
77
+   }
78
 
79
    for (i = 0; i < config->sections.num; i++) {
80
        struct config_section *section = darray_item(
81
@@ -371,6 +403,8 @@
82
    fwrite(str.array, 1, str.len, f);
83
    fclose(f);
84
 
85
+   pthread_mutex_unlock(&config->mutex);
86
+
87
    dstr_free(&tmp);
88
    dstr_free(&str);
89
 
90
@@ -391,6 +425,8 @@
91
        return CONFIG_ERROR;
92
    }
93
 
94
+   pthread_mutex_lock(&config->mutex);
95
+
96
    dstr_copy(&temp_file, config->file);
97
    if (*temp_ext != '.')
98
        dstr_cat(&temp_file, ".");
99
@@ -419,6 +455,7 @@
100
    os_rename(temp_file.array, file);
101
 
102
 cleanup:
103
+   pthread_mutex_unlock(&config->mutex);
104
    dstr_free(&temp_file);
105
    dstr_free(&backup_file);
106
    return ret;
107
@@ -442,6 +479,7 @@
108
    darray_free(&config->defaults);
109
    darray_free(&config->sections);
110
    bfree(config->file);
111
+   pthread_mutex_destroy(&config->mutex);
112
    bfree(config);
113
 }
114
 
115
@@ -453,14 +491,20 @@
116
 const char *config_get_section(config_t *config, size_t idx)
117
 {
118
    struct config_section *section;
119
+   const char *name = NULL;
120
+
121
+   pthread_mutex_lock(&config->mutex);
122
 
123
    if (idx >= config->sections.num)
124
-       return NULL;
125
+       goto unlock;
126
 
127
    section = darray_item(sizeof(struct config_section), &config->sections,
128
            idx);
129
+   name = section->name;
130
 
131
-   return section->name;
132
+unlock:
133
+   pthread_mutex_unlock(&config->mutex);
134
+   return name;
135
 }
136
 
137
 static const struct config_item *config_find_item(const struct darray *sections,
138
@@ -487,14 +531,16 @@
139
    return NULL;
140
 }
141
 
142
-static void config_set_item(struct darray *sections, const char *section,
143
-       const char *name, char *value)
144
+static void config_set_item(config_t *config, struct darray *sections,
145
+       const char *section, const char *name, char *value)
146
 {
147
    struct config_section *sec = NULL;
148
    struct config_section *array = sections->array;
149
    struct config_item *item;
150
    size_t i, j;
151
 
152
+   pthread_mutex_lock(&config->mutex);
153
+
154
    for (i = 0; i < sections->num; i++) {
155
        struct config_section *cur_sec = array+i;
156
        struct config_item *items = cur_sec->items.array;
157
@@ -506,7 +552,7 @@
158
                if (astrcmpi(item->name, name) == 0) {
159
                    bfree(item->value);
160
                    item->value = value;
161
-                   return;
162
+                   goto unlock;
163
                }
164
            }
165
 
166
@@ -524,6 +570,9 @@
167
    item = darray_push_back_new(sizeof(struct config_item), &sec->items);
168
    item->name  = bstrdup(name);
169
    item->value = value;
170
+
171
+unlock:
172
+   pthread_mutex_unlock(&config->mutex);
173
 }
174
 
175
 void config_set_string(config_t *config, const char *section,
176
@@ -531,7 +580,8 @@
177
 {
178
    if (!value)
179
        value = "";
180
-   config_set_item(&config->sections, section, name, bstrdup(value));
181
+   config_set_item(config, &config->sections, section, name,
182
+           bstrdup(value));
183
 }
184
 
185
 void config_set_int(config_t *config, const char *section,
186
@@ -540,7 +590,7 @@
187
    struct dstr str;
188
    dstr_init(&str);
189
    dstr_printf(&str, "%"PRId64, value);
190
-   config_set_item(&config->sections, section, name, str.array);
191
+   config_set_item(config, &config->sections, section, name, str.array);
192
 }
193
 
194
 void config_set_uint(config_t *config, const char *section,
195
@@ -549,14 +599,14 @@
196
    struct dstr str;
197
    dstr_init(&str);
198
    dstr_printf(&str, "%"PRIu64, value);
199
-   config_set_item(&config->sections, section, name, str.array);
200
+   config_set_item(config, &config->sections, section, name, str.array);
201
obs-studio-17.0.2.tar.xz/libobs/util/config-file.h -> obs-studio-18.0.0.tar.xz/libobs/util/config-file.h Changed
50
 
1
@@ -64,15 +64,15 @@
2
 EXPORT void config_set_double(config_t *config, const char *section,
3
        const char *name, double value);
4
 
5
-EXPORT const char *config_get_string(const config_t *config,
6
+EXPORT const char *config_get_string(config_t *config,
7
        const char *section, const char *name);
8
-EXPORT int64_t config_get_int(const config_t *config, const char *section,
9
+EXPORT int64_t config_get_int(config_t *config, const char *section,
10
        const char *name);
11
-EXPORT uint64_t config_get_uint(const config_t *config, const char *section,
12
+EXPORT uint64_t config_get_uint(config_t *config, const char *section,
13
        const char *name);
14
-EXPORT bool config_get_bool(const config_t *config, const char *section,
15
+EXPORT bool config_get_bool(config_t *config, const char *section,
16
        const char *name);
17
-EXPORT double config_get_double(const config_t *config, const char *section,
18
+EXPORT double config_get_double(config_t *config, const char *section,
19
        const char *name);
20
 
21
 EXPORT bool config_remove_value(config_t *config, const char *section,
22
@@ -107,20 +107,20 @@
23
 
24
 /* These functions allow you to get the current default values rather than get
25
  * the actual values.  Probably almost never really needed */
26
-EXPORT const char *config_get_default_string(const config_t *config,
27
+EXPORT const char *config_get_default_string(config_t *config,
28
        const char *section, const char *name);
29
-EXPORT int64_t config_get_default_int(const config_t *config,
30
+EXPORT int64_t config_get_default_int(config_t *config,
31
        const char *section, const char *name);
32
-EXPORT uint64_t config_get_default_uint(const config_t *config,
33
+EXPORT uint64_t config_get_default_uint(config_t *config,
34
        const char *section, const char *name);
35
-EXPORT bool config_get_default_bool(const config_t *config,
36
+EXPORT bool config_get_default_bool(config_t *config,
37
        const char *section, const char *name);
38
-EXPORT double config_get_default_double(const config_t *config,
39
+EXPORT double config_get_default_double(config_t *config,
40
        const char *section, const char *name);
41
 
42
-EXPORT bool config_has_user_value(const config_t *config,
43
+EXPORT bool config_has_user_value(config_t *config,
44
        const char *section, const char *name);
45
-EXPORT bool config_has_default_value(const config_t *config,
46
+EXPORT bool config_has_default_value(config_t *config,
47
        const char *section, const char *name);
48
 
49
 #ifdef __cplusplus
50
obs-studio-17.0.2.tar.xz/plugins/CMakeLists.txt -> obs-studio-18.0.0.tar.xz/plugins/CMakeLists.txt Changed
14
 
1
@@ -55,6 +55,12 @@
2
            message(STATUS "obs-browser submodule not found!  Please fetch submodules.  obs-browser plugin disabled.")
3
        endif()
4
    endif()
5
+
6
+   if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/obs-vst/CMakeLists.txt")
7
+       add_subdirectory(obs-vst)
8
+   else()
9
+       message(STATUS "obs-vst submodule not found!  Please fetch/update submodules.  obs-vst plugin disabled.")
10
+   endif()
11
 endif()
12
 
13
 add_subdirectory(image-source)
14
obs-studio-17.0.2.tar.xz/plugins/enc-amf/CMakeLists.txt -> obs-studio-18.0.0.tar.xz/plugins/enc-amf/CMakeLists.txt Changed
10
 
1
@@ -37,7 +37,7 @@
2
 SET(enc-amf_VERSION_MAJOR 1)
3
 SET(enc-amf_VERSION_MINOR 4)
4
 SET(enc-amf_VERSION_PATCH 3)
5
-SET(enc-amf_VERSION_BUILD 8)
6
+SET(enc-amf_VERSION_BUILD 10)
7
 configure_file(
8
    "${PROJECT_SOURCE_DIR}/#Resources/package.in.bat"
9
    "${PROJECT_SOURCE_DIR}/#Resources/package.bat"
10
obs-studio-17.0.2.tar.xz/plugins/enc-amf/Include/plugin.h -> obs-studio-18.0.0.tar.xz/plugins/enc-amf/Include/plugin.h Changed
23
 
1
@@ -57,7 +57,7 @@
2
 #define clamp(val,low,high) (val > high ? high : (val < low ? low : val))
3
 
4
 #include "Version.h"
5
-#define PLUGIN_VERSION_FULL                (((uint64_t)PLUGIN_VERSION_MAJOR << 48ull) | ((uint64_t)PLUGIN_VERSION_MINOR << 32ull) | ((uint64_t)PLUGIN_VERSION_PATCH) | ((uint64_t)PLUGIN_VERSION_BUILD))
6
+#define PLUGIN_VERSION_FULL                (((uint64_t)PLUGIN_VERSION_MAJOR << 48ull) | ((uint64_t)PLUGIN_VERSION_MINOR << 32ull) | ((uint64_t)PLUGIN_VERSION_PATCH) << 16ul | ((uint64_t)PLUGIN_VERSION_BUILD))
7
 #define PLUGIN_VERSION_TEXT                vstr(PLUGIN_VERSION_MAJOR) "." vstr(PLUGIN_VERSION_MINOR) "." vstr(PLUGIN_VERSION_PATCH) "." vstr(PLUGIN_VERSION_BUILD)
8
 
9
 #define AMF_LOG(level, format, ...)        blog(level, "[AMF Encoder] " format, ##__VA_ARGS__);
10
@@ -67,6 +67,12 @@
11
 #define AMF_LOG_CONFIG(format, ...)        AMF_LOG(350,         format, ##__VA_ARGS__)
12
 #define AMF_LOG_DEBUG(format, ...)     AMF_LOG(LOG_DEBUG,   format, ##__VA_ARGS__)
13
 
14
+#define ThrowException(format, ...) {\
15
+   std::vector<char> _throwexceptionwithamferror_buf(8192);\
16
+   sprintf_s(_throwexceptionwithamferror_buf.data(), _throwexceptionwithamferror_buf.size(), format, ##__VA_ARGS__);\
17
+   AMF_LOG_WARNING("%s", _throwexceptionwithamferror_buf.data()); \
18
+   throw std::exception(_throwexceptionwithamferror_buf.data()); \
19
+}
20
 #define ThrowExceptionWithAMFError(format, res, ...) {\
21
    std::vector<char> _throwexceptionwithamferror_buf(8192);\
22
    sprintf_s(_throwexceptionwithamferror_buf.data(), _throwexceptionwithamferror_buf.size(), format, ##__VA_ARGS__, Plugin::AMD::AMF::GetInstance()->GetTrace()->GetResultText(res), res);\
23
obs-studio-17.0.2.tar.xz/plugins/enc-amf/Source/amf.cpp -> obs-studio-18.0.0.tar.xz/plugins/enc-amf/Source/amf.cpp Changed
35
 
1
@@ -134,7 +134,7 @@
2
    m_AMFVersion_Compiler = AMF_FULL_VERSION;
3
    res = AMFQueryVersion(&m_AMFVersion_Runtime);
4
    if (res != AMF_OK)
5
-       ThrowExceptionWithAMFError("<" __FUNCTION_NAME__ "> Querying Version failed with error %ls (code %ld).", res);
6
+       ThrowException("<" __FUNCTION_NAME__ "> Querying Version failed with error code %ld.", res);
7
    #pragma endregion Query AMF Runtime Version
8
 
9
        /// Find Function for Initializing AMF.
10
@@ -147,21 +147,20 @@
11
    } else {
12
        res = AMFInit(m_AMFVersion_Runtime, &m_AMFFactory);
13
        if (res != AMF_OK)
14
-           ThrowExceptionWithAMFError("<" __FUNCTION_NAME__ "> Initializing AMF Library failed with error %ls (code %ld).", res);
15
+           ThrowException("<" __FUNCTION_NAME__ "> Initializing AMF Library failed with error code %ld.", res);
16
    }
17
    AMF_LOG_DEBUG("<" __FUNCTION_NAME__ "> AMF Library initialized.");
18
 
19
    /// Retrieve Trace Object.
20
    res = m_AMFFactory->GetTrace(&m_AMFTrace);
21
    if (res != AMF_OK) {
22
-       ThrowExceptionWithAMFError("<" __FUNCTION_NAME__ "> Retrieving Trace object failed with error %ls (code %ld).", res);
23
+       ThrowException("<" __FUNCTION_NAME__ "> Retrieving Trace object failed with error code %ld.", res);
24
    }
25
 
26
    /// Retrieve Debug Object.
27
    res = m_AMFFactory->GetDebug(&m_AMFDebug);
28
    if (res != AMF_OK) {
29
-       AMF_LOG_ERROR("<" __FUNCTION_NAME__ "> Retrieving Debug object failed with error code %ls (code %ld).", res);
30
-       throw std::exception("", res);
31
+       ThrowExceptionWithAMFError("<" __FUNCTION_NAME__ "> Retrieving Debug object failed with error code %ls (code %ld).", res);
32
    }
33
 
34
    /// Register Trace Writer and disable Debug Tracing.
35
obs-studio-17.0.2.tar.xz/plugins/enc-amf/Source/enc-h264.cpp -> obs-studio-18.0.0.tar.xz/plugins/enc-amf/Source/enc-h264.cpp Changed
10
 
1
@@ -241,7 +241,7 @@
2
    obs_data_set_int(data, "last" vstr(AMF_H264_VIEW), -1);
3
    obs_data_set_default_int(data, AMF_H264_VIEW, static_cast<int32_t>(ViewMode::Basic));
4
    obs_data_set_default_bool(data, AMF_H264_DEBUG, false);
5
-   obs_data_set_default_int(data, AMF_H264_VERSION, 0x0001000400030005ull);
6
+   obs_data_set_default_int(data, AMF_H264_VERSION, PLUGIN_VERSION_FULL);
7
 }
8
 
9
 static void fill_api_list(obs_property_t* p) {
10
obs-studio-17.0.2.tar.xz/plugins/image-source/CMakeLists.txt -> obs-studio-18.0.0.tar.xz/plugins/image-source/CMakeLists.txt Changed
9
 
1
@@ -7,6 +7,7 @@
2
 
3
 set(image-source_SOURCES
4
    image-source.c
5
+   color-source.c
6
    obs-slideshow.c)
7
 
8
 add_library(image-source MODULE
9
obs-studio-18.0.0.tar.xz/plugins/image-source/color-source.c Added
122
 
1
@@ -0,0 +1,120 @@
2
+#include <obs-module.h>
3
+
4
+struct color_source {
5
+   uint32_t color;
6
+
7
+   uint32_t width;
8
+   uint32_t height;
9
+
10
+   obs_source_t *src;
11
+};
12
+
13
+static const char *color_source_get_name(void *unused)
14
+{
15
+   UNUSED_PARAMETER(unused);
16
+   return obs_module_text("ColorSource");
17
+}
18
+
19
+static void color_source_update(void *data, obs_data_t *settings)
20
+{
21
+   struct color_source *context = data;
22
+   uint32_t color = (uint32_t)obs_data_get_int(settings, "color");
23
+   uint32_t width = (uint32_t)obs_data_get_int(settings, "width");
24
+   uint32_t height = (uint32_t)obs_data_get_int(settings, "height");
25
+
26
+   context->color = color;
27
+   context->width = width;
28
+   context->height = height;
29
+}
30
+
31
+static void *color_source_create(obs_data_t *settings, obs_source_t *source)
32
+{
33
+   UNUSED_PARAMETER(source);
34
+
35
+   struct color_source *context = bzalloc(sizeof(struct color_source));
36
+   context->src = source;
37
+
38
+   color_source_update(context, settings);
39
+
40
+   return context;
41
+}
42
+
43
+static void color_source_destroy(void *data)
44
+{
45
+   bfree(data);
46
+}
47
+
48
+static obs_properties_t *color_source_properties(void *unused)
49
+{
50
+   UNUSED_PARAMETER(unused);
51
+
52
+   obs_properties_t *props = obs_properties_create();
53
+
54
+   obs_properties_add_color(props, "color",
55
+       obs_module_text("ColorSource.Color"));
56
+
57
+   obs_properties_add_int(props, "width",
58
+       obs_module_text("ColorSource.Width"), 0, 4096, 1);
59
+
60
+   obs_properties_add_int(props, "height",
61
+       obs_module_text("ColorSource.Height"), 0, 4096, 1);
62
+
63
+   return props;
64
+}
65
+
66
+static void color_source_render(void *data, gs_effect_t *effect)
67
+{
68
+   UNUSED_PARAMETER(effect);
69
+
70
+   struct color_source *context = data;
71
+
72
+   gs_effect_t    *solid = obs_get_base_effect(OBS_EFFECT_SOLID);
73
+   gs_eparam_t    *color = gs_effect_get_param_by_name(solid, "color");
74
+   gs_technique_t *tech  = gs_effect_get_technique(solid, "Solid");
75
+
76
+   struct vec4 colorVal;
77
+   vec4_from_rgba(&colorVal, context->color);
78
+   gs_effect_set_vec4(color, &colorVal);
79
+
80
+   gs_technique_begin(tech);
81
+   gs_technique_begin_pass(tech, 0);
82
+
83
+   gs_draw_sprite(0, 0, context->width, context->height);
84
+
85
+   gs_technique_end_pass(tech);
86
+   gs_technique_end(tech);
87
+}
88
+
89
+static uint32_t color_source_getwidth(void *data)
90
+{
91
+   struct color_source *context = data;
92
+   return context->width;
93
+}
94
+
95
+static uint32_t color_source_getheight(void *data)
96
+{
97
+   struct color_source *context = data;
98
+   return context->height;
99
+}
100
+
101
+static void color_source_defaults(obs_data_t *settings)
102
+{
103
+   obs_data_set_default_int(settings, "color", 0xFFFFFFFF);
104
+   obs_data_set_default_int(settings, "width", 400);
105
+   obs_data_set_default_int(settings, "height", 400);
106
+}
107
+
108
+struct obs_source_info color_source_info = {
109
+   .id             = "color_source",
110
+   .type           = OBS_SOURCE_TYPE_INPUT,
111
+   .output_flags   = OBS_SOURCE_VIDEO | OBS_SOURCE_CUSTOM_DRAW,
112
+   .create         = color_source_create,
113
+   .destroy        = color_source_destroy,
114
+   .update         = color_source_update,
115
+   .get_name       = color_source_get_name,
116
+   .get_defaults   = color_source_defaults,
117
+   .get_width      = color_source_getwidth,
118
+   .get_height     = color_source_getheight,
119
+   .video_render   = color_source_render,
120
+   .get_properties = color_source_properties
121
+};
122
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/ar-SA.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/ar-SA.ini Changed
6
 
1
@@ -3,3 +3,4 @@
2
 UnloadWhenNotShowing="إلغاء تحميل الصورة إذا لم تظهر"
3
 
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/bg-BG.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/bg-BG.ini Changed
6
 
1
@@ -2,3 +2,4 @@
2
 File="Файл с изображение"
3
 
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/ca-ES.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/ca-ES.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="De cop"
3
 SlideShow.Transition.Slide="Diapositiva"
4
 
5
+ColorSource="Origen del color"
6
+ColorSource.Color="Color"
7
+ColorSource.Width="Amplada"
8
+ColorSource.Height="Alçada"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/cs-CZ.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/cs-CZ.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Tažení"
3
 SlideShow.Transition.Slide="Sklouznutí"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/da-DK.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/da-DK.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Stryg"
3
 SlideShow.Transition.Slide="Glide"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/de-DE.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/de-DE.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="Swipe"
3
 SlideShow.Transition.Slide="Slide"
4
 
5
+ColorSource="Farbquelle"
6
+ColorSource.Color="Farbe"
7
+ColorSource.Width="Breite"
8
+ColorSource.Height="Höhe"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/el-GR.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/el-GR.ini Changed
6
 
1
@@ -4,3 +4,4 @@
2
 
3
 SlideShow.Files="Αρχεία φωτογραφίας"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/en-US.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/en-US.ini Changed
10
 
1
@@ -12,3 +12,8 @@
2
 SlideShow.Transition.Fade="Fade"
3
 SlideShow.Transition.Swipe="Swipe"
4
 SlideShow.Transition.Slide="Slide"
5
+
6
+ColorSource="Color Source"
7
+ColorSource.Color="Color"
8
+ColorSource.Width="Width"
9
+ColorSource.Height="Height"
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/es-ES.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/es-ES.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="Deslizar Rapido"
3
 SlideShow.Transition.Slide="Deslizar"
4
 
5
+ColorSource="Origen de color"
6
+ColorSource.Color="Color"
7
+ColorSource.Width="Ancho"
8
+ColorSource.Height="Alto"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/eu-ES.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/eu-ES.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="Korritu"
3
 SlideShow.Transition.Slide="Irristatu"
4
 
5
+ColorSource="Kolorearen iturburua"
6
+ColorSource.Color="Kolorea"
7
+ColorSource.Width="Zabalera"
8
+ColorSource.Height="Altuera"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/fi-FI.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/fi-FI.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="Pyyhkäise"
3
 SlideShow.Transition.Slide="Liu'uta"
4
 
5
+ColorSource="Värilähde"
6
+ColorSource.Color="Väri"
7
+ColorSource.Width="Leveys"
8
+ColorSource.Height="Korkeus"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/fr-FR.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/fr-FR.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Balayage"
3
 SlideShow.Transition.Slide="Glissement"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/gl-ES.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/gl-ES.ini Changed
6
 
1
@@ -3,3 +3,4 @@
2
 UnloadWhenNotShowing="Non descargar a imaxe cando non se mostre"
3
 
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/he-IL.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/he-IL.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="החלקה"
3
 SlideShow.Transition.Slide="הסט"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/hr-HR.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/hr-HR.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Prevlačenje"
3
 SlideShow.Transition.Slide="Klizanje"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/hu-HU.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/hu-HU.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="Lapozás"
3
 SlideShow.Transition.Slide="Csúsztatás"
4
 
5
+ColorSource="Színforrás"
6
+ColorSource.Color="Szín"
7
+ColorSource.Width="Szélesség"
8
+ColorSource.Height="Magasság"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/it-IT.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/it-IT.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Scorri"
3
 SlideShow.Transition.Slide="Scivola"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/ja-JP.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/ja-JP.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="スワイプ"
3
 SlideShow.Transition.Slide="スライド"
4
 
5
+ColorSource="色ソース"
6
+ColorSource.Color="色"
7
+ColorSource.Width="幅"
8
+ColorSource.Height="高さ"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/ko-KR.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/ko-KR.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="밀어내기"
3
 SlideShow.Transition.Slide="슬라이드"
4
 
5
+ColorSource="색상 소스"
6
+ColorSource.Color="색상"
7
+ColorSource.Width="너비"
8
+ColorSource.Height="높이"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/ms-MY.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/ms-MY.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Sapu"
3
 SlideShow.Transition.Slide="Slaid"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/nb-NO.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/nb-NO.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Sveip"
3
 SlideShow.Transition.Slide="Skyv"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/nl-NL.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/nl-NL.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Vegen"
3
 SlideShow.Transition.Slide="Slide"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/pl-PL.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/pl-PL.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="Przeciągnięcie"
3
 SlideShow.Transition.Slide="Przesunięcie"
4
 
5
+ColorSource="Kolor"
6
+ColorSource.Color="Kolor"
7
+ColorSource.Width="Szerokość"
8
+ColorSource.Height="Wysokość"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/pt-BR.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/pt-BR.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Arrastar"
3
 SlideShow.Transition.Slide="Deslizar"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/pt-PT.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/pt-PT.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Deslizar"
3
 SlideShow.Transition.Slide="Deslize"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/ro-RO.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/ro-RO.ini Changed
13
 
1
@@ -2,4 +2,11 @@
2
 File="Fișier imagine"
3
 UnloadWhenNotShowing="Eliberează din memorie imaginea când nu este afișată"
4
 
5
+SlideShow="Slide Show de imagini"
6
+SlideShow.TransitionSpeed="Viteza de tranziție (milisecunde)"
7
+SlideShow.SlideTime="Timpul dintre diapozitive (milisecunde)"
8
+SlideShow.Transition="Tranziție"
9
+SlideShow.Transition.Cut="Decupare"
10
+SlideShow.Transition.Slide="Diapozitiv"
11
+
12
 
13
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/ru-RU.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/ru-RU.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="Перемещение"
3
 SlideShow.Transition.Slide="Сдвиг"
4
 
5
+ColorSource="Фоновый цвет"
6
+ColorSource.Color="Цвет"
7
+ColorSource.Width="Ширина"
8
+ColorSource.Height="Высота"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/sk-SK.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/sk-SK.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Potiahnite"
3
 SlideShow.Transition.Slide="Posunutie"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/sl-SI.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/sl-SI.ini Changed
6
 
1
@@ -3,3 +3,4 @@
2
 UnloadWhenNotShowing="Ne naloži slike, ko ni prikazana"
3
 
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/sr-CS.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/sr-CS.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Prevlačenje"
3
 SlideShow.Transition.Slide="Klizanje"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/sr-SP.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/sr-SP.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Превлачење"
3
 SlideShow.Transition.Slide="Клизање"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/sv-SE.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/sv-SE.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="Svep"
3
 SlideShow.Transition.Slide="Glid"
4
 
5
+ColorSource="Färgkälla"
6
+ColorSource.Color="Färg"
7
+ColorSource.Width="Bredd"
8
+ColorSource.Height="Höjd"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/th-TH.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/th-TH.ini Changed
6
 
1
@@ -2,3 +2,4 @@
2
 File="ไฟล์รูปภาพ"
3
 
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/tr-TR.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/tr-TR.ini Changed
6
 
1
@@ -13,3 +13,4 @@
2
 SlideShow.Transition.Swipe="Swipe"
3
 SlideShow.Transition.Slide="Slide"
4
 
5
+
6
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/uk-UA.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/uk-UA.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="Swipe"
3
 SlideShow.Transition.Slide="Slide"
4
 
5
+ColorSource="Щільний колір"
6
+ColorSource.Color="Колір"
7
+ColorSource.Width="Ширина"
8
+ColorSource.Height="Висота"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/zh-CN.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/zh-CN.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="滑动"
3
 SlideShow.Transition.Slide="幻灯片"
4
 
5
+ColorSource="色源"
6
+ColorSource.Color="色彩"
7
+ColorSource.Width="宽度"
8
+ColorSource.Height="高度"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/data/locale/zh-TW.ini -> obs-studio-18.0.0.tar.xz/plugins/image-source/data/locale/zh-TW.ini Changed
10
 
1
@@ -13,3 +13,8 @@
2
 SlideShow.Transition.Swipe="滑出"
3
 SlideShow.Transition.Slide="推出"
4
 
5
+ColorSource="色彩來源"
6
+ColorSource.Color="色彩"
7
+ColorSource.Width="寬度"
8
+ColorSource.Height="高度"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/image-source/image-source.c -> obs-studio-18.0.0.tar.xz/plugins/image-source/image-source.c Changed
14
 
1
@@ -270,10 +270,12 @@
2
 OBS_MODULE_USE_DEFAULT_LOCALE("image-source", "en-US")
3
 
4
 extern struct obs_source_info slideshow_info;
5
+extern struct obs_source_info color_source_info;
6
 
7
 bool obs_module_load(void)
8
 {
9
    obs_register_source(&image_source_info);
10
+   obs_register_source(&color_source_info);
11
    obs_register_source(&slideshow_info);
12
    return true;
13
 }
14
obs-studio-17.0.2.tar.xz/plugins/linux-pulseaudio/pulse-input.c -> obs-studio-18.0.0.tar.xz/plugins/linux-pulseaudio/pulse-input.c Changed
11
 
1
@@ -537,7 +537,8 @@
2
    .id             = "pulse_output_capture",
3
    .type           = OBS_SOURCE_TYPE_INPUT,
4
    .output_flags   = OBS_SOURCE_AUDIO |
5
-                     OBS_SOURCE_DO_NOT_DUPLICATE,
6
+                     OBS_SOURCE_DO_NOT_DUPLICATE |
7
+                     OBS_SOURCE_DO_NOT_MONITOR,
8
    .get_name       = pulse_output_getname,
9
    .create         = pulse_create,
10
    .destroy        = pulse_destroy,
11
obs-studio-17.0.2.tar.xz/plugins/mac-capture/mac-audio.c -> obs-studio-18.0.0.tar.xz/plugins/mac-capture/mac-audio.c Changed
11
 
1
@@ -797,7 +797,8 @@
2
    .id             = "coreaudio_output_capture",
3
    .type           = OBS_SOURCE_TYPE_INPUT,
4
    .output_flags   = OBS_SOURCE_AUDIO |
5
-                     OBS_SOURCE_DO_NOT_DUPLICATE,
6
+                     OBS_SOURCE_DO_NOT_DUPLICATE |
7
+                     OBS_SOURCE_DO_NOT_MONITOR,
8
    .get_name       = coreaudio_output_getname,
9
    .create         = coreaudio_create_output_capture,
10
    .destroy        = coreaudio_destroy,
11
obs-studio-17.0.2.tar.xz/plugins/mac-vth264/data/locale/da-DK.ini -> obs-studio-18.0.0.tar.xz/plugins/mac-vth264/data/locale/da-DK.ini Changed
9
 
1
@@ -7,6 +7,7 @@
2
 MaxBitrateWindow="Maks. bit-hastighedsvindue (sekunder)"
3
 KeyframeIntervalSec="Keyframe interval (sekunder, 0= auto)"
4
 Profile="Profil"
5
+None="(ingen)"
6
 DefaultEncoder="(Standard Encoder)"
7
 UseBFrames="Benyt B-frames"
8
 
9
obs-studio-17.0.2.tar.xz/plugins/obs-browser/CMakeLists.txt -> obs-studio-18.0.0.tar.xz/plugins/obs-browser/CMakeLists.txt Changed
19
 
1
@@ -293,7 +293,7 @@
2
 
3
    add_custom_command(TARGET cef-isolation
4
        # Disable taskbar visibility
5
-       COMMAND defaults write "$<TARGET_FILE_DIR:cef-isolation>/../Info.plist" "LSUIElement" true
6
+       COMMAND defaults write "$<TARGET_FILE_DIR:cef-isolation>/../Info.plist" "LSUIElement" 1
7
        )
8
 
9
    add_custom_command(TARGET cef-bootstrap POST_BUILD
10
@@ -301,7 +301,7 @@
11
        COMMAND install_name_tool -change "@executable_path/Chromium Embedded Framework" "@rpath/Chromium Embedded Framework.framework/Chromium Embedded Framework" "$<TARGET_FILE:cef-bootstrap>"
12
        
13
        # Disable taskbar visibility
14
-       COMMAND defaults write "$<TARGET_FILE_DIR:cef-bootstrap>/../Info.plist" "LSUIElement" true
15
+       COMMAND defaults write "$<TARGET_FILE_DIR:cef-bootstrap>/../Info.plist" "LSUIElement" 1
16
        )
17
 
18
    add_custom_command(TARGET cef-isolation POST_BUILD
19
obs-studio-17.0.2.tar.xz/plugins/obs-browser/obs-browser/browser-manager-base.cpp -> obs-studio-18.0.0.tar.xz/plugins/obs-browser/obs-browser/browser-manager-base.cpp Changed
61
 
1
@@ -107,13 +107,15 @@
2
 BrowserManager::Impl::Impl()
3
 {
4
    os_event_init(&dispatchEvent, OS_EVENT_TYPE_AUTO);
5
+   os_event_init(&startupEvent, OS_EVENT_TYPE_MANUAL);
6
    pthread_mutex_init(&dispatchLock, nullptr);
7
 }
8
 
9
 BrowserManager::Impl::~Impl()
10
 {
11
-   os_event_init(&dispatchEvent, OS_EVENT_TYPE_AUTO);
12
-   pthread_mutex_init(&dispatchLock, nullptr);
13
+   pthread_mutex_destroy(&dispatchLock);
14
+   os_event_destroy(startupEvent);
15
+   os_event_destroy(dispatchEvent);
16
 }
17
 
18
 int BrowserManager::Impl::CreateBrowser(
19
@@ -124,6 +126,8 @@
20
    os_event_t *createdEvent;
21
    os_event_init(&createdEvent, OS_EVENT_TYPE_AUTO);
22
 
23
+   os_event_wait(startupEvent);
24
+
25
    BrowserOBSBridge *browserOBSBridge = new BrowserOBSBridgeBase();
26
 
27
    CefPostTask(TID_UI, BrowserTask::newTask(
28
@@ -366,6 +370,7 @@
29
 void
30
 BrowserManager::Impl::Startup() 
31
 {
32
+   pthread_mutex_lock(&dispatchLock);
33
    int ret = pthread_create(&managerThread, nullptr,
34
        browserManagerEntry, this);
35
    
36
@@ -378,6 +383,7 @@
37
    else {
38
        threadAlive = true;
39
    }
40
+   pthread_mutex_unlock(&dispatchLock);
41
        
42
    return;
43
 }
44
@@ -435,7 +441,7 @@
45
 {
46
    std::string bootstrapPath = getBootstrap();
47
    bool thread_exit = false;
48
-   PushEvent([] {
49
+   PushEvent([this] {
50
        CefMainArgs mainArgs;
51
        CefSettings settings;
52
        settings.log_severity = LOGSEVERITY_VERBOSE;
53
@@ -447,6 +453,7 @@
54
        CefExecuteProcess(mainArgs, app, nullptr);
55
        CefInitialize(mainArgs, settings, app, nullptr);
56
        CefRegisterSchemeHandlerFactory("http", "absolute", new BrowserSchemeHandlerFactory());
57
+       os_event_signal(startupEvent);
58
        CefRunMessageLoop();
59
        CefShutdown();
60
    });
61
obs-studio-17.0.2.tar.xz/plugins/obs-browser/obs-browser/browser-manager-base.hpp -> obs-studio-18.0.0.tar.xz/plugins/obs-browser/obs-browser/browser-manager-base.hpp Changed
15
 
1
@@ -73,10 +73,11 @@
2
 private:
3
    bool threadAlive;
4
    os_event_t *dispatchEvent;
5
+   os_event_t *startupEvent;
6
    pthread_t managerThread;
7
    pthread_mutex_t dispatchLock;
8
 
9
    std::map<int, std::shared_ptr<BrowserListener>> listenerMap;
10
    std::map<int, CefRefPtr<CefBrowser> > browserMap;
11
    std::vector<std::function<void()>> queue;
12
-};
13
\ No newline at end of file
14
+};
15
obs-studio-17.0.2.tar.xz/plugins/obs-browser/shared/browser-version.h -> obs-studio-18.0.0.tar.xz/plugins/obs-browser/shared/browser-version.h Changed
8
 
1
@@ -1,3 +1,3 @@
2
 #pragma once
3
 
4
-#define OBS_BROWSER_VERSION "1.27.0"
5
\ No newline at end of file
6
+#define OBS_BROWSER_VERSION "1.28.0"
7
\ No newline at end of file
8
obs-studio-17.0.2.tar.xz/plugins/obs-ffmpeg/data/locale/pt-BR.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-ffmpeg/data/locale/pt-BR.ini Changed
16
 
1
@@ -6,6 +6,7 @@
2
 KeyframeIntervalSec="Intervalo de Keyframe (segundos, 0=auto)"
3
 Lossless="Sem perdas"
4
 
5
+BFrames="B-frames"
6
 
7
 NVENC.Use2Pass="Utilizar a codificação em dois passos"
8
 NVENC.Preset.default="Padrão"
9
@@ -48,4 +49,6 @@
10
 MediaFileFilter.AudioFiles="Arquivos de Áudio"
11
 MediaFileFilter.AllFiles="Todos os Arquivos"
12
 
13
+ReplayBuffer="Buffer do Replay"
14
+ReplayBuffer.Save="Salvar Replay"
15
 
16
obs-studio-17.0.2.tar.xz/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c -> obs-studio-18.0.0.tar.xz/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c Changed
11
 
1
@@ -355,7 +355,8 @@
2
 
3
 static bool init_streams(struct ffmpeg_mux *ffm)
4
 {
5
-   create_video_stream(ffm);
6
+   if (ffm->params.has_video)
7
+       create_video_stream(ffm);
8
 
9
    if (ffm->params.tracks) {
10
        ffm->audio_streams =
11
obs-studio-17.0.2.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-mux.c -> obs-studio-18.0.0.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-mux.c Changed
43
 
1
@@ -145,7 +145,7 @@
2
    obs_data_release(settings);
3
 
4
    dstr_catf(cmd, "%s %d %d %d %d %d ",
5
-           "h264",
6
+           obs_encoder_get_codec(vencoder),
7
            bitrate,
8
            obs_output_get_width(stream->output),
9
            obs_output_get_height(stream->output),
10
@@ -485,12 +485,22 @@
11
 static bool replay_buffer_hotkey(void *data, obs_hotkey_id id,
12
        obs_hotkey_t *hotkey, bool pressed)
13
 {
14
+   UNUSED_PARAMETER(id);
15
+   UNUSED_PARAMETER(hotkey);
16
+   UNUSED_PARAMETER(pressed);
17
+
18
    struct ffmpeg_muxer *stream = data;
19
    if (os_atomic_load_bool(&stream->active))
20
        stream->save_ts = os_gettime_ns() / 1000LL;
21
    return true;
22
 }
23
 
24
+static void save_replay_proc(void *data, calldata_t *cd)
25
+{
26
+   replay_buffer_hotkey(data, 0, NULL, true);
27
+   UNUSED_PARAMETER(cd);
28
+}
29
+
30
 static void *replay_buffer_create(obs_data_t *settings, obs_output_t *output)
31
 {
32
    struct ffmpeg_muxer *stream = bzalloc(sizeof(*stream));
33
@@ -501,6 +511,9 @@
34
            obs_module_text("ReplayBuffer.Save"),
35
            replay_buffer_hotkey, stream);
36
 
37
+   proc_handler_t *ph = obs_output_get_proc_handler(output);
38
+   proc_handler_add(ph, "void save()", save_replay_proc, stream);
39
+
40
    UNUSED_PARAMETER(settings);
41
    return stream;
42
 }
43
obs-studio-17.0.2.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-output.c -> obs-studio-18.0.0.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-output.c Changed
89
 
1
@@ -36,6 +36,7 @@
2
    const char         *format_name;
3
    const char         *format_mime_type;
4
    const char         *muxer_settings;
5
+   int                gop_size;
6
    int                video_bitrate;
7
    int                audio_bitrate;
8
    const char         *video_encoder;
9
@@ -130,10 +131,12 @@
10
    return true;
11
 }
12
 
13
-static void parse_params(AVCodecContext *context, char **opts)
14
+static bool parse_params(AVCodecContext *context, char **opts)
15
 {
16
+   bool ret = true;
17
+
18
    if (!context || !context->priv_data)
19
-       return;
20
+       return true;
21
 
22
    while (*opts) {
23
        char *opt = *opts;
24
@@ -146,11 +149,16 @@
25
            *assign = 0;
26
            value = assign+1;
27
 
28
-           av_opt_set(context->priv_data, name, value, 0);
29
+           if (av_opt_set(context->priv_data, name, value, 0)) {
30
+               blog(LOG_WARNING, "Failed to set %s=%s", name, value);
31
+               ret = false;
32
+           }
33
        }
34
 
35
        opts++;
36
    }
37
+
38
+   return ret;
39
 }
40
 
41
 static bool open_video_codec(struct ffmpeg_data *data)
42
@@ -163,7 +171,9 @@
43
        av_opt_set(context->priv_data, "preset", "veryfast", 0);
44
 
45
    if (opts) {
46
-       parse_params(context, opts);
47
+       // libav requires x264 parameters in a special format which may be non-obvious
48
+       if (!parse_params(context, opts) && strcmp(data->vcodec->name, "libx264") == 0)
49
+           blog(LOG_WARNING, "If you're trying to set x264 parameters, use x264-params=name=value:name=value");
50
        strlist_free(opts);
51
    }
52
 
53
@@ -239,7 +249,7 @@
54
    context->width          = data->config.scale_width;
55
    context->height         = data->config.scale_height;
56
    context->time_base      = (AVRational){ ovi.fps_den, ovi.fps_num };
57
-   context->gop_size       = 120;
58
+   context->gop_size       = data->config.gop_size;
59
    context->pix_fmt        = closest_format;
60
    context->colorspace     = data->config.color_space;
61
    context->color_range    = data->config.color_range;
62
@@ -267,7 +277,7 @@
63
 static bool open_audio_codec(struct ffmpeg_data *data)
64
 {
65
    AVCodecContext *context = data->audio->codec;
66
-   char **opts = strlist_split(data->config.video_settings, ' ', false);
67
+   char **opts = strlist_split(data->config.audio_settings, ' ', false);
68
    int ret;
69
 
70
    if (opts) {
71
@@ -942,6 +952,9 @@
72
    int ret;
73
 
74
    settings = obs_output_get_settings(output->output);
75
+
76
+   obs_data_set_default_int(settings, "gop_size", 120);
77
+
78
    config.url = obs_data_get_string(settings, "url");
79
    config.format_name = get_string_or_null(settings, "format_name");
80
    config.format_mime_type = get_string_or_null(settings,
81
@@ -949,6 +962,7 @@
82
    config.muxer_settings = obs_data_get_string(settings, "muxer_settings");
83
    config.video_bitrate = (int)obs_data_get_int(settings, "video_bitrate");
84
    config.audio_bitrate = (int)obs_data_get_int(settings, "audio_bitrate");
85
+   config.gop_size = (int)obs_data_get_int(settings, "gop_size");
86
    config.video_encoder = get_string_or_null(settings, "video_encoder");
87
    config.video_encoder_id = (int)obs_data_get_int(settings,
88
            "video_encoder_id");
89
obs-studio-17.0.2.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-source.c -> obs-studio-18.0.0.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-source.c Changed
10
 
1
@@ -337,7 +337,7 @@
2
    obs_data_set_default_bool(settings, "clear_on_media_end", true);
3
    obs_data_set_default_bool(settings, "restart_on_activate", true);
4
    obs_data_set_default_bool(settings, "force_scale", true);
5
-#if defined(_WIN32) || defined(__APPLE__)
6
+#if defined(_WIN32)
7
    obs_data_set_default_bool(settings, "hw_decode", true);
8
 #endif
9
 }
10
obs-studio-17.0.2.tar.xz/plugins/obs-filters/CMakeLists.txt -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/CMakeLists.txt Changed
15
 
1
@@ -27,10 +27,12 @@
2
    scroll-filter.c
3
    chroma-key-filter.c
4
    color-key-filter.c
5
+   color-grade-filter.c
6
    sharpness-filter.c
7
    gain-filter.c
8
    noise-gate-filter.c
9
-   mask-filter.c)
10
+   mask-filter.c
11
+   compressor-filter.c)
12
 
13
 add_library(obs-filters MODULE
14
    ${obs-filters_SOURCES}
15
obs-studio-17.0.2.tar.xz/plugins/obs-filters/color-correction-filter.c -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/color-correction-filter.c Changed
17
 
1
@@ -70,11 +70,10 @@
2
    struct vec3                     half_unit;
3
 };
4
 
5
-const static float root3 = 0.57735f;
6
-const static float red_weight = 0.299f;
7
-const static float green_weight = 0.587f;
8
-const static float blue_weight = 0.114f;
9
-
10
+static const float root3 = 0.57735f;
11
+static const float red_weight = 0.299f;
12
+static const float green_weight = 0.587f;
13
+static const float blue_weight = 0.114f;
14
 
15
 /*
16
  * As the functions' namesake, this provides the internal name of your Filter,
17
obs-studio-18.0.0.tar.xz/plugins/obs-filters/color-grade-filter.c Added
161
 
1
@@ -0,0 +1,159 @@
2
+#include <obs-module.h>
3
+#include <graphics/image-file.h>
4
+#include <util/dstr.h>
5
+
6
+#define SETTING_IMAGE_PATH             "image_path"
7
+#define SETTING_CLUT_AMOUNT            "clut_amount"
8
+
9
+#define TEXT_IMAGE_PATH                obs_module_text("Path")
10
+#define TEXT_AMOUNT                    obs_module_text("Amount")
11
+
12
+struct lut_filter_data {
13
+   obs_source_t                   *context;
14
+   gs_effect_t                    *effect;
15
+   gs_texture_t                   *target;
16
+   gs_image_file_t                image;
17
+
18
+   char                           *file;
19
+   float                          clut_amount;
20
+};
21
+
22
+static const char *color_grade_filter_get_name(void *unused)
23
+{
24
+   UNUSED_PARAMETER(unused);
25
+   return obs_module_text("ColorGradeFilter");
26
+}
27
+
28
+static void color_grade_filter_update(void *data, obs_data_t *settings)
29
+{
30
+   struct lut_filter_data *filter = data;
31
+
32
+   const char *path = obs_data_get_string(settings, SETTING_IMAGE_PATH);
33
+   double clut_amount = obs_data_get_double(settings, SETTING_CLUT_AMOUNT);
34
+
35
+   bfree(filter->file);
36
+   if (path)
37
+       filter->file = bstrdup(path);
38
+
39
+   obs_enter_graphics();
40
+   gs_image_file_free(&filter->image);
41
+   obs_leave_graphics();
42
+
43
+   gs_image_file_init(&filter->image, path);
44
+
45
+   obs_enter_graphics();
46
+
47
+   gs_image_file_init_texture(&filter->image);
48
+
49
+   filter->target = filter->image.texture;
50
+   filter->clut_amount = (float)clut_amount;
51
+
52
+   char *effect_path = obs_module_file("color_grade_filter.effect");
53
+   gs_effect_destroy(filter->effect);
54
+   filter->effect = gs_effect_create_from_file(effect_path, NULL);
55
+   bfree(effect_path);
56
+
57
+   obs_leave_graphics();
58
+}
59
+
60
+static void color_grade_filter_defaults(obs_data_t *settings)
61
+{
62
+   obs_data_set_default_double(settings, SETTING_CLUT_AMOUNT, 1);
63
+}
64
+
65
+static obs_properties_t *color_grade_filter_properties(void *data)
66
+{
67
+   struct lut_filter_data *s = data;
68
+   struct dstr path = {0};
69
+   const char *slash;
70
+
71
+   obs_properties_t *props = obs_properties_create();
72
+   struct dstr filter_str = {0};
73
+
74
+   dstr_cat(&filter_str, "(*.png)");
75
+
76
+   if (s && s->file && *s->file) {
77
+       dstr_copy(&path, s->file);
78
+   } else {
79
+       dstr_copy(&path, obs_module_file("LUTs"));
80
+       dstr_cat_ch(&path, '/');
81
+   }
82
+
83
+   dstr_replace(&path, "\\", "/");
84
+   slash = strrchr(path.array, '/');
85
+   if (slash)
86
+       dstr_resize(&path, slash - path.array + 1);
87
+
88
+   obs_properties_add_path(props, SETTING_IMAGE_PATH, TEXT_IMAGE_PATH,
89
+           OBS_PATH_FILE, filter_str.array, path.array);
90
+   obs_properties_add_float_slider(props, SETTING_CLUT_AMOUNT,
91
+           TEXT_AMOUNT, 0, 1, 0.01);
92
+
93
+   dstr_free(&filter_str);
94
+
95
+   UNUSED_PARAMETER(data);
96
+   return props;
97
+}
98
+
99
+static void *color_grade_filter_create(
100
+       obs_data_t *settings, obs_source_t *context)
101
+{
102
+   struct lut_filter_data *filter =
103
+       bzalloc(sizeof(struct lut_filter_data));
104
+   filter->context = context;
105
+
106
+   obs_source_update(context, settings);
107
+   return filter;
108
+}
109
+
110
+static void color_grade_filter_destroy(void *data)
111
+{
112
+   struct lut_filter_data *filter = data;
113
+
114
+   obs_enter_graphics();
115
+   gs_effect_destroy(filter->effect);
116
+   gs_image_file_free(&filter->image);
117
+   obs_leave_graphics();
118
+
119
+   bfree(filter->file);
120
+   bfree(filter);
121
+}
122
+
123
+static void color_grade_filter_render(void *data, gs_effect_t *effect)
124
+{
125
+   struct lut_filter_data *filter = data;
126
+   obs_source_t *target = obs_filter_get_target(filter->context);
127
+   gs_eparam_t *param;
128
+
129
+   if (!target || !filter->target || !filter->effect) {
130
+       obs_source_skip_video_filter(filter->context);
131
+       return;
132
+   }
133
+
134
+   if (!obs_source_process_filter_begin(filter->context, GS_RGBA,
135
+               OBS_ALLOW_DIRECT_RENDERING))
136
+       return;
137
+
138
+   param = gs_effect_get_param_by_name(filter->effect, "clut");
139
+   gs_effect_set_texture(param, filter->target);
140
+
141
+   param = gs_effect_get_param_by_name(filter->effect, "clut_amount");
142
+   gs_effect_set_float(param, filter->clut_amount);
143
+
144
+   obs_source_process_filter_end(filter->context, filter->effect, 0, 0);
145
+
146
+   UNUSED_PARAMETER(effect);
147
+}
148
+
149
+struct obs_source_info color_grade_filter = {
150
+   .id                            = "clut_filter",
151
+   .type                          = OBS_SOURCE_TYPE_FILTER,
152
+   .output_flags                  = OBS_SOURCE_VIDEO,
153
+   .get_name                      = color_grade_filter_get_name,
154
+   .create                        = color_grade_filter_create,
155
+   .destroy                       = color_grade_filter_destroy,
156
+   .update                        = color_grade_filter_update,
157
+   .get_defaults                  = color_grade_filter_defaults,
158
+   .get_properties                = color_grade_filter_properties,
159
+   .video_render                  = color_grade_filter_render
160
+};
161
obs-studio-18.0.0.tar.xz/plugins/obs-filters/compressor-filter.c Added
201
 
1
@@ -0,0 +1,231 @@
2
+#include <stdint.h>
3
+#include <inttypes.h>
4
+#include <math.h>
5
+
6
+#include <obs-module.h>
7
+#include <media-io/audio-math.h>
8
+
9
+/* -------------------------------------------------------- */
10
+
11
+#define do_log(level, format, ...) \
12
+   blog(level, "[compressor: '%s'] " format, \
13
+           obs_source_get_name(cd->context), ##__VA_ARGS__)
14
+
15
+#define warn(format, ...)  do_log(LOG_WARNING, format, ##__VA_ARGS__)
16
+#define info(format, ...)  do_log(LOG_INFO,    format, ##__VA_ARGS__)
17
+
18
+#ifdef _DEBUG
19
+#define debug(format, ...) do_log(LOG_DEBUG,   format, ##__VA_ARGS__)
20
+#else
21
+#define debug(format, ...)
22
+#endif
23
+
24
+/* -------------------------------------------------------- */
25
+
26
+#define S_RATIO                         "ratio"
27
+#define S_THRESHOLD                     "threshold"
28
+#define S_ATTACK_TIME                   "attack_time"
29
+#define S_RELEASE_TIME                  "release_time"
30
+#define S_OUTPUT_GAIN                   "output_gain"
31
+
32
+#define MT_ obs_module_text
33
+#define TEXT_RATIO                      MT_("Compressor.Ratio")
34
+#define TEXT_THRESHOLD                  MT_("Compressor.Threshold")
35
+#define TEXT_ATTACK_TIME                MT_("Compressor.AttackTime")
36
+#define TEXT_RELEASE_TIME               MT_("Compressor.ReleaseTime")
37
+#define TEXT_OUTPUT_GAIN                MT_("Compressor.OutputGain")
38
+
39
+#define MIN_RATIO                       1.0f
40
+#define MAX_RATIO                       32.0f
41
+#define MIN_THRESHOLD_DB                -60.0f
42
+#define MAX_THRESHOLD_DB                0.0f
43
+#define MIN_OUTPUT_GAIN_DB              -32.0f
44
+#define MAX_OUTPUT_GAIN_DB              32.0f
45
+#define MIN_ATK_RLS_MS                  1
46
+#define MAX_RLS_MS                      1000
47
+#define MAX_ATK_MS                      500
48
+#define DEFAULT_AUDIO_BUF_MS            10
49
+
50
+#define MS_IN_S                         1000
51
+#define MS_IN_S_F                       ((float)MS_IN_S)
52
+
53
+/* -------------------------------------------------------- */
54
+
55
+struct compressor_data {
56
+   obs_source_t *context;
57
+   float *envelope_buf;
58
+   size_t envelope_buf_len;
59
+
60
+   float ratio;
61
+   float threshold;
62
+   float attack_gain;
63
+   float release_gain;
64
+   float output_gain;
65
+
66
+   size_t num_channels;
67
+   float envelope;
68
+   float slope;
69
+};
70
+
71
+/* -------------------------------------------------------- */
72
+
73
+static inline void resize_env_buffer(struct compressor_data *cd, size_t len)
74
+{
75
+   cd->envelope_buf_len = len;
76
+   cd->envelope_buf = brealloc(cd->envelope_buf, len * sizeof(float));
77
+}
78
+
79
+static inline float gain_coefficient(uint32_t sample_rate, float time)
80
+{
81
+   return (float)exp(-1.0f / (sample_rate * time));
82
+}
83
+
84
+static const char *compressor_name(void *unused)
85
+{
86
+   UNUSED_PARAMETER(unused);
87
+   return obs_module_text("Compressor");
88
+}
89
+
90
+static void compressor_update(void *data, obs_data_t *s)
91
+{
92
+   struct compressor_data *cd = data;
93
+
94
+   const uint32_t sample_rate =
95
+       audio_output_get_sample_rate(obs_get_audio());
96
+   const size_t num_channels =
97
+       audio_output_get_channels(obs_get_audio());
98
+   const float attack_time_ms =
99
+       (float)obs_data_get_int(s, S_ATTACK_TIME);
100
+   const float release_time_ms =
101
+       (float)obs_data_get_int(s, S_RELEASE_TIME);
102
+   const float output_gain_db =
103
+       (float)obs_data_get_double(s, S_OUTPUT_GAIN);
104
+
105
+   if (cd->envelope_buf_len <= 0) {
106
+       resize_env_buffer(cd,
107
+               sample_rate * DEFAULT_AUDIO_BUF_MS / MS_IN_S);
108
+   }
109
+
110
+   cd->ratio = (float)obs_data_get_double(s, S_RATIO);
111
+   cd->threshold = (float)obs_data_get_double(s, S_THRESHOLD);
112
+   cd->attack_gain = gain_coefficient(sample_rate,
113
+           attack_time_ms / MS_IN_S_F);
114
+   cd->release_gain = gain_coefficient(sample_rate,
115
+           release_time_ms / MS_IN_S_F);
116
+   cd->output_gain = db_to_mul(output_gain_db);
117
+   cd->num_channels = num_channels;
118
+   cd->slope = 1.0f - (1.0f / cd->ratio);
119
+}
120
+
121
+static void *compressor_create(obs_data_t *settings, obs_source_t *filter)
122
+{
123
+   struct compressor_data *cd = bzalloc(sizeof(struct compressor_data));
124
+   cd->context = filter;
125
+   compressor_update(cd, settings);
126
+   return cd;
127
+}
128
+
129
+static void compressor_destroy(void *data)
130
+{
131
+   struct compressor_data *cd = data;
132
+   bfree(cd->envelope_buf);
133
+   bfree(cd);
134
+}
135
+
136
+static inline void analyze_envelope(struct compressor_data *cd,
137
+   const float **samples, const uint32_t num_samples)
138
+{
139
+   if (cd->envelope_buf_len < num_samples) {
140
+       resize_env_buffer(cd, num_samples);
141
+   }
142
+
143
+   memset(cd->envelope_buf, 0, num_samples * sizeof(cd->envelope_buf[0]));
144
+   for (size_t chan = 0; chan < cd->num_channels; ++chan) {
145
+       if (samples[chan]) {
146
+           float env = cd->envelope;
147
+           for (uint32_t i = 0; i < num_samples; ++i) {
148
+               const float env_in = fabsf(samples[chan][i]);
149
+               if (env < env_in) {
150
+                   env = env_in + cd->attack_gain *
151
+                       (env - env_in);
152
+               } else {
153
+                   env = env_in + cd->release_gain *
154
+                       (env - env_in);
155
+               }
156
+               cd->envelope_buf[i] = fmaxf(
157
+                       cd->envelope_buf[i], env);
158
+           }
159
+       }
160
+   }
161
+   cd->envelope = cd->envelope_buf[num_samples - 1];
162
+}
163
+
164
+static inline void process_compression(const struct compressor_data *cd,
165
+   float **samples, uint32_t num_samples)
166
+{
167
+   for (size_t i = 0; i < num_samples; ++i) {
168
+       const float env_db = mul_to_db(cd->envelope_buf[i]);
169
+       float gain = cd->slope * (cd->threshold - env_db);
170
+       gain = db_to_mul(fminf(0, gain));
171
+
172
+       for (size_t c = 0; c < cd->num_channels; ++c) {
173
+           if (samples[c]) {
174
+               samples[c][i] *= gain * cd->output_gain;
175
+           }
176
+       }
177
+   }
178
+}
179
+
180
+static struct obs_audio_data *compressor_filter_audio(void *data,
181
+   struct obs_audio_data *audio)
182
+{
183
+   struct compressor_data *cd = data;
184
+   const uint32_t num_samples = audio->frames;
185
+   float **samples = (float**)audio->data;
186
+
187
+   analyze_envelope(cd, samples, num_samples);
188
+   process_compression(cd, samples, num_samples);
189
+
190
+   return audio;
191
+}
192
+
193
+static void compressor_defaults(obs_data_t *s)
194
+{
195
+   obs_data_set_default_double(s, S_RATIO, 10.0f);
196
+   obs_data_set_default_double(s, S_THRESHOLD, -18.0f);
197
+   obs_data_set_default_int(s, S_ATTACK_TIME, 6);
198
+   obs_data_set_default_int(s, S_RELEASE_TIME, 60);
199
+   obs_data_set_default_double(s, S_OUTPUT_GAIN, 0.0f);
200
+}
201
obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/LUTs Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/LUTs/black_and_white.png Added
obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/LUTs/original.png Added
obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/LUTs/posterize.png Added
obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/LUTs/red_isolated.png Added
obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/LUTs/teal_lows_orange_highs.png Added
obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/color_grade_filter.effect Added
68
 
1
@@ -0,0 +1,66 @@
2
+uniform float4x4 ViewProj;
3
+uniform texture2d image;
4
+
5
+uniform texture2d clut;
6
+uniform float clut_amount;
7
+
8
+sampler_state textureSampler {
9
+   Filter    = Linear;
10
+   AddressU  = Clamp;
11
+   AddressV  = Clamp;
12
+};
13
+
14
+struct VertDataIn {
15
+   float4 pos : POSITION;
16
+   float2 uv  : TEXCOORD0;
17
+};
18
+
19
+struct VertDataOut {
20
+   float4 pos : POSITION;
21
+   float2 uv  : TEXCOORD0;
22
+};
23
+
24
+VertDataOut VSDefault(VertDataIn v_in)
25
+{
26
+   VertDataOut vert_out;
27
+   vert_out.uv = v_in.uv;
28
+   vert_out.pos = mul(float4(v_in.pos.xyz, 1.0), ViewProj);
29
+   return vert_out;
30
+}
31
+
32
+float4 LUT(VertDataOut v_in) : TARGET
33
+{
34
+   float4 textureColor = image.Sample(textureSampler, v_in.uv);
35
+   float blueColor = textureColor.b * 63.0;
36
+
37
+   float2 quad1;
38
+   quad1.y = floor(floor(blueColor) / 8.0);
39
+   quad1.x = floor(blueColor) - (quad1.y * 8.0);
40
+
41
+   float2 quad2;
42
+   quad2.y = floor(ceil(blueColor) / 8.0);
43
+   quad2.x = ceil(blueColor) - (quad2.y * 8.0);
44
+
45
+   float2 texPos1;
46
+   texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
47
+   texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);
48
+
49
+   float2 texPos2;
50
+   texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
51
+   texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);
52
+
53
+   float4 newColor1 = clut.Sample(textureSampler, texPos1);
54
+   float4 newColor2 = clut.Sample(textureSampler, texPos2);
55
+   float4 luttedColor = lerp(newColor1, newColor2, frac(blueColor));
56
+
57
+   return lerp(textureColor, luttedColor, clut_amount);
58
+}
59
+
60
+technique Draw
61
+{
62
+   pass
63
+   {
64
+       vertex_shader = VSDefault(v_in);
65
+       pixel_shader  = LUT(v_in);
66
+   }
67
+}
68
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/ca-ES.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/ca-ES.ini Changed
27
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Correcció de color"
3
+ColorGradeFilter="Aplica LUT"
4
 MaskFilter="Màscara d'imatge o barreja"
5
 AsyncDelayFilter="Retard del vídeo (asíncron)"
6
 CropFilter="Escapça/Encoixinar"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Clau de color"
9
 SharpnessFilter="Agudesa"
10
 ScaleFilter="Escala/Relació d'Aspecte"
11
+UndistortCenter="No distorsionis el centre de la imatge en escalar des d'una ultrapanoràmica"
12
 NoiseGate="Porta de soroll"
13
 NoiseSuppress="Supressió de soroll"
14
 Gain="Guany"
15
@@ -63,4 +65,11 @@
16
 NoiseSuppress.SuppressLevel="Nivell de supressió (dB)"
17
 Saturation="Saturació"
18
 HueShift="Cavi de tonalitat"
19
+Amount="Quantitat"
20
+Compressor="Compressor"
21
+Compressor.Ratio="Proporció (X:1)"
22
+Compressor.Threshold="Llindar (dB)"
23
+Compressor.AttackTime="Atac (ms)"
24
+Compressor.ReleaseTime="Llançament (ms)"
25
+Compressor.OutputGain="Guany de sortida (dB)"
26
 
27
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/cs-CZ.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/cs-CZ.ini Changed
21
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Korekce barev"
3
+ColorGradeFilter="Použít LUT"
4
 MaskFilter="Maska obrazu/prolnutí"
5
 AsyncDelayFilter="Zpoždění obrazu"
6
 CropFilter="Oříznutí/odsazení"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Klíč barvy"
9
 SharpnessFilter="Ostření"
10
 ScaleFilter="Škálování/poměr stran"
11
+UndistortCenter="Zlepší střed obrázku při škálování z ultra-širokého obrazu"
12
 NoiseGate="Šumová brána"
13
 NoiseSuppress="Potlačení šumu"
14
 Gain="Zisk"
15
@@ -63,4 +65,5 @@
16
 NoiseSuppress.SuppressLevel="Úroveň potlačení (dB)"
17
 Saturation="Saturace"
18
 HueShift="Posun odstínu"
19
+Amount="Množství"
20
 
21
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/da-DK.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/da-DK.ini Changed
21
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Farvekorrektion"
3
+ColorGradeFilter="Anvend LUT"
4
 MaskFilter="Billede maske/blanding"
5
 AsyncDelayFilter="Video forsinkelse (asynkron)"
6
 CropFilter="Beskæring/Polstring"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Farvenøgle"
9
 SharpnessFilter="Skarphed"
10
 ScaleFilter="Skalering/Formatforhold"
11
+UndistortCenter="Fjern forvrængning af billedets midte ved skalering fra ultrabred"
12
 NoiseGate="Noise Gate"
13
 NoiseSuppress="Støjundertrykkelse"
14
 Gain="Forstærkning"
15
@@ -63,4 +65,5 @@
16
 NoiseSuppress.SuppressLevel="Undertrykkelsesniveau (dB)"
17
 Saturation="Mætning"
18
 HueShift="Nuanceskift"
19
+Amount="Værdi"
20
 
21
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/de-DE.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/de-DE.ini Changed
27
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Farbkorrektur"
3
+ColorGradeFilter="LUT anwenden"
4
 MaskFilter="Bild Maske/Blend"
5
 AsyncDelayFilter="Videoverzögerung (Asynchron)"
6
 CropFilter="Zuschneiden/Pad"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Color Key"
9
 SharpnessFilter="Schärfen"
10
 ScaleFilter="Skalierung/Seitenverhältnis"
11
+UndistortCenter="Entzerre Mitte des Bildes bei der Skalierung von Ultraweitwinkel"
12
 NoiseGate="Noise Gate"
13
 NoiseSuppress="Rauschunterdrückung"
14
 Gain="Gain"
15
@@ -63,4 +65,11 @@
16
 NoiseSuppress.SuppressLevel="Unterdrückungspegel (dB)"
17
 Saturation="Sättigung"
18
 HueShift="Farbtonverschiebung"
19
+Amount="Betrag"
20
+Compressor="Kompressor"
21
+Compressor.Ratio="Verhältnis (X:1)"
22
+Compressor.Threshold="Schwelle (dB)"
23
+Compressor.AttackTime="Angriff (ms)"
24
+Compressor.ReleaseTime="Freigabe (ms)"
25
+Compressor.OutputGain="Ausgangspegel (dB)"
26
 
27
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/en-US.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/en-US.ini Changed
26
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Color Correction"
3
+ColorGradeFilter="Apply LUT"
4
 MaskFilter="Image Mask/Blend"
5
 AsyncDelayFilter="Video Delay (Async)"
6
 CropFilter="Crop/Pad"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Color Key"
9
 SharpnessFilter="Sharpen"
10
 ScaleFilter="Scaling/Aspect Ratio"
11
+UndistortCenter="Undistort center of image when scaling from ultrawide"
12
 NoiseGate="Noise Gate"
13
 NoiseSuppress="Noise Suppression"
14
 Gain="Gain"
15
@@ -63,3 +65,10 @@
16
 NoiseSuppress.SuppressLevel="Suppression Level (dB)"
17
 Saturation="Saturation"
18
 HueShift="Hue Shift"
19
+Amount="Amount"
20
+Compressor="Compressor"
21
+Compressor.Ratio="Ratio (X:1)"
22
+Compressor.Threshold="Threshold (dB)"
23
+Compressor.AttackTime="Attack (ms)"
24
+Compressor.ReleaseTime="Release (ms)"
25
+Compressor.OutputGain="Output Gain (dB)"
26
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/es-ES.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/es-ES.ini Changed
27
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Corrección de color"
3
+ColorGradeFilter="Aplicar LUT"
4
 MaskFilter="Imagen máscara/mezcla"
5
 AsyncDelayFilter="Demora de Video (asincróno)"
6
 CropFilter="Recortar/Acolchar"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Filtro de color"
9
 SharpnessFilter="Filtro de enfoque"
10
 ScaleFilter="Escala/Relación de Aspecto"
11
+UndistortCenter="No distorsionar el centro de la imagen en escalar des de una ultrapanorámica"
12
 NoiseGate="Puerta anti-ruidos"
13
 NoiseSuppress="Eliminación de ruido"
14
 Gain="Ganancia"
15
@@ -63,4 +65,11 @@
16
 NoiseSuppress.SuppressLevel="Nivel de eliminación de ruido (dB)"
17
 Saturation="Saturación"
18
 HueShift="Cambio de tonalidad"
19
+Amount="Cantidad"
20
+Compressor="Compresor"
21
+Compressor.Ratio="Relación (X:1)"
22
+Compressor.Threshold="Umbral (dB)"
23
+Compressor.AttackTime="Ataque (ms)"
24
+Compressor.ReleaseTime="Liberación (ms)"
25
+Compressor.OutputGain="Ganancia de salida (dB)"
26
 
27
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/eu-ES.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/eu-ES.ini Changed
27
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Kolore-zuzenketa"
3
+ColorGradeFilter="Aplikatu LUT"
4
 MaskFilter="Irudi maskara/nahasketa"
5
 AsyncDelayFilter="Bideo atzerapena (Async)"
6
 CropFilter="Moztu/Bete"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Kolore gakoa"
9
 SharpnessFilter="Enfokea"
10
 ScaleFilter="Eskala/Aspektu-erlazioa"
11
+UndistortCenter="Ez distortsionatu irudiaren erdigunea ultra zabala eskalatzean"
12
 NoiseGate="Zarata atalasea"
13
 NoiseSuppress="Zarata kendu"
14
 Gain="Irabazia"
15
@@ -63,4 +65,11 @@
16
 NoiseSuppress.SuppressLevel="Kenketaren maila (dB)"
17
 Saturation="Margoasetasuna"
18
 HueShift="Nabardura Aldaketa"
19
+Amount="Zenbatekoa"
20
+Compressor="Konprimitzailea"
21
+Compressor.Ratio="Erlazioa (X:1)"
22
+Compressor.Threshold="Atalasea (dB)"
23
+Compressor.AttackTime="Erasoa (ms)"
24
+Compressor.ReleaseTime="Askapena (ms)"
25
+Compressor.OutputGain="Irteerako irabazia (dB)"
26
 
27
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/fi-FI.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/fi-FI.ini Changed
27
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Värinkorjaus"
3
+ColorGradeFilter="Käytä LUT"
4
 MaskFilter="Kuvamaski/Sekoitus"
5
 AsyncDelayFilter="Kuvan viive (Async)"
6
 CropFilter="Rajaa"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Väriavain"
9
 SharpnessFilter="Terävöitä"
10
 ScaleFilter="Skaalaus/Kuvasuhde"
11
+UndistortCenter="Poista vääristymä keskeltä kuvaa skaalattaessa ultra-leveästä"
12
 NoiseGate="Noise Gate"
13
 NoiseSuppress="Melunvaimennus"
14
 Gain="Vahvistus"
15
@@ -63,4 +65,11 @@
16
 NoiseSuppress.SuppressLevel="Vaimennustaso (dB)"
17
 Saturation="Värikylläisyys"
18
 HueShift="Värisävy"
19
+Amount="Määrä"
20
+Compressor="Kompressori"
21
+Compressor.Ratio="Suhde (X:1)"
22
+Compressor.Threshold="Kynnysarvo (dB)"
23
+Compressor.AttackTime="Attack-aika (ms)"
24
+Compressor.ReleaseTime="Vapautumisaika (ms)"
25
+Compressor.OutputGain="Signaalin vahvistus (dB)"
26
 
27
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/fr-FR.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/fr-FR.ini Changed
21
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Corrections colorimétrique"
3
+ColorGradeFilter="Appliquer LUT"
4
 MaskFilter="Masque d'image/mélange"
5
 AsyncDelayFilter="Retard vidéo (async.)"
6
 CropFilter="Rogner / Encadrer"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Couleur d'incrustation"
9
 SharpnessFilter="Accentuer"
10
 ScaleFilter="Mise à l’échelle / Ratio d'affichage"
11
+UndistortCenter="Ne pas déformer le centre de l'image lors d'une mise à l'échelle ultra large"
12
 NoiseGate="Noise Gate"
13
 NoiseSuppress="Suppression du bruit"
14
 Gain="Gain"
15
@@ -63,4 +65,5 @@
16
 NoiseSuppress.SuppressLevel="Seuil de suppression (en dB)"
17
 Saturation="Saturation"
18
 HueShift="Décalage de teinte"
19
+Amount="Quantité"
20
 
21
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/hu-HU.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/hu-HU.ini Changed
27
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Színkorrekció"
3
+ColorGradeFilter="LUT alkalmazása"
4
 MaskFilter="Képmaszk/Keverés"
5
 AsyncDelayFilter="Videó késleltetés (Async)"
6
 CropFilter="Vágás/Margó"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Színkulcs"
9
 SharpnessFilter="Élesítés"
10
 ScaleFilter="Méretezés/Képarány"
11
+UndistortCenter="Kép közepének zavarosságának a csökkentése ultraszélesről való skálázás esetén"
12
 NoiseGate="Zajgát"
13
 NoiseSuppress="Zajcsökkentés"
14
 Gain="Erősítés"
15
@@ -63,4 +65,11 @@
16
 NoiseSuppress.SuppressLevel="Csökkentési szint (dB)"
17
 Saturation="Telítettség"
18
 HueShift="Színezet váltása"
19
+Amount="Mennyiség"
20
+Compressor="Kompresszor"
21
+Compressor.Ratio="Arány (X:1)"
22
+Compressor.Threshold="Küszöb (dB)"
23
+Compressor.AttackTime="Aktiválás (ms)"
24
+Compressor.ReleaseTime="Felengedés (ms)"
25
+Compressor.OutputGain="Kimeneti erősítés (dB)"
26
 
27
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/ja-JP.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/ja-JP.ini Changed
27
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="色補正"
3
+ColorGradeFilter="LUT を適用"
4
 MaskFilter="イメージ マスク/ブレンド"
5
 AsyncDelayFilter="映像の遅延 (非同期)"
6
 CropFilter="クロップ/パッド"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="カラーキー"
9
 SharpnessFilter="シャープ"
10
 ScaleFilter="スケーリング/アスペクト比"
11
+UndistortCenter="超広角からスケーリングするときに画像の中心を歪めない"
12
 NoiseGate="ノイズゲート"
13
 NoiseSuppress="ノイズ抑制"
14
 Gain="ゲイン"
15
@@ -63,4 +65,11 @@
16
 NoiseSuppress.SuppressLevel="抑制レベル (dB)"
17
 Saturation="彩度"
18
 HueShift="色相シフト"
19
+Amount="量"
20
+Compressor="コンプレッサー"
21
+Compressor.Ratio="比率 (X:1)"
22
+Compressor.Threshold="閾値 (dB)"
23
+Compressor.AttackTime="アタックタイム (ms)"
24
+Compressor.ReleaseTime="リリースタイム (ms)"
25
+Compressor.OutputGain="出力ゲイン (dB)"
26
 
27
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/ko-KR.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/ko-KR.ini Changed
27
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="색상 보정"
3
+ColorGradeFilter="LUT 적용"
4
 MaskFilter="이미지 마스크/혼합"
5
 AsyncDelayFilter="비디오 지연 (비동기)"
6
 CropFilter="자르기/덧대기"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="색상 키"
9
 SharpnessFilter="선명하게"
10
 ScaleFilter="비례축소/가로세로 비율"
11
+UndistortCenter="울트라와이드에서 크기조정 시 이미지 중앙의 왜곡을 수정"
12
 NoiseGate="노이즈 게이트"
13
 NoiseSuppress="소음 억제"
14
 Gain="증폭"
15
@@ -63,4 +65,11 @@
16
 NoiseSuppress.SuppressLevel="억제 세기 (dB)"
17
 Saturation="채도"
18
 HueShift="색조 변화"
19
+Amount="양"
20
+Compressor="압축방식"
21
+Compressor.Ratio="비율 (X:1)"
22
+Compressor.Threshold="임계값 (dB)"
23
+Compressor.AttackTime="신호 감지 후 반응까지 걸리는 시간 (ms)"
24
+Compressor.ReleaseTime="신호 세기가 감퇴 이후 증폭이 회복하는 시간 (ms)"
25
+Compressor.OutputGain="출력 증폭 (dB)"
26
 
27
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/nb-NO.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/nb-NO.ini Changed
21
 
1
@@ -6,7 +6,9 @@
2
 ChromaKeyFilter="Chromafilter"
3
 ColorKeyFilter="Fargefilter"
4
 SharpnessFilter="Skjerpe"
5
+ScaleFilter="Skalering/Aspekt Forhold"
6
 NoiseGate="Støyterskel"
7
+NoiseSuppress="Lyddemping"
8
 Gain="Forsterkning"
9
 DelayMs="Forsinkelse (millisekunder)"
10
 Type="Type"
11
@@ -53,4 +55,9 @@
12
 StretchImage="Strekk bilde (ignorer bildets sideforhold)"
13
 Resolution="Oppløsning"
14
 None="Ingen"
15
+ScaleFiltering="Skala Filtrering"
16
+ScaleFiltering.Point="Punkt"
17
+NoiseSuppress.SuppressLevel="Dempelse Nivå (dB)"
18
+Saturation="Metning"
19
+HueShift="Fargetone Skifte"
20
 
21
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/nl-NL.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/nl-NL.ini Changed
21
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Kleurcorrectie"
3
+ColorGradeFilter="LUT Toepassen"
4
 MaskFilter="Afbeeldingsmasker/Mengen"
5
 AsyncDelayFilter="Videovertraging (Async)"
6
 CropFilter="Bijsnijden/Aanvullen"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Color Key"
9
 SharpnessFilter="Verscherpen"
10
 ScaleFilter="Schalen/Aspect Ratio"
11
+UndistortCenter="Verbeter beeldverhouding in het midden van bij schalen vanaf ultrawide"
12
 NoiseGate="Noise Gate"
13
 NoiseSuppress="Ruisonderdrukking"
14
 Gain="Gain"
15
@@ -63,4 +65,5 @@
16
 NoiseSuppress.SuppressLevel="Onderdrukkingsniveau (dB)"
17
 Saturation="Verzadiging"
18
 HueShift="Tintverschuiving"
19
+Amount="Hoeveelheid"
20
 
21
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/pl-PL.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/pl-PL.ini Changed
27
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Korekcja Kolorów"
3
+ColorGradeFilter="Look-Up Tables (LUT)"
4
 MaskFilter="Maskowanie/nakładanie obrazu"
5
 AsyncDelayFilter="Opóźnienie wideo (asynchronicznie)"
6
 CropFilter="Przytnij/Uzupełnij"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Kluczowanie koloru (kolor)"
9
 SharpnessFilter="Wyostrzanie"
10
 ScaleFilter="Skalowanie/proporcje"
11
+UndistortCenter="Usuń przekłamania przy skalowaniu źródeł o dużej szerokości"
12
 NoiseGate="Bramka szumów"
13
 NoiseSuppress="Tłumienie hałasu"
14
 Gain="Poziom"
15
@@ -63,4 +65,11 @@
16
 NoiseSuppress.SuppressLevel="Poziom tłumienia (dB)"
17
 Saturation="Nasycenie"
18
 HueShift="Przesunięcie barwy"
19
+Amount="Pozion"
20
+Compressor="Kompresor"
21
+Compressor.Ratio="Stosunek (X:1)"
22
+Compressor.Threshold="Próg (dB)"
23
+Compressor.AttackTime="Atak (ms)"
24
+Compressor.ReleaseTime="Odpuszczenie (ms)"
25
+Compressor.OutputGain="Zysk na wyjściu (dB)"
26
 
27
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/ro-RO.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/ro-RO.ini Changed
20
 
1
@@ -5,6 +5,7 @@
2
 ChromaKeyFilter="Cheie chroma"
3
 ColorKeyFilter="Culoare cheie"
4
 SharpnessFilter="Accentuare"
5
+ScaleFilter="Scalare/Rație Aspect"
6
 NoiseGate="Poartă de zgomot"
7
 Gain="Amplificare"
8
 DelayMs="Întârziere (milisecunde)"
9
@@ -50,4 +51,10 @@
10
 NoiseGate.ReleaseTime="Timp de eliberare (milisecunde)"
11
 Gain.GainDB="Amplificare (dB)"
12
 StretchImage="Întinde imaginea (renunță la raportul de aspect al imaginii)"
13
+Resolution="Rezoluție"
14
+None="Fără"
15
+ScaleFiltering.Bilinear="Biliniar"
16
+ScaleFiltering.Bicubic="Bicubic"
17
+ScaleFiltering.Lanczos="Lanczos"
18
+Saturation="Saturație"
19
 
20
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/ru-RU.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/ru-RU.ini Changed
27
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Коррекция цвета"
3
+ColorGradeFilter="Применить LUT"
4
 MaskFilter="Маска изображения/Смешивание"
5
 AsyncDelayFilter="Задержка видео (асинхронность)"
6
 CropFilter="Кадрировать"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Цветовой ключ"
9
 SharpnessFilter="Увеличить резкость"
10
 ScaleFilter="Коэффициент Масштабирования/Аспект"
11
+UndistortCenter="Не искривлять центр изображения при масштабировании Ultrawide разрешения"
12
 NoiseGate="Подавление шума"
13
 NoiseSuppress="Шумоподавление"
14
 Gain="Усиление"
15
@@ -63,4 +65,11 @@
16
 NoiseSuppress.SuppressLevel="Уровень подавления (дБ)"
17
 Saturation="Насыщенность"
18
 HueShift="Сдвиг оттенка"
19
+Amount="Количество"
20
+Compressor="Компрессор"
21
+Compressor.Ratio="Степень сжатия (X:1)"
22
+Compressor.Threshold="Порог срабатывания (дБ)"
23
+Compressor.AttackTime="Атака (мс)"
24
+Compressor.ReleaseTime="Спад (мс)"
25
+Compressor.OutputGain="Выходное усиление (дБ)"
26
 
27
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/sv-SE.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/sv-SE.ini Changed
18
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Färgkorrigering"
3
+ColorGradeFilter="Tillämpa LUT"
4
 MaskFilter="Bild Mask/Blandning"
5
 AsyncDelayFilter="Videofördröjning (Async)"
6
 CropFilter="Beskär/Fyll ut"
7
@@ -62,4 +63,10 @@
8
 ScaleFiltering.Lanczos="Lanczos"
9
 NoiseSuppress.SuppressLevel="Brusreduceringsnivå (dB)"
10
 Saturation="Mättnad"
11
+HueShift="Nyansväxling"
12
+Amount="Mängd"
13
+Compressor="Kompressor"
14
+Compressor.Ratio="Förhållande (X:1)"
15
+Compressor.Threshold="Tröskel (dB)"
16
+Compressor.AttackTime="Attack (ms)"
17
 
18
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/uk-UA.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/uk-UA.ini Changed
36
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="Коригування кольору"
3
+ColorGradeFilter="Таблиці підстановки кольору"
4
 MaskFilter="Маска до зображення"
5
 AsyncDelayFilter="Затримка відео (асинхронна)"
6
 CropFilter="Кадрування"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="Фільтрування за кольором"
9
 SharpnessFilter="Різкість"
10
 ScaleFilter="Масштабування/пропорції"
11
+UndistortCenter="Зменшити викривлення у центрі, якщо масштабувати з надширокоформатного"
12
 NoiseGate="Пороговий шумопонижувач"
13
 NoiseSuppress="Подавлення шуму"
14
 Gain="Підсилення"
15
@@ -49,7 +51,7 @@
16
 NoiseGate.OpenThreshold="Поріг відкриття (дБ)"
17
 NoiseGate.CloseThreshold="Поріг закриття (дБ)"
18
 NoiseGate.AttackTime="Тривалість фронту сигналу (мілісекунд)"
19
-NoiseGate.HoldTime="Тривалість сигналу (мілісекунд)"
20
+NoiseGate.HoldTime="Тривалість втримання сигналу (мілісекунд)"
21
 NoiseGate.ReleaseTime="Тривалість спаду сигналу (мілісекунд)"
22
 Gain.GainDB="Підсилення (дБ)"
23
 StretchImage="Розтягнути зображення (ігнорувати пропорції зображення)"
24
@@ -63,4 +65,11 @@
25
 NoiseSuppress.SuppressLevel="Рівень подавлення (дБ)"
26
 Saturation="Насиченість"
27
 HueShift="Відтінок"
28
+Amount="Обсяг впливу"
29
+Compressor="Компресор"
30
+Compressor.Ratio="Відношення (X:1)"
31
+Compressor.Threshold="Поріг (дБ)"
32
+Compressor.AttackTime="Атака (мс)"
33
+Compressor.ReleaseTime="Затухання (мс)"
34
+Compressor.OutputGain="Підсилення виводу (dB)"
35
 
36
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/zh-CN.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/zh-CN.ini Changed
27
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="色彩校正"
3
+ColorGradeFilter="应用 LUT"
4
 MaskFilter="图像掩码/混合"
5
 AsyncDelayFilter="视频延迟(异步)"
6
 CropFilter="裁剪/填充"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="色值"
9
 SharpnessFilter="锐化"
10
 ScaleFilter="缩放比例"
11
+UndistortCenter="当从超宽扩展时, 让图片中心不失真"
12
 NoiseGate="噪音阈值"
13
 NoiseSuppress="噪声抑制"
14
 Gain="增益"
15
@@ -63,4 +65,11 @@
16
 NoiseSuppress.SuppressLevel="抑制程度 (dB)"
17
 Saturation="饱和度"
18
 HueShift="色调偏移"
19
+Amount="数值"
20
+Compressor="压缩器"
21
+Compressor.Ratio="比率 (X:1)"
22
+Compressor.Threshold="阈值 (dB)"
23
+Compressor.AttackTime="攻击 (ms)"
24
+Compressor.ReleaseTime="释放 (ms)"
25
+Compressor.OutputGain="输出增益 (dB)"
26
 
27
obs-studio-17.0.2.tar.xz/plugins/obs-filters/data/locale/zh-TW.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/data/locale/zh-TW.ini Changed
21
 
1
@@ -1,4 +1,5 @@
2
 ColorFilter="色彩校正"
3
+ColorGradeFilter="使用色彩對照表"
4
 MaskFilter="影像遮罩/混合"
5
 AsyncDelayFilter="視頻延遲 (非同步)"
6
 CropFilter="剪裁/填充"
7
@@ -7,6 +8,7 @@
8
 ColorKeyFilter="色彩鍵"
9
 SharpnessFilter="銳化"
10
 ScaleFilter="縮放/長寬比"
11
+UndistortCenter="從超寬影像縮放時彌補影像中心的畸變"
12
 NoiseGate="噪音閾"
13
 NoiseSuppress="雜訊抑制"
14
 Gain="增益"
15
@@ -63,4 +65,5 @@
16
 NoiseSuppress.SuppressLevel="抑制標準 (dB)"
17
 Saturation="飽合度"
18
 HueShift="色調偏移"
19
+Amount="影響總量"
20
 
21
obs-studio-17.0.2.tar.xz/plugins/obs-filters/obs-filters.c -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/obs-filters.c Changed
32
 
1
@@ -12,6 +12,7 @@
2
 extern struct obs_source_info scale_filter;
3
 extern struct obs_source_info scroll_filter;
4
 extern struct obs_source_info color_key_filter;
5
+extern struct obs_source_info color_grade_filter;
6
 extern struct obs_source_info sharpness_filter;
7
 extern struct obs_source_info chroma_key_filter;
8
 extern struct obs_source_info async_delay_filter;
9
@@ -19,6 +20,7 @@
10
 extern struct obs_source_info noise_suppress_filter;
11
 #endif
12
 extern struct obs_source_info noise_gate_filter;
13
+extern struct obs_source_info compressor_filter;
14
 
15
 bool obs_module_load(void)
16
 {
17
@@ -29,6 +31,7 @@
18
    obs_register_source(&scale_filter);
19
    obs_register_source(&scroll_filter);
20
    obs_register_source(&color_key_filter);
21
+   obs_register_source(&color_grade_filter);
22
    obs_register_source(&sharpness_filter);
23
    obs_register_source(&chroma_key_filter);
24
    obs_register_source(&async_delay_filter);
25
@@ -36,5 +39,6 @@
26
    obs_register_source(&noise_suppress_filter);
27
 #endif
28
    obs_register_source(&noise_gate_filter);
29
+   obs_register_source(&compressor_filter);
30
    return true;
31
 }
32
obs-studio-17.0.2.tar.xz/plugins/obs-filters/scale-filter.c -> obs-studio-18.0.0.tar.xz/plugins/obs-filters/scale-filter.c Changed
175
 
1
@@ -8,6 +8,7 @@
2
 
3
 #define S_RESOLUTION                    "resolution"
4
 #define S_SAMPLING                      "sampling"
5
+#define S_UNDISTORT                     "undistort"
6
 
7
 #define T_RESOLUTION                    obs_module_text("Resolution")
8
 #define T_NONE                          obs_module_text("None")
9
@@ -16,6 +17,7 @@
10
 #define T_SAMPLING_BILINEAR             obs_module_text("ScaleFiltering.Bilinear")
11
 #define T_SAMPLING_BICUBIC              obs_module_text("ScaleFiltering.Bicubic")
12
 #define T_SAMPLING_LANCZOS              obs_module_text("ScaleFiltering.Lanczos")
13
+#define T_UNDISTORT                     obs_module_text("UndistortCenter")
14
 
15
 #define S_SAMPLING_POINT                "point"
16
 #define S_SAMPLING_BILINEAR             "bilinear"
17
@@ -27,7 +29,9 @@
18
    gs_effect_t                     *effect;
19
    gs_eparam_t                     *image_param;
20
    gs_eparam_t                     *dimension_param;
21
+   gs_eparam_t                     *undistort_factor_param;
22
    struct vec2                     dimension_i;
23
+   double                          undistort_factor;
24
    int                             cx_in;
25
    int                             cy_in;
26
    int                             cx_out;
27
@@ -37,6 +41,7 @@
28
    bool                            aspect_ratio_only : 1;
29
    bool                            target_valid : 1;
30
    bool                            valid : 1;
31
+   bool                            undistort : 1;
32
 };
33
 
34
 static const char *scale_filter_name(void *unused)
35
@@ -80,6 +85,8 @@
36
    } else { /* S_SAMPLING_BICUBIC */
37
        filter->sampling = OBS_SCALE_BICUBIC;
38
    }
39
+
40
+   filter->undistort = obs_data_get_bool(settings, S_UNDISTORT);
41
 }
42
 
43
 static void scale_filter_destroy(void *data)
44
@@ -146,11 +153,11 @@
45
    cx_f = (double)cx;
46
    cy_f = (double)cy;
47
 
48
-   if (filter->aspect_ratio_only) {
49
-       double old_aspect = cx_f / cy_f;
50
-       double new_aspect =
51
-           (double)filter->cx_in / (double)filter->cy_in;
52
+   double old_aspect = cx_f / cy_f;
53
+   double new_aspect =
54
+       (double)filter->cx_in / (double)filter->cy_in;
55
 
56
+   if (filter->aspect_ratio_only) {
57
        if (fabs(old_aspect - new_aspect) <= EPSILON) {
58
            filter->target_valid = false;
59
            return;
60
@@ -172,6 +179,12 @@
61
            1.0f / (float)cx,
62
            1.0f / (float)cy);
63
 
64
+   if (filter->undistort) {
65
+       filter->undistort_factor = new_aspect / old_aspect;
66
+   } else {
67
+       filter->undistort_factor = 1.0;
68
+   }
69
+
70
    /* ------------------------- */
71
 
72
    lower_than_2x = filter->cx_out < cx / 2 || filter->cy_out < cy / 2;
73
@@ -199,12 +212,22 @@
74
        filter->dimension_param = NULL;
75
    }
76
 
77
+   if (type == OBS_EFFECT_BICUBIC || type == OBS_EFFECT_LANCZOS) {
78
+       filter->undistort_factor_param = gs_effect_get_param_by_name(
79
+           filter->effect, "undistort_factor");
80
+   }
81
+   else {
82
+       filter->undistort_factor_param = NULL;
83
+   }
84
+
85
    UNUSED_PARAMETER(seconds);
86
 }
87
 
88
 static void scale_filter_render(void *data, gs_effect_t *effect)
89
 {
90
    struct scale_filter_data *filter = data;
91
+   const char *technique = filter->undistort ?
92
+       "DrawUndistort" : "Draw";
93
 
94
    if (!filter->valid || !filter->target_valid) {
95
        obs_source_skip_video_filter(filter->context);
96
@@ -219,12 +242,16 @@
97
        gs_effect_set_vec2(filter->dimension_param,
98
                &filter->dimension_i);
99
 
100
+   if (filter->undistort_factor_param)
101
+       gs_effect_set_float(filter->undistort_factor_param,
102
+           (float)filter->undistort_factor);
103
+
104
    if (filter->sampling == OBS_SCALE_POINT)
105
        gs_effect_set_next_sampler(filter->image_param,
106
                filter->point_sampler);
107
 
108
-   obs_source_process_filter_end(filter->context, filter->effect,
109
-           filter->cx_out, filter->cy_out);
110
+   obs_source_process_filter_tech_end(filter->context, filter->effect,
111
+           filter->cx_out, filter->cy_out, technique);
112
 
113
    UNUSED_PARAMETER(effect);
114
 }
115
@@ -254,6 +281,34 @@
116
 
117
 #define NUM_ASPECTS (sizeof(aspects) / sizeof(const char *))
118
 
119
+static bool sampling_modified(obs_properties_t *props, obs_property_t *p,
120
+   obs_data_t *settings)
121
+{
122
+   const char *sampling = obs_data_get_string(settings, S_SAMPLING);
123
+
124
+   bool has_undistort;
125
+   if (astrcmpi(sampling, S_SAMPLING_POINT) == 0) {
126
+       has_undistort = false;
127
+
128
+   }
129
+   else if (astrcmpi(sampling, S_SAMPLING_BILINEAR) == 0) {
130
+       has_undistort = false;
131
+
132
+   }
133
+   else if (astrcmpi(sampling, S_SAMPLING_LANCZOS) == 0) {
134
+       has_undistort = true;
135
+
136
+   }
137
+   else { /* S_SAMPLING_BICUBIC */
138
+       has_undistort = true;
139
+   }
140
+
141
+   obs_property_set_visible(obs_properties_get(props, S_UNDISTORT), has_undistort);
142
+
143
+   UNUSED_PARAMETER(p);
144
+   return true;
145
+}
146
+
147
 static obs_properties_t *scale_filter_properties(void *data)
148
 {
149
    obs_properties_t *props = obs_properties_create();
150
@@ -280,6 +335,7 @@
151
 
152
    p = obs_properties_add_list(props, S_SAMPLING, T_SAMPLING,
153
            OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
154
+   obs_property_set_modified_callback(p, sampling_modified);
155
    obs_property_list_add_string(p, T_SAMPLING_POINT,    S_SAMPLING_POINT);
156
    obs_property_list_add_string(p, T_SAMPLING_BILINEAR, S_SAMPLING_BILINEAR);
157
    obs_property_list_add_string(p, T_SAMPLING_BICUBIC,  S_SAMPLING_BICUBIC);
158
@@ -301,6 +357,8 @@
159
        obs_property_list_add_string(p, str, str);
160
    }
161
 
162
+   obs_properties_add_bool(props, S_UNDISTORT, T_UNDISTORT);
163
+
164
    /* ----------------- */
165
 
166
    UNUSED_PARAMETER(data);
167
@@ -311,6 +369,7 @@
168
 {
169
    obs_data_set_default_string(settings, S_SAMPLING, S_SAMPLING_BICUBIC);
170
    obs_data_set_default_string(settings, S_RESOLUTION, T_NONE);
171
+   obs_data_set_default_bool(settings, S_UNDISTORT, 0);
172
 }
173
 
174
 static uint32_t scale_filter_width(void *data)
175
obs-studio-17.0.2.tar.xz/plugins/obs-outputs/CMakeLists.txt -> obs-studio-18.0.0.tar.xz/plugins/obs-outputs/CMakeLists.txt Changed
17
 
1
@@ -62,6 +62,7 @@
2
 set(obs-outputs_HEADERS
3
    obs-output-ver.h
4
    rtmp-helpers.h
5
+   rtmp-stream.h
6
    net-if.h
7
    flv-mux.h
8
    flv-output.h
9
@@ -69,6 +70,7 @@
10
 set(obs-outputs_SOURCES
11
    obs-outputs.c
12
    rtmp-stream.c
13
+   rtmp-windows.c
14
    flv-output.c
15
    flv-mux.c
16
    net-if.c)
17
obs-studio-17.0.2.tar.xz/plugins/obs-outputs/flv-output.c -> obs-studio-18.0.0.tar.xz/plugins/obs-outputs/flv-output.c Changed
16
 
1
@@ -73,11 +73,12 @@
2
    struct flv_output *stream = data;
3
 
4
    if (stream->active) {
5
-       if (stream->file)
6
+       if (stream->file) {
7
            write_file_info(stream->file, stream->last_packet_ts,
8
                    os_ftelli64(stream->file));
9
 
10
-       fclose(stream->file);
11
+           fclose(stream->file);
12
+       }
13
        obs_output_end_data_capture(stream->output);
14
        stream->active = false;
15
        stream->sent_headers = false;
16
obs-studio-17.0.2.tar.xz/plugins/obs-outputs/librtmp/rtmp.c -> obs-studio-18.0.0.tar.xz/plugins/obs-outputs/librtmp/rtmp.c Changed
13
 
1
@@ -4252,6 +4252,11 @@
2
         r->Link.lFlags ^= RTMP_LF_FTCU;
3
     }
4
 
5
+    memset (&r->m_bindIP, 0, sizeof(r->m_bindIP));
6
+    r->m_bCustomSend = 0;
7
+    r->m_customSendFunc = NULL;
8
+    r->m_customSendParam = NULL;
9
+
10
 #if defined(CRYPTO) || defined(USE_ONLY_MD5)
11
     if (!(r->Link.protocol & RTMP_FEATURE_WRITE) || (r->Link.pFlags & RTMP_PUB_CLEAN))
12
     {
13
obs-studio-17.0.2.tar.xz/plugins/obs-outputs/rtmp-stream.c -> obs-studio-18.0.0.tar.xz/plugins/obs-outputs/rtmp-stream.c Changed
201
 
1
@@ -15,95 +15,7 @@
2
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
3
 ******************************************************************************/
4
 
5
-#include <obs-module.h>
6
-#include <obs-avc.h>
7
-#include <util/platform.h>
8
-#include <util/circlebuf.h>
9
-#include <util/dstr.h>
10
-#include <util/threading.h>
11
-#include <inttypes.h>
12
-#include "librtmp/rtmp.h"
13
-#include "librtmp/log.h"
14
-#include "flv-mux.h"
15
-#include "net-if.h"
16
-
17
-#ifdef _WIN32
18
-#include <Iphlpapi.h>
19
-#else
20
-#include <sys/ioctl.h>
21
-#endif
22
-
23
-#define do_log(level, format, ...) \
24
-   blog(level, "[rtmp stream: '%s'] " format, \
25
-           obs_output_get_name(stream->output), ##__VA_ARGS__)
26
-
27
-#define warn(format, ...)  do_log(LOG_WARNING, format, ##__VA_ARGS__)
28
-#define info(format, ...)  do_log(LOG_INFO,    format, ##__VA_ARGS__)
29
-#define debug(format, ...) do_log(LOG_DEBUG,   format, ##__VA_ARGS__)
30
-
31
-#define OPT_DROP_THRESHOLD "drop_threshold_ms"
32
-#define OPT_PFRAME_DROP_THRESHOLD "pframe_drop_threshold_ms"
33
-#define OPT_MAX_SHUTDOWN_TIME_SEC "max_shutdown_time_sec"
34
-#define OPT_BIND_IP "bind_ip"
35
-
36
-//#define TEST_FRAMEDROPS
37
-
38
-#ifdef TEST_FRAMEDROPS
39
-
40
-#define DROPTEST_MAX_KBPS 3000
41
-#define DROPTEST_MAX_BYTES (DROPTEST_MAX_KBPS * 1000 / 8)
42
-
43
-struct droptest_info {
44
-   uint64_t ts;
45
-   size_t size;
46
-};
47
-#endif
48
-
49
-struct rtmp_stream {
50
-   obs_output_t     *output;
51
-
52
-   pthread_mutex_t  packets_mutex;
53
-   struct circlebuf packets;
54
-   bool             sent_headers;
55
-
56
-   volatile bool    connecting;
57
-   pthread_t        connect_thread;
58
-
59
-   volatile bool    active;
60
-   volatile bool    disconnected;
61
-   pthread_t        send_thread;
62
-
63
-   int              max_shutdown_time_sec;
64
-
65
-   os_sem_t         *send_sem;
66
-   os_event_t       *stop_event;
67
-   uint64_t         stop_ts;
68
-   uint64_t         shutdown_timeout_ts;
69
-
70
-   struct dstr      path, key;
71
-   struct dstr      username, password;
72
-   struct dstr      encoder_name;
73
-   struct dstr      bind_ip;
74
-
75
-   /* frame drop variables */
76
-   int64_t          drop_threshold_usec;
77
-   int64_t          min_drop_dts_usec;
78
-   int64_t          pframe_drop_threshold_usec;
79
-   int64_t          pframe_min_drop_dts_usec;
80
-   int              min_priority;
81
-
82
-   int64_t          last_dts_usec;
83
-
84
-   uint64_t         total_bytes_sent;
85
-   int              dropped_frames;
86
-
87
-#ifdef TEST_FRAMEDROPS
88
-   struct circlebuf droptest_info;
89
-   size_t           droptest_size;
90
-#endif
91
-
92
-   RTMP             rtmp;
93
-};
94
+#include "rtmp-stream.h"
95
 
96
 static const char *rtmp_stream_getname(void *unused)
97
 {
98
@@ -180,23 +92,26 @@
99
        }
100
    }
101
 
102
-   if (stream) {
103
-       free_packets(stream);
104
-       dstr_free(&stream->path);
105
-       dstr_free(&stream->key);
106
-       dstr_free(&stream->username);
107
-       dstr_free(&stream->password);
108
-       dstr_free(&stream->encoder_name);
109
-       dstr_free(&stream->bind_ip);
110
-       os_event_destroy(stream->stop_event);
111
-       os_sem_destroy(stream->send_sem);
112
-       pthread_mutex_destroy(&stream->packets_mutex);
113
-       circlebuf_free(&stream->packets);
114
+   if (stream->socket_thread_active)
115
+       pthread_join(stream->socket_thread, NULL);
116
+
117
+   free_packets(stream);
118
+   dstr_free(&stream->path);
119
+   dstr_free(&stream->key);
120
+   dstr_free(&stream->username);
121
+   dstr_free(&stream->password);
122
+   dstr_free(&stream->encoder_name);
123
+   dstr_free(&stream->bind_ip);
124
+   os_event_destroy(stream->stop_event);
125
+   os_sem_destroy(stream->send_sem);
126
+   pthread_mutex_destroy(&stream->packets_mutex);
127
+   circlebuf_free(&stream->packets);
128
 #ifdef TEST_FRAMEDROPS
129
-       circlebuf_free(&stream->droptest_info);
130
+   circlebuf_free(&stream->droptest_info);
131
 #endif
132
-       bfree(stream);
133
-   }
134
+   if (stream->write_buf)
135
+       bfree(stream->write_buf);
136
+   bfree(stream);
137
 }
138
 
139
 static void *rtmp_stream_create(obs_data_t *settings, obs_output_t *output)
140
@@ -346,6 +261,38 @@
141
 }
142
 #endif
143
 
144
+static int socket_queue_data(RTMPSockBuf *sb, const char *data, int len, void *arg)
145
+{
146
+   struct rtmp_stream *stream = arg;
147
+
148
+retry_send:
149
+
150
+   if (!RTMP_IsConnected(&stream->rtmp))
151
+       return 0;
152
+
153
+   pthread_mutex_lock(&stream->write_buf_mutex);
154
+
155
+   if (stream->write_buf_len + len > stream->write_buf_size) {
156
+
157
+       pthread_mutex_unlock(&stream->write_buf_mutex);
158
+
159
+       if (os_event_wait(stream->buffer_space_available_event)) {
160
+           return 0;
161
+       }
162
+
163
+       goto retry_send;
164
+   }
165
+
166
+   memcpy(stream->write_buf + stream->write_buf_len, data, len);
167
+   stream->write_buf_len += len;
168
+
169
+   pthread_mutex_unlock(&stream->write_buf_mutex);
170
+
171
+   os_event_signal (stream->buffer_has_data_event);
172
+
173
+   return len;
174
+}
175
+
176
 static int send_packet(struct rtmp_stream *stream,
177
        struct encoder_packet *packet, bool is_header, size_t idx)
178
 {
179
@@ -354,16 +301,18 @@
180
    int     recv_size = 0;
181
    int     ret = 0;
182
 
183
+   if (!stream->new_socket_loop) {
184
 #ifdef _WIN32
185
-   ret = ioctlsocket(stream->rtmp.m_sb.sb_socket, FIONREAD,
186
-           (u_long*)&recv_size);
187
+       ret = ioctlsocket(stream->rtmp.m_sb.sb_socket, FIONREAD,
188
+               (u_long*)&recv_size);
189
 #else
190
-   ret = ioctl(stream->rtmp.m_sb.sb_socket, FIONREAD, &recv_size);
191
+       ret = ioctl(stream->rtmp.m_sb.sb_socket, FIONREAD, &recv_size);
192
 #endif
193
 
194
-   if (ret >= 0 && recv_size > 0) {
195
-       if (!discard_recv_data(stream, (size_t)recv_size))
196
-           return -1;
197
+       if (ret >= 0 && recv_size > 0) {
198
+           if (!discard_recv_data(stream, (size_t)recv_size))
199
+               return -1;
200
+       }
201
obs-studio-18.0.0.tar.xz/plugins/obs-outputs/rtmp-stream.h Added
113
 
1
@@ -0,0 +1,111 @@
2
+#include <obs-module.h>
3
+#include <obs-avc.h>
4
+#include <util/platform.h>
5
+#include <util/circlebuf.h>
6
+#include <util/dstr.h>
7
+#include <util/threading.h>
8
+#include <inttypes.h>
9
+#include "librtmp/rtmp.h"
10
+#include "librtmp/log.h"
11
+#include "flv-mux.h"
12
+#include "net-if.h"
13
+
14
+#ifdef _WIN32
15
+#include <Iphlpapi.h>
16
+#else
17
+#include <sys/ioctl.h>
18
+#endif
19
+
20
+#define do_log(level, format, ...) \
21
+   blog(level, "[rtmp stream: '%s'] " format, \
22
+           obs_output_get_name(stream->output), ##__VA_ARGS__)
23
+
24
+#define warn(format, ...)  do_log(LOG_WARNING, format, ##__VA_ARGS__)
25
+#define info(format, ...)  do_log(LOG_INFO,    format, ##__VA_ARGS__)
26
+#define debug(format, ...) do_log(LOG_DEBUG,   format, ##__VA_ARGS__)
27
+
28
+#define OPT_DROP_THRESHOLD "drop_threshold_ms"
29
+#define OPT_PFRAME_DROP_THRESHOLD "pframe_drop_threshold_ms"
30
+#define OPT_MAX_SHUTDOWN_TIME_SEC "max_shutdown_time_sec"
31
+#define OPT_BIND_IP "bind_ip"
32
+#define OPT_NEWSOCKETLOOP_ENABLED "new_socket_loop_enabled"
33
+#define OPT_LOWLATENCY_ENABLED "low_latency_mode_enabled"
34
+
35
+#define STREAM_WRITE_BUFFER_SIZE 524288
36
+
37
+//#define TEST_FRAMEDROPS
38
+
39
+#ifdef TEST_FRAMEDROPS
40
+
41
+#define DROPTEST_MAX_KBPS 3000
42
+#define DROPTEST_MAX_BYTES (DROPTEST_MAX_KBPS * 1000 / 8)
43
+
44
+struct droptest_info {
45
+   uint64_t ts;
46
+   size_t size;
47
+};
48
+#endif
49
+
50
+struct rtmp_stream {
51
+   obs_output_t     *output;
52
+
53
+   pthread_mutex_t  packets_mutex;
54
+   struct circlebuf packets;
55
+   bool             sent_headers;
56
+
57
+   volatile bool    connecting;
58
+   pthread_t        connect_thread;
59
+
60
+   volatile bool    active;
61
+   volatile bool    disconnected;
62
+   pthread_t        send_thread;
63
+
64
+   int              max_shutdown_time_sec;
65
+
66
+   os_sem_t         *send_sem;
67
+   os_event_t       *stop_event;
68
+   uint64_t         stop_ts;
69
+   uint64_t         shutdown_timeout_ts;
70
+
71
+   struct dstr      path, key;
72
+   struct dstr      username, password;
73
+   struct dstr      encoder_name;
74
+   struct dstr      bind_ip;
75
+
76
+   /* frame drop variables */
77
+   int64_t          drop_threshold_usec;
78
+   int64_t          min_drop_dts_usec;
79
+   int64_t          pframe_drop_threshold_usec;
80
+   int64_t          pframe_min_drop_dts_usec;
81
+   int              min_priority;
82
+   float            congestion;
83
+
84
+   int64_t          last_dts_usec;
85
+
86
+   uint64_t         total_bytes_sent;
87
+   int              dropped_frames;
88
+
89
+#ifdef TEST_FRAMEDROPS
90
+   struct circlebuf droptest_info;
91
+   size_t           droptest_size;
92
+#endif
93
+
94
+   RTMP             rtmp;
95
+
96
+   bool             new_socket_loop;
97
+   bool             low_latency_mode;
98
+   bool             disable_send_window_optimization;
99
+   bool             socket_thread_active;
100
+   pthread_t        socket_thread;
101
+   uint8_t          *write_buf;
102
+   size_t           write_buf_len;
103
+   size_t           write_buf_size;
104
+   pthread_mutex_t  write_buf_mutex;
105
+   os_event_t       *buffer_space_available_event;
106
+   os_event_t       *buffer_has_data_event;
107
+   os_event_t       *socket_available_event;
108
+};
109
+
110
+#ifdef _WIN32
111
+void *socket_thread_windows(void *data);
112
+#endif
113
obs-studio-18.0.0.tar.xz/plugins/obs-outputs/rtmp-windows.c Added
201
 
1
@@ -0,0 +1,342 @@
2
+#ifdef _WIN32
3
+#include "rtmp-stream.h"
4
+#include <winsock2.h>
5
+
6
+static void fatal_sock_shutdown(struct rtmp_stream *stream)
7
+{
8
+   closesocket(stream->rtmp.m_sb.sb_socket);
9
+   stream->rtmp.m_sb.sb_socket = -1;
10
+   stream->write_buf_len = 0;
11
+}
12
+
13
+static bool socket_event(struct rtmp_stream *stream, bool *can_write,
14
+       uint64_t last_send_time)
15
+{
16
+   WSANETWORKEVENTS net_events;
17
+   bool success;
18
+
19
+   success = !!WSAEnumNetworkEvents(stream->rtmp.m_sb.sb_socket, NULL,
20
+           &net_events);
21
+   if (success) {
22
+       blog(LOG_ERROR, "socket_thread_windows: Aborting due to "
23
+               "WSAEnumNetworkEvents failure, %d",
24
+               WSAGetLastError());
25
+       fatal_sock_shutdown(stream);
26
+       return false;
27
+   }
28
+
29
+   if (net_events.lNetworkEvents & FD_WRITE)
30
+       *can_write = true;
31
+
32
+   if (net_events.lNetworkEvents & FD_CLOSE) {
33
+       if (last_send_time) {
34
+           uint32_t diff =
35
+               (os_gettime_ns() / 1000000) - last_send_time;
36
+
37
+           blog(LOG_ERROR, "socket_thread_windows: Received "
38
+                   "FD_CLOSE, %u ms since last send "
39
+                   "(buffer: %d / %d)",
40
+                   diff,
41
+                   stream->write_buf_len,
42
+                   stream->write_buf_size);
43
+       }
44
+
45
+       if (os_event_try(stream->stop_event) != EAGAIN)
46
+           blog(LOG_ERROR, "socket_thread_windows: Aborting due "
47
+                   "to FD_CLOSE during shutdown, "
48
+                   "%d bytes lost, error %d",
49
+                   stream->write_buf_len,
50
+                   net_events.iErrorCode[FD_CLOSE_BIT]);
51
+       else
52
+           blog(LOG_ERROR, "socket_thread_windows: Aborting due "
53
+                   "to FD_CLOSE, error %d",
54
+                   net_events.iErrorCode[FD_CLOSE_BIT]);
55
+
56
+       fatal_sock_shutdown(stream);
57
+       return false;
58
+   }
59
+
60
+   if (net_events.lNetworkEvents & FD_READ) {
61
+       char discard[16384];
62
+       int err_code;
63
+       bool fatal = false;
64
+
65
+       for (;;) {
66
+           int ret = recv(stream->rtmp.m_sb.sb_socket,
67
+                   discard, sizeof(discard), 0);
68
+           if (ret == -1) {
69
+               err_code = WSAGetLastError();
70
+               if (err_code == WSAEWOULDBLOCK)
71
+                   break;
72
+
73
+               fatal = true;
74
+           } else if (ret == 0) {
75
+               err_code = 0;
76
+               fatal = true;
77
+           }
78
+
79
+           if (fatal) {
80
+               blog(LOG_ERROR, "socket_thread_windows: "
81
+                       "Socket error, recv() returned "
82
+                       "%d, GetLastError() %d",
83
+                       ret, err_code);
84
+               fatal_sock_shutdown(stream);
85
+               return false;
86
+           }
87
+       }
88
+   }
89
+
90
+   return true;
91
+}
92
+
93
+static void ideal_send_backlog_event(struct rtmp_stream *stream,
94
+       bool *can_write)
95
+{
96
+   ULONG ideal_send_backlog;
97
+   int ret;
98
+
99
+   ret = idealsendbacklogquery(
100
+           stream->rtmp.m_sb.sb_socket,
101
+           &ideal_send_backlog);
102
+   if (ret == 0) {
103
+       int cur_tcp_bufsize;
104
+       int size = sizeof(cur_tcp_bufsize);
105
+
106
+       ret = getsockopt(stream->rtmp.m_sb.sb_socket,
107
+               SOL_SOCKET,
108
+               SO_SNDBUF,
109
+               (char *)&cur_tcp_bufsize,
110
+               &size);
111
+       if (ret == 0) {
112
+           if (cur_tcp_bufsize < (int)ideal_send_backlog) {
113
+               int bufsize = (int)ideal_send_backlog;
114
+               setsockopt(stream->rtmp.m_sb.sb_socket,
115
+                       SOL_SOCKET,
116
+                       SO_SNDBUF,
117
+                       (const char *)&bufsize,
118
+                       sizeof(bufsize));
119
+
120
+               blog(LOG_INFO, "socket_thread_windows: "
121
+                       "Increasing send buffer to "
122
+                       "ISB %d (buffer: %d / %d)",
123
+                       ideal_send_backlog,
124
+                       stream->write_buf_len,
125
+                       stream->write_buf_size);
126
+           }
127
+       } else {
128
+           blog(LOG_ERROR, "socket_thread_windows: Got "
129
+                   "send_backlog_event but "
130
+                   "getsockopt() returned %d",
131
+                   WSAGetLastError());
132
+       }
133
+   } else {
134
+       blog(LOG_ERROR, "socket_thread_windows: Got "
135
+               "send_backlog_event but WSAIoctl() "
136
+               "returned %d",
137
+               WSAGetLastError());
138
+   }
139
+}
140
+
141
+enum data_ret {
142
+   RET_BREAK,
143
+   RET_FATAL,
144
+   RET_CONTINUE
145
+};
146
+
147
+static enum data_ret write_data(struct rtmp_stream *stream, bool *can_write,
148
+       uint64_t *last_send_time, size_t latency_packet_size,
149
+       int delay_time)
150
+{
151
+   bool exit_loop = false;
152
+
153
+   pthread_mutex_lock(&stream->write_buf_mutex);
154
+
155
+   if (!stream->write_buf_len) {
156
+       /* this is now an expected occasional condition due to use of
157
+        * auto-reset events, we could end up emptying the buffer as
158
+        * it's filled in a previous loop cycle, especially if using
159
+        * low latency mode. */
160
+       pthread_mutex_unlock(&stream->write_buf_mutex);
161
+       /* blog(LOG_DEBUG, "socket_thread_windows: Trying to send, "
162
+               "but no data available"); */
163
+       return RET_BREAK;
164
+   }
165
+
166
+   int ret;
167
+   if (stream->low_latency_mode) {
168
+       size_t send_len =
169
+           min(latency_packet_size, stream->write_buf_len);
170
+
171
+       ret = send(stream->rtmp.m_sb.sb_socket,
172
+               (const char *)stream->write_buf,
173
+               (int)send_len, 0);
174
+   } else {
175
+       ret = send(stream->rtmp.m_sb.sb_socket,
176
+               (const char *)stream->write_buf,
177
+               (int)stream->write_buf_len, 0);
178
+   }
179
+
180
+   if (ret > 0) {
181
+       if (stream->write_buf_len - ret)
182
+           memmove(stream->write_buf,
183
+                   stream->write_buf + ret,
184
+                   stream->write_buf_len - ret);
185
+       stream->write_buf_len -= ret;
186
+
187
+       *last_send_time = os_gettime_ns() / 1000000;
188
+
189
+       os_event_signal(stream->buffer_space_available_event);
190
+   } else {
191
+       int err_code;
192
+       bool fatal_err = false;
193
+
194
+       if (ret == -1) {
195
+           err_code = WSAGetLastError();
196
+
197
+           if (err_code == WSAEWOULDBLOCK) {
198
+               *can_write = false;
199
+               pthread_mutex_unlock(&stream->write_buf_mutex);
200
+               return RET_BREAK;
201
obs-studio-17.0.2.tar.xz/plugins/obs-qsv11/QSV_Encoder_Internal.cpp -> obs-studio-18.0.0.tar.xz/plugins/obs-qsv11/QSV_Encoder_Internal.cpp Changed
40
 
1
@@ -517,18 +517,21 @@
2
    }
3
 
4
    mfxFrameSurface1 *pSurface = m_pmfxSurfaces[nSurfIdx];
5
-   if (m_bUseD3D11 || m_bD3D9HACK)
6
+   if (m_bUseD3D11 || m_bD3D9HACK) {
7
        sts = m_mfxAllocator.Lock(m_mfxAllocator.pthis,
8
                pSurface->Data.MemId, &(pSurface->Data));
9
+       MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
10
+   }
11
 
12
    sts = LoadNV12(pSurface, pDataY, pDataUV, strideY, strideUV);
13
+   MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
14
    pSurface->Data.TimeStamp = ts;
15
 
16
-   if (m_bUseD3D11 || m_bD3D9HACK)
17
+   if (m_bUseD3D11 || m_bD3D9HACK) {
18
        sts = m_mfxAllocator.Unlock(m_mfxAllocator.pthis,
19
                pSurface->Data.MemId, &(pSurface->Data));
20
-
21
-   MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
22
+       MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts);
23
+   }
24
 
25
    for (;;) {
26
        // Encode a frame asychronously (returns immediately)
27
@@ -592,10 +595,8 @@
28
 
29
    delete m_outBitstream.Data;
30
 
31
-   if (m_pmfxENC != NULL) {
32
-       delete m_pmfxENC;
33
-       m_pmfxENC = NULL;
34
-   }
35
+   delete m_pmfxENC;
36
+   m_pmfxENC = NULL;
37
 
38
    if (m_bUseD3D11 || m_bD3D9HACK)
39
        Release();
40
obs-studio-17.0.2.tar.xz/plugins/obs-qsv11/common_utils.cpp -> obs-studio-18.0.0.tar.xz/plugins/obs-qsv11/common_utils.cpp Changed
10
 
1
@@ -148,7 +148,7 @@
2
     if (MFX_ERR_NONE != sts)
3
         return sts;
4
     // load V
5
-    ReadPlaneData(w, h, buf, ptr, pitch, 1, fSource);
6
+    sts = ReadPlaneData(w, h, buf, ptr, pitch, 1, fSource);
7
     if (MFX_ERR_NONE != sts)
8
         return sts;
9
 
10
obs-studio-17.0.2.tar.xz/plugins/obs-qsv11/data/locale/sv-SE.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-qsv11/data/locale/sv-SE.ini Changed
7
 
1
@@ -8,4 +8,5 @@
2
 Accuracy="Noggrannhet"
3
 Convergence="Konvergens"
4
 ICQQuality="ICQ-kvalitet"
5
+LookAheadDepth="Lookahead-djup"
6
 
7
obs-studio-17.0.2.tar.xz/plugins/obs-qsv11/obs-qsv11.c -> obs-studio-18.0.0.tar.xz/plugins/obs-qsv11/obs-qsv11.c Changed
18
 
1
@@ -686,6 +686,8 @@
2
 
3
    mfxU64 qsvPTS = frame->pts * 90000 / voi->fps_num;
4
 
5
+   // FIXME: remove null check from the top of this function
6
+   // if we actually do expect null frames to complete output.
7
    if (frame)
8
        ret = qsv_encoder_encode(
9
            obsqsv->context,
10
@@ -701,6 +703,7 @@
11
 
12
    if (ret < 0) {
13
        warn("encode failed");
14
+       LeaveCriticalSection(&g_QsvCs);
15
        return false;
16
    }
17
 
18
obs-studio-18.0.0.tar.xz/plugins/obs-text/data/locale/da-DK.ini Added
36
 
1
@@ -0,0 +1,34 @@
2
+TextGDIPlus="Tekst (GDI+)"
3
+Font="Skrifttype"
4
+Text="Tekst"
5
+ReadFromFile="Indlæs fra fil"
6
+TextFile="Tekstfil (UTF-8)"
7
+Filter.TextFiles="Tekstfiler"
8
+Filter.AllFiles="Alle filer"
9
+Color="Farve"
10
+Opacity="Gennemsigtighed"
11
+Gradient="Gradient"
12
+Gradient.Color="Gradient farve"
13
+Gradient.Opacity="Gradient gennemsigtighed"
14
+Gradient.Direction="Gradient retning"
15
+BkColor="Baggrundsfarve"
16
+BkOpacity="Baggrunds gennemsigtighed"
17
+Alignment="Justering"
18
+Alignment.Left="Venstre"
19
+Alignment.Center="Centreret"
20
+Alignment.Right="Højre"
21
+Vertical="Vertikal"
22
+VerticalAlignment="Vertikal justering"
23
+VerticalAlignment.Top="Top"
24
+VerticalAlignment.Bottom="Bund"
25
+Outline="Kontur"
26
+Outline.Size="Kontur størrelse"
27
+Outline.Color="Kontur farve"
28
+Outline.Opacity="Kontur gennemsigtighed"
29
+ChatlogMode="Chatlog tilstand"
30
+ChatlogMode.Lines="Chatlog linebegrænsning"
31
+UseCustomExtents="Brug tilpasset tekstomfang"
32
+UseCustomExtents.Wrap="Ombryd"
33
+Width="Bredde"
34
+Height="Højde"
35
+
36
obs-studio-18.0.0.tar.xz/plugins/obs-text/data/locale/pt-BR.ini Added
36
 
1
@@ -0,0 +1,34 @@
2
+TextGDIPlus="Texto (GDI+)"
3
+Font="Fonte"
4
+Text="Texto"
5
+ReadFromFile="Carregar do Arquivo"
6
+TextFile="Arquivo de Texto (UTF-8)"
7
+Filter.TextFiles="Arquivos de Texto"
8
+Filter.AllFiles="Todos os Arquivos"
9
+Color="Cor"
10
+Opacity="Opacidade"
11
+Gradient="Gradiente"
12
+Gradient.Color="Cor do Gradiente"
13
+Gradient.Opacity="Opacidade do Gradiente"
14
+Gradient.Direction="Direção do Gradiente"
15
+BkColor="Cor de Fundo"
16
+BkOpacity="Opacidade de Fundo"
17
+Alignment="Alinhamento"
18
+Alignment.Left="Esquerda"
19
+Alignment.Center="Centralizado"
20
+Alignment.Right="Direita"
21
+Vertical="Vertical"
22
+VerticalAlignment="Alinhamento Vertical"
23
+VerticalAlignment.Top="Em cima"
24
+VerticalAlignment.Bottom="Em baixo"
25
+Outline="Contorno"
26
+Outline.Size="Tamanho do Contorno"
27
+Outline.Color="Cor do Contorno"
28
+Outline.Opacity="Opacidade do Contorno"
29
+ChatlogMode="Modo de Chat"
30
+ChatlogMode.Lines="Limite de Linhas do Chat"
31
+UseCustomExtents="Usar extensões de texto personalizadas"
32
+UseCustomExtents.Wrap="Ajustar"
33
+Width="Largura"
34
+Height="Altura"
35
+
36
obs-studio-18.0.0.tar.xz/plugins/obs-text/data/locale/ro-RO.ini Added
25
 
1
@@ -0,0 +1,23 @@
2
+TextGDIPlus="Text (GDI+)"
3
+Font="Font"
4
+Text="Text"
5
+ReadFromFile="Citește din fișier"
6
+TextFile="Fișier text (UTF-8)"
7
+Filter.TextFiles="Fișiere Text"
8
+Filter.AllFiles="Toate fișierele"
9
+Color="Culoare"
10
+Opacity="Opacitate"
11
+BkColor="Culoare Fundal"
12
+BkOpacity="Opacitate Fundal"
13
+Alignment="Aliniere"
14
+Alignment.Left="Stânga"
15
+Alignment.Center="Centru"
16
+Alignment.Right="Dreapta"
17
+Vertical="Vertical"
18
+Outline="Contur"
19
+Outline.Size="Dimensiune Contur"
20
+Outline.Color="Culoare Contur"
21
+Outline.Opacity="Opacitate Contur"
22
+Width="Lățime"
23
+Height="Înălțime"
24
+
25
obs-studio-17.0.2.tar.xz/plugins/obs-text/gdiplus/obs-text.cpp -> obs-studio-18.0.0.tar.xz/plugins/obs-text/gdiplus/obs-text.cpp Changed
9
 
1
@@ -288,6 +288,7 @@
2
    lf.lfUnderline = underline;
3
    lf.lfStrikeOut = strikeout;
4
    lf.lfQuality = ANTIALIASED_QUALITY;
5
+   lf.lfCharSet = DEFAULT_CHARSET;
6
 
7
    if (!face.empty()) {
8
        wcscpy(lf.lfFaceName, face.c_str());
9
obs-studio-17.0.2.tar.xz/plugins/obs-transitions/data/fade_to_color_transition.effect -> obs-studio-18.0.0.tar.xz/plugins/obs-transitions/data/fade_to_color_transition.effect Changed
19
 
1
@@ -14,6 +14,8 @@
2
    float2 uv  : TEXCOORD0;
3
 };
4
 
5
+#include "premultiplied.inc"
6
+
7
 VertData VSDefault(VertData v_in)
8
 {
9
    VertData vert_out;
10
@@ -24,7 +26,7 @@
11
 
12
 float4 PSFadeToColor(VertData v_in) : TARGET
13
 {
14
-   return lerp(tex.Sample(textureSampler, v_in.uv), color, swp);
15
+   return lerp(convert_pmalpha(tex.Sample(textureSampler, v_in.uv)), color, swp);
16
 }
17
 
18
 technique FadeToColor
19
obs-studio-17.0.2.tar.xz/plugins/obs-transitions/data/fade_transition.effect -> obs-studio-18.0.0.tar.xz/plugins/obs-transitions/data/fade_transition.effect Changed
21
 
1
@@ -14,6 +14,8 @@
2
    float2 uv  : TEXCOORD0;
3
 };
4
 
5
+#include "premultiplied.inc"
6
+
7
 VertData VSDefault(VertData v_in)
8
 {
9
    VertData vert_out;
10
@@ -24,8 +26,8 @@
11
 
12
 float4 PSFade(VertData v_in) : TARGET
13
 {
14
-   float4 a_val = tex_a.Sample(textureSampler, v_in.uv);
15
-   float4 b_val = tex_b.Sample(textureSampler, v_in.uv);
16
+   float4 a_val = convert_pmalpha(tex_a.Sample(textureSampler, v_in.uv));
17
+   float4 b_val = convert_pmalpha(tex_b.Sample(textureSampler, v_in.uv));
18
    return lerp(a_val, b_val, fade_val);
19
 }
20
 
21
obs-studio-17.0.2.tar.xz/plugins/obs-transitions/data/locale/da-DK.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-transitions/data/locale/da-DK.ini Changed
44
 
1
@@ -11,4 +11,42 @@
2
 SwipeIn="Swipe ind"
3
 Color="Farve"
4
 SwitchPoint="Farvepeakpunkt (procent)"
5
+LumaWipeTransition="Luma overgang"
6
+LumaWipe.Image="Billede"
7
+LumaWipe.Invert="Inverter"
8
+LumaWipe.Softness="Blødhed"
9
+LumaWipe.Type.BarndoorBottomLeft="Stalddør nederst til venstre"
10
+LumaWipe.Type.BarndoorHorizontal="Stalddør horisontal"
11
+LumaWipe.Type.BarndoorTopLeft="Stalddør øverst til venstre"
12
+LumaWipe.Type.BarndoorVertical="Stalddør vertikal"
13
+LumaWipe.Type.BlindsHorizontal="Persienne horisontal"
14
+LumaWipe.Type.BoxBottomLeft="Boks nederst til venstre"
15
+LumaWipe.Type.BoxBottomRight="Boks nederst til højre"
16
+LumaWipe.Type.BoxTopLeft="Boks øverst til venstre"
17
+LumaWipe.Type.BoxTopRight="Boks øverst til højre"
18
+LumaWipe.Type.Burst="Sprængning"
19
+LumaWipe.Type.CheckerboardSmall="Små skaktern"
20
+LumaWipe.Type.Circles="Cirkler"
21
+LumaWipe.Type.Clock="Ur"
22
+LumaWipe.Type.Cloud="Sky"
23
+LumaWipe.Type.Curtain="Gardin"
24
+LumaWipe.Type.Fan="Vifte"
25
+LumaWipe.Type.Fractal="Fraktal"
26
+LumaWipe.Type.Iris="Iris"
27
+LumaWipe.Type.LinearHorizontal="Lineær horisontal"
28
+LumaWipe.Type.LinearTopLeft="Lineær øverst til venstre"
29
+LumaWipe.Type.LinearTopRight="Lineær øverst til højre"
30
+LumaWipe.Type.LinearVertical="Lineær vertikal"
31
+LumaWipe.Type.ParallelZigzagHorizontal="Parallel zigzag horisontal"
32
+LumaWipe.Type.ParallelZigzagVertical="Parallel zigzag vertikal"
33
+LumaWipe.Type.Sinus9="Sinus 9"
34
+LumaWipe.Type.Spiral="Spiral"
35
+LumaWipe.Type.Square="Firkant"
36
+LumaWipe.Type.Squares="Firkanter"
37
+LumaWipe.Type.Stripes="Striber"
38
+LumaWipe.Type.StripsHorizontal="Strimmel horisontal"
39
+LumaWipe.Type.StripsVertical="Strimmel vertikal"
40
+LumaWipe.Type.Watercolor="Vandfarve"
41
+LumaWipe.Type.ZigzagHorizontal="Zigzag horisontal"
42
+LumaWipe.Type.ZigzagVertical="Zigzag vertical"
43
 
44
obs-studio-17.0.2.tar.xz/plugins/obs-transitions/data/locale/nb-NO.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-transitions/data/locale/nb-NO.ini Changed
9
 
1
@@ -11,4 +11,7 @@
2
 SwipeIn="Sveip inn"
3
 Color="Farge"
4
 SwitchPoint="Farge ved høydepunkt (prosent)"
5
+LumaWipe.Image="Bilde"
6
+LumaWipe.Invert="Inverter"
7
+LumaWipe.Softness="Mykhet"
8
 
9
obs-studio-17.0.2.tar.xz/plugins/obs-transitions/data/locale/pt-BR.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-transitions/data/locale/pt-BR.ini Changed
26
 
1
@@ -20,4 +20,24 @@
2
 LumaWipe.Type.BarndoorTopLeft="Barndoor inferior esquerdo"
3
 LumaWipe.Type.BarndoorVertical="Barndoor Vertical"
4
 LumaWipe.Type.BlindsHorizontal="Persianas horizontais"
5
+LumaWipe.Type.Circles="Círculos"
6
+LumaWipe.Type.Clock="Relógio"
7
+LumaWipe.Type.Cloud="Nuvem"
8
+LumaWipe.Type.Curtain="Cortina"
9
+LumaWipe.Type.Fan="Ventilar"
10
+LumaWipe.Type.Fractal="Fractal"
11
+LumaWipe.Type.Iris="Iris"
12
+LumaWipe.Type.LinearHorizontal="Linear Horizontal"
13
+LumaWipe.Type.LinearTopLeft="Linear superior esquerdo"
14
+LumaWipe.Type.LinearTopRight="Linear superior direito"
15
+LumaWipe.Type.LinearVertical="Linear Vertical"
16
+LumaWipe.Type.Spiral="Espiral"
17
+LumaWipe.Type.Square="Quadrado"
18
+LumaWipe.Type.Squares="Quadrados"
19
+LumaWipe.Type.Stripes="Listras"
20
+LumaWipe.Type.StripsHorizontal="Listras horizontais"
21
+LumaWipe.Type.StripsVertical="Listras Verticais"
22
+LumaWipe.Type.Watercolor="Aquarela"
23
+LumaWipe.Type.ZigzagHorizontal="Zigue-zague Horizontal"
24
+LumaWipe.Type.ZigzagVertical="Zigue-zague Vertical"
25
 
26
obs-studio-17.0.2.tar.xz/plugins/obs-transitions/data/locale/ro-RO.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-transitions/data/locale/ro-RO.ini Changed
10
 
1
@@ -11,4 +11,8 @@
2
 SwipeIn="Glisați înauntru"
3
 Color="Culoare"
4
 SwitchPoint="Punctul de vârf al culorii (procent)"
5
+LumaWipe.Image="Imagine"
6
+LumaWipe.Type.Cloud="Cloud"
7
+LumaWipe.Type.ZigzagHorizontal="Zigzag orizontal"
8
+LumaWipe.Type.ZigzagVertical="Zigzag Vertical"
9
 
10
obs-studio-17.0.2.tar.xz/plugins/obs-transitions/data/luma_wipe_transition.effect -> obs-studio-18.0.0.tar.xz/plugins/obs-transitions/data/luma_wipe_transition.effect Changed
21
 
1
@@ -20,6 +20,8 @@
2
    float2 uv  : TEXCOORD0;
3
 };
4
 
5
+#include "premultiplied.inc"
6
+
7
 VertData VSDefault(VertData v_in)
8
 {
9
    VertData vert_out;
10
@@ -31,8 +33,8 @@
11
 float4 PSLumaWipe(VertData v_in) : TARGET
12
 {
13
    float2 uv = v_in.uv;
14
-   float4 a_color = a_tex.Sample(textureSampler, uv);
15
-   float4 b_color = b_tex.Sample(textureSampler, uv);
16
+   float4 a_color = convert_pmalpha(a_tex.Sample(textureSampler, uv));
17
+   float4 b_color = convert_pmalpha(b_tex.Sample(textureSampler, uv));
18
    float luma     = l_tex.Sample(textureSampler, uv).x;
19
 
20
    if (invert)
21
obs-studio-18.0.0.tar.xz/plugins/obs-transitions/data/premultiplied.inc Added
11
 
1
@@ -0,0 +1,9 @@
2
+float4 convert_pmalpha(float4 color)
3
+{
4
+   float4 ret = color;
5
+   if (color.a >= 0.001)
6
+       ret.xyz /= color.a;
7
+   else
8
+       ret = float4(0.0, 0.0, 0.0, 0.0);
9
+   return ret;
10
+}
11
obs-studio-17.0.2.tar.xz/plugins/obs-transitions/data/slide_transition.effect -> obs-studio-18.0.0.tar.xz/plugins/obs-transitions/data/slide_transition.effect Changed
26
 
1
@@ -16,6 +16,8 @@
2
    float2 uv  : TEXCOORD0;
3
 };
4
 
5
+#include "premultiplied.inc"
6
+
7
 VertData VSDefault(VertData v_in)
8
 {
9
    VertData vert_out;
10
@@ -28,11 +30,14 @@
11
 {
12
    float2 tex_a_uv = v_in.uv + tex_a_dir;
13
    float2 tex_b_uv = v_in.uv - tex_b_dir;
14
+   float4 outc;
15
 
16
-   return (tex_a_uv.x - saturate(tex_a_uv.x) != 0.0) ||
17
+   outc = (tex_a_uv.x - saturate(tex_a_uv.x) != 0.0) ||
18
           (tex_a_uv.y - saturate(tex_a_uv.y) != 0.0)
19
           ? tex_b.Sample(textureSampler, tex_b_uv)
20
           : tex_a.Sample(textureSampler, tex_a_uv);
21
+
22
+   return convert_pmalpha(outc);
23
 }
24
 
25
 technique Slide
26
obs-studio-17.0.2.tar.xz/plugins/obs-transitions/data/swipe_transition.effect -> obs-studio-18.0.0.tar.xz/plugins/obs-transitions/data/swipe_transition.effect Changed
26
 
1
@@ -14,6 +14,8 @@
2
    float2 uv  : TEXCOORD0;
3
 };
4
 
5
+#include "premultiplied.inc"
6
+
7
 VertData VSDefault(VertData v_in)
8
 {
9
    VertData vert_out;
10
@@ -25,11 +27,14 @@
11
 float4 PSSwipe(VertData v_in) : TARGET
12
 {
13
    float2 swipe_uv = v_in.uv + swipe_val;
14
+   float4 outc;
15
 
16
-   return (swipe_uv.x - saturate(swipe_uv.x) != 0.0) ||
17
+   outc = (swipe_uv.x - saturate(swipe_uv.x) != 0.0) ||
18
           (swipe_uv.y - saturate(swipe_uv.y) != 0.0)
19
           ? tex_b.Sample(textureSampler, v_in.uv)
20
           : tex_a.Sample(textureSampler, swipe_uv);
21
+
22
+   return convert_pmalpha(outc);
23
 }
24
 
25
 technique Swipe
26
obs-studio-18.0.0.tar.xz/plugins/obs-vst Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/plugins/obs-vst/CMakeLists.txt Added
75
 
1
@@ -0,0 +1,72 @@
2
+project(obs-vst)
3
+
4
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}")
5
+
6
+find_package(Qt5Widgets REQUIRED)
7
+
8
+option(VST_USE_BUNDLED_HEADERS "Build with Bundled Headers" ON)
9
+
10
+if(VST_USE_BUNDLED_HEADERS)
11
+   message(STATUS "Using the bundled VST header.")
12
+   include_directories(vst_header)
13
+   set(vst_HEADER
14
+       vst_header/aeffectx.h)
15
+else()
16
+   set(VST_INCLUDE_DIR "" CACHE PATH
17
+       "Path to Steinburg headers (e.g. C:/VST3 SDK/pluginterfaces/vst2.x)")
18
+
19
+   message(WARNING "You should only use the Steinburg headers for debugging or local
20
+    builds. It is illegal to distribute the Steinburg headers with anything, and
21
+    possibly against the GPL to distribute the binaries from the resultant compile.")
22
+   include_directories(${VST_INCLUDE_DIR})
23
+   set(vst_HEADER
24
+       ${VST_INCLUDE_DIR}/aeffectx.h)
25
+endif()
26
+
27
+if(APPLE)
28
+   find_library(FOUNDATION_FRAMEWORK Foundation)
29
+   find_library(COCOA_FRAMEWORK Cocoa)
30
+endif(APPLE)
31
+
32
+set(obs-vst_SOURCES
33
+   obs-vst.cpp
34
+   VSTPlugin.cpp
35
+   EditorWidget.cpp)
36
+
37
+if(APPLE)
38
+   list(APPEND obs-vst_SOURCES
39
+       mac/VSTPlugin-osx.mm
40
+       mac/EditorWidget-osx.mm)
41
+
42
+elseif(WIN32)
43
+   list(APPEND obs-vst_SOURCES
44
+       win/VSTPlugin-win.cpp
45
+       win/EditorWidget-win.cpp)
46
+
47
+elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
48
+   list (APPEND obs-vst_SOURCES
49
+       linux/VSTPlugin-linux.cpp
50
+       linux/EditorWidget-linux.cpp)
51
+endif()
52
+
53
+list(APPEND obs-vst_HEADERS
54
+   headers/vst-plugin-callbacks.hpp
55
+   headers/EditorWidget.h
56
+   headers/VSTPlugin.h)
57
+
58
+add_library(obs-vst MODULE
59
+   ${obs-vst_SOURCES}
60
+   ${obs-vst_HEADERS}
61
+   ${vst-HEADER})
62
+
63
+target_link_libraries(obs-vst
64
+   libobs
65
+   Qt5::Widgets)
66
+
67
+if(APPLE)
68
+   target_link_libraries(obs-vst
69
+       ${COCOA_FRAMEWORK}
70
+       ${FOUNDATION_FRAMEWORK})
71
+endif(APPLE)
72
+
73
+install_obs_plugin_with_data(obs-vst data)
74
\ No newline at end of file
75
obs-studio-18.0.0.tar.xz/plugins/obs-vst/EditorWidget.cpp Added
33
 
1
@@ -0,0 +1,30 @@
2
+/*****************************************************************************
3
+Copyright (C) 2016-2017 by Colin Edwards.
4
+Additional Code Copyright (C) 2016-2017 by c3r1c3 <c3r1c3@nevermindonline.com>
5
+
6
+This program is free software: you can redistribute it and/or modify
7
+it under the terms of the GNU General Public License as published by
8
+the Free Software Foundation, either version 2 of the License, or
9
+(at your option) any later version.
10
+
11
+This program is distributed in the hope that it will be useful,
12
+but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
+GNU General Public License for more details.
15
+
16
+You should have received a copy of the GNU General Public License
17
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
+*****************************************************************************/
19
+
20
+#include "headers/EditorWidget.h"
21
+
22
+EditorWidget::EditorWidget(QWidget *parent, VSTPlugin *plugin) :
23
+       QWidget(parent), plugin(plugin) {
24
+   setWindowFlags(this->windowFlags() |=
25
+           Qt::MSWindowsFixedSizeDialogHint);
26
+}
27
+
28
+void EditorWidget::closeEvent(QCloseEvent *event) {
29
+   plugin->closeEditor();
30
+   UNUSED_PARAMETER(event);
31
+}
32
\ No newline at end of file
33
obs-studio-18.0.0.tar.xz/plugins/obs-vst/LICENSE Added
201
 
1
@@ -0,0 +1,339 @@
2
+                    GNU GENERAL PUBLIC LICENSE
3
+                       Version 2, June 1991
4
+
5
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
6
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
7
+ Everyone is permitted to copy and distribute verbatim copies
8
+ of this license document, but changing it is not allowed.
9
+
10
+                            Preamble
11
+
12
+  The licenses for most software are designed to take away your
13
+freedom to share and change it.  By contrast, the GNU General Public
14
+License is intended to guarantee your freedom to share and change free
15
+software--to make sure the software is free for all its users.  This
16
+General Public License applies to most of the Free Software
17
+Foundation's software and to any other program whose authors commit to
18
+using it.  (Some other Free Software Foundation software is covered by
19
+the GNU Lesser General Public License instead.)  You can apply it to
20
+your programs, too.
21
+
22
+  When we speak of free software, we are referring to freedom, not
23
+price.  Our General Public Licenses are designed to make sure that you
24
+have the freedom to distribute copies of free software (and charge for
25
+this service if you wish), that you receive source code or can get it
26
+if you want it, that you can change the software or use pieces of it
27
+in new free programs; and that you know you can do these things.
28
+
29
+  To protect your rights, we need to make restrictions that forbid
30
+anyone to deny you these rights or to ask you to surrender the rights.
31
+These restrictions translate to certain responsibilities for you if you
32
+distribute copies of the software, or if you modify it.
33
+
34
+  For example, if you distribute copies of such a program, whether
35
+gratis or for a fee, you must give the recipients all the rights that
36
+you have.  You must make sure that they, too, receive or can get the
37
+source code.  And you must show them these terms so they know their
38
+rights.
39
+
40
+  We protect your rights with two steps: (1) copyright the software, and
41
+(2) offer you this license which gives you legal permission to copy,
42
+distribute and/or modify the software.
43
+
44
+  Also, for each author's protection and ours, we want to make certain
45
+that everyone understands that there is no warranty for this free
46
+software.  If the software is modified by someone else and passed on, we
47
+want its recipients to know that what they have is not the original, so
48
+that any problems introduced by others will not reflect on the original
49
+authors' reputations.
50
+
51
+  Finally, any free program is threatened constantly by software
52
+patents.  We wish to avoid the danger that redistributors of a free
53
+program will individually obtain patent licenses, in effect making the
54
+program proprietary.  To prevent this, we have made it clear that any
55
+patent must be licensed for everyone's free use or not licensed at all.
56
+
57
+  The precise terms and conditions for copying, distribution and
58
+modification follow.
59
+
60
+                    GNU GENERAL PUBLIC LICENSE
61
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
62
+
63
+  0. This License applies to any program or other work which contains
64
+a notice placed by the copyright holder saying it may be distributed
65
+under the terms of this General Public License.  The "Program", below,
66
+refers to any such program or work, and a "work based on the Program"
67
+means either the Program or any derivative work under copyright law:
68
+that is to say, a work containing the Program or a portion of it,
69
+either verbatim or with modifications and/or translated into another
70
+language.  (Hereinafter, translation is included without limitation in
71
+the term "modification".)  Each licensee is addressed as "you".
72
+
73
+Activities other than copying, distribution and modification are not
74
+covered by this License; they are outside its scope.  The act of
75
+running the Program is not restricted, and the output from the Program
76
+is covered only if its contents constitute a work based on the
77
+Program (independent of having been made by running the Program).
78
+Whether that is true depends on what the Program does.
79
+
80
+  1. You may copy and distribute verbatim copies of the Program's
81
+source code as you receive it, in any medium, provided that you
82
+conspicuously and appropriately publish on each copy an appropriate
83
+copyright notice and disclaimer of warranty; keep intact all the
84
+notices that refer to this License and to the absence of any warranty;
85
+and give any other recipients of the Program a copy of this License
86
+along with the Program.
87
+
88
+You may charge a fee for the physical act of transferring a copy, and
89
+you may at your option offer warranty protection in exchange for a fee.
90
+
91
+  2. You may modify your copy or copies of the Program or any portion
92
+of it, thus forming a work based on the Program, and copy and
93
+distribute such modifications or work under the terms of Section 1
94
+above, provided that you also meet all of these conditions:
95
+
96
+    a) You must cause the modified files to carry prominent notices
97
+    stating that you changed the files and the date of any change.
98
+
99
+    b) You must cause any work that you distribute or publish, that in
100
+    whole or in part contains or is derived from the Program or any
101
+    part thereof, to be licensed as a whole at no charge to all third
102
+    parties under the terms of this License.
103
+
104
+    c) If the modified program normally reads commands interactively
105
+    when run, you must cause it, when started running for such
106
+    interactive use in the most ordinary way, to print or display an
107
+    announcement including an appropriate copyright notice and a
108
+    notice that there is no warranty (or else, saying that you provide
109
+    a warranty) and that users may redistribute the program under
110
+    these conditions, and telling the user how to view a copy of this
111
+    License.  (Exception: if the Program itself is interactive but
112
+    does not normally print such an announcement, your work based on
113
+    the Program is not required to print an announcement.)
114
+
115
+These requirements apply to the modified work as a whole.  If
116
+identifiable sections of that work are not derived from the Program,
117
+and can be reasonably considered independent and separate works in
118
+themselves, then this License, and its terms, do not apply to those
119
+sections when you distribute them as separate works.  But when you
120
+distribute the same sections as part of a whole which is a work based
121
+on the Program, the distribution of the whole must be on the terms of
122
+this License, whose permissions for other licensees extend to the
123
+entire whole, and thus to each and every part regardless of who wrote it.
124
+
125
+Thus, it is not the intent of this section to claim rights or contest
126
+your rights to work written entirely by you; rather, the intent is to
127
+exercise the right to control the distribution of derivative or
128
+collective works based on the Program.
129
+
130
+In addition, mere aggregation of another work not based on the Program
131
+with the Program (or with a work based on the Program) on a volume of
132
+a storage or distribution medium does not bring the other work under
133
+the scope of this License.
134
+
135
+  3. You may copy and distribute the Program (or a work based on it,
136
+under Section 2) in object code or executable form under the terms of
137
+Sections 1 and 2 above provided that you also do one of the following:
138
+
139
+    a) Accompany it with the complete corresponding machine-readable
140
+    source code, which must be distributed under the terms of Sections
141
+    1 and 2 above on a medium customarily used for software interchange; or,
142
+
143
+    b) Accompany it with a written offer, valid for at least three
144
+    years, to give any third party, for a charge no more than your
145
+    cost of physically performing source distribution, a complete
146
+    machine-readable copy of the corresponding source code, to be
147
+    distributed under the terms of Sections 1 and 2 above on a medium
148
+    customarily used for software interchange; or,
149
+
150
+    c) Accompany it with the information you received as to the offer
151
+    to distribute corresponding source code.  (This alternative is
152
+    allowed only for noncommercial distribution and only if you
153
+    received the program in object code or executable form with such
154
+    an offer, in accord with Subsection b above.)
155
+
156
+The source code for a work means the preferred form of the work for
157
+making modifications to it.  For an executable work, complete source
158
+code means all the source code for all modules it contains, plus any
159
+associated interface definition files, plus the scripts used to
160
+control compilation and installation of the executable.  However, as a
161
+special exception, the source code distributed need not include
162
+anything that is normally distributed (in either source or binary
163
+form) with the major components (compiler, kernel, and so on) of the
164
+operating system on which the executable runs, unless that component
165
+itself accompanies the executable.
166
+
167
+If distribution of executable or object code is made by offering
168
+access to copy from a designated place, then offering equivalent
169
+access to copy the source code from the same place counts as
170
+distribution of the source code, even though third parties are not
171
+compelled to copy the source along with the object code.
172
+
173
+  4. You may not copy, modify, sublicense, or distribute the Program
174
+except as expressly provided under this License.  Any attempt
175
+otherwise to copy, modify, sublicense or distribute the Program is
176
+void, and will automatically terminate your rights under this License.
177
+However, parties who have received copies, or rights, from you under
178
+this License will not have their licenses terminated so long as such
179
+parties remain in full compliance.
180
+
181
+  5. You are not required to accept this License, since you have not
182
+signed it.  However, nothing else grants you permission to modify or
183
+distribute the Program or its derivative works.  These actions are
184
+prohibited by law if you do not accept this License.  Therefore, by
185
+modifying or distributing the Program (or any work based on the
186
+Program), you indicate your acceptance of this License to do so, and
187
+all its terms and conditions for copying, distributing or modifying
188
+the Program or works based on it.
189
+
190
+  6. Each time you redistribute the Program (or any work based on the
191
+Program), the recipient automatically receives a license from the
192
+original licensor to copy, distribute or modify the Program subject to
193
+these terms and conditions.  You may not impose any further
194
+restrictions on the recipients' exercise of the rights granted herein.
195
+You are not responsible for enforcing compliance by third parties to
196
+this License.
197
+
198
+  7. If, as a consequence of a court judgment or allegation of patent
199
+infringement or for any other reason (not limited to patent issues),
200
+conditions are imposed on you (whether by court order, agreement or
201
obs-studio-18.0.0.tar.xz/plugins/obs-vst/README.md Added
36
 
1
@@ -0,0 +1,34 @@
2
+# OBS-VST
3
+Use VST 2.x plugins as audio filters in OBS.
4
+
5
+![Plugin Preview](screenshot.png)
6
+
7
+## Research
8
+### Sites
9
+*  http://teragonaudio.com/article/How-to-make-your-own-VST-host.html
10
+*  http://www.reaper.fm/sdk/vst/vst_ext.php
11
+*  https://forum.juce.com/t/mac-64-bit/6295/5
12
+*  https://gist.github.com/t-mat/206e3e7dfc3f89421bc1
13
+*  https://github.com/audacity/audacity/blob/17afc51644b2b327e173a23d6066dde598838c03/src/effects/VST/aeffectx.h
14
+
15
+### Info
16
+> In general VST 2.4 is platform independent. There are only three platform
17
+  dependent opcodes :
18
+  effEditOpen
19
+  audioMasterGetDirectory
20
+  audioMasterOpenFileSelector
21
+> 
22
+> Here are the required API changes for 64 bit Mac OS X:
23
+>
24
+> effEditOpen:
25
+  the [ptr] argument is a WindowRef on 32 bit Mac.
26
+  On 64 bit this is a NSView pointer. The plug-in needs to add its own NSView as
27
+  subview of it.
28
+>
29
+> audioMasterGetDirectory:
30
+  the [return value] is a FSSpec on 32 bit Mac.
31
+  On 64 bit this is a char pointer pointing to an UTF-8 encoded string.
32
+>
33
+> audioMasterOpenFileSelector:
34
+  the VstFileSelect struct uses FSSpec's on 32 bit Mac.
35
+  On 64 bit Mac these are char pointers pointing to UTF-8 encoded strings.
36
obs-studio-18.0.0.tar.xz/plugins/obs-vst/VSTPlugin.cpp Added
201
 
1
@@ -0,0 +1,252 @@
2
+/*****************************************************************************
3
+Copyright (C) 2016-2017 by Colin Edwards.
4
+Additional Code Copyright (C) 2016-2017 by c3r1c3 <c3r1c3@nevermindonline.com>
5
+
6
+This program is free software: you can redistribute it and/or modify
7
+it under the terms of the GNU General Public License as published by
8
+the Free Software Foundation, either version 2 of the License, or
9
+(at your option) any later version.
10
+
11
+This program is distributed in the hope that it will be useful,
12
+but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
+GNU General Public License for more details.
15
+
16
+You should have received a copy of the GNU General Public License
17
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
+*****************************************************************************/
19
+
20
+#include "headers/VSTPlugin.h"
21
+
22
+VSTPlugin::VSTPlugin(obs_source_t *sourceContext) :
23
+       sourceContext{sourceContext} {
24
+
25
+   int numChannels = VST_MAX_CHANNELS;
26
+   int blocksize = 512;
27
+
28
+   inputs = (float **) malloc(sizeof(float **) * numChannels);
29
+   outputs = (float **) malloc(sizeof(float **) * numChannels);
30
+   for (int channel = 0; channel < numChannels; channel++)
31
+   {
32
+       inputs[channel] = (float *) malloc(sizeof(float *)
33
+               * blocksize);
34
+       outputs[channel] = (float *) malloc(sizeof(float *)
35
+               * blocksize);
36
+   }
37
+}
38
+
39
+void VSTPlugin::loadEffectFromPath(std::string path) {
40
+   if (this->pluginPath.compare(path) != 0)
41
+   {
42
+       closeEditor();
43
+       unloadEffect();
44
+   }
45
+
46
+   if (!effect)
47
+   {
48
+       pluginPath = path;
49
+       effect = loadEffect();
50
+
51
+       if (!effect)
52
+       {
53
+           //TODO: alert user of error
54
+           return;
55
+       }
56
+
57
+       // Check plug-in's magic number
58
+       // If incorrect, then the file either was not loaded properly, is not a
59
+       // real VST plug-in, or is otherwise corrupt.
60
+       if (effect->magic != kEffectMagic)
61
+       {
62
+           blog(LOG_WARNING, "VST Plug-in's magic number is bad");
63
+           return;
64
+       }
65
+
66
+       effect->dispatcher(effect, effOpen, 0, 0, nullptr, 0.0f);
67
+
68
+       // Set some default properties
69
+       size_t sampleRate = audio_output_get_sample_rate(
70
+               obs_get_audio());
71
+       effect->dispatcher(effect, effSetSampleRate, 0, 0, nullptr,
72
+               sampleRate);
73
+       int blocksize = 512;
74
+       effect->dispatcher(effect, effSetBlockSize, 0, blocksize,
75
+               nullptr, 0.0f);
76
+
77
+       effect->dispatcher(effect, effMainsChanged, 0, 1, nullptr, 0);
78
+
79
+       effectReady = true;
80
+   }
81
+}
82
+
83
+void silenceChannel(float **channelData, int numChannels, long numFrames) {
84
+   for (int channel = 0; channel < numChannels; ++channel) {
85
+       for (long frame = 0; frame < numFrames; ++frame) {
86
+           channelData[channel][frame] = 0.0f;
87
+       }
88
+   }
89
+}
90
+
91
+obs_audio_data *VSTPlugin::process(struct obs_audio_data *audio) {
92
+
93
+   if (effect && effectReady)
94
+   {
95
+       silenceChannel(outputs, VST_MAX_CHANNELS, audio->frames);
96
+
97
+       float *adata[VST_MAX_CHANNELS];
98
+       for (size_t d = 0; d < VST_MAX_CHANNELS; d++) {
99
+           adata[d] = (float *) audio->data[d];
100
+       };
101
+
102
+       effect->processReplacing(effect, adata, outputs, audio->frames);
103
+
104
+       for (size_t c = 0; c < VST_MAX_CHANNELS; c++) {
105
+           if (audio->data[c]) {
106
+               for (size_t i = 0; i < audio->frames; i++) {
107
+                   adata[c][i] = outputs[c][i];
108
+               }
109
+           }
110
+       }
111
+   }
112
+
113
+   return audio;
114
+}
115
+
116
+void VSTPlugin::unloadEffect() {
117
+   effectReady = false;
118
+
119
+   if (effect)
120
+   {
121
+       effect->dispatcher(effect, effMainsChanged, 0, 0, nullptr, 0);
122
+       effect->dispatcher(effect, effClose, 0, 0, nullptr, 0.0f);
123
+   }
124
+
125
+   effect = nullptr;
126
+
127
+   unloadLibrary();
128
+}
129
+
130
+void VSTPlugin::openEditor() {
131
+   if (effect && !editorWidget)
132
+   {
133
+       editorWidget = new EditorWidget(nullptr, this);
134
+       editorWidget->buildEffectContainer(effect);
135
+       editorWidget->show();
136
+   }
137
+}
138
+
139
+void VSTPlugin::closeEditor() {
140
+   if (effect)
141
+   {
142
+       effect->dispatcher(effect, effEditClose, 0, 0, nullptr, 0);
143
+   }
144
+
145
+   if (editorWidget)
146
+   {
147
+       editorWidget->close();
148
+       delete editorWidget;
149
+       editorWidget = nullptr;
150
+   }
151
+}
152
+
153
+intptr_t VSTPlugin::hostCallback(AEffect *effect, int32_t opcode,
154
+       int32_t index, intptr_t value, void *ptr, float opt) {
155
+   UNUSED_PARAMETER(effect);
156
+   UNUSED_PARAMETER(ptr);
157
+   UNUSED_PARAMETER(opt);
158
+
159
+   intptr_t result = 0;
160
+
161
+   // Filter idle calls...
162
+   bool filtered = false;
163
+   if (opcode == audioMasterIdle)
164
+   {
165
+       static bool wasIdle = false;
166
+       if (wasIdle)
167
+           filtered = true;
168
+       else
169
+       {
170
+           blog(LOG_WARNING, "VST Plug-in: Future idle calls will not be displayed!");
171
+           wasIdle = true;
172
+       }
173
+   }
174
+
175
+   switch (opcode) {
176
+       case audioMasterSizeWindow:
177
+           // index: width, value: height
178
+           if (editorWidget)
179
+           {
180
+               editorWidget->handleResizeRequest(index,
181
+                        value);
182
+           }
183
+           return 0;
184
+   }
185
+
186
+   return result;
187
+}
188
+
189
+std::string VSTPlugin::getChunk() {
190
+   if (!effect)
191
+   {
192
+       return "";
193
+   }
194
+
195
+   if (effect->flags & effFlagsProgramChunks)
196
+   {
197
+       void *buf = nullptr;
198
+
199
+       intptr_t chunkSize = effect->dispatcher(effect, effGetChunk, 1, 0, &buf, 0.0);
200
+
201
obs-studio-18.0.0.tar.xz/plugins/obs-vst/data Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/plugins/obs-vst/data/locale Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/plugins/obs-vst/data/locale/en-US.ini Added
5
 
1
@@ -0,0 +1,3 @@
2
+OpenPluginInterface="Open Plug-in Interface"
3
+ClosePluginInterface="Close Plug-in Interface"
4
+VstPlugin="VST 2.x Plug-in"
5
obs-studio-18.0.0.tar.xz/plugins/obs-vst/headers Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/plugins/obs-vst/headers/EditorWidget.h Added
62
 
1
@@ -0,0 +1,59 @@
2
+/*****************************************************************************
3
+Copyright (C) 2016-2017 by Colin Edwards.
4
+
5
+This program is free software: you can redistribute it and/or modify
6
+it under the terms of the GNU General Public License as published by
7
+the Free Software Foundation, either version 2 of the License, or
8
+(at your option) any later version.
9
+
10
+This program is distributed in the hope that it will be useful,
11
+but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
+GNU General Public License for more details.
14
+
15
+You should have received a copy of the GNU General Public License
16
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
+*****************************************************************************/
18
+
19
+#ifndef OBS_STUDIO_EDITORDIALOG_H
20
+#define OBS_STUDIO_EDITORDIALOG_H
21
+
22
+#include <QWidget>
23
+#ifdef __APPLE__
24
+   #include <QMacCocoaViewContainer>
25
+#endif
26
+
27
+#include "aeffectx.h"
28
+#include "VSTPlugin.h"
29
+
30
+class VSTPlugin;
31
+
32
+class VstRect
33
+{
34
+   public:
35
+       short top;
36
+       short left;
37
+       short bottom;
38
+       short right;
39
+};
40
+
41
+class EditorWidget : public QWidget {
42
+
43
+   VSTPlugin *plugin;
44
+
45
+   #ifdef __APPLE__
46
+       QMacCocoaViewContainer *cocoaViewContainer = NULL;
47
+   #elif WIN32
48
+
49
+   #elif __linux__
50
+
51
+   #endif
52
+
53
+   public:
54
+       EditorWidget(QWidget *parent, VSTPlugin *plugin);
55
+       void buildEffectContainer(AEffect *effect);
56
+       void closeEvent(QCloseEvent *event) override;
57
+       void handleResizeRequest(int width, int height);
58
+};
59
+
60
+#endif //OBS_STUDIO_EDITORDIALOG_H
61
\ No newline at end of file
62
obs-studio-18.0.0.tar.xz/plugins/obs-vst/headers/VSTPlugin.h Added
96
 
1
@@ -0,0 +1,94 @@
2
+/*****************************************************************************
3
+Copyright (C) 2016-2017 by Colin Edwards.
4
+Additional Code Copyright (C) 2016-2017 by c3r1c3 <c3r1c3@nevermindonline.com>
5
+
6
+This program is free software: you can redistribute it and/or modify
7
+it under the terms of the GNU General Public License as published by
8
+the Free Software Foundation, either version 2 of the License, or
9
+(at your option) any later version.
10
+
11
+This program is distributed in the hope that it will be useful,
12
+but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
+GNU General Public License for more details.
15
+
16
+You should have received a copy of the GNU General Public License
17
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
+*****************************************************************************/
19
+
20
+#ifndef OBS_STUDIO_VSTPLUGIN_H
21
+#define OBS_STUDIO_VSTPLUGIN_H
22
+
23
+#define VST_MAX_CHANNELS    8
24
+
25
+#include <string>
26
+#include "aeffectx.h"
27
+#include <obs-module.h>
28
+#include "vst-plugin-callbacks.hpp"
29
+#include "EditorWidget.h"
30
+
31
+#ifdef __APPLE__
32
+   #include <CoreFoundation/CoreFoundation.h>
33
+#endif
34
+
35
+class EditorWidget;
36
+
37
+class VSTPlugin {
38
+   AEffect *effect = nullptr;
39
+   obs_source_t *sourceContext;
40
+   std::string pluginPath;
41
+
42
+   float **inputs;
43
+   float **outputs;
44
+
45
+   EditorWidget *editorWidget = nullptr;
46
+
47
+   AEffect* loadEffect();
48
+
49
+   bool effectReady = false;
50
+
51
+   #ifdef __APPLE__
52
+       CFBundleRef bundle = NULL;
53
+   #elif WIN32
54
+       HINSTANCE dllHandle = nullptr;
55
+   #elif __linux__
56
+       void *soHandle = nullptr;
57
+   #endif
58
+
59
+   void unloadLibrary();
60
+
61
+   static intptr_t hostCallback_static( AEffect *effect, int32_t opcode,
62
+           int32_t index, intptr_t value, void *ptr, float opt)
63
+   {
64
+       if (effect && effect->user)
65
+       {
66
+       auto* plugin = static_cast<VSTPlugin*>(effect->user);
67
+       return plugin->hostCallback(effect, opcode, index, value,
68
+               ptr, opt);
69
+       }
70
+
71
+       switch (opcode)
72
+       {
73
+           case audioMasterVersion:
74
+           return (intptr_t) 2400;
75
+
76
+           default:
77
+               return 0;
78
+       }
79
+   }
80
+
81
+   intptr_t hostCallback( AEffect *effect, int32_t opcode, int32_t index,
82
+           intptr_t value, void *ptr, float opt);
83
+
84
+   public:
85
+       VSTPlugin(obs_source_t *sourceContext);
86
+       void loadEffectFromPath(std::string path);
87
+       void unloadEffect();
88
+       void openEditor();
89
+       void closeEditor();
90
+       std::string getChunk();
91
+       void setChunk(std::string data);
92
+       obs_audio_data* process(struct obs_audio_data *audio);
93
+};
94
+
95
+#endif //OBS_STUDIO_VSTPLUGIN_H
96
obs-studio-18.0.0.tar.xz/plugins/obs-vst/headers/vst-plugin-callbacks.hpp Added
24
 
1
@@ -0,0 +1,21 @@
2
+/*****************************************************************************
3
+Copyright (C) 2016-2017 by Colin Edwards.
4
+
5
+This program is free software: you can redistribute it and/or modify
6
+it under the terms of the GNU General Public License as published by
7
+the Free Software Foundation, either version 2 of the License, or
8
+(at your option) any later version.
9
+
10
+This program is distributed in the hope that it will be useful,
11
+but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
+GNU General Public License for more details.
14
+
15
+You should have received a copy of the GNU General Public License
16
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
+*****************************************************************************/
18
+#pragma once
19
+
20
+#include "aeffectx.h"
21
+
22
+typedef AEffect *(*vstPluginMain)(audioMasterCallback audioMaster);
23
\ No newline at end of file
24
obs-studio-18.0.0.tar.xz/plugins/obs-vst/linux Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/plugins/obs-vst/linux/EditorWidget-linux.cpp Added
111
 
1
@@ -0,0 +1,108 @@
2
+/*****************************************************************************
3
+Copyright (C) 2016-2017 by Colin Edwards.
4
+Additional Code Copyright (C) 2016-2017 by c3r1c3 <c3r1c3@nevermindonline.com>
5
+
6
+Special thanks to Nik Reiman for sharing his awesome code with the world.
7
+Some of the original code can be found here:
8
+https://github.com/teragonaudio/MrsWatson/blob/master/source/plugin/PluginVst2xLinux.cpp
9
+
10
+This program is free software: you can redistribute it and/or modify
11
+it under the terms of the GNU General Public License as published by
12
+the Free Software Foundation, either version 2 of the License, or
13
+(at your option) any later version.
14
+
15
+This program is distributed in the hope that it will be useful,
16
+but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
+GNU General Public License for more details.
19
+
20
+You should have received a copy of the GNU General Public License
21
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
+*****************************************************************************/
23
+
24
+#include "../headers/EditorWidget.h"
25
+
26
+#include <X11/Xlib.h>
27
+#include <QWindow>
28
+
29
+
30
+void EditorWidget::buildEffectContainer(AEffect *effect) {
31
+   Display *display;
32
+   Window window;
33
+   XEvent event;
34
+
35
+   int screenNumber;
36
+
37
+   blog(LOG_WARNING, "Opening X display");
38
+   display = XOpenDisplay(NULL);
39
+   if (display == NULL)
40
+   {
41
+       blog(LOG_WARNING, "Can't open default display");
42
+       return;
43
+   }
44
+
45
+   blog(LOG_WARNING, "Acquiring default screen for X display");
46
+   screenNumber = DefaultScreen(display);
47
+   Screen *screen = DefaultScreenOfDisplay(display);
48
+
49
+   int screenWidth = WidthOfScreen(screen);
50
+   int screenHeight = HeightOfScreen(screen);
51
+   blog(LOG_WARNING, "Screen dimensions: %dx%d", screenWidth, screenHeight);
52
+
53
+   // Default size is 300x300 pixels
54
+   int windowX = (screenWidth - 300) / 2;
55
+   int windowY = (screenHeight - 300) / 2;
56
+
57
+   blog(LOG_WARNING, "Creating window at %dx%d", windowX, windowY);
58
+   window = XCreateSimpleWindow(display, RootWindow(display, screenNumber),
59
+           0, 0, 300, 300, 1, BlackPixel(display, screenNumber),
60
+           BlackPixel(display, screenNumber));
61
+
62
+   //XStoreName(display, window, pluginName->data);
63
+/*
64
+   XSelectInput(display, window, ExposureMask | KeyPressMask);
65
+   XMapWindow(display, window);
66
+   XMoveWindow(display, window, windowX, windowY);
67
+
68
+
69
+   blog(LOG_WARNING, "Opening plugin editor window");
70
+   effect->dispatcher(effect, effEditOpen, 0, 0, (void *) window, 0);
71
+
72
+   while (true) {
73
+       XNextEvent(display, &event);
74
+
75
+       if (event.type == Expose) {
76
+       }
77
+
78
+       if (event.type == KeyPress) {
79
+           break;
80
+       }
81
+   }
82
+
83
+   blog(LOG_WARNING, "Closing plugin editor window");
84
+   effect->dispatcher(effect, effEditClose, 0, 0, 0, 0);
85
+   XDestroyWindow(display, window);
86
+   XCloseDisplay(display);
87
+*/
88
+   /*
89
+   QWidget *widget = QWidget::createWindowContainer(QWindow::window);
90
+   widget->move(0, 0);
91
+   widget->resize(300, 300);
92
+
93
+   effect->dispatcher(effect, effEditOpen, 0, 0, window, 0);
94
+
95
+   VstRect* vstRect = nullptr;
96
+   effect->dispatcher(effect, effEditGetRect, 0, 0, &vstRect, 0);
97
+   if (vstRect)
98
+   {
99
+       widget->resize(vstRect->right - vstRect->left,
100
+                  vstRect->bottom - vstRect->top);
101
+   }
102
+    */
103
+}
104
+
105
+void EditorWidget::handleResizeRequest(int width, int height) {
106
+   // We don't have to do anything here as far as I can tell.
107
+   // The widget will resize the HWIND itself and then
108
+   // this widget will automatically size depending on that.
109
+}
110
\ No newline at end of file
111
obs-studio-18.0.0.tar.xz/plugins/obs-vst/linux/VSTPlugin-linux.cpp Added
68
 
1
@@ -0,0 +1,65 @@
2
+/*****************************************************************************
3
+Copyright (C) 2016-2017 by Colin Edwards.
4
+Additional Code Copyright (C) 2016-2017 by c3r1c3 <c3r1c3@nevermindonline.com>
5
+
6
+This program is free software: you can redistribute it and/or modify
7
+it under the terms of the GNU General Public License as published by
8
+the Free Software Foundation, either version 2 of the License, or
9
+(at your option) any later version.
10
+
11
+This program is distributed in the hope that it will be useful,
12
+but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
+GNU General Public License for more details.
15
+
16
+You should have received a copy of the GNU General Public License
17
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
+*****************************************************************************/
19
+#include "../headers/VSTPlugin.h"
20
+
21
+#include <util/platform.h>
22
+#include <X11/Xlib.h>
23
+
24
+AEffect* VSTPlugin::loadEffect() {
25
+   AEffect *plugin = nullptr;
26
+
27
+   soHandle = dlopen(pluginPath.c_str(), RTLD_LAZY);
28
+   bfree(wpath);
29
+   bfree(charPath);
30
+   if(soHandle == nullptr)
31
+   {
32
+       blog(LOG_WARNING, "Failed trying to load VST from '%s', error %d\n",
33
+               pluginPath.c_str(), errno);
34
+       return nullptr;
35
+   }
36
+
37
+   vstPluginMain mainEntryPoint =
38
+           (vstPluginMain)(soHandle, "VSTPluginMain");
39
+
40
+   if (mainEntryPoint == nullptr) {
41
+       mainEntryPoint =
42
+               (vstPluginMain)os_dlsym(soHandle,
43
+               "VstPluginMain()");
44
+   }
45
+
46
+   if (mainEntryPoint == nullptr) {
47
+       mainEntryPoint = (vstPluginMain)os_dlsym(soHandle, "main");
48
+   }
49
+
50
+   if (mainEntryPoint == nullptr) {
51
+       blog(LOG_WARNING, "Couldn't get a pointer to plug-in's main()");
52
+       return nullptr;
53
+   }
54
+
55
+   // Instantiate the plug-in
56
+   plugin = mainEntryPoint(hostCallback_static);
57
+   plugin->user = this;
58
+   return plugin;
59
+}
60
+
61
+void VSTPlugin::unloadLibrary() {
62
+   if (soHandle) {
63
+       os_dlclose(soHandle);
64
+       soHandle = nullptr;
65
+   }
66
+}
67
\ No newline at end of file
68
obs-studio-18.0.0.tar.xz/plugins/obs-vst/mac Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/plugins/obs-vst/mac/EditorWidget-osx.mm Added
56
 
1
@@ -0,0 +1,53 @@
2
+/*****************************************************************************
3
+Copyright (C) 2016-2017 by Colin Edwards.
4
+
5
+This program is free software: you can redistribute it and/or modify
6
+it under the terms of the GNU General Public License as published by
7
+the Free Software Foundation, either version 2 of the License, or
8
+(at your option) any later version.
9
+
10
+This program is distributed in the hope that it will be useful,
11
+but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
+GNU General Public License for more details.
14
+
15
+You should have received a copy of the GNU General Public License
16
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
+*****************************************************************************/
18
+#import "../headers/EditorWidget.h"
19
+#import <Cocoa/Cocoa.h>
20
+
21
+#import "../headers/VSTPlugin.h"
22
+
23
+void EditorWidget::buildEffectContainer(AEffect *effect) {
24
+   cocoaViewContainer = new QMacCocoaViewContainer(0, this);
25
+   cocoaViewContainer->move(0, 0);
26
+   cocoaViewContainer->resize(300, 300);
27
+   NSView *view = [[NSView alloc] initWithFrame:  NSMakeRect(0, 0,
28
+           300, 300)];
29
+   cocoaViewContainer->setCocoaView(view);
30
+
31
+   VstRect* vstRect = 0;
32
+   effect->dispatcher (effect, effEditGetRect, 0, 0, &vstRect, 0);
33
+   if (vstRect)
34
+   {
35
+       NSRect frame = NSMakeRect(vstRect->left, vstRect->top,
36
+               vstRect->right, vstRect->bottom);
37
+
38
+       [view setFrame:frame];
39
+
40
+       cocoaViewContainer->resize(vstRect->right - vstRect->left,
41
+               vstRect->bottom- vstRect->top);
42
+   }
43
+
44
+   effect->dispatcher (effect, effEditOpen, 0, 0, view, 0);
45
+}
46
+
47
+void EditorWidget::handleResizeRequest(int width, int height) {
48
+   resize(width, height);
49
+   cocoaViewContainer->resize(width, height);
50
+   NSView *view = cocoaViewContainer->cocoaView();
51
+   NSRect frame = NSMakeRect(0, 0, width, height);
52
+
53
+   [view setFrame:frame];
54
+}
55
\ No newline at end of file
56
obs-studio-18.0.0.tar.xz/plugins/obs-vst/mac/VSTPlugin-osx.mm Added
94
 
1
@@ -0,0 +1,91 @@
2
+/*****************************************************************************
3
+Copyright (C) 2016-2017 by Colin Edwards.
4
+
5
+This program is free software: you can redistribute it and/or modify
6
+it under the terms of the GNU General Public License as published by
7
+the Free Software Foundation, either version 2 of the License, or
8
+(at your option) any later version.
9
+
10
+This program is distributed in the hope that it will be useful,
11
+but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
+GNU General Public License for more details.
14
+
15
+You should have received a copy of the GNU General Public License
16
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
+*****************************************************************************/
18
+
19
+#include "../headers/VSTPlugin.h"
20
+
21
+AEffect* VSTPlugin::loadEffect() {
22
+   AEffect* newEffect = NULL;
23
+
24
+   // Create a path to the bundle
25
+   CFStringRef pluginPathStringRef = CFStringCreateWithCString(NULL,
26
+           pluginPath.c_str(), kCFStringEncodingUTF8);
27
+   CFURLRef bundleUrl = CFURLCreateWithFileSystemPath
28
+           (kCFAllocatorDefault, pluginPathStringRef,
29
+           kCFURLPOSIXPathStyle, true);
30
+
31
+   if (bundleUrl == NULL)
32
+   {
33
+       blog(LOG_WARNING, "Couldn't make URL reference for VST plug-in");
34
+       return NULL;
35
+   }
36
+
37
+   // Open the bundle
38
+   bundle = CFBundleCreate(kCFAllocatorDefault, bundleUrl);
39
+   if (bundle == NULL)
40
+   {
41
+       blog(LOG_WARNING, "Couldn't create VST bundle reference.");
42
+       CFRelease(pluginPathStringRef);
43
+       CFRelease(bundleUrl);
44
+       return NULL;
45
+   }
46
+
47
+   vstPluginMain mainEntryPoint = NULL;
48
+   mainEntryPoint = (vstPluginMain) CFBundleGetFunctionPointerForName
49
+           (bundle, CFSTR("VSTPluginMain"));
50
+
51
+   // VST plugins previous to the 2.4 SDK used main_macho for the
52
+   // entry point name.
53
+   if (mainEntryPoint == NULL)
54
+   {
55
+       mainEntryPoint = (vstPluginMain)
56
+               CFBundleGetFunctionPointerForName(bundle,
57
+               CFSTR("main_macho"));
58
+   }
59
+
60
+   if (mainEntryPoint == NULL)
61
+   {
62
+       blog(LOG_WARNING, "Couldn't get a pointer to plug-in's main()");
63
+       CFBundleUnloadExecutable(bundle);
64
+       CFRelease(bundle);
65
+       return NULL;
66
+   }
67
+
68
+   newEffect = mainEntryPoint(hostCallback_static);
69
+   if (newEffect == NULL)
70
+   {
71
+       blog(LOG_WARNING, "VST Plug-in's main() returns null.");
72
+       CFBundleUnloadExecutable(bundle);
73
+       CFRelease(bundle);
74
+       return NULL;
75
+   }
76
+
77
+   newEffect->user = this;
78
+
79
+   // Clean up
80
+   CFRelease(pluginPathStringRef);
81
+   CFRelease(bundleUrl);
82
+
83
+   return newEffect;
84
+}
85
+
86
+void VSTPlugin::unloadLibrary() {
87
+   if (bundle)
88
+   {
89
+       CFBundleUnloadExecutable(bundle);
90
+       CFRelease(bundle);
91
+   }
92
+}
93
\ No newline at end of file
94
obs-studio-18.0.0.tar.xz/plugins/obs-vst/obs-vst.cpp Added
201
 
1
@@ -0,0 +1,259 @@
2
+/*****************************************************************************
3
+Copyright (C) 2016-2017 by Colin Edwards.
4
+Additional Code Copyright (C) 2016-2017 by c3r1c3 <c3r1c3@nevermindonline.com>
5
+
6
+This program is free software: you can redistribute it and/or modify
7
+it under the terms of the GNU General Public License as published by
8
+the Free Software Foundation, either version 2 of the License, or
9
+(at your option) any later version.
10
+
11
+This program is distributed in the hope that it will be useful,
12
+but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
+GNU General Public License for more details.
15
+
16
+You should have received a copy of the GNU General Public License
17
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
+*****************************************************************************/
19
+
20
+#include "headers/VSTPlugin.h"
21
+#include <QDir>
22
+#include <QDirIterator>
23
+
24
+#define OPEN_VST_SETTINGS      "open_vst_settings"
25
+#define CLOSE_VST_SETTINGS     "close_vst_settings"
26
+
27
+#define PLUG_IN_NAME            obs_module_text("VstPlugin")
28
+#define OPEN_VST_TEXT           obs_module_text("OpenPluginInterface")
29
+#define CLOSE_VST_TEXT          obs_module_text("ClosePluginInterface")
30
+
31
+OBS_DECLARE_MODULE()
32
+OBS_MODULE_USE_DEFAULT_LOCALE("obs-vst", "en-US")
33
+
34
+static bool open_editor_button_clicked(obs_properties_t *props,
35
+        obs_property_t *property, void *data)
36
+{
37
+   VSTPlugin *vstPlugin = (VSTPlugin *)data;
38
+
39
+   vstPlugin->openEditor();
40
+
41
+   obs_property_set_visible(obs_properties_get(props,
42
+           OPEN_VST_SETTINGS), false);
43
+   obs_property_set_visible(obs_properties_get(props,
44
+           CLOSE_VST_SETTINGS), true);
45
+
46
+   UNUSED_PARAMETER(props);
47
+   UNUSED_PARAMETER(property);
48
+   UNUSED_PARAMETER(data);
49
+
50
+   return true;
51
+}
52
+
53
+static bool close_editor_button_clicked(obs_properties_t *props,
54
+        obs_property_t *property, void *data)
55
+{
56
+   VSTPlugin *vstPlugin = (VSTPlugin *)data;
57
+
58
+   vstPlugin->closeEditor();
59
+
60
+   obs_property_set_visible(obs_properties_get(props,
61
+           OPEN_VST_SETTINGS), true);
62
+   obs_property_set_visible(obs_properties_get(props,
63
+           CLOSE_VST_SETTINGS), false);
64
+
65
+   UNUSED_PARAMETER(property);
66
+
67
+   return true;
68
+}
69
+
70
+static const char *vst_name(void *unused)
71
+{
72
+   UNUSED_PARAMETER(unused);
73
+   return PLUG_IN_NAME;
74
+}
75
+
76
+static void vst_destroy(void *data)
77
+{
78
+   VSTPlugin *vstPlugin = (VSTPlugin *)data;
79
+   vstPlugin->closeEditor();
80
+   delete vstPlugin;
81
+}
82
+
83
+static void vst_update(void *data, obs_data_t *settings)
84
+{
85
+   VSTPlugin *vstPlugin = (VSTPlugin *)data;
86
+
87
+   const char *path = obs_data_get_string(settings, "plugin_path");
88
+
89
+   if (strcmp(path, "") == 0)
90
+   {
91
+       return;
92
+   }
93
+   vstPlugin->loadEffectFromPath(std::string(path));
94
+
95
+   const char *chunkData = obs_data_get_string(settings, "chunk_data");
96
+   if (chunkData && strlen(chunkData) > 0) {
97
+       vstPlugin->setChunk(std::string(chunkData));
98
+       obs_data_set_string(settings, "chunk_data",
99
+               vstPlugin->getChunk().c_str());
100
+   }
101
+}
102
+
103
+static void *vst_create(obs_data_t *settings, obs_source_t *filter)
104
+{
105
+   VSTPlugin *vstPlugin = new VSTPlugin(filter);
106
+   vst_update(vstPlugin, settings);
107
+
108
+   return vstPlugin;
109
+}
110
+
111
+static void vst_save(void *data, obs_data_t *settings)
112
+{
113
+   VSTPlugin *vstPlugin = (VSTPlugin *)data;
114
+
115
+   obs_data_set_string(settings, "chunk_data",
116
+           vstPlugin->getChunk().c_str());
117
+}
118
+
119
+static struct obs_audio_data *vst_filter_audio(void *data,
120
+       struct obs_audio_data *audio)
121
+{
122
+   VSTPlugin *vstPlugin = (VSTPlugin *)data;
123
+   vstPlugin->process(audio);
124
+
125
+   return audio;
126
+}
127
+
128
+static void fill_out_plugins(obs_property_t *list)
129
+{
130
+   QStringList dir_list;
131
+
132
+   #ifdef __APPLE__
133
+       dir_list << "/Library/Audio/Plug-Ins/VST/"
134
+       << "~/Library/Audio/Plug-ins/VST/";
135
+   #elif WIN32
136
+       dir_list << "C:/Program Files/Steinberg/VstPlugins/"
137
+       << "C:/Program Files/Common Files/Steinberg/Shared Components/"
138
+       << "C:/Program Files/Common Files/VST2"
139
+       << "C:/Program Files/Common Files/VSTPlugins/"
140
+       << "C:/Program Files/VSTPlugins/";
141
+   #elif __linux__
142
+   // If the user has set the VST_PATH environmental
143
+   // variable, then use it. Else default to a list
144
+   // of common locations.
145
+   char *vstPathEnv;
146
+   vstPathEnv = getenv("VST_PATH");
147
+   if (vstPathEnv != nullptr)
148
+   {
149
+       dir_list << vstPathEnv;
150
+   } else {
151
+       // Choose the most common locations
152
+       dir_list << "/usr/lib/vst/"
153
+            << "/usr/lib/lxvst/"
154
+            << "/usr/lib/linux_vst/"
155
+            << "/usr/lib64/vst/"
156
+            << "/usr/lib64/lxvst/"
157
+            << "/usr/lib64/linux_vst/"
158
+            << "/usr/local/lib/vst/"
159
+            << "/usr/local/lib/lxvst/"
160
+            << "/usr/local/lib/linux_vst/"
161
+            << "/usr/local/lib64/vst/"
162
+            << "/usr/local/lib64/lxvst/"
163
+            << "/usr/local/lib64/linux_vst/"
164
+            << "~/.vst/"
165
+            << "~/.lxvst/";
166
+   }
167
+   #endif
168
+
169
+   QStringList filters;
170
+
171
+   #ifdef __APPLE__
172
+       filters << "*.vst";
173
+   #elif WIN32
174
+       filters << "*.dll";
175
+   #elif __linux__
176
+       filters << "*.so" << "*.o";
177
+   #endif
178
+
179
+   QStringList vst_list;
180
+
181
+   // Read all plugins into a list...
182
+   for (int a = 0; a < dir_list.size(); ++a)
183
+   {
184
+       QDir search_dir(dir_list[a]);
185
+       search_dir.setNameFilters(filters);
186
+       QDirIterator it(search_dir, QDirIterator::Subdirectories);
187
+       while (it.hasNext()) {
188
+           QString path = it.next();
189
+           QString name = it.fileName();
190
+
191
+           #ifdef __APPLE__
192
+               name.remove(QRegExp("(\\.vst)"));
193
+           #elif WIN32
194
+               name.remove(QRegExp("(\\.dll)"));
195
+           #elif __linux__
196
+               name.remove(QRegExp("(\\.so|\\.o)"));
197
+           #endif
198
+
199
+           name.append("=").append(path);
200
+           vst_list << name;
201
obs-studio-18.0.0.tar.xz/plugins/obs-vst/screenshot.png Added
obs-studio-18.0.0.tar.xz/plugins/obs-vst/vst_header Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/plugins/obs-vst/vst_header/aeffectx.h Added
201
 
1
@@ -0,0 +1,382 @@
2
+/*
3
+ * aeffectx.h - simple header to allow VeSTige compilation and eventually work
4
+ *
5
+ * Copyright (c) 2006 Javier Serrano Polo <jasp00/at/users.sourceforge.net>
6
+ *
7
+ * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
8
+ *
9
+ * This program is free software; you can redistribute it and/or
10
+ * modify it under the terms of the GNU General Public
11
+ * License as published by the Free Software Foundation; either
12
+ * version 2 of the License, or (at your option) any later version.
13
+ *
14
+ * This program is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
+ * General Public License for more details.
18
+ *
19
+ * You should have received a copy of the GNU General Public
20
+ * License along with this program (see COPYING); if not, write to the
21
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22
+ * Boston, MA 02110-1301 USA.
23
+ *
24
+ */
25
+
26
+#include <stdint.h>
27
+
28
+#ifndef _AEFFECTX_H
29
+#define _AEFFECTX_H
30
+
31
+#define CCONST(a, b, c, d)( ( ( (int) a ) << 24 ) |      \
32
+       ( ( (int) b ) << 16 ) |    \
33
+       ( ( (int) c ) << 8 ) |     \
34
+       ( ( (int) d ) << 0 ) )
35
+
36
+
37
+const int audioMasterAutomate = 0;
38
+const int audioMasterVersion = 1;
39
+const int audioMasterCurrentId = 2;
40
+const int audioMasterIdle = 3;
41
+const int audioMasterPinConnected = 4;
42
+// unsupported? 5
43
+const int audioMasterWantMidi = 6;
44
+const int audioMasterGetTime = 7;
45
+const int audioMasterProcessEvents = 8;
46
+const int audioMasterSetTime = 9;
47
+const int audioMasterTempoAt = 10;
48
+const int audioMasterGetNumAutomatableParameters = 11;
49
+const int audioMasterGetParameterQuantization = 12;
50
+const int audioMasterIOChanged = 13;
51
+const int audioMasterNeedIdle = 14;
52
+const int audioMasterSizeWindow = 15;
53
+const int audioMasterGetSampleRate = 16;
54
+const int audioMasterGetBlockSize = 17;
55
+const int audioMasterGetInputLatency = 18;
56
+const int audioMasterGetOutputLatency = 19;
57
+const int audioMasterGetPreviousPlug = 20;
58
+const int audioMasterGetNextPlug = 21;
59
+const int audioMasterWillReplaceOrAccumulate = 22;
60
+const int audioMasterGetCurrentProcessLevel = 23;
61
+const int audioMasterGetAutomationState = 24;
62
+const int audioMasterOfflineStart = 25;
63
+const int audioMasterOfflineRead = 26;
64
+const int audioMasterOfflineWrite = 27;
65
+const int audioMasterOfflineGetCurrentPass = 28;
66
+const int audioMasterOfflineGetCurrentMetaPass = 29;
67
+const int audioMasterSetOutputSampleRate = 30;
68
+// unsupported? 31
69
+const int audioMasterGetSpeakerArrangement = 31; // deprecated in 2.4?
70
+const int audioMasterGetVendorString = 32;
71
+const int audioMasterGetProductString = 33;
72
+const int audioMasterGetVendorVersion = 34;
73
+const int audioMasterVendorSpecific = 35;
74
+const int audioMasterSetIcon = 36;
75
+const int audioMasterCanDo = 37;
76
+const int audioMasterGetLanguage = 38;
77
+const int audioMasterOpenWindow = 39;
78
+const int audioMasterCloseWindow = 40;
79
+const int audioMasterGetDirectory = 41;
80
+const int audioMasterUpdateDisplay = 42;
81
+const int audioMasterBeginEdit = 43;
82
+const int audioMasterEndEdit = 44;
83
+const int audioMasterOpenFileSelector = 45;
84
+const int audioMasterCloseFileSelector = 46; // currently unused
85
+const int audioMasterEditFile = 47; // currently unused
86
+const int audioMasterGetChunkFile = 48; // currently unused
87
+const int audioMasterGetInputSpeakerArrangement = 49; // currently unused
88
+
89
+const int effFlagsHasEditor = 1;
90
+const int effFlagsCanReplacing = 1 << 4; // very likely
91
+const int effFlagsProgramChunks = 1 << 5; // from Ardour
92
+const int effFlagsIsSynth = 1 << 8; // currently unused
93
+
94
+const int effOpen = 0;
95
+const int effClose = 1; // currently unused
96
+const int effSetProgram = 2; // currently unused
97
+const int effGetProgram = 3; // currently unused
98
+// The next one was gleaned from http://www.kvraudio.com/forum/viewtopic.php?p=1905347
99
+const int effSetProgramName = 4;
100
+const int effGetProgramName = 5; // currently unused
101
+// The next two were gleaned from http://www.kvraudio.com/forum/viewtopic.php?p=1905347
102
+const int effGetParamLabel = 6;
103
+const int effGetParamDisplay = 7;
104
+const int effGetParamName = 8; // currently unused
105
+const int effSetSampleRate = 10;
106
+const int effSetBlockSize = 11;
107
+const int effMainsChanged = 12;
108
+const int effEditGetRect = 13;
109
+const int effEditOpen = 14;
110
+const int effEditClose = 15;
111
+const int effEditIdle = 19;
112
+const int effEditTop = 20;
113
+const int effIdentify = 22; // from http://www.asseca.org/vst-24-specs/efIdentify.html
114
+const int effGetChunk = 23; // from Ardour
115
+const int effSetChunk = 24; // from Ardour
116
+const int effProcessEvents = 25;
117
+// The next one was gleaned from http://www.asseca.org/vst-24-specs/efCanBeAutomated.html
118
+const int effCanBeAutomated = 26;
119
+// The next one was gleaned from http://www.kvraudio.com/forum/viewtopic.php?p=1905347
120
+const int effGetProgramNameIndexed = 29;
121
+// The next one was gleaned from http://www.asseca.org/vst-24-specs/efGetPlugCategory.html
122
+const int effGetPlugCategory = 35;
123
+const int effGetEffectName = 45;
124
+const int effGetParameterProperties = 56; // missing
125
+const int effGetVendorString = 47;
126
+const int effGetProductString = 48;
127
+const int effGetVendorVersion = 49;
128
+const int effCanDo = 51; // currently unused
129
+// The next one was gleaned from http://www.asseca.org/vst-24-specs/efIdle.html
130
+const int effIdle = 53;
131
+const int effGetVstVersion = 58; // currently unused
132
+// The next one was gleaned from http://www.asseca.org/vst-24-specs/efBeginSetProgram.html
133
+const int effBeginSetProgram = 67;
134
+// The next one was gleaned from http://www.asseca.org/vst-24-specs/efEndSetProgram.html
135
+const int effEndSetProgram = 68;
136
+// The next one was gleaned from http://www.asseca.org/vst-24-specs/efShellGetNextPlugin.html
137
+const int effShellGetNextPlugin = 70;
138
+// The next one was gleaned from http://www.asseca.org/vst-24-specs/efBeginLoadBank.html
139
+const int effBeginLoadBank = 75;
140
+// The next one was gleaned from http://www.asseca.org/vst-24-specs/efBeginLoadProgram.html
141
+const int  effBeginLoadProgram = 76;
142
+
143
+// The next two were gleaned from http://www.kvraudio.com/forum/printview.php?t=143587&start=0
144
+const int effStartProcess = 71;
145
+const int effStopProcess = 72;
146
+
147
+const int kEffectMagic = CCONST( 'V', 's', 't', 'P' );
148
+const int kVstLangEnglish = 1;
149
+const int kVstMidiType = 1;
150
+
151
+const int kVstNanosValid = 1 << 8;
152
+const int kVstPpqPosValid = 1 << 9;
153
+const int kVstTempoValid = 1 << 10;
154
+const int kVstBarsValid = 1 << 11;
155
+const int kVstCyclePosValid = 1 << 12;
156
+const int kVstTimeSigValid = 1 << 13;
157
+// from Ardour
158
+const int kVstSmpteValid = 1 << 14;
159
+// from Ardour
160
+const int kVstClockValid = 1 << 15;
161
+
162
+const int kVstTransportPlaying = 1 << 1;
163
+const int kVstTransportCycleActive = 1 << 2;
164
+const int kVstTransportChanged = 1;
165
+
166
+
167
+class RemoteVstPlugin;
168
+
169
+
170
+class VstMidiEvent
171
+{
172
+   public:
173
+       // 00
174
+       int type;
175
+       // 04
176
+       int byteSize;
177
+       // 08
178
+       int deltaFrames;
179
+       // 0c?
180
+       int flags;
181
+       // 10?
182
+       int noteLength;
183
+       // 14?
184
+       int noteOffset;
185
+       // 18
186
+       char midiData[4];
187
+       // 1c?
188
+       char detune;
189
+       // 1d?
190
+       char noteOffVelocity;
191
+       // 1e?
192
+       char reserved1;
193
+       // 1f?
194
+       char reserved2;
195
+};
196
+
197
+
198
+class VstEvent
199
+{
200
+   char dump[sizeof( VstMidiEvent )];
201
obs-studio-18.0.0.tar.xz/plugins/obs-vst/win Added
2
 
1
+(directory)
2
obs-studio-18.0.0.tar.xz/plugins/obs-vst/win/EditorWidget-win.cpp Added
59
 
1
@@ -0,0 +1,56 @@
2
+/*****************************************************************************
3
+Copyright (C) 2016-2017 by Colin Edwards.
4
+
5
+This program is free software: you can redistribute it and/or modify
6
+it under the terms of the GNU General Public License as published by
7
+the Free Software Foundation, either version 2 of the License, or
8
+(at your option) any later version.
9
+
10
+This program is distributed in the hope that it will be useful,
11
+but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
+GNU General Public License for more details.
14
+
15
+You should have received a copy of the GNU General Public License
16
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
+*****************************************************************************/
18
+
19
+#include "../headers/EditorWidget.h"
20
+
21
+#include <QWindow>
22
+#include <Windows.h>
23
+
24
+void EditorWidget::buildEffectContainer(AEffect *effect) {
25
+   WNDCLASSEX wcex{ sizeof(wcex)
26
+   };
27
+
28
+   wcex.lpfnWndProc = DefWindowProc;
29
+   wcex.hInstance = GetModuleHandle(0);
30
+   wcex.lpszClassName = L"Minimal VST host - Guest VST Window Frame";
31
+   RegisterClassEx(&wcex);
32
+
33
+   const auto style = WS_CAPTION | WS_THICKFRAME | WS_OVERLAPPEDWINDOW;
34
+   HWND hwnd = CreateWindow(
35
+       wcex.lpszClassName, TEXT(""), style
36
+       , 0, 0, 0, 0, nullptr, nullptr, nullptr, nullptr
37
+   );
38
+
39
+   QWidget *widget = QWidget::createWindowContainer(
40
+           QWindow::fromWinId((WId)hwnd), this);
41
+   widget->move(0, 0);
42
+   widget->resize(300, 300);
43
+
44
+   effect->dispatcher(effect, effEditOpen, 0, 0, hwnd, 0);
45
+
46
+   VstRect* vstRect = nullptr;
47
+   effect->dispatcher(effect, effEditGetRect, 0, 0, &vstRect, 0);
48
+   if (vstRect)
49
+   {
50
+       widget->resize(vstRect->right - vstRect->left,
51
+               vstRect->bottom - vstRect->top);
52
+   }
53
+}
54
+
55
+void EditorWidget::handleResizeRequest(int width, int height) {
56
+   // We don't have to do anything here as far as I can tell. The widget will resize the HWIND itself and then this widget will automatically size depending on that.
57
+}
58
\ No newline at end of file
59
obs-studio-18.0.0.tar.xz/plugins/obs-vst/win/VSTPlugin-win.cpp Added
78
 
1
@@ -0,0 +1,75 @@
2
+/*****************************************************************************
3
+Copyright (C) 2016-2017 by Colin Edwards.
4
+Additional Code Copyright (C) 2016-2017 by c3r1c3 <c3r1c3@nevermindonline.com>
5
+
6
+This program is free software: you can redistribute it and/or modify
7
+it under the terms of the GNU General Public License as published by
8
+the Free Software Foundation, either version 2 of the License, or
9
+(at your option) any later version.
10
+
11
+This program is distributed in the hope that it will be useful,
12
+but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
+GNU General Public License for more details.
15
+
16
+You should have received a copy of the GNU General Public License
17
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
+*****************************************************************************/
19
+#include "../headers/VSTPlugin.h"
20
+#include "../headers/vst-plugin-callbacks.hpp"
21
+
22
+#include <util/platform.h>
23
+#include <windows.h>
24
+
25
+AEffect* VSTPlugin::loadEffect() {
26
+   AEffect *plugin = nullptr;
27
+
28
+   wchar_t *wpath;
29
+   os_utf8_to_wcs_ptr(pluginPath.c_str(), 0, &wpath);
30
+   dllHandle = LoadLibraryW(wpath);
31
+   bfree(wpath);
32
+   if(dllHandle == nullptr) {
33
+
34
+       DWORD errorCode = GetLastError();
35
+
36
+       // Display the error message and exit the process
37
+       if (errorCode == ERROR_BAD_EXE_FORMAT) {
38
+           blog(LOG_WARNING, "Could not open library, wrong architecture.");
39
+       } else {
40
+           blog(LOG_WARNING, "Failed trying to load VST from '%s', error %d\n",
41
+           pluginPath, GetLastError());
42
+       }
43
+       return nullptr;
44
+   }
45
+
46
+   vstPluginMain mainEntryPoint =
47
+       (vstPluginMain)GetProcAddress(dllHandle, "VSTPluginMain");
48
+
49
+   if (mainEntryPoint == nullptr) {
50
+       mainEntryPoint =
51
+               (vstPluginMain)GetProcAddress(dllHandle,
52
+                       "VstPluginMain()");
53
+   }
54
+
55
+   if (mainEntryPoint == nullptr) {
56
+       mainEntryPoint = (vstPluginMain)GetProcAddress(dllHandle,
57
+               "main");
58
+   }
59
+
60
+   if (mainEntryPoint == nullptr) {
61
+       blog(LOG_WARNING, "Couldn't get a pointer to plug-in's main()");
62
+       return nullptr;
63
+   }
64
+
65
+   // Instantiate the plug-in
66
+   plugin = mainEntryPoint(hostCallback_static);
67
+   plugin->user = this;
68
+   return plugin;
69
+}
70
+
71
+void VSTPlugin::unloadLibrary() {
72
+   if (dllHandle) {
73
+       FreeLibrary(dllHandle);
74
+       dllHandle = nullptr;
75
+   }
76
+}
77
\ No newline at end of file
78
obs-studio-17.0.2.tar.xz/plugins/obs-x264/data/locale/da-DK.ini -> obs-studio-18.0.0.tar.xz/plugins/obs-x264/data/locale/da-DK.ini Changed
9
 
1
@@ -1,6 +1,7 @@
2
 Bitrate="Bitrate"
3
 CustomBufsize="Brug brugerdefineret bufferstørrelse"
4
 BufferSize="Bufferstørrelsen"
5
+RateControl="Rate kontrol"
6
 CRF="CRF"
7
 KeyframeIntervalSec="Keyframe interval (sekunder, 0 = auto)"
8
 CPUPreset="CPU forbrug indstilling (højere = mindre CPU)"
9
obs-studio-17.0.2.tar.xz/plugins/rtmp-services/data/package.json -> obs-studio-18.0.0.tar.xz/plugins/rtmp-services/data/package.json Changed
14
 
1
@@ -1,10 +1,10 @@
2
 {
3
    "url": "https://obsproject.com/obs2_update/rtmp-services",
4
-   "version": 44,
5
+   "version": 52,
6
    "files": [
7
        {
8
            "name": "services.json",
9
-           "version": 44
10
+           "version": 52
11
        }
12
    ]
13
 }
14
obs-studio-17.0.2.tar.xz/plugins/rtmp-services/data/services.json -> obs-studio-18.0.0.tar.xz/plugins/rtmp-services/data/services.json Changed
201
 
1
@@ -42,10 +42,18 @@
2
                     "url": "rtmp://live-fra.twitch.tv/app"
3
                 },
4
                 {
5
+                    "name": "EU: Lisbon, Portugal",
6
+                    "url": "rtmp://live-lis.twitch.tv/app"
7
+                },
8
+                {
9
                     "name": "EU: London, UK",
10
                     "url": "rtmp://live-lhr.twitch.tv/app"
11
                 },
12
                 {
13
+                    "name": "EU: Milan, Italy",
14
+                    "url": "rtmp://live-mil.twitch.tv/app"
15
+                },
16
+                {
17
                     "name": "EU: Paris, FR",
18
                     "url": "rtmp://live-cdg.twitch.tv/app"
19
                 },
20
@@ -62,6 +70,14 @@
21
                     "url": "rtmp://live-waw.twitch.tv/app"
22
                 },
23
                 {
24
+                    "name": "NA: Mexico City",
25
+                    "url": "rtmp://live-qro.twitch.tv/app"
26
+                },
27
+                {
28
+                    "name": "NA: Toronto, Canada",
29
+                    "url": "rtmp://live-yto.twitch.tv/app"
30
+                },
31
+                {
32
                     "name": "South America: Argentina",
33
                     "url": "rtmp://live-eze.twitch.tv/app"
34
                 },
35
@@ -70,6 +86,14 @@
36
                     "url": "rtmp://live-scl.twitch.tv/app"
37
                 },
38
                 {
39
+                    "name": "South America: Lima, Peru",
40
+                    "url": "rtmp://live-lim.twitch.tv/app"
41
+                },
42
+                {
43
+                    "name": "South America: Medellin, Columbia",
44
+                    "url": "rtmp://live-mde.twitch.tv/app"
45
+                },
46
+                {
47
                     "name": "South America: Rio de Janeiro, Brazil",
48
                     "url": "rtmp://live-gig.twitch.tv/app"
49
                 },
50
@@ -132,7 +156,6 @@
51
             ],
52
             "recommended": {
53
                 "keyint": 2,
54
-                "profile": "main",
55
                 "max video bitrate": 51000,
56
                 "max audio bitrate": 160
57
             }
58
@@ -178,10 +201,6 @@
59
                     "url": "rtmp://live.dme.hitbox.tv/push"
60
                 },
61
                 {
62
-                    "name": "US-East: Washington",
63
-                    "url": "rtmp://live.vgn.hitbox.tv/push"
64
-                },
65
-                {
66
                     "name": "US-East: New York - 1",
67
                     "url": "rtmp://live.jfk.hitbox.tv/push"
68
                 },
69
@@ -274,6 +293,10 @@
70
                     "url": "rtmp://ingest-fra.beam.pro:1935/beam"
71
                 },
72
                 {
73
+                    "name": "EU: Oslo",
74
+                    "url": "rtmp://ingest-osl.beam.pro:1935/beam"
75
+                },
76
+                {
77
                     "name": "Brazil: Sao Paulo",
78
                     "url": "rtmp://ingest-sao.beam.pro:1935/beam"
79
                 },
80
@@ -296,12 +319,20 @@
81
                 {
82
                     "name": "Asia: Tokyo",
83
                     "url": "rtmp://ingest-tok.beam.pro:1935/beam"
84
+                },
85
+                {
86
+                    "name": "South Korea: Seoul",
87
+                    "url": "rtmp://ingest-seo.beam.pro:1935/beam"
88
+                },
89
+                {
90
+                    "name": "India: Chennai",
91
+                    "url": "rtmp://ingest-che.beam.pro:1935/beam"
92
                 }
93
             ],
94
             "recommended": {
95
                 "keyint": 1,
96
                 "max audio bitrate": 160,
97
-                "max video bitrate": 3500,
98
+                "max video bitrate": 10000,
99
                 "profile": "main"
100
             }
101
         },
102
@@ -346,6 +377,21 @@
103
             ]
104
         },
105
         {
106
+            "name": "Web.TV",
107
+            "servers": [
108
+                {
109
+                    "name": "Primary",
110
+                    "url": "rtmp://live3.origins.web.tv/liveext"
111
+                }
112
+            ],
113
+            "recommended": {
114
+                "keyint": 2,
115
+                "profile": "main",
116
+                "max video bitrate": 3500,
117
+                "max audio bitrate": 160
118
+            }
119
+        },
120
+        {
121
             "name": "Switchboard Live (Joicaster)",
122
             "servers": [
123
                 {
124
@@ -409,75 +455,75 @@
125
             ]
126
         },
127
         {
128
-            "name": "Vaughn Live / iNSTAGIB.tv",
129
+            "name": "Vaughn Live / iNSTAGIB",
130
             "servers": [
131
                 {
132
                     "name": "US: Primary",
133
-                    "url": "rtmp://live.vaughnsoft.net:443/live"
134
+                    "url": "rtmp://live.vaughnsoft.net/live"
135
                 },
136
                 {
137
-                    "name": "US: San Jose, CA",
138
-                    "url": "rtmp://live-sjc.vaughnsoft.net:443/live"
139
+                    "name": "US: Chicago, IL",
140
+                    "url": "rtmp://live-ord.vaughnsoft.net/live"
141
                 },
142
                 {
143
-                    "name": "US: New York, NY",
144
-                    "url": "rtmp://live-nyc.vaughnsoft.net:443/live"
145
+                    "name": "US: Denver, CO",
146
+                    "url": "rtmp://live-den.vaughnsoft.net/live"
147
                 },
148
                 {
149
-                    "name": "US: New York 2, NY",
150
-                    "url": "rtmp://live-nyc2.vaughnsoft.net:443/live"
151
-                }
152
-            ]
153
-        },
154
-        {
155
-            "name": "connectcast.tv",
156
-            "servers": [
157
+                    "name": "US: Los Angeles, CA",
158
+                    "url": "rtmp://live-lax.vaughnsoft.net/live"
159
+                },
160
                 {
161
-                    "name": "Default",
162
-                    "url": "rtmp://stream.connectcast.tv/live"
163
+                    "name": "EU: Amsterdam, NL",
164
+                    "url": "rtmp://live-ams.vaughnsoft.net/live"
165
                 }
166
-            ]
167
+            ],
168
+            "recommended": {
169
+                "keyint": 2,
170
+                "max video bitrate": 3500,
171
+                "max audio bitrate": 160
172
+            }
173
         },
174
         {
175
-            "name": "Kamcord",
176
+            "name": "Breakers.TV",
177
             "servers": [
178
                 {
179
-                    "name": "US East (N. Virginia)",
180
-                    "url": "rtmp://us-east-1.stream.kamcord.com/live"
181
-                },
182
-                {
183
-                    "name": "Asia Pacific (Seoul)",
184
-                    "url": "rtmp://ap-northeast-2.stream.kamcord.com/live"
185
-                },
186
-                {
187
-                    "name": "Asia Pacific (Sydney)",
188
-                    "url": "rtmp://ap-southeast-2.stream.kamcord.com/live"
189
+                    "name": "US: Primary",
190
+                    "url": "rtmp://live.vaughnsoft.net/live"
191
                 },
192
                 {
193
-                    "name": "Asia Pacific (Tokyo)",
194
-                    "url": "rtmp://ap-northeast-1.stream.kamcord.com/live"
195
+                    "name": "US: Chicago, IL",
196
+                    "url": "rtmp://live-ord.vaughnsoft.net/live"
197
                 },
198
                 {
199
-                    "name": "EU (Frankfurt)",
200
-                    "url": "rtmp://eu-central-1.stream.kamcord.com/live"
201
obs-studio-18.0.0.tar.xz/plugins/vlc-video/data/locale/da-DK.ini Added
10
 
1
@@ -0,0 +1,8 @@
2
+VLCSource="VLC videokilde"
3
+Playlist="Afspilningsliste"
4
+LoopPlaylist="Loop afspilningsliste"
5
+PlaybackBehavior="Synligheds opførsel"
6
+PlaybackBehavior.StopRestart="Stop når ikke synlig, genstart når synlig"
7
+PlaybackBehavior.PauseUnpause="Paus når ikke synlig, genoptag når synlig"
8
+PlaybackBehavior.AlwaysPlay="Afspil altid også når usynlig"
9
+
10
obs-studio-17.0.2.tar.xz/plugins/win-capture/data/locale/da-DK.ini -> obs-studio-18.0.0.tar.xz/plugins/win-capture/data/locale/da-DK.ini Changed
16
 
1
@@ -12,9 +12,14 @@
2
 PrimaryMonitor="Primære skærm"
3
 GameCapture="Spil optager"
4
 GameCapture.AnyFullscreen="Optag ethvert fuldskærms program"
5
+GameCapture.CaptureWindow="Optag specifikt vindue"
6
+GameCapture.UseHotkey="Optag forreste vindue med hotkey"
7
 GameCapture.ForceScaling="Tving skalering"
8
 GameCapture.ScaleRes="Skalere opløsning"
9
 GameCapture.LimitFramerate="Begræns optagelses framerate"
10
 GameCapture.CaptureOverlays="Optag fra tredjepart overlays (såsom Steam)"
11
 GameCapture.AntiCheatHook="Brug anti-cheat kompatibilitet hook"
12
+GameCapture.HotkeyStart="Optag forreste vindue"
13
+GameCapture.HotkeyStop="Deaktiver optagelse"
14
+Mode="Tilstand"
15
 
16
obs-studio-17.0.2.tar.xz/plugins/win-capture/data/locale/ro-RO.ini -> obs-studio-18.0.0.tar.xz/plugins/win-capture/data/locale/ro-RO.ini Changed
8
 
1
@@ -17,4 +17,6 @@
2
 GameCapture.LimitFramerate="Limitează frecvența de cadre a capturii"
3
 GameCapture.CaptureOverlays="Capturează overlay-uri terțe (precum Steam)"
4
 GameCapture.AntiCheatHook="Folosește hook pentru compatibilitate anticheat"
5
+GameCapture.HotkeyStop="Dezactivare captură"
6
+Mode="Tip"
7
 
8
obs-studio-17.0.2.tar.xz/plugins/win-capture/game-capture.c -> obs-studio-18.0.0.tar.xz/plugins/win-capture/game-capture.c Changed
10
 
1
@@ -911,6 +911,8 @@
2
    "origin",
3
    "devenv",
4
    "taskmgr",
5
+   "chrome",
6
+   "firefox",
7
    "systemsettings",
8
    "applicationframehost",
9
    "cmd",
10
obs-studio-17.0.2.tar.xz/plugins/win-capture/graphics-hook/dxgi-capture.cpp -> obs-studio-18.0.0.tar.xz/plugins/win-capture/graphics-hook/dxgi-capture.cpp Changed
11
 
1
@@ -38,7 +38,8 @@
2
     * quite know. */
3
    if (_strcmpi(process_name, "iw6sp64_ship.exe") == 0 ||
4
        _strcmpi(process_name, "iw6mp64_ship.exe") == 0 ||
5
-       _strcmpi(process_name, "justcause3.exe") == 0) {
6
+       _strcmpi(process_name, "justcause3.exe") == 0 ||
7
+       _strcmpi(process_name, "theHunterCotW_F.exe") == 0) {
8
        ignore_d3d10 = true;
9
    }
10
 
11
obs-studio-17.0.2.tar.xz/plugins/win-capture/graphics-hook/graphics-hook.c -> obs-studio-18.0.0.tar.xz/plugins/win-capture/graphics-hook/graphics-hook.c Changed
12
 
1
@@ -235,8 +235,8 @@
2
 {
3
    wait_for_dll_main_finish(thread_handle);
4
 
5
-   _snwprintf(keepalive_name, sizeof(keepalive_name), L"%s%lu",
6
-           WINDOW_HOOK_KEEPALIVE, GetCurrentProcessId());
7
+   _snwprintf(keepalive_name, sizeof(keepalive_name) / sizeof(wchar_t),
8
+           L"%s%lu", WINDOW_HOOK_KEEPALIVE, GetCurrentProcessId());
9
 
10
    init_pipe();
11
 
12
obs-studio-17.0.2.tar.xz/plugins/win-capture/window-helpers.c -> obs-studio-18.0.0.tar.xz/plugins/win-capture/window-helpers.c Changed
115
 
1
@@ -240,7 +240,7 @@
2
    HWND child;
3
 
4
    GetWindowThreadProcessId(parent, &parent_id);
5
-   child = GetWindow(parent, GW_CHILD);
6
+   child = FindWindowEx(parent, NULL, NULL, NULL);
7
 
8
    while (child) {
9
        DWORD child_id = 0;
10
@@ -249,14 +249,14 @@
11
        if (child_id != parent_id)
12
            return child;
13
 
14
-       child = GetNextWindow(child, GW_HWNDNEXT);
15
+       child = FindWindowEx(parent, child, NULL, NULL);
16
    }
17
 
18
    return NULL;
19
 }
20
 
21
-static inline HWND next_window(HWND window, enum window_search_mode mode,
22
-       HWND *parent)
23
+static HWND next_window(HWND window, enum window_search_mode mode,
24
+       HWND *parent, bool use_findwindowex)
25
 {
26
    if (*parent) {
27
        window = *parent;
28
@@ -264,7 +264,12 @@
29
    }
30
 
31
    while (true) {
32
-       window = GetNextWindow(window, GW_HWNDNEXT);
33
+       if (use_findwindowex)
34
+           window = FindWindowEx(GetDesktopWindow(), window, NULL,
35
+                   NULL);
36
+       else
37
+           window = GetNextWindow(window, GW_HWNDNEXT);
38
+
39
        if (!window || check_window_valid(window, mode))
40
            break;
41
    }
42
@@ -280,14 +285,32 @@
43
    return window;
44
 }
45
 
46
-static inline HWND first_window(enum window_search_mode mode, HWND *parent)
47
+static HWND first_window(enum window_search_mode mode, HWND *parent,
48
+       bool *use_findwindowex)
49
 {
50
-   HWND window = GetWindow(GetDesktopWindow(), GW_CHILD);
51
+   HWND window = FindWindowEx(GetDesktopWindow(), NULL, NULL, NULL);
52
+
53
+   if (!window) {
54
+       *use_findwindowex = false;
55
+       window = GetWindow(GetDesktopWindow(), GW_CHILD);
56
+   } else {
57
+       *use_findwindowex = true;
58
+   }
59
 
60
    *parent = NULL;
61
 
62
-   if (!check_window_valid(window, mode))
63
-       window = next_window(window, mode, parent);
64
+   if (!check_window_valid(window, mode)) {
65
+       window = next_window(window, mode, parent, *use_findwindowex);
66
+
67
+       if (!window && *use_findwindowex) {
68
+           *use_findwindowex = false;
69
+
70
+           window = GetWindow(GetDesktopWindow(), GW_CHILD);
71
+           if (!check_window_valid(window, mode))
72
+               window = next_window(window, mode, parent,
73
+                       *use_findwindowex);
74
+       }
75
+   }
76
 
77
    if (is_uwp_window(window)) {
78
        HWND child = get_uwp_actual_window(window);
79
@@ -304,11 +327,13 @@
80
        add_window_cb callback)
81
 {
82
    HWND parent;
83
-   HWND window = first_window(mode, &parent);
84
+   bool use_findwindowex = false;
85
+
86
+   HWND window = first_window(mode, &parent, &use_findwindowex);
87
 
88
    while (window) {
89
        add_window(p, window, callback);
90
-       window = next_window(window, mode, &parent);
91
+       window = next_window(window, mode, &parent, use_findwindowex);
92
    }
93
 }
94
 
95
@@ -366,7 +391,9 @@
96
        const char *exe)
97
 {
98
    HWND parent;
99
-   HWND window      = first_window(mode, &parent);
100
+   bool use_findwindowex = false;
101
+
102
+   HWND window      = first_window(mode, &parent, &use_findwindowex);
103
    HWND best_window = NULL;
104
    int  best_rating = 0;
105
 
106
@@ -383,7 +410,7 @@
107
            best_window = window;
108
        }
109
 
110
-       window = next_window(window, mode, &parent);
111
+       window = next_window(window, mode, &parent, use_findwindowex);
112
    }
113
 
114
    return best_window;
115
obs-studio-17.0.2.tar.xz/plugins/win-dshow/data/locale/da-DK.ini -> obs-studio-18.0.0.tar.xz/plugins/win-dshow/data/locale/da-DK.ini Changed
25
 
1
@@ -17,11 +17,23 @@
2
 VideoFormat="Video Format"
3
 VideoFormat.Any="Enhver"
4
 VideoFormat.Unknown="Ukendt (%1)"
5
+AudioOutputMode="Tilstand for lydoutput"
6
+AudioOutputMode.Capture="Optag kun lyd"
7
+AudioOutputMode.DirectSound="Output skrivebordslyd (DirectSound)"
8
+AudioOutputMode.WaveOut="Output skrivebordslyd (WaveOut)"
9
 UseCustomAudioDevice="Brug brugerdefinerede lydenhed"
10
 AudioDevice="Lydenhed"
11
 Buffering="Buffering"
12
+Buffering.ToolTip="Når aktiveret, vil video/audio data blive bufferet for at sikre den glatteste og mest\nkorrekt afspilning, men på bekostning af øget svartid.  Når \nbuffering bruges med et video-capturekort, anbefales det at indstille kort og \nprogrammet til samme framerate for bedste resultat.\n\nNår deaktiveret, sikrer laveste svartids afspilning, men på bekostning af frame\nafspilnings-nøjagtighed.  Dette er ideelt til ansigtskameraer, eller når du vil bruge the\nprogrammets eksempelvindue til at spille en konsol.\n\nAutogenkend (standard) indstiller den til aktiveret, hvis enheden har forsinkelse og disabled\nhvis det ikke har nogen forsinkelse."
13
+Buffering.AutoDetect="Autogenkend"
14
+Buffering.Enable="Aktiver"
15
+Buffering.Disable="Deaktiver"
16
 Activate="Aktivér"
17
 Deactivate="Deaktivér"
18
+FlipVertically="Spejlvend vertikalt"
19
+DeactivateWhenNotShowing="Deaktiver når ikke vist"
20
 
21
 Bitrate="Bitrate"
22
+Encoder.C985="AVerMedia H.264 Encoder (c985)"
23
+Encoder.C353="AVerMedia H.264 Encoder"
24
 
25
obs-studio-17.0.2.tar.xz/plugins/win-dshow/ffmpeg-decode.c -> obs-studio-18.0.0.tar.xz/plugins/win-dshow/ffmpeg-decode.c Changed
55
 
1
@@ -16,6 +16,8 @@
2
 ******************************************************************************/
3
 
4
 #include "ffmpeg-decode.h"
5
+#include <util/util_uint128.h>
6
+#include <util/base.h>
7
 #include <obs-avc.h>
8
 
9
 int ffmpeg_decode_init(struct ffmpeg_decode *decode, enum AVCodecID id)
10
@@ -107,8 +109,33 @@
11
    memcpy(decode->packet_buffer, data, size);
12
 }
13
 
14
+static void do_idiotic_lgp_audio_packet_realignment(
15
+       struct ffmpeg_decode *decode, long long *ts)
16
+{
17
+   uint64_t new_ts = (uint64_t)*ts;
18
+   util_uint128_t u128;
19
+
20
+   if (!decode->lgp_started) {
21
+       decode->lgp_start_ts = new_ts;
22
+       decode->lgp_next_expected_ts = new_ts;
23
+       decode->lgp_started = true;
24
+   }
25
+
26
+   if (llabs(decode->lgp_next_expected_ts - new_ts) < 3000000ULL) {
27
+       *ts = (long long)decode->lgp_next_expected_ts;
28
+   } else {
29
+       decode->lgp_start_ts = new_ts;
30
+       decode->lgp_frames_since_start = 0;
31
+   }
32
+
33
+   decode->lgp_frames_since_start += (uint64_t)decode->frame->nb_samples;
34
+   u128 = util_mul64_64(decode->lgp_frames_since_start, 10000000ULL);
35
+   decode->lgp_next_expected_ts = decode->lgp_start_ts +
36
+       util_div128_32(u128, (uint32_t)decode->frame->sample_rate).low;
37
+}
38
+
39
 int ffmpeg_decode_audio(struct ffmpeg_decode *decode,
40
-       uint8_t *data, size_t size,
41
+       uint8_t *data, size_t size, long long *ts,
42
        struct obs_source_audio *audio,
43
        bool *got_output)
44
 {
45
@@ -148,6 +175,9 @@
46
    if (audio->format == AUDIO_FORMAT_UNKNOWN)
47
        return 0;
48
 
49
+   if (decode->fix_braindead_lgp_audio_packet_stupidity)
50
+       do_idiotic_lgp_audio_packet_realignment(decode, ts);
51
+
52
    *got_output = true;
53
    return len;
54
 }
55
obs-studio-17.0.2.tar.xz/plugins/win-dshow/ffmpeg-decode.h -> obs-studio-18.0.0.tar.xz/plugins/win-dshow/ffmpeg-decode.h Changed
22
 
1
@@ -44,13 +44,19 @@
2
 
3
    uint8_t        *packet_buffer;
4
    size_t         packet_size;
5
+
6
+   uint64_t       lgp_start_ts;
7
+   uint64_t       lgp_frames_since_start;
8
+   uint64_t       lgp_next_expected_ts;
9
+   bool           lgp_started;
10
+   bool           fix_braindead_lgp_audio_packet_stupidity;
11
 };
12
 
13
 extern int ffmpeg_decode_init(struct ffmpeg_decode *decode, enum AVCodecID id);
14
 extern void ffmpeg_decode_free(struct ffmpeg_decode *decode);
15
 
16
 extern int ffmpeg_decode_audio(struct ffmpeg_decode *decode,
17
-       uint8_t *data, size_t size,
18
+       uint8_t *data, size_t size, long long *ts,
19
        struct obs_source_audio *audio,
20
        bool *got_output);
21
 
22
obs-studio-17.0.2.tar.xz/plugins/win-dshow/win-dshow.cpp -> obs-studio-18.0.0.tar.xz/plugins/win-dshow/win-dshow.cpp Changed
29
 
1
@@ -116,6 +116,7 @@
2
    inline ~Decoder() {ffmpeg_decode_free(&decode);}
3
 
4
    inline operator ffmpeg_decode*() {return &decode;}
5
+   inline ffmpeg_decode *operator->() {return &decode;}
6
 };
7
 
8
 class CriticalSection {
9
@@ -507,10 +508,18 @@
10
            blog(LOG_WARNING, "Could not initialize audio decoder");
11
            return;
12
        }
13
+
14
+       if (videoConfig.name.find(L"C875") != std::string::npos ||
15
+           videoConfig.name.find(L"C835") != std::string::npos) {
16
+           audio_decoder->fix_braindead_lgp_audio_packet_stupidity
17
+               = true;
18
+           blog(LOG_INFO, "Oh great, an LGP was detected.  "
19
+                   "How wonderful.  I'm just ecstatic.");
20
+       }
21
    }
22
 
23
    bool got_output;
24
-   int len = ffmpeg_decode_audio(audio_decoder, data, size,
25
+   int len = ffmpeg_decode_audio(audio_decoder, data, size, &ts,
26
            &audio, &got_output);
27
    if (len < 0) {
28
        blog(LOG_WARNING, "Error decoding audio");
29
obs-studio-17.0.2.tar.xz/plugins/win-mf/data/locale/ca-ES.ini -> obs-studio-18.0.0.tar.xz/plugins/win-mf/data/locale/ca-ES.ini Changed
10
 
1
@@ -4,7 +4,7 @@
2
 MF.H264.EncoderName="Codificador H264 de Media Foundation"
3
 MF.H264.Encoder="Nom del codificador"
4
 MF.H264.LowLatency="Baixa latència (desactiva la reorganització de fotogrames)"
5
-MF.H264.BFrames="Número de B-Frame consecutives"
6
+MF.H264.BFrames="Número de B-Frame consecutius"
7
 MF.H264.CustomBufsize="Utilitza grandària de memòria cau personalitzada"
8
 MF.H264.BufferSize="Mida de la memòria intermèdia"
9
 MF.H264.CustomMaxBitrate="Utilitza grandària màxima de taxa de bits personalitzada"
10
obs-studio-17.0.2.tar.xz/plugins/win-mf/data/locale/da-DK.ini -> obs-studio-18.0.0.tar.xz/plugins/win-mf/data/locale/da-DK.ini Changed
30
 
1
@@ -2,9 +2,28 @@
2
 Bitrate="Bitrate"
3
 
4
 MF.H264.EncoderName="Media Foundation H264 Encoder"
5
+MF.H264.Encoder="Encoder navn"
6
+MF.H264.LowLatency="Lav svartid (deaktiver frame re-ordering)"
7
+MF.H264.CustomBufsize="Brug tilpasset bufferstørrelse"
8
+MF.H264.BufferSize="Bufferstørrelse"
9
+MF.H264.CustomMaxBitrate="Brug tilpasset max bitrate"
10
+MF.H264.Bitrate="Bitrate"
11
+MF.H264.MaxBitrate="Maks bitrate"
12
+MF.H264.KeyframeIntervalSec="Keyframe interval (sekunder, 0=auto)"
13
+MF.H264.RateControl="Rate kontrol"
14
+MF.H264.CBR="CBR (Konstant bitrate)"
15
+MF.H264.VBR="VBR (Variabel bitrate)"
16
+MF.H264.CQP="CQP (konstant kvalitet)"
17
 MF.H264.MinQP="Minimum QP"
18
 MF.H264.MaxQP="Maximum QP"
19
+MF.H264.QPI="QP I-frame"
20
+MF.H264.QPP="QP P-frame"
21
+MF.H264.QPB="QP B-frame"
22
 MF.H264.Profile="Profil"
23
 MF.H264.Advanced="Advancerede"
24
 
25
+MF.H264.EncoderSWMicrosoft="Microsoft software H.264 encoder"
26
+MF.H264.EncoderHWAMD="AMD Video Coding Engine H.264 Encoder (Media Foundation)"
27
+MF.H264.EncoderHWIntel="Intel Quick Sync H.264 Encoder (Media Foundation)"
28
+MF.H264.EncoderHWNVIDIA="NVIDIA NVENC H.264 Encoder (Media Foundation)"
29
 
30
obs-studio-17.0.2.tar.xz/plugins/win-wasapi/win-wasapi.cpp -> obs-studio-18.0.0.tar.xz/plugins/win-wasapi/win-wasapi.cpp Changed
11
 
1
@@ -589,7 +589,8 @@
2
    info.id              = "wasapi_output_capture";
3
    info.type            = OBS_SOURCE_TYPE_INPUT;
4
    info.output_flags    = OBS_SOURCE_AUDIO |
5
-                          OBS_SOURCE_DO_NOT_DUPLICATE;
6
+                          OBS_SOURCE_DO_NOT_DUPLICATE |
7
+                          OBS_SOURCE_DO_NOT_MONITOR;
8
    info.get_name        = GetWASAPIOutputName;
9
    info.create          = CreateWASAPIOutput;
10
    info.destroy         = DestroyWASAPISource;
11