From 2502b44ff82ff24a69690582530bf930d5f6e6f6 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 19 Oct 2020 14:53:08 -0400 Subject: [PATCH] TT#92250 keep supp codecs last when transcoding in reverse Change-Id: I20d9b6e54c38ab92dcbe4e706ed04bca7145c373 --- daemon/codec.c | 14 ++++++++ t/auto-daemon-tests.pl | 75 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 85 insertions(+), 4 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index 2dab581a1..5b2b85ae9 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -563,6 +563,7 @@ static void __accept_transcode_codecs(struct call_media *receiver, struct call_m STR_FMT(&pt->encoding_with_params)); MEDIA_SET(receiver, TRANSCODE); + // we need a new pt entry pt = __rtp_payload_type_copy(pt); pt->for_transcoding = 1; @@ -570,6 +571,19 @@ static void __accept_transcode_codecs(struct call_media *receiver, struct call_m // this somewhat duplicates __rtp_payload_type_add_recv g_hash_table_insert(receiver->codecs_recv, &pt->payload_type, pt); __rtp_payload_type_add_name(receiver->codec_names_recv, pt); + + // keep supplemental codecs last + ensure_codec_def(pt, receiver); + if (!pt->codec_def || !pt->codec_def->supplemental) { + while (insert_pos) { + struct rtp_payload_type *ipt = insert_pos->data; + ensure_codec_def(ipt, receiver); + if (!ipt->codec_def || !ipt->codec_def->supplemental) + break; + insert_pos = insert_pos->prev; + } + } + if (!insert_pos) { g_queue_push_head(&receiver->codecs_prefs_recv, pt); insert_pos = receiver->codecs_prefs_recv.head; diff --git a/t/auto-daemon-tests.pl b/t/auto-daemon-tests.pl index 41eff7375..99d372609 100755 --- a/t/auto-daemon-tests.pl +++ b/t/auto-daemon-tests.pl @@ -1044,6 +1044,73 @@ rcv($sock_a, $port_b, rtpm(96, 1004, 4200, $ssrc, "\xf0\x14\x41\x00\x30\x44\x41\ } +new_call; + +offer('DTMF-inject w tp-e', { + ICE => 'remove', + flags => ['inject-DTMF'], + codec => {transcode => ['G722']}, + }, < 'remove', + flags => ['inject-DTMF'], + }, <