summaryrefslogtreecommitdiff
path: root/apps/codecs/Tremor/block.c
diff options
context:
space:
mode:
authorTomasz Malesinski <tomal@rockbox.org>2007-09-27 21:58:51 +0000
committerTomasz Malesinski <tomal@rockbox.org>2007-09-27 21:58:51 +0000
commitc13eba29ff5615cc74a7818e42cc9d464a7c7075 (patch)
treeeef1dfc0d4ed2b69e16b119b0d47052801ef827f /apps/codecs/Tremor/block.c
parent1aaf5dbdb660d29ef384674f25c916f23da505bb (diff)
downloadrockbox-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.c20
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);