Mercurial > libavcodec.hg
annotate nellymoser.c @ 9077:ad7fd7a40717 libavcodec
Do not read uninitialized buffer, no matter if it will be multiplied by
zero later. This should fix some valgrind warnings and hopefully FATE
ra144 test on ARM.
author | vitor |
---|---|
date | Sun, 01 Mar 2009 11:14:21 +0000 |
parents | e9d9d946f213 |
children | 460555ca9253 |
rev | line source |
---|---|
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
1 /* |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
2 * Common code between Nellymoser encoder and decoder |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
3 * Copyright (c) 2007 a840bda5870ba11f19698ff6eb9581dfb0f95fa5, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
4 * 539459aeb7d425140b62a3ec7dbf6dc8e408a306, and |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
5 * 520e17cd55896441042b14df2566a6eb610ed444 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
6 * Copyright (c) 2007 Loic Minier <lool at dooz.org> |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
7 * Benjamin Larsson |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
8 * |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
9 * Permission is hereby granted, free of charge, to any person obtaining a |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
10 * copy of this software and associated documentation files (the "Software"), |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
11 * to deal in the Software without restriction, including without limitation |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
13 * and/or sell copies of the Software, and to permit persons to whom the |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
14 * Software is furnished to do so, subject to the following conditions: |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
15 * |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
16 * The above copyright notice and this permission notice shall be included in |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
17 * all copies or substantial portions of the Software. |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
18 * |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
25 * DEALINGS IN THE SOFTWARE. |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
26 */ |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
27 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
28 /** |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
7705
diff
changeset
|
29 * @file libavcodec/nellymoser.c |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
30 * The 3 alphanumeric copyright notices are md5summed they are from the original |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
31 * implementors. The original code is available from http://code.google.com/p/nelly2pcm/ |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
32 */ |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
33 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
34 #include "nellymoser.h" |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
35 #include "libavutil/random.h" |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
36 #include "avcodec.h" |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
37 #include "dsputil.h" |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
38 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
39 #define ALT_BITSTREAM_READER_LE |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
40 #include "bitstream.h" |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
41 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
42 const float ff_nelly_dequantization_table[127] = { |
7705
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
43 0.0000000000, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
44 |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
45 -0.8472560048, 0.7224709988, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
46 |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
47 -1.5247479677,-0.4531480074, 0.3753609955, 1.4717899561, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
48 |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
49 -1.9822579622,-1.1929379702,-0.5829370022,-0.0693780035, 0.3909569979, 0.9069200158, 1.4862740040, 2.2215409279, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
50 |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
51 -2.3887870312,-1.8067539930,-1.4105420113,-1.0773609877,-0.7995010018,-0.5558109879,-0.3334020078,-0.1324490011, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
52 0.0568020009, 0.2548770010, 0.4773550034, 0.7386850119, 1.0443060398, 1.3954459429, 1.8098750114, 2.3918759823, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
53 |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
54 -2.3893830776,-1.9884680510,-1.7514040470,-1.5643119812,-1.3922129869,-1.2164649963,-1.0469499826,-0.8905100226, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
55 -0.7645580173,-0.6454579830,-0.5259280205,-0.4059549868,-0.3029719889,-0.2096900046,-0.1239869967,-0.0479229987, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
56 0.0257730000, 0.1001340002, 0.1737180054, 0.2585540116, 0.3522900045, 0.4569880068, 0.5767750144, 0.7003160119, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
57 0.8425520062, 1.0093879700, 1.1821349859, 1.3534560204, 1.5320819616, 1.7332619429, 1.9722349644, 2.3978140354, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
58 |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
59 -2.5756309032,-2.0573320389,-1.8984919786,-1.7727810144,-1.6662600040,-1.5742180347,-1.4993319511,-1.4316639900, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
60 -1.3652280569,-1.3000990152,-1.2280930281,-1.1588579416,-1.0921250582,-1.0135740042,-0.9202849865,-0.8287050128, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
61 -0.7374889851,-0.6447759867,-0.5590940118,-0.4857139885,-0.4110319912,-0.3459700048,-0.2851159871,-0.2341620028, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
62 -0.1870580018,-0.1442500055,-0.1107169986,-0.0739680007,-0.0365610011,-0.0073290002, 0.0203610007, 0.0479039997, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
63 0.0751969963, 0.0980999991, 0.1220389977, 0.1458999962, 0.1694349945, 0.1970459968, 0.2252430022, 0.2556869984, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
64 0.2870100141, 0.3197099864, 0.3525829911, 0.3889069855, 0.4334920049, 0.4769459963, 0.5204820037, 0.5644530058, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
65 0.6122040153, 0.6685929894, 0.7341650128, 0.8032159805, 0.8784040213, 0.9566209912, 1.0397069454, 1.1293770075, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
66 1.2211159468, 1.3080279827, 1.4024800062, 1.5056819916, 1.6227730513, 1.7724959850, 1.9430880547, 2.2903931141 |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
67 }; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
68 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
69 const uint8_t ff_nelly_band_sizes_table[NELLY_BANDS] = { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
70 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 12, 14, 15 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
71 }; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
72 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
73 const uint16_t ff_nelly_init_table[64] = { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
74 3134, 5342, 6870, 7792, 8569, 9185, 9744, 10191, 10631, 11061, 11434, 11770, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
75 12116, 12513, 12925, 13300, 13674, 14027, 14352, 14716, 15117, 15477, 15824, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
76 16157, 16513, 16804, 17090, 17401, 17679, 17948, 18238, 18520, 18764, 19078, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
77 19381, 19640, 19921, 20205, 20500, 20813, 21162, 21465, 21794, 22137, 22453, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
78 22756, 23067, 23350, 23636, 23926, 24227, 24521, 24819, 25107, 25414, 25730, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
79 26120, 26497, 26895, 27344, 27877, 28463, 29426, 31355 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
80 }; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
81 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
82 const int16_t ff_nelly_delta_table[32] = { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
83 -11725, -9420, -7910, -6801, -5948, -5233, -4599, -4039, -3507, -3030, -2596, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
84 -2170, -1774, -1383, -1016, -660, -329, -1, 337, 696, 1085, 1512, 1962, 2433, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
85 2968, 3569, 4314, 5279, 6622, 8154, 10076, 12975 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
86 }; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
87 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
88 static inline int signed_shift(int i, int shift) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
89 if (shift > 0) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
90 return i << shift; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
91 return i >> -shift; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
92 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
93 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
94 static int sum_bits(short *buf, short shift, short off) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
95 { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
96 int i, ret = 0; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
97 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
98 for (i = 0; i < NELLY_FILL_LEN; i++) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
99 int b = buf[i]-off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
100 b = ((b>>(shift-1))+1)>>1; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
101 ret += av_clip(b, 0, NELLY_BIT_CAP); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
102 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
103 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
104 return ret; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
105 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
106 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
107 static int headroom(int *la) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
108 { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
109 int l; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
110 if (*la == 0) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
111 return 31; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
112 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
113 l = 30 - av_log2(FFABS(*la)); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
114 *la <<= l; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
115 return l; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
116 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
117 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
118 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
119 void ff_nelly_get_sample_bits(const float *buf, int *bits) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
120 { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
121 int i, j; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
122 short sbuf[128]; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
123 int bitsum = 0, last_bitsum, small_bitsum, big_bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
124 short shift, shift_saved; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
125 int max, sum, last_off, tmp; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
126 int big_off, small_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
127 int off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
128 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
129 max = 0; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
130 for (i = 0; i < NELLY_FILL_LEN; i++) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
131 max = FFMAX(max, buf[i]); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
132 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
133 shift = -16; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
134 shift += headroom(&max); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
135 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
136 sum = 0; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
137 for (i = 0; i < NELLY_FILL_LEN; i++) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
138 sbuf[i] = signed_shift(buf[i], shift); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
139 sbuf[i] = (3*sbuf[i])>>2; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
140 sum += sbuf[i]; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
141 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
142 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
143 shift += 11; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
144 shift_saved = shift; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
145 sum -= NELLY_DETAIL_BITS << shift; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
146 shift += headroom(&sum); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
147 small_off = (NELLY_BASE_OFF * (sum>>16)) >> 15; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
148 shift = shift_saved - (NELLY_BASE_SHIFT+shift-31); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
149 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
150 small_off = signed_shift(small_off, shift); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
151 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
152 bitsum = sum_bits(sbuf, shift_saved, small_off); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
153 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
154 if (bitsum != NELLY_DETAIL_BITS) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
155 off = bitsum - NELLY_DETAIL_BITS; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
156 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
157 for(shift=0; FFABS(off) <= 16383; shift++) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
158 off *= 2; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
159 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
160 off = (off * NELLY_BASE_OFF) >> 15; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
161 shift = shift_saved-(NELLY_BASE_SHIFT+shift-15); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
162 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
163 off = signed_shift(off, shift); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
164 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
165 for (j = 1; j < 20; j++) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
166 last_off = small_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
167 small_off += off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
168 last_bitsum = bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
169 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
170 bitsum = sum_bits(sbuf, shift_saved, small_off); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
171 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
172 if ((bitsum-NELLY_DETAIL_BITS) * (last_bitsum-NELLY_DETAIL_BITS) <= 0) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
173 break; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
174 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
175 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
176 if (bitsum > NELLY_DETAIL_BITS) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
177 big_off = small_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
178 small_off = last_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
179 big_bitsum=bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
180 small_bitsum=last_bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
181 } else { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
182 big_off = last_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
183 big_bitsum=last_bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
184 small_bitsum=bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
185 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
186 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
187 while (bitsum != NELLY_DETAIL_BITS && j <= 19) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
188 off = (big_off+small_off)>>1; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
189 bitsum = sum_bits(sbuf, shift_saved, off); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
190 if (bitsum > NELLY_DETAIL_BITS) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
191 big_off=off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
192 big_bitsum=bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
193 } else { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
194 small_off = off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
195 small_bitsum=bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
196 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
197 j++; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
198 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
199 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
200 if (abs(big_bitsum-NELLY_DETAIL_BITS) >= |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
201 abs(small_bitsum-NELLY_DETAIL_BITS)) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
202 bitsum = small_bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
203 } else { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
204 small_off = big_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
205 bitsum = big_bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
206 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
207 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
208 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
209 for (i = 0; i < NELLY_FILL_LEN; i++) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
210 tmp = sbuf[i]-small_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
211 tmp = ((tmp>>(shift_saved-1))+1)>>1; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
212 bits[i] = av_clip(tmp, 0, NELLY_BIT_CAP); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
213 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
214 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
215 if (bitsum > NELLY_DETAIL_BITS) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
216 tmp = i = 0; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
217 while (tmp < NELLY_DETAIL_BITS) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
218 tmp += bits[i]; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
219 i++; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
220 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
221 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
222 bits[i-1] -= tmp - NELLY_DETAIL_BITS; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
223 for(; i < NELLY_FILL_LEN; i++) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
224 bits[i] = 0; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
225 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
226 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
227 |