From 609ec9b556a114cbf8f2d01c1b8f10e505149fa3 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Dec 2020 00:59:43 -0800 Subject: [PATCH] UI: Fix vod track not working with twitch soundtrack The vod track in advanced output mode would be overwritten by twitch soundtrack's vod track. Additionally, simple output mode would overwrite twitch's soundtrack vod track even when vod track was turned off in settings. So instead, if vod track is off, don't clear the secondary encoder unless it's explicitly our encoder. Additionally, make sure that advanced output mode's vod track encoder behaves consistently with simple output mode's vod track so it doesn't get overwritten. --- UI/window-basic-main-outputs.cpp | 76 ++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 23 deletions(-) diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp index 06d899728..1f0fc802a 100644 --- a/UI/window-basic-main-outputs.cpp +++ b/UI/window-basic-main-outputs.cpp @@ -390,6 +390,8 @@ void SimpleOutput::LoadRecordingPreset() } } +#define SIMPLE_ARCHIVE_NAME "simple_archive_aac" + SimpleOutput::SimpleOutput(OBSBasic *main_) : BasicOutputHandler(main_) { const char *encoder = config_get_string(main->Config(), "SimpleOutput", @@ -414,7 +416,7 @@ SimpleOutput::SimpleOutput(OBSBasic *main_) : BasicOutputHandler(main_) "simple_aac", 0)) throw "Failed to create aac streaming encoder (simple output)"; if (!CreateAACEncoder(aacArchive, aacArchiveEncID, GetAudioBitrate(), - "archive_aac", 1)) + SIMPLE_ARCHIVE_NAME, 1)) throw "Failed to create aac arhive encoder (simple output)"; LoadRecordingPreset(); @@ -844,6 +846,23 @@ bool SimpleOutput::SetupStreaming(obs_service_t *service) static inline bool ServiceSupportsVodTrack(const char *service); +static void clear_archive_encoder(obs_output_t *output, + const char *expected_name) +{ + obs_encoder_t *last = obs_output_get_audio_encoder(output, 1); + bool clear = false; + + /* ensures that we don't remove twitch's soundtrack encoder */ + if (last) { + const char *name = obs_encoder_get_name(last); + clear = name && strcmp(name, expected_name) == 0; + obs_encoder_release(last); + } + + if (clear) + obs_output_set_audio_encoder(output, nullptr, 1); +} + void SimpleOutput::SetupVodTrack(obs_service_t *service) { bool advanced = @@ -854,11 +873,10 @@ void SimpleOutput::SetupVodTrack(obs_service_t *service) obs_data_t *settings = obs_service_get_settings(service); const char *name = obs_data_get_string(settings, "service"); - if (advanced && enable && ServiceSupportsVodTrack(name)) { + if (advanced && enable && ServiceSupportsVodTrack(name)) obs_output_set_audio_encoder(streamOutput, aacArchive, 1); - } else { - obs_output_set_audio_encoder(streamOutput, nullptr, 1); - } + else + clear_archive_encoder(streamOutput, SIMPLE_ARCHIVE_NAME); obs_data_release(settings); } @@ -1105,6 +1123,8 @@ struct AdvancedOutput : BasicOutputHandler { inline void UpdateAudioSettings(); virtual void Update() override; + inline void SetupVodTrack(obs_service_t *service); + inline void SetupStreaming(); inline void SetupRecording(); inline void SetupFFmpeg(); @@ -1154,6 +1174,8 @@ static void ApplyEncoderDefaults(OBSData &settings, settings = std::move(dataRet); } +#define ADV_ARCHIVE_NAME "adv_archive_aac" + AdvancedOutput::AdvancedOutput(OBSBasic *main_) : BasicOutputHandler(main_) { const char *recType = @@ -1266,7 +1288,7 @@ AdvancedOutput::AdvancedOutput(OBSBasic *main_) : BasicOutputHandler(main_) int vodTrack = config_get_int(main->Config(), "AdvOut", "VodTrackIndex") - 1; if (!CreateAACEncoder(streamArchiveEnc, id, GetAudioBitrate(vodTrack), - "avc_aac_archive", vodTrack)) + ADV_ARCHIVE_NAME, vodTrack)) throw "Failed to create archive audio encoder " "(advanced output)"; @@ -1599,7 +1621,7 @@ int AdvancedOutput::GetAudioBitrate(size_t i) const return FindClosestAvailableAACBitrate(bitrate); } -bool AdvancedOutput::SetupStreaming(obs_service_t *service) +inline void AdvancedOutput::SetupVodTrack(obs_service_t *service) { int streamTrack = config_get_int(main->Config(), "AdvOut", "TrackIndex"); @@ -1608,6 +1630,28 @@ bool AdvancedOutput::SetupStreaming(obs_service_t *service) int vodTrackIndex = config_get_int(main->Config(), "AdvOut", "VodTrackIndex"); + const char *id = obs_service_get_id(service); + if (strcmp(id, "rtmp_custom") == 0) { + vodTrackEnabled = false; + } else { + obs_data_t *settings = obs_service_get_settings(service); + const char *service = obs_data_get_string(settings, "service"); + if (!ServiceSupportsVodTrack(service)) + vodTrackEnabled = false; + obs_data_release(settings); + } + + if (vodTrackEnabled && streamTrack != vodTrackIndex) + obs_output_set_audio_encoder(streamOutput, streamArchiveEnc, 1); + else + clear_archive_encoder(streamOutput, ADV_ARCHIVE_NAME); +} + +bool AdvancedOutput::SetupStreaming(obs_service_t *service) +{ + int streamTrack = + config_get_int(main->Config(), "AdvOut", "TrackIndex"); + if (!useStreamEncoder || (!ffmpegOutput && !obs_output_active(fileOutput))) { UpdateStreamSettings(); @@ -1706,22 +1750,6 @@ bool AdvancedOutput::SetupStreaming(obs_service_t *service) obs_output_set_video_encoder(streamOutput, h264Streaming); obs_output_set_audio_encoder(streamOutput, streamAudioEnc, 0); - const char *id = obs_service_get_id(service); - if (strcmp(id, "rtmp_custom") == 0) { - vodTrackEnabled = false; - } else { - obs_data_t *settings = obs_service_get_settings(service); - const char *service = obs_data_get_string(settings, "service"); - if (!ServiceSupportsVodTrack(service)) - vodTrackEnabled = false; - obs_data_release(settings); - } - - if (vodTrackEnabled && streamTrack != vodTrackIndex) - obs_output_set_audio_encoder(streamOutput, streamArchiveEnc, 1); - else - obs_output_set_audio_encoder(streamOutput, nullptr, 1); - return true; } @@ -1764,6 +1792,8 @@ bool AdvancedOutput::StartStreaming(obs_service_t *service) obs_output_set_reconnect_settings(streamOutput, maxRetries, retryDelay); + SetupVodTrack(service); + if (obs_output_start(streamOutput)) { return true; }