summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorAndree Buschmann <AndreeBuschmann@t-online.de>2010-07-02 04:35:37 +0000
committerAndree Buschmann <AndreeBuschmann@t-online.de>2010-07-02 04:35:37 +0000
commitbcbe317565f91f2f0f10186dfa32c8847f58df9f (patch)
treeb591ffb0f950258458ee25f4bebfb1cdfc792a3b /apps
parentf58174f7cc1c04436414350916426e2d854fa96f (diff)
downloadrockbox-bcbe317565f91f2f0f10186dfa32c8847f58df9f.tar.gz
rockbox-bcbe317565f91f2f0f10186dfa32c8847f58df9f.zip
r27225 broke AAC HE profile decoding due to missing check for buffersize. Introduce a check of needed buffersize and decide whether to use a static buffer from IRAM or faad's internal allocation routines.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27231 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/codecs/aac.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/apps/codecs/aac.c b/apps/codecs/aac.c
index 1daa7de11b..0c9aceed09 100644
--- a/apps/codecs/aac.c
+++ b/apps/codecs/aac.c
@@ -29,8 +29,9 @@ CODEC_HEADER
29 29
30/* Global buffers to be used in the mdct synthesis. This way the arrays can 30/* Global buffers to be used in the mdct synthesis. This way the arrays can
31 * be moved to IRAM for some targets */ 31 * be moved to IRAM for some targets */
32ALIGN real_t gb_time_buffer[2][1024] IBSS_ATTR_FAAD_LARGE_IRAM; 32#define GB_BUF_SIZE 1024
33ALIGN real_t gb_fb_intermed[2][1024] IBSS_ATTR_FAAD_LARGE_IRAM; 33ALIGN real_t gb_time_buffer[2][GB_BUF_SIZE] IBSS_ATTR_FAAD_LARGE_IRAM;
34ALIGN real_t gb_fb_intermed[2][GB_BUF_SIZE] IBSS_ATTR_FAAD_LARGE_IRAM;
34 35
35/* this is the codec entry point */ 36/* this is the codec entry point */
36enum codec_status codec_main(void) 37enum codec_status codec_main(void)
@@ -51,6 +52,7 @@ enum codec_status codec_main(void)
51 int file_offset; 52 int file_offset;
52 int framelength; 53 int framelength;
53 int lead_trim = 0; 54 int lead_trim = 0;
55 int needed_bufsize;
54 unsigned int i; 56 unsigned int i;
55 unsigned char* buffer; 57 unsigned char* buffer;
56 static NeAACDecFrameInfo frame_info; 58 static NeAACDecFrameInfo frame_info;
@@ -113,11 +115,30 @@ next_track:
113 115
114 /* Set pointer to be able to use IRAM an to avoid alloc in decoder. Must 116 /* Set pointer to be able to use IRAM an to avoid alloc in decoder. Must
115 * be called after NeAACDecOpen(). */ 117 * be called after NeAACDecOpen(). */
116 decoder->time_out[0] = &gb_time_buffer[0][0]; 118 /* A buffer of framelength or 2*frameLenght size must be allocated for
117 decoder->time_out[1] = &gb_time_buffer[1][0]; 119 * time_out. If frameLength is too big or SBR/forceUpSampling is active,
118 decoder->fb_intermed[0] = &gb_fb_intermed[0][0]; 120 * we do not use the IRAM buffer and keep faad's internal allocation (see
119 decoder->fb_intermed[1] = &gb_fb_intermed[1][0]; 121 * specrec.c). */
120 122 needed_bufsize = decoder->frameLength;
123 if ((decoder->sbr_present_flag == 1) || (decoder->forceUpSampling == 1))
124 {
125 needed_bufsize *= 2;
126 }
127 if (needed_bufsize <= GB_BUF_SIZE)
128 {
129 decoder->time_out[0] = &gb_time_buffer[0][0];
130 decoder->time_out[1] = &gb_time_buffer[1][0];
131 }
132 /* A buffer of with frameLength elements must be allocated for fb_intermed.
133 * If frameLength is too big, we do not use the IRAM buffer and keep faad's
134 * internal allocation (see specrec.c). */
135 needed_bufsize = decoder->frameLength;
136 if (needed_bufsize <= GB_BUF_SIZE)
137 {
138 decoder->fb_intermed[0] = &gb_fb_intermed[0][0];
139 decoder->fb_intermed[1] = &gb_fb_intermed[1][0];
140 }
141
121 ci->id3->frequency = s; 142 ci->id3->frequency = s;
122 143
123 i = 0; 144 i = 0;