aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2013-12-08 15:26:34 +0100
committerAnton Khirnov <anton@khirnov.net>2015-02-20 09:18:30 +0100
commit3d9372b791949edb058317161c32f614615e22cf (patch)
tree8c574ce6d06edfe117c103ef230adee13fb0a4ad
parent0467c1417d3dbb1fdc7e5be5ca6a0b374f1898e3 (diff)
pcm_convert: automatically reinit the resample context as needed.
-rw-r--r--src/pcm_convert.c19
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;