From e0058b7207e022b698aea10f96cc7c0b1209058a Mon Sep 17 00:00:00 2001 From: Philipp Maier Date: Wed, 16 Feb 2022 12:21:15 +0100 Subject: [PATCH] mgcp_codec: do not differentiate between oa and bwe when comparing codec AMR that has the payload format bandwith-efficient is the same codec as AMR that has the payload format octet-aligned. Its the same codec, and a comparison of the codec info with the function codecs_same() should return true (=equal). The affected function codecs_same() is used by mgcp_codec_pt_translate(). When the egress payload type number is looked up, the ingress and egress codec information is compared. When one end is using AMR in bandwith-efficient format and the other end is using it in octet-alingned format. Then the codec still must be recognized as the same codec. Othersiwse the payload type number translation would not work, even though the codec is the same on both sides. Change-Id: I64731570c287a75d39c79c10e1bc09a37bdd54d6 Related: SYS#5834 --- src/libosmo-mgcp/mgcp_codec.c | 8 ++++---- tests/mgcp/mgcp_test.c | 13 +++---------- tests/mgcp/mgcp_test.ok | 20 ++++++-------------- 3 files changed, 13 insertions(+), 28 deletions(-) diff --git a/src/libosmo-mgcp/mgcp_codec.c b/src/libosmo-mgcp/mgcp_codec.c index 6b8d14a83..38aa0a79f 100644 --- a/src/libosmo-mgcp/mgcp_codec.c +++ b/src/libosmo-mgcp/mgcp_codec.c @@ -378,10 +378,10 @@ static bool codecs_same(struct mgcp_rtp_codec *codec_a, struct mgcp_rtp_codec *c return false; if (strcmp(codec_a->subtype_name, codec_b->subtype_name)) return false; - if (!strcmp(codec_a->subtype_name, "AMR")) { - if (mgcp_codec_amr_is_octet_aligned(codec_a) != mgcp_codec_amr_is_octet_aligned(codec_b)) - return false; - } + + /* Note: AMR allows to set the RTP payload format to octet-aligned or bandwith-efficient (octet-aligned=0) + * via SDP. This difference concerns payload format only, but not the actual codec. It is not a difference + * within the meaning of this function. */ return true; } diff --git a/tests/mgcp/mgcp_test.c b/tests/mgcp/mgcp_test.c index 9b4933c55..4ed18c280 100644 --- a/tests/mgcp/mgcp_test.c +++ b/tests/mgcp/mgcp_test.c @@ -1896,16 +1896,13 @@ static const struct testcase_mgcp_codec_pt_translate test_mgcp_codec_pt_translat .codecs = { { { 111, "AMR/8000", &amr_param_octet_aligned_true, }, - { 112, "AMR/8000", &amr_param_octet_aligned_false, }, }, { { 122, "AMR/8000", &amr_param_octet_aligned_false, }, - { 121, "AMR/8000", &amr_param_octet_aligned_true, }, }, }, .expect = { - { .payload_type_map = {111, 121}, }, - { .payload_type_map = {112, 122} }, + { .payload_type_map = {111, 122}, }, { .end = true }, }, }, @@ -1914,15 +1911,13 @@ static const struct testcase_mgcp_codec_pt_translate test_mgcp_codec_pt_translat .codecs = { { { 111, "AMR/8000", &amr_param_octet_aligned_true, }, - { 112, "AMR/8000", &amr_param_octet_aligned_false, }, }, { { 122, "AMR/8000", &amr_param_octet_aligned_unset, }, }, }, .expect = { - { .payload_type_map = {111, -EINVAL}, }, - { .payload_type_map = {112, 122} }, + { .payload_type_map = {111, 122}, }, { .end = true }, }, }, @@ -1931,15 +1926,13 @@ static const struct testcase_mgcp_codec_pt_translate test_mgcp_codec_pt_translat .codecs = { { { 111, "AMR/8000", &amr_param_octet_aligned_true, }, - { 112, "AMR/8000", &amr_param_octet_aligned_false, }, }, { { 122, "AMR/8000", NULL, }, }, }, .expect = { - { .payload_type_map = {111, -EINVAL}, }, - { .payload_type_map = {112, 122} }, + { .payload_type_map = {111, 122}, }, { .end = true }, }, }, diff --git a/tests/mgcp/mgcp_test.ok b/tests/mgcp/mgcp_test.ok index 94fada35c..5b8d558b6 100644 --- a/tests/mgcp/mgcp_test.ok +++ b/tests/mgcp/mgcp_test.ok @@ -1347,32 +1347,24 @@ Testing mgcp_codec_pt_translate() #5: test AMR with differing octet-aligned settings - add codecs on conn0: 0: 111 AMR/8000 octet-aligned=1 -> rc=0 - 1: 112 AMR/8000 octet-aligned=0 -> rc=0 - add codecs on conn1: 0: 122 AMR/8000 octet-aligned=0 -> rc=0 - 1: 121 AMR/8000 octet-aligned=1 -> rc=0 - - mgcp_codec_pt_translate(conn0, conn1, 111) -> 121 - - mgcp_codec_pt_translate(conn1, conn0, 121) -> 111 - - mgcp_codec_pt_translate(conn0, conn1, 112) -> 122 - - mgcp_codec_pt_translate(conn1, conn0, 122) -> 112 + - mgcp_codec_pt_translate(conn0, conn1, 111) -> 122 + - mgcp_codec_pt_translate(conn1, conn0, 122) -> 111 #6: test AMR with missing octet-aligned settings (defaults to 0) - add codecs on conn0: 0: 111 AMR/8000 octet-aligned=1 -> rc=0 - 1: 112 AMR/8000 octet-aligned=0 -> rc=0 - add codecs on conn1: 0: 122 AMR/8000 octet-aligned=unset -> rc=0 - - mgcp_codec_pt_translate(conn0, conn1, 111) -> -22 - - mgcp_codec_pt_translate(conn0, conn1, 112) -> 122 - - mgcp_codec_pt_translate(conn1, conn0, 122) -> 112 + - mgcp_codec_pt_translate(conn0, conn1, 111) -> 122 + - mgcp_codec_pt_translate(conn1, conn0, 122) -> 111 #7: test AMR with NULL param (defaults to 0) - add codecs on conn0: 0: 111 AMR/8000 octet-aligned=1 -> rc=0 - 1: 112 AMR/8000 octet-aligned=0 -> rc=0 - add codecs on conn1: 0: 122 AMR/8000 -> rc=0 - - mgcp_codec_pt_translate(conn0, conn1, 111) -> -22 - - mgcp_codec_pt_translate(conn0, conn1, 112) -> 122 - - mgcp_codec_pt_translate(conn1, conn0, 122) -> 112 + - mgcp_codec_pt_translate(conn0, conn1, 111) -> 122 + - mgcp_codec_pt_translate(conn1, conn0, 122) -> 111 #8: match FOO/8000/1 and FOO/8000 as identical, single channel is implicit - add codecs on conn0: 0: 0 PCMU/8000/1 -> rc=0