summaryrefslogtreecommitdiff
path: root/res/res_pjsip_sdp_rtp.c
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2017-06-06 12:04:21 +0000
committerJoshua Colp <jcolp@digium.com>2017-06-07 08:32:47 -0500
commita34dd63eb0a961a901c7540fb02a8c8cbbf53024 (patch)
treed3d457a1fac5c5c2b47a2ab0a9358899ac73c4cc /res/res_pjsip_sdp_rtp.c
parent65870021dcd8033b3b33e30d1175b99fbe7f21e4 (diff)
pjsip: Extend 'asymmetric_rtp_codec' option to include us changing.
PJSIP support in Asterisk differs from chan_sip in that it allows media to be sent as-is without transcoding provided the codecs were negotiated in the SDP. This is allowed according to the RFC. Support for this differs quite a lot though and some endpoints do not handle it well. This change extends the 'asymmetric_rtp_codec' option to also cover this case. When set to no (the default) the code behaves as chan_sip does - the best codec is selected and we will only ever send that, unless we change what we are sending if the remote side changes. When set to yes we will send media as-is without transcoding if the codec has been negotiated in the SDP. ASTERISK-26996 Change-Id: Ib1647f6902a0843e8c435946f831c2159e8d1d51
Diffstat (limited to 'res/res_pjsip_sdp_rtp.c')
-rw-r--r--res/res_pjsip_sdp_rtp.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/res/res_pjsip_sdp_rtp.c b/res/res_pjsip_sdp_rtp.c
index 6f94b0f4a..5ae108f76 100644
--- a/res/res_pjsip_sdp_rtp.c
+++ b/res/res_pjsip_sdp_rtp.c
@@ -411,7 +411,24 @@ static int set_caps(struct ast_sip_session *session,
ast_format_cap_append_from_cap(caps, ast_channel_nativeformats(session->channel),
AST_MEDIA_TYPE_UNKNOWN);
ast_format_cap_remove_by_type(caps, media_type);
- ast_format_cap_append_from_cap(caps, joint, media_type);
+
+ /*
+ * If we don't allow the sending codec to be changed on our side
+ * then get the best codec from the joint capabilities of the media
+ * type and use only that. This ensures the core won't start sending
+ * out a format that we aren't currently sending.
+ */
+ if (!session->endpoint->asymmetric_rtp_codec) {
+ struct ast_format *best;
+
+ best = ast_format_cap_get_best_by_type(joint, media_type);
+ if (best) {
+ ast_format_cap_append(caps, best, ast_format_cap_get_framing(joint));
+ ao2_ref(best, -1);
+ }
+ } else {
+ ast_format_cap_append_from_cap(caps, joint, media_type);
+ }
/*
* Apply the new formats to the channel, potentially changing