* qatar/master: avresample: use valid log context in mixing functions lavr: remove automatic context close/open for resampling compensation Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.1
| @@ -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 || | if ( am->in_channels <= 0 || am->in_channels > AVRESAMPLE_MAX_CHANNELS || | ||||
| am->out_channels <= 0 || am->out_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); | return AVERROR(EINVAL); | ||||
| } | } | ||||
| #define GET_MATRIX_CONVERT(suffix, scale) \ | #define GET_MATRIX_CONVERT(suffix, scale) \ | ||||
| if (!am->matrix_ ## suffix[0]) { \ | 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); \ | return AVERROR(EINVAL); \ | ||||
| } \ | } \ | ||||
| for (o = 0; o < am->out_channels; o++) \ | 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); | GET_MATRIX_CONVERT(flt, 1.0); | ||||
| break; | break; | ||||
| default: | 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); | 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 || | if ( am->in_channels <= 0 || am->in_channels > AVRESAMPLE_MAX_CHANNELS || | ||||
| am->out_channels <= 0 || am->out_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); | return AVERROR(EINVAL); | ||||
| } | } | ||||
| @@ -540,7 +540,7 @@ int ff_audio_mix_set_matrix(AudioMix *am, const double *matrix, int stride) | |||||
| CONVERT_MATRIX(flt, v) | CONVERT_MATRIX(flt, v) | ||||
| break; | break; | ||||
| default: | 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); | return AVERROR(EINVAL); | ||||
| } | } | ||||
| @@ -252,11 +252,10 @@ int avresample_set_matrix(AVAudioResampleContext *avr, const double *matrix, | |||||
| /** | /** | ||||
| * Set compensation for resampling. | * 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 avr audio resample context | ||||
| * @param sample_delta compensation delta, in samples | * @param sample_delta compensation delta, in samples | ||||
| @@ -255,9 +255,10 @@ int avresample_set_compensation(AVAudioResampleContext *avr, int sample_delta, | |||||
| if (!compensation_distance && sample_delta) | if (!compensation_distance && sample_delta) | ||||
| return AVERROR(EINVAL); | return AVERROR(EINVAL); | ||||
| /* if resampling was not enabled previously, re-initialize the | |||||
| AVAudioResampleContext and force resampling */ | |||||
| if (!avr->resample_needed) { | 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 fifo_samples; | ||||
| int restore_matrix = 0; | int restore_matrix = 0; | ||||
| double matrix[AVRESAMPLE_MAX_CHANNELS * AVRESAMPLE_MAX_CHANNELS] = { 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; | goto reinit_fail; | ||||
| ff_audio_data_free(&fifo_buf); | 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 = avr->resample; | ||||
| c->compensation_distance = compensation_distance; | c->compensation_distance = compensation_distance; | ||||
| @@ -39,4 +39,8 @@ | |||||
| * the public API and may change, break or disappear at any time. | * 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 */ | #endif /* AVRESAMPLE_VERSION_H */ | ||||