comparison vorbis_dec.c @ 9676:f39076e0d605 libavcodec

Use iMDCT output scaling to simplify ffvorbis and make it slightly faster.
author serge
date Wed, 20 May 2009 07:26:09 +0000
parents 2e84b386a8b6
children 6fd0b776f838
comparison
equal deleted inserted replaced
9675:2e84b386a8b6 9676:f39076e0d605
208 av_free(vc->mappings[i].magnitude); 208 av_free(vc->mappings[i].magnitude);
209 av_free(vc->mappings[i].angle); 209 av_free(vc->mappings[i].angle);
210 av_free(vc->mappings[i].mux); 210 av_free(vc->mappings[i].mux);
211 } 211 }
212 av_freep(&vc->mappings); 212 av_freep(&vc->mappings);
213
214 if(vc->exp_bias){
215 av_freep(&vc->win[0]);
216 av_freep(&vc->win[1]);
217 }
218 } 213 }
219 214
220 // Parse setup header ------------------------------------------------- 215 // Parse setup header -------------------------------------------------
221 216
222 // Process codebooks part 217 // Process codebooks part
874 return 4; 869 return 4;
875 } 870 }
876 vc->win[0]=ff_vorbis_vwin[bl0-6]; 871 vc->win[0]=ff_vorbis_vwin[bl0-6];
877 vc->win[1]=ff_vorbis_vwin[bl1-6]; 872 vc->win[1]=ff_vorbis_vwin[bl1-6];
878 873
879 if(vc->exp_bias){
880 int i, j;
881 for(j=0; j<2; j++){
882 float *win = av_malloc(vc->blocksize[j]/2 * sizeof(float));
883 for(i=0; i<vc->blocksize[j]/2; i++)
884 win[i] = vc->win[j][i] * (1<<15);
885 vc->win[j] = win;
886 }
887 }
888
889 if ((get_bits1(gb)) == 0) { 874 if ((get_bits1(gb)) == 0) {
890 av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (framing flag not set). \n"); 875 av_log(vc->avccontext, AV_LOG_ERROR, " Vorbis id header packet corrupt (framing flag not set). \n");
891 return 2; 876 return 2;
892 } 877 }
893 878
894 vc->channel_residues= av_malloc((vc->blocksize[1]/2)*vc->audio_channels * sizeof(float)); 879 vc->channel_residues= av_malloc((vc->blocksize[1]/2)*vc->audio_channels * sizeof(float));
895 vc->channel_floors = av_malloc((vc->blocksize[1]/2)*vc->audio_channels * sizeof(float)); 880 vc->channel_floors = av_malloc((vc->blocksize[1]/2)*vc->audio_channels * sizeof(float));
896 vc->saved = av_mallocz((vc->blocksize[1]/4)*vc->audio_channels * sizeof(float)); 881 vc->saved = av_mallocz((vc->blocksize[1]/4)*vc->audio_channels * sizeof(float));
897 vc->previous_window=0; 882 vc->previous_window=0;
898 883
899 ff_mdct_init(&vc->mdct[0], bl0, 1, -1.0); 884 ff_mdct_init(&vc->mdct[0], bl0, 1, vc->exp_bias ? -(1<<15) : -1.0);
900 ff_mdct_init(&vc->mdct[1], bl1, 1, -1.0); 885 ff_mdct_init(&vc->mdct[1], bl1, 1, vc->exp_bias ? -(1<<15) : -1.0);
901 886
902 AV_DEBUG(" vorbis version %d \n audio_channels %d \n audio_samplerate %d \n bitrate_max %d \n bitrate_nom %d \n bitrate_min %d \n blk_0 %d blk_1 %d \n ", 887 AV_DEBUG(" vorbis version %d \n audio_channels %d \n audio_samplerate %d \n bitrate_max %d \n bitrate_nom %d \n bitrate_min %d \n blk_0 %d blk_1 %d \n ",
903 vc->version, vc->audio_channels, vc->audio_samplerate, vc->bitrate_maximum, vc->bitrate_nominal, vc->bitrate_minimum, vc->blocksize[0], vc->blocksize[1]); 888 vc->version, vc->audio_channels, vc->audio_samplerate, vc->bitrate_maximum, vc->bitrate_nominal, vc->bitrate_minimum, vc->blocksize[0], vc->blocksize[1]);
904 889
905 /* 890 /*
1408 1393
1409 static void copy_normalize(float *dst, float *src, int len, int exp_bias, float add_bias) 1394 static void copy_normalize(float *dst, float *src, int len, int exp_bias, float add_bias)
1410 { 1395 {
1411 int i; 1396 int i;
1412 if(exp_bias) { 1397 if(exp_bias) {
1413 for(i=0; i<len; i++) 1398 memcpy(dst, src, len * sizeof(float));
1414 ((uint32_t*)dst)[i] = ((uint32_t*)src)[i] + exp_bias; // dst[k]=src[i]*(1<<bias)
1415 } else { 1399 } else {
1416 for(i=0; i<len; i++) 1400 for(i=0; i<len; i++)
1417 dst[i] = src[i] + add_bias; 1401 dst[i] = src[i] + add_bias;
1418 } 1402 }
1419 } 1403 }