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