Mercurial > libavcodec.hg
comparison dca.c @ 11625:1492bdc1d9d0 libavcodec
DCA: optimise dca_subsubframe()
8% faster overall on Cortex-A8.
author | mru |
---|---|
date | Tue, 13 Apr 2010 10:15:00 +0000 |
parents | bb17732c00ef |
children | 4c120a633832 |
comparison
equal
deleted
inserted
replaced
11624:a01c36c52702 | 11625:1492bdc1d9d0 |
---|---|
917 int subsubframe = s->current_subsubframe; | 917 int subsubframe = s->current_subsubframe; |
918 | 918 |
919 const float *quant_step_table; | 919 const float *quant_step_table; |
920 | 920 |
921 /* FIXME */ | 921 /* FIXME */ |
922 float subband_samples[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][8]; | 922 LOCAL_ALIGNED_16(float, subband_samples, [DCA_PRIM_CHANNELS_MAX], [DCA_SUBBANDS][8]); |
923 LOCAL_ALIGNED_16(int, block, [8]); | |
923 | 924 |
924 /* | 925 /* |
925 * Audio data | 926 * Audio data |
926 */ | 927 */ |
927 | 928 |
937 | 938 |
938 /* Select the mid-tread linear quantizer */ | 939 /* Select the mid-tread linear quantizer */ |
939 int abits = s->bitalloc[k][l]; | 940 int abits = s->bitalloc[k][l]; |
940 | 941 |
941 float quant_step_size = quant_step_table[abits]; | 942 float quant_step_size = quant_step_table[abits]; |
942 float rscale; | |
943 | 943 |
944 /* | 944 /* |
945 * Determine quantization index code book and its type | 945 * Determine quantization index code book and its type |
946 */ | 946 */ |
947 | 947 |
951 /* | 951 /* |
952 * Extract bits from the bit stream | 952 * Extract bits from the bit stream |
953 */ | 953 */ |
954 if(!abits){ | 954 if(!abits){ |
955 memset(subband_samples[k][l], 0, 8 * sizeof(subband_samples[0][0][0])); | 955 memset(subband_samples[k][l], 0, 8 * sizeof(subband_samples[0][0][0])); |
956 }else if(abits >= 11 || !dca_smpl_bitalloc[abits].vlc[sel].table){ | 956 } else { |
957 /* Deal with transients */ | |
958 int sfi = s->transition_mode[k][l] && subsubframe >= s->transition_mode[k][l]; | |
959 float rscale = quant_step_size * s->scale_factor[k][l][sfi] * s->scalefactor_adj[k][sel]; | |
960 | |
961 if(abits >= 11 || !dca_smpl_bitalloc[abits].vlc[sel].table){ | |
957 if(abits <= 7){ | 962 if(abits <= 7){ |
958 /* Block code */ | 963 /* Block code */ |
959 int block_code1, block_code2, size, levels; | 964 int block_code1, block_code2, size, levels; |
960 int block[8]; | |
961 | 965 |
962 size = abits_sizes[abits-1]; | 966 size = abits_sizes[abits-1]; |
963 levels = abits_levels[abits-1]; | 967 levels = abits_levels[abits-1]; |
964 | 968 |
965 block_code1 = get_bits(&s->gb, size); | 969 block_code1 = get_bits(&s->gb, size); |
966 /* FIXME Should test return value */ | 970 /* FIXME Should test return value */ |
967 decode_blockcode(block_code1, levels, block); | 971 decode_blockcode(block_code1, levels, block); |
968 block_code2 = get_bits(&s->gb, size); | 972 block_code2 = get_bits(&s->gb, size); |
969 decode_blockcode(block_code2, levels, &block[4]); | 973 decode_blockcode(block_code2, levels, &block[4]); |
970 for (m = 0; m < 8; m++) | |
971 subband_samples[k][l][m] = block[m]; | |
972 }else{ | 974 }else{ |
973 /* no coding */ | 975 /* no coding */ |
974 for (m = 0; m < 8; m++) | 976 for (m = 0; m < 8; m++) |
975 subband_samples[k][l][m] = get_sbits(&s->gb, abits - 3); | 977 block[m] = get_sbits(&s->gb, abits - 3); |
976 } | 978 } |
977 }else{ | 979 }else{ |
978 /* Huffman coded */ | 980 /* Huffman coded */ |
979 for (m = 0; m < 8; m++) | 981 for (m = 0; m < 8; m++) |
980 subband_samples[k][l][m] = get_bitalloc(&s->gb, &dca_smpl_bitalloc[abits], sel); | 982 block[m] = get_bitalloc(&s->gb, &dca_smpl_bitalloc[abits], sel); |
981 } | 983 } |
982 | 984 |
983 /* Deal with transients */ | 985 s->dsp.int32_to_float_fmul_scalar(subband_samples[k][l], |
984 if (s->transition_mode[k][l] && | 986 block, rscale, 8); |
985 subsubframe >= s->transition_mode[k][l]) | 987 } |
986 rscale = quant_step_size * s->scale_factor[k][l][1]; | |
987 else | |
988 rscale = quant_step_size * s->scale_factor[k][l][0]; | |
989 | |
990 rscale *= s->scalefactor_adj[k][sel]; | |
991 | |
992 for (m = 0; m < 8; m++) | |
993 subband_samples[k][l][m] *= rscale; | |
994 | 988 |
995 /* | 989 /* |
996 * Inverse ADPCM if in prediction mode | 990 * Inverse ADPCM if in prediction mode |
997 */ | 991 */ |
998 if (s->prediction_mode[k][l]) { | 992 if (s->prediction_mode[k][l]) { |