annotate nellymoserdec.c @ 5915:4528d63fbc8e libavcodec

Fix nellymoser decode_tag return value, patch by Stefano Sabatini
author banan
date Wed, 14 Nov 2007 08:22:15 +0000
parents ce9415dd447a
children 353fca09cb72
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
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
49 #define NELLY_SAMPLES (2 * NELLY_BUF_LEN)
5823
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;
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
101 MDCTContext imdct_ctx;
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
102 DECLARE_ALIGNED_16(float,imdct_tmp[NELLY_BUF_LEN]);
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
103 DECLARE_ALIGNED_16(float,imdct_out[NELLY_BUF_LEN * 2]);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
104 } NellyMoserDecodeContext;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
105
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
106 DECLARE_ALIGNED_16(float,sine_window[128]);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
107
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
108 static inline int signed_shift(int i, int shift) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
109 if (shift > 0)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
110 return i << shift;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
111 return i >> -shift;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
112 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
113
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
114 static void overlap_and_window(NellyMoserDecodeContext *s, float *state, float *audio)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
115 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
116 int bot, mid_up, mid_down, top;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
117 float s_bot, s_top;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
118
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
119 bot = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
120 top = NELLY_BUF_LEN-1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
121 mid_up = NELLY_BUF_LEN/2;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
122 mid_down = (NELLY_BUF_LEN/2)-1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
123
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
124 while (bot < NELLY_BUF_LEN/4) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
125 s_bot = audio[bot];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
126 s_top = audio[top];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
127 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
128 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
129 state[bot] = audio[mid_down];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
130
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
131 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
132 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
133 state[mid_down] = s_bot;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
134
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
135 bot++;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
136 mid_up++;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
137 mid_down--;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
138 top--;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
139 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
140 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
141
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
142 static int sum_bits(short *buf, short shift, short off)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
143 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
144 int b, i = 0, ret = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
145
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
146 for (i = 0; i < NELLY_FILL_LEN; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
147 b = buf[i]-off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
148 b = ((b>>(shift-1))+1)>>1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
149 ret += av_clip(b, 0, NELLY_BIT_CAP);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
150 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
151
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
152 return ret;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
153 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
154
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
155 static int headroom(int *la)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
156 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
157 int l;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
158 if (*la == 0) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
159 return 31;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
160 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
161 l = 30 - av_log2(FFABS(*la));
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
162 *la <<= l;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
163 return l;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
164 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
165
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
166
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
167 static void get_sample_bits(const float *buf, int *bits)
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
168 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
169 int i, j;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
170 short sbuf[128];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
171 int bitsum = 0, last_bitsum, small_bitsum, big_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
172 short shift, shift_saved;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
173 int max, sum, last_off, tmp;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
174 int big_off, small_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
175 int off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
176
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
177 max = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
178 for (i = 0; i < NELLY_FILL_LEN; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
179 max = FFMAX(max, buf[i]);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
180 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
181 shift = -16;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
182 shift += headroom(&max);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
183
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
184 sum = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
185 for (i = 0; i < NELLY_FILL_LEN; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
186 sbuf[i] = signed_shift(buf[i], shift);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
187 sbuf[i] = (3*sbuf[i])>>2;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
188 sum += sbuf[i];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
189 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
190
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
191 shift += 11;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
192 shift_saved = shift;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
193 sum -= NELLY_DETAIL_BITS << shift;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
194 shift += headroom(&sum);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
195 small_off = (NELLY_BASE_OFF * (sum>>16)) >> 15;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
196 shift = shift_saved - (NELLY_BASE_SHIFT+shift-31);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
197
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
198 small_off = signed_shift(small_off, shift);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
199
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
200 bitsum = sum_bits(sbuf, shift_saved, small_off);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
201
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
202 if (bitsum != NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
203 shift = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
204 off = bitsum - NELLY_DETAIL_BITS;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
205
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
206 for(shift=0; FFABS(off) <= 16383; shift++)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
207 off *= 2;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
208
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
209 off = (off * NELLY_BASE_OFF) >> 15;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
210 shift = shift_saved-(NELLY_BASE_SHIFT+shift-15);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
211
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
212 off = signed_shift(off, shift);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
213
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
214 for (j = 1; j < 20; j++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
215 last_off = small_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
216 small_off += off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
217 last_bitsum = bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
218
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
219 bitsum = sum_bits(sbuf, shift_saved, small_off);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
220
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
221 if ((bitsum-NELLY_DETAIL_BITS) * (last_bitsum-NELLY_DETAIL_BITS) <= 0)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
222 break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
223 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
224
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
225 if (bitsum > NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
226 big_off = small_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
227 small_off = last_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
228 big_bitsum=bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
229 small_bitsum=last_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
230 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
231 big_off = last_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
232 big_bitsum=last_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
233 small_bitsum=bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
234 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
235
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
236 while (bitsum != NELLY_DETAIL_BITS && j <= 19) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
237 off = (big_off+small_off)>>1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
238 bitsum = sum_bits(sbuf, shift_saved, off);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
239 if (bitsum > NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
240 big_off=off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
241 big_bitsum=bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
242 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
243 small_off = off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
244 small_bitsum=bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
245 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
246 j++;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
247 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
248
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
249 if (abs(big_bitsum-NELLY_DETAIL_BITS) >=
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
250 abs(small_bitsum-NELLY_DETAIL_BITS)) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
251 bitsum = small_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
252 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
253 small_off = big_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
254 bitsum = big_bitsum;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
255 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
256 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
257
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
258 for (i = 0; i < NELLY_FILL_LEN; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
259 tmp = sbuf[i]-small_off;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
260 tmp = ((tmp>>(shift_saved-1))+1)>>1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
261 bits[i] = av_clip(tmp, 0, NELLY_BIT_CAP);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
262 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
263
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
264 if (bitsum > NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
265 tmp = i = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
266 while (tmp < NELLY_DETAIL_BITS) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
267 tmp += bits[i];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
268 i++;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
269 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
270
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
271 bits[i-1] -= tmp - NELLY_DETAIL_BITS;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
272 for(; i < NELLY_FILL_LEN; i++)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
273 bits[i] = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
274 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
275 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
276
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
277 void nelly_decode_block(NellyMoserDecodeContext *s, unsigned char block[NELLY_BLOCK_LEN], float audio[NELLY_SAMPLES])
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
278 {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
279 int i,j;
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
280 float buf[NELLY_FILL_LEN], pows[NELLY_FILL_LEN];
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
281 float *aptr, *bptr, *pptr, val, pval;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
282 int bits[NELLY_BUF_LEN];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
283 unsigned char v;
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
284 float a;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
285
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
286 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
287
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
288 bptr = buf;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
289 pptr = pows;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
290 val = nelly_init_table[get_bits(&s->gb, 6)];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
291 for (i=0 ; i<NELLY_BANDS ; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
292 if (i > 0)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
293 val += nelly_delta_table[get_bits(&s->gb, 5)];
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
294 pval = pow(2, val/2048);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
295 for (j = 0; j < nelly_band_sizes_table[i]; j++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
296 *bptr++ = val;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
297 *pptr++ = pval;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
298 }
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
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
302 get_sample_bits(buf, bits);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
303
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
304 for (i = 0; i < 2; i++) {
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
305 aptr = audio + i * NELLY_BUF_LEN;
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
306
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
307 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
308 skip_bits(&s->gb, NELLY_HEADER_BITS + i*NELLY_DETAIL_BITS);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
309
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
310 for (j = 0; j < NELLY_FILL_LEN; j++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
311 if (bits[j] <= 0) {
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
312 aptr[j] = M_SQRT1_2*pows[j];
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
313 if (av_random(&s->random_state) & 1)
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
314 aptr[j] *= -1.0;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
315 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
316 v = get_bits(&s->gb, bits[j]);
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
317 aptr[j] = dequantization_table[(1<<bits[j])-1+v]*pows[j];
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
318 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
319 }
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
320 memset(&aptr[NELLY_FILL_LEN], 0,
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
321 (NELLY_BUF_LEN - NELLY_FILL_LEN) * sizeof(float));
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
322
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
323 s->imdct_ctx.fft.imdct_calc(&s->imdct_ctx, s->imdct_out,
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
324 aptr, s->imdct_tmp);
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
325 /* XXX: overlapping and windowing should be part of a more
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
326 generic imdct function */
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
327 a = 1.0 / 8.0;
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
328 for(j = 0; j < NELLY_BUF_LEN / 2; j++) {
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
329 aptr[j] = s->imdct_out[j + NELLY_BUF_LEN + NELLY_BUF_LEN / 2] * a;
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
330 aptr[j + NELLY_BUF_LEN / 2] = -s->imdct_out[j] * a;
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
331 }
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
332 overlap_and_window(s, s->state, aptr);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
333 }
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 static int decode_init(AVCodecContext * avctx) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
337 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
338 int i;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
339
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
340 s->avctx = avctx;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
341 av_init_random(0, &s->random_state);
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
342 ff_mdct_init(&s->imdct_ctx, 8, 1);
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
343
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
344 dsputil_init(&s->dsp, avctx);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
345
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
346 if(s->dsp.float_to_int16 == ff_float_to_int16_c) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
347 s->add_bias = 385;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
348 s->scale_bias = 32768;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
349 } else {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
350 s->add_bias = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
351 s->scale_bias = 1;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
352 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
353
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
354 /* Generate overlap window */
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
355 if (!sine_window[0])
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
356 for (i=0 ; i<128; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
357 sine_window[i] = sin((i + 0.5) / 256.0 * M_PI);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
358 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
359
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
360 return 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
361 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
362
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
363 static int decode_tag(AVCodecContext * avctx,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
364 void *data, int *data_size,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
365 uint8_t * buf, int buf_size) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
366 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
367 int blocks, i;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
368 int16_t* samples;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
369 *data_size = 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
370 samples = (int16_t*)data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
371
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
372 if (buf_size < avctx->block_align)
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
373 return buf_size;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
374
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
375 switch (buf_size) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
376 case 64: // 8000Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
377 blocks = 1; break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
378 case 128: // 11025Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
379 blocks = 2; break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
380 case 256: // 22050Hz
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
381 blocks = 4; break;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
382 default:
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
383 av_log(avctx, AV_LOG_DEBUG, "Tag size %d unknown, report sample!\n", buf_size);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
384 return buf_size;
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 for (i=0 ; i<blocks ; i++) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
388 nelly_decode_block(s, &buf[i*NELLY_BLOCK_LEN], s->float_buf);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
389 s->dsp.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
390 *data_size += NELLY_SAMPLES*sizeof(int16_t);
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
391 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
392
5915
4528d63fbc8e Fix nellymoser decode_tag return value, patch by Stefano Sabatini
banan
parents: 5874
diff changeset
393 return buf_size;
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
394 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
395
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
396 static int decode_end(AVCodecContext * avctx) {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
397 NellyMoserDecodeContext *s = avctx->priv_data;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
398
5869
a03b4172939c Use the ffmpeg mdct function, patch by Fabrice Bellard. Thread: [FFmpeg-devel] NellyMoser transform bug, 10/25/2007 12:24 PM
banan
parents: 5838
diff changeset
399 ff_mdct_end(&s->imdct_ctx);
5823
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
400 return 0;
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
401 }
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
402
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
403 AVCodec nellymoser_decoder = {
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
404 "nellymoser",
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
405 CODEC_TYPE_AUDIO,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
406 CODEC_ID_NELLYMOSER,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
407 sizeof(NellyMoserDecodeContext),
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
408 decode_init,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
409 NULL,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
410 decode_end,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
411 decode_tag,
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
412 };
4beef9d0e663 Nellymoser ASAO decoder
banan
parents:
diff changeset
413