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 502e0b791f)
mr14.1
Richard Fuchs 1 month ago
parent 6303d93859
commit 20c9e33d75

@ -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

Loading…
Cancel
Save