summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/asterisk/format_pref.h3
-rw-r--r--main/format_pref.c36
-rw-r--r--main/frame.c2
-rw-r--r--main/sorcery.c6
-rw-r--r--res/res_pjsip_sdp_rtp.c3
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))) {