From 809e07c6187626952778f4bd45180aabf1b98132 Mon Sep 17 00:00:00 2001 From: Kenan Gillet Date: Tue, 7 Apr 2009 01:39:17 +0000 Subject: Move scale factor computation to its own function. Patch by Kenan Gillet. Originally committed as revision 18345 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/qcelpdec.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/libavcodec/qcelpdec.c b/libavcodec/qcelpdec.c index 32e74a6a7d..9bef200670 100644 --- a/libavcodec/qcelpdec.c +++ b/libavcodec/qcelpdec.c @@ -412,18 +412,39 @@ static void compute_svector(QCELPContext *q, const float *gain, } /** - * Apply generic gain control. + * Compute the gain control * - * @param v_out output vector * @param v_in gain-controlled vector * @param v_ref vector to control gain of * + * @return gain control + * * FIXME: If v_ref is a zero vector, it energy is zero * and the behavior of the gain control is * undefined in the specs. * * TIA/EIA/IS-733 2.4.8.3-2/3/4/5, 2.4.8.6 */ +static float compute_gain_ctrl(const float *v_ref, const float *v_in, const int len) +{ + float scalefactor = ff_dot_productf(v_in, v_in, len); + + if(scalefactor) + scalefactor = sqrt(ff_dot_productf(v_ref, v_ref, len) / scalefactor); + else + ff_log_missing_feature(NULL, "Zero energy for gain control", 1); + return scalefactor; +} + +/** + * Apply generic gain control. + * + * @param v_out output vector + * @param v_in gain-controlled vector + * @param v_ref vector to control gain of + * + * TIA/EIA/IS-733 2.4.8.3, 2.4.8.6 + */ static void apply_gain_ctrl(float *v_out, const float *v_ref, const float *v_in) { @@ -432,12 +453,7 @@ static void apply_gain_ctrl(float *v_out, const float *v_ref, for(i=0, j=0; i<4; i++) { - scalefactor = ff_dot_productf(v_in + j, v_in + j, 40); - if(scalefactor) - scalefactor = sqrt(ff_dot_productf(v_ref + j, v_ref + j, 40) - / scalefactor); - else - ff_log_missing_feature(NULL, "Zero energy for gain control", 1); + scalefactor = compute_gain_ctrl(v_ref + j, v_in + j, 40); for(len=j+40; j