From 21e905146105372e424ffcee35af983ed217cf5f Mon Sep 17 00:00:00 2001 From: "Joshua C. Colp" <jcolp@sangoma.com> Date: Mon, 23 Mar 2020 07:49:41 -0300 Subject: [PATCH] res_pjsip_session: Apply intention behind requested formats. When an outgoing channel is created a list of formats may optionally be provided which is used as a request that the formats be used if possible. If an endpoint is not configured for any of the formats we ignore this request and use what is configured. This has the side effect of also including other stream types (such as video) that were not present in the requested formats. This change makes it so that the intention of the request is preserved - that is if only an audio format is requested then even if there is no joint audio format between the request and the configuration we will still only place an audio stream in the outgoing call. ASTERISK-28787 Change-Id: Ia54c0c63e94aca176169b9bae4bb8a8380ea245f --- .../res_pjsip_session_codecs.md | 8 +++++++ res/res_pjsip_session.c | 21 ++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 doc/CHANGES-staging/res_pjsip_session_codecs.md diff --git a/doc/CHANGES-staging/res_pjsip_session_codecs.md b/doc/CHANGES-staging/res_pjsip_session_codecs.md new file mode 100644 index 0000000000..847eb41b32 --- /dev/null +++ b/doc/CHANGES-staging/res_pjsip_session_codecs.md @@ -0,0 +1,8 @@ +Subject: res_pjsip_session + +When placing an outgoing call to a PJSIP endpoint the intent +of any requested formats will now be respected. If only an audio +format is requested (such as ulaw) but the underlying endpoint +does not support the format the resulting SDP will still only +contain an audio stream, and not any additional streams such as +video. diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index 4ce5a2427b..31b0d0c959 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -2727,16 +2727,6 @@ struct ast_sip_session *ast_sip_session_create_outgoing(struct ast_sip_endpoint } ast_format_cap_get_compatible(req_cap, endpoint->media.codecs, joint_cap); - if (!ast_format_cap_count(joint_cap)) { - ao2_ref(joint_cap, -1); - continue; - } - - clone_stream = ast_stream_clone(req_stream, NULL); - if (!clone_stream) { - ao2_ref(joint_cap, -1); - continue; - } if (ast_stream_get_type(req_stream) == AST_MEDIA_TYPE_AUDIO) { /* @@ -2748,6 +2738,17 @@ struct ast_sip_session *ast_sip_session_create_outgoing(struct ast_sip_endpoint endpoint->media.codecs, AST_MEDIA_TYPE_AUDIO); } + if (!ast_format_cap_count(joint_cap)) { + ao2_ref(joint_cap, -1); + continue; + } + + clone_stream = ast_stream_clone(req_stream, NULL); + if (!clone_stream) { + ao2_ref(joint_cap, -1); + continue; + } + ast_stream_set_formats(clone_stream, joint_cap); ao2_ref(joint_cap, -1); -- GitLab