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.
This commit is contained in:
jp9000 committed 2020-12-03 01:13:10 -08:00
1 parent 53ec75ccd6
commit 609ec9b556
1 file changed
+53 -23
+53 -23
View File
@@ -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;
}