diff options
Diffstat (limited to 'apps/codecs')
-rw-r--r-- | apps/codecs/aac.c | 35 |
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 */ |
32 | ALIGN real_t gb_time_buffer[2][1024] IBSS_ATTR_FAAD_LARGE_IRAM; | 32 | #define GB_BUF_SIZE 1024 |
33 | ALIGN real_t gb_fb_intermed[2][1024] IBSS_ATTR_FAAD_LARGE_IRAM; | 33 | ALIGN real_t gb_time_buffer[2][GB_BUF_SIZE] IBSS_ATTR_FAAD_LARGE_IRAM; |
34 | ALIGN 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 */ |
36 | enum codec_status codec_main(void) | 37 | enum 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; |