From f1c2915ce1ea36782e0aebd108cd48db53b03c8b Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Thu, 29 Nov 2012 20:58:05 -0500 Subject: [PATCH 1/2] lavr: remove automatic context close/open for resampling compensation It adds unnecessary complication for insignificant usability improvement. The user really should know if they'll need resampling compensation before opening the context. Note that only the documentation has changed. The current functionality will still work until the next major bump. --- libavresample/avresample.h | 9 ++++----- libavresample/resample.c | 9 +++++++-- libavresample/version.h | 4 ++++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/libavresample/avresample.h b/libavresample/avresample.h index a73d6865ac..4841d262c0 100644 --- a/libavresample/avresample.h +++ b/libavresample/avresample.h @@ -252,11 +252,10 @@ int avresample_set_matrix(AVAudioResampleContext *avr, const double *matrix, /** * Set compensation for resampling. * - * This can be called anytime after avresample_open(). If resampling was not - * being done previously, the AVAudioResampleContext is closed and reopened - * with resampling enabled. In this case, any samples remaining in the output - * FIFO and the current channel mixing matrix will be restored after reopening - * the context. + * This can be called anytime after avresample_open(). If resampling is not + * automatically enabled because of a sample rate conversion, the + * "force_resampling" option must have been set to 1 when opening the context + * in order to use resampling compensation. * * @param avr audio resample context * @param sample_delta compensation delta, in samples diff --git a/libavresample/resample.c b/libavresample/resample.c index 15eaa50e23..dc121fe56d 100644 --- a/libavresample/resample.c +++ b/libavresample/resample.c @@ -255,9 +255,10 @@ int avresample_set_compensation(AVAudioResampleContext *avr, int sample_delta, if (!compensation_distance && sample_delta) return AVERROR(EINVAL); - /* if resampling was not enabled previously, re-initialize the - AVAudioResampleContext and force resampling */ if (!avr->resample_needed) { +#if FF_API_RESAMPLE_CLOSE_OPEN + /* if resampling was not enabled previously, re-initialize the + AVAudioResampleContext and force resampling */ int fifo_samples; int restore_matrix = 0; double matrix[AVRESAMPLE_MAX_CHANNELS * AVRESAMPLE_MAX_CHANNELS] = { 0 }; @@ -307,6 +308,10 @@ int avresample_set_compensation(AVAudioResampleContext *avr, int sample_delta, goto reinit_fail; ff_audio_data_free(&fifo_buf); } +#else + av_log(avr, AV_LOG_ERROR, "Unable to set resampling compensation\n"); + return AVERROR(EINVAL); +#endif } c = avr->resample; c->compensation_distance = compensation_distance; diff --git a/libavresample/version.h b/libavresample/version.h index 53ba802d85..834c942d93 100644 --- a/libavresample/version.h +++ b/libavresample/version.h @@ -39,4 +39,8 @@ * the public API and may change, break or disappear at any time. */ +#ifndef FF_API_RESAMPLE_CLOSE_OPEN +#define FF_API_RESAMPLE_CLOSE_OPEN (LIBAVRESAMPLE_VERSION_MAJOR < 2) +#endif + #endif /* AVRESAMPLE_VERSION_H */ From 0cf3505930913d3584b215f6912de04ff41366e0 Mon Sep 17 00:00:00 2001 From: Hendrik Leppkes Date: Sun, 16 Dec 2012 09:52:35 +0100 Subject: [PATCH 2/2] avresample: use valid log context in mixing functions Signed-off-by: Justin Ruggles --- libavresample/audio_mix.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libavresample/audio_mix.c b/libavresample/audio_mix.c index 62f8bd6c6d..2b3d9f1f7a 100644 --- a/libavresample/audio_mix.c +++ b/libavresample/audio_mix.c @@ -467,13 +467,13 @@ int ff_audio_mix_get_matrix(AudioMix *am, double *matrix, int stride) if ( am->in_channels <= 0 || am->in_channels > AVRESAMPLE_MAX_CHANNELS || am->out_channels <= 0 || am->out_channels > AVRESAMPLE_MAX_CHANNELS) { - av_log(am, AV_LOG_ERROR, "Invalid channel counts\n"); + av_log(am->avr, AV_LOG_ERROR, "Invalid channel counts\n"); return AVERROR(EINVAL); } #define GET_MATRIX_CONVERT(suffix, scale) \ if (!am->matrix_ ## suffix[0]) { \ - av_log(am, AV_LOG_ERROR, "matrix is not set\n"); \ + av_log(am->avr, AV_LOG_ERROR, "matrix is not set\n"); \ return AVERROR(EINVAL); \ } \ for (o = 0; o < am->out_channels; o++) \ @@ -491,7 +491,7 @@ int ff_audio_mix_get_matrix(AudioMix *am, double *matrix, int stride) GET_MATRIX_CONVERT(flt, 1.0); break; default: - av_log(am, AV_LOG_ERROR, "Invalid mix coeff type\n"); + av_log(am->avr, AV_LOG_ERROR, "Invalid mix coeff type\n"); return AVERROR(EINVAL); } @@ -504,7 +504,7 @@ int ff_audio_mix_set_matrix(AudioMix *am, const double *matrix, int stride) if ( am->in_channels <= 0 || am->in_channels > AVRESAMPLE_MAX_CHANNELS || am->out_channels <= 0 || am->out_channels > AVRESAMPLE_MAX_CHANNELS) { - av_log(am, AV_LOG_ERROR, "Invalid channel counts\n"); + av_log(am->avr, AV_LOG_ERROR, "Invalid channel counts\n"); return AVERROR(EINVAL); } @@ -540,7 +540,7 @@ int ff_audio_mix_set_matrix(AudioMix *am, const double *matrix, int stride) CONVERT_MATRIX(flt, v) break; default: - av_log(am, AV_LOG_ERROR, "Invalid mix coeff type\n"); + av_log(am->avr, AV_LOG_ERROR, "Invalid mix coeff type\n"); return AVERROR(EINVAL); }