Skip to content

Commit 0cc357f

Browse files
authored
Merge pull request #10633 from palana/ruwen/upstream-multitrack-video-ui
UI: Add (eRTMP) multitrack video output
2 parents 432a2a8 + 1aa8111 commit 0cc357f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+4142
-571
lines changed

UI/CMakeLists.txt

+18
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,24 @@ target_sources(
8484
ui-validation.cpp
8585
ui-validation.hpp)
8686

87+
target_sources(
88+
obs-studio
89+
PRIVATE # cmake-format: sortable
90+
goliveapi-censoredjson.cpp
91+
goliveapi-censoredjson.hpp
92+
goliveapi-network.cpp
93+
goliveapi-network.hpp
94+
goliveapi-postdata.cpp
95+
goliveapi-postdata.hpp
96+
models/multitrack-video.hpp
97+
multitrack-video-error.cpp
98+
multitrack-video-error.hpp
99+
multitrack-video-output.cpp
100+
multitrack-video-output.hpp
101+
qt-helpers.cpp
102+
qt-helpers.hpp
103+
system-info.hpp)
104+
87105
if(OS_WINDOWS)
88106
include(cmake/os-windows.cmake)
89107
elseif(OS_MACOS)

UI/api-interface.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,16 @@ struct OBSStudioAPI : obs_frontend_callbacks {
482482

483483
obs_output_t *obs_frontend_get_streaming_output(void) override
484484
{
485+
auto multitrackVideo =
486+
main->outputHandler->multitrackVideo.get();
487+
auto mtvOutput =
488+
multitrackVideo
489+
? obs_output_get_ref(
490+
multitrackVideo->StreamingOutput())
491+
: nullptr;
492+
if (mtvOutput)
493+
return mtvOutput;
494+
485495
OBSOutput output = main->outputHandler->streamOutput.Get();
486496
return obs_output_get_ref(output);
487497
}

UI/cmake/legacy.cmake

+23
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,23 @@ target_sources(
280280
window-remux.cpp
281281
window-remux.hpp)
282282

283+
target_sources(
284+
obs
285+
PRIVATE # cmake-format: sortable
286+
goliveapi-censoredjson.cpp
287+
goliveapi-censoredjson.hpp
288+
goliveapi-network.cpp
289+
goliveapi-network.hpp
290+
goliveapi-postdata.cpp
291+
goliveapi-postdata.hpp
292+
multitrack-video-error.cpp
293+
multitrack-video-error.hpp
294+
multitrack-video-output.cpp
295+
multitrack-video-output.hpp
296+
qt-helpers.cpp
297+
qt-helpers.hpp
298+
system-info.hpp)
299+
283300
target_sources(obs PRIVATE importers/importers.cpp importers/importers.hpp importers/classic.cpp importers/sl.cpp
284301
importers/studio.cpp importers/xsplit.cpp)
285302

@@ -366,6 +383,8 @@ if(OS_WINDOWS)
366383
win-update/updater/manifest.hpp
367384
${CMAKE_BINARY_DIR}/obs.rc)
368385

386+
target_sources(obs PRIVATE system-info-windows.cpp)
387+
369388
find_package(MbedTLS)
370389
target_link_libraries(obs PRIVATE Mbedtls::Mbedtls nlohmann_json::nlohmann_json OBS::blake2 Detours::Detours)
371390

@@ -426,6 +445,8 @@ elseif(OS_MACOS)
426445
target_sources(obs PRIVATE platform-osx.mm)
427446
target_sources(obs PRIVATE forms/OBSPermissions.ui window-permissions.cpp window-permissions.hpp)
428447

448+
target_sources(obs PRIVATE system-info-macos.mm)
449+
429450
if(ENABLE_WHATSNEW)
430451
find_library(SECURITY Security)
431452
find_package(nlohmann_json REQUIRED)
@@ -462,6 +483,8 @@ elseif(OS_POSIX)
462483
target_sources(obs PRIVATE platform-x11.cpp)
463484
target_link_libraries(obs PRIVATE Qt::GuiPrivate Qt::DBus)
464485

486+
target_sources(obs PRIVATE system-info-posix.cpp)
487+
465488
target_compile_definitions(obs PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}"
466489
"$<$<BOOL:${LINUX_PORTABLE}>:LINUX_PORTABLE>")
467490
if(TARGET obspython)

UI/cmake/os-freebsd.cmake

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ target_sources(obs-studio PRIVATE platform-x11.cpp)
22
target_compile_definitions(obs-studio PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}")
33
target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate procstat)
44

5+
target_sources(obs-studio PRIVATE system-info-posix.cpp)
6+
57
if(TARGET OBS::python)
68
find_package(Python REQUIRED COMPONENTS Interpreter Development)
79
target_link_libraries(obs-studio PRIVATE Python::Python)

UI/cmake/os-linux.cmake

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ target_sources(obs-studio PRIVATE platform-x11.cpp)
22
target_compile_definitions(obs-studio PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}")
33
target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate Qt::DBus)
44

5+
target_sources(obs-studio PRIVATE system-info-posix.cpp)
6+
57
if(TARGET OBS::python)
68
find_package(Python REQUIRED COMPONENTS Interpreter Development)
79
target_link_libraries(obs-studio PRIVATE Python::Python)

UI/cmake/os-macos.cmake

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ include(cmake/feature-sparkle.cmake)
33
target_sources(obs-studio PRIVATE platform-osx.mm forms/OBSPermissions.ui window-permissions.cpp window-permissions.hpp)
44
target_compile_options(obs-studio PRIVATE -Wno-quoted-include-in-framework-header -Wno-comma)
55

6+
target_sources(obs-studio PRIVATE system-info-macos.mm)
7+
68
set_source_files_properties(platform-osx.mm PROPERTIES COMPILE_FLAGS -fobjc-arc)
79

810
if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 14.0.3)

UI/cmake/os-windows.cmake

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ target_sources(
3333
win-dll-blocklist.c
3434
win-update/updater/manifest.hpp)
3535

36+
target_sources(obs-studio PRIVATE system-info-windows.cpp)
37+
3638
target_link_libraries(obs-studio PRIVATE crypt32 OBS::blake2 OBS::w32-pthreads MbedTLS::MbedTLS
3739
nlohmann_json::nlohmann_json Detours::Detours)
3840

UI/data/locale/en-US.ini

+44
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ MixerToolbarMenu="Audio Mixer Menu"
115115
SceneFilters="Open Scene Filters"
116116
List="List"
117117
Grid="Grid"
118+
Automatic="Automatic"
118119

119120
# warning for plugin load failures
120121
PluginsFailedToLoad.Title="Plugin Load Error"
@@ -224,6 +225,7 @@ Basic.AutoConfig.StreamPage.PreferHardwareEncoding="Prefer hardware encoding"
224225
Basic.AutoConfig.StreamPage.PreferHardwareEncoding.ToolTip="Hardware Encoding eliminates most CPU usage, but may require more bitrate to obtain the same level of quality."
225226
Basic.AutoConfig.StreamPage.StreamWarning.Title="Stream warning"
226227
Basic.AutoConfig.StreamPage.StreamWarning.Text="The bandwidth test is about to stream randomized video data without audio to your channel. If you're able, it's recommended to temporarily turn off saving videos of streams and set the stream to private until after the test has completed. Continue?"
228+
Basic.AutoConfig.StreamPage.UseMultitrackVideo="Test %1"
227229
Basic.AutoConfig.TestPage="Final Results"
228230
Basic.AutoConfig.TestPage.SubTitle.Testing="The program is now executing a set of tests to estimate the ideal settings"
229231
Basic.AutoConfig.TestPage.SubTitle.Complete="Testing complete"
@@ -242,6 +244,7 @@ Basic.AutoConfig.TestPage.Result.Header="The program has determined that these e
242244
Basic.AutoConfig.TestPage.Result.Footer="To use these settings, click Apply Settings. To reconfigure the wizard and try again, click Back. To manually configure settings yourself, click Cancel and open Settings."
243245
Basic.AutoConfig.Info="The auto-configuration wizard will determine the best settings based on your computer specs and internet speed."
244246
Basic.AutoConfig.RunAnytime="This can be run at any time by going to the Tools menu."
247+
Basic.AutoConfig.TestPage.Result.StreamingResolution="Streaming (Scaled) Resolution"
245248

246249
# stats
247250
Basic.Stats="Stats"
@@ -721,6 +724,7 @@ Basic.Main.Scenes="Scenes"
721724
Basic.Main.Sources="Sources"
722725
Basic.Main.Source="Source"
723726
Basic.Main.Controls="Controls"
727+
Basic.Main.PreparingStream="Preparing..."
724728
Basic.Main.Connecting="Connecting..."
725729
Basic.Main.StartRecording="Start Recording"
726730
Basic.Main.StartReplayBuffer="Start Replay Buffer"
@@ -860,6 +864,7 @@ Basic.MainMenu.Help.About="&About"
860864
Basic.Settings.ProgramRestart="The program must be restarted for these settings to take effect."
861865
Basic.Settings.ConfirmTitle="Confirm Changes"
862866
Basic.Settings.Confirm="You have unsaved changes. Save changes?"
867+
Basic.Settings.MultitrackVideoDisabledSettings="%1 %2 is controlling some of your stream settings"
863868

864869
# basic mode 'general' settings
865870
Basic.Settings.General="General"
@@ -934,6 +939,7 @@ Basic.Settings.Appearance.General.NoVariant="No Styles Available"
934939

935940
# basic mode 'stream' settings
936941
Basic.Settings.Stream="Stream"
942+
Basic.Settings.Stream.Destination="Destination"
937943
Basic.Settings.Stream.Custom.UseAuthentication="Use authentication"
938944
Basic.Settings.Stream.Custom.Username="Username"
939945
Basic.Settings.Stream.Custom.Password="Password"
@@ -957,6 +963,18 @@ Basic.Settings.Stream.Recommended.MaxVideoBitrate="Maximum Video Bitrate: %1 kbp
957963
Basic.Settings.Stream.Recommended.MaxAudioBitrate="Maximum Audio Bitrate: %1 kbps"
958964
Basic.Settings.Stream.Recommended.MaxResolution="Maximum Resolution: %1"
959965
Basic.Settings.Stream.Recommended.MaxFPS="Maximum FPS: %1"
966+
Basic.Settings.Stream.SpecifyCustomServer="Specify Custom Server..."
967+
Basic.Settings.Stream.ServiceCustomServer="Custom Server"
968+
Basic.Settings.Stream.EnableMultitrackVideo="Enable %1"
969+
Basic.Settings.Stream.MultitrackVideoMaximumAggregateBitrate="Maximum Streaming Bandwidth"
970+
Basic.Settings.Stream.MultitrackVideoMaximumAggregateBitrateAuto="Auto"
971+
Basic.Settings.Stream.MultitrackVideoMaximumVideoTracks="Maximum Video Tracks"
972+
Basic.Settings.Stream.MultitrackVideoMaximumVideoTracksAuto="Auto"
973+
Basic.Settings.Stream.MultitrackVideoStreamDumpEnable="Enable stream dump to FLV (uses simple recording file settings)"
974+
Basic.Settings.Stream.MultitrackVideoConfigOverride="Config Override (JSON)"
975+
Basic.Settings.Stream.MultitrackVideoConfigOverrideEnable="Enable Config Override"
976+
Basic.Settings.Stream.MultitrackVideoLabel="Multitrack Video"
977+
Basic.Settings.Stream.AdvancedOptions="Advanced Options"
960978

961979
# basic mode 'output' settings
962980
Basic.Settings.Output="Output"
@@ -1541,3 +1559,29 @@ YouTube.Errors.rateLimitExceeded="You are sending messages too quickly."
15411559
# Browser Dock
15421560
YouTube.DocksRemoval.Title="Clear Legacy YouTube Browser Docks"
15431561
YouTube.DocksRemoval.Text="These browser docks will be removed as deprecated:\n\n%1\nUse \"Docks/YouTube Live Control Room\" instead."
1562+
1563+
# MultitrackVideo
1564+
ConfigDownload.WarningMessageTitle="Warning"
1565+
FailedToStartStream.MissingConfigURL="No config URL available for the current service"
1566+
FailedToStartStream.NoCustomRTMPURLInSettings="Custom RTMP URL not specified"
1567+
FailedToStartStream.InvalidCustomConfig="Invalid custom config"
1568+
FailedToStartStream.FailedToCreateMultitrackVideoService="Failed to create multitrack video service"
1569+
FailedToStartStream.FailedToCreateMultitrackVideoOutput="Failed to create multitrack video rtmp output"
1570+
FailedToStartStream.EncoderNotAvailable="NVENC not available.\n\nFailed to find encoder type '%1'"
1571+
FailedToStartStream.FailedToCreateVideoEncoder="Failed to create video encoder '%1' (type: '%2')"
1572+
FailedToStartStream.FailedToGetOBSVideoInfo="Failed to get obs video info while creating encoder '%1' (type: '%2')"
1573+
FailedToStartStream.FailedToCreateAudioEncoder="Failed to create audio encoder"
1574+
FailedToStartStream.NoRTMPURLInConfig="Config does not contain stream target RTMP(S) URL"
1575+
FailedToStartStream.FallbackToDefault="Starting the stream using %1 failed; do you want to retry using single encode settings?"
1576+
FailedToStartStream.ConfigRequestFailed="Could not fetch config from %1<br><br>HTTP error: %2"
1577+
FailedToStartStream.WarningUnknownStatus="Received unknown status value '%1'"
1578+
FailedToStartStream.WarningRetryNonMultitrackVideo="\n<br><br>\nDo you want to continue streaming without %1?"
1579+
FailedToStartStream.WarningRetry="\n<br><br>\nDo you want to continue streaming?"
1580+
FailedToStartStream.MissingEncoderConfigs="Go live config did not include encoder configurations"
1581+
FailedToStartStream.StatusMissingHTML="Go live request returned an unspecified error"
1582+
FailedToStartStream.NoConfigSupplied="Missing config"
1583+
MultitrackVideo.Info="%1 automatically optimizes your settings to encode and send multiple video qualities. Selecting this option will send %2 information about your computer and software setup."
1584+
MultitrackVideo.IncompatibleSettings.Title="Incompatible Settings"
1585+
MultitrackVideo.IncompatibleSettings.Text="%1 is not currently compatible with:\n\n%2\nTo continue streaming with %1, disable incompatible settings:\n\n%3\nand Start Streaming again."
1586+
MultitrackVideo.IncompatibleSettings.DisableAndStartStreaming="Disable for this stream and Start Streaming"
1587+
MultitrackVideo.IncompatibleSettings.UpdateAndStartStreaming="Update Settings and Start Streaming"

UI/data/themes/Yami.obt

+5
Original file line numberDiff line numberDiff line change
@@ -1376,6 +1376,11 @@ QLabel#errorLabel {
13761376
font-weight: bold;
13771377
}
13781378

1379+
QFrame [themeID="notice"] {
1380+
background: var(--bg_preview);
1381+
border-radius: var(--border_radius);
1382+
}
1383+
13791384
/* About dialog */
13801385

13811386
* [themeID="aboutName"] {

0 commit comments

Comments
 (0)