Mercurial > mplayer.hg
changeset 4789:c2bb05709676
Cleanup and comment
author | anders |
---|---|
date | Thu, 21 Feb 2002 16:05:09 +0000 |
parents | d678ce495a75 |
children | 50288f9f6b15 |
files | libao2/fir.h libao2/pl_resample.c |
diffstat | 2 files changed, 33 insertions(+), 34 deletions(-) [+] |
line wrap: on
line diff
--- a/libao2/fir.h Thu Feb 21 16:02:26 2002 +0000 +++ b/libao2/fir.h Thu Feb 21 16:05:09 2002 +0000 @@ -11,14 +11,13 @@ #ifndef __FIR_H__ #define __FIR_H__ -/* Fixpoint 16 bit fir filter FIR filter. The filter is implemented -both in C and MMX assembly. The filter consists of one macro -UPDATE_QUE and one inline function firn. The macro can be used for -adding new data to the circular buffer used by the filter firn. -Limitations: max length of n = 16*4 and n must be multiple of 4 (pad -fiter with zeros for other lengths). Sometimes it works with filters -longer than 4*16 (the problem is overshoot and the acumulated energy -in the filter taps). */ +/* Fixpoint 16 bit FIR filter. The filter is implemented both in C and +MMX assembly. The filter consists of the two inline functions updateq +and firn, update q is used for adding new data to the circular buffer +used by the filter firn. Limitations: max length of n = 16*4 and n +must be multiple of 4 (pad fiter with zeros for other lengths). +Sometimes it works with filters longer than 4*16 (the problem is +overshoot and the acumulated energy in the filter taps). */ #ifdef HAVE_MMX inline int32_t firn(int16_t* x, int16_t* w, int16_t n) @@ -60,26 +59,14 @@ #endif /* HAVE_MMX */ -// Macro to add new data to circular queue -#define UPDATE_QUE(ind,xq,xid) \ - xid=(--xid)&(L-1); \ - xq[xid]=xq[xid+L]=*(ind); - -#ifdef L8 -#ifdef HAVE_MMX -#define FIR(x,w,y) *y=(int16_t)firn(x,w,8); -#else /* HAVE_MMX */ -// Unrolled loop to speed up execution -#define FIR(x,w,y){ \ - int16_t a = (w[0]*x[0]+w[1]*x[1]+w[2]*x[2]+w[3]*x[3]) >> 16; \ - int16_t b = (w[4]*x[4]+w[5]*x[5]+w[6]*x[6]+w[7]*x[7]) >> 16; \ - y[0] = a+b; \ +/* Add new data to circular queue designed to be used with a FIR + filter. xq is the circular queue, in pointing at the new sample, xi + current index for in xq and l the lenght of the filter */ +inline uint16_t updateq(int16_t* xq, int16_t* in, uint16_t xi, uint16_t l) +{ + xq[xi]=xq[xi+l]=*in; + return (--xi)&(l-1); \ } -#endif /* HAVE_MMX */ -#endif /* L8 */ - -#ifdef L16 -#define FIR(x,w,y) *y=(int16_t)firn(x,w,16); -#endif /* L16 */ #endif /* __FIR_H__ */ +
--- a/libao2/pl_resample.c Thu Feb 21 16:02:26 2002 +0000 +++ b/libao2/pl_resample.c Thu Feb 21 16:05:09 2002 +0000 @@ -48,13 +48,26 @@ */ #if !defined(HAVE_SSE) && !defined(HAVE_3DNOW) //This machine is slow -#define L8 1 // Filter bank type + #define W W8 // Filter bank parameters #define L 8 // Filter length -#else // Fat machine -#define L16 1 +#ifdef HAVE_MMX +#define FIR(x,w,y) *y=(int16_t)firn(x,w,8); +#else /* HAVE_MMX */ +// Unrolled loop to speed up execution +#define FIR(x,w,y){ \ + int16_t a = (w[0]*x[0]+w[1]*x[1]+w[2]*x[2]+w[3]*x[3]) >> 16; \ + int16_t b = (w[4]*x[4]+w[5]*x[5]+w[6]*x[6]+w[7]*x[7]) >> 16; \ + y[0] = a+b; \ +} +#endif /* HAVE_MMX */ + +#else /* Fast machine */ + #define W W16 #define L 16 +#define FIR(x,w,y) *y=(int16_t)firn(x,w,16); + #endif #define CH 6 // Max number of channels @@ -192,7 +205,7 @@ register uint16_t i = inc; if(wi<level) i++; - UPDATE_QUE(in,x,xi); + xi=updateq(x,in,xi,L); in+=nch; while(i--){ // Run the FIR filter @@ -242,9 +255,8 @@ while(in < end){ - UPDATE_QUE(in,x,xi); + xi=updateq(x,in,xi,L); in+=nch; - if(!--i){ // Run the FIR filter FIR((&x[xi]),(&pl_resample.w[wi*L]),out);