00001 /* 00002 * adaptive and fixed codebook vector operations for ACELP-based codecs 00003 * 00004 * Copyright (c) 2008 Vladimir Voroshilov 00005 * 00006 * This file is part of FFmpeg. 00007 * 00008 * FFmpeg is free software; you can redistribute it and/or 00009 * modify it under the terms of the GNU Lesser General Public 00010 * License as published by the Free Software Foundation; either 00011 * version 2.1 of the License, or (at your option) any later version. 00012 * 00013 * FFmpeg is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 * Lesser General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public 00019 * License along with FFmpeg; if not, write to the Free Software 00020 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00021 */ 00022 00023 #ifndef FFMPEG_ACELP_VECTORS_H 00024 #define FFMPEG_ACELP_VECTORS_H 00025 00026 #include <stdint.h> 00027 00028 /* 00029 * Track|Pulse| Positions 00030 * ------------------------------------------------------------------------- 00031 * 1 | 0 | 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75 00032 * ------------------------------------------------------------------------- 00033 * 2 | 1 | 1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56, 61, 66, 71, 76 00034 * ------------------------------------------------------------------------- 00035 * 3 | 2 | 2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77 00036 * ------------------------------------------------------------------------- 00037 * 00038 * Table contains only first the pulse indexes. 00039 * 00040 * Used in G.729 @8k, G.729 @4.4k, AMR @7.95k, AMR @7.40k 00041 */ 00042 extern const uint8_t ff_fc_4pulses_8bits_tracks_13[16]; 00043 00044 /* 00045 * Track|Pulse| Positions 00046 * ------------------------------------------------------------------------- 00047 * 4 | 3 | 3, 8, 13, 18, 23, 28, 33, 38, 43, 48, 53, 58, 63, 68, 73, 78 00048 * | | 4, 9, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59, 64, 69, 74, 79 00049 * ------------------------------------------------------------------------- 00050 * 00051 * \remark Track in the table should be read top-to-bottom, left-to-right. 00052 * 00053 * Used in G.729 @8k, G.729 @4.4k, AMR @7.95k, AMR @7.40k 00054 */ 00055 extern const uint8_t ff_fc_4pulses_8bits_track_4[32]; 00056 00057 /* 00058 * Track|Pulse| Positions 00059 * ----------------------------------------- 00060 * 1 | 0 | 1, 6, 11, 16, 21, 26, 31, 36 00061 * | | 3, 8, 13, 18, 23, 28, 33, 38 00062 * ----------------------------------------- 00063 * 00064 * \remark Track in the table should be read top-to-bottom, left-to-right. 00065 * 00066 * \note (EE) Reference G.729D code also uses gray decoding for each 00067 * pulse index before looking up the value in the table. 00068 * 00069 * Used in G.729 @6.4k (with gray coding), AMR @5.9k (without gray coding) 00070 */ 00071 extern const uint8_t ff_fc_2pulses_9bits_track1[16]; 00072 extern const uint8_t ff_fc_2pulses_9bits_track1_gray[16]; 00073 00074 /* 00075 * Track|Pulse| Positions 00076 * ----------------------------------------- 00077 * 2 | 1 | 0, 7, 14, 20, 27, 34, 1, 21 00078 * | | 2, 9, 15, 22, 29, 35, 6, 26 00079 * | | 4,10, 17, 24, 30, 37, 11, 31 00080 * | | 5,12, 19, 25, 32, 39, 16, 36 00081 * ----------------------------------------- 00082 * 00083 * \remark Track in the table should be read top-to-bottom, left-to-right. 00084 * 00085 * \note (EE.1) This table (from the reference code) does not comply with 00086 * the specification. 00087 * The specification contains the following table: 00088 * 00089 * Track|Pulse| Positions 00090 * ----------------------------------------- 00091 * 2 | 1 | 0, 5, 10, 15, 20, 25, 30, 35 00092 * | | 1, 6, 11, 16, 21, 26, 31, 36 00093 * | | 2, 7, 12, 17, 22, 27, 32, 37 00094 * | | 4, 9, 14, 19, 24, 29, 34, 39 00095 * 00096 * ----------------------------------------- 00097 * 00098 * \note (EE.2) Reference G.729D code also uses gray decoding for each 00099 * pulse index before looking up the value in the table. 00100 * 00101 * Used in G.729 @6.4k (with gray coding) 00102 */ 00103 extern const uint8_t ff_fc_2pulses_9bits_track2_gray[32]; 00104 00105 /** 00106 * \brief Decode fixed-codebook vector (3.8 and D.5.8 of G.729, 5.7.1 of AMR). 00107 * \param fc_v [out] decoded fixed codebook vector (2.13) 00108 * \param tab1 table used for first pulse_count pulses 00109 * \param tab2 table used for last pulse 00110 * \param pulse_indexes fixed codebook indexes 00111 * \param pulse_signs signs of the excitation pulses (0 bit value 00112 * means negative sign) 00113 * \param bits number of bits per one pulse index 00114 * \param pulse_count number of pulses decoded using first table 00115 * \param bits length of one pulse index in bits 00116 * 00117 * Used in G.729 @8k, G.729 @4.4k, G.729 @6.4k, AMR @7.95k, AMR @7.40k 00118 */ 00119 void ff_acelp_fc_pulse_per_track( 00120 int16_t* fc_v, 00121 const uint8_t *tab1, 00122 const uint8_t *tab2, 00123 int pulse_indexes, 00124 int pulse_signs, 00125 int pulse_count, 00126 int bits); 00127 00128 /** 00129 * \brief weighted sum of two vectors with rounding 00130 * \param out [out] result of addition 00131 * \param in_a first vector 00132 * \param in_b second vector 00133 * \param weight_coeff_a first vector weight coefficient 00134 * \param weight_coeff_a second vector weight coefficient 00135 * \param rounder this value will be added to the sum of the two vectors 00136 * \param shift result will be shifted to right by this value 00137 * \param length vectors length 00138 * 00139 * \note It is safe to pass the same buffer for out and in_a or in_b. 00140 * 00141 * out[i] = (in_a[i]*weight_a+in_b[i]*weight_b+rounder) >> shift 00142 */ 00143 void ff_acelp_weighted_vector_sum( 00144 int16_t* out, 00145 const int16_t *in_a, 00146 const int16_t *in_b, 00147 int16_t weight_coeff_a, 00148 int16_t weight_coeff_b, 00149 int16_t rounder, 00150 int shift, 00151 int length); 00152 00153 #endif /* FFMPEG_ACELP_VECTORS_H */
1.5.1