chan_sip: Filter pass-through audio/video formats away, again.

Instead of looking for pass-through formats in the list of transcodable
formats (which is going to find nothing), go through the result which
is going to be the jointcaps of the tech_pvt of the channel. Finally,
only with that list, ast_format_cap_remove(.) is going to succeed.

This restores the behaviour of Asterisk 1.8. However, it does not fix
ASTERISK_29282 because that issue report is about chan_sip and PJSIP.
Here, only chan_sip is fixed because PJSIP does not even call
ast_rtp_instance_available_formats -> ast_translate_available_format.

Change-Id: Icade2366ac2b82935b95a9981678c987da2e8c34
This commit is contained in:
Alexander Traud
2021-02-05 13:29:51 +01:00
committed by George Joseph
parent b0f349a330
commit 5894535fed
2 changed files with 18 additions and 32 deletions

View File

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