Mercurial > libavcodec.hg
comparison wmadec.c @ 3176:babf844e1308 libavcodec
Init simplification and 2% faster wma_decode_block on amd64 with tables use
instead of pow().
author | banan |
---|---|
date | Wed, 08 Mar 2006 09:26:57 +0000 |
parents | ab01ee59324f |
children | 10cda832bd0f |
comparison
equal
deleted
inserted
replaced
3175:c20c181e0eca | 3176:babf844e1308 |
---|---|
128 /* lsp_to_curve tables */ | 128 /* lsp_to_curve tables */ |
129 float lsp_cos_table[BLOCK_MAX_SIZE]; | 129 float lsp_cos_table[BLOCK_MAX_SIZE]; |
130 float lsp_pow_e_table[256]; | 130 float lsp_pow_e_table[256]; |
131 float lsp_pow_m_table1[(1 << LSP_POW_BITS)]; | 131 float lsp_pow_m_table1[(1 << LSP_POW_BITS)]; |
132 float lsp_pow_m_table2[(1 << LSP_POW_BITS)]; | 132 float lsp_pow_m_table2[(1 << LSP_POW_BITS)]; |
133 /* pow tables */ | |
134 float pow_005_10[121]; | |
135 float pow_00625_10[121]; | |
133 | 136 |
134 #ifdef TRACE | 137 #ifdef TRACE |
135 int frame_count; | 138 int frame_count; |
136 #endif | 139 #endif |
137 } WMADecodeContext; | 140 } WMADecodeContext; |
216 { | 219 { |
217 WMADecodeContext *s = avctx->priv_data; | 220 WMADecodeContext *s = avctx->priv_data; |
218 int i, flags1, flags2; | 221 int i, flags1, flags2; |
219 float *window; | 222 float *window; |
220 uint8_t *extradata; | 223 uint8_t *extradata; |
221 float bps1, high_freq; | 224 float bps, bps1; |
222 volatile float bps; | 225 volatile float high_freq_factor; |
223 int sample_rate1; | 226 int sample_rate1; |
224 int coef_vlc_table; | 227 int coef_vlc_table; |
225 | 228 |
226 s->sample_rate = avctx->sample_rate; | 229 s->sample_rate = avctx->sample_rate; |
227 s->nb_channels = avctx->channels; | 230 s->nb_channels = avctx->channels; |
273 s->nb_block_sizes = 1; | 276 s->nb_block_sizes = 1; |
274 } | 277 } |
275 | 278 |
276 /* init rate dependant parameters */ | 279 /* init rate dependant parameters */ |
277 s->use_noise_coding = 1; | 280 s->use_noise_coding = 1; |
278 high_freq = s->sample_rate * 0.5; | |
279 | 281 |
280 /* if version 2, then the rates are normalized */ | 282 /* if version 2, then the rates are normalized */ |
281 sample_rate1 = s->sample_rate; | 283 sample_rate1 = s->sample_rate; |
282 if (s->version == 2) { | 284 if (s->version == 2) { |
283 if (sample_rate1 >= 44100) | 285 if (sample_rate1 >= 44100) |
302 bps1 = bps * 1.6; | 304 bps1 = bps * 1.6; |
303 if (sample_rate1 == 44100) { | 305 if (sample_rate1 == 44100) { |
304 if (bps1 >= 0.61) | 306 if (bps1 >= 0.61) |
305 s->use_noise_coding = 0; | 307 s->use_noise_coding = 0; |
306 else | 308 else |
307 high_freq = high_freq * 0.4; | 309 high_freq_factor = 0.4; |
308 } else if (sample_rate1 == 22050) { | 310 } else if (sample_rate1 == 22050) { |
309 if (bps1 >= 1.16) | 311 if (bps1 >= 1.16) |
310 s->use_noise_coding = 0; | 312 s->use_noise_coding = 0; |
311 else if (bps1 >= 0.72) | 313 else if (bps1 >= 0.72) |
312 high_freq = high_freq * 0.7; | 314 high_freq_factor = 0.7; |
313 else | 315 else |
314 high_freq = high_freq * 0.6; | 316 high_freq_factor = 0.6; |
315 } else if (sample_rate1 == 16000) { | 317 } else if (sample_rate1 == 16000) { |
316 if (bps > 0.5) | 318 if (bps > 0.5) |
317 high_freq = high_freq * 0.5; | 319 high_freq_factor = 0.5; |
318 else | 320 else |
319 high_freq = high_freq * 0.3; | 321 high_freq_factor = 0.3; |
320 } else if (sample_rate1 == 11025) { | 322 } else if (sample_rate1 == 11025) { |
321 high_freq = high_freq * 0.7; | 323 high_freq_factor = 0.7; |
322 } else if (sample_rate1 == 8000) { | 324 } else if (sample_rate1 == 8000) { |
323 if (bps <= 0.625) { | 325 if (bps <= 0.625) { |
324 high_freq = high_freq * 0.5; | 326 high_freq_factor = 0.5; |
325 } else if (bps > 0.75) { | 327 } else if (bps > 0.75) { |
326 s->use_noise_coding = 0; | 328 s->use_noise_coding = 0; |
327 } else { | 329 } else { |
328 high_freq = high_freq * 0.65; | 330 high_freq_factor = 0.65; |
329 } | 331 } |
330 } else { | 332 } else { |
331 if (bps >= 0.8) { | 333 if (bps >= 0.8) { |
332 high_freq = high_freq * 0.75; | 334 high_freq_factor = 0.75; |
333 } else if (bps >= 0.6) { | 335 } else if (bps >= 0.6) { |
334 high_freq = high_freq * 0.6; | 336 high_freq_factor = 0.6; |
335 } else { | 337 } else { |
336 high_freq = high_freq * 0.5; | 338 high_freq_factor = 0.5; |
337 } | 339 } |
338 } | 340 } |
339 dprintf("flags1=0x%x flags2=0x%x\n", flags1, flags2); | 341 dprintf("flags1=0x%x flags2=0x%x\n", flags1, flags2); |
340 dprintf("version=%d channels=%d sample_rate=%d bitrate=%d block_align=%d\n", | 342 dprintf("version=%d channels=%d sample_rate=%d bitrate=%d block_align=%d\n", |
341 s->version, s->nb_channels, s->sample_rate, s->bit_rate, | 343 s->version, s->nb_channels, s->sample_rate, s->bit_rate, |
342 s->block_align); | 344 s->block_align); |
343 dprintf("bps=%f bps1=%f high_freq=%f bitoffset=%d\n", | 345 dprintf("bps=%f bps1=%f bitoffset=%d\n", |
344 bps, bps1, high_freq, s->byte_offset_bits); | 346 bps, bps1, s->byte_offset_bits); |
345 dprintf("use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n", | 347 dprintf("use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n", |
346 s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes); | 348 s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes); |
347 | 349 |
348 /* compute the scale factor band sizes for each MDCT block size */ | 350 /* compute the scale factor band sizes for each MDCT block size */ |
349 { | 351 { |
412 } | 414 } |
413 | 415 |
414 /* max number of coefs */ | 416 /* max number of coefs */ |
415 s->coefs_end[k] = (s->frame_len - ((s->frame_len * 9) / 100)) >> k; | 417 s->coefs_end[k] = (s->frame_len - ((s->frame_len * 9) / 100)) >> k; |
416 /* high freq computation */ | 418 /* high freq computation */ |
417 s->high_band_start[k] = (int)((block_len * 2 * high_freq) / | 419 s->high_band_start[k] = (int)((block_len * high_freq_factor) + 0.5); |
418 s->sample_rate + 0.5); | 420 |
419 n = s->exponent_sizes[k]; | 421 n = s->exponent_sizes[k]; |
420 j = 0; | 422 j = 0; |
421 pos = 0; | 423 pos = 0; |
422 for(i=0;i<n;i++) { | 424 for(i=0;i<n;i++) { |
423 int start, end; | 425 int start, end; |
525 | 527 |
526 init_coef_vlc(&s->coef_vlc[0], &s->run_table[0], &s->level_table[0], | 528 init_coef_vlc(&s->coef_vlc[0], &s->run_table[0], &s->level_table[0], |
527 &coef_vlcs[coef_vlc_table * 2]); | 529 &coef_vlcs[coef_vlc_table * 2]); |
528 init_coef_vlc(&s->coef_vlc[1], &s->run_table[1], &s->level_table[1], | 530 init_coef_vlc(&s->coef_vlc[1], &s->run_table[1], &s->level_table[1], |
529 &coef_vlcs[coef_vlc_table * 2 + 1]); | 531 &coef_vlcs[coef_vlc_table * 2 + 1]); |
532 | |
533 /* init pow tables */ | |
534 for (i=0 ; i<121 ; i++) { | |
535 s->pow_005_10[i] = pow(10, i * 0.05); | |
536 s->pow_00625_10[i] = pow(10, i * (1.0 / 16.0)); | |
537 } | |
538 | |
530 return 0; | 539 return 0; |
531 } | 540 } |
532 | 541 |
533 /* interpolate values for a bigger or smaller block. The block must | 542 /* interpolate values for a bigger or smaller block. The block must |
534 have multiple sizes */ | 543 have multiple sizes */ |
676 q = s->exponents[ch]; | 685 q = s->exponents[ch]; |
677 q_end = q + s->block_len; | 686 q_end = q + s->block_len; |
678 max_scale = 0; | 687 max_scale = 0; |
679 if (s->version == 1) { | 688 if (s->version == 1) { |
680 last_exp = get_bits(&s->gb, 5) + 10; | 689 last_exp = get_bits(&s->gb, 5) + 10; |
681 /* XXX: use a table */ | 690 v = s->pow_00625_10[last_exp]; |
682 v = pow(10, last_exp * (1.0 / 16.0)); | |
683 max_scale = v; | 691 max_scale = v; |
684 n = *ptr++; | 692 n = *ptr++; |
685 do { | 693 do { |
686 *q++ = v; | 694 *q++ = v; |
687 } while (--n); | 695 } while (--n); |
691 code = get_vlc2(&s->gb, s->exp_vlc.table, EXPVLCBITS, EXPMAX); | 699 code = get_vlc2(&s->gb, s->exp_vlc.table, EXPVLCBITS, EXPMAX); |
692 if (code < 0) | 700 if (code < 0) |
693 return -1; | 701 return -1; |
694 /* NOTE: this offset is the same as MPEG4 AAC ! */ | 702 /* NOTE: this offset is the same as MPEG4 AAC ! */ |
695 last_exp += code - 60; | 703 last_exp += code - 60; |
696 /* XXX: use a table */ | 704 v = s->pow_00625_10[last_exp]; |
697 v = pow(10, last_exp * (1.0 / 16.0)); | |
698 if (v > max_scale) | 705 if (v > max_scale) |
699 max_scale = v; | 706 max_scale = v; |
700 n = *ptr++; | 707 n = *ptr++; |
701 do { | 708 do { |
702 *q++ = v; | 709 *q++ = v; |
937 int i, j, n, n1, last_high_band; | 944 int i, j, n, n1, last_high_band; |
938 float exp_power[HIGH_BAND_MAX_SIZE]; | 945 float exp_power[HIGH_BAND_MAX_SIZE]; |
939 | 946 |
940 coefs1 = s->coefs1[ch]; | 947 coefs1 = s->coefs1[ch]; |
941 exponents = s->exponents[ch]; | 948 exponents = s->exponents[ch]; |
942 mult = pow(10, total_gain * 0.05) / s->max_exponent[ch]; | 949 mult = s->pow_005_10[total_gain] / s->max_exponent[ch]; |
943 mult *= mdct_norm; | 950 mult *= mdct_norm; |
944 coefs = s->coefs[ch]; | 951 coefs = s->coefs[ch]; |
945 if (s->use_noise_coding) { | 952 if (s->use_noise_coding) { |
946 mult1 = mult; | 953 mult1 = mult; |
947 /* very low freqs : noise */ | 954 /* very low freqs : noise */ |
984 s->block_len_bits][j]; | 991 s->block_len_bits][j]; |
985 } | 992 } |
986 if (j >= 0 && s->high_band_coded[ch][j]) { | 993 if (j >= 0 && s->high_band_coded[ch][j]) { |
987 /* use noise with specified power */ | 994 /* use noise with specified power */ |
988 mult1 = sqrt(exp_power[j] / exp_power[last_high_band]); | 995 mult1 = sqrt(exp_power[j] / exp_power[last_high_band]); |
989 /* XXX: use a table */ | 996 mult1 = mult1 * s->pow_005_10[s->high_band_values[ch][j]]; |
990 mult1 = mult1 * pow(10, s->high_band_values[ch][j] * 0.05); | |
991 mult1 = mult1 / (s->max_exponent[ch] * s->noise_mult); | 997 mult1 = mult1 / (s->max_exponent[ch] * s->noise_mult); |
992 mult1 *= mdct_norm; | 998 mult1 *= mdct_norm; |
993 for(i = 0;i < n; i++) { | 999 for(i = 0;i < n; i++) { |
994 noise = s->noise_table[s->noise_index]; | 1000 noise = s->noise_table[s->noise_index]; |
995 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1); | 1001 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1); |