diff options
-rw-r--r-- | include/asterisk/format_pref.h | 3 | ||||
-rw-r--r-- | main/format_pref.c | 36 | ||||
-rw-r--r-- | main/frame.c | 2 | ||||
-rw-r--r-- | main/sorcery.c | 6 | ||||
-rw-r--r-- | res/res_pjsip_sdp_rtp.c | 3 |
5 files changed, 47 insertions, 3 deletions
diff --git a/include/asterisk/format_pref.h b/include/asterisk/format_pref.h index 9a7e06741..f5c3c22a7 100644 --- a/include/asterisk/format_pref.h +++ b/include/asterisk/format_pref.h @@ -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); diff --git a/main/format_pref.c b/main/format_pref.c index 4ea9f0cc7..b96184a08 100644 --- a/main/format_pref.c +++ b/main/format_pref.c @@ -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) { diff --git a/main/frame.c b/main/frame.c index 65bfc008f..8713ce40d 100644 --- a/main/frame.c +++ b/main/frame.c @@ -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); } } } diff --git a/main/sorcery.c b/main/sorcery.c index 1753ba198..b3620ddf0 100644 --- a/main/sorcery.c +++ b/main/sorcery.c @@ -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) diff --git a/res/res_pjsip_sdp_rtp.c b/res/res_pjsip_sdp_rtp.c index 48658cc16..345967bce 100644 --- a/res/res_pjsip_sdp_rtp.c +++ b/res/res_pjsip_sdp_rtp.c @@ -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))) { |