Mercurial > libavcodec.hg
annotate nellymoser.c @ 11352:6e0af2cfdcfe libavcodec
Do MC and IDCT in coding (hilbert) order
This increases the slice size to 64 pixels, due to having to decode an
entire chroma superblock row per slice.
This can be up to 6% slower depending on clip and CPU, but is necessary
for future optimizations that gain significantly more than was lost.
author | conrad |
---|---|
date | Wed, 03 Mar 2010 23:27:40 +0000 |
parents | 0dce4fe6e6f3 |
children | 7dd2a45249a9 |
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 "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 |