summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
Diffstat (limited to 'res')
-rw-r--r--res/res_pjsip.c9
-rw-r--r--res/res_pjsip/pjsip_configuration.c1
-rw-r--r--res/res_pjsip_sdp_rtp.c17
3 files changed, 21 insertions, 6 deletions
diff --git a/res/res_pjsip.c b/res/res_pjsip.c
index ff18a1d6d..27e3f8179 100644
--- a/res/res_pjsip.c
+++ b/res/res_pjsip.c
@@ -471,6 +471,15 @@
set to <literal>sdes</literal> or <literal>dtls</literal>.
</para></description>
</configOption>
+ <configOption name="g726_non_standard" default="no">
+ <synopsis>Force g.726 to use AAL2 packing order when negotiating g.726 audio</synopsis>
+ <description><para>
+ When set to "yes" and an endpoint negotiates g.726 audio then use g.726 for AAL2
+ packing order instead of what is recommended by RFC3551. Since this essentially
+ replaces the underlying 'g726' codec with 'g726aal2' then 'g726aal2' needs to be
+ specified in the endpoint's allowed codec list.
+ </para></description>
+ </configOption>
<configOption name="inband_progress" default="no">
<synopsis>Determines whether chan_pjsip will indicate ringing using inband
progress.</synopsis>
diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c
index 34bb69211..9a383a25a 100644
--- a/res/res_pjsip/pjsip_configuration.c
+++ b/res/res_pjsip/pjsip_configuration.c
@@ -1922,6 +1922,7 @@ int ast_res_pjsip_initialize_configuration(const struct ast_module_info *ast_mod
ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtls_fingerprint", "", dtls_handler, dtlsfingerprint_to_str, NULL, 0, 0);
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "srtp_tag_32", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.srtp_tag_32));
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "media_encryption_optimistic", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.encryption_optimistic));
+ ast_sorcery_object_field_register(sip_sorcery, "endpoint", "g726_non_standard", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.g726_non_standard));
ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "redirect_method", "user", redirect_handler, NULL, NULL, 0, 0);
ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "set_var", "", set_var_handler, set_var_to_str, set_var_to_vl, 0, 0);
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "message_context", "", OPT_STRINGFIELD_T, 1, STRFLDSET(struct ast_sip_endpoint, message_context));
diff --git a/res/res_pjsip_sdp_rtp.c b/res/res_pjsip_sdp_rtp.c
index 1bd3b0cb3..fb70dd331 100644
--- a/res/res_pjsip_sdp_rtp.c
+++ b/res/res_pjsip_sdp_rtp.c
@@ -155,6 +155,8 @@ static void get_codecs(struct ast_sip_session *session, const struct pjmedia_sdp
char name[256];
char media[20];
char fmt_param[256];
+ enum ast_rtp_options options = session->endpoint->media.g726_non_standard ?
+ AST_RTP_OPT_G726_NONSTANDARD : 0;
ast_rtp_codecs_payloads_initialize(codecs);
@@ -176,9 +178,10 @@ static void get_codecs(struct ast_sip_session *session, const struct pjmedia_sdp
if (strcmp(name,"telephone-event") == 0) {
tel_event++;
}
+
ast_copy_pj_str(media, (pj_str_t*)&stream->desc.media, sizeof(media));
ast_rtp_codecs_payloads_set_rtpmap_type_rate(codecs, NULL, pj_strtoul(&stream->desc.fmt[i]),
- media, name, 0, rtpmap->clock_rate);
+ media, name, options, rtpmap->clock_rate);
/* Look for an optional associated fmtp attribute */
if (!(attr = pjmedia_sdp_media_find_attr2(stream, "fmtp", &rtpmap->pt))) {
continue;
@@ -304,18 +307,20 @@ static int set_caps(struct ast_sip_session *session, struct ast_sip_session_medi
return 0;
}
-static pjmedia_sdp_attr* generate_rtpmap_attr(pjmedia_sdp_media *media, pj_pool_t *pool, int rtp_code,
- int asterisk_format, struct ast_format *format, int code)
+static pjmedia_sdp_attr* generate_rtpmap_attr(struct ast_sip_session *session, pjmedia_sdp_media *media, pj_pool_t *pool,
+ int rtp_code, int asterisk_format, struct ast_format *format, int code)
{
pjmedia_sdp_rtpmap rtpmap;
pjmedia_sdp_attr *attr = NULL;
char tmp[64];
+ enum ast_rtp_options options = session->endpoint->media.g726_non_standard ?
+ AST_RTP_OPT_G726_NONSTANDARD : 0;
snprintf(tmp, sizeof(tmp), "%d", rtp_code);
pj_strdup2(pool, &media->desc.fmt[media->desc.fmt_count++], tmp);
rtpmap.pt = media->desc.fmt[media->desc.fmt_count - 1];
rtpmap.clock_rate = ast_rtp_lookup_sample_rate2(asterisk_format, format, code);
- pj_strdup2(pool, &rtpmap.enc_name, ast_rtp_lookup_mime_subtype2(asterisk_format, format, code, 0));
+ pj_strdup2(pool, &rtpmap.enc_name, ast_rtp_lookup_mime_subtype2(asterisk_format, format, code, options));
rtpmap.param.slen = 0;
rtpmap.param.ptr = NULL;
@@ -1050,7 +1055,7 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as
continue;
}
- if (!(attr = generate_rtpmap_attr(media, pool, rtp_code, 1, format, 0))) {
+ if (!(attr = generate_rtpmap_attr(session, media, pool, rtp_code, 1, format, 0))) {
ao2_ref(format, -1);
continue;
}
@@ -1075,7 +1080,7 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as
continue;
}
- if (!(attr = generate_rtpmap_attr(media, pool, rtp_code, 0, NULL, index))) {
+ if (!(attr = generate_rtpmap_attr(session, media, pool, rtp_code, 0, NULL, index))) {
continue;
}