From 41a02004bb70aef9d00489eb808085e98a825a50 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 18 Mar 2026 13:17:54 -0400 Subject: [PATCH] MT#55283 improve asymmetric codec logic Instead of always blindly picking the matching supp codec for the receiver codec, pick it only if there is no appropriate sink supp codec, or both are compatible (which implies a payload type mismatch). Closes #2084 Change-Id: Ie401db500a038f60f3b4286e2067f90674c611df (cherry picked from commit 502e0b791f26ce22c03862fa8d41866877a8fe71) (cherry picked from commit cd248afd102dfebc5fe57299bea67907fb021cb1) --- daemon/codec.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index 7f185338f..c89a4d82d 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -1598,7 +1598,7 @@ void __codec_handlers_update(struct call_media *receiver, struct call_media *sin if (!sink_pt) { // no matching/identical output codec. maybe we have the same output codec, // but with a different payload type or a different format? - if (!a.allow_asymmetric || pt->for_transcoding) + if (!a.allow_asymmetric || pt->for_transcoding || pt->codec_def->supplemental) sink_pt = codec_store_find_compatible(&sink->codecs, pt); else sink_pt = pt; @@ -1648,17 +1648,15 @@ void __codec_handlers_update(struct call_media *receiver, struct call_media *sin sink_pt_fixed:; // we have found a usable output codec. gather matching output supp codecs - rtp_payload_type *sink_dtmf_pt = NULL; - rtp_payload_type *sink_cn_pt = NULL; - if (!a.allow_asymmetric) { - sink_dtmf_pt = __supp_payload_type(supplemental_sinks, - sink_pt->clock_rate, "telephone-event"); - sink_cn_pt = __supp_payload_type(supplemental_sinks, - sink_pt->clock_rate, "CN"); - } - else { - sink_dtmf_pt = recv_dtmf_pt; - sink_cn_pt = recv_cn_pt; + rtp_payload_type *sink_dtmf_pt = __supp_payload_type(supplemental_sinks, + sink_pt->clock_rate, "telephone-event"); + rtp_payload_type *sink_cn_pt = __supp_payload_type(supplemental_sinks, + sink_pt->clock_rate, "CN"); + if (a.allow_asymmetric) { + if (!sink_dtmf_pt || (recv_dtmf_pt && !rtp_payload_type_fmt_cmp(sink_dtmf_pt, recv_dtmf_pt))) + sink_dtmf_pt = recv_dtmf_pt; + if (!sink_cn_pt || (recv_cn_pt && !rtp_payload_type_fmt_cmp(sink_cn_pt, recv_cn_pt))) + sink_cn_pt = recv_cn_pt; } rtp_payload_type *real_sink_dtmf_pt = NULL; // for DTMF delay