Mercurial > libavcodec.hg
comparison wmadec.c @ 10312:6aaf7c9e768b libavcodec
WMA: use a table instead of pow() in decode_exp_vlc
author | mru |
---|---|
date | Tue, 29 Sep 2009 10:38:27 +0000 |
parents | 4d1b9ca628fc |
children | f7376a522a7e |
comparison
equal
deleted
inserted
replaced
10311:943b63f364ca | 10312:6aaf7c9e768b |
---|---|
238 | 238 |
239 wma_lsp_to_curve(s, s->exponents[ch], &s->max_exponent[ch], | 239 wma_lsp_to_curve(s, s->exponents[ch], &s->max_exponent[ch], |
240 s->block_len, lsp_coefs); | 240 s->block_len, lsp_coefs); |
241 } | 241 } |
242 | 242 |
243 /** pow(10, i / 16.0) for i in -60..67 */ | |
244 static const float pow_tab[128] = { | |
245 1.7782794100389e-04, 2.0535250264571e-04, | |
246 2.3713737056617e-04, 2.7384196342644e-04, | |
247 3.1622776601684e-04, 3.6517412725484e-04, | |
248 4.2169650342858e-04, 4.8696752516586e-04, | |
249 5.6234132519035e-04, 6.4938163157621e-04, | |
250 7.4989420933246e-04, 8.6596432336006e-04, | |
251 1.0000000000000e-03, 1.1547819846895e-03, | |
252 1.3335214321633e-03, 1.5399265260595e-03, | |
253 1.7782794100389e-03, 2.0535250264571e-03, | |
254 2.3713737056617e-03, 2.7384196342644e-03, | |
255 3.1622776601684e-03, 3.6517412725484e-03, | |
256 4.2169650342858e-03, 4.8696752516586e-03, | |
257 5.6234132519035e-03, 6.4938163157621e-03, | |
258 7.4989420933246e-03, 8.6596432336006e-03, | |
259 1.0000000000000e-02, 1.1547819846895e-02, | |
260 1.3335214321633e-02, 1.5399265260595e-02, | |
261 1.7782794100389e-02, 2.0535250264571e-02, | |
262 2.3713737056617e-02, 2.7384196342644e-02, | |
263 3.1622776601684e-02, 3.6517412725484e-02, | |
264 4.2169650342858e-02, 4.8696752516586e-02, | |
265 5.6234132519035e-02, 6.4938163157621e-02, | |
266 7.4989420933246e-02, 8.6596432336007e-02, | |
267 1.0000000000000e-01, 1.1547819846895e-01, | |
268 1.3335214321633e-01, 1.5399265260595e-01, | |
269 1.7782794100389e-01, 2.0535250264571e-01, | |
270 2.3713737056617e-01, 2.7384196342644e-01, | |
271 3.1622776601684e-01, 3.6517412725484e-01, | |
272 4.2169650342858e-01, 4.8696752516586e-01, | |
273 5.6234132519035e-01, 6.4938163157621e-01, | |
274 7.4989420933246e-01, 8.6596432336007e-01, | |
275 1.0000000000000e+00, 1.1547819846895e+00, | |
276 1.3335214321633e+00, 1.5399265260595e+00, | |
277 1.7782794100389e+00, 2.0535250264571e+00, | |
278 2.3713737056617e+00, 2.7384196342644e+00, | |
279 3.1622776601684e+00, 3.6517412725484e+00, | |
280 4.2169650342858e+00, 4.8696752516586e+00, | |
281 5.6234132519035e+00, 6.4938163157621e+00, | |
282 7.4989420933246e+00, 8.6596432336007e+00, | |
283 1.0000000000000e+01, 1.1547819846895e+01, | |
284 1.3335214321633e+01, 1.5399265260595e+01, | |
285 1.7782794100389e+01, 2.0535250264571e+01, | |
286 2.3713737056617e+01, 2.7384196342644e+01, | |
287 3.1622776601684e+01, 3.6517412725484e+01, | |
288 4.2169650342858e+01, 4.8696752516586e+01, | |
289 5.6234132519035e+01, 6.4938163157621e+01, | |
290 7.4989420933246e+01, 8.6596432336007e+01, | |
291 1.0000000000000e+02, 1.1547819846895e+02, | |
292 1.3335214321633e+02, 1.5399265260595e+02, | |
293 1.7782794100389e+02, 2.0535250264571e+02, | |
294 2.3713737056617e+02, 2.7384196342644e+02, | |
295 3.1622776601684e+02, 3.6517412725484e+02, | |
296 4.2169650342858e+02, 4.8696752516586e+02, | |
297 5.6234132519035e+02, 6.4938163157621e+02, | |
298 7.4989420933246e+02, 8.6596432336007e+02, | |
299 1.0000000000000e+03, 1.1547819846895e+03, | |
300 1.3335214321633e+03, 1.5399265260595e+03, | |
301 1.7782794100389e+03, 2.0535250264571e+03, | |
302 2.3713737056617e+03, 2.7384196342644e+03, | |
303 3.1622776601684e+03, 3.6517412725484e+03, | |
304 4.2169650342858e+03, 4.8696752516586e+03, | |
305 5.6234132519035e+03, 6.4938163157621e+03, | |
306 7.4989420933246e+03, 8.6596432336007e+03, | |
307 1.0000000000000e+04, 1.1547819846895e+04, | |
308 1.3335214321633e+04, 1.5399265260595e+04, | |
309 }; | |
310 | |
243 /** | 311 /** |
244 * decode exponents coded with VLC codes | 312 * decode exponents coded with VLC codes |
245 */ | 313 */ |
246 static int decode_exp_vlc(WMACodecContext *s, int ch) | 314 static int decode_exp_vlc(WMACodecContext *s, int ch) |
247 { | 315 { |
248 int last_exp, n, code; | 316 int last_exp, n, code; |
249 const uint16_t *ptr; | 317 const uint16_t *ptr; |
250 float v, *q, max_scale, *q_end; | 318 float v, *q, max_scale, *q_end; |
319 const float *ptab = pow_tab + 60; | |
251 | 320 |
252 ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits]; | 321 ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits]; |
253 q = s->exponents[ch]; | 322 q = s->exponents[ch]; |
254 q_end = q + s->block_len; | 323 q_end = q + s->block_len; |
255 max_scale = 0; | 324 max_scale = 0; |
256 if (s->version == 1) { | 325 if (s->version == 1) { |
257 last_exp = get_bits(&s->gb, 5) + 10; | 326 last_exp = get_bits(&s->gb, 5) + 10; |
258 /* XXX: use a table */ | 327 v = ptab[last_exp]; |
259 v = pow(10, last_exp * (1.0 / 16.0)); | |
260 max_scale = v; | 328 max_scale = v; |
261 n = *ptr++; | 329 n = *ptr++; |
262 do { | 330 do { |
263 *q++ = v; | 331 *q++ = v; |
264 } while (--n); | 332 } while (--n); |
269 code = get_vlc2(&s->gb, s->exp_vlc.table, EXPVLCBITS, EXPMAX); | 337 code = get_vlc2(&s->gb, s->exp_vlc.table, EXPVLCBITS, EXPMAX); |
270 if (code < 0) | 338 if (code < 0) |
271 return -1; | 339 return -1; |
272 /* NOTE: this offset is the same as MPEG4 AAC ! */ | 340 /* NOTE: this offset is the same as MPEG4 AAC ! */ |
273 last_exp += code - 60; | 341 last_exp += code - 60; |
274 /* XXX: use a table */ | 342 if ((unsigned)last_exp + 60 > FF_ARRAY_ELEMS(pow_tab)) |
275 v = pow(10, last_exp * (1.0 / 16.0)); | 343 return -1; |
344 v = ptab[last_exp]; | |
276 if (v > max_scale) | 345 if (v > max_scale) |
277 max_scale = v; | 346 max_scale = v; |
278 n = *ptr++; | 347 n = *ptr++; |
279 do { | 348 do { |
280 *q++ = v; | 349 *q++ = v; |