annotate nellymoser.c @ 8240:d3d0d9cc0e50 libavcodec

Commit last ok'ed parts of QCELP decoder and enable it. patch by Kenan Gillet, kenan.gillet gmail com
author vitor
date Tue, 02 Dec 2008 16:48:05 +0000
parents 36b17ee44b76
children e9d9d946f213
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 /**
40f18ff994f9 Separating from nellymoserdec.c parts required by encoder
bwolowiec
parents:
diff changeset
29 * @file nellymoser.c
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