#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];
/**