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]) {