mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-28 10:13:43 +00:00
pjsip: fix support for allow=all
This change adds improvements to support for allow=all in pjsip.conf so that it functions as intended. Previously, the allow/disallow socery configuration would set & clear codecs from the media.codecs and media.prefs list, but if all was specified the prefs list was not updated. Then a call would fail when create_outgoing_sdp_stream() created an SDP with no audio codecs. A new function ast_codec_pref_append_all() is provided to add all codecs to the prefs list - only those not already on the list. This enables the configuration to specify a codec preference, but still add all codecs, and even then remove some codecs, as shown in this example: allow = ulaw, alaw, all, !g729, !g723 Also, the display order of allow in cli output is updated to match the configuration by using prefs instead of caps when generating a human readable string. Finally, a change to create_outgoing_sdp_stream() skips a codec when it does not have a payload code instead of the call failing. (closes issue ASTERISK-23018) Reported by: xrobau Review: https://reviewboard.asterisk.org/r/3131/ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@405875 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -69,6 +69,9 @@ struct ast_format *ast_codec_pref_index(struct ast_codec_pref *pref, int index,
|
||||
/*! \brief Remove audio a codec from a preference list */
|
||||
void ast_codec_pref_remove(struct ast_codec_pref *pref, struct ast_format *format);
|
||||
|
||||
/*! \brief Append all codecs to a preference list, without disturbing existing order */
|
||||
void ast_codec_pref_append_all(struct ast_codec_pref *pref);
|
||||
|
||||
/*! \brief Append a audio codec to a preference list, removing it first if it was already there
|
||||
*/
|
||||
int ast_codec_pref_append(struct ast_codec_pref *pref, struct ast_format *format);
|
||||
|
@@ -143,6 +143,42 @@ void ast_codec_pref_remove(struct ast_codec_pref *pref, struct ast_format *forma
|
||||
ast_format_list_destroy(f_list);
|
||||
}
|
||||
|
||||
/*! \brief Append all codecs to a preference list, without distrubing existing order */
|
||||
void ast_codec_pref_append_all(struct ast_codec_pref *pref)
|
||||
{
|
||||
int x, y, found;
|
||||
size_t f_len = 0;
|
||||
const struct ast_format_list *f_list = ast_format_list_get(&f_len);
|
||||
|
||||
/* leave any existing entries, and don't create duplicates (e.g. allow=ulaw,all) */
|
||||
for (x = 0; x < f_len; x++) {
|
||||
/* x = codec to add */
|
||||
found = 0;
|
||||
for (y = 0; y < f_len; y++) {
|
||||
/* y = scan of existing preferences */
|
||||
if (!pref->order[y]) {
|
||||
break;
|
||||
}
|
||||
if (x + 1 == pref->order[y]) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
continue;
|
||||
}
|
||||
for (; y < f_len; y++) {
|
||||
/* add x to the end of y */
|
||||
if (!pref->order[y])
|
||||
{
|
||||
pref->order[y] = x + 1;
|
||||
ast_format_copy(&pref->formats[y], &f_list[x].format);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*! \brief Append codec to list */
|
||||
int ast_codec_pref_append(struct ast_codec_pref *pref, struct ast_format *format)
|
||||
{
|
||||
|
@@ -866,6 +866,8 @@ int ast_parse_allow_disallow(struct ast_codec_pref *pref, struct ast_format_cap
|
||||
}
|
||||
} else if (!iter_allowing) {
|
||||
memset(pref, 0, sizeof(*pref));
|
||||
} else {
|
||||
ast_codec_pref_append_all(pref);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -43,6 +43,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
#include "asterisk/taskprocessor.h"
|
||||
#include "asterisk/threadpool.h"
|
||||
#include "asterisk/json.h"
|
||||
#include "asterisk/format_pref.h"
|
||||
|
||||
/* To prevent DEBUG_FD_LEAKS from interfering with things we undef open and close */
|
||||
#undef open
|
||||
@@ -222,8 +223,9 @@ static int chararray_handler_fn(const void *obj, const intptr_t *args, char **bu
|
||||
static int codec_handler_fn(const void *obj, const intptr_t *args, char **buf)
|
||||
{
|
||||
char tmp_buf[256];
|
||||
struct ast_format_cap **cap = (struct ast_format_cap **)(obj + args[1]);
|
||||
return !(*buf = ast_strdup(ast_getformatname_multiple(tmp_buf, sizeof(tmp_buf), *cap)));
|
||||
struct ast_codec_pref *pref = (struct ast_codec_pref *)(obj + args[0]);
|
||||
ast_codec_pref_string(pref, tmp_buf, sizeof(tmp_buf));
|
||||
return !(*buf = ast_strdup(tmp_buf));
|
||||
}
|
||||
|
||||
static sorcery_field_handler sorcery_field_default_handler(enum aco_option_type type)
|
||||
|
@@ -936,7 +936,8 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as
|
||||
}
|
||||
|
||||
if ((rtp_code = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(session_media->rtp), 1, &format, 0)) == -1) {
|
||||
return -1;
|
||||
ast_log(LOG_WARNING,"Unable to get rtp codec payload code for %s\n",ast_getformatname(&format));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!(attr = generate_rtpmap_attr(media, pool, rtp_code, 1, &format, 0))) {
|
||||
|
Reference in New Issue
Block a user