From 3d9372b791949edb058317161c32f614615e22cf Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 8 Dec 2013 15:26:34 +0100 Subject: pcm_convert: automatically reinit the resample context as needed. --- src/pcm_convert.c | 19 +++++++++++++++++-- 1 file 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; -- cgit v1.2.3