summaryrefslogtreecommitdiff
path: root/apps/codecs/Tremor/mapping0.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/Tremor/mapping0.c')
-rw-r--r--apps/codecs/Tremor/mapping0.c55
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
187static ogg_int32_t pcm_iram[IRAM_PCM_SIZE] IDATA_ATTR;
188
189static int seq = 0; 183static 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++)