diff options
author | Anton Khirnov <anton@khirnov.net> | 2013-12-08 15:26:34 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2015-02-20 09:18:30 +0100 |
commit | 3d9372b791949edb058317161c32f614615e22cf (patch) | |
tree | 8c574ce6d06edfe117c103ef230adee13fb0a4ad | |
parent | 0467c1417d3dbb1fdc7e5be5ca6a0b374f1898e3 (diff) |
pcm_convert: automatically reinit the resample context as needed.
-rw-r--r-- | src/pcm_convert.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/pcm_convert.c b/src/pcm_convert.c index 267e32c8..dffa9312 100644 --- a/src/pcm_convert.c +++ b/src/pcm_convert.c @@ -54,10 +54,25 @@ AVFrame *pcm_convert(struct pcm_convert_state *state, const AVFrame *src) { AVFrame *dst; - int ret; + int ret, need_reinit = 0; + +#define CHECK_PARAM(name, val) \ +do { \ + int64_t val; \ + av_opt_get_int(state->avr, name, 0, &val); \ + if (val != src->val) \ + need_reinit = 1; \ +} while (0) + if (state->avr) { + CHECK_PARAM("in_sample_rate", sample_rate); + CHECK_PARAM("in_sample_fmt", format); + CHECK_PARAM("in_channel_layout", channel_layout); + } - if (!state->avr) { + if (need_reinit || !state->avr) { char in_layout[128], out_layout[128]; + + avresample_free(&state->avr); state->avr = avresample_alloc_context(); if (!state->avr) return NULL; |