diff --git a/daemon/codec.c b/daemon/codec.c index e2872dde3..de3b82c73 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -5423,8 +5423,12 @@ void __codec_store_answer(struct codec_store *dst, struct codec_store *src, stru // handle associated supplemental codecs if (h->cn_payload_type != -1) { pt = g_hash_table_lookup(orig_dst.codecs, GINT_TO_POINTER(h->cn_payload_type)); - if (!pt && a.allow_asymmetric) - pt = g_hash_table_lookup(src->codecs, GINT_TO_POINTER(h->cn_payload_type)); + if (a.allow_asymmetric) { + struct rtp_payload_type *src_pt + = g_hash_table_lookup(src->codecs, GINT_TO_POINTER(h->cn_payload_type)); + if (src_pt && (!pt || !rtp_payload_type_eq_compat(src_pt, pt))) + pt = src_pt; + } if (!pt) ilogs(codec, LOG_DEBUG, "CN payload type %i is missing", h->cn_payload_type); else @@ -5435,8 +5439,12 @@ void __codec_store_answer(struct codec_store *dst, struct codec_store *src, stru dtmf_payload_type = h->real_dtmf_payload_type; if (dtmf_payload_type != -1) { pt = g_hash_table_lookup(orig_dst.codecs, GINT_TO_POINTER(dtmf_payload_type)); - if (!pt && a.allow_asymmetric) - pt = g_hash_table_lookup(src->codecs, GINT_TO_POINTER(dtmf_payload_type)); + if (a.allow_asymmetric) { + struct rtp_payload_type *src_pt + = g_hash_table_lookup(src->codecs, GINT_TO_POINTER(dtmf_payload_type)); + if (src_pt && (!pt || !rtp_payload_type_eq_compat(src_pt, pt))) + pt = src_pt; + } if (!pt) ilogs(codec, LOG_DEBUG, "DTMF payload type %i is missing", dtmf_payload_type); else diff --git a/t/auto-daemon-tests.pl b/t/auto-daemon-tests.pl index 1842ddd52..ea6148af4 100755 --- a/t/auto-daemon-tests.pl +++ b/t/auto-daemon-tests.pl @@ -356,6 +356,72 @@ a=sendrecv a=rtcp:PORT SDP + + + +new_call; + +offer('duplicate t-e', { codec => { + strip => ['all'], + except => [qw/opus G722 PCMA telephone-event/], + transcode => ['telephone-event'], + } }, < ['allow asymmetric codecs'] }, < {