comparison vorbis_dec.c @ 7285:1fe3ae6a9491 libavcodec

vorbis: reduce memory by reusing buffers
author lorenm
date Tue, 15 Jul 2008 23:04:28 +0000
parents a40ae5adf74c
children e267f2519248
comparison
equal deleted inserted replaced
7284:a40ae5adf74c 7285:1fe3ae6a9491
151 uint_fast8_t mode_number; // mode number for the current packet 151 uint_fast8_t mode_number; // mode number for the current packet
152 uint_fast8_t previous_window; 152 uint_fast8_t previous_window;
153 float *channel_residues; 153 float *channel_residues;
154 float *channel_floors; 154 float *channel_floors;
155 float *saved; 155 float *saved;
156 float *ret;
157 float *buf;
158 float *buf_tmp;
159 uint_fast32_t add_bias; // for float->int conversion 156 uint_fast32_t add_bias; // for float->int conversion
160 uint_fast32_t exp_bias; 157 uint_fast32_t exp_bias;
161 } vorbis_context; 158 } vorbis_context;
162 159
163 /* Helper functions */ 160 /* Helper functions */
179 int_fast16_t i; 176 int_fast16_t i;
180 177
181 av_freep(&vc->channel_residues); 178 av_freep(&vc->channel_residues);
182 av_freep(&vc->channel_floors); 179 av_freep(&vc->channel_floors);
183 av_freep(&vc->saved); 180 av_freep(&vc->saved);
184 av_freep(&vc->ret);
185 av_freep(&vc->buf);
186 av_freep(&vc->buf_tmp);
187 181
188 av_freep(&vc->residues); 182 av_freep(&vc->residues);
189 av_freep(&vc->modes); 183 av_freep(&vc->modes);
190 184
191 ff_mdct_end(&vc->mdct[0]); 185 ff_mdct_end(&vc->mdct[0]);
898 } 892 }
899 893
900 vc->channel_residues= av_malloc((vc->blocksize[1]/2)*vc->audio_channels * sizeof(float)); 894 vc->channel_residues= av_malloc((vc->blocksize[1]/2)*vc->audio_channels * sizeof(float));
901 vc->channel_floors = 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));
902 vc->saved = av_mallocz((vc->blocksize[1]/4)*vc->audio_channels * sizeof(float)); 896 vc->saved = av_mallocz((vc->blocksize[1]/4)*vc->audio_channels * sizeof(float));
903 vc->ret = av_malloc((vc->blocksize[1]/2)*vc->audio_channels * sizeof(float));
904 vc->buf = av_malloc( vc->blocksize[1]/2 * sizeof(float));
905 vc->buf_tmp = av_malloc( vc->blocksize[1]/2 * sizeof(float));
906 vc->previous_window=0; 897 vc->previous_window=0;
907 898
908 ff_mdct_init(&vc->mdct[0], bl0, 1); 899 ff_mdct_init(&vc->mdct[0], bl0, 1);
909 ff_mdct_init(&vc->mdct[1], bl1, 1); 900 ff_mdct_init(&vc->mdct[1], bl1, 1);
910 901
1421 1412
1422 uint_fast8_t previous_window=vc->previous_window; 1413 uint_fast8_t previous_window=vc->previous_window;
1423 uint_fast8_t mode_number; 1414 uint_fast8_t mode_number;
1424 uint_fast8_t blockflag; 1415 uint_fast8_t blockflag;
1425 uint_fast16_t blocksize; 1416 uint_fast16_t blocksize;
1426 int_fast32_t i,j; 1417 int_fast32_t i,j,dir;
1427 uint_fast8_t no_residue[vc->audio_channels]; 1418 uint_fast8_t no_residue[vc->audio_channels];
1428 uint_fast8_t do_not_decode[vc->audio_channels]; 1419 uint_fast8_t do_not_decode[vc->audio_channels];
1429 vorbis_mapping *mapping; 1420 vorbis_mapping *mapping;
1430 float *ch_res_ptr=vc->channel_residues; 1421 float *ch_res_ptr=vc->channel_residues;
1431 float *ch_floor_ptr=vc->channel_floors; 1422 float *ch_floor_ptr=vc->channel_floors;
1523 } 1514 }
1524 1515
1525 // MDCT, overlap/add, save data for next overlapping FPMATH 1516 // MDCT, overlap/add, save data for next overlapping FPMATH
1526 1517
1527 retlen = (blocksize + vc->blocksize[previous_window])/4; 1518 retlen = (blocksize + vc->blocksize[previous_window])/4;
1528 for(j=0;j<vc->audio_channels;++j) { 1519 dir = retlen <= blocksize/2; // pick an order so that ret[] can reuse residues[] without stepping on any data we need
1520 for(j=dir?0:vc->audio_channels-1; (unsigned)j<vc->audio_channels; j+=dir*2-1) {
1529 uint_fast16_t bs0=vc->blocksize[0]; 1521 uint_fast16_t bs0=vc->blocksize[0];
1530 uint_fast16_t bs1=vc->blocksize[1]; 1522 uint_fast16_t bs1=vc->blocksize[1];
1523 float *residue=vc->channel_residues+res_chan[j]*blocksize/2;
1524 float *floor=vc->channel_floors+j*blocksize/2;
1531 float *saved=vc->saved+j*bs1/4; 1525 float *saved=vc->saved+j*bs1/4;
1532 float *ret=vc->ret+j*retlen; 1526 float *ret=vc->channel_residues+j*retlen;
1533 float *buf=vc->buf; 1527 float *buf=floor;
1534 const float *win=vc->win[blockflag&previous_window]; 1528 const float *win=vc->win[blockflag&previous_window];
1535 1529
1536 vc->mdct[0].fft.imdct_half(&vc->mdct[blockflag], buf, vc->channel_floors+j*blocksize/2, vc->buf_tmp); 1530 vc->mdct[0].fft.imdct_half(&vc->mdct[blockflag], buf, floor, residue);
1537 1531
1538 if(blockflag == previous_window) { 1532 if(blockflag == previous_window) {
1539 vc->dsp.vector_fmul_window(ret, saved, buf, win, fadd_bias, blocksize/4); 1533 vc->dsp.vector_fmul_window(ret, saved, buf, win, fadd_bias, blocksize/4);
1540 } else if(blockflag > previous_window) { 1534 } else if(blockflag > previous_window) {
1541 vc->dsp.vector_fmul_window(ret, saved, buf, win, fadd_bias, bs0/4); 1535 vc->dsp.vector_fmul_window(ret, saved, buf, win, fadd_bias, bs0/4);
1583 return buf_size ; 1577 return buf_size ;
1584 } 1578 }
1585 1579
1586 AV_DEBUG("parsed %d bytes %d bits, returned %d samples (*ch*bits) \n", get_bits_count(gb)/8, get_bits_count(gb)%8, len); 1580 AV_DEBUG("parsed %d bytes %d bits, returned %d samples (*ch*bits) \n", get_bits_count(gb)/8, get_bits_count(gb)%8, len);
1587 1581
1588 vc->dsp.float_to_int16_interleave(data, vc->ret, len, vc->audio_channels); 1582 vc->dsp.float_to_int16_interleave(data, vc->channel_residues, len, vc->audio_channels);
1589 *data_size=len*2*vc->audio_channels; 1583 *data_size=len*2*vc->audio_channels;
1590 1584
1591 return buf_size ; 1585 return buf_size ;
1592 } 1586 }
1593 1587