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()