diff options
author | Kenan Gillet <kenan.gillet@gmail.com> | 2008-10-30 21:00:01 +0000 |
---|---|---|
committer | Vitor Sessak <vitor1001@gmail.com> | 2008-10-30 21:00:01 +0000 |
commit | 8c31f18bf9958d032486270a225849ba69b66365 (patch) | |
tree | 51de89e22e7cc31388d0fcc77d1ed643850aae69 | |
parent | 0e60e190193d91a1edac28f9b26ad754c946ffba (diff) | |
download | ffmpeg-8c31f18bf9958d032486270a225849ba69b66365.tar.gz |
More OKed parts of QCELP data tables
patch by Kenan Gillet, kenan.gillet gmail com
Originally committed as revision 15752 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/qcelpdata.h | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/libavcodec/qcelpdata.h b/libavcodec/qcelpdata.h index 2ea5610c81..c07c4e0dea 100644 --- a/libavcodec/qcelpdata.h +++ b/libavcodec/qcelpdata.h @@ -24,6 +24,222 @@ #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]; /** |