diff options
author | Tomasz Malesinski <tomal@rockbox.org> | 2007-09-27 21:58:51 +0000 |
---|---|---|
committer | Tomasz Malesinski <tomal@rockbox.org> | 2007-09-27 21:58:51 +0000 |
commit | c13eba29ff5615cc74a7818e42cc9d464a7c7075 (patch) | |
tree | eef1dfc0d4ed2b69e16b119b0d47052801ef827f /apps/codecs/Tremor/block.c | |
parent | 1aaf5dbdb660d29ef384674f25c916f23da505bb (diff) | |
download | rockbox-c13eba29ff5615cc74a7818e42cc9d464a7c7075.tar.gz rockbox-c13eba29ff5615cc74a7818e42cc9d464a7c7075.zip |
FS #7833: Optimizations to the Vorbis codec:
- ARM assembly version of parts of mdct,
- special case for vorbis_book_decodevv_add for 2 channels and even book->dim,
- store the output in vb->pcm if possible, as it is usually in IRAM as
opposed to v->pcm.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14875 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/Tremor/block.c')
-rw-r--r-- | apps/codecs/Tremor/block.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/apps/codecs/Tremor/block.c b/apps/codecs/Tremor/block.c index 80cbb7809c..e609fc44f7 100644 --- a/apps/codecs/Tremor/block.c +++ b/apps/codecs/Tremor/block.c | |||
@@ -171,6 +171,7 @@ static int _vds_init(vorbis_dsp_state *v,vorbis_info *vi){ | |||
171 | 171 | ||
172 | v->pcm_storage=ci->blocksizes[1]; | 172 | v->pcm_storage=ci->blocksizes[1]; |
173 | v->pcm=(ogg_int32_t **)_ogg_malloc(vi->channels*sizeof(*v->pcm)); | 173 | v->pcm=(ogg_int32_t **)_ogg_malloc(vi->channels*sizeof(*v->pcm)); |
174 | v->pcmb=(ogg_int32_t **)_ogg_malloc(vi->channels*sizeof(*v->pcmb)); | ||
174 | v->pcmret=(ogg_int32_t **)_ogg_malloc(vi->channels*sizeof(*v->pcmret)); | 175 | v->pcmret=(ogg_int32_t **)_ogg_malloc(vi->channels*sizeof(*v->pcmret)); |
175 | 176 | ||
176 | for(i=0;i<vi->channels;i++) | 177 | for(i=0;i<vi->channels;i++) |
@@ -308,25 +309,28 @@ int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb){ | |||
308 | /* large/large */ | 309 | /* large/large */ |
309 | ogg_int32_t *pcm=v->pcm[j]+prevCenter; | 310 | ogg_int32_t *pcm=v->pcm[j]+prevCenter; |
310 | ogg_int32_t *p=vb->pcm[j]; | 311 | ogg_int32_t *p=vb->pcm[j]; |
311 | vect_add(pcm, p, n1); | 312 | vect_add(p, pcm, n1); |
313 | v->pcmb[j]=p; | ||
312 | }else{ | 314 | }else{ |
313 | /* large/small */ | 315 | /* large/small */ |
314 | ogg_int32_t *pcm=v->pcm[j]+prevCenter+n1/2-n0/2; | 316 | ogg_int32_t *pcm=v->pcm[j]+prevCenter+n1/2-n0/2; |
315 | ogg_int32_t *p=vb->pcm[j]; | 317 | ogg_int32_t *p=vb->pcm[j]; |
316 | vect_add(pcm, p, n0); | 318 | vect_add(pcm, p, n0); |
319 | v->pcmb[j]=v->pcm[j]+prevCenter; | ||
317 | } | 320 | } |
318 | }else{ | 321 | }else{ |
319 | if(v->W){ | 322 | if(v->W){ |
320 | /* small/large */ | 323 | /* small/large */ |
321 | ogg_int32_t *pcm=v->pcm[j]+prevCenter; | 324 | ogg_int32_t *pcm=v->pcm[j]+prevCenter; |
322 | ogg_int32_t *p=vb->pcm[j]+n1/2-n0/2; | 325 | ogg_int32_t *p=vb->pcm[j]+n1/2-n0/2; |
323 | vect_add(pcm, p, n0); | 326 | vect_add(p, pcm, n0); |
324 | vect_copy(&pcm[n0], &p[n0], n1/2-n0/2); | 327 | v->pcmb[j]=p; |
325 | }else{ | 328 | }else{ |
326 | /* small/small */ | 329 | /* small/small */ |
327 | ogg_int32_t *pcm=v->pcm[j]+prevCenter; | 330 | ogg_int32_t *pcm=v->pcm[j]+prevCenter; |
328 | ogg_int32_t *p=vb->pcm[j]; | 331 | ogg_int32_t *p=vb->pcm[j]; |
329 | vect_add(pcm, p, n0); | 332 | vect_add(p, pcm, n0); |
333 | v->pcmb[j]=p; | ||
330 | } | 334 | } |
331 | } | 335 | } |
332 | 336 | ||
@@ -351,10 +355,8 @@ int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb){ | |||
351 | v->pcm_returned=thisCenter; | 355 | v->pcm_returned=thisCenter; |
352 | v->pcm_current=thisCenter; | 356 | v->pcm_current=thisCenter; |
353 | }else{ | 357 | }else{ |
354 | v->pcm_returned=prevCenter; | 358 | v->pcm_returned=0; |
355 | v->pcm_current=prevCenter+ | 359 | v->pcm_current=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; |
356 | ci->blocksizes[v->lW]/4+ | ||
357 | ci->blocksizes[v->W]/4; | ||
358 | } | 360 | } |
359 | 361 | ||
360 | } | 362 | } |
@@ -436,7 +438,7 @@ int vorbis_synthesis_pcmout(vorbis_dsp_state *v,ogg_int32_t ***pcm){ | |||
436 | if(pcm){ | 438 | if(pcm){ |
437 | int i; | 439 | int i; |
438 | for(i=0;i<vi->channels;i++) | 440 | for(i=0;i<vi->channels;i++) |
439 | v->pcmret[i]=v->pcm[i]+v->pcm_returned; | 441 | v->pcmret[i]=v->pcmb[i]+v->pcm_returned; |
440 | *pcm=v->pcmret; | 442 | *pcm=v->pcmret; |
441 | } | 443 | } |
442 | return(v->pcm_current-v->pcm_returned); | 444 | return(v->pcm_current-v->pcm_returned); |