diff options
Diffstat (limited to 'main/rtp.c')
-rw-r--r-- | main/rtp.c | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/main/rtp.c b/main/rtp.c index 54f3a85ff..3e24e25bb 100644 --- a/main/rtp.c +++ b/main/rtp.c @@ -3659,14 +3659,48 @@ static int ast_rtp_raw_write(struct ast_rtp *rtp, struct ast_frame *f, int codec void ast_rtp_codec_setpref(struct ast_rtp *rtp, struct ast_codec_pref *prefs) { - int x; - for (x = 0; x < 32; x++) { /* Ugly way */ - rtp->pref.order[x] = prefs->order[x]; - rtp->pref.framing[x] = prefs->framing[x]; + struct ast_format_list current_format_old, current_format_new; + + /* if no packets have been sent through this session yet, then + * changing preferences does not require any extra work + */ + if (rtp->lasttxformat == 0) { + rtp->pref = *prefs; + return; } - if (rtp->smoother) - ast_smoother_free(rtp->smoother); - rtp->smoother = NULL; + + current_format_old = ast_codec_pref_getsize(&rtp->pref, rtp->lasttxformat); + + rtp->pref = *prefs; + + current_format_new = ast_codec_pref_getsize(&rtp->pref, rtp->lasttxformat); + + /* if the framing desired for the current format has changed, we may have to create + * or adjust the smoother for this session + */ + if ((current_format_new.inc_ms != 0) && + (current_format_new.cur_ms != current_format_old.cur_ms)) { + int new_size = (current_format_new.cur_ms * current_format_new.fr_len) / current_format_new.inc_ms; + + if (rtp->smoother) { + ast_smoother_reconfigure(rtp->smoother, new_size); + if (option_debug) { + ast_log(LOG_DEBUG, "Adjusted smoother to %d ms and %d bytes\n", current_format_new.cur_ms, new_size); + } + } else { + if (!(rtp->smoother = ast_smoother_new(new_size))) { + ast_log(LOG_WARNING, "Unable to create smoother: format: %d ms: %d len: %d\n", rtp->lasttxformat, current_format_new.cur_ms, new_size); + return; + } + if (current_format_new.flags) { + ast_smoother_set_flags(rtp->smoother, current_format_new.flags); + } + if (option_debug) { + ast_log(LOG_DEBUG, "Created smoother: format: %d ms: %d len: %d\n", rtp->lasttxformat, current_format_new.cur_ms, new_size); + } + } + } + } struct ast_codec_pref *ast_rtp_codec_getpref(struct ast_rtp *rtp) |