mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 12:16:00 +00:00
res/res_pjsip: Add preferred_codec_only config to pjsip endpoint.
This patch add config to pjsip by endpoint. ;preferred_codec_only=yes ; Respond to a SIP invite with the single most preferred codec ; rather than advertising all joint codec capabilities. This ; limits the other side's codec choice to exactly what we prefer. ASTERISK-26317 #close Reported by: AaronAn Tested by: AaronAn Change-Id: Iad04dc55055403bbf5ec050997aee2dadc4f0762
This commit is contained in:
7
CHANGES
7
CHANGES
@@ -13,6 +13,13 @@
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
res_pjsip
|
||||
------------------
|
||||
* Added endpoint configuration parameter "preferred_codec_only".
|
||||
This allow asterisk response to a SIP invite with the single most
|
||||
preferred codec rather than advertising all joint codec capabilities.
|
||||
This limits the other side's codec choice to exactly what we prefer.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
--- Functionality changes from Asterisk 14.0.0 to Asterisk 14.1.0 ----------
|
||||
------------------------------------------------------------------------------
|
||||
|
@@ -764,6 +764,10 @@
|
||||
; "0" or not enabled)
|
||||
;contact_user= ; On outgoing requests, force the user portion of the Contact
|
||||
; header to this value (default: "")
|
||||
;preferred_codec_only=yes ; Respond to a SIP invite with the single most preferred codec
|
||||
; rather than advertising all joint codec capabilities. This
|
||||
; limits the other side's codec choice to exactly what we prefer.
|
||||
; default is no.
|
||||
|
||||
;==========================AUTH SECTION OPTIONS=========================
|
||||
;[auth]
|
||||
|
@@ -0,0 +1,30 @@
|
||||
"""add preferred_codec_only option to pjsip
|
||||
|
||||
Revision ID: 7f3e21abe318
|
||||
Revises: 4e2493ef32e6
|
||||
Create Date: 2016-09-02 11:00:23.534748
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '7f3e21abe318'
|
||||
down_revision = '4e2493ef32e6'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.dialects.postgresql import ENUM
|
||||
|
||||
YESNO_NAME = 'yesno_values'
|
||||
YESNO_VALUES = ['yes', 'no']
|
||||
|
||||
def upgrade():
|
||||
############################# Enums ##############################
|
||||
|
||||
# yesno_values have already been created, so use postgres enum object
|
||||
# type to get around "already created" issue - works okay with mysql
|
||||
yesno_values = ENUM(*YESNO_VALUES, name=YESNO_NAME, create_type=False)
|
||||
|
||||
op.add_column('ps_endpoints', sa.Column('preferred_codec_only', yesno_values))
|
||||
|
||||
def downgrade():
|
||||
op.drop_column('ps_endpoints', 'preferred_codec_only')
|
@@ -757,6 +757,8 @@ struct ast_sip_endpoint {
|
||||
unsigned int faxdetect_timeout;
|
||||
/*! Override the user on the outgoing Contact header with this value. */
|
||||
char *contact_user;
|
||||
/*! Whether to response SDP offer with single most preferred codec. */
|
||||
unsigned int preferred_codec_only;
|
||||
};
|
||||
|
||||
/*!
|
||||
|
@@ -833,6 +833,9 @@
|
||||
have this accountcode set on it.
|
||||
</para></description>
|
||||
</configOption>
|
||||
<configOption name="preferred_codec_only" default="no">
|
||||
<synopsis>Respond to a SIP invite with the single most preferred codec rather than advertising all joint codec capabilities. This limits the other side's codec choice to exactly what we prefer.</synopsis>
|
||||
</configOption>
|
||||
<configOption name="rtp_keepalive">
|
||||
<synopsis>Number of seconds between RTP comfort noise keepalive packets.</synopsis>
|
||||
<description><para>
|
||||
@@ -2022,6 +2025,9 @@
|
||||
<parameter name="Accountcode">
|
||||
<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='accountcode']/synopsis/node())"/></para>
|
||||
</parameter>
|
||||
<parameter name="PreferredCodecOnly">
|
||||
<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='preferred_codec_only']/synopsis/node())"/></para>
|
||||
</parameter>
|
||||
<parameter name="DeviceState">
|
||||
<para>The aggregate device state for this endpoint.</para>
|
||||
</parameter>
|
||||
|
@@ -1933,6 +1933,7 @@ int ast_res_pjsip_initialize_configuration(void)
|
||||
ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_acl", "", endpoint_acl_handler, contact_acl_to_str, NULL, 0, 0);
|
||||
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "subscribe_context", "", OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct ast_sip_endpoint, subscription.context));
|
||||
ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_user", "", contact_user_handler, contact_user_to_str, NULL, 0, 0);
|
||||
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "preferred_codec_only", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, preferred_codec_only));
|
||||
|
||||
if (ast_sip_initialize_sorcery_transport()) {
|
||||
ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");
|
||||
|
@@ -360,8 +360,13 @@ 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);
|
||||
if (session->endpoint->preferred_codec_only){
|
||||
struct ast_format *preferred_fmt = ast_format_cap_get_format(joint, 0);
|
||||
ast_format_cap_append(caps, preferred_fmt, 0);
|
||||
ao2_ref(preferred_fmt, -1);
|
||||
} else {
|
||||
ast_format_cap_append_from_cap(caps, joint, media_type);
|
||||
|
||||
}
|
||||
/*
|
||||
* Apply the new formats to the channel, potentially changing
|
||||
* raw read/write formats and translation path while doing so.
|
||||
|
@@ -1247,7 +1247,9 @@ int ast_sip_session_create_invite(struct ast_sip_session *session, pjsip_tx_data
|
||||
pjsip_inv_set_local_sdp(session->inv_session, offer);
|
||||
pjmedia_sdp_neg_set_prefer_remote_codec_order(session->inv_session->neg, PJ_FALSE);
|
||||
#ifdef PJMEDIA_SDP_NEG_ANSWER_MULTIPLE_CODECS
|
||||
if (!session->endpoint->preferred_codec_only) {
|
||||
pjmedia_sdp_neg_set_answer_multiple_codecs(session->inv_session->neg, PJ_TRUE);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -2141,7 +2143,9 @@ static int new_invite(void *data)
|
||||
pjsip_inv_set_local_sdp(invite->session->inv_session, local);
|
||||
pjmedia_sdp_neg_set_prefer_remote_codec_order(invite->session->inv_session->neg, PJ_FALSE);
|
||||
#ifdef PJMEDIA_SDP_NEG_ANSWER_MULTIPLE_CODECS
|
||||
if (!invite->session->endpoint->preferred_codec_only) {
|
||||
pjmedia_sdp_neg_set_answer_multiple_codecs(invite->session->inv_session->neg, PJ_TRUE);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user