diff --git a/daemon/codec.c b/daemon/codec.c index 2f5eb6120..4bd1d7461 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -536,6 +536,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; @@ -543,6 +544,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 20b0c1090..46d748f97 100755 --- a/t/auto-daemon-tests.pl +++ b/t/auto-daemon-tests.pl @@ -327,12 +327,12 @@ o=dev 5418 9648 IN IP4 8.8.8.60 s=SIP Call c=IN IP4 8.8.8.60 t=0 0 -m=audio PORT RTP/AVP 101 0 8 3 +m=audio PORT RTP/AVP 0 8 3 101 c=IN IP4 203.0.113.1 -a=rtpmap:101 telephone-event/8000 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000 a=rtpmap:3 GSM/8000 +a=rtpmap:101 telephone-event/8000 a=fmtp:101 0-15 a=sendrecv a=rtcp:PORT @@ -2449,13 +2449,13 @@ s=pjmedia b=AS:117 t=0 0 a=X-nat:0 -m=audio PORT RTP/AVP 107 101 8 +m=audio PORT RTP/AVP 107 8 101 c=IN IP4 203.0.113.1 b=TIAS:96000 a=ssrc:243811319 cname:04389d431bdd5c52 a=rtpmap:107 opus/48000/2 -a=rtpmap:101 telephone-event/8000 a=rtpmap:8 PCMA/8000 +a=rtpmap:101 telephone-event/8000 a=fmtp:107 useinbandfec=1 a=fmtp:101 0-16 a=sendrecv