From 41cea75095e6dcd17cff2f57c07553c0ec2a298e Mon Sep 17 00:00:00 2001 From: Magnus Holmgren Date: Wed, 28 Dec 2005 20:42:24 +0000 Subject: Vorbis optimizations from Brandon Low (part of patch 1387611). Reduces cpu boost ratio on a test track by about 6 percentage points. Also fixes broken simulator playback caused by my previous Tremor commit. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8291 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/Tremor/bitwise.c | 18 ++++++++++++++---- apps/codecs/Tremor/block.c | 1 + apps/codecs/Tremor/floor0.c | 10 +++++----- apps/codecs/Tremor/floor1.c | 34 +++++++++++++++++++--------------- apps/codecs/Tremor/framing.c | 5 ++++- apps/codecs/Tremor/lsp_lookup.h | 10 +++++----- apps/codecs/Tremor/mapping0.c | 3 ++- apps/codecs/Tremor/mdct.c | 1 + apps/codecs/Tremor/ogg.h | 5 +++-- apps/codecs/Tremor/registry.c | 6 +++--- apps/codecs/Tremor/res012.c | 8 +++++--- apps/codecs/Tremor/synthesis.c | 1 + apps/codecs/Tremor/vorbisfile.c | 4 ++++ 13 files changed, 67 insertions(+), 39 deletions(-) (limited to 'apps') diff --git a/apps/codecs/Tremor/bitwise.c b/apps/codecs/Tremor/bitwise.c index 7b6682720a..743389b008 100644 --- a/apps/codecs/Tremor/bitwise.c +++ b/apps/codecs/Tremor/bitwise.c @@ -22,6 +22,15 @@ #include #include "ogg.h" +const unsigned long oggpack_mask[] ICONST_ATTR = +{0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f, + 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff, + 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff, + 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff, + 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff, + 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff, + 0x3fffffff,0x7fffffff,0xffffffff }; + void oggpack_readinit(oggpack_buffer *b,ogg_reference *r){ memset(b,0,sizeof(*b)); @@ -42,7 +51,7 @@ void oggpack_readinit(oggpack_buffer *b,ogg_reference *r){ /* Read in bits without advancing the bitptr; bits <= 32 */ long oggpack_look_full(oggpack_buffer *b,int bits) ICODE_ATTR; long oggpack_look_full(oggpack_buffer *b,int bits){ - unsigned long m=(1<headbit; @@ -127,8 +136,9 @@ int oggpack_eop(oggpack_buffer *b){ } /* bits <= 32 */ +long oggpack_read(oggpack_buffer *b,int bits) ICODE_ATTR; long oggpack_read(oggpack_buffer *b,int bits){ - unsigned long m=(1<headbit; @@ -198,8 +208,8 @@ long oggpack_read(oggpack_buffer *b,int bits){ } } - b->headptr+=bits/8; - b->headend-=bits/8; + b->headptr+=((unsigned)bits)/8; + b->headend-=((unsigned)bits)/8; } ret&=m; diff --git a/apps/codecs/Tremor/block.c b/apps/codecs/Tremor/block.c index fb451f6868..17b15e5d83 100644 --- a/apps/codecs/Tremor/block.c +++ b/apps/codecs/Tremor/block.c @@ -256,6 +256,7 @@ void vorbis_dsp_clear(vorbis_dsp_state *v){ block. The time domain envelope is not yet handled at the point of calling (as it relies on the previous block). */ +int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb) ICODE_ATTR; int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb){ vorbis_info *vi=v->vi; codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; diff --git a/apps/codecs/Tremor/floor0.c b/apps/codecs/Tremor/floor0.c index 0c9542b654..8ea36aba2a 100644 --- a/apps/codecs/Tremor/floor0.c +++ b/apps/codecs/Tremor/floor0.c @@ -47,7 +47,7 @@ typedef struct { 16.16 format returns in m.8 format */ -static long ADJUST_SQRT2[2] ICODE_ATTR ={8192,5792}; +static const long ADJUST_SQRT2[2] ICONST_ATTR ={8192,5792}; static inline ogg_int32_t vorbis_invsqlook_i(long a,long e){ long i=(a&0x7fff)>>(INVSQ_LOOKUP_I_SHIFT-1); long d=a&INVSQ_LOOKUP_I_MASK; /* 0.10 */ @@ -117,21 +117,21 @@ static inline ogg_int32_t toBARK(int n){ } } -static const unsigned char MLOOP_1[64] IDATA_ATTR ={ +static const unsigned char MLOOP_1[64] ICONST_ATTR ={ 0,10,11,11, 12,12,12,12, 13,13,13,13, 13,13,13,13, 14,14,14,14, 14,14,14,14, 14,14,14,14, 14,14,14,14, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, }; -static const unsigned char MLOOP_2[64] IDATA_ATTR ={ +static const unsigned char MLOOP_2[64] ICONST_ATTR ={ 0,4,5,5, 6,6,6,6, 7,7,7,7, 7,7,7,7, 8,8,8,8, 8,8,8,8, 8,8,8,8, 8,8,8,8, 9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9, }; -static const unsigned char MLOOP_3[8] IDATA_ATTR ={0,1,2,2,3,3,3,3}; +static const unsigned char MLOOP_3[8] ICONST_ATTR ={0,1,2,2,3,3,3,3}; void vorbis_lsp_to_curve(ogg_int32_t *curve,int *map,int n,int ln, ogg_int32_t *lsp,int m, @@ -430,7 +430,7 @@ static int floor0_inverse2(vorbis_block *vb,vorbis_look_floor *i, } /* export hooks */ -vorbis_func_floor floor0_exportbundle={ +const vorbis_func_floor floor0_exportbundle ICONST_ATTR ={ &floor0_unpack,&floor0_look,&floor0_free_info, &floor0_free_look,&floor0_inverse1,&floor0_inverse2 }; diff --git a/apps/codecs/Tremor/floor1.c b/apps/codecs/Tremor/floor1.c index e01b08cd11..14515c27e6 100644 --- a/apps/codecs/Tremor/floor1.c +++ b/apps/codecs/Tremor/floor1.c @@ -197,17 +197,19 @@ static vorbis_look_floor *floor1_look(vorbis_dsp_state *vd,vorbis_info_mode *mi, static int render_point(int x0,int x1,int y0,int y1,int x){ y0&=0x7fff; /* mask off flag */ y1&=0x7fff; - - { - int dy=y1-y0; - int adx=x1-x0; - int ady=abs(dy); - int err=ady*(x-x0); - - int off=err/adx; - if(dy<0)return(y0-off); - return(y0+off); - } +#if defined(CPU_COLDFIRE) && !defined(SIMULATOR) + asm volatile ("sub.l %[x0],%[x];" + "sub.l %[y0],%[y1];" + "sub.l %[x0],%[x1];" + "muls.l %[y1],%[x];" + "divs.l %[x1],%[x];" + "add.l %[y0],%[x];" + : [x] "+d" (x), [x1] "+d" (x1), [y1] "+d" (y1) + : [x0] "r" (x0), [y0] "r" (y0) ); + return x; +#else + return y0+((y1-y0)*(x-x0))/(x1-x0); +#endif } #ifdef _LOW_ACCURACY_ @@ -217,7 +219,7 @@ static int render_point(int x0,int x1,int y0,int y1,int x){ #endif /* keep the floor lookup table in fast IRAM */ -static ogg_int32_t FLOOR_fromdB_LOOKUP[256] IDATA_ATTR = { +static const ogg_int32_t FLOOR_fromdB_LOOKUP[256] ICONST_ATTR = { XdB(0x000000e5), XdB(0x000000f4), XdB(0x00000103), XdB(0x00000114), XdB(0x00000126), XdB(0x00000139), XdB(0x0000014e), XdB(0x00000163), XdB(0x0000017a), XdB(0x00000193), XdB(0x000001ad), XdB(0x000001c9), @@ -283,7 +285,7 @@ static ogg_int32_t FLOOR_fromdB_LOOKUP[256] IDATA_ATTR = { XdB(0x52606733), XdB(0x57bad899), XdB(0x5d6e593a), XdB(0x6380b298), XdB(0x69f80e9a), XdB(0x70dafda8), XdB(0x78307d76), XdB(0x7fffffff), }; - + static void render_line(int x0,register int x1,int y0,int y1,ogg_int32_t *d){ int dy=y1-y0; register int x=x0; @@ -310,6 +312,7 @@ static void render_line(int x0,register int x1,int y0,int y1,ogg_int32_t *d){ } } +static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in) ICODE_ATTR; static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; vorbis_info_floor1 *info=look->vi; @@ -387,7 +390,6 @@ static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ }else{ fit_value[i]=predicted|0x8000; } - } return(fit_value); @@ -396,6 +398,8 @@ static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ return(NULL); } +static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, + ogg_int32_t *out) ICODE_ATTR; static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, ogg_int32_t *out){ vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; @@ -433,7 +437,7 @@ static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, } /* export hooks */ -vorbis_func_floor floor1_exportbundle = { +const vorbis_func_floor floor1_exportbundle ICONST_ATTR = { &floor1_unpack,&floor1_look,&floor1_free_info, &floor1_free_look,&floor1_inverse1,&floor1_inverse2 }; diff --git a/apps/codecs/Tremor/framing.c b/apps/codecs/Tremor/framing.c index 7358986946..f17ad86d98 100644 --- a/apps/codecs/Tremor/framing.c +++ b/apps/codecs/Tremor/framing.c @@ -105,6 +105,7 @@ static ogg_buffer *_fetch_buffer(ogg_buffer_state *bs,long bytes){ return ob; } +static ogg_reference *_fetch_ref(ogg_buffer_state *bs) ICODE_ATTR; static ogg_reference *_fetch_ref(ogg_buffer_state *bs){ ogg_reference *or; bs->outstanding++; @@ -501,7 +502,7 @@ int ogg_page_packets(ogg_page *og){ /* Static CRC calculation table. See older code in CVS for dead run-time initialization code. */ -static ogg_uint32_t crc_lookup[256] = { +static const ogg_uint32_t crc_lookup[256] ICONST_ATTR = { 0x00000000,0x04c11db7,0x09823b6e,0x0d4326d9, 0x130476dc,0x17c56b6b,0x1a864db2,0x1e475005, 0x2608edb8,0x22c9f00f,0x2f8ad6d6,0x2b4bcb61, @@ -856,6 +857,7 @@ static void _next_lace(oggbyte_buffer *ob,ogg_stream_state *os){ } } +static void _span_queued_page(ogg_stream_state *os) ICODE_ATTR; static void _span_queued_page(ogg_stream_state *os){ while( !(os->body_fill&FINFLAG) ){ @@ -1014,6 +1016,7 @@ int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno){ return OGG_SUCCESS; } +static int _packetout(ogg_stream_state *os,ogg_packet *op,int adv) ICODE_ATTR; static int _packetout(ogg_stream_state *os,ogg_packet *op,int adv){ ogg_packet_release(op); diff --git a/apps/codecs/Tremor/lsp_lookup.h b/apps/codecs/Tremor/lsp_lookup.h index cced7c9282..8609936542 100644 --- a/apps/codecs/Tremor/lsp_lookup.h +++ b/apps/codecs/Tremor/lsp_lookup.h @@ -26,7 +26,7 @@ #define FROMdB2_SHIFT 3 #define FROMdB2_MASK 31 -static const ogg_int32_t FROMdB_LOOKUP[FROMdB_LOOKUP_SZ] ={ +static const ogg_int32_t FROMdB_LOOKUP[FROMdB_LOOKUP_SZ] ICONST_ATTR ={ 0x003fffff, 0x0028619b, 0x00197a96, 0x0010137a, 0x000a24b0, 0x00066666, 0x000409c3, 0x00028c42, 0x00019b8c, 0x000103ab, 0x0000a3d7, 0x00006760, @@ -37,7 +37,7 @@ static const ogg_int32_t FROMdB_LOOKUP[FROMdB_LOOKUP_SZ] ={ 0x0000000b, 0x00000007, 0x00000004, 0x00000003, 0x00000002, 0x00000001, 0x00000001}; -static const ogg_int32_t FROMdB2_LOOKUP[FROMdB2_LOOKUP_SZ] ={ +static const ogg_int32_t FROMdB2_LOOKUP[FROMdB2_LOOKUP_SZ] ICONST_ATTR ={ 0x000001fc, 0x000001f5, 0x000001ee, 0x000001e7, 0x000001e0, 0x000001d9, 0x000001d2, 0x000001cc, 0x000001c5, 0x000001bf, 0x000001b8, 0x000001b2, @@ -50,7 +50,7 @@ static const ogg_int32_t FROMdB2_LOOKUP[FROMdB2_LOOKUP_SZ] ={ #define INVSQ_LOOKUP_I_SHIFT 10 #define INVSQ_LOOKUP_I_MASK 1023 -static const long INVSQ_LOOKUP_I[64+1] ={ +static const long INVSQ_LOOKUP_I[64+1] ICONST_ATTR ={ 92682, 91966, 91267, 90583, 89915, 89261, 88621, 87995, 87381, 86781, 86192, 85616, @@ -70,7 +70,7 @@ static const long INVSQ_LOOKUP_I[64+1] ={ 65536, }; -static const long INVSQ_LOOKUP_IDel[64] ={ +static const long INVSQ_LOOKUP_IDel[64] ICONST_ATTR ={ 716, 699, 684, 668, 654, 640, 626, 614, 600, 589, 576, 565, @@ -92,7 +92,7 @@ static const long INVSQ_LOOKUP_IDel[64] ={ #define COS_LOOKUP_I_SHIFT 9 #define COS_LOOKUP_I_MASK 511 #define COS_LOOKUP_I_SZ 128 -static const ogg_int32_t COS_LOOKUP_I[COS_LOOKUP_I_SZ+1] ={ +static const ogg_int32_t COS_LOOKUP_I[COS_LOOKUP_I_SZ+1] ICONST_ATTR ={ 16384, 16379, 16364, 16340, 16305, 16261, 16207, 16143, 16069, 15986, 15893, 15791, diff --git a/apps/codecs/Tremor/mapping0.c b/apps/codecs/Tremor/mapping0.c index 6154f5de6b..b5b306fa34 100644 --- a/apps/codecs/Tremor/mapping0.c +++ b/apps/codecs/Tremor/mapping0.c @@ -184,6 +184,7 @@ static int seq = 0; #define CHANNELS 2 /* max 2 channels on the ihp-1xx (stereo) */ +static int mapping0_inverse(vorbis_block *vb,vorbis_look_mapping *l) ICODE_ATTR; static int mapping0_inverse(vorbis_block *vb,vorbis_look_mapping *l){ vorbis_dsp_state *vd=vb->vd; vorbis_info *vi=vd->vi; @@ -323,7 +324,7 @@ static int mapping0_inverse(vorbis_block *vb,vorbis_look_mapping *l){ } /* export hooks */ -vorbis_func_mapping mapping0_exportbundle ={ +const vorbis_func_mapping mapping0_exportbundle ICONST_ATTR ={ &mapping0_unpack, &mapping0_look, &mapping0_free_info, diff --git a/apps/codecs/Tremor/mdct.c b/apps/codecs/Tremor/mdct.c index f040eea3da..5d7f195616 100644 --- a/apps/codecs/Tremor/mdct.c +++ b/apps/codecs/Tremor/mdct.c @@ -332,6 +332,7 @@ STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift) { } +void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out) ICODE_ATTR; void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out) { int n2=n>>1; int n4=n>>2; diff --git a/apps/codecs/Tremor/ogg.h b/apps/codecs/Tremor/ogg.h index 08d15788c0..e6c78da95e 100644 --- a/apps/codecs/Tremor/ogg.h +++ b/apps/codecs/Tremor/ogg.h @@ -184,12 +184,13 @@ static inline void oggpack_adv(oggpack_buffer *b,int bits){ bits+=b->headbit; b->headbit=bits&7; b->headptr+=bits/8; - if((b->headend-=bits/8)<1)_span(b); + if((b->headend-=((unsigned)bits)/8)<1)_span(b); } static inline long oggpack_look(oggpack_buffer *b, int bits){ if(bits+b->headbit < b->headend<<3){ - unsigned long m=(1<headbit; diff --git a/apps/codecs/Tremor/registry.c b/apps/codecs/Tremor/registry.c index 0882309b32..b1592628a1 100644 --- a/apps/codecs/Tremor/registry.c +++ b/apps/codecs/Tremor/registry.c @@ -31,18 +31,18 @@ extern vorbis_func_residue residue1_exportbundle; extern vorbis_func_residue residue2_exportbundle; extern vorbis_func_mapping mapping0_exportbundle; -vorbis_func_floor *_floor_P[] = { +vorbis_func_floor *_floor_P[] ICONST_ATTR = { &floor0_exportbundle, &floor1_exportbundle, }; -vorbis_func_residue *_residue_P[] = { +vorbis_func_residue *_residue_P[] ICONST_ATTR = { &residue0_exportbundle, &residue1_exportbundle, &residue2_exportbundle, }; -vorbis_func_mapping *_mapping_P[] = { +vorbis_func_mapping *_mapping_P[] ICONST_ATTR = { &mapping0_exportbundle, }; diff --git a/apps/codecs/Tremor/res012.c b/apps/codecs/Tremor/res012.c index 303a58c2f2..0f4d224f89 100644 --- a/apps/codecs/Tremor/res012.c +++ b/apps/codecs/Tremor/res012.c @@ -258,6 +258,8 @@ int res1_inverse(vorbis_block *vb,vorbis_look_residue *vl, /* duplicate code here as speed is somewhat more important */ +int res2_inverse(vorbis_block *vb,vorbis_look_residue *vl, + ogg_int32_t **in,int *nonzero,int ch) ICODE_ATTR; int res2_inverse(vorbis_block *vb,vorbis_look_residue *vl, ogg_int32_t **in,int *nonzero,int ch){ long i,k,l,s; @@ -311,7 +313,7 @@ int res2_inverse(vorbis_block *vb,vorbis_look_residue *vl, } -const vorbis_func_residue residue0_exportbundle ={ +const vorbis_func_residue residue0_exportbundle ICONST_ATTR ={ &res0_unpack, &res0_look, &res0_free_info, @@ -319,7 +321,7 @@ const vorbis_func_residue residue0_exportbundle ={ &res0_inverse }; -const vorbis_func_residue residue1_exportbundle ={ +const vorbis_func_residue residue1_exportbundle ICONST_ATTR ={ &res0_unpack, &res0_look, &res0_free_info, @@ -327,7 +329,7 @@ const vorbis_func_residue residue1_exportbundle ={ &res1_inverse }; -const vorbis_func_residue residue2_exportbundle ={ +const vorbis_func_residue residue2_exportbundle ICONST_ATTR ={ &res0_unpack, &res0_look, &res0_free_info, diff --git a/apps/codecs/Tremor/synthesis.c b/apps/codecs/Tremor/synthesis.c index 081ac9adcd..c7f0bb6cc5 100644 --- a/apps/codecs/Tremor/synthesis.c +++ b/apps/codecs/Tremor/synthesis.c @@ -35,6 +35,7 @@ static ogg_int32_t *ipcm_vect[CHANNELS] IBSS_ATTR; static ogg_int32_t ipcm_buff[CHANNELS*IRAM_PCM_END] IBSS_ATTR LINE_ATTR; +int vorbis_synthesis(vorbis_block *vb,ogg_packet *op,int decodep) ICODE_ATTR; int vorbis_synthesis(vorbis_block *vb,ogg_packet *op,int decodep){ vorbis_dsp_state *vd=vb->vd; private_state *b=(private_state *)vd->backend_state; diff --git a/apps/codecs/Tremor/vorbisfile.c b/apps/codecs/Tremor/vorbisfile.c index 50f827dae7..54e36d29af 100644 --- a/apps/codecs/Tremor/vorbisfile.c +++ b/apps/codecs/Tremor/vorbisfile.c @@ -478,6 +478,9 @@ static void _decode_clear(OggVorbis_File *vf){ 1) got a packet */ +static int _fetch_and_process_packet(OggVorbis_File *vf, + int readp, + int spanp) ICODE_ATTR; static int _fetch_and_process_packet(OggVorbis_File *vf, int readp, int spanp){ @@ -1457,6 +1460,7 @@ ogg_int64_t ov_pcm_tell(OggVorbis_File *vf){ } /* return time offset (milliseconds) of next PCM sample to be read */ +ogg_int64_t ov_time_tell(OggVorbis_File *vf) ICODE_ATTR; ogg_int64_t ov_time_tell(OggVorbis_File *vf){ int link=0; ogg_int64_t pcm_total=0; -- cgit v1.2.3