]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/qcelpdec.c
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
[ffmpeg] / libavcodec / qcelpdec.c
index c7d2938c0a7154155e072c2924b257e483b503fe..516965c7cfddf55a5d43001ddebab93ca4a88cb4 100644 (file)
@@ -37,6 +37,7 @@
 
 #include "celp_math.h"
 #include "celp_filters.h"
+#include "acelp_vectors.h"
 
 #undef NDEBUG
 #include <assert.h>
@@ -81,17 +82,6 @@ typedef struct
  */
 void ff_celp_lspf2lpc(const double *lspf, float *lpc);
 
-static void weighted_vector_sumf(float *out, const float *in_a,
-                                 const float *in_b, float weight_coeff_a,
-                                 float weight_coeff_b, int length)
-{
-    int i;
-
-    for(i=0; i<length; i++)
-        out[i] = weight_coeff_a * in_a[i]
-               + weight_coeff_b * in_b[i];
-}
-
 /**
  * Initialize the speech codec according to the specification.
  *
@@ -174,7 +164,7 @@ static int decode_lspf(QCELPContext *q, float *lspf)
             lspf[i-1] = FFMIN(lspf[i-1], (lspf[i] - QCELP_LSP_SPREAD_FACTOR));
 
         // Low-pass filter the LSP frequencies.
-        weighted_vector_sumf(lspf, lspf, q->prev_lspf, smooth, 1.0-smooth, 10);
+        ff_weighted_vector_sumf(lspf, lspf, q->prev_lspf, smooth, 1.0-smooth, 10);
     }else
     {
         q->octave_count = 0;
@@ -422,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)
 {
@@ -442,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];
     }
@@ -596,7 +602,7 @@ static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
  *
  * TIA/EIA/IS-733 2.4.3.3.5
  */
-void lspf2lpc(const float *lspf, float *lpc)
+static void lspf2lpc(const float *lspf, float *lpc)
 {
     double lsf[10];
     double bandwith_expansion_coeff = QCELP_BANDWITH_EXPANSION_COEFF;
@@ -640,8 +646,8 @@ void interpolate_lpc(QCELPContext *q, const float *curr_lspf, float *lpc,
 
     if(weight != 1.0)
     {
-        weighted_vector_sumf(interpolated_lspf, curr_lspf, q->prev_lspf,
-                             weight, 1.0 - weight, 10);
+        ff_weighted_vector_sumf(interpolated_lspf, curr_lspf, q->prev_lspf,
+                                weight, 1.0 - weight, 10);
         lspf2lpc(interpolated_lspf, lpc);
     }else if(q->bitrate >= RATE_QUARTER ||
              (q->bitrate == I_F_Q && !subframe_num))
@@ -723,8 +729,10 @@ static void warn_insufficient_frame_quality(AVCodecContext *avctx,
 }
 
 static int qcelp_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
-                              const uint8_t *buf, int buf_size)
+                              AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     QCELPContext *q = avctx->priv_data;
     float *outbuffer = data;
     int   i;