From 0d4f573fc103544c7972485b010072eda52a0e4b Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Sun, 23 Dec 2001 10:44:28 +0000 Subject: adding resample lib Original commit message from CVS: adding resample lib --- gst-libs/gst/resample/dtos.c | 201 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 gst-libs/gst/resample/dtos.c (limited to 'gst-libs/gst/resample/dtos.c') diff --git a/gst-libs/gst/resample/dtos.c b/gst-libs/gst/resample/dtos.c new file mode 100644 index 00000000..7762595f --- /dev/null +++ b/gst-libs/gst/resample/dtos.c @@ -0,0 +1,201 @@ +/* Resampling library + * Copyright (C) <2001> David A. Schleef + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#include +#include +#include +#include + +//#include +#include + + + +#define short_to_double_table +//#define short_to_double_altivec +#define short_to_double_unroll + +#ifdef short_to_double_table +static float ints_high[256]; +static float ints_low[256]; + +void conv_double_short_table(double *dest, short *src, int n) +{ + static int init = 0; + int i; + unsigned int idx; + if(!init){ + for(i=0;i<256;i++){ + ints_high[i]=256.0*((i<128)?i:i-256); + ints_low[i]=i; + } + init = 1; + } + + if(n&1){ + idx = (unsigned short)*src++; + *dest++ = ints_high[(idx>>8)] + ints_low[(idx&0xff)]; + n-=1; + } + for(i=0;i>8)] + ints_low[(idx&0xff)]; + idx = (unsigned short)*src++; + *dest++ = ints_high[(idx>>8)] + ints_low[(idx&0xff)]; + } +} + +#endif + +#ifdef short_to_double_unroll +void conv_double_short_unroll(double *dest, short *src, int n) +{ + if(n&1){ + *dest++ = *src++; + n--; + } + if(n&2){ + *dest++ = *src++; + *dest++ = *src++; + n-=2; + } + while(n>0){ + *dest++ = *src++; + *dest++ = *src++; + *dest++ = *src++; + *dest++ = *src++; + n-=4; + } +} +#endif + +void conv_double_short_ref(double *dest, short *src, int n) +{ + int i; + for(i=0;i32767.0)x=32767.0; + *dest++ = rint(x); + } +} + +#ifdef HAVE_CPU_PPC +void conv_short_double_ppcasm(short *dest, double *src, int n) +{ + int tmp[2]; + double min = -32768.0; + double max = 32767.0; + double ftmp0, ftmp1; + + asm __volatile__( + "\taddic. %3,%3,-8\n" + "\taddic. %6,%6,-2\n" + "loop:\n" + "\tlfdu %0,8(%3)\n" + "\tfsub %1,%0,%4\n" + "\tfsel %0,%1,%0,%4\n" + "\tfsub %1,%0,%5\n" + "\tfsel %0,%1,%5,%0\n" + "\tfctiw %1,%0\n" + "\taddic. 5,5,-1\n" + "\tstfd %1,0(%2)\n" + "\tlhz 9,6(%2)\n" + "\tsthu 9,2(%6)\n" + "\tbne loop\n" + : "=&f" (ftmp0), "=&f" (ftmp1) + : "b" (tmp), "r" (src), "f" (min), "f" (max), "r" (dest) + : "r9", "r5" ); + +} +#endif + + +void conv_double_short_dstr(double *dest, short *src, int n, int dstr) +{ + int i; + void *d = dest; + for(i=0;i32767.0)x=32767.0; + *dest++ = rint(x); + s += sstr; + } +} + -- cgit v1.2.1