From cf92cec7d8899ef887869628c66da30737ee54af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Fri, 23 Jan 2009 12:09:32 +0000 Subject: [PATCH] Avoid allocating MPADecodeContext on stack. Instead move relevant fields into MPADecodeHeader and use it where appropriate. Originally committed as revision 16728 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/mpegaudio.h | 27 +++++++++++++++++---------- libavcodec/mpegaudio_parser.c | 7 +++---- libavcodec/mpegaudiodec.c | 6 +++--- libavcodec/mpegaudiodecheader.c | 2 +- libavcodec/mpegaudiodecheader.h | 2 +- libavformat/mp3.c | 2 +- 6 files changed, 26 insertions(+), 20 deletions(-) diff --git a/libavcodec/mpegaudio.h b/libavcodec/mpegaudio.h index 96bea310a8..f32e6abf2e 100644 --- a/libavcodec/mpegaudio.h +++ b/libavcodec/mpegaudio.h @@ -90,23 +90,30 @@ typedef int32_t MPA_INT; struct GranuleDef; +#define MPA_DECODE_HEADER \ + int frame_size; \ + int error_protection; \ + int layer; \ + int sample_rate; \ + int sample_rate_index; /* between 0 and 8 */ \ + int bit_rate; \ + int nb_channels; \ + int mode; \ + int mode_ext; \ + int lsf; + +typedef struct MPADecodeHeader { + MPA_DECODE_HEADER +} MPADecodeHeader; + typedef struct MPADecodeContext { + MPA_DECODE_HEADER DECLARE_ALIGNED_8(uint8_t, last_buf[2*BACKSTEP_SIZE + EXTRABYTES]); int last_buf_size; - int frame_size; /* next header (used in free format parsing) */ uint32_t free_format_next_header; - int error_protection; - int layer; - int sample_rate; - int sample_rate_index; /* between 0 and 8 */ - int bit_rate; GetBitContext gb; GetBitContext in_gb; - int nb_channels; - int mode; - int mode_ext; - int lsf; DECLARE_ALIGNED_16(MPA_INT, synth_buf[MPA_MAX_CHANNELS][512 * 2]); int synth_buf_offset[MPA_MAX_CHANNELS]; DECLARE_ALIGNED_16(int32_t, sb_samples[MPA_MAX_CHANNELS][36][SBLIMIT]); diff --git a/libavcodec/mpegaudio_parser.c b/libavcodec/mpegaudio_parser.c index b06b15a56d..646da8b67d 100644 --- a/libavcodec/mpegaudio_parser.c +++ b/libavcodec/mpegaudio_parser.c @@ -46,8 +46,7 @@ typedef struct MpegAudioParseContext { header, otherwise the coded frame size in bytes */ int ff_mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate, int *channels, int *frame_size, int *bit_rate) { - MPADecodeContext s1, *s = &s1; - s1.avctx = avctx; + MPADecodeHeader s1, *s = &s1; if (ff_mpa_check_header(head) != 0) return -1; @@ -145,7 +144,7 @@ static int mpegaudio_parse(AVCodecParserContext *s1, #if 0 /* free format: prepare to compute frame size */ - if (ff_mpegaudio_decode_header(s, header) == 1) { + if (ff_mpegaudio_decode_header((MPADecodeHeader *)s, header) == 1) { s->frame_size = -1; } #endif @@ -200,7 +199,7 @@ static int mpegaudio_parse(AVCodecParserContext *s1, s->free_format_frame_size -= padding; dprintf(avctx, "free frame size=%d padding=%d\n", s->free_format_frame_size, padding); - ff_mpegaudio_decode_header(s, header1); + ff_mpegaudio_decode_header((MPADecodeHeader *)s, header1); goto next_data; } p++; diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c index fab487edc7..080da058ed 100644 --- a/libavcodec/mpegaudiodec.c +++ b/libavcodec/mpegaudiodec.c @@ -2277,7 +2277,7 @@ retry: goto retry; } - if (ff_mpegaudio_decode_header(s, header) == 1) { + if (ff_mpegaudio_decode_header((MPADecodeHeader *)s, header) == 1) { /* free format: prepare to compute frame size */ s->frame_size = -1; return -1; @@ -2342,7 +2342,7 @@ static int decode_frame_adu(AVCodecContext * avctx, return buf_size; } - ff_mpegaudio_decode_header(s, header); + ff_mpegaudio_decode_header((MPADecodeHeader *)s, header); /* update codec info */ avctx->sample_rate = s->sample_rate; avctx->channels = s->nb_channels; @@ -2491,7 +2491,7 @@ static int decode_frame_mp3on4(AVCodecContext * avctx, if (ff_mpa_check_header(header) < 0) // Bad header, discard block break; - ff_mpegaudio_decode_header(m, header); + ff_mpegaudio_decode_header((MPADecodeHeader *)m, header); out_size += mp_decode_frame(m, outptr, buf, fsize); buf += fsize; len -= fsize; diff --git a/libavcodec/mpegaudiodecheader.c b/libavcodec/mpegaudiodecheader.c index 2e5168e05d..807d6244dc 100644 --- a/libavcodec/mpegaudiodecheader.c +++ b/libavcodec/mpegaudiodecheader.c @@ -30,7 +30,7 @@ #include "mpegaudiodata.h" -int ff_mpegaudio_decode_header(MPADecodeContext *s, uint32_t header) +int ff_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header) { int sample_rate, frame_size, mpeg25, padding; int sample_rate_index, bitrate_index; diff --git a/libavcodec/mpegaudiodecheader.h b/libavcodec/mpegaudiodecheader.h index 09757817ff..b7775f6001 100644 --- a/libavcodec/mpegaudiodecheader.h +++ b/libavcodec/mpegaudiodecheader.h @@ -34,6 +34,6 @@ /* header decoding. MUST check the header before because no consistency check is done there. Return 1 if free format found and that the frame size must be computed externally */ -int ff_mpegaudio_decode_header(MPADecodeContext *s, uint32_t header); +int ff_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header); #endif /* AVCODEC_MPEGAUDIODECHEADER_H */ diff --git a/libavformat/mp3.c b/libavformat/mp3.c index eca9ad4240..8602206bd1 100644 --- a/libavformat/mp3.c +++ b/libavformat/mp3.c @@ -395,7 +395,7 @@ static int mp3_parse_vbr_tags(AVFormatContext *s, AVStream *st, int64_t base) uint32_t v, spf; int frames = -1; /* Total number of frames in file */ const int64_t xing_offtbl[2][2] = {{32, 17}, {17,9}}; - MPADecodeContext c; + MPADecodeHeader c; int vbrtag_size = 0; v = get_be32(s->pb);