Libav 0.7.1
|
00001 /* 00002 * Common code between Nellymoser encoder and decoder 00003 * Copyright (c) 2007 a840bda5870ba11f19698ff6eb9581dfb0f95fa5, 00004 * 539459aeb7d425140b62a3ec7dbf6dc8e408a306, and 00005 * 520e17cd55896441042b14df2566a6eb610ed444 00006 * Copyright (c) 2007 Loic Minier <lool at dooz.org> 00007 * Benjamin Larsson 00008 * 00009 * Permission is hereby granted, free of charge, to any person obtaining a 00010 * copy of this software and associated documentation files (the "Software"), 00011 * to deal in the Software without restriction, including without limitation 00012 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 00013 * and/or sell copies of the Software, and to permit persons to whom the 00014 * Software is furnished to do so, subject to the following conditions: 00015 * 00016 * The above copyright notice and this permission notice shall be included in 00017 * all copies or substantial portions of the Software. 00018 * 00019 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00020 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00021 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00022 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00023 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00024 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 00025 * DEALINGS IN THE SOFTWARE. 00026 */ 00027 00034 #include "nellymoser.h" 00035 #include "avcodec.h" 00036 #include "dsputil.h" 00037 00038 #define ALT_BITSTREAM_READER_LE 00039 #include "get_bits.h" 00040 00041 const float ff_nelly_dequantization_table[127] = { 00042 0.0000000000, 00043 00044 -0.8472560048, 0.7224709988, 00045 00046 -1.5247479677,-0.4531480074, 0.3753609955, 1.4717899561, 00047 00048 -1.9822579622,-1.1929379702,-0.5829370022,-0.0693780035, 0.3909569979, 0.9069200158, 1.4862740040, 2.2215409279, 00049 00050 -2.3887870312,-1.8067539930,-1.4105420113,-1.0773609877,-0.7995010018,-0.5558109879,-0.3334020078,-0.1324490011, 00051 0.0568020009, 0.2548770010, 0.4773550034, 0.7386850119, 1.0443060398, 1.3954459429, 1.8098750114, 2.3918759823, 00052 00053 -2.3893830776,-1.9884680510,-1.7514040470,-1.5643119812,-1.3922129869,-1.2164649963,-1.0469499826,-0.8905100226, 00054 -0.7645580173,-0.6454579830,-0.5259280205,-0.4059549868,-0.3029719889,-0.2096900046,-0.1239869967,-0.0479229987, 00055 0.0257730000, 0.1001340002, 0.1737180054, 0.2585540116, 0.3522900045, 0.4569880068, 0.5767750144, 0.7003160119, 00056 0.8425520062, 1.0093879700, 1.1821349859, 1.3534560204, 1.5320819616, 1.7332619429, 1.9722349644, 2.3978140354, 00057 00058 -2.5756309032,-2.0573320389,-1.8984919786,-1.7727810144,-1.6662600040,-1.5742180347,-1.4993319511,-1.4316639900, 00059 -1.3652280569,-1.3000990152,-1.2280930281,-1.1588579416,-1.0921250582,-1.0135740042,-0.9202849865,-0.8287050128, 00060 -0.7374889851,-0.6447759867,-0.5590940118,-0.4857139885,-0.4110319912,-0.3459700048,-0.2851159871,-0.2341620028, 00061 -0.1870580018,-0.1442500055,-0.1107169986,-0.0739680007,-0.0365610011,-0.0073290002, 0.0203610007, 0.0479039997, 00062 0.0751969963, 0.0980999991, 0.1220389977, 0.1458999962, 0.1694349945, 0.1970459968, 0.2252430022, 0.2556869984, 00063 0.2870100141, 0.3197099864, 0.3525829911, 0.3889069855, 0.4334920049, 0.4769459963, 0.5204820037, 0.5644530058, 00064 0.6122040153, 0.6685929894, 0.7341650128, 0.8032159805, 0.8784040213, 0.9566209912, 1.0397069454, 1.1293770075, 00065 1.2211159468, 1.3080279827, 1.4024800062, 1.5056819916, 1.6227730513, 1.7724959850, 1.9430880547, 2.2903931141 00066 }; 00067 00068 const uint8_t ff_nelly_band_sizes_table[NELLY_BANDS] = { 00069 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 12, 14, 15 00070 }; 00071 00072 const uint16_t ff_nelly_init_table[64] = { 00073 3134, 5342, 6870, 7792, 8569, 9185, 9744, 10191, 10631, 11061, 11434, 11770, 00074 12116, 12513, 12925, 13300, 13674, 14027, 14352, 14716, 15117, 15477, 15824, 00075 16157, 16513, 16804, 17090, 17401, 17679, 17948, 18238, 18520, 18764, 19078, 00076 19381, 19640, 19921, 20205, 20500, 20813, 21162, 21465, 21794, 22137, 22453, 00077 22756, 23067, 23350, 23636, 23926, 24227, 24521, 24819, 25107, 25414, 25730, 00078 26120, 26497, 26895, 27344, 27877, 28463, 29426, 31355 00079 }; 00080 00081 const int16_t ff_nelly_delta_table[32] = { 00082 -11725, -9420, -7910, -6801, -5948, -5233, -4599, -4039, -3507, -3030, -2596, 00083 -2170, -1774, -1383, -1016, -660, -329, -1, 337, 696, 1085, 1512, 1962, 2433, 00084 2968, 3569, 4314, 5279, 6622, 8154, 10076, 12975 00085 }; 00086 00087 static inline int signed_shift(int i, int shift) { 00088 if (shift > 0) 00089 return i << shift; 00090 return i >> -shift; 00091 } 00092 00093 static int sum_bits(short *buf, short shift, short off) 00094 { 00095 int i, ret = 0; 00096 00097 for (i = 0; i < NELLY_FILL_LEN; i++) { 00098 int b = buf[i]-off; 00099 b = ((b>>(shift-1))+1)>>1; 00100 ret += av_clip(b, 0, NELLY_BIT_CAP); 00101 } 00102 00103 return ret; 00104 } 00105 00106 static int headroom(int *la) 00107 { 00108 int l; 00109 if (*la == 0) { 00110 return 31; 00111 } 00112 l = 30 - av_log2(FFABS(*la)); 00113 *la <<= l; 00114 return l; 00115 } 00116 00117 00118 void ff_nelly_get_sample_bits(const float *buf, int *bits) 00119 { 00120 int i, j; 00121 short sbuf[128]; 00122 int bitsum = 0, last_bitsum, small_bitsum, big_bitsum; 00123 short shift, shift_saved; 00124 int max, sum, last_off, tmp; 00125 int big_off, small_off; 00126 int off; 00127 00128 max = 0; 00129 for (i = 0; i < NELLY_FILL_LEN; i++) { 00130 max = FFMAX(max, buf[i]); 00131 } 00132 shift = -16; 00133 shift += headroom(&max); 00134 00135 sum = 0; 00136 for (i = 0; i < NELLY_FILL_LEN; i++) { 00137 sbuf[i] = signed_shift(buf[i], shift); 00138 sbuf[i] = (3*sbuf[i])>>2; 00139 sum += sbuf[i]; 00140 } 00141 00142 shift += 11; 00143 shift_saved = shift; 00144 sum -= NELLY_DETAIL_BITS << shift; 00145 shift += headroom(&sum); 00146 small_off = (NELLY_BASE_OFF * (sum>>16)) >> 15; 00147 shift = shift_saved - (NELLY_BASE_SHIFT+shift-31); 00148 00149 small_off = signed_shift(small_off, shift); 00150 00151 bitsum = sum_bits(sbuf, shift_saved, small_off); 00152 00153 if (bitsum != NELLY_DETAIL_BITS) { 00154 off = bitsum - NELLY_DETAIL_BITS; 00155 00156 for(shift=0; FFABS(off) <= 16383; shift++) 00157 off *= 2; 00158 00159 off = (off * NELLY_BASE_OFF) >> 15; 00160 shift = shift_saved-(NELLY_BASE_SHIFT+shift-15); 00161 00162 off = signed_shift(off, shift); 00163 00164 for (j = 1; j < 20; j++) { 00165 last_off = small_off; 00166 small_off += off; 00167 last_bitsum = bitsum; 00168 00169 bitsum = sum_bits(sbuf, shift_saved, small_off); 00170 00171 if ((bitsum-NELLY_DETAIL_BITS) * (last_bitsum-NELLY_DETAIL_BITS) <= 0) 00172 break; 00173 } 00174 00175 if (bitsum > NELLY_DETAIL_BITS) { 00176 big_off = small_off; 00177 small_off = last_off; 00178 big_bitsum=bitsum; 00179 small_bitsum=last_bitsum; 00180 } else { 00181 big_off = last_off; 00182 big_bitsum=last_bitsum; 00183 small_bitsum=bitsum; 00184 } 00185 00186 while (bitsum != NELLY_DETAIL_BITS && j <= 19) { 00187 off = (big_off+small_off)>>1; 00188 bitsum = sum_bits(sbuf, shift_saved, off); 00189 if (bitsum > NELLY_DETAIL_BITS) { 00190 big_off=off; 00191 big_bitsum=bitsum; 00192 } else { 00193 small_off = off; 00194 small_bitsum=bitsum; 00195 } 00196 j++; 00197 } 00198 00199 if (abs(big_bitsum-NELLY_DETAIL_BITS) >= 00200 abs(small_bitsum-NELLY_DETAIL_BITS)) { 00201 bitsum = small_bitsum; 00202 } else { 00203 small_off = big_off; 00204 bitsum = big_bitsum; 00205 } 00206 } 00207 00208 for (i = 0; i < NELLY_FILL_LEN; i++) { 00209 tmp = sbuf[i]-small_off; 00210 tmp = ((tmp>>(shift_saved-1))+1)>>1; 00211 bits[i] = av_clip(tmp, 0, NELLY_BIT_CAP); 00212 } 00213 00214 if (bitsum > NELLY_DETAIL_BITS) { 00215 tmp = i = 0; 00216 while (tmp < NELLY_DETAIL_BITS) { 00217 tmp += bits[i]; 00218 i++; 00219 } 00220 00221 bits[i-1] -= tmp - NELLY_DETAIL_BITS; 00222 for(; i < NELLY_FILL_LEN; i++) 00223 bits[i] = 0; 00224 } 00225 } 00226