Mercurial > libavcodec.hg
annotate nellymoser.c @ 12197:fbf4d5b1b664 libavcodec
Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than
regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag,
FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that
have been checked specifically on such CPUs and are actually faster than
their MMX counterparts.
In addition, use this flag to enable particular VP8 and LPC SSE2 functions
that are faster than their MMX counterparts.
Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author | rbultje |
---|---|
date | Mon, 19 Jul 2010 22:38:23 +0000 |
parents | 7dd2a45249a9 |
children |
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 /** |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
9428
diff
changeset
|
29 * @file |
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 "avcodec.h" |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
36 #include "dsputil.h" |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
37 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
38 #define ALT_BITSTREAM_READER_LE |
9428 | 39 #include "get_bits.h" |
7030
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
40 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
41 const float ff_nelly_dequantization_table[127] = { |
7705
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
42 0.0000000000, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
43 |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
44 -0.8472560048, 0.7224709988, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
45 |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
46 -1.5247479677,-0.4531480074, 0.3753609955, 1.4717899561, |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
47 |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
48 -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
|
49 |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
50 -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
|
51 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
|
52 |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
53 -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
|
54 -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
|
55 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
|
56 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
|
57 |
36b17ee44b76
Cosmetics (format ff_nelly_dequantization_table nicer)
michael
parents:
7216
diff
changeset
|
58 -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
|
59 -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
|
60 -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
|
61 -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
|
62 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
|
63 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
|
64 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
|
65 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
|
66 }; |
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 const uint8_t ff_nelly_band_sizes_table[NELLY_BANDS] = { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
69 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
|
70 }; |
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 const uint16_t ff_nelly_init_table[64] = { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
73 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
|
74 12116, 12513, 12925, 13300, 13674, 14027, 14352, 14716, 15117, 15477, 15824, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
75 16157, 16513, 16804, 17090, 17401, 17679, 17948, 18238, 18520, 18764, 19078, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
76 19381, 19640, 19921, 20205, 20500, 20813, 21162, 21465, 21794, 22137, 22453, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
77 22756, 23067, 23350, 23636, 23926, 24227, 24521, 24819, 25107, 25414, 25730, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
78 26120, 26497, 26895, 27344, 27877, 28463, 29426, 31355 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
79 }; |
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 const int16_t ff_nelly_delta_table[32] = { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
82 -11725, -9420, -7910, -6801, -5948, -5233, -4599, -4039, -3507, -3030, -2596, |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
83 -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
|
84 2968, 3569, 4314, 5279, 6622, 8154, 10076, 12975 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
85 }; |
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 static inline int signed_shift(int i, int shift) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
88 if (shift > 0) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
89 return i << shift; |
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 } |
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 static int sum_bits(short *buf, short shift, short off) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
94 { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
95 int i, ret = 0; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
96 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
97 for (i = 0; i < NELLY_FILL_LEN; i++) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
98 int b = buf[i]-off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
99 b = ((b>>(shift-1))+1)>>1; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
100 ret += av_clip(b, 0, NELLY_BIT_CAP); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
101 } |
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 return ret; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
104 } |
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 static int headroom(int *la) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
107 { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
108 int l; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
109 if (*la == 0) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
110 return 31; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
111 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
112 l = 30 - av_log2(FFABS(*la)); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
113 *la <<= l; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
114 return l; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
115 } |
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 void ff_nelly_get_sample_bits(const float *buf, int *bits) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
119 { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
120 int i, j; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
121 short sbuf[128]; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
122 int bitsum = 0, last_bitsum, small_bitsum, big_bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
123 short shift, shift_saved; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
124 int max, sum, last_off, tmp; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
125 int big_off, small_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
126 int off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
127 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
128 max = 0; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
129 for (i = 0; i < NELLY_FILL_LEN; i++) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
130 max = FFMAX(max, buf[i]); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
131 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
132 shift = -16; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
133 shift += headroom(&max); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
134 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
135 sum = 0; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
136 for (i = 0; i < NELLY_FILL_LEN; i++) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
137 sbuf[i] = signed_shift(buf[i], shift); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
138 sbuf[i] = (3*sbuf[i])>>2; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
139 sum += sbuf[i]; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
140 } |
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 shift += 11; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
143 shift_saved = shift; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
144 sum -= NELLY_DETAIL_BITS << shift; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
145 shift += headroom(&sum); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
146 small_off = (NELLY_BASE_OFF * (sum>>16)) >> 15; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
147 shift = shift_saved - (NELLY_BASE_SHIFT+shift-31); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
148 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
149 small_off = signed_shift(small_off, shift); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
150 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
151 bitsum = sum_bits(sbuf, shift_saved, small_off); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
152 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
153 if (bitsum != NELLY_DETAIL_BITS) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
154 off = bitsum - NELLY_DETAIL_BITS; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
155 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
156 for(shift=0; FFABS(off) <= 16383; shift++) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
157 off *= 2; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
158 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
159 off = (off * NELLY_BASE_OFF) >> 15; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
160 shift = shift_saved-(NELLY_BASE_SHIFT+shift-15); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
161 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
162 off = signed_shift(off, shift); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
163 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
164 for (j = 1; j < 20; j++) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
165 last_off = small_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
166 small_off += off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
167 last_bitsum = bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
168 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
169 bitsum = sum_bits(sbuf, shift_saved, small_off); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
170 |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
171 if ((bitsum-NELLY_DETAIL_BITS) * (last_bitsum-NELLY_DETAIL_BITS) <= 0) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
172 break; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
173 } |
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 if (bitsum > NELLY_DETAIL_BITS) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
176 big_off = small_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
177 small_off = last_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
178 big_bitsum=bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
179 small_bitsum=last_bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
180 } else { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
181 big_off = last_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
182 big_bitsum=last_bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
183 small_bitsum=bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
184 } |
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 while (bitsum != NELLY_DETAIL_BITS && j <= 19) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
187 off = (big_off+small_off)>>1; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
188 bitsum = sum_bits(sbuf, shift_saved, off); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
189 if (bitsum > NELLY_DETAIL_BITS) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
190 big_off=off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
191 big_bitsum=bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
192 } else { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
193 small_off = off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
194 small_bitsum=bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
195 } |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
196 j++; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
197 } |
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 if (abs(big_bitsum-NELLY_DETAIL_BITS) >= |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
200 abs(small_bitsum-NELLY_DETAIL_BITS)) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
201 bitsum = small_bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
202 } else { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
203 small_off = big_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
204 bitsum = big_bitsum; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
205 } |
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 for (i = 0; i < NELLY_FILL_LEN; i++) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
209 tmp = sbuf[i]-small_off; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
210 tmp = ((tmp>>(shift_saved-1))+1)>>1; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
211 bits[i] = av_clip(tmp, 0, NELLY_BIT_CAP); |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
212 } |
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 if (bitsum > NELLY_DETAIL_BITS) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
215 tmp = i = 0; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
216 while (tmp < NELLY_DETAIL_BITS) { |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
217 tmp += bits[i]; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
218 i++; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
219 } |
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 bits[i-1] -= tmp - NELLY_DETAIL_BITS; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
222 for(; i < NELLY_FILL_LEN; i++) |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
223 bits[i] = 0; |
40f18ff994f9
Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff
changeset
|
224 } |
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 |