Mercurial > libavcodec.hg
annotate nellymoserdec.c @ 6920:d02af7474bff libavcodec
Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays.
fixes CID84 RUN2
CID85 RUN2
CID86 RUN2
CID87 RUN2
CID88 RUN2
CID89 RUN2
CID90 RUN2
CID91 RUN2
CID92 RUN2
CID93 RUN2
CID94 RUN2
CID95 RUN2
CID96 RUN2
CID97 RUN2
CID98 RUN2
CID99 RUN2
CID100 RUN2
CID101 RUN2
CID102 RUN2
CID103 RUN2
CID104 RUN2
CID105 RUN2
CID106 RUN2
author | michael |
---|---|
date | Wed, 28 May 2008 11:59:41 +0000 |
parents | f7cbb7733146 |
children | 40f18ff994f9 |
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 */ | |
6763 | 33 |
34 #include "libavutil/random.h" | |
5823 | 35 #include "avcodec.h" |
36 #include "dsputil.h" | |
37 | |
38 #define ALT_BITSTREAM_READER_LE | |
39 #include "bitstream.h" | |
40 | |
41 #define NELLY_BANDS 23 | |
42 #define NELLY_BLOCK_LEN 64 | |
43 #define NELLY_HEADER_BITS 116 | |
44 #define NELLY_DETAIL_BITS 198 | |
45 #define NELLY_BUF_LEN 128 | |
46 #define NELLY_FILL_LEN 124 | |
47 #define NELLY_BIT_CAP 6 | |
48 #define NELLY_BASE_OFF 4228 | |
49 #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
|
50 #define NELLY_SAMPLES (2 * NELLY_BUF_LEN) |
5823 | 51 |
52 static const float dequantization_table[127] = { | |
53 0.0000000000,-0.8472560048, 0.7224709988, -1.5247479677, -0.4531480074, 0.3753609955, 1.4717899561, | |
54 -1.9822579622, -1.1929379702, -0.5829370022, -0.0693780035, 0.3909569979,0.9069200158, 1.4862740040, | |
55 2.2215409279, -2.3887870312, -1.8067539930, -1.4105420113, -1.0773609877, -0.7995010018,-0.5558109879, | |
56 -0.3334020078, -0.1324490011, 0.0568020009, 0.2548770010, 0.4773550034, 0.7386850119, 1.0443060398, | |
57 1.3954459429, 1.8098750114, 2.3918759823,-2.3893830776, -1.9884680510, -1.7514040470, -1.5643119812, | |
58 -1.3922129869,-1.2164649963, -1.0469499826, -0.8905100226, -0.7645580173, -0.6454579830, -0.5259280205, | |
59 -0.4059549868, -0.3029719889, -0.2096900046, -0.1239869967, -0.0479229987, 0.0257730000, 0.1001340002, | |
60 0.1737180054, 0.2585540116, 0.3522900045, 0.4569880068, 0.5767750144, 0.7003160119, 0.8425520062, | |
61 1.0093879700, 1.1821349859, 1.3534560204, 1.5320819616, 1.7332619429, 1.9722349644, 2.3978140354, | |
62 -2.5756309032, -2.0573320389, -1.8984919786, -1.7727810144, -1.6662600040, -1.5742180347, -1.4993319511, | |
63 -1.4316639900, -1.3652280569, -1.3000990152, -1.2280930281, -1.1588579416, -1.0921250582, -1.0135740042, | |
64 -0.9202849865, -0.8287050128, -0.7374889851, -0.6447759867, -0.5590940118, -0.4857139885, -0.4110319912, | |
65 -0.3459700048, -0.2851159871, -0.2341620028, -0.1870580018, -0.1442500055, -0.1107169986, -0.0739680007, | |
66 -0.0365610011, -0.0073290002, 0.0203610007, 0.0479039997, 0.0751969963, 0.0980999991, 0.1220389977, | |
67 0.1458999962, 0.1694349945, 0.1970459968, 0.2252430022, 0.2556869984, 0.2870100141, 0.3197099864, | |
68 0.3525829911, 0.3889069855, 0.4334920049, 0.4769459963, 0.5204820037, 0.5644530058, 0.6122040153, | |
69 0.6685929894, 0.7341650128, 0.8032159805, 0.8784040213, 0.9566209912, 1.0397069454, 1.1293770075, | |
70 1.2211159468, 1.3080279827, 1.4024800062, 1.5056819916, 1.6227730513, 1.7724959850, 1.9430880547, | |
71 2.2903931141 | |
72 }; | |
73 | |
74 static const uint8_t nelly_band_sizes_table[NELLY_BANDS] = { | |
75 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 12, 14, 15 | |
76 }; | |
77 | |
78 static const uint16_t nelly_init_table[64] = { | |
79 3134, 5342, 6870, 7792, 8569, 9185, 9744, 10191, 10631, 11061, 11434, 11770, | |
80 12116, 12513, 12925, 13300, 13674, 14027, 14352, 14716, 15117, 15477, 15824, | |
81 16157, 16513, 16804, 17090, 17401, 17679, 17948, 18238, 18520, 18764, 19078, | |
82 19381, 19640, 19921, 20205, 20500, 20813, 21162, 21465, 21794, 22137, 22453, | |
83 22756, 23067, 23350, 23636, 23926, 24227, 24521, 24819, 25107, 25414, 25730, | |
84 26120, 26497, 26895, 27344, 27877, 28463, 29426, 31355 | |
85 }; | |
86 | |
87 static const int16_t nelly_delta_table[32] = { | |
88 -11725, -9420, -7910, -6801, -5948, -5233, -4599, -4039, -3507, -3030, -2596, | |
89 -2170, -1774, -1383, -1016, -660, -329, -1, 337, 696, 1085, 1512, 1962, 2433, | |
90 2968, 3569, 4314, 5279, 6622, 8154, 10076, 12975 | |
91 }; | |
92 | |
93 typedef struct NellyMoserDecodeContext { | |
94 AVCodecContext* avctx; | |
5838 | 95 DECLARE_ALIGNED_16(float,float_buf[NELLY_SAMPLES]); |
6611
79c5af90afde
Avoid reverse addressing, not sure if this is faster or slower but people
michael
parents:
6610
diff
changeset
|
96 float state[128]; |
5823 | 97 AVRandomState random_state; |
98 GetBitContext gb; | |
99 int add_bias; | |
6613
54f88d1cee72
Move scale_bias to a more sane place. I am starting to wonder how this
michael
parents:
6612
diff
changeset
|
100 float scale_bias; |
5823 | 101 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
|
102 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
|
103 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
|
104 DECLARE_ALIGNED_16(float,imdct_out[NELLY_BUF_LEN * 2]); |
5823 | 105 } NellyMoserDecodeContext; |
106 | |
5916 | 107 static DECLARE_ALIGNED_16(float,sine_window[128]); |
5823 | 108 |
109 static inline int signed_shift(int i, int shift) { | |
110 if (shift > 0) | |
111 return i << shift; | |
112 return i >> -shift; | |
113 } | |
114 | |
6605 | 115 |
116 static void overlap_and_window(NellyMoserDecodeContext *s, float *state, float *audio, float *a_in) | |
5823 | 117 { |
6616 | 118 int bot, top; |
5823 | 119 |
120 bot = 0; | |
121 top = NELLY_BUF_LEN-1; | |
122 | |
6612 | 123 while (bot < NELLY_BUF_LEN) { |
6615 | 124 audio[bot] = a_in [bot]*sine_window[bot] |
125 +state[bot]*sine_window[top] + s->add_bias; | |
5823 | 126 |
127 bot++; | |
128 top--; | |
129 } | |
6611
79c5af90afde
Avoid reverse addressing, not sure if this is faster or slower but people
michael
parents:
6610
diff
changeset
|
130 memcpy(state, a_in + NELLY_BUF_LEN, sizeof(float)*NELLY_BUF_LEN); |
5823 | 131 } |
132 | |
133 static int sum_bits(short *buf, short shift, short off) | |
134 { | |
6741 | 135 int i, ret = 0; |
5823 | 136 |
137 for (i = 0; i < NELLY_FILL_LEN; i++) { | |
6741 | 138 int b = buf[i]-off; |
5823 | 139 b = ((b>>(shift-1))+1)>>1; |
140 ret += av_clip(b, 0, NELLY_BIT_CAP); | |
141 } | |
142 | |
143 return ret; | |
144 } | |
145 | |
146 static int headroom(int *la) | |
147 { | |
148 int l; | |
149 if (*la == 0) { | |
150 return 31; | |
151 } | |
152 l = 30 - av_log2(FFABS(*la)); | |
153 *la <<= l; | |
154 return l; | |
155 } | |
156 | |
157 | |
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
|
158 static void get_sample_bits(const float *buf, int *bits) |
5823 | 159 { |
160 int i, j; | |
161 short sbuf[128]; | |
162 int bitsum = 0, last_bitsum, small_bitsum, big_bitsum; | |
163 short shift, shift_saved; | |
164 int max, sum, last_off, tmp; | |
165 int big_off, small_off; | |
166 int off; | |
167 | |
168 max = 0; | |
169 for (i = 0; i < NELLY_FILL_LEN; i++) { | |
170 max = FFMAX(max, buf[i]); | |
171 } | |
172 shift = -16; | |
173 shift += headroom(&max); | |
174 | |
175 sum = 0; | |
176 for (i = 0; i < NELLY_FILL_LEN; i++) { | |
177 sbuf[i] = signed_shift(buf[i], shift); | |
178 sbuf[i] = (3*sbuf[i])>>2; | |
179 sum += sbuf[i]; | |
180 } | |
181 | |
182 shift += 11; | |
183 shift_saved = shift; | |
184 sum -= NELLY_DETAIL_BITS << shift; | |
185 shift += headroom(&sum); | |
186 small_off = (NELLY_BASE_OFF * (sum>>16)) >> 15; | |
187 shift = shift_saved - (NELLY_BASE_SHIFT+shift-31); | |
188 | |
189 small_off = signed_shift(small_off, shift); | |
190 | |
191 bitsum = sum_bits(sbuf, shift_saved, small_off); | |
192 | |
193 if (bitsum != NELLY_DETAIL_BITS) { | |
194 shift = 0; | |
195 off = bitsum - NELLY_DETAIL_BITS; | |
196 | |
197 for(shift=0; FFABS(off) <= 16383; shift++) | |
198 off *= 2; | |
199 | |
200 off = (off * NELLY_BASE_OFF) >> 15; | |
201 shift = shift_saved-(NELLY_BASE_SHIFT+shift-15); | |
202 | |
203 off = signed_shift(off, shift); | |
204 | |
205 for (j = 1; j < 20; j++) { | |
206 last_off = small_off; | |
207 small_off += off; | |
208 last_bitsum = bitsum; | |
209 | |
210 bitsum = sum_bits(sbuf, shift_saved, small_off); | |
211 | |
212 if ((bitsum-NELLY_DETAIL_BITS) * (last_bitsum-NELLY_DETAIL_BITS) <= 0) | |
213 break; | |
214 } | |
215 | |
216 if (bitsum > NELLY_DETAIL_BITS) { | |
217 big_off = small_off; | |
218 small_off = last_off; | |
219 big_bitsum=bitsum; | |
220 small_bitsum=last_bitsum; | |
221 } else { | |
222 big_off = last_off; | |
223 big_bitsum=last_bitsum; | |
224 small_bitsum=bitsum; | |
225 } | |
226 | |
227 while (bitsum != NELLY_DETAIL_BITS && j <= 19) { | |
228 off = (big_off+small_off)>>1; | |
229 bitsum = sum_bits(sbuf, shift_saved, off); | |
230 if (bitsum > NELLY_DETAIL_BITS) { | |
231 big_off=off; | |
232 big_bitsum=bitsum; | |
233 } else { | |
234 small_off = off; | |
235 small_bitsum=bitsum; | |
236 } | |
237 j++; | |
238 } | |
239 | |
240 if (abs(big_bitsum-NELLY_DETAIL_BITS) >= | |
241 abs(small_bitsum-NELLY_DETAIL_BITS)) { | |
242 bitsum = small_bitsum; | |
243 } else { | |
244 small_off = big_off; | |
245 bitsum = big_bitsum; | |
246 } | |
247 } | |
248 | |
249 for (i = 0; i < NELLY_FILL_LEN; i++) { | |
250 tmp = sbuf[i]-small_off; | |
251 tmp = ((tmp>>(shift_saved-1))+1)>>1; | |
252 bits[i] = av_clip(tmp, 0, NELLY_BIT_CAP); | |
253 } | |
254 | |
255 if (bitsum > NELLY_DETAIL_BITS) { | |
256 tmp = i = 0; | |
257 while (tmp < NELLY_DETAIL_BITS) { | |
258 tmp += bits[i]; | |
259 i++; | |
260 } | |
261 | |
262 bits[i-1] -= tmp - NELLY_DETAIL_BITS; | |
263 for(; i < NELLY_FILL_LEN; i++) | |
264 bits[i] = 0; | |
265 } | |
266 } | |
267 | |
6725
dc6bc48b0e17
Mark symbol as static, patch by Diego 'Flameeyes' Petten«Ò, flameeyes gmail com.
diego
parents:
6710
diff
changeset
|
268 static void nelly_decode_block(NellyMoserDecodeContext *s, |
dc6bc48b0e17
Mark symbol as static, patch by Diego 'Flameeyes' Petten«Ò, flameeyes gmail com.
diego
parents:
6710
diff
changeset
|
269 const unsigned char block[NELLY_BLOCK_LEN], |
dc6bc48b0e17
Mark symbol as static, patch by Diego 'Flameeyes' Petten«Ò, flameeyes gmail com.
diego
parents:
6710
diff
changeset
|
270 float audio[NELLY_SAMPLES]) |
5823 | 271 { |
272 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
|
273 float buf[NELLY_FILL_LEN], pows[NELLY_FILL_LEN]; |
5823 | 274 float *aptr, *bptr, *pptr, val, pval; |
275 int bits[NELLY_BUF_LEN]; | |
276 unsigned char v; | |
277 | |
278 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8); | |
279 | |
280 bptr = buf; | |
281 pptr = pows; | |
282 val = nelly_init_table[get_bits(&s->gb, 6)]; | |
283 for (i=0 ; i<NELLY_BANDS ; i++) { | |
284 if (i > 0) | |
285 val += nelly_delta_table[get_bits(&s->gb, 5)]; | |
6614 | 286 pval = -pow(2, val/2048) * s->scale_bias; |
5823 | 287 for (j = 0; j < nelly_band_sizes_table[i]; j++) { |
288 *bptr++ = val; | |
289 *pptr++ = pval; | |
290 } | |
291 | |
292 } | |
293 | |
294 get_sample_bits(buf, bits); | |
295 | |
296 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
|
297 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
|
298 |
5823 | 299 init_get_bits(&s->gb, block, NELLY_BLOCK_LEN * 8); |
300 skip_bits(&s->gb, NELLY_HEADER_BITS + i*NELLY_DETAIL_BITS); | |
301 | |
302 for (j = 0; j < NELLY_FILL_LEN; j++) { | |
303 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
|
304 aptr[j] = M_SQRT1_2*pows[j]; |
6614 | 305 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
|
306 aptr[j] *= -1.0; |
5823 | 307 } else { |
308 v = get_bits(&s->gb, bits[j]); | |
6614 | 309 aptr[j] = dequantization_table[(1<<bits[j])-1+v]*pows[j]; |
5823 | 310 } |
311 } | |
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 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
|
313 (NELLY_BUF_LEN - NELLY_FILL_LEN) * sizeof(float)); |
5823 | 314 |
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
|
315 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
|
316 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
|
317 /* 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
|
318 generic imdct function */ |
6605 | 319 overlap_and_window(s, s->state, aptr, s->imdct_out); |
5823 | 320 } |
321 } | |
322 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6218
diff
changeset
|
323 static av_cold int decode_init(AVCodecContext * avctx) { |
5823 | 324 NellyMoserDecodeContext *s = avctx->priv_data; |
325 int i; | |
326 | |
327 s->avctx = avctx; | |
328 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
|
329 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
|
330 |
5823 | 331 dsputil_init(&s->dsp, avctx); |
332 | |
333 if(s->dsp.float_to_int16 == ff_float_to_int16_c) { | |
334 s->add_bias = 385; | |
6613
54f88d1cee72
Move scale_bias to a more sane place. I am starting to wonder how this
michael
parents:
6612
diff
changeset
|
335 s->scale_bias = 1.0/(8*32768); |
5823 | 336 } else { |
337 s->add_bias = 0; | |
6613
54f88d1cee72
Move scale_bias to a more sane place. I am starting to wonder how this
michael
parents:
6612
diff
changeset
|
338 s->scale_bias = 1.0/(1*8); |
5823 | 339 } |
340 | |
341 /* Generate overlap window */ | |
342 if (!sine_window[0]) | |
343 for (i=0 ; i<128; i++) { | |
344 sine_window[i] = sin((i + 0.5) / 256.0 * M_PI); | |
345 } | |
346 | |
347 return 0; | |
348 } | |
349 | |
350 static int decode_tag(AVCodecContext * avctx, | |
351 void *data, int *data_size, | |
6218 | 352 const uint8_t * buf, int buf_size) { |
5823 | 353 NellyMoserDecodeContext *s = avctx->priv_data; |
354 int blocks, i; | |
355 int16_t* samples; | |
356 *data_size = 0; | |
357 samples = (int16_t*)data; | |
358 | |
359 if (buf_size < avctx->block_align) | |
360 return buf_size; | |
361 | |
362 switch (buf_size) { | |
363 case 64: // 8000Hz | |
364 blocks = 1; break; | |
365 case 128: // 11025Hz | |
366 blocks = 2; break; | |
367 case 256: // 22050Hz | |
368 blocks = 4; break; | |
5918 | 369 case 512: // 44100Hz |
370 blocks = 8; break; | |
5823 | 371 default: |
5917
282860fe5844
Change the "report sample" message from AV_LOG_DEBUG to AV_LOG_ERROR.
alex
parents:
5916
diff
changeset
|
372 av_log(avctx, AV_LOG_ERROR, "Tag size %d unknown, report sample!\n", buf_size); |
5823 | 373 return buf_size; |
374 } | |
375 | |
376 for (i=0 ; i<blocks ; i++) { | |
377 nelly_decode_block(s, &buf[i*NELLY_BLOCK_LEN], s->float_buf); | |
378 s->dsp.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES); | |
379 *data_size += NELLY_SAMPLES*sizeof(int16_t); | |
380 } | |
381 | |
5915
4528d63fbc8e
Fix nellymoser decode_tag return value, patch by Stefano Sabatini
banan
parents:
5874
diff
changeset
|
382 return buf_size; |
5823 | 383 } |
384 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6218
diff
changeset
|
385 static av_cold int decode_end(AVCodecContext * avctx) { |
5823 | 386 NellyMoserDecodeContext *s = avctx->priv_data; |
387 | |
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
|
388 ff_mdct_end(&s->imdct_ctx); |
5823 | 389 return 0; |
390 } | |
391 | |
392 AVCodec nellymoser_decoder = { | |
393 "nellymoser", | |
394 CODEC_TYPE_AUDIO, | |
395 CODEC_ID_NELLYMOSER, | |
396 sizeof(NellyMoserDecodeContext), | |
397 decode_init, | |
398 NULL, | |
399 decode_end, | |
400 decode_tag, | |
6731 | 401 .long_name = "Nellymoser Asao", |
5823 | 402 }; |
403 |