From 5bb88634fb2becf721a79380edc153c31d6aeca7 Mon Sep 17 00:00:00 2001 From: Palana Date: Thu, 2 Jul 2015 10:00:22 +0200 Subject: [PATCH] UI: Create best matching audio encoder for given bitrate --- obs/window-basic-main-outputs.cpp | 45 ++++++++++++++++++------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/obs/window-basic-main-outputs.cpp b/obs/window-basic-main-outputs.cpp index f789d6e2c..a35bd0456 100644 --- a/obs/window-basic-main-outputs.cpp +++ b/obs/window-basic-main-outputs.cpp @@ -1,5 +1,6 @@ #include #include +#include "audio-encoders.hpp" #include "window-basic-main.hpp" #include "window-basic-main-outputs.hpp" @@ -46,26 +47,28 @@ static void OBSStopRecording(void *data, calldata_t *params) /* ------------------------------------------------------------------------ */ -static OBSEncoder CreateAACEncoder(const char *name, size_t idx) +static bool CreateAACEncoder(OBSEncoder &res, string &id, int bitrate, + const char *name, size_t idx) { - static const char *encoders[] = { - "CoreAudio_AAC", - "libfdk_aac", - "ffmpeg_aac" - }; + const char *id_ = GetAACEncoderForBitrate(bitrate); + if (!id_) { + id.clear(); + res = nullptr; + return false; + } - OBSEncoder result; + if (id == id_) + return true; - for (const char *encoder : encoders) { - result = obs_audio_encoder_create(encoder, name, nullptr, idx, - nullptr); - if (result) { - obs_encoder_release(result); - break; - } + id = id_; + res = obs_audio_encoder_create(id_, name, nullptr, idx, nullptr); + + if (res) { + obs_encoder_release(res); + return true; } - return result; + return false; } /* ------------------------------------------------------------------------ */ @@ -74,6 +77,8 @@ struct SimpleOutput : BasicOutputHandler { OBSEncoder aac; OBSEncoder h264; + string aacEncoderID; + SimpleOutput(OBSBasic *main_); virtual void Update() override; @@ -109,8 +114,8 @@ SimpleOutput::SimpleOutput(OBSBasic *main_) : BasicOutputHandler(main_) throw "Failed to create h264 encoder (simple output)"; obs_encoder_release(h264); - aac = CreateAACEncoder("simple_aac", 0); - if (!aac) + if (!CreateAACEncoder(aac, aacEncoderID, GetAudioBitrate(), + "simple_aac", 0)) throw "Failed to create audio encoder (simple output)"; startStreaming.Connect(obs_output_get_signal_handler(streamOutput), @@ -296,6 +301,8 @@ struct AdvancedOutput : BasicOutputHandler { bool ffmpegRecording; bool useStreamEncoder; + string aacEncoderID[4]; + AdvancedOutput(OBSBasic *main_); inline void UpdateStreamSettings(); @@ -393,8 +400,8 @@ AdvancedOutput::AdvancedOutput(OBSBasic *main_) : BasicOutputHandler(main_) char name[9]; sprintf(name, "adv_aac%d", i); - aacTrack[i] = CreateAACEncoder(name, i); - if (!aacTrack[i]) + if (!CreateAACEncoder(aacTrack[i], aacEncoderID[i], + GetAudioBitrate(i), name, i)) throw "Failed to create audio encoder " "(advanced output)"; } -- GitLab