diff options
author | Kenan Gillet <kenan.gillet@gmail.com> | 2009-04-07 01:39:17 +0000 |
---|---|---|
committer | Reynaldo H. Verdejo Pinochet <reynaldo@opendot.cl> | 2009-04-07 01:39:17 +0000 |
commit | 809e07c6187626952778f4bd45180aabf1b98132 (patch) | |
tree | 0f745c4f27a8dec3113a1cda0204d07b24e023fb | |
parent | 38d5647a63428eae47a7135a60f2ece93f910b54 (diff) | |
download | ffmpeg-809e07c6187626952778f4bd45180aabf1b98132.tar.gz |
Move scale factor computation to its own function. Patch by Kenan
Gillet.
Originally committed as revision 18345 to svn://svn.ffmpeg.org/ffmpeg/trunk
-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]; } |