changeset 8238:93ee77578391 libavcodec

More OKed parts of the QCELP decoder patch by Kenan Gillet, kenan.gillet gmail com
author vitor
date Mon, 01 Dec 2008 22:07:00 +0000
parents 3e2897df7c39
children dcfdb3352dde
files qcelpdec.c
diffstat 1 files changed, 60 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/qcelpdec.c	Mon Dec 01 20:45:29 2008 +0000
+++ b/qcelpdec.c	Mon Dec 01 22:07:00 2008 +0000
@@ -31,7 +31,6 @@
 #include "avcodec.h"
 #include "bitstream.h"
 
-#include "qcelp.h"
 #include "qcelpdata.h"
 
 #include "celp_math.h"
@@ -40,6 +39,16 @@
 #undef NDEBUG
 #include <assert.h>
 
+typedef enum
+{
+    I_F_Q = -1,    /*!< insufficient frame quality */
+    SILENCE,
+    RATE_OCTAVE,
+    RATE_QUARTER,
+    RATE_HALF,
+    RATE_FULL
+} qcelp_packet_rate;
+
 typedef struct {
     GetBitContext     gb;
     qcelp_packet_rate bitrate;
@@ -49,6 +58,9 @@
     float             prev_lspf[10];
     float             predictor_lspf[10];     /*!< LSP predictor,
                                                   only use for RATE_OCTAVE and I_F_Q */
+    float             pitch_synthesis_filter_mem[303];
+    float             pitch_pre_filter_mem[303];
+    float             rnd_fir_filter_mem[180];
     float             formant_mem[170];
     float             last_codebook_gain;
     int               prev_g1[2];
@@ -58,6 +70,13 @@
     uint16_t          first16bits;
 } QCELPContext;
 
+/**
+ * Reconstructs LPC coefficients from the line spectral pair frequencies.
+ *
+ * TIA/EIA/IS-733 2.4.3.3.5
+ */
+void qcelp_lspf2lpc(const float *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)
@@ -527,6 +546,46 @@
     return -1;
 }
 
+/**
+ * Determine the bitrate from the frame size and/or the first byte of the frame.
+ *
+ * @param avctx the AV codec context
+ * @param buf_size length of the buffer
+ * @param buf the bufffer
+ *
+ * @return the bitrate on success,
+ *         I_F_Q  if the bitrate cannot be satisfactorily determined
+ *
+ * TIA/EIA/IS-733 2.4.8.7.1
+ */
+static int determine_bitrate(AVCodecContext *avctx,
+                               const int buf_size,
+                               uint8_t **buf) {
+    qcelp_packet_rate bitrate;
+
+    if ((bitrate = buf_size2bitrate(buf_size)) >= 0) {
+        if (bitrate > **buf) {
+            av_log(avctx, AV_LOG_WARNING, "Claimed bitrate and buffer size mismatch.\n");
+            bitrate = **buf;
+        } else if (bitrate < **buf) {
+            av_log(avctx, AV_LOG_ERROR, "Buffer is too small for the claimed bitrate.\n");
+            return I_F_Q;
+        }
+        (*buf)++;
+    } else if ((bitrate = buf_size2bitrate(buf_size + 1)) >= 0) {
+        av_log(avctx, AV_LOG_WARNING,
+               "Bitrate byte is missing, guessing the bitrate from packet size.\n");
+    } else
+        return I_F_Q;
+
+    if (bitrate == SILENCE) {
+        // FIXME: the decoder should not handle SILENCE frames as I_F_Q frames
+        av_log_missing_feature(avctx, "Blank frame", 1);
+        bitrate = I_F_Q;
+    }
+    return bitrate;
+}
+
 static void warn_insufficient_frame_quality(AVCodecContext *avctx,
                                             const char *message)
 {