* 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 */ |