changeset 9353:70c3982d0bad libavcodec

Move scale factor computation to its own function. Patch by Kenan Gillet.
author reynaldo
date Tue, 07 Apr 2009 01:39:17 +0000
parents 03fd7ea4926b
children 174309386512
files qcelpdec.c
diffstat 1 files changed, 27 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/qcelpdec.c	Mon Apr 06 21:45:02 2009 +0000
+++ b/qcelpdec.c	Tue Apr 07 01:39:17 2009 +0000
@@ -412,17 +412,38 @@
 }
 
 /**
+ * Compute the gain control
+ *
+ * @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
  *
- * 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
+ * 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 @@
 
     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];
     }