diff options
Diffstat (limited to 'apps/codecs/Tremor/mapping0.c')
-rw-r--r-- | apps/codecs/Tremor/mapping0.c | 55 |
1 files changed, 11 insertions, 44 deletions
diff --git a/apps/codecs/Tremor/mapping0.c b/apps/codecs/Tremor/mapping0.c index 26d6289d4e..c88f072706 100644 --- a/apps/codecs/Tremor/mapping0.c +++ b/apps/codecs/Tremor/mapping0.c | |||
@@ -180,12 +180,6 @@ static vorbis_info_mapping *mapping0_unpack(vorbis_info *vi,oggpack_buffer *opb) | |||
180 | } | 180 | } |
181 | 181 | ||
182 | 182 | ||
183 | /* IRAM buffer keep the pcm data; only for windows size upto 2048 | ||
184 | for space restrictions. No real compromise, larger window sizes | ||
185 | are only used for very low quality settings (q<0?) */ | ||
186 | #define IRAM_PCM_SIZE 2048 | ||
187 | static ogg_int32_t pcm_iram[IRAM_PCM_SIZE] IDATA_ATTR; | ||
188 | |||
189 | static int seq = 0; | 183 | static int seq = 0; |
190 | 184 | ||
191 | #define CHANNELS 2 /* max 2 channels on the ihp-1xx (stereo) */ | 185 | #define CHANNELS 2 /* max 2 channels on the ihp-1xx (stereo) */ |
@@ -201,11 +195,12 @@ static int mapping0_inverse(vorbis_block *vb,vorbis_look_mapping *l){ | |||
201 | int i,j; | 195 | int i,j; |
202 | long n=vb->pcmend=ci->blocksizes[vb->W]; | 196 | long n=vb->pcmend=ci->blocksizes[vb->W]; |
203 | 197 | ||
204 | /* statically allocate mapping structures in IRAM */ | 198 | /* bounded mapping arrays instead of using alloca(); |
205 | static ogg_int32_t *pcmbundle[CHANNELS] IDATA_ATTR; | 199 | avoids memory leak; we can only deal with stereo anyway */ |
206 | static int zerobundle[CHANNELS] IDATA_ATTR; | 200 | ogg_int32_t *pcmbundle[CHANNELS]; |
207 | static int nonzero[CHANNELS] IDATA_ATTR; | 201 | int zerobundle[CHANNELS]; |
208 | static void *floormemo[CHANNELS] IDATA_ATTR; | 202 | int nonzero[CHANNELS]; |
203 | void *floormemo[CHANNELS]; | ||
209 | 204 | ||
210 | /* test for too many channels; | 205 | /* test for too many channels; |
211 | (maybe this is can be checked at the stream level?) */ | 206 | (maybe this is can be checked at the stream level?) */ |
@@ -249,7 +244,7 @@ static int mapping0_inverse(vorbis_block *vb,vorbis_look_mapping *l){ | |||
249 | pcmbundle[ch_in_bundle++]=vb->pcm[j]; | 244 | pcmbundle[ch_in_bundle++]=vb->pcm[j]; |
250 | } | 245 | } |
251 | } | 246 | } |
252 | 247 | ||
253 | look->residue_func[i]->inverse(vb,look->residue_look[i], | 248 | look->residue_func[i]->inverse(vb,look->residue_look[i], |
254 | pcmbundle,zerobundle,ch_in_bundle); | 249 | pcmbundle,zerobundle,ch_in_bundle); |
255 | } | 250 | } |
@@ -286,13 +281,10 @@ static int mapping0_inverse(vorbis_block *vb,vorbis_look_mapping *l){ | |||
286 | } | 281 | } |
287 | } | 282 | } |
288 | 283 | ||
284 | |||
289 | //for(j=0;j<vi->channels;j++) | 285 | //for(j=0;j<vi->channels;j++) |
290 | //_analysis_output("residue",seq+j,vb->pcm[j],-8,n/2,0,0); | 286 | //_analysis_output("residue",seq+j,vb->pcm[j],-8,n/2,0,0); |
291 | 287 | ||
292 | |||
293 | /* pbv: removed this loop by fusion with the following one | ||
294 | to avoid recopying data to/from the IRAM */ | ||
295 | #if 0 | ||
296 | /* compute and apply spectral envelope */ | 288 | /* compute and apply spectral envelope */ |
297 | for(i=0;i<vi->channels;i++){ | 289 | for(i=0;i<vi->channels;i++){ |
298 | ogg_int32_t *pcm=vb->pcm[i]; | 290 | ogg_int32_t *pcm=vb->pcm[i]; |
@@ -300,7 +292,6 @@ static int mapping0_inverse(vorbis_block *vb,vorbis_look_mapping *l){ | |||
300 | look->floor_func[submap]-> | 292 | look->floor_func[submap]-> |
301 | inverse2(vb,look->floor_look[submap],floormemo[i],pcm); | 293 | inverse2(vb,look->floor_look[submap],floormemo[i],pcm); |
302 | } | 294 | } |
303 | #endif | ||
304 | 295 | ||
305 | //for(j=0;j<vi->channels;j++) | 296 | //for(j=0;j<vi->channels;j++) |
306 | //_analysis_output("mdct",seq+j,vb->pcm[j],-24,n/2,0,1); | 297 | //_analysis_output("mdct",seq+j,vb->pcm[j],-24,n/2,0,1); |
@@ -308,32 +299,9 @@ static int mapping0_inverse(vorbis_block *vb,vorbis_look_mapping *l){ | |||
308 | /* transform the PCM data; takes PCM vector, vb; modifies PCM vector */ | 299 | /* transform the PCM data; takes PCM vector, vb; modifies PCM vector */ |
309 | /* only MDCT right now.... */ | 300 | /* only MDCT right now.... */ |
310 | 301 | ||
311 | /* check if we can do this in IRAM */ | 302 | for(i=0;i<vi->channels;i++){ |
312 | if(n <= IRAM_PCM_SIZE) { /* normal window size: yes */ | 303 | ogg_int32_t *pcm=vb->pcm[i]; |
313 | for(i=0;i<vi->channels;i++){ | 304 | |
314 | ogg_int32_t *pcm=vb->pcm[i]; | ||
315 | int submap=info->chmuxlist[i]; | ||
316 | |||
317 | if(nonzero[i]) { | ||
318 | memcpy(pcm_iram, pcm, sizeof(ogg_int32_t)*n); | ||
319 | look->floor_func[submap]-> | ||
320 | inverse2(vb,look->floor_look[submap],floormemo[i],pcm_iram); | ||
321 | mdct_backward(n, pcm_iram, pcm_iram); | ||
322 | /* window the data */ | ||
323 | _vorbis_apply_window(pcm_iram,b->window,ci->blocksizes,vb->lW,vb->W,vb->nW); | ||
324 | memcpy(pcm, pcm_iram, sizeof(ogg_int32_t)*n); | ||
325 | } | ||
326 | else | ||
327 | memset(pcm, 0, sizeof(ogg_int32_t)*n); | ||
328 | } | ||
329 | } | ||
330 | else { /* large window: no, do it in the normal memory */ | ||
331 | for(i=0;i<vi->channels;i++){ | ||
332 | ogg_int32_t *pcm=vb->pcm[i]; | ||
333 | int submap=info->chmuxlist[i]; | ||
334 | |||
335 | look->floor_func[submap]-> | ||
336 | inverse2(vb,look->floor_look[submap],floormemo[i],pcm); | ||
337 | if(nonzero[i]) { | 305 | if(nonzero[i]) { |
338 | mdct_backward(n, pcm, pcm); | 306 | mdct_backward(n, pcm, pcm); |
339 | /* window the data */ | 307 | /* window the data */ |
@@ -341,7 +309,6 @@ static int mapping0_inverse(vorbis_block *vb,vorbis_look_mapping *l){ | |||
341 | } | 309 | } |
342 | else | 310 | else |
343 | memset(pcm, 0, sizeof(ogg_int32_t)*n); | 311 | memset(pcm, 0, sizeof(ogg_int32_t)*n); |
344 | } | ||
345 | } | 312 | } |
346 | 313 | ||
347 | //for(j=0;j<vi->channels;j++) | 314 | //for(j=0;j<vi->channels;j++) |