00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
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