diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 2b34947250d7af600166cd1425230087f2b6f421..da0e0decb5d27a74f9177414f36b817931276b4f 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -13623,10 +13623,6 @@ static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p, int /* Check if we need audio in this call */ needaudio = ast_format_cap_has_type(tmpcap, AST_MEDIA_TYPE_AUDIO); - if (!needaudio && p->outgoing_call) { - /* p->caps are added conditionally, see below "Finally our remain..." */ - needaudio = ast_format_cap_has_type(p->caps, AST_MEDIA_TYPE_AUDIO); - } /* Check if we need video in this call */ if ((ast_format_cap_has_type(tmpcap, AST_MEDIA_TYPE_VIDEO)) && !p->novideo) { @@ -13757,7 +13753,6 @@ static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p, int /* Now, start adding audio codecs. These are added in this order: - First what was requested by the calling channel - Then our mutually shared capabilities, determined previous in tmpcap - - Then preferences in order from sip.conf device config for this peer/user */ @@ -13801,27 +13796,6 @@ static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p, int ao2_ref(tmp_fmt, -1); } - /* Finally our remaining audio/video codecs */ - for (x = 0; p->outgoing_call && x < ast_format_cap_count(p->caps); x++) { - tmp_fmt = ast_format_cap_get_format(p->caps, x); - - if (ast_format_cap_iscompatible_format(alreadysent, tmp_fmt) != AST_FORMAT_CMP_NOT_EQUAL) { - ao2_ref(tmp_fmt, -1); - continue; - } - - if (ast_format_get_type(tmp_fmt) == AST_MEDIA_TYPE_AUDIO) { - add_codec_to_sdp(p, tmp_fmt, &m_audio, &a_audio, debug, &min_audio_packet_size, &max_audio_packet_size); - } else if (needvideo && ast_format_get_type(tmp_fmt) == AST_MEDIA_TYPE_VIDEO) { - add_vcodec_to_sdp(p, tmp_fmt, &m_video, &a_video, debug, &min_video_packet_size); - } else if (needtext && ast_format_get_type(tmp_fmt) == AST_MEDIA_TYPE_TEXT) { - add_tcodec_to_sdp(p, tmp_fmt, &m_text, &a_text, debug, &min_text_packet_size); - } - - ast_format_cap_append(alreadysent, tmp_fmt, 0); - ao2_ref(tmp_fmt, -1); - } - /* Now add DTMF RFC2833 telephony-event as a codec */ for (x = 1LL; x <= AST_RTP_MAX; x <<= 1) { if (!(p->jointnoncodeccapability & x)) diff --git a/main/translate.c b/main/translate.c index 6648931b72237a9793d76c3bb50e6f65fc5c3615..a9665ae348cee990630cd348d660955bef6af7f0 100644 --- a/main/translate.c +++ b/main/translate.c @@ -1509,16 +1509,19 @@ static void check_translation_path( struct ast_format_cap *result, struct ast_format *src_fmt, enum ast_media_type type) { - int index, src_index = format2index(src_fmt); + int i; + + if (ast_format_get_type(src_fmt) != type) { + return; + } + /* For a given source format, traverse the list of known formats to determine whether there exists a translation path from the source format to the destination format. */ - for (index = 0; (src_index >= 0) && index < cur_max_index; index++) { - struct ast_codec *codec = index2codec(index); - RAII_VAR(struct ast_format *, fmt, ast_format_create(codec), ao2_cleanup); - - ao2_ref(codec, -1); + for (i = ast_format_cap_count(result) - 1; 0 <= i; i--) { + int index, src_index; + struct ast_format *fmt = ast_format_cap_get_format(result, i); if (ast_format_get_type(fmt) != type) { continue; @@ -1535,6 +1538,15 @@ static void check_translation_path( continue; } + /* if this is a pass-through format, not in the source, + we cannot transcode. Therefore, remove it from the result */ + src_index = format2index(src_fmt); + index = format2index(fmt); + if (src_index < 0 || index < 0) { + ast_format_cap_remove(result, fmt); + continue; + } + /* if we don't have a translation path from the src to this format, remove it from the result */ if (!matrix_get(src_index, index)->step) {