diff options
author | zuul <zuul@gerrit.asterisk.org> | 2016-11-30 10:49:14 -0600 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2016-11-30 10:49:14 -0600 |
commit | a0c0b1c9cb01db6b1b968efc01ff43a7f492795e (patch) | |
tree | 2b38492e99846e4a57b6af4c3d234ebf47301c4a /main | |
parent | bd20127e647c02319a8f2e7091f06a7042f0032b (diff) | |
parent | e5e887be53ceb0b3ae4c0aa5a5cd055bd524fbde (diff) |
Merge "chan_pjsip: fix switching sending codec when asymmetric_rtp_codec=no"
Diffstat (limited to 'main')
-rw-r--r-- | main/channel.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/main/channel.c b/main/channel.c index bd5f35172..bcfb8afa9 100644 --- a/main/channel.c +++ b/main/channel.c @@ -5474,6 +5474,42 @@ int ast_set_read_format_path(struct ast_channel *chan, struct ast_format *raw_fo return 0; } +int ast_set_write_format_path(struct ast_channel *chan, struct ast_format *core_format, struct ast_format *raw_format) +{ + struct ast_trans_pvt *trans_old; + struct ast_trans_pvt *trans_new; + + if (ast_format_cmp(ast_channel_rawwriteformat(chan), raw_format) == AST_FORMAT_CMP_EQUAL + && ast_format_cmp(ast_channel_writeformat(chan), core_format) == AST_FORMAT_CMP_EQUAL) { + /* Nothing to setup */ + return 0; + } + + ast_debug(1, "Channel %s setting write format path: %s -> %s\n", + ast_channel_name(chan), + ast_format_get_name(core_format), + ast_format_get_name(raw_format)); + + /* Setup new translation path. */ + if (ast_format_cmp(raw_format, core_format) != AST_FORMAT_CMP_EQUAL) { + trans_new = ast_translator_build_path(raw_format, core_format); + if (!trans_new) { + return -1; + } + } else { + /* No translation needed. */ + trans_new = NULL; + } + trans_old = ast_channel_writetrans(chan); + if (trans_old) { + ast_translator_free_path(trans_old); + } + ast_channel_writetrans_set(chan, trans_new); + ast_channel_set_rawwriteformat(chan, raw_format); + ast_channel_set_writeformat(chan, core_format); + return 0; +} + struct set_format_access { const char *direction; struct ast_trans_pvt *(*get_trans)(const struct ast_channel *chan); |