• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

libavcodec/nellymoser.c

Go to the documentation of this file.
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 

Generated on Fri Sep 16 2011 17:17:41 for FFmpeg by  doxygen 1.7.1