From 797216fcc04efd05c0d45b33a4269bd1d8e118ff Mon Sep 17 00:00:00 2001 From: Dragos Oancea Date: Mon, 19 Aug 2019 18:31:10 +0000 Subject: [PATCH] FS-12008: special case G722 - fix rate passed to switch_core_codec_init() --- src/switch_core_codec.c | 6 +++++- tests/unit/conf/freeswitch.xml | 3 +++ tests/unit/switch_core_codec.c | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/switch_core_codec.c b/src/switch_core_codec.c index ac21fa4567..69883f8122 100644 --- a/src/switch_core_codec.c +++ b/src/switch_core_codec.c @@ -614,14 +614,18 @@ SWITCH_DECLARE(switch_status_t) switch_core_codec_reset(switch_codec_t *codec) SWITCH_DECLARE(switch_status_t) switch_core_codec_copy(switch_codec_t *codec, switch_codec_t *new_codec, const switch_codec_settings_t *codec_settings, switch_memory_pool_t *pool) { + uint32_t codec_rate; switch_assert(codec != NULL); switch_assert(new_codec != NULL); + codec_rate = !strcasecmp(codec->implementation->iananame, "g722") + ? codec->implementation->samples_per_second : codec->implementation->actual_samples_per_second; + return switch_core_codec_init(new_codec, codec->implementation->iananame, codec->implementation->modname, codec->fmtp_in, - codec->implementation->actual_samples_per_second, + codec_rate, codec->implementation->microseconds_per_packet / 1000, codec->implementation->number_of_channels, codec->flags, diff --git a/tests/unit/conf/freeswitch.xml b/tests/unit/conf/freeswitch.xml index fe2fe1b17c..abdbcd4ae5 100644 --- a/tests/unit/conf/freeswitch.xml +++ b/tests/unit/conf/freeswitch.xml @@ -8,6 +8,9 @@ + + + diff --git a/tests/unit/switch_core_codec.c b/tests/unit/switch_core_codec.c index 4926de6b84..b01d5220c5 100644 --- a/tests/unit/switch_core_codec.c +++ b/tests/unit/switch_core_codec.c @@ -51,6 +51,7 @@ FST_CORE_BEGIN("./conf") FST_SETUP_BEGIN() { fst_requires_module("mod_opus"); + fst_requires_module("mod_spandsp"); } FST_SETUP_END() @@ -101,6 +102,20 @@ FST_CORE_BEGIN("./conf") switch_core_codec_copy(&orig_codec, &new_codec, NULL, NULL); fst_check(orig_codec.implementation->samples_per_second == new_codec.implementation->samples_per_second); fst_check(orig_codec.implementation->actual_samples_per_second == new_codec.implementation->actual_samples_per_second); + + status = switch_core_codec_init(&orig_codec, + "G722", + "mod_spandsp", + NULL, + 8000, + 20, + 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, + &codec_settings, fst_pool); + fst_check(status == SWITCH_STATUS_SUCCESS); + + switch_core_codec_copy(&orig_codec, &new_codec, NULL, NULL); + fst_check(orig_codec.implementation->samples_per_second == new_codec.implementation->samples_per_second); + fst_check(orig_codec.implementation->actual_samples_per_second == new_codec.implementation->actual_samples_per_second); } FST_TEST_END()