cannam@154: /* Copyright (c) 2007-2008 CSIRO cannam@154: Copyright (c) 2007-2010 Xiph.Org Foundation cannam@154: Copyright (c) 2008 Gregory Maxwell cannam@154: Written by Jean-Marc Valin and Gregory Maxwell */ cannam@154: /* cannam@154: Redistribution and use in source and binary forms, with or without cannam@154: modification, are permitted provided that the following conditions cannam@154: are met: cannam@154: cannam@154: - Redistributions of source code must retain the above copyright cannam@154: notice, this list of conditions and the following disclaimer. cannam@154: cannam@154: - Redistributions in binary form must reproduce the above copyright cannam@154: notice, this list of conditions and the following disclaimer in the cannam@154: documentation and/or other materials provided with the distribution. cannam@154: cannam@154: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS cannam@154: ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT cannam@154: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR cannam@154: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER cannam@154: OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, cannam@154: EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, cannam@154: PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR cannam@154: PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF cannam@154: LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING cannam@154: NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS cannam@154: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. cannam@154: */ cannam@154: cannam@154: #ifdef HAVE_CONFIG_H cannam@154: #include "config.h" cannam@154: #endif cannam@154: cannam@154: #define CELT_C cannam@154: cannam@154: #include "os_support.h" cannam@154: #include "mdct.h" cannam@154: #include cannam@154: #include "celt.h" cannam@154: #include "pitch.h" cannam@154: #include "bands.h" cannam@154: #include "modes.h" cannam@154: #include "entcode.h" cannam@154: #include "quant_bands.h" cannam@154: #include "rate.h" cannam@154: #include "stack_alloc.h" cannam@154: #include "mathops.h" cannam@154: #include "float_cast.h" cannam@154: #include cannam@154: #include "celt_lpc.h" cannam@154: #include "vq.h" cannam@154: cannam@154: #ifndef PACKAGE_VERSION cannam@154: #define PACKAGE_VERSION "unknown" cannam@154: #endif cannam@154: cannam@154: #if defined(MIPSr1_ASM) cannam@154: #include "mips/celt_mipsr1.h" cannam@154: #endif cannam@154: cannam@154: cannam@154: int resampling_factor(opus_int32 rate) cannam@154: { cannam@154: int ret; cannam@154: switch (rate) cannam@154: { cannam@154: case 48000: cannam@154: ret = 1; cannam@154: break; cannam@154: case 24000: cannam@154: ret = 2; cannam@154: break; cannam@154: case 16000: cannam@154: ret = 3; cannam@154: break; cannam@154: case 12000: cannam@154: ret = 4; cannam@154: break; cannam@154: case 8000: cannam@154: ret = 6; cannam@154: break; cannam@154: default: cannam@154: #ifndef CUSTOM_MODES cannam@154: celt_assert(0); cannam@154: #endif cannam@154: ret = 0; cannam@154: break; cannam@154: } cannam@154: return ret; cannam@154: } cannam@154: cannam@154: #if !defined(OVERRIDE_COMB_FILTER_CONST) || defined(NON_STATIC_COMB_FILTER_CONST_C) cannam@154: /* This version should be faster on ARM */ cannam@154: #ifdef OPUS_ARM_ASM cannam@154: #ifndef NON_STATIC_COMB_FILTER_CONST_C cannam@154: static cannam@154: #endif cannam@154: void comb_filter_const_c(opus_val32 *y, opus_val32 *x, int T, int N, cannam@154: opus_val16 g10, opus_val16 g11, opus_val16 g12) cannam@154: { cannam@154: opus_val32 x0, x1, x2, x3, x4; cannam@154: int i; cannam@154: x4 = SHL32(x[-T-2], 1); cannam@154: x3 = SHL32(x[-T-1], 1); cannam@154: x2 = SHL32(x[-T], 1); cannam@154: x1 = SHL32(x[-T+1], 1); cannam@154: for (i=0;inbEBands;i++) cannam@154: { cannam@154: int N; cannam@154: N=(m->eBands[i+1]-m->eBands[i])<cache.caps[m->nbEBands*(2*LM+C-1)+i]+64)*C*N>>2; cannam@154: } cannam@154: } cannam@154: cannam@154: cannam@154: cannam@154: const char *opus_strerror(int error) cannam@154: { cannam@154: static const char * const error_strings[8] = { cannam@154: "success", cannam@154: "invalid argument", cannam@154: "buffer too small", cannam@154: "internal error", cannam@154: "corrupted stream", cannam@154: "request not implemented", cannam@154: "invalid state", cannam@154: "memory allocation failed" cannam@154: }; cannam@154: if (error > 0 || error < -7) cannam@154: return "unknown error"; cannam@154: else cannam@154: return error_strings[-error]; cannam@154: } cannam@154: cannam@154: const char *opus_get_version_string(void) cannam@154: { cannam@154: return "libopus " PACKAGE_VERSION cannam@154: /* Applications may rely on the presence of this substring in the version cannam@154: string to determine if they have a fixed-point or floating-point build cannam@154: at runtime. */ cannam@154: #ifdef FIXED_POINT cannam@154: "-fixed" cannam@154: #endif cannam@154: #ifdef FUZZING cannam@154: "-fuzzing" cannam@154: #endif cannam@154: ; cannam@154: }