Mercurial > libavcodec.hg
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 |