annotate nellymoserdec.c @ 5867:67e62f3367e0 libavcodec

move adx.c to adxdec.c
author aurel
date Thu, 01 Nov 2007 18:40:42 +0000
parents fd8b56703750
children a03b4172939c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
1 /*
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
2 * NellyMoser audio decoder
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
3 * Copyright (c) 2007 a840bda5870ba11f19698ff6eb9581dfb0f95fa5,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
4 * 539459aeb7d425140b62a3ec7dbf6dc8e408a306, and
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
5 * 520e17cd55896441042b14df2566a6eb610ed444
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
6 * Copyright (c) 2007 Loic Minier <lool at dooz.org>
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
7 * Benjamin Larsson
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
8 *
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
9 * Permission is hereby granted, free of charge, to any person obtaining a
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
10 * copy of this software and associated documentation files (the "Software"),
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
11 * to deal in the Software without restriction, including without limitation
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
13 * and/or sell copies of the Software, and to permit persons to whom the
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
14 * Software is furnished to do so, subject to the following conditions:
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
15 *
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
16 * The above copyright notice and this permission notice shall be included in
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
17 * all copies or substantial portions of the Software.
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
18 *
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
25 * DEALINGS IN THE SOFTWARE.
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
26 */
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
27
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
28 /**
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
29 * @file nellymoserdec.c
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
30 * The 3 alphanumeric copyright notices are md5summed they are from the original
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
31 * implementors. The original code is available from http://code.google.com/p/nelly2pcm/
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
32 */
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
33 #include "avcodec.h"
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
34 #include "random.h"
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
35 #include "dsputil.h"
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
36
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
37 #define ALT_BITSTREAM_READER_LE
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
38 #include "bitstream.h"
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
39
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
40 #define NELLY_BANDS 23
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
41 #define NELLY_BLOCK_LEN 64
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
42 #define NELLY_HEADER_BITS 116
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
43 #define NELLY_DETAIL_BITS 198
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
44 #define NELLY_BUF_LEN 128
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
45 #define NELLY_FILL_LEN 124
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
46 #define NELLY_BIT_CAP 6
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
47 #define NELLY_BASE_OFF 4228
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
48 #define NELLY_BASE_SHIFT 19
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
49 #define NELLY_SAMPLES 256
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
50
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
51 static const float dequantization_table[127] = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
52 0.0000000000,-0.8472560048, 0.7224709988, -1.5247479677, -0.4531480074, 0.3753609955, 1.4717899561,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
53 -1.9822579622, -1.1929379702, -0.5829370022, -0.0693780035, 0.3909569979,0.9069200158, 1.4862740040,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
54 2.2215409279, -2.3887870312, -1.8067539930, -1.4105420113, -1.0773609877, -0.7995010018,-0.5558109879,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
55 -0.3334020078, -0.1324490011, 0.0568020009, 0.2548770010, 0.4773550034, 0.7386850119, 1.0443060398,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
56 1.3954459429, 1.8098750114, 2.3918759823,-2.3893830776, -1.9884680510, -1.7514040470, -1.5643119812,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
57 -1.3922129869,-1.2164649963, -1.0469499826, -0.8905100226, -0.7645580173, -0.6454579830, -0.5259280205,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
58 -0.4059549868, -0.3029719889, -0.2096900046, -0.1239869967, -0.0479229987, 0.0257730000, 0.1001340002,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
59 0.1737180054, 0.2585540116, 0.3522900045, 0.4569880068, 0.5767750144, 0.7003160119, 0.8425520062,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
60 1.0093879700, 1.1821349859, 1.3534560204, 1.5320819616, 1.7332619429, 1.9722349644, 2.3978140354,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
61 -2.5756309032, -2.0573320389, -1.8984919786, -1.7727810144, -1.6662600040, -1.5742180347, -1.4993319511,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
62 -1.4316639900, -1.3652280569, -1.3000990152, -1.2280930281, -1.1588579416, -1.0921250582, -1.0135740042,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
63 -0.9202849865, -0.8287050128, -0.7374889851, -0.6447759867, -0.5590940118, -0.4857139885, -0.4110319912,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
64 -0.3459700048, -0.2851159871, -0.2341620028, -0.1870580018, -0.1442500055, -0.1107169986, -0.0739680007,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
65 -0.0365610011, -0.0073290002, 0.0203610007, 0.0479039997, 0.0751969963, 0.0980999991, 0.1220389977,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
66 0.1458999962, 0.1694349945, 0.1970459968, 0.2252430022, 0.2556869984, 0.2870100141, 0.3197099864,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
67 0.3525829911, 0.3889069855, 0.4334920049, 0.4769459963, 0.5204820037, 0.5644530058, 0.6122040153,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
68 0.6685929894, 0.7341650128, 0.8032159805, 0.8784040213, 0.9566209912, 1.0397069454, 1.1293770075,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
69 1.2211159468, 1.3080279827, 1.4024800062, 1.5056819916, 1.6227730513, 1.7724959850, 1.9430880547,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
70 2.2903931141
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
71 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
72
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
73 static const uint8_t nelly_band_sizes_table[NELLY_BANDS] = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
74 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 12, 14, 15
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
75 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
76
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
77 static const uint16_t nelly_init_table[64] = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
78 3134, 5342, 6870, 7792, 8569, 9185, 9744, 10191, 10631, 11061, 11434, 11770,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
79 12116, 12513, 12925, 13300, 13674, 14027, 14352, 14716, 15117, 15477, 15824,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
80 16157, 16513, 16804, 17090, 17401, 17679, 17948, 18238, 18520, 18764, 19078,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
81 19381, 19640, 19921, 20205, 20500, 20813, 21162, 21465, 21794, 22137, 22453,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
82 22756, 23067, 23350, 23636, 23926, 24227, 24521, 24819, 25107, 25414, 25730,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
83 26120, 26497, 26895, 27344, 27877, 28463, 29426, 31355
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
84 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
85
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
86 static const int16_t nelly_delta_table[32] = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
87 -11725, -9420, -7910, -6801, -5948, -5233, -4599, -4039, -3507, -3030, -2596,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
88 -2170, -1774, -1383, -1016, -660, -329, -1, 337, 696, 1085, 1512, 1962, 2433,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
89 2968, 3569, 4314, 5279, 6622, 8154, 10076, 12975
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
90 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
91
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
92 typedef struct NellyMoserDecodeContext {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
93 AVCodecContext* avctx;
5838
fd8b56703750 Unaligned memory access rcrash fix
banan
parents: 5823
diff changeset
94 DECLARE_ALIGNED_16(float,float_buf[NELLY_SAMPLES]);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
95 float state[64];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
96 AVRandomState random_state;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
97 GetBitContext gb;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
98 int add_bias;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
99 int scale_bias;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
100 DSPContext dsp;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
101 FFTContext fftc;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
102 } NellyMoserDecodeContext;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
103
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
104
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
105 DECLARE_ALIGNED_16(float,sine_window[128]);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
106 DECLARE_ALIGNED_16(float,tcos[64]);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
107 DECLARE_ALIGNED_16(float,tsin[64]);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
108 DECLARE_ALIGNED_16(float,cos_tab[64]);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
109
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
110 static inline int signed_shift(int i, int shift) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
111 if (shift > 0)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
112 return i << shift;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
113 return i >> -shift;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
114 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
115
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
116 static void antialias(float *buf, float *audio)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
117 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
118 int i, end, mid_hi, mid_lo;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
119
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
120 end = NELLY_BUF_LEN-1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
121 mid_hi = NELLY_BUF_LEN/2;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
122 mid_lo = mid_hi-1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
123
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
124 for (i = 0; i < NELLY_BUF_LEN/4; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
125 audio[2*i] = buf[2*i ]*tcos[i ] - buf[end-2*i]*tsin[i];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
126 audio[2*i+1] = -(buf[end-2*i ]*tcos[i ] + buf[2*i ]*tsin[i]);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
127 audio[end-2*i-1]= buf[end-2*i-1]*tcos[mid_lo-i] - buf[2*i+1 ]*tsin[mid_lo-i];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
128 audio[end-2*i ]= -(buf[2*i+1 ]*tcos[mid_lo-i] + buf[end-2*i]*tsin[mid_lo-i]);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
129 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
130 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
131
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
132 static void complex2signal(float *audio)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
133 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
134 int i, end, mid_hi, mid_lo;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
135 float *aptr, *sigptr, a, b, c, d, e, f, g;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
136
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
137 end = NELLY_BUF_LEN-1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
138 mid_hi = NELLY_BUF_LEN/2;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
139 mid_lo = mid_hi-1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
140
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
141 a = -audio[end];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
142 b = audio[end-1];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
143 c = -audio[1];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
144 d = cos_tab[0];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
145 e = audio[0];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
146 f = cos_tab[mid_lo];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
147 g = cos_tab[1];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
148
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
149 audio[0] = d*e;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
150 audio[1] = b*g-a*f;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
151 audio[end-1] = a*g+b*f;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
152 audio[end] = c*(-d);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
153
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
154 aptr = audio+end-2;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
155 sigptr = cos_tab+mid_hi-1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
156
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
157 for (i = 3; i < NELLY_BUF_LEN/2; i += 2) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
158 a = audio[i-1];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
159 b = -audio[i];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
160 c = cos_tab[i/2];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
161 d = *sigptr;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
162 e = *(aptr-1);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
163 f = -(*aptr);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
164
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
165 audio[i-1] = a*c+b*d;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
166 *aptr = a*d-b*c;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
167
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
168 a = cos_tab[(i/2)+1];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
169 b = *(sigptr-1);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
170
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
171 *(aptr-1) = b*e+a*f;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
172 audio[i] = a*e-b*f;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
173
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
174 sigptr--;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
175 aptr -= 2;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
176 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
177 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
178
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
179 static void overlap_and_window(NellyMoserDecodeContext *s, float *state, float *audio)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
180 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
181 int bot, mid_up, mid_down, top;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
182 float s_bot, s_top;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
183
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
184 bot = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
185 top = NELLY_BUF_LEN-1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
186 mid_up = NELLY_BUF_LEN/2;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
187 mid_down = (NELLY_BUF_LEN/2)-1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
188
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
189 while (bot < NELLY_BUF_LEN/4) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
190 s_bot = audio[bot];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
191 s_top = audio[top];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
192 audio[bot] = (audio[mid_up]*sine_window[bot]-state[bot ]*sine_window[top])/s->scale_bias + s->add_bias;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
193 audio[top] = (-state[bot ]*sine_window[bot]-audio[mid_up]*sine_window[top])/s->scale_bias + s->add_bias;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
194 state[bot] = audio[mid_down];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
195
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
196 audio[mid_down] = (s_top *sine_window[mid_down]-state[mid_down]*sine_window[mid_up])/s->scale_bias + s->add_bias;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
197 audio[mid_up ] = (-state[mid_down]*sine_window[mid_down]-s_top *sine_window[mid_up])/s->scale_bias + s->add_bias;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
198 state[mid_down] = s_bot;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
199
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
200 bot++;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
201 mid_up++;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
202 mid_down--;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
203 top--;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
204 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
205 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
206
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
207 static int sum_bits(short *buf, short shift, short off)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
208 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
209 int b, i = 0, ret = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
210
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
211 for (i = 0; i < NELLY_FILL_LEN; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
212 b = buf[i]-off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
213 b = ((b>>(shift-1))+1)>>1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
214 ret += av_clip(b, 0, NELLY_BIT_CAP);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
215 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
216
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
217 return ret;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
218 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
219
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
220 static int headroom(int *la)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
221 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
222 int l;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
223 if (*la == 0) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
224 return 31;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
225 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
226 l = 30 - av_log2(FFABS(*la));
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
227 *la <<= l;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
228 return l;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
229 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
230
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
231
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
232 static void get_sample_bits(float *buf, int *bits)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
233 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
234 int i, j;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
235 short sbuf[128];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
236 int bitsum = 0, last_bitsum, small_bitsum, big_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
237 short shift, shift_saved;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
238 int max, sum, last_off, tmp;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
239 int big_off, small_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
240 int off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
241
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
242 max = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
243 for (i = 0; i < NELLY_FILL_LEN; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
244 max = FFMAX(max, buf[i]);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
245 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
246 shift = -16;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
247 shift += headroom(&max);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
248
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
249 sum = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
250 for (i = 0; i < NELLY_FILL_LEN; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
251 sbuf[i] = signed_shift(buf[i], shift);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
252 sbuf[i] = (3*sbuf[i])>>2;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
253 sum += sbuf[i];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
254 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
255
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
256 shift += 11;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
257 shift_saved = shift;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
258 sum -= NELLY_DETAIL_BITS << shift;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
259 shift += headroom(&sum);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
260 small_off = (NELLY_BASE_OFF * (sum>>16)) >> 15;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
261 shift = shift_saved - (NELLY_BASE_SHIFT+shift-31);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
262
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
263 small_off = signed_shift(small_off, shift);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
264
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
265 bitsum = sum_bits(sbuf, shift_saved, small_off);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
266
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
267 if (bitsum != NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
268 shift = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
269 off = bitsum - NELLY_DETAIL_BITS;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
270
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
271 for(shift=0; FFABS(off) <= 16383; shift++)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
272 off *= 2;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
273
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
274 off = (off * NELLY_BASE_OFF) >> 15;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
275 shift = shift_saved-(NELLY_BASE_SHIFT+shift-15);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
276
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
277 off = signed_shift(off, shift);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
278
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
279 for (j = 1; j < 20; j++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
280 last_off = small_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
281 small_off += off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
282 last_bitsum = bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
283
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
284 bitsum = sum_bits(sbuf, shift_saved, small_off);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
285
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
286 if ((bitsum-NELLY_DETAIL_BITS) * (last_bitsum-NELLY_DETAIL_BITS) <= 0)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
287 break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
288 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
289
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
290 if (bitsum > NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
291 big_off = small_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
292 small_off = last_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
293 big_bitsum=bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
294 small_bitsum=last_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
295 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
296 big_off = last_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
297 big_bitsum=last_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
298 small_bitsum=bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
299 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
300
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
301 while (bitsum != NELLY_DETAIL_BITS && j <= 19) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
302 off = (big_off+small_off)>>1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
303 bitsum = sum_bits(sbuf, shift_saved, off);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
304 if (bitsum > NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
305 big_off=off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
306 big_bitsum=bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
307 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
308 small_off = off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
309 small_bitsum=bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
310 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
311 j++;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
312 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
313
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
314 if (abs(big_bitsum-NELLY_DETAIL_BITS) >=
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
315 abs(small_bitsum-NELLY_DETAIL_BITS)) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
316 bitsum = small_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
317 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
318 small_off = big_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
319 bitsum = big_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
320 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
321 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
322
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
323 for (i = 0; i < NELLY_FILL_LEN; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
324 tmp = sbuf[i]-small_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
325 tmp = ((tmp>>(shift_saved-1))+1)>>1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
326 bits[i] = av_clip(tmp, 0, NELLY_BIT_CAP);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
327 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
328
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
329 if (bitsum > NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
330 tmp = i = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
331 while (tmp < NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
332 tmp += bits[i];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
333 i++;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
334 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
335
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
336 bits[i-1] -= tmp - NELLY_DETAIL_BITS;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
337 for(; i < NELLY_FILL_LEN; i++)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
338 bits[i] = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
339 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
340 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
341
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
342 void nelly_decode_block(NellyMoserDecodeContext *s, unsigned char block[NELLY_BLOCK_LEN], float audio[NELLY_SAMPLES])
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
343 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
344 int i,j;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
345 float buf[NELLY_BUF_LEN], pows[NELLY_BUF_LEN];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
346 float *aptr, *bptr, *pptr, val, pval;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
347 int bits[NELLY_BUF_LEN];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
348 unsigned char v;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
349
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
350 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
351
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
352 bptr = buf;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
353 pptr = pows;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
354 val = nelly_init_table[get_bits(&s->gb, 6)];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
355 for (i=0 ; i<NELLY_BANDS ; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
356 if (i > 0)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
357 val += nelly_delta_table[get_bits(&s->gb, 5)];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
358 pval = pow(2, val/2048);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
359 for (j = 0; j < nelly_band_sizes_table[i]; j++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
360 *bptr++ = val;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
361 *pptr++ = pval;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
362 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
363
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
364 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
365
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
366 memset(&buf[NELLY_FILL_LEN],0,4*sizeof(float));
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
367 memset(&pows[NELLY_FILL_LEN],0,4*sizeof(float));
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
368
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
369 get_sample_bits(buf, bits);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
370
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
371 for (i = 0; i < 2; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
372 aptr = audio+i*128;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
373 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
374 skip_bits(&s->gb, NELLY_HEADER_BITS + i*NELLY_DETAIL_BITS);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
375
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
376 for (j = 0; j < NELLY_FILL_LEN; j++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
377 if (bits[j] <= 0) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
378 buf[j] = M_SQRT1_2*pows[j];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
379 if (av_random(&s->random_state) & 1)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
380 buf[j] *= -1.0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
381 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
382 v = get_bits(&s->gb, bits[j]);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
383 buf[j] = dequantization_table[(1<<bits[j])-1+v]*pows[j];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
384 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
385 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
386
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
387 antialias(buf, aptr);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
388 ff_fft_permute(&s->fftc, (FFTComplex*)aptr);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
389 ff_fft_calc(&s->fftc, (FFTComplex*)aptr);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
390 complex2signal(aptr);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
391 overlap_and_window(s, s->state, aptr);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
392 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
393 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
394
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
395 static int decode_init(AVCodecContext * avctx) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
396 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
397 int i;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
398 float alpha;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
399
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
400 s->avctx = avctx;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
401 av_init_random(0, &s->random_state);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
402 ff_fft_init(&s->fftc, 6, 1);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
403 dsputil_init(&s->dsp, avctx);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
404
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
405 if(s->dsp.float_to_int16 == ff_float_to_int16_c) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
406 s->add_bias = 385;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
407 s->scale_bias = 32768;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
408 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
409 s->add_bias = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
410 s->scale_bias = 1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
411 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
412
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
413 /* Generate overlap window */
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
414 if (!sine_window[0])
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
415 for (i=0 ; i<128; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
416 sine_window[i] = sin((i + 0.5) / 256.0 * M_PI);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
417 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
418
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
419 /* Generate tables */
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
420 if (!tcos[0])
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
421 for(i=0;i<64;i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
422 alpha = 2*M_PI * (i + 1.0 / 4.0) / 256;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
423 tcos[i] = cos(alpha);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
424 tsin[i] = -sin(alpha);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
425 cos_tab[i] = cos(i/128.0*M_PI)/8.0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
426 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
427
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
428 return 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
429 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
430
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
431 static int decode_tag(AVCodecContext * avctx,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
432 void *data, int *data_size,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
433 uint8_t * buf, int buf_size) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
434 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
435 int blocks, i;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
436 int16_t* samples;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
437 *data_size = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
438 samples = (int16_t*)data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
439
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
440 if (buf_size < avctx->block_align)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
441 return buf_size;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
442
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
443 switch (buf_size) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
444 case 64: // 8000Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
445 blocks = 1; break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
446 case 128: // 11025Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
447 blocks = 2; break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
448 case 256: // 22050Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
449 blocks = 4; break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
450 default:
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
451 av_log(avctx, AV_LOG_DEBUG, "Tag size %d unknown, report sample!\n", buf_size);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
452 return buf_size;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
453 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
454
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
455 for (i=0 ; i<blocks ; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
456 nelly_decode_block(s, &buf[i*NELLY_BLOCK_LEN], s->float_buf);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
457 s->dsp.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
458 *data_size += NELLY_SAMPLES*sizeof(int16_t);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
459 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
460
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
461 return blocks*NELLY_SAMPLES*sizeof(int16_t);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
462 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
463
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
464 static int decode_end(AVCodecContext * avctx) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
465 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
466
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
467 ff_fft_end(&s->fftc);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
468 return 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
469 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
470
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
471 AVCodec nellymoser_decoder = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
472 "nellymoser",
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
473 CODEC_TYPE_AUDIO,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
474 CODEC_ID_NELLYMOSER,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
475 sizeof(NellyMoserDecodeContext),
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
476 decode_init,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
477 NULL,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
478 decode_end,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
479 decode_tag,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
480 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
481