SpeexDSP resampler
This commit is contained in:
parent
1c559edec8
commit
9570dddac3
14 changed files with 2648 additions and 0 deletions
18
audio/deps/resampler/AUTHORS
Normal file
18
audio/deps/resampler/AUTHORS
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
Jean-Marc Valin <jean-marc.valin@usherbrooke.ca>
|
||||||
|
All the code except the following
|
||||||
|
|
||||||
|
David Rowe <david@rowetel.com>
|
||||||
|
lsp.c lsp.h
|
||||||
|
Also ideas and feedback
|
||||||
|
|
||||||
|
John Francis Edwards
|
||||||
|
wave_out.[ch], some #ifdefs for windows port and MSVC project files
|
||||||
|
|
||||||
|
Segher Boessenkool
|
||||||
|
Misc. optimizations (for QMF in particular)
|
||||||
|
|
||||||
|
Atsuhiko Yamanaka <ymnk@jcraft.com>:
|
||||||
|
Patch to speexenc.c to add Vorbis comment format
|
||||||
|
|
||||||
|
Radim Kolar <hsn@cybermail.net>:
|
||||||
|
Patch to speexenc.c for supporting more input formats
|
35
audio/deps/resampler/COPYING
Normal file
35
audio/deps/resampler/COPYING
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
Copyright 2002-2008 Xiph.org Foundation
|
||||||
|
Copyright 2002-2008 Jean-Marc Valin
|
||||||
|
Copyright 2005-2007 Analog Devices Inc.
|
||||||
|
Copyright 2005-2008 Commonwealth Scientific and Industrial Research
|
||||||
|
Organisation (CSIRO)
|
||||||
|
Copyright 1993, 2002, 2006 David Rowe
|
||||||
|
Copyright 2003 EpicGames
|
||||||
|
Copyright 1992-1994 Jutta Degener, Carsten Bormann
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
- Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
6
audio/deps/resampler/README.md
Normal file
6
audio/deps/resampler/README.md
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# SpeexDSP Resampler
|
||||||
|
|
||||||
|
This code was lifted from `speexdsp-1.2.1` and modified to be as small as possible.
|
||||||
|
Only the fixed point API remains, all external dependencies to other files from
|
||||||
|
speexdsp have been included so this just contains the resampler.
|
||||||
|
|
101
audio/deps/resampler/arch.h
Normal file
101
audio/deps/resampler/arch.h
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
/* Copyright (C) 2003 Jean-Marc Valin */
|
||||||
|
/**
|
||||||
|
@file arch.h
|
||||||
|
@brief Various architecture definitions Speex
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
- Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ARCH_H
|
||||||
|
#define ARCH_H
|
||||||
|
|
||||||
|
/* A couple test to catch stupid option combinations */
|
||||||
|
#if defined(ARM4_ASM) + defined(ARM5E_ASM) + defined(BFIN_ASM) > 1
|
||||||
|
#error Make up your mind. What CPU do you have?
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "speexdsp_types.h"
|
||||||
|
|
||||||
|
#define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */
|
||||||
|
#define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */
|
||||||
|
#define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 16-bit value. */
|
||||||
|
#define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */
|
||||||
|
#define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */
|
||||||
|
#define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 32-bit value. */
|
||||||
|
#define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */
|
||||||
|
|
||||||
|
typedef spx_int16_t spx_word16_t;
|
||||||
|
typedef spx_int32_t spx_word32_t;
|
||||||
|
typedef spx_word32_t spx_mem_t;
|
||||||
|
typedef spx_word16_t spx_coef_t;
|
||||||
|
typedef spx_word16_t spx_lsp_t;
|
||||||
|
typedef spx_word32_t spx_sig_t;
|
||||||
|
|
||||||
|
#define Q15ONE 32767
|
||||||
|
|
||||||
|
#define LPC_SCALING 8192
|
||||||
|
#define SIG_SCALING 16384
|
||||||
|
#define LSP_SCALING 8192.
|
||||||
|
#define GAMMA_SCALING 32768.
|
||||||
|
#define GAIN_SCALING 64
|
||||||
|
#define GAIN_SCALING_1 0.015625
|
||||||
|
|
||||||
|
#define LPC_SHIFT 13
|
||||||
|
#define LSP_SHIFT 13
|
||||||
|
#define SIG_SHIFT 14
|
||||||
|
#define GAIN_SHIFT 6
|
||||||
|
|
||||||
|
#define WORD2INT(x) ((x) < -32767 ? -32768 : ((x) > 32766 ? 32767 : (x)))
|
||||||
|
|
||||||
|
#define VERY_SMALL 0
|
||||||
|
#define VERY_LARGE32 ((spx_word32_t)2147483647)
|
||||||
|
#define VERY_LARGE16 ((spx_word16_t)32767)
|
||||||
|
#define Q15_ONE ((spx_word16_t)32767)
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef FIXED_DEBUG
|
||||||
|
# include "fixed_debug.h"
|
||||||
|
#else
|
||||||
|
# include "fixed_generic.h"
|
||||||
|
|
||||||
|
# ifdef ARM5E_ASM
|
||||||
|
# include "fixed_arm5e.h"
|
||||||
|
# elif defined(ARM4_ASM)
|
||||||
|
# include "fixed_arm4.h"
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef FIXED_DEBUG
|
||||||
|
extern long long spx_mips;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* ARCH_H */
|
18
audio/deps/resampler/config.h
Normal file
18
audio/deps/resampler/config.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/* Make use of ARM4 assembly optimizations */
|
||||||
|
/* #undef ARM4_ASM */
|
||||||
|
|
||||||
|
/* Make use of ARM5E assembly optimizations */
|
||||||
|
/* #undef ARM5E_ASM */
|
||||||
|
|
||||||
|
/* Enable NEON support */
|
||||||
|
#define USE_NEON /**/
|
||||||
|
|
||||||
|
/* Symbol visibility prefix */
|
||||||
|
#define EXPORT __attribute__((visibility("default")))
|
||||||
|
|
||||||
|
/* Debug fixed-point implementation */
|
||||||
|
/* #undef FIXED_DEBUG */
|
||||||
|
|
||||||
|
/* Use C99 variable-size arrays */
|
||||||
|
#define VAR_ARRAYS /**/
|
||||||
|
|
135
audio/deps/resampler/fixed_arm4.h
Normal file
135
audio/deps/resampler/fixed_arm4.h
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
/* Copyright (C) 2004 Jean-Marc Valin */
|
||||||
|
/**
|
||||||
|
@file fixed_arm4.h
|
||||||
|
@brief ARM4 fixed-point operations
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
- Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FIXED_ARM4_H
|
||||||
|
#define FIXED_ARM4_H
|
||||||
|
|
||||||
|
#undef MULT16_32_Q15
|
||||||
|
static inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) {
|
||||||
|
int res;
|
||||||
|
int dummy;
|
||||||
|
__asm__ (
|
||||||
|
"smull %0,%1,%2,%3 \n\t"
|
||||||
|
"mov %0, %0, lsr #15 \n\t"
|
||||||
|
"add %0, %0, %1, lsl #17 \n\t"
|
||||||
|
: "=&r"(res), "=&r" (dummy)
|
||||||
|
: "r"(y),"r"((int)x));
|
||||||
|
return(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef DIV32_16
|
||||||
|
static inline short DIV32_16(int a, int b)
|
||||||
|
{
|
||||||
|
int res=0;
|
||||||
|
int dead1, dead2, dead3, dead4, dead5;
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"\teor %5, %0, %1\n"
|
||||||
|
"\tmovs %4, %0\n"
|
||||||
|
"\trsbmi %0, %0, #0 \n"
|
||||||
|
"\tmovs %4, %1\n"
|
||||||
|
"\trsbmi %1, %1, #0 \n"
|
||||||
|
"\tmov %4, #1\n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #14 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #14 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #13 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #13 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #12 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #12 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #11 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #11 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #10 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #10 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #9 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #9 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #8 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #8 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #7 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #7 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #6 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #6 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #5 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #5 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #4 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #4 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #3 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #2 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #2 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #1 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #1 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
"\torrpl %2, %2, %4 \n"
|
||||||
|
|
||||||
|
"\tmovs %5, %5, lsr #31 \n"
|
||||||
|
"\trsbne %2, %2, #0 \n"
|
||||||
|
: "=r" (dead1), "=r" (dead2), "=r" (res),
|
||||||
|
"=r" (dead3), "=r" (dead4), "=r" (dead5)
|
||||||
|
: "0" (a), "1" (b), "2" (res)
|
||||||
|
: "cc"
|
||||||
|
);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
160
audio/deps/resampler/fixed_arm5e.h
Normal file
160
audio/deps/resampler/fixed_arm5e.h
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
/* Copyright (C) 2003 Jean-Marc Valin */
|
||||||
|
/**
|
||||||
|
@file fixed_arm5e.h
|
||||||
|
@brief ARM-tuned fixed-point operations
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
- Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FIXED_ARM5E_H
|
||||||
|
#define FIXED_ARM5E_H
|
||||||
|
|
||||||
|
#undef MULT16_16
|
||||||
|
static inline spx_word32_t MULT16_16(spx_word16_t x, spx_word16_t y) {
|
||||||
|
int res;
|
||||||
|
__asm__ ("smulbb %0,%1,%2;\n"
|
||||||
|
: "=&r"(res)
|
||||||
|
: "%r"(x),"r"(y));
|
||||||
|
return(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef MAC16_16
|
||||||
|
static inline spx_word32_t MAC16_16(spx_word32_t a, spx_word16_t x, spx_word32_t y) {
|
||||||
|
int res;
|
||||||
|
__asm__ ("smlabb %0,%1,%2,%3;\n"
|
||||||
|
: "=&r"(res)
|
||||||
|
: "%r"(x),"r"(y),"r"(a));
|
||||||
|
return(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef MULT16_32_Q15
|
||||||
|
static inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) {
|
||||||
|
int res;
|
||||||
|
__asm__ ("smulwb %0,%1,%2;\n"
|
||||||
|
: "=&r"(res)
|
||||||
|
: "%r"(y<<1),"r"(x));
|
||||||
|
return(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef MAC16_32_Q15
|
||||||
|
static inline spx_word32_t MAC16_32_Q15(spx_word32_t a, spx_word16_t x, spx_word32_t y) {
|
||||||
|
int res;
|
||||||
|
__asm__ ("smlawb %0,%1,%2,%3;\n"
|
||||||
|
: "=&r"(res)
|
||||||
|
: "%r"(y<<1),"r"(x),"r"(a));
|
||||||
|
return(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef DIV32_16
|
||||||
|
static inline short DIV32_16(int a, int b)
|
||||||
|
{
|
||||||
|
int res=0;
|
||||||
|
int dead1, dead2, dead3, dead4, dead5;
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"\teor %5, %0, %1\n"
|
||||||
|
"\tmovs %4, %0\n"
|
||||||
|
"\trsbmi %0, %0, #0 \n"
|
||||||
|
"\tmovs %4, %1\n"
|
||||||
|
"\trsbmi %1, %1, #0 \n"
|
||||||
|
"\tmov %4, #1\n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #14 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #14 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #13 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #13 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #12 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #12 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #11 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #11 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #10 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #10 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #9 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #9 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #8 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #8 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #7 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #7 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #6 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #6 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #5 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #5 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #4 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #4 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #3 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #3 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #2 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #2 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1, asl #1 \n"
|
||||||
|
"\torrpl %2, %2, %4, asl #1 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tsubs %3, %0, %1 \n"
|
||||||
|
"\torrpl %2, %2, %4 \n"
|
||||||
|
"\tmovpl %0, %3 \n"
|
||||||
|
|
||||||
|
"\tmovs %5, %5, lsr #31 \n"
|
||||||
|
"\trsbne %2, %2, #0 \n"
|
||||||
|
: "=r" (dead1), "=r" (dead2), "=r" (res),
|
||||||
|
"=r" (dead3), "=r" (dead4), "=r" (dead5)
|
||||||
|
: "0" (a), "1" (b), "2" (res)
|
||||||
|
: "memory", "cc"
|
||||||
|
);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
497
audio/deps/resampler/fixed_debug.h
Normal file
497
audio/deps/resampler/fixed_debug.h
Normal file
|
@ -0,0 +1,497 @@
|
||||||
|
/* Copyright (C) 2003 Jean-Marc Valin */
|
||||||
|
/**
|
||||||
|
@file fixed_debug.h
|
||||||
|
@brief Fixed-point operations with debugging
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
- Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FIXED_DEBUG_H
|
||||||
|
#define FIXED_DEBUG_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
extern long long spx_mips;
|
||||||
|
#define MIPS_INC spx_mips++,
|
||||||
|
|
||||||
|
#define QCONST16(x,bits) ((spx_word16_t)(.5+(x)*(((spx_word32_t)1)<<(bits))))
|
||||||
|
#define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits))))
|
||||||
|
|
||||||
|
|
||||||
|
#define VERIFY_SHORT(x) ((x)<=32767&&(x)>=-32768)
|
||||||
|
#define VERIFY_INT(x) ((x)<=2147483647LL&&(x)>=-2147483648LL)
|
||||||
|
|
||||||
|
static inline short NEG16(int x)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(x))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "NEG16: input is not short: %d\n", (int)x);
|
||||||
|
}
|
||||||
|
res = -x;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
fprintf (stderr, "NEG16: output is not short: %d\n", (int)res);
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static inline int NEG32(long long x)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_INT(x))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "NEG16: input is not int: %d\n", (int)x);
|
||||||
|
}
|
||||||
|
res = -x;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
fprintf (stderr, "NEG16: output is not int: %d\n", (int)res);
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define EXTRACT16(x) _EXTRACT16(x, __FILE__, __LINE__)
|
||||||
|
static inline short _EXTRACT16(int x, char *file, int line)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(x))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "EXTRACT16: input is not short: %d in %s: line %d\n", x, file, line);
|
||||||
|
}
|
||||||
|
res = x;
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define EXTEND32(x) _EXTEND32(x, __FILE__, __LINE__)
|
||||||
|
static inline int _EXTEND32(int x, char *file, int line)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(x))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "EXTEND32: input is not short: %d in %s: line %d\n", x, file, line);
|
||||||
|
}
|
||||||
|
res = x;
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SHR16(a, shift) _SHR16(a, shift, __FILE__, __LINE__)
|
||||||
|
static inline short _SHR16(int a, int shift, char *file, int line)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHR16: inputs are not short: %d >> %d in %s: line %d\n", a, shift, file, line);
|
||||||
|
}
|
||||||
|
res = a>>shift;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
fprintf (stderr, "SHR16: output is not short: %d in %s: line %d\n", res, file, line);
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#define SHL16(a, shift) _SHL16(a, shift, __FILE__, __LINE__)
|
||||||
|
static inline short _SHL16(int a, int shift, char *file, int line)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHL16: inputs are not short: %d %d in %s: line %d\n", a, shift, file, line);
|
||||||
|
}
|
||||||
|
res = a<<shift;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
fprintf (stderr, "SHL16: output is not short: %d in %s: line %d\n", res, file, line);
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int SHR32(long long a, int shift)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_INT(a) || !VERIFY_SHORT(shift))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHR32: inputs are not int: %d %d\n", (int)a, shift);
|
||||||
|
}
|
||||||
|
res = a>>shift;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHR32: output is not int: %d\n", (int)res);
|
||||||
|
}
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static inline int SHL32(long long a, int shift)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_INT(a) || !VERIFY_SHORT(shift))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHL32: inputs are not int: %d %d\n", (int)a, shift);
|
||||||
|
}
|
||||||
|
res = a<<shift;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SHL32: output is not int: %d\n", (int)res);
|
||||||
|
}
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PSHR16(a,shift) (SHR16(ADD16((a),((1<<((shift))>>1))),shift))
|
||||||
|
#define PSHR32(a,shift) (SHR32(ADD32((a),((EXTEND32(1)<<((shift))>>1))),shift))
|
||||||
|
#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
|
||||||
|
|
||||||
|
#define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
|
||||||
|
#define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
|
||||||
|
|
||||||
|
//#define SHR(a,shift) ((a) >> (shift))
|
||||||
|
//#define SHL(a,shift) ((a) << (shift))
|
||||||
|
|
||||||
|
#define ADD16(a, b) _ADD16(a, b, __FILE__, __LINE__)
|
||||||
|
static inline short _ADD16(int a, int b, char *file, int line)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "ADD16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
|
||||||
|
}
|
||||||
|
res = a+b;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "ADD16: output is not short: %d+%d=%d in %s: line %d\n", a,b,res, file, line);
|
||||||
|
}
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SUB16(a, b) _SUB16(a, b, __FILE__, __LINE__)
|
||||||
|
static inline short _SUB16(int a, int b, char *file, int line)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SUB16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
|
||||||
|
}
|
||||||
|
res = a-b;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
fprintf (stderr, "SUB16: output is not short: %d in %s: line %d\n", res, file, line);
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ADD32(a, b) _ADD32(a, b, __FILE__, __LINE__)
|
||||||
|
static inline int _ADD32(long long a, long long b, char *file, int line)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_INT(a) || !VERIFY_INT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "ADD32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
|
||||||
|
}
|
||||||
|
res = a+b;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "ADD32: output is not int: %d in %s: line %d\n", (int)res, file, line);
|
||||||
|
}
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int SUB32(long long a, long long b)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_INT(a) || !VERIFY_INT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "SUB32: inputs are not int: %d %d\n", (int)a, (int)b);
|
||||||
|
}
|
||||||
|
res = a-b;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
fprintf (stderr, "SUB32: output is not int: %d\n", (int)res);
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ADD64(a,b) (MIPS_INC(a)+(b))
|
||||||
|
|
||||||
|
/* result fits in 16 bits */
|
||||||
|
static inline short MULT16_16_16(int a, int b)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_16: inputs are not short: %d %d\n", a, b);
|
||||||
|
}
|
||||||
|
res = a*b;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
fprintf (stderr, "MULT16_16_16: output is not short: %d\n", res);
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* result fits in 32 bits */
|
||||||
|
static inline int MULT16_32_32(int a, long long b)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_INT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_32_32: inputs are not short+int: %d %d\n", a, (int)b);
|
||||||
|
}
|
||||||
|
res = a*b;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
fprintf (stderr, "MULT16_32_32: output is not int: %d\n", (int)res);
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MULT16_16(a, b) _MULT16_16(a, b, __FILE__, __LINE__)
|
||||||
|
static inline int _MULT16_16(int a, int b, char *file, int line)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
|
||||||
|
}
|
||||||
|
res = ((long long)a)*b;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
fprintf (stderr, "MULT16_16: output is not int: %d in %s: line %d\n", (int)res, file, line);
|
||||||
|
spx_mips++;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MAC16_16(c,a,b) (spx_mips--,ADD32((c),MULT16_16((a),(b))))
|
||||||
|
#define MAC16_16_Q11(c,a,b) (EXTRACT16(ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),11)))))
|
||||||
|
#define MAC16_16_Q13(c,a,b) (EXTRACT16(ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),13)))))
|
||||||
|
#define MAC16_16_P13(c,a,b) (EXTRACT16(ADD32((c),SHR32(ADD32(4096,MULT16_16((a),(b))),13))))
|
||||||
|
|
||||||
|
|
||||||
|
#define MULT16_32_QX(a, b, Q) _MULT16_32_QX(a, b, Q, __FILE__, __LINE__)
|
||||||
|
static inline int _MULT16_32_QX(int a, long long b, int Q, char *file, int line)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_INT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_32_Q%d: inputs are not short+int: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line);
|
||||||
|
}
|
||||||
|
if (ABS(b)>>(16+Q))
|
||||||
|
fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line);
|
||||||
|
res = (((long long)a)*(long long)b) >> Q;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
fprintf (stderr, "MULT16_32_Q%d: output is not int: %d*%d=%d in %s: line %d\n", Q, (int)a, (int)b,(int)res, file, line);
|
||||||
|
spx_mips+=5;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int MULT16_32_PX(int a, long long b, int Q)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_INT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_32_P%d: inputs are not short+int: %d %d\n", Q, (int)a, (int)b);
|
||||||
|
}
|
||||||
|
if (ABS(b)>>(16+Q))
|
||||||
|
fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d\n", Q, (int)a, (int)b);
|
||||||
|
res = ((((long long)a)*(long long)b) + ((EXTEND32(1)<<Q)>>1))>> Q;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
fprintf (stderr, "MULT16_32_P%d: output is not int: %d*%d=%d\n", Q, (int)a, (int)b,(int)res);
|
||||||
|
spx_mips+=5;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15)
|
||||||
|
#define MULT16_32_P15(a,b) MULT16_32_PX(a,b,15)
|
||||||
|
#define MAC16_32_Q15(c,a,b) ADD32((c),MULT16_32_Q15((a),(b)))
|
||||||
|
|
||||||
|
static inline int SATURATE(int a, int b)
|
||||||
|
{
|
||||||
|
if (a>b)
|
||||||
|
a=b;
|
||||||
|
if (a<-b)
|
||||||
|
a = -b;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int MULT16_16_Q11_32(int a, int b)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_Q11: inputs are not short: %d %d\n", a, b);
|
||||||
|
}
|
||||||
|
res = ((long long)a)*b;
|
||||||
|
res >>= 11;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
fprintf (stderr, "MULT16_16_Q11: output is not short: %d*%d=%d\n", (int)a, (int)b, (int)res);
|
||||||
|
spx_mips+=3;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static inline short MULT16_16_Q13(int a, int b)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_Q13: inputs are not short: %d %d\n", a, b);
|
||||||
|
}
|
||||||
|
res = ((long long)a)*b;
|
||||||
|
res >>= 13;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
fprintf (stderr, "MULT16_16_Q13: output is not short: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
spx_mips+=3;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static inline short MULT16_16_Q14(int a, int b)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_Q14: inputs are not short: %d %d\n", a, b);
|
||||||
|
}
|
||||||
|
res = ((long long)a)*b;
|
||||||
|
res >>= 14;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
fprintf (stderr, "MULT16_16_Q14: output is not short: %d\n", (int)res);
|
||||||
|
spx_mips+=3;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static inline short MULT16_16_Q15(int a, int b)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_Q15: inputs are not short: %d %d\n", a, b);
|
||||||
|
}
|
||||||
|
res = ((long long)a)*b;
|
||||||
|
res >>= 15;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_Q15: output is not short: %d\n", (int)res);
|
||||||
|
}
|
||||||
|
spx_mips+=3;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline short MULT16_16_P13(int a, int b)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_P13: inputs are not short: %d %d\n", a, b);
|
||||||
|
}
|
||||||
|
res = ((long long)a)*b;
|
||||||
|
res += 4096;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
fprintf (stderr, "MULT16_16_P13: overflow: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
res >>= 13;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
fprintf (stderr, "MULT16_16_P13: output is not short: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
spx_mips+=4;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static inline short MULT16_16_P14(int a, int b)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_P14: inputs are not short: %d %d\n", a, b);
|
||||||
|
}
|
||||||
|
res = ((long long)a)*b;
|
||||||
|
res += 8192;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
fprintf (stderr, "MULT16_16_P14: overflow: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
res >>= 14;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
fprintf (stderr, "MULT16_16_P14: output is not short: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
spx_mips+=4;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static inline short MULT16_16_P15(int a, int b)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "MULT16_16_P15: inputs are not short: %d %d\n", a, b);
|
||||||
|
}
|
||||||
|
res = ((long long)a)*b;
|
||||||
|
res += 16384;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
fprintf (stderr, "MULT16_16_P15: overflow: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
res >>= 15;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
fprintf (stderr, "MULT16_16_P15: output is not short: %d*%d=%d\n", a, b, (int)res);
|
||||||
|
spx_mips+=4;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DIV32_16(a, b) _DIV32_16(a, b, __FILE__, __LINE__)
|
||||||
|
|
||||||
|
static inline int _DIV32_16(long long a, long long b, char *file, int line)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (b==0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "DIV32_16: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!VERIFY_INT(a) || !VERIFY_SHORT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "DIV32_16: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
|
||||||
|
}
|
||||||
|
res = a/b;
|
||||||
|
if (!VERIFY_SHORT(res))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "DIV32_16: output is not short: %d / %d = %d in %s: line %d\n", (int)a,(int)b,(int)res, file, line);
|
||||||
|
if (res>32767)
|
||||||
|
res = 32767;
|
||||||
|
if (res<-32768)
|
||||||
|
res = -32768;
|
||||||
|
}
|
||||||
|
spx_mips+=20;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DIV32(a, b) _DIV32(a, b, __FILE__, __LINE__)
|
||||||
|
static inline int _DIV32(long long a, long long b, char *file, int line)
|
||||||
|
{
|
||||||
|
long long res;
|
||||||
|
if (b==0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "DIV32: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!VERIFY_INT(a) || !VERIFY_INT(b))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "DIV32: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
|
||||||
|
}
|
||||||
|
res = a/b;
|
||||||
|
if (!VERIFY_INT(res))
|
||||||
|
fprintf (stderr, "DIV32: output is not int: %d in %s: line %d\n", (int)res, file, line);
|
||||||
|
spx_mips+=36;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#define PDIV32(a,b) DIV32(ADD32((a),(b)>>1),b)
|
||||||
|
#define PDIV32_16(a,b) DIV32_16(ADD32((a),(b)>>1),b)
|
||||||
|
|
||||||
|
#endif
|
106
audio/deps/resampler/fixed_generic.h
Normal file
106
audio/deps/resampler/fixed_generic.h
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
/* Copyright (C) 2003 Jean-Marc Valin */
|
||||||
|
/**
|
||||||
|
@file fixed_generic.h
|
||||||
|
@brief Generic fixed-point operations
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
- Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FIXED_GENERIC_H
|
||||||
|
#define FIXED_GENERIC_H
|
||||||
|
|
||||||
|
#define QCONST16(x,bits) ((spx_word16_t)(.5+(x)*(((spx_word32_t)1)<<(bits))))
|
||||||
|
#define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits))))
|
||||||
|
|
||||||
|
#define NEG16(x) (-(x))
|
||||||
|
#define NEG32(x) (-(x))
|
||||||
|
#define EXTRACT16(x) ((spx_word16_t)(x))
|
||||||
|
#define EXTEND32(x) ((spx_word32_t)(x))
|
||||||
|
#define SHR16(a,shift) ((a) >> (shift))
|
||||||
|
#define SHL16(a,shift) ((a) << (shift))
|
||||||
|
#define SHR32(a,shift) ((a) >> (shift))
|
||||||
|
#define SHL32(a,shift) ((a) << (shift))
|
||||||
|
#define PSHR16(a,shift) (SHR16((a)+((1<<((shift))>>1)),shift))
|
||||||
|
#define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift))
|
||||||
|
#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
|
||||||
|
#define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
|
||||||
|
#define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
|
||||||
|
|
||||||
|
#define SATURATE32PSHR(x,shift,a) (((x)>=(SHL32(a,shift))) ? (a) : \
|
||||||
|
(x)<=-(SHL32(a,shift)) ? -(a) : \
|
||||||
|
(PSHR32(x, shift)))
|
||||||
|
|
||||||
|
#define SHR(a,shift) ((a) >> (shift))
|
||||||
|
#define SHL(a,shift) ((spx_word32_t)(a) << (shift))
|
||||||
|
#define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift))
|
||||||
|
#define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
|
||||||
|
|
||||||
|
|
||||||
|
#define ADD16(a,b) ((spx_word16_t)((spx_word16_t)(a)+(spx_word16_t)(b)))
|
||||||
|
#define SUB16(a,b) ((spx_word16_t)(a)-(spx_word16_t)(b))
|
||||||
|
#define ADD32(a,b) ((spx_word32_t)(a)+(spx_word32_t)(b))
|
||||||
|
#define SUB32(a,b) ((spx_word32_t)(a)-(spx_word32_t)(b))
|
||||||
|
|
||||||
|
|
||||||
|
/* result fits in 16 bits */
|
||||||
|
#define MULT16_16_16(a,b) (((spx_word16_t)(a))*((spx_word16_t)(b)))
|
||||||
|
/* result fits in 32 bits */
|
||||||
|
#define MULT16_32_32(a,b) (((spx_word16_t)(a))*((spx_word32_t)(b)))
|
||||||
|
|
||||||
|
/* (spx_word32_t)(spx_word16_t) gives TI compiler a hint that it's 16x16->32 multiply */
|
||||||
|
#define MULT16_16(a,b) (((spx_word32_t)(spx_word16_t)(a))*((spx_word32_t)(spx_word16_t)(b)))
|
||||||
|
|
||||||
|
#define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b))))
|
||||||
|
|
||||||
|
#define MULT16_32_P15(a,b) ADD32(MULT16_32_32(a,SHR((b),15)), PSHR(MULT16_16((a),((b)&0x00007fff)),15))
|
||||||
|
#define MULT16_32_Q15(a,b) ADD32(MULT16_32_32(a,SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))
|
||||||
|
#define MAC16_32_Q15(c,a,b) ADD32(c,MULT16_32_Q15(a,b))
|
||||||
|
|
||||||
|
|
||||||
|
#define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11)))
|
||||||
|
#define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13)))
|
||||||
|
#define MAC16_16_P13(c,a,b) (ADD32((c),SHR(ADD32(4096,MULT16_16((a),(b))),13)))
|
||||||
|
|
||||||
|
#define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11))
|
||||||
|
#define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13))
|
||||||
|
#define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14))
|
||||||
|
#define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15))
|
||||||
|
|
||||||
|
#define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13))
|
||||||
|
#define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14))
|
||||||
|
#define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15))
|
||||||
|
|
||||||
|
#define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15))
|
||||||
|
|
||||||
|
#define DIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a))/((spx_word16_t)(b))))
|
||||||
|
#define PDIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word16_t)(b))))
|
||||||
|
#define DIV32(a,b) (((spx_word32_t)(a))/((spx_word32_t)(b)))
|
||||||
|
#define PDIV32(a,b) (((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word32_t)(b)))
|
||||||
|
|
||||||
|
#endif
|
89
audio/deps/resampler/os_support.h
Normal file
89
audio/deps/resampler/os_support.h
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
/* Copyright (C) 2007 Jean-Marc Valin
|
||||||
|
|
||||||
|
File: os_support.h
|
||||||
|
This is the (tiny) OS abstraction layer. Aside from math.h, this is the
|
||||||
|
only place where system headers are allowed.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
3. The name of the author may not be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||||
|
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OS_SUPPORT_H
|
||||||
|
#define OS_SUPPORT_H
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#ifdef OS_SUPPORT_CUSTOM
|
||||||
|
#include "os_support_custom.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_free
|
||||||
|
NOTE: speex_alloc needs to CLEAR THE MEMORY */
|
||||||
|
#ifndef OVERRIDE_SPEEX_ALLOC
|
||||||
|
static inline void *speex_alloc (int size)
|
||||||
|
{
|
||||||
|
/* WARNING: this is not equivalent to malloc(). If you want to use malloc()
|
||||||
|
or your own allocator, YOU NEED TO CLEAR THE MEMORY ALLOCATED. Otherwise
|
||||||
|
you will experience strange bugs */
|
||||||
|
return calloc(size,1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Speex wrapper for realloc. To do your own dynamic allocation, all you need to do is replace this function, speex_alloc and speex_free */
|
||||||
|
#ifndef OVERRIDE_SPEEX_REALLOC
|
||||||
|
static inline void *speex_realloc (void *ptr, int size)
|
||||||
|
{
|
||||||
|
return realloc(ptr, size);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_alloc */
|
||||||
|
#ifndef OVERRIDE_SPEEX_FREE
|
||||||
|
static inline void speex_free (void *ptr)
|
||||||
|
{
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef OVERRIDE_SPEEX_WARNING
|
||||||
|
static inline void speex_warning(const char *str)
|
||||||
|
{
|
||||||
|
#ifndef DISABLE_WARNINGS
|
||||||
|
fprintf (stderr, "warning: %s\n", str);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
1051
audio/deps/resampler/resample.c
Normal file
1051
audio/deps/resampler/resample.c
Normal file
File diff suppressed because it is too large
Load diff
188
audio/deps/resampler/resample_neon.h
Normal file
188
audio/deps/resampler/resample_neon.h
Normal file
|
@ -0,0 +1,188 @@
|
||||||
|
/* Copyright (C) 2007-2008 Jean-Marc Valin
|
||||||
|
* Copyright (C) 2008 Thorvald Natvig
|
||||||
|
* Copyright (C) 2011 Texas Instruments
|
||||||
|
* author Jyri Sarha
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
@file resample_neon.h
|
||||||
|
@brief Resampler functions (NEON version)
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
- Neither the name of the Xiph.org Foundation nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
||||||
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(__aarch64__)
|
||||||
|
static inline int32_t saturate_32bit_to_16bit(int32_t a) {
|
||||||
|
int32_t ret;
|
||||||
|
__asm__ ("fmov s0, %w[a]\n"
|
||||||
|
"sqxtn h0, s0\n"
|
||||||
|
"sxtl v0.4s, v0.4h\n"
|
||||||
|
"fmov %w[ret], s0\n"
|
||||||
|
: [ret] "=r" (ret)
|
||||||
|
: [a] "r" (a)
|
||||||
|
: "v0" );
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#elif defined(__thumb2__)
|
||||||
|
static inline int32_t saturate_32bit_to_16bit(int32_t a) {
|
||||||
|
int32_t ret;
|
||||||
|
__asm__ ("ssat %[ret], #16, %[a]"
|
||||||
|
: [ret] "=r" (ret)
|
||||||
|
: [a] "r" (a)
|
||||||
|
: );
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline int32_t saturate_32bit_to_16bit(int32_t a) {
|
||||||
|
int32_t ret;
|
||||||
|
__asm__ ("vmov.s32 d0[0], %[a]\n"
|
||||||
|
"vqmovn.s32 d0, q0\n"
|
||||||
|
"vmov.s16 %[ret], d0[0]\n"
|
||||||
|
: [ret] "=r" (ret)
|
||||||
|
: [a] "r" (a)
|
||||||
|
: "q0");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#undef WORD2INT
|
||||||
|
#define WORD2INT(x) (saturate_32bit_to_16bit(x))
|
||||||
|
|
||||||
|
#define OVERRIDE_INNER_PRODUCT_SINGLE
|
||||||
|
/* Only works when len % 4 == 0 and len >= 4 */
|
||||||
|
#if defined(__aarch64__)
|
||||||
|
static inline int32_t inner_product_single(const int16_t *a, const int16_t *b, unsigned int len)
|
||||||
|
{
|
||||||
|
int32_t ret;
|
||||||
|
uint32_t remainder = len % 16;
|
||||||
|
len = len - remainder;
|
||||||
|
|
||||||
|
__asm__ volatile (" cmp %w[len], #0\n"
|
||||||
|
" b.ne 1f\n"
|
||||||
|
" ld1 {v16.4h}, [%[b]], #8\n"
|
||||||
|
" ld1 {v20.4h}, [%[a]], #8\n"
|
||||||
|
" subs %w[remainder], %w[remainder], #4\n"
|
||||||
|
" smull v0.4s, v16.4h, v20.4h\n"
|
||||||
|
" b.ne 4f\n"
|
||||||
|
" b 5f\n"
|
||||||
|
"1:"
|
||||||
|
" ld1 {v16.4h, v17.4h, v18.4h, v19.4h}, [%[b]], #32\n"
|
||||||
|
" ld1 {v20.4h, v21.4h, v22.4h, v23.4h}, [%[a]], #32\n"
|
||||||
|
" subs %w[len], %w[len], #16\n"
|
||||||
|
" smull v0.4s, v16.4h, v20.4h\n"
|
||||||
|
" smlal v0.4s, v17.4h, v21.4h\n"
|
||||||
|
" smlal v0.4s, v18.4h, v22.4h\n"
|
||||||
|
" smlal v0.4s, v19.4h, v23.4h\n"
|
||||||
|
" b.eq 3f\n"
|
||||||
|
"2:"
|
||||||
|
" ld1 {v16.4h, v17.4h, v18.4h, v19.4h}, [%[b]], #32\n"
|
||||||
|
" ld1 {v20.4h, v21.4h, v22.4h, v23.4h}, [%[a]], #32\n"
|
||||||
|
" subs %w[len], %w[len], #16\n"
|
||||||
|
" smlal v0.4s, v16.4h, v20.4h\n"
|
||||||
|
" smlal v0.4s, v17.4h, v21.4h\n"
|
||||||
|
" smlal v0.4s, v18.4h, v22.4h\n"
|
||||||
|
" smlal v0.4s, v19.4h, v23.4h\n"
|
||||||
|
" b.ne 2b\n"
|
||||||
|
"3:"
|
||||||
|
" cmp %w[remainder], #0\n"
|
||||||
|
" b.eq 5f\n"
|
||||||
|
"4:"
|
||||||
|
" ld1 {v18.4h}, [%[b]], #8\n"
|
||||||
|
" ld1 {v22.4h}, [%[a]], #8\n"
|
||||||
|
" subs %w[remainder], %w[remainder], #4\n"
|
||||||
|
" smlal v0.4s, v18.4h, v22.4h\n"
|
||||||
|
" b.ne 4b\n"
|
||||||
|
"5:"
|
||||||
|
" saddlv d0, v0.4s\n"
|
||||||
|
" sqxtn s0, d0\n"
|
||||||
|
" sqrshrn h0, s0, #15\n"
|
||||||
|
" sxtl v0.4s, v0.4h\n"
|
||||||
|
" fmov %w[ret], s0\n"
|
||||||
|
: [ret] "=r" (ret), [a] "+r" (a), [b] "+r" (b),
|
||||||
|
[len] "+r" (len), [remainder] "+r" (remainder)
|
||||||
|
:
|
||||||
|
: "cc", "v0",
|
||||||
|
"v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline int32_t inner_product_single(const int16_t *a, const int16_t *b, unsigned int len)
|
||||||
|
{
|
||||||
|
int32_t ret;
|
||||||
|
uint32_t remainder = len % 16;
|
||||||
|
len = len - remainder;
|
||||||
|
|
||||||
|
__asm__ volatile (" cmp %[len], #0\n"
|
||||||
|
" bne 1f\n"
|
||||||
|
" vld1.16 {d16}, [%[b]]!\n"
|
||||||
|
" vld1.16 {d20}, [%[a]]!\n"
|
||||||
|
" subs %[remainder], %[remainder], #4\n"
|
||||||
|
" vmull.s16 q0, d16, d20\n"
|
||||||
|
" beq 5f\n"
|
||||||
|
" b 4f\n"
|
||||||
|
"1:"
|
||||||
|
" vld1.16 {d16, d17, d18, d19}, [%[b]]!\n"
|
||||||
|
" vld1.16 {d20, d21, d22, d23}, [%[a]]!\n"
|
||||||
|
" subs %[len], %[len], #16\n"
|
||||||
|
" vmull.s16 q0, d16, d20\n"
|
||||||
|
" vmlal.s16 q0, d17, d21\n"
|
||||||
|
" vmlal.s16 q0, d18, d22\n"
|
||||||
|
" vmlal.s16 q0, d19, d23\n"
|
||||||
|
" beq 3f\n"
|
||||||
|
"2:"
|
||||||
|
" vld1.16 {d16, d17, d18, d19}, [%[b]]!\n"
|
||||||
|
" vld1.16 {d20, d21, d22, d23}, [%[a]]!\n"
|
||||||
|
" subs %[len], %[len], #16\n"
|
||||||
|
" vmlal.s16 q0, d16, d20\n"
|
||||||
|
" vmlal.s16 q0, d17, d21\n"
|
||||||
|
" vmlal.s16 q0, d18, d22\n"
|
||||||
|
" vmlal.s16 q0, d19, d23\n"
|
||||||
|
" bne 2b\n"
|
||||||
|
"3:"
|
||||||
|
" cmp %[remainder], #0\n"
|
||||||
|
" beq 5f\n"
|
||||||
|
"4:"
|
||||||
|
" vld1.16 {d16}, [%[b]]!\n"
|
||||||
|
" vld1.16 {d20}, [%[a]]!\n"
|
||||||
|
" subs %[remainder], %[remainder], #4\n"
|
||||||
|
" vmlal.s16 q0, d16, d20\n"
|
||||||
|
" bne 4b\n"
|
||||||
|
"5:"
|
||||||
|
" vaddl.s32 q0, d0, d1\n"
|
||||||
|
" vadd.s64 d0, d0, d1\n"
|
||||||
|
" vqmovn.s64 d0, q0\n"
|
||||||
|
" vqrshrn.s32 d0, q0, #15\n"
|
||||||
|
" vmov.s16 %[ret], d0[0]\n"
|
||||||
|
: [ret] "=r" (ret), [a] "+r" (a), [b] "+r" (b),
|
||||||
|
[len] "+r" (len), [remainder] "+r" (remainder)
|
||||||
|
:
|
||||||
|
: "cc", "q0",
|
||||||
|
"d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif // !defined(__aarch64__)
|
216
audio/deps/resampler/speex_resampler.h
Normal file
216
audio/deps/resampler/speex_resampler.h
Normal file
|
@ -0,0 +1,216 @@
|
||||||
|
/* Copyright (C) 2007 Jean-Marc Valin
|
||||||
|
|
||||||
|
File: speex_resampler.h
|
||||||
|
Resampling code
|
||||||
|
|
||||||
|
The design goals of this code are:
|
||||||
|
- Very fast algorithm
|
||||||
|
- Low memory requirement
|
||||||
|
- Good *perceptual* quality (and not best SNR)
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
3. The name of the author may not be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||||
|
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SPEEX_RESAMPLER_H
|
||||||
|
#define SPEEX_RESAMPLER_H
|
||||||
|
#include "speexdsp_types.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SPEEX_RESAMPLER_QUALITY_MAX 10
|
||||||
|
#define SPEEX_RESAMPLER_QUALITY_MIN 0
|
||||||
|
#define SPEEX_RESAMPLER_QUALITY_DEFAULT 4
|
||||||
|
#define SPEEX_RESAMPLER_QUALITY_VOIP 3
|
||||||
|
#define SPEEX_RESAMPLER_QUALITY_DESKTOP 5
|
||||||
|
|
||||||
|
enum {
|
||||||
|
RESAMPLER_ERR_SUCCESS = 0,
|
||||||
|
RESAMPLER_ERR_ALLOC_FAILED = 1,
|
||||||
|
RESAMPLER_ERR_BAD_STATE = 2,
|
||||||
|
RESAMPLER_ERR_INVALID_ARG = 3,
|
||||||
|
RESAMPLER_ERR_PTR_OVERLAP = 4,
|
||||||
|
RESAMPLER_ERR_OVERFLOW = 5,
|
||||||
|
|
||||||
|
RESAMPLER_ERR_MAX_ERROR
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SpeexResamplerState_;
|
||||||
|
typedef struct SpeexResamplerState_ SpeexResamplerState;
|
||||||
|
|
||||||
|
/** Create a new resampler with integer input and output rates.
|
||||||
|
* @param nb_channels Number of channels to be processed
|
||||||
|
* @param in_rate Input sampling rate (integer number of Hz).
|
||||||
|
* @param out_rate Output sampling rate (integer number of Hz).
|
||||||
|
* @param quality Resampling quality between 0 and 10, where 0 has poor quality
|
||||||
|
* and 10 has very high quality.
|
||||||
|
* @return Newly created resampler state
|
||||||
|
* @retval NULL Error: not enough memory
|
||||||
|
*/
|
||||||
|
SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels,
|
||||||
|
spx_uint32_t in_rate,
|
||||||
|
spx_uint32_t out_rate,
|
||||||
|
int quality,
|
||||||
|
int *err);
|
||||||
|
|
||||||
|
/** Destroy a resampler state.
|
||||||
|
* @param st Resampler state
|
||||||
|
*/
|
||||||
|
void speex_resampler_destroy(SpeexResamplerState *st);
|
||||||
|
|
||||||
|
/** Resample an int array. The input and output buffers must *not* overlap.
|
||||||
|
* @param st Resampler state
|
||||||
|
* @param channel_index Index of the channel to process for the multi-channel
|
||||||
|
* base (0 otherwise)
|
||||||
|
* @param in Input buffer
|
||||||
|
* @param in_len Number of input samples in the input buffer. Returns the number
|
||||||
|
* of samples processed
|
||||||
|
* @param out Output buffer
|
||||||
|
* @param out_len Size of the output buffer. Returns the number of samples written
|
||||||
|
*/
|
||||||
|
int speex_resampler_process_int(SpeexResamplerState *st,
|
||||||
|
spx_uint32_t channel_index,
|
||||||
|
const spx_int16_t *in,
|
||||||
|
spx_uint32_t *in_len,
|
||||||
|
spx_int16_t *out,
|
||||||
|
spx_uint32_t *out_len);
|
||||||
|
|
||||||
|
/** Resample an interleaved int array. The input and output buffers must *not* overlap.
|
||||||
|
* @param st Resampler state
|
||||||
|
* @param in Input buffer
|
||||||
|
* @param in_len Number of input samples in the input buffer. Returns the number
|
||||||
|
* of samples processed. This is all per-channel.
|
||||||
|
* @param out Output buffer
|
||||||
|
* @param out_len Size of the output buffer. Returns the number of samples written.
|
||||||
|
* This is all per-channel.
|
||||||
|
*/
|
||||||
|
int speex_resampler_process_interleaved_int(SpeexResamplerState *st,
|
||||||
|
const spx_int16_t *in,
|
||||||
|
spx_uint32_t *in_len,
|
||||||
|
spx_int16_t *out,
|
||||||
|
spx_uint32_t *out_len);
|
||||||
|
|
||||||
|
/** Set (change) the input/output sampling rates (integer value).
|
||||||
|
* @param st Resampler state
|
||||||
|
* @param in_rate Input sampling rate (integer number of Hz).
|
||||||
|
* @param out_rate Output sampling rate (integer number of Hz).
|
||||||
|
*/
|
||||||
|
int speex_resampler_set_rate(SpeexResamplerState *st,
|
||||||
|
spx_uint32_t in_rate,
|
||||||
|
spx_uint32_t out_rate);
|
||||||
|
|
||||||
|
/** Get the current input/output sampling rates (integer value).
|
||||||
|
* @param st Resampler state
|
||||||
|
* @param in_rate Input sampling rate (integer number of Hz) copied.
|
||||||
|
* @param out_rate Output sampling rate (integer number of Hz) copied.
|
||||||
|
*/
|
||||||
|
void speex_resampler_get_rate(SpeexResamplerState *st,
|
||||||
|
spx_uint32_t *in_rate,
|
||||||
|
spx_uint32_t *out_rate);
|
||||||
|
|
||||||
|
/** Set (change) the conversion quality.
|
||||||
|
* @param st Resampler state
|
||||||
|
* @param quality Resampling quality between 0 and 10, where 0 has poor
|
||||||
|
* quality and 10 has very high quality.
|
||||||
|
*/
|
||||||
|
int speex_resampler_set_quality(SpeexResamplerState *st,
|
||||||
|
int quality);
|
||||||
|
|
||||||
|
/** Get the conversion quality.
|
||||||
|
* @param st Resampler state
|
||||||
|
* @param quality Resampling quality between 0 and 10, where 0 has poor
|
||||||
|
* quality and 10 has very high quality.
|
||||||
|
*/
|
||||||
|
void speex_resampler_get_quality(SpeexResamplerState *st,
|
||||||
|
int *quality);
|
||||||
|
|
||||||
|
/** Set (change) the input stride.
|
||||||
|
* @param st Resampler state
|
||||||
|
* @param stride Input stride
|
||||||
|
*/
|
||||||
|
void speex_resampler_set_input_stride(SpeexResamplerState *st,
|
||||||
|
spx_uint32_t stride);
|
||||||
|
|
||||||
|
/** Get the input stride.
|
||||||
|
* @param st Resampler state
|
||||||
|
* @param stride Input stride copied
|
||||||
|
*/
|
||||||
|
void speex_resampler_get_input_stride(SpeexResamplerState *st,
|
||||||
|
spx_uint32_t *stride);
|
||||||
|
|
||||||
|
/** Set (change) the output stride.
|
||||||
|
* @param st Resampler state
|
||||||
|
* @param stride Output stride
|
||||||
|
*/
|
||||||
|
void speex_resampler_set_output_stride(SpeexResamplerState *st,
|
||||||
|
spx_uint32_t stride);
|
||||||
|
|
||||||
|
/** Get the output stride.
|
||||||
|
* @param st Resampler state copied
|
||||||
|
* @param stride Output stride
|
||||||
|
*/
|
||||||
|
void speex_resampler_get_output_stride(SpeexResamplerState *st,
|
||||||
|
spx_uint32_t *stride);
|
||||||
|
|
||||||
|
/** Get the latency introduced by the resampler measured in input samples.
|
||||||
|
* @param st Resampler state
|
||||||
|
*/
|
||||||
|
int speex_resampler_get_input_latency(SpeexResamplerState *st);
|
||||||
|
|
||||||
|
/** Get the latency introduced by the resampler measured in output samples.
|
||||||
|
* @param st Resampler state
|
||||||
|
*/
|
||||||
|
int speex_resampler_get_output_latency(SpeexResamplerState *st);
|
||||||
|
|
||||||
|
/** Make sure that the first samples to go out of the resamplers don't have
|
||||||
|
* leading zeros. This is only useful before starting to use a newly created
|
||||||
|
* resampler. It is recommended to use that when resampling an audio file, as
|
||||||
|
* it will generate a file with the same length. For real-time processing,
|
||||||
|
* it is probably easier not to use this call (so that the output duration
|
||||||
|
* is the same for the first frame).
|
||||||
|
* @param st Resampler state
|
||||||
|
*/
|
||||||
|
int speex_resampler_skip_zeros(SpeexResamplerState *st);
|
||||||
|
|
||||||
|
/** Reset a resampler so a new (unrelated) stream can be processed.
|
||||||
|
* @param st Resampler state
|
||||||
|
*/
|
||||||
|
int speex_resampler_reset_mem(SpeexResamplerState *st);
|
||||||
|
|
||||||
|
/** Returns the English meaning for an error code
|
||||||
|
* @param err Error code
|
||||||
|
* @return English string
|
||||||
|
*/
|
||||||
|
const char *speex_resampler_strerror(int err);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
28
audio/deps/resampler/speexdsp_types.h
Normal file
28
audio/deps/resampler/speexdsp_types.h
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/* speexdsp_types.h taken from libogg */
|
||||||
|
/********************************************************************
|
||||||
|
* *
|
||||||
|
* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
|
||||||
|
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||||
|
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||||
|
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||||
|
* *
|
||||||
|
* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
|
||||||
|
* by the Xiph.Org Foundation http://www.xiph.org/ *
|
||||||
|
* *
|
||||||
|
********************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@file speexdsp_types.h
|
||||||
|
@brief Speex types
|
||||||
|
*/
|
||||||
|
#ifndef __SPEEX_TYPES_H__
|
||||||
|
#define __SPEEX_TYPES_H__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef int16_t spx_int16_t;
|
||||||
|
typedef uint16_t spx_uint16_t;
|
||||||
|
typedef int32_t spx_int32_t;
|
||||||
|
typedef uint32_t spx_uint32_t;
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue