Mercurial > libavcodec.hg
changeset 10494:ead8d96926c4 libavcodec
Reduce stack memory allocation in MP3 decoder
author | vitor |
---|---|
date | Wed, 04 Nov 2009 23:33:08 +0000 |
parents | 5f2ced30548b |
children | 8e91a3efdbd2 |
files | mpegaudio.h mpegaudiodec.c |
diffstat | 2 files changed, 28 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/mpegaudio.h Wed Nov 04 19:29:29 2009 +0000 +++ b/mpegaudio.h Wed Nov 04 23:33:08 2009 +0000 @@ -88,7 +88,25 @@ #define BACKSTEP_SIZE 512 #define EXTRABYTES 24 -struct GranuleDef; +/* layer 3 "granule" */ +typedef struct GranuleDef { + uint8_t scfsi; + int part2_3_length; + int big_values; + int global_gain; + int scalefac_compress; + uint8_t block_type; + uint8_t switch_point; + int table_select[3]; + int subblock_gain[3]; + uint8_t scalefac_scale; + uint8_t count1table_select; + int region_size[3]; /* number of huffman codes in each region */ + int preflag; + int short_start, long_end; /* long/short band indexes */ + uint8_t scale_factors[40]; + int32_t sb_hybrid[SBLIMIT * 18]; /* 576 samples */ +} GranuleDef; #define MPA_DECODE_HEADER \ int frame_size; \ @@ -118,6 +136,7 @@ int synth_buf_offset[MPA_MAX_CHANNELS]; DECLARE_ALIGNED_16(int32_t, sb_samples[MPA_MAX_CHANNELS][36][SBLIMIT]); int32_t mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */ + GranuleDef granules[2][2]; /* Used in Layer 3 */ #ifdef DEBUG int frame_count; #endif
--- a/mpegaudiodec.c Wed Nov 04 19:29:29 2009 +0000 +++ b/mpegaudiodec.c Wed Nov 04 23:33:08 2009 +0000 @@ -49,26 +49,6 @@ #define HEADER_SIZE 4 -/* layer 3 "granule" */ -typedef struct GranuleDef { - uint8_t scfsi; - int part2_3_length; - int big_values; - int global_gain; - int scalefac_compress; - uint8_t block_type; - uint8_t switch_point; - int table_select[3]; - int subblock_gain[3]; - uint8_t scalefac_scale; - uint8_t count1table_select; - int region_size[3]; /* number of huffman codes in each region */ - int preflag; - int short_start, long_end; /* long/short band indexes */ - uint8_t scale_factors[40]; - int32_t sb_hybrid[SBLIMIT * 18]; /* 576 samples */ -} GranuleDef; - #include "mpegaudiodata.h" #include "mpegaudiodectab.h" @@ -1912,7 +1892,7 @@ { int nb_granules, main_data_begin, private_bits; int gr, ch, blocksplit_flag, i, j, k, n, bits_pos; - GranuleDef granules[2][2], *g; + GranuleDef *g; int16_t exponents[576]; /* read side info */ @@ -1928,15 +1908,15 @@ private_bits = get_bits(&s->gb, 5); nb_granules = 2; for(ch=0;ch<s->nb_channels;ch++) { - granules[ch][0].scfsi = 0; /* all scale factors are transmitted */ - granules[ch][1].scfsi = get_bits(&s->gb, 4); + s->granules[ch][0].scfsi = 0;/* all scale factors are transmitted */ + s->granules[ch][1].scfsi = get_bits(&s->gb, 4); } } for(gr=0;gr<nb_granules;gr++) { for(ch=0;ch<s->nb_channels;ch++) { dprintf(s->avctx, "gr=%d ch=%d: side_info\n", gr, ch); - g = &granules[ch][gr]; + g = &s->granules[ch][gr]; g->part2_3_length = get_bits(&s->gb, 12); g->big_values = get_bits(&s->gb, 9); if(g->big_values > 288){ @@ -2008,7 +1988,7 @@ for(gr=0;gr<nb_granules;gr++) { for(ch=0;ch<s->nb_channels;ch++) { - g = &granules[ch][gr]; + g = &s->granules[ch][gr]; if(get_bits_count(&s->gb)<0){ av_log(s->avctx, AV_LOG_DEBUG, "mdb:%d, lastbuf:%d skipping granule %d\n", main_data_begin, s->last_buf_size, gr); @@ -2052,7 +2032,7 @@ g->scale_factors[j++] = 0; } } else { - sc = granules[ch][0].scale_factors; + sc = s->granules[ch][0].scale_factors; j = 0; for(k=0;k<4;k++) { n = (k == 0 ? 6 : 5); @@ -2137,10 +2117,10 @@ } /* ch */ if (s->nb_channels == 2) - compute_stereo(s, &granules[0][gr], &granules[1][gr]); + compute_stereo(s, &s->granules[0][gr], &s->granules[1][gr]); for(ch=0;ch<s->nb_channels;ch++) { - g = &granules[ch][gr]; + g = &s->granules[ch][gr]; reorder_block(s, g); s->compute_antialias(s, g);