More OKed parts of QCELP data tables
authorKenan Gillet <kenan.gillet@gmail.com>
Thu, 30 Oct 2008 21:00:01 +0000 (21:00 +0000)
committerVitor Sessak <vitor1001@gmail.com>
Thu, 30 Oct 2008 21:00:01 +0000 (21:00 +0000)
patch by Kenan Gillet, kenan.gillet gmail com

Originally committed as revision 15752 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/qcelpdata.h

index 2ea5610..c07c4e0 100644 (file)
 
 #include <stdint.h>
 
+/**
+ * pre-calculated table for hammsinc function
+ * Only half of the tables is needed because of symetry.
+ *
+ * TIA/EIA/IS-733 2.4.5.2-2/3
+ */
+static const float qcelp_hammsinc_table[4] = { -0.006822,  0.041249, -0.143459,  0.588863};
+
+typedef struct {
+    uint8_t index;  /*!< index into the QCELPContext structure */
+    uint8_t bitpos; /*!< position of the lowet bit in the value's byte */
+    uint8_t bitlen; /*!< number of bits to read */
+} QCELPBitmap;
+
+#define QCELP_OF(variable, bit, len) {offsetof(QCELPContext, variable), bit, len}
+
+/**
+ * bitmap unpacking tables for RATE_FULL
+ *
+ * TIA/EIA/IS-733 Table 2.4.7.1-1
+ */
+static const QCELPBitmap qcelp_rate_full_bitmap[] = {
+                                // start on bit
+    QCELP_OF(lspv  [ 2], 0, 3), // 265
+    QCELP_OF(lspv  [ 1], 0, 7), // 262
+    QCELP_OF(lspv  [ 0], 0, 6), // 255
+    QCELP_OF(lspv  [ 4], 0, 6), // 249
+    QCELP_OF(lspv  [ 3], 0, 6), // 243
+    QCELP_OF(lspv  [ 2], 3, 4), // 237
+    QCELP_OF(cbsign[ 0], 0, 1), // 233
+    QCELP_OF(cbgain[ 0], 0, 4), // 232
+    QCELP_OF(pfrac [ 0], 0, 1), // 228
+    QCELP_OF(plag  [ 0], 0, 7), // 227
+    QCELP_OF(pgain [ 0], 0, 3), // 220
+    QCELP_OF(cindex[ 1], 0, 4), // 217
+    QCELP_OF(cbsign[ 1], 0, 1), // 213
+    QCELP_OF(cbgain[ 1], 0, 4), // 212
+    QCELP_OF(cindex[ 0], 0, 7), // 208
+    QCELP_OF(cbgain[ 3], 0, 1), // 201
+    QCELP_OF(cindex[ 2], 0, 7), // 200
+    QCELP_OF(cbsign[ 2], 0, 1), // 193
+    QCELP_OF(cbgain[ 2], 0, 4), // 192
+    QCELP_OF(cindex[ 1], 4, 3), // 188
+    QCELP_OF(plag  [ 1], 0, 3), // 185
+    QCELP_OF(pgain [ 1], 0, 3), // 182
+    QCELP_OF(cindex[ 3], 0, 7), // 179
+    QCELP_OF(cbsign[ 3], 0, 1), // 172
+    QCELP_OF(cbgain[ 3], 1, 2), // 171
+    QCELP_OF(cindex[ 4], 0, 6), // 169
+    QCELP_OF(cbsign[ 4], 0, 1), // 163
+    QCELP_OF(cbgain[ 4], 0, 4), // 162
+    QCELP_OF(pfrac [ 1], 0, 1), // 158
+    QCELP_OF(plag  [ 1], 3, 4), // 157
+    QCELP_OF(cbgain[ 6], 0, 3), // 153
+    QCELP_OF(cindex[ 5], 0, 7), // 150
+    QCELP_OF(cbsign[ 5], 0, 1), // 143
+    QCELP_OF(cbgain[ 5], 0, 4), // 142
+    QCELP_OF(cindex[ 4], 6, 1), // 138
+    QCELP_OF(cindex[ 7], 0, 3), // 137
+    QCELP_OF(cbsign[ 7], 0, 1), // 134
+    QCELP_OF(cbgain[ 7], 0, 3), // 133
+    QCELP_OF(cindex[ 6], 0, 7), // 130
+    QCELP_OF(cbsign[ 6], 0, 1), // 123
+    QCELP_OF(cbgain[ 6], 3, 1), // 122
+    QCELP_OF(cbgain[ 8], 0, 1), // 121
+    QCELP_OF(pfrac [ 2], 0, 1), // 120
+    QCELP_OF(plag  [ 2], 0, 7), // 119
+    QCELP_OF(pgain [ 2], 0, 3), // 112
+    QCELP_OF(cindex[ 7], 3, 4), // 109
+    QCELP_OF(cbsign[ 9], 0, 1), // 105
+    QCELP_OF(cbgain[ 9], 0, 4), // 104
+    QCELP_OF(cindex[ 8], 0, 7), // 100
+    QCELP_OF(cbsign[ 8], 0, 1), //  93
+    QCELP_OF(cbgain[ 8], 1, 3), //  92
+    QCELP_OF(cindex[10], 0, 4), //  89
+    QCELP_OF(cbsign[10], 0, 1), //  85
+    QCELP_OF(cbgain[10], 0, 4), //  84
+    QCELP_OF(cindex[ 9], 0, 7), //  80
+    QCELP_OF(pgain [ 3], 0, 2), //  73
+    QCELP_OF(cindex[11], 0, 7), //  71
+    QCELP_OF(cbsign[11], 0, 1), //  64
+    QCELP_OF(cbgain[11], 0, 3), //  63
+    QCELP_OF(cindex[10], 4, 3), //  60
+    QCELP_OF(cindex[12], 0, 2), //  57
+    QCELP_OF(cbsign[12], 0, 1), //  55
+    QCELP_OF(cbgain[12], 0, 4), //  54
+    QCELP_OF(pfrac [ 3], 0, 1), //  50
+    QCELP_OF(plag  [ 3], 0, 7), //  49
+    QCELP_OF(pgain [ 3], 2, 1), //  42
+    QCELP_OF(cindex[13], 0, 6), //  41
+    QCELP_OF(cbsign[13], 0, 1), //  35
+    QCELP_OF(cbgain[13], 0, 4), //  34
+    QCELP_OF(cindex[12], 2, 5), //  30
+    QCELP_OF(cbgain[15], 0, 3), //  25
+    QCELP_OF(cindex[14], 0, 7), //  22
+    QCELP_OF(cbsign[14], 0, 1), //  15
+    QCELP_OF(cbgain[14], 0, 4), //  14
+    QCELP_OF(cindex[13], 6, 1), //  10
+    QCELP_OF(reserved,   0, 2), //   9
+    QCELP_OF(cindex[15], 0, 7), //   7
+    QCELP_OF(cbsign[15], 0, 1)  //   0
+};
+
+/**
+ * bitmap unpacking tables for RATE_HALF
+ *
+ * TIA/EIA/IS-733 Table 2.4.7.2-1
+ */
+static const QCELPBitmap qcelp_rate_half_bitmap[] = {
+                               // start on bit
+    QCELP_OF(lspv  [2], 0, 3), // 123
+    QCELP_OF(lspv  [1], 0, 7), // 120
+    QCELP_OF(lspv  [0], 0, 6), // 113
+    QCELP_OF(lspv  [4], 0, 6), // 107
+    QCELP_OF(lspv  [3], 0, 6), // 101
+    QCELP_OF(lspv  [2], 3, 4), //  95
+    QCELP_OF(cbsign[0], 0, 1), //  91
+    QCELP_OF(cbgain[0], 0, 4), //  90
+    QCELP_OF(pfrac [0], 0, 1), //  86
+    QCELP_OF(plag  [0], 0, 7), //  85
+    QCELP_OF(pgain [0], 0, 3), //  78
+    QCELP_OF(plag  [1], 0, 6), //  75
+    QCELP_OF(pgain [1], 0, 3), //  69
+    QCELP_OF(cindex[0], 0, 7), //  66
+    QCELP_OF(pgain [2], 0, 2), //  59
+    QCELP_OF(cindex[1], 0, 7), //  57
+    QCELP_OF(cbsign[1], 0, 1), //  50
+    QCELP_OF(cbgain[1], 0, 4), //  49
+    QCELP_OF(pfrac [1], 0, 1), //  45
+    QCELP_OF(plag  [1], 6, 1), //  44
+    QCELP_OF(cindex[2], 0, 2), //  43
+    QCELP_OF(cbsign[2], 0, 1), //  41
+    QCELP_OF(cbgain[2], 0, 4), //  40
+    QCELP_OF(pfrac [2], 0, 1), //  36
+    QCELP_OF(plag  [2], 0, 7), //  35
+    QCELP_OF(pgain [2], 2, 1), //  28
+    QCELP_OF(pfrac [3], 0, 1), //  27
+    QCELP_OF(plag  [3], 0, 7), //  26
+    QCELP_OF(pgain [3], 0, 3), //  19
+    QCELP_OF(cindex[2], 2, 5), //  16
+    QCELP_OF(cindex[3], 0, 7), //  11
+    QCELP_OF(cbsign[3], 0, 1), //   4
+    QCELP_OF(cbgain[3], 0, 4)  //   3
+};
+
+/**
+ * bitmap unpacking tables for RATE_QUARTER
+ *
+ * TIA/EIA/IS-733 Table 2.4.7.3-1
+ */
+static const QCELPBitmap qcelp_rate_quarter_bitmap[] = {
+                               // start on bit
+    QCELP_OF(lspv  [2], 0, 3), // 53
+    QCELP_OF(lspv  [1], 0, 7), // 50
+    QCELP_OF(lspv  [0], 0, 6), // 43
+    QCELP_OF(lspv  [4], 0, 6), // 37
+    QCELP_OF(lspv  [3], 0, 6), // 31
+    QCELP_OF(lspv  [2], 3, 4), // 25
+    QCELP_OF(cbgain[3], 0, 4), // 21
+    QCELP_OF(cbgain[2], 0, 4), // 17
+    QCELP_OF(cbgain[1], 0, 4), // 13
+    QCELP_OF(cbgain[0], 0, 4), //  9
+    QCELP_OF(reserved,  0, 2), //  5
+    QCELP_OF(cbgain[4], 0, 4)  //  3
+};
+
+/**
+ * bitmap unpacking tables for RATE_OCTAVE
+ *
+ * trick: CBSEED is written into QCELPContext.cbsign[15],
+ * which is not used for RATE_OCTAVE.
+ * CBSEED is only used to ensure the occurrence of random bit
+ * patterns in the 16 first bits that are used as the seed.
+ *
+ * TIA/EIA/IS-733 Table 2.4.7.4-1
+ */
+static const QCELPBitmap qcelp_rate_octave_bitmap[] = {
+                                // start on bit
+    QCELP_OF(cbsign[15], 3, 1), // 19
+    QCELP_OF(lspv   [0], 0, 1), // 18
+    QCELP_OF(lspv   [1], 0, 1), // 17
+    QCELP_OF(lspv   [2], 0, 1), // 16
+    QCELP_OF(cbsign[15], 2, 1), // 15
+    QCELP_OF(lspv   [3], 0, 1), // 14
+    QCELP_OF(lspv   [4], 0, 1), // 13
+    QCELP_OF(lspv   [5], 0, 1), // 12
+    QCELP_OF(cbsign[15], 1, 1), // 11
+    QCELP_OF(lspv   [6], 0, 1), // 10
+    QCELP_OF(lspv   [7], 0, 1), //  9
+    QCELP_OF(lspv   [8], 0, 1), //  8
+    QCELP_OF(cbsign[15], 0, 1), //  7
+    QCELP_OF(lspv   [9], 0, 1), //  6
+    QCELP_OF(cbgain [0], 0, 2), //  7
+    QCELP_OF(reserved,   0, 4)  //  3
+};
+
+/**
+ * position of the bitmapping data for each packet type in
+ * the QCELPContext
+ */
+static const QCELPBitmap * const qcelp_unpacking_bitmaps_per_rate[5] = {
+    NULL,                     ///!< for SILENCE rate
+    qcelp_rate_octave_bitmap,
+    qcelp_rate_quarter_bitmap,
+    qcelp_rate_half_bitmap,
+    qcelp_rate_full_bitmap,
+};
+
+static const uint16_t qcelp_bits_per_rate[5] = {
+    0, ///!< for SILENCE rate
+    FF_ARRAY_ELEMS(qcelp_rate_octave_bitmap),
+    FF_ARRAY_ELEMS(qcelp_rate_quarter_bitmap),
+    FF_ARRAY_ELEMS(qcelp_rate_half_bitmap),
+    FF_ARRAY_ELEMS(qcelp_rate_full_bitmap),
+};
+
 typedef uint16_t qcelp_vector[2];
 
 /**