• 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 "libavutil/random.h"
00036 #include "avcodec.h"
00037 #include "dsputil.h"
00038 
00039 #define ALT_BITSTREAM_READER_LE
00040 #include "bitstream.h"
00041 
00042 const float ff_nelly_dequantization_table[127] = {
00043  0.0000000000,
00044 
00045 -0.8472560048, 0.7224709988,
00046 
00047 -1.5247479677,-0.4531480074, 0.3753609955, 1.4717899561,
00048 
00049 -1.9822579622,-1.1929379702,-0.5829370022,-0.0693780035, 0.3909569979, 0.9069200158, 1.4862740040, 2.2215409279,
00050 
00051 -2.3887870312,-1.8067539930,-1.4105420113,-1.0773609877,-0.7995010018,-0.5558109879,-0.3334020078,-0.1324490011,
00052  0.0568020009, 0.2548770010, 0.4773550034, 0.7386850119, 1.0443060398, 1.3954459429, 1.8098750114, 2.3918759823,
00053 
00054 -2.3893830776,-1.9884680510,-1.7514040470,-1.5643119812,-1.3922129869,-1.2164649963,-1.0469499826,-0.8905100226,
00055 -0.7645580173,-0.6454579830,-0.5259280205,-0.4059549868,-0.3029719889,-0.2096900046,-0.1239869967,-0.0479229987,
00056  0.0257730000, 0.1001340002, 0.1737180054, 0.2585540116, 0.3522900045, 0.4569880068, 0.5767750144, 0.7003160119,
00057  0.8425520062, 1.0093879700, 1.1821349859, 1.3534560204, 1.5320819616, 1.7332619429, 1.9722349644, 2.3978140354,
00058 
00059 -2.5756309032,-2.0573320389,-1.8984919786,-1.7727810144,-1.6662600040,-1.5742180347,-1.4993319511,-1.4316639900,
00060 -1.3652280569,-1.3000990152,-1.2280930281,-1.1588579416,-1.0921250582,-1.0135740042,-0.9202849865,-0.8287050128,
00061 -0.7374889851,-0.6447759867,-0.5590940118,-0.4857139885,-0.4110319912,-0.3459700048,-0.2851159871,-0.2341620028,
00062 -0.1870580018,-0.1442500055,-0.1107169986,-0.0739680007,-0.0365610011,-0.0073290002, 0.0203610007, 0.0479039997,
00063  0.0751969963, 0.0980999991, 0.1220389977, 0.1458999962, 0.1694349945, 0.1970459968, 0.2252430022, 0.2556869984,
00064  0.2870100141, 0.3197099864, 0.3525829911, 0.3889069855, 0.4334920049, 0.4769459963, 0.5204820037, 0.5644530058,
00065  0.6122040153, 0.6685929894, 0.7341650128, 0.8032159805, 0.8784040213, 0.9566209912, 1.0397069454, 1.1293770075,
00066  1.2211159468, 1.3080279827, 1.4024800062, 1.5056819916, 1.6227730513, 1.7724959850, 1.9430880547, 2.2903931141
00067 };
00068 
00069 const uint8_t ff_nelly_band_sizes_table[NELLY_BANDS] = {
00070 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 12, 14, 15
00071 };
00072 
00073 const uint16_t ff_nelly_init_table[64] = {
00074 3134, 5342, 6870, 7792, 8569, 9185, 9744, 10191, 10631, 11061, 11434, 11770,
00075 12116, 12513, 12925, 13300, 13674, 14027, 14352, 14716, 15117, 15477, 15824,
00076 16157, 16513, 16804, 17090, 17401, 17679, 17948, 18238, 18520, 18764, 19078,
00077 19381, 19640, 19921, 20205, 20500, 20813, 21162, 21465, 21794, 22137, 22453,
00078 22756, 23067, 23350, 23636, 23926, 24227, 24521, 24819, 25107, 25414, 25730,
00079 26120, 26497, 26895, 27344, 27877, 28463, 29426, 31355
00080 };
00081 
00082 const int16_t ff_nelly_delta_table[32] = {
00083 -11725, -9420, -7910, -6801, -5948, -5233, -4599, -4039, -3507, -3030, -2596,
00084 -2170, -1774, -1383, -1016, -660, -329, -1, 337, 696, 1085, 1512, 1962, 2433,
00085 2968, 3569, 4314, 5279, 6622, 8154, 10076, 12975
00086 };
00087 
00088 static inline int signed_shift(int i, int shift) {
00089     if (shift > 0)
00090         return i << shift;
00091     return i >> -shift;
00092 }
00093 
00094 static int sum_bits(short *buf, short shift, short off)
00095 {
00096     int i, ret = 0;
00097 
00098     for (i = 0; i < NELLY_FILL_LEN; i++) {
00099         int b = buf[i]-off;
00100         b = ((b>>(shift-1))+1)>>1;
00101         ret += av_clip(b, 0, NELLY_BIT_CAP);
00102     }
00103 
00104     return ret;
00105 }
00106 
00107 static int headroom(int *la)
00108 {
00109     int l;
00110     if (*la == 0) {
00111         return 31;
00112     }
00113     l = 30 - av_log2(FFABS(*la));
00114     *la <<= l;
00115     return l;
00116 }
00117 
00118 
00119 void ff_nelly_get_sample_bits(const float *buf, int *bits)
00120 {
00121     int i, j;
00122     short sbuf[128];
00123     int bitsum = 0, last_bitsum, small_bitsum, big_bitsum;
00124     short shift, shift_saved;
00125     int max, sum, last_off, tmp;
00126     int big_off, small_off;
00127     int off;
00128 
00129     max = 0;
00130     for (i = 0; i < NELLY_FILL_LEN; i++) {
00131         max = FFMAX(max, buf[i]);
00132     }
00133     shift = -16;
00134     shift += headroom(&max);
00135 
00136     sum = 0;
00137     for (i = 0; i < NELLY_FILL_LEN; i++) {
00138         sbuf[i] = signed_shift(buf[i], shift);
00139         sbuf[i] = (3*sbuf[i])>>2;
00140         sum += sbuf[i];
00141     }
00142 
00143     shift += 11;
00144     shift_saved = shift;
00145     sum -= NELLY_DETAIL_BITS << shift;
00146     shift += headroom(&sum);
00147     small_off = (NELLY_BASE_OFF * (sum>>16)) >> 15;
00148     shift = shift_saved - (NELLY_BASE_SHIFT+shift-31);
00149 
00150     small_off = signed_shift(small_off, shift);
00151 
00152     bitsum = sum_bits(sbuf, shift_saved, small_off);
00153 
00154     if (bitsum != NELLY_DETAIL_BITS) {
00155         off = bitsum - NELLY_DETAIL_BITS;
00156 
00157         for(shift=0; FFABS(off) <= 16383; shift++)
00158             off *= 2;
00159 
00160         off = (off * NELLY_BASE_OFF) >> 15;
00161         shift = shift_saved-(NELLY_BASE_SHIFT+shift-15);
00162 
00163         off = signed_shift(off, shift);
00164 
00165         for (j = 1; j < 20; j++) {
00166             last_off = small_off;
00167             small_off += off;
00168             last_bitsum = bitsum;
00169 
00170             bitsum = sum_bits(sbuf, shift_saved, small_off);
00171 
00172             if ((bitsum-NELLY_DETAIL_BITS) * (last_bitsum-NELLY_DETAIL_BITS) <= 0)
00173                 break;
00174         }
00175 
00176         if (bitsum > NELLY_DETAIL_BITS) {
00177             big_off = small_off;
00178             small_off = last_off;
00179             big_bitsum=bitsum;
00180             small_bitsum=last_bitsum;
00181         } else {
00182             big_off = last_off;
00183             big_bitsum=last_bitsum;
00184             small_bitsum=bitsum;
00185         }
00186 
00187         while (bitsum != NELLY_DETAIL_BITS && j <= 19) {
00188             off = (big_off+small_off)>>1;
00189             bitsum = sum_bits(sbuf, shift_saved, off);
00190             if (bitsum > NELLY_DETAIL_BITS) {
00191                 big_off=off;
00192                 big_bitsum=bitsum;
00193             } else {
00194                 small_off = off;
00195                 small_bitsum=bitsum;
00196             }
00197             j++;
00198         }
00199 
00200         if (abs(big_bitsum-NELLY_DETAIL_BITS) >=
00201             abs(small_bitsum-NELLY_DETAIL_BITS)) {
00202             bitsum = small_bitsum;
00203         } else {
00204             small_off = big_off;
00205             bitsum = big_bitsum;
00206         }
00207     }
00208 
00209     for (i = 0; i < NELLY_FILL_LEN; i++) {
00210         tmp = sbuf[i]-small_off;
00211         tmp = ((tmp>>(shift_saved-1))+1)>>1;
00212         bits[i] = av_clip(tmp, 0, NELLY_BIT_CAP);
00213     }
00214 
00215     if (bitsum > NELLY_DETAIL_BITS) {
00216         tmp = i = 0;
00217         while (tmp < NELLY_DETAIL_BITS) {
00218             tmp += bits[i];
00219             i++;
00220         }
00221 
00222         bits[i-1] -= tmp - NELLY_DETAIL_BITS;
00223         for(; i < NELLY_FILL_LEN; i++)
00224             bits[i] = 0;
00225     }
00226 }
00227 

Generated on Sat Feb 16 2013 09:23:13 for ffmpeg by  doxygen 1.7.1