diff --git a/lib/auxlib.c b/lib/auxlib.c index 3c2c8c72a..575d0673d 100644 --- a/lib/auxlib.c +++ b/lib/auxlib.c @@ -14,6 +14,9 @@ #include #include #include +#ifdef HAVE_CODEC_CHAIN +#include +#endif #include "log.h" #include "loglib.h" @@ -166,6 +169,7 @@ void config_load(int *argc, char ***argv, GOptionEntry *app_entries, const char g_autoptr(char_p) saved_argv = g_strdupv(*argv); int saved_argc = *argc; gboolean version = false; + g_autoptr(char) opus_application = NULL; rtpe_common_config_ptr = cconfig; @@ -210,6 +214,7 @@ void config_load(int *argc, char ***argv, GOptionEntry *app_entries, const char { "codec-chain-runners",0,0, G_OPTION_ARG_INT, &rtpe_common_config_ptr->codec_chain_runners,"Number of chain runners per codec","INT" }, { "codec-chain-concurrency",0,0,G_OPTION_ARG_INT, &rtpe_common_config_ptr->codec_chain_concurrency,"Max concurrent codec jobs per runner","INT" }, { "codec-chain-async",0,0, G_OPTION_ARG_INT, &rtpe_common_config_ptr->codec_chain_async,"Number of background callback threads","INT" }, + { "codec-chain-opus-application",0,0,G_OPTION_ARG_STRING,&opus_application, "Opus application", "default|VoIP|audio|low-delay" }, { "codec-chain-opus-complexity",0,0,G_OPTION_ARG_INT, &rtpe_common_config_ptr->codec_chain_opus_complexity,"Opus encoding complexity (0..10)","INT" }, #endif { NULL, } @@ -409,6 +414,18 @@ out: rtpe_common_config_ptr->codec_chain_opus_complexity = 10; if (rtpe_common_config_ptr->codec_chain_opus_complexity < 0 || rtpe_common_config_ptr->codec_chain_opus_complexity > 10) die("Invalid value for --codec-chain-opus-complexity"); + if (opus_application) { + if (!strcmp(opus_application, "default") || !strcmp(opus_application, "")) + rtpe_common_config_ptr->codec_chain_opus_application = 0; + else if (!strcmp(opus_application, "voip") || !strcmp(opus_application, "speech")) + rtpe_common_config_ptr->codec_chain_opus_application = CC_OPUS_APP_VOIP; + else if (!strcmp(opus_application, "audio") || !strcmp(opus_application, "music")) + rtpe_common_config_ptr->codec_chain_opus_application = CC_OPUS_APP_AUDIO; + else if (!strcmp(opus_application, "low delay") || !strcmp(opus_application, "low-delay") || !strcmp(opus_application, "lowdelay")) + rtpe_common_config_ptr->codec_chain_opus_application = CC_OPUS_APP_LOWDELAY; + else + die("Invalid value for --codec-chain-opus-application"); + } #endif #if HAVE_LIBURING diff --git a/lib/auxlib.h b/lib/auxlib.h index 7f46b1dd0..3d08bd4df 100644 --- a/lib/auxlib.h +++ b/lib/auxlib.h @@ -42,6 +42,7 @@ struct rtpengine_common_config { int codec_chain_runners; int codec_chain_concurrency; int codec_chain_async; + int codec_chain_opus_application; int codec_chain_opus_complexity; }; diff --git a/lib/codeclib.c b/lib/codeclib.c index b0e23dc32..497235ca4 100644 --- a/lib/codeclib.c +++ b/lib/codeclib.c @@ -5242,6 +5242,7 @@ static codec_cc_t *codec_cc_new_sync(codec_def_t *src, format_t *src_format, cod (codec_chain_opus_arguments) { .bitrate = bitrate, .complexity = rtpe_common_config_ptr->codec_chain_opus_complexity, + .application = rtpe_common_config_ptr->codec_chain_opus_application, }); ret->clear = cc_float2opus_clear; ret->clear_arg = ret->pcma2opus.enc; @@ -5269,6 +5270,7 @@ static codec_cc_t *codec_cc_new_sync(codec_def_t *src, format_t *src_format, cod (codec_chain_opus_arguments) { .bitrate = bitrate, .complexity = rtpe_common_config_ptr->codec_chain_opus_complexity, + .application = rtpe_common_config_ptr->codec_chain_opus_application, }); ret->clear = cc_float2opus_clear; ret->clear_arg = ret->pcmu2opus.enc; @@ -5352,6 +5354,7 @@ static codec_cc_t *codec_cc_new_async(codec_def_t *src, format_t *src_format, co (codec_chain_opus_arguments) { .bitrate = bitrate, .complexity = rtpe_common_config_ptr->codec_chain_opus_complexity, + .application = rtpe_common_config_ptr->codec_chain_opus_application, }); ret->clear = cc_float2opus_clear; ret->clear_arg = ret->pcma2opus.enc; @@ -5385,6 +5388,7 @@ static codec_cc_t *codec_cc_new_async(codec_def_t *src, format_t *src_format, co (codec_chain_opus_arguments) { .bitrate = bitrate, .complexity = rtpe_common_config_ptr->codec_chain_opus_complexity, + .application = rtpe_common_config_ptr->codec_chain_opus_application, }); ret->clear = cc_float2opus_clear; ret->clear_arg = ret->pcmu2opus.enc;