From 40a98c57a8a8d229e6c7565aa5740f68eca500ce Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 10 Apr 2026 13:15:53 -0400 Subject: [PATCH] MT#55283 stricter asymmetric codecs Don't blindly take over a source DTMF PT if one is present. Check if the destination has _some_ DTMF PT, and only then take over the source. This makes the behaviour more closely match the documentation. One test is affected and seems to improve its outcome. Closes #2091 Change-Id: Ibb9c1f79099fa30ac69ec71b4a4c71af0b88b327 --- daemon/codec.c | 14 ++++++++++---- t/auto-daemon-tests.pl | 3 +-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index 18f2e56dc..240ea9dcc 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -1655,10 +1655,16 @@ sink_pt_fixed:; rtp_payload_type *sink_cn_pt = __supp_payload_type(supplemental_sinks, sink_pt->clock_rate, "CN"); if (a.allow_asymmetric) { - if (!sink_dtmf_pt || (src_dtmf_pt && !rtp_payload_type_fmt_cmp(sink_dtmf_pt, src_dtmf_pt))) - sink_dtmf_pt = src_dtmf_pt; - if (!sink_cn_pt || (src_cn_pt && !rtp_payload_type_fmt_cmp(sink_cn_pt, src_cn_pt))) - sink_cn_pt = src_cn_pt; + if (src_dtmf_pt && (!sink_dtmf_pt || !rtp_payload_type_fmt_cmp(sink_dtmf_pt, src_dtmf_pt))) { + rtp_payload_type *compat = codec_store_find_compatible(&sink->codecs, src_dtmf_pt); + if (compat) + sink_dtmf_pt = src_dtmf_pt; + } + if (src_cn_pt && (!sink_cn_pt || !rtp_payload_type_fmt_cmp(sink_cn_pt, src_cn_pt))) { + rtp_payload_type *compat = codec_store_find_compatible(&sink->codecs, src_cn_pt); + if (compat) + sink_cn_pt = src_cn_pt; + } } rtp_payload_type *real_sink_dtmf_pt = NULL; // for DTMF delay diff --git a/t/auto-daemon-tests.pl b/t/auto-daemon-tests.pl index ae588ee58..ba3c09717 100755 --- a/t/auto-daemon-tests.pl +++ b/t/auto-daemon-tests.pl @@ -7390,10 +7390,9 @@ v=0 o=- 1545997027 1 IN IP4 198.51.100.11 s=tester t=0 0 -m=audio PORT RTP/AVP 8 97 +m=audio PORT RTP/AVP 8 c=IN IP4 203.0.113.1 a=rtpmap:8 PCMA/8000 -a=rtpmap:97 telephone-event/8000 a=sendrecv a=rtcp:PORT SDP