diff options
author | Scott Griepentrog <sgriepentrog@digium.com> | 2014-01-17 21:33:26 +0000 |
---|---|---|
committer | Scott Griepentrog <sgriepentrog@digium.com> | 2014-01-17 21:33:26 +0000 |
commit | 2b14601bdc3a5a98095e25b3b70ec7908c908308 (patch) | |
tree | a5233f6a22c2781747dad2b907ffc40f91b0dea6 /main/format_pref.c | |
parent | 2704b49c1b038ffd4a6a413b9973814bee7a42b3 (diff) |
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/
........
Merged revisions 405875 from http://svn.asterisk.org/svn/asterisk/branches/12
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@405876 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/format_pref.c')
-rw-r--r-- | main/format_pref.c | 36 |
1 files changed, 36 insertions, 0 deletions
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) { |