diff options
-rw-r--r-- | libavcodec/qcelpdec.c | 32 |
1 files 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<len; j++) v_out[j] = scalefactor * v_in[j]; } |