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 "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