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;