[FFmpeg-soc] [soc] soc g723.1 067d6998c2c8eef46e60d5406f209a12f8967b5a

naufal11 at gmail.com naufal11 at gmail.com
Sat Jun 19 18:44:44 CEST 2010



- Log -----------------------------------------------------------------
commit 067d6998c2c8eef46e60d5406f209a12f8967b5a
Author: Naufal <naufal11 at gmail.com>
Date:   Sat Jun 19 22:14:19 2010 +0530

    Generate fixed codebook excitation vector

diff --git a/libavcodec/g723_1.c b/libavcodec/g723_1.c
index a70088c..096de1d 100755
--- a/libavcodec/g723_1.c
+++ b/libavcodec/g723_1.c
@@ -9,6 +9,7 @@ typedef struct g723_1_context {
     int8_t lsp_index[LSP_BANDS];
     int16_t prev_lsp[LPC_ORDER];
     int16_t pitch_lag[2];
+    int16_t prev_excitation[PITCH_MAX];
     G723_1_Subframe subframe[4];
     FrameType cur_frame_type;
     FrameType past_frame_type;
@@ -258,6 +259,78 @@ static void lsp_interpolate(int16_t *lpc, int16_t *cur_lsp, int16_t *prev_lsp)
     }
 }
 
+/*
+ * Generate fixed codebook excitation vector
+ *
+ * @param vector decoded excitation vector
+ * @param index  the current subframe index
+ */
+static void gen_fcb_excitation(int16_t *vector, G723_1_Subframe subfrm,
+                               Rate cur_rate, int16_t pitch_lag, int index)
+{
+    int temp, i, j;
+
+    memset(vector, 0, SUBFRAMES);
+
+    if (cur_rate == Rate6k3) {
+        if (subfrm.pulse_pos >= max_pos[index])
+            return;
+
+        // Decode amplitudes and positions
+        j = PULSE_MAX - pulses[index];
+        temp = subfrm.pulse_pos;
+        for (i = 0; i < SUBFRAME_LEN / GRID_SIZE; i++) {
+            temp -= combinatorial_table[j][i];
+            if (temp >= 0)
+                break;
+            temp += combinatorial_table[j++][i];
+            if (!(subfrm.pulse_sign & (1 << (PULSE_MAX - j)))) {
+                vector[subfrm.grid_index + GRID_SIZE * i] =
+                                        -fixed_cb_gain[subfrm.amp_index];
+            } else {
+                vector[subfrm.grid_index + GRID_SIZE * i] =
+                                         fixed_cb_gain[subfrm.amp_index];
+            }
+            if (j == PULSE_MAX)
+                break;
+        }
+        // Generate Dirac train
+        if (subfrm.trans_gain == 1) {
+            int16_t temp_vector[SUBFRAME_LEN];
+            memcpy(temp_vector, vector, SUBFRAME_LEN);
+            for (i = pitch_lag; i < SUBFRAME_LEN; i += pitch_lag)
+                for (j = 0; j < SUBFRAME_LEN - i; j++)
+                    vector[i + j] += temp_vector[j];
+        }
+    } else { // Rate5k3
+        int16_t cb_gain  = fixed_cb_gain[subfrm.amp_index];
+        int16_t cb_shift = subfrm.grid_index;
+        int16_t cb_sign  = subfrm.pulse_sign;
+        int16_t cb_pos   = subfrm.pulse_pos;
+        int offset, beta, lag, temp;
+
+        for (i = 0; i < 8; i += 2) {
+            offset =  ((cb_pos & 7) << 3) + cb_shift + i;
+            vector[offset] = (cb_sign & 1) ? cb_gain : -cb_gain;
+            cb_pos  >>= 3;
+            cb_sign >>= 1;
+        }
+
+        // Enhance harmonic components
+        lag  = pitch_contrib[subfrm.ad_cb_gain << 1] + pitch_lag +
+               subfrm.ad_cb_lag - 1;
+        beta = pitch_contrib[(subfrm.ad_cb_lag << 1) + 1];
+
+        if (lag < SUBFRAME_LEN - 2) {
+            for (i = lag; i < SUBFRAME_LEN; i++) {
+                temp = av_clip_int16(beta * vector[i - lag]);
+                vector[i] = av_clip_int16(vector[i] + temp);
+            }
+        }
+    }
+}
+
+
 static int g723_1_decode_frame(AVCodecContext *avctx, void *data,
                               int *data_size, AVPacket *avpkt)
 {
@@ -267,7 +340,10 @@ static int g723_1_decode_frame(AVCodecContext *avctx, void *data,
 
     int16_t cur_lsp[LPC_ORDER];
     int16_t lpc[SUBFRAMES * LPC_ORDER + 4];
-    int bad_frame, erased_frames;
+    int16_t temp_vector[SUBFRAMES + PITCH_MAX];
+    int16_t *vector_ptr;
+    int16_t interp_gain;
+    int bad_frame, erased_frames, i;
 
     if (!buf_size || buf_size < frame_size[buf[0] & 3]) {
         *data_size = 0;
@@ -288,6 +364,19 @@ static int g723_1_decode_frame(AVCodecContext *avctx, void *data,
 
         inverse_quant(cur_lsp, p->prev_lsp, p->lsp_index, bad_frame);
         lsp_interpolate(lpc, cur_lsp, p->prev_lsp);
+
+        // Generate the excitation for the frame
+        memcpy(temp_vector, p->prev_excitation, PITCH_MAX);
+        vector_ptr = temp_vector + PITCH_MAX;
+        if (!erased_frames) {
+            // Update interpolation gain memory
+            interp_gain = fixed_cb_gain[(p->subframe[2].amp_index +
+                                        p->subframe[3].amp_index) >> 1];
+            for (i = 0; i < SUBFRAMES; i++) {
+                gen_fcb_excitation(vector_ptr, p->subframe[i], p->cur_rate,
+                                   p->pitch_lag[i >> 1], i);
+            }
+        }
     }
 
     return frame_size[p->cur_frame_type];
diff --git a/libavcodec/g723_1_data.h b/libavcodec/g723_1_data.h
index 4d6a9f0..86a749b 100644
--- a/libavcodec/g723_1_data.h
+++ b/libavcodec/g723_1_data.h
@@ -5,6 +5,9 @@
 #define LSP_BANDS    3
 #define LSP_CB_SIZE  256
 #define PITCH_MIN    18
+#define PITCH_MAX    (PITCH_MIN + 127)
+#define GRID_SIZE    2
+#define PULSE_MAX    6
 #define GAIN_LEVELS  24
 
 /*
@@ -902,3 +905,113 @@ static const int16_t lsp_band2[LSP_CB_SIZE * 4] = {
    3633,   2336,   2408,   1453,
    2923,   3517,   2567,   1318,
 };
+
+static const int16_t fixed_cb_gain[GAIN_LEVELS] = {
+     1,    2,    3,    4,    6,    9,   13,   18,
+    26,   38,   55,   80,  115,  166,  240,  348,
+   502,  726, 1050, 1517, 2193, 3170, 4582, 6623,
+};
+
+/*
+ * Used for the coding/decoding of the pulses positions
+ * for the MP-MLQ codebook
+ */
+static const int combinatorial_table[PULSE_MAX][SUBFRAME_LEN/GRID_SIZE] = {
+   {118755, 98280, 80730, 65780L, 53130,
+     42504, 33649, 26334,  20349, 15504,
+     11628,  8568,  6188,   4368,  3003,
+      2002,  1287,   792,    462,   252,
+       126,    56,    21,      6,     1,
+         0,     0,     0,      0,     0},
+
+   { 23751, 20475, 17550,  14950, 12650,
+     10626,  8855,  7315,   5985,  4845,
+      3876,  3060,  2380,   1820,  1365,
+      1001,   715,   495,    330,   210,
+       126,    70,    35,     15,     5,
+         1,     0,     0,      0,     0},
+
+   {  3654,  3276,  2925,   2600,  2300,
+      2024,  1771,  1540,   1330,  1140,
+       969,   816,   680,    560,   455,
+       364,   286,   220,    165,   120,
+        84,    56,    35,     20,    10,
+         4,     1,     0,      0,     0},
+
+   {   406,   378,   351,    325,   300,
+       276,   253,   231,    210,   190,
+       171,   153,   136,    120,   105,
+        91,    78,    66,     55,    45,
+        36,    28,    21,     15,    10,
+         6,     3,     1,      0,     0},
+
+   {    29,    28,    27,     26,    25,
+        24,    23,    22,     21,    20,
+        19,    18,    17,     16,    15,
+        14,    13,    12,     11,    10,
+         9,     8,     7,      6,     5,
+         4,     3,     2,      1,     0},
+
+   {     1,     1,     1,      1,     1,
+         1,     1,     1,      1,     1,
+         1,     1,     1,      1,     1,
+         1,     1,     1,      1,     1,
+         1,     1,     1,      1,     1,
+         1,     1,     1,      1,     1},
+};
+
+/*
+ * Number of non-zero pulses in the MP-MLQ excitation
+ */
+static const int8_t pulses[4] = {6, 5, 6, 5};
+
+/*
+ * Size of the MP-MLQ fixed excitation codebooks
+ */
+static const int max_pos[4] = {593775, 142506, 593775, 142506};
+
+static const int16_t pitch_contrib[340] = {
+   60,     0,  0,  2489, 60,     0,  0,  5217,
+    1,  6171,  0,  3953,  0, 10364,  1,  9357,
+   -1,  8843,  1,  9396,  0,  5794, -1, 10816,
+    2, 11606, -2, 12072,  0,  8616,  1, 12170,
+    0, 14440,  0,  7787, -1, 13721,  0, 18205,
+    0, 14471,  0, 15807,  1, 15275,  0, 13480,
+   -1, 18375, -1,     0,  1, 11194, -1, 13010,
+    1, 18836, -2, 20354,  1, 16233, -1,     0,
+   60,     0,  0, 12130,  0, 13385,  1, 17834,
+    1, 20875,  0, 21996,  1,     0,  1, 18277,
+   -1, 21321,  1, 13738, -1, 19094, -1, 20387,
+   -1,     0,  0, 21008, 60,     0, -2, 22807,
+    0, 15900,  1,     0,  0, 17989, -1, 22259,
+    1, 24395,  1, 23138,  0, 23948,  1, 22997,
+    2, 22604, -1, 25942,  0, 26246,  1, 25321,
+    0, 26423,  0, 24061,  0, 27247, 60,     0,
+   -1, 25572,  1, 23918,  1, 25930,  2, 26408,
+   -1, 19049,  1, 27357, -1, 24538, 60,     0,
+   -1, 25093,  0, 28549,  1,     0,  0, 22793,
+   -1, 25659,  0, 29377,  0, 30276,  0, 26198,
+    1, 22521, -1, 28919,  0, 27384,  1, 30162,
+   -1,     0,  0, 24237, -1, 30062,  0, 21763,
+    1, 30917, 60,     0,  0, 31284,  0, 29433,
+    1, 26821,  1, 28655,  0, 31327,  2, 30799,
+    1, 31389,  0, 32322,  1, 31760, -2, 31830,
+    0, 26936, -1, 31180,  1, 30875,  0, 27873,
+   -1, 30429,  1, 31050,  0,     0,  0, 31912,
+    1, 31611,  0, 31565,  0, 25557,  0, 31357,
+   60,     0,  1, 29536,  1, 28985, -1, 26984,
+   -1, 31587,  2, 30836, -2, 31133,  0, 30243,
+   -1, 30742, -1, 32090, 60,     0,  2, 30902,
+   60,     0,  0, 30027,  0, 29042, 60,     0,
+    0, 31756,  0, 24553,  0, 25636, -2, 30501,
+   60,     0, -1, 29617,  0, 30649, 60,     0,
+    0, 29274,  2, 30415,  0, 27480,  0, 31213,
+   -1, 28147,  0, 30600,  1, 31652,  2, 29068,
+   60,     0,  1, 28571,  1, 28730,  1, 31422,
+    0, 28257,  0, 24797, 60,     0,  0,     0,
+   60,     0,  0, 22105,  0, 27852, 60,     0,
+   60,     0, -1, 24214,  0, 24642,  0, 23305,
+   60,     0, 60,     0,  1, 22883,  0, 21601,
+   60,     0,  2, 25650, 60,     0, -2, 31253,
+   -2, 25144,  0, 17998
+};

-----------------------------------------------------------------------

Summary of changes:
 libavcodec/g723_1.c      |   91 ++++++++++++++++++++++++++++++++++++-
 libavcodec/g723_1_data.h |  113 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 203 insertions(+), 1 deletions(-)


-- 
http://github.com/naufal/ffmpeg-soc


More information about the FFmpeg-soc mailing list