summaryrefslogtreecommitdiff
path: root/apps/codecs
diff options
context:
space:
mode:
authorMagnus Holmgren <magnushol@gmail.com>2005-12-28 20:42:24 +0000
committerMagnus Holmgren <magnushol@gmail.com>2005-12-28 20:42:24 +0000
commit41cea75095e6dcd17cff2f57c07553c0ec2a298e (patch)
tree4acd38bc18a591b53526ef4e9948b360e69031c7 /apps/codecs
parent074999ded3b7f41ef25167b06b0c618306ed9d5e (diff)
downloadrockbox-41cea75095e6dcd17cff2f57c07553c0ec2a298e.zip
rockbox-41cea75095e6dcd17cff2f57c07553c0ec2a298e.tar.gz
rockbox-41cea75095e6dcd17cff2f57c07553c0ec2a298e.tar.bz2
rockbox-41cea75095e6dcd17cff2f57c07553c0ec2a298e.tar.xz
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
Diffstat (limited to 'apps/codecs')
-rw-r--r--apps/codecs/Tremor/bitwise.c18
-rw-r--r--apps/codecs/Tremor/block.c1
-rw-r--r--apps/codecs/Tremor/floor0.c10
-rw-r--r--apps/codecs/Tremor/floor1.c34
-rw-r--r--apps/codecs/Tremor/framing.c5
-rw-r--r--apps/codecs/Tremor/lsp_lookup.h10
-rw-r--r--apps/codecs/Tremor/mapping0.c3
-rw-r--r--apps/codecs/Tremor/mdct.c1
-rw-r--r--apps/codecs/Tremor/ogg.h5
-rw-r--r--apps/codecs/Tremor/registry.c6
-rw-r--r--apps/codecs/Tremor/res012.c8
-rw-r--r--apps/codecs/Tremor/synthesis.c1
-rw-r--r--apps/codecs/Tremor/vorbisfile.c4
13 files changed, 67 insertions, 39 deletions
diff --git a/apps/codecs/Tremor/bitwise.c b/apps/codecs/Tremor/bitwise.c
index 7b66827..743389b 100644
--- a/apps/codecs/Tremor/bitwise.c
+++ b/apps/codecs/Tremor/bitwise.c
@@ -22,6 +22,15 @@
#include <string.h>
#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<<bits)-1;
+ unsigned long m=oggpack_mask[bits];
unsigned long ret=0;
bits+=b->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<<bits)-1;
+ unsigned long m=oggpack_mask[bits];
ogg_uint32_t ret=0;
bits+=b->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 fb451f6..17b15e5 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 0c9542b..8ea36ab 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 e01b08c..14515c2 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);
@@ -397,6 +399,8 @@ static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){
}
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;
vorbis_info_floor1 *info=look->vi;
@@ -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 7358986..f17ad86 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 cced7c9..8609936 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 6154f5d..b5b306f 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 f040eea..5d7f195 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 08d1578..e6c78da 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<<bits)-1;
+ extern const unsigned long oggpack_mask[];
+ unsigned long m=oggpack_mask[bits];
unsigned long ret=0;
bits+=b->headbit;
diff --git a/apps/codecs/Tremor/registry.c b/apps/codecs/Tremor/registry.c
index 0882309..b159262 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 303a58c..0f4d224 100644
--- a/apps/codecs/Tremor/res012.c
+++ b/apps/codecs/Tremor/res012.c
@@ -259,6 +259,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;
vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl;
@@ -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 081ac9a..c7f0bb6 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 50f827d..54e36d2 100644
--- a/apps/codecs/Tremor/vorbisfile.c
+++ b/apps/codecs/Tremor/vorbisfile.c
@@ -480,6 +480,9 @@ static void _decode_clear(OggVorbis_File *vf){
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){
ogg_page og={0,0,0,0};
ogg_packet op={0,0,0,0,0,0};
@@ -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;