summaryrefslogtreecommitdiff
path: root/src/opus-1.1/celt
diff options
context:
space:
mode:
Diffstat (limited to 'src/opus-1.1/celt')
-rw-r--r--src/opus-1.1/celt/_kiss_fft_guts.h183
-rw-r--r--src/opus-1.1/celt/arch.h214
-rwxr-xr-xsrc/opus-1.1/celt/arm/arm2gnu.pl316
-rw-r--r--src/opus-1.1/celt/arm/arm_celt_map.c49
-rw-r--r--src/opus-1.1/celt/arm/armcpu.c174
-rw-r--r--src/opus-1.1/celt/arm/armcpu.h71
-rw-r--r--src/opus-1.1/celt/arm/armopts.s.in37
-rw-r--r--src/opus-1.1/celt/arm/celt_pitch_xcorr_arm.s545
-rw-r--r--src/opus-1.1/celt/arm/fixed_armv4.h76
-rw-r--r--src/opus-1.1/celt/arm/fixed_armv5e.h116
-rw-r--r--src/opus-1.1/celt/arm/kiss_fft_armv4.h121
-rw-r--r--src/opus-1.1/celt/arm/kiss_fft_armv5e.h118
-rw-r--r--src/opus-1.1/celt/arm/pitch_arm.h57
-rw-r--r--src/opus-1.1/celt/bands.c1518
-rw-r--r--src/opus-1.1/celt/bands.h114
-rw-r--r--src/opus-1.1/celt/celt.c223
-rw-r--r--src/opus-1.1/celt/celt.h218
-rw-r--r--src/opus-1.1/celt/celt_decoder.c1195
-rw-r--r--src/opus-1.1/celt/celt_encoder.c2353
-rw-r--r--src/opus-1.1/celt/celt_lpc.c309
-rw-r--r--src/opus-1.1/celt/celt_lpc.h54
-rw-r--r--src/opus-1.1/celt/cpu_support.h54
-rw-r--r--src/opus-1.1/celt/cwrs.c697
-rw-r--r--src/opus-1.1/celt/cwrs.h48
-rw-r--r--src/opus-1.1/celt/ecintrin.h87
-rw-r--r--src/opus-1.1/celt/entcode.c93
-rw-r--r--src/opus-1.1/celt/entcode.h117
-rw-r--r--src/opus-1.1/celt/entdec.c245
-rw-r--r--src/opus-1.1/celt/entdec.h100
-rw-r--r--src/opus-1.1/celt/entenc.c294
-rw-r--r--src/opus-1.1/celt/entenc.h110
-rw-r--r--src/opus-1.1/celt/fixed_debug.h773
-rw-r--r--src/opus-1.1/celt/fixed_generic.h134
-rw-r--r--src/opus-1.1/celt/float_cast.h140
-rw-r--r--src/opus-1.1/celt/kiss_fft.c719
-rw-r--r--src/opus-1.1/celt/kiss_fft.h139
-rw-r--r--src/opus-1.1/celt/laplace.c134
-rw-r--r--src/opus-1.1/celt/laplace.h48
-rw-r--r--src/opus-1.1/celt/mathops.c208
-rw-r--r--src/opus-1.1/celt/mathops.h258
-rw-r--r--src/opus-1.1/celt/mdct.c311
-rw-r--r--src/opus-1.1/celt/mdct.h70
-rw-r--r--src/opus-1.1/celt/mfrngcod.h48
-rw-r--r--src/opus-1.1/celt/modes.c438
-rw-r--r--src/opus-1.1/celt/modes.h83
-rw-r--r--src/opus-1.1/celt/opus_custom_demo.c210
-rw-r--r--src/opus-1.1/celt/os_support.h92
-rw-r--r--src/opus-1.1/celt/pitch.c537
-rw-r--r--src/opus-1.1/celt/pitch.h173
-rw-r--r--src/opus-1.1/celt/quant_bands.c556
-rw-r--r--src/opus-1.1/celt/quant_bands.h66
-rw-r--r--src/opus-1.1/celt/rate.c638
-rw-r--r--src/opus-1.1/celt/rate.h101
-rw-r--r--src/opus-1.1/celt/stack_alloc.h178
-rw-r--r--src/opus-1.1/celt/static_modes_fixed.h595
-rw-r--r--src/opus-1.1/celt/static_modes_float.h599
-rw-r--r--src/opus-1.1/celt/vq.c415
-rw-r--r--src/opus-1.1/celt/vq.h70
-rw-r--r--src/opus-1.1/celt/x86/pitch_sse.h156
59 files changed, 0 insertions, 17795 deletions
diff --git a/src/opus-1.1/celt/_kiss_fft_guts.h b/src/opus-1.1/celt/_kiss_fft_guts.h
deleted file mode 100644
index aefe490e..00000000
--- a/src/opus-1.1/celt/_kiss_fft_guts.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/*Copyright (c) 2003-2004, Mark Borgerding
-
- All rights reserved.
-
- 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.
-
- 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 COPYRIGHT OWNER 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 KISS_FFT_GUTS_H
-#define KISS_FFT_GUTS_H
-
-#define MIN(a,b) ((a)<(b) ? (a):(b))
-#define MAX(a,b) ((a)>(b) ? (a):(b))
-
-/* kiss_fft.h
- defines kiss_fft_scalar as either short or a float type
- and defines
- typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */
-#include "kiss_fft.h"
-
-/*
- Explanation of macros dealing with complex math:
-
- C_MUL(m,a,b) : m = a*b
- C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise
- C_SUB( res, a,b) : res = a - b
- C_SUBFROM( res , a) : res -= a
- C_ADDTO( res , a) : res += a
- * */
-#ifdef FIXED_POINT
-#include "arch.h"
-
-
-#define SAMP_MAX 2147483647
-#define TWID_MAX 32767
-#define TRIG_UPSCALE 1
-
-#define SAMP_MIN -SAMP_MAX
-
-
-# define S_MUL(a,b) MULT16_32_Q15(b, a)
-
-# define C_MUL(m,a,b) \
- do{ (m).r = SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \
- (m).i = ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0)
-
-# define C_MULC(m,a,b) \
- do{ (m).r = ADD32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \
- (m).i = SUB32(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0)
-
-# define C_MUL4(m,a,b) \
- do{ (m).r = SHR32(SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)),2); \
- (m).i = SHR32(ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)),2); }while(0)
-
-# define C_MULBYSCALAR( c, s ) \
- do{ (c).r = S_MUL( (c).r , s ) ;\
- (c).i = S_MUL( (c).i , s ) ; }while(0)
-
-# define DIVSCALAR(x,k) \
- (x) = S_MUL( x, (TWID_MAX-((k)>>1))/(k)+1 )
-
-# define C_FIXDIV(c,div) \
- do { DIVSCALAR( (c).r , div); \
- DIVSCALAR( (c).i , div); }while (0)
-
-#define C_ADD( res, a,b)\
- do {(res).r=ADD32((a).r,(b).r); (res).i=ADD32((a).i,(b).i); \
- }while(0)
-#define C_SUB( res, a,b)\
- do {(res).r=SUB32((a).r,(b).r); (res).i=SUB32((a).i,(b).i); \
- }while(0)
-#define C_ADDTO( res , a)\
- do {(res).r = ADD32((res).r, (a).r); (res).i = ADD32((res).i,(a).i);\
- }while(0)
-
-#define C_SUBFROM( res , a)\
- do {(res).r = ADD32((res).r,(a).r); (res).i = SUB32((res).i,(a).i); \
- }while(0)
-
-#if defined(OPUS_ARM_INLINE_ASM)
-#include "arm/kiss_fft_armv4.h"
-#endif
-
-#if defined(OPUS_ARM_INLINE_EDSP)
-#include "arm/kiss_fft_armv5e.h"
-#endif
-
-#else /* not FIXED_POINT*/
-
-# define S_MUL(a,b) ( (a)*(b) )
-#define C_MUL(m,a,b) \
- do{ (m).r = (a).r*(b).r - (a).i*(b).i;\
- (m).i = (a).r*(b).i + (a).i*(b).r; }while(0)
-#define C_MULC(m,a,b) \
- do{ (m).r = (a).r*(b).r + (a).i*(b).i;\
- (m).i = (a).i*(b).r - (a).r*(b).i; }while(0)
-
-#define C_MUL4(m,a,b) C_MUL(m,a,b)
-
-# define C_FIXDIV(c,div) /* NOOP */
-# define C_MULBYSCALAR( c, s ) \
- do{ (c).r *= (s);\
- (c).i *= (s); }while(0)
-#endif
-
-#ifndef CHECK_OVERFLOW_OP
-# define CHECK_OVERFLOW_OP(a,op,b) /* noop */
-#endif
-
-#ifndef C_ADD
-#define C_ADD( res, a,b)\
- do { \
- CHECK_OVERFLOW_OP((a).r,+,(b).r)\
- CHECK_OVERFLOW_OP((a).i,+,(b).i)\
- (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \
- }while(0)
-#define C_SUB( res, a,b)\
- do { \
- CHECK_OVERFLOW_OP((a).r,-,(b).r)\
- CHECK_OVERFLOW_OP((a).i,-,(b).i)\
- (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \
- }while(0)
-#define C_ADDTO( res , a)\
- do { \
- CHECK_OVERFLOW_OP((res).r,+,(a).r)\
- CHECK_OVERFLOW_OP((res).i,+,(a).i)\
- (res).r += (a).r; (res).i += (a).i;\
- }while(0)
-
-#define C_SUBFROM( res , a)\
- do {\
- CHECK_OVERFLOW_OP((res).r,-,(a).r)\
- CHECK_OVERFLOW_OP((res).i,-,(a).i)\
- (res).r -= (a).r; (res).i -= (a).i; \
- }while(0)
-#endif /* C_ADD defined */
-
-#ifdef FIXED_POINT
-/*# define KISS_FFT_COS(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * cos (phase))))
-# define KISS_FFT_SIN(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * sin (phase))))*/
-# define KISS_FFT_COS(phase) floor(.5+TWID_MAX*cos (phase))
-# define KISS_FFT_SIN(phase) floor(.5+TWID_MAX*sin (phase))
-# define HALF_OF(x) ((x)>>1)
-#elif defined(USE_SIMD)
-# define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) )
-# define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) )
-# define HALF_OF(x) ((x)*_mm_set1_ps(.5f))
-#else
-# define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase)
-# define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase)
-# define HALF_OF(x) ((x)*.5f)
-#endif
-
-#define kf_cexp(x,phase) \
- do{ \
- (x)->r = KISS_FFT_COS(phase);\
- (x)->i = KISS_FFT_SIN(phase);\
- }while(0)
-
-#define kf_cexp2(x,phase) \
- do{ \
- (x)->r = TRIG_UPSCALE*celt_cos_norm((phase));\
- (x)->i = TRIG_UPSCALE*celt_cos_norm((phase)-32768);\
-}while(0)
-
-#endif /* KISS_FFT_GUTS_H */
diff --git a/src/opus-1.1/celt/arch.h b/src/opus-1.1/celt/arch.h
deleted file mode 100644
index 3bbcd366..00000000
--- a/src/opus-1.1/celt/arch.h
+++ /dev/null
@@ -1,214 +0,0 @@
-/* Copyright (c) 2003-2008 Jean-Marc Valin
- Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/**
- @file arch.h
- @brief Various architecture definitions for CELT
-*/
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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
-
-#include "opus_types.h"
-#include "opus_defines.h"
-
-# if !defined(__GNUC_PREREQ)
-# if defined(__GNUC__)&&defined(__GNUC_MINOR__)
-# define __GNUC_PREREQ(_maj,_min) \
- ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min))
-# else
-# define __GNUC_PREREQ(_maj,_min) 0
-# endif
-# endif
-
-#define CELT_SIG_SCALE 32768.f
-
-#define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__);
-#ifdef ENABLE_ASSERTIONS
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef __GNUC__
-__attribute__((noreturn))
-#endif
-static OPUS_INLINE void _celt_fatal(const char *str, const char *file, int line)
-{
- fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str);
- abort();
-}
-#define celt_assert(cond) {if (!(cond)) {celt_fatal("assertion failed: " #cond);}}
-#define celt_assert2(cond, message) {if (!(cond)) {celt_fatal("assertion failed: " #cond "\n" message);}}
-#else
-#define celt_assert(cond)
-#define celt_assert2(cond, message)
-#endif
-
-#define IMUL32(a,b) ((a)*(b))
-
-#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)) /**< Minimum 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)) /**< Minimum 32-bit value. */
-#define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */
-#define IMIN(a,b) ((a) < (b) ? (a) : (b)) /**< Minimum int value. */
-#define IMAX(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum int value. */
-#define UADD32(a,b) ((a)+(b))
-#define USUB32(a,b) ((a)-(b))
-
-#define PRINT_MIPS(file)
-
-#ifdef FIXED_POINT
-
-typedef opus_int16 opus_val16;
-typedef opus_int32 opus_val32;
-
-typedef opus_val32 celt_sig;
-typedef opus_val16 celt_norm;
-typedef opus_val32 celt_ener;
-
-#define Q15ONE 32767
-
-#define SIG_SHIFT 12
-
-#define NORM_SCALING 16384
-
-#define DB_SHIFT 10
-
-#define EPSILON 1
-#define VERY_SMALL 0
-#define VERY_LARGE16 ((opus_val16)32767)
-#define Q15_ONE ((opus_val16)32767)
-
-#define SCALEIN(a) (a)
-#define SCALEOUT(a) (a)
-
-#ifdef FIXED_DEBUG
-#include "fixed_debug.h"
-#else
-
-#include "fixed_generic.h"
-
-#ifdef OPUS_ARM_INLINE_EDSP
-#include "arm/fixed_armv5e.h"
-#elif defined (OPUS_ARM_INLINE_ASM)
-#include "arm/fixed_armv4.h"
-#elif defined (BFIN_ASM)
-#include "fixed_bfin.h"
-#elif defined (TI_C5X_ASM)
-#include "fixed_c5x.h"
-#elif defined (TI_C6X_ASM)
-#include "fixed_c6x.h"
-#endif
-
-#endif
-
-#else /* FIXED_POINT */
-
-typedef float opus_val16;
-typedef float opus_val32;
-
-typedef float celt_sig;
-typedef float celt_norm;
-typedef float celt_ener;
-
-#define Q15ONE 1.0f
-
-#define NORM_SCALING 1.f
-
-#define EPSILON 1e-15f
-#define VERY_SMALL 1e-30f
-#define VERY_LARGE16 1e15f
-#define Q15_ONE ((opus_val16)1.f)
-
-#define QCONST16(x,bits) (x)
-#define QCONST32(x,bits) (x)
-
-#define NEG16(x) (-(x))
-#define NEG32(x) (-(x))
-#define EXTRACT16(x) (x)
-#define EXTEND32(x) (x)
-#define SHR16(a,shift) (a)
-#define SHL16(a,shift) (a)
-#define SHR32(a,shift) (a)
-#define SHL32(a,shift) (a)
-#define PSHR32(a,shift) (a)
-#define VSHR32(a,shift) (a)
-
-#define PSHR(a,shift) (a)
-#define SHR(a,shift) (a)
-#define SHL(a,shift) (a)
-#define SATURATE(x,a) (x)
-#define SATURATE16(x) (x)
-
-#define ROUND16(a,shift) (a)
-#define HALF16(x) (.5f*(x))
-#define HALF32(x) (.5f*(x))
-
-#define ADD16(a,b) ((a)+(b))
-#define SUB16(a,b) ((a)-(b))
-#define ADD32(a,b) ((a)+(b))
-#define SUB32(a,b) ((a)-(b))
-#define MULT16_16_16(a,b) ((a)*(b))
-#define MULT16_16(a,b) ((opus_val32)(a)*(opus_val32)(b))
-#define MAC16_16(c,a,b) ((c)+(opus_val32)(a)*(opus_val32)(b))
-
-#define MULT16_32_Q15(a,b) ((a)*(b))
-#define MULT16_32_Q16(a,b) ((a)*(b))
-
-#define MULT32_32_Q31(a,b) ((a)*(b))
-
-#define MAC16_32_Q15(c,a,b) ((c)+(a)*(b))
-
-#define MULT16_16_Q11_32(a,b) ((a)*(b))
-#define MULT16_16_Q11(a,b) ((a)*(b))
-#define MULT16_16_Q13(a,b) ((a)*(b))
-#define MULT16_16_Q14(a,b) ((a)*(b))
-#define MULT16_16_Q15(a,b) ((a)*(b))
-#define MULT16_16_P15(a,b) ((a)*(b))
-#define MULT16_16_P13(a,b) ((a)*(b))
-#define MULT16_16_P14(a,b) ((a)*(b))
-#define MULT16_32_P16(a,b) ((a)*(b))
-
-#define DIV32_16(a,b) (((opus_val32)(a))/(opus_val16)(b))
-#define DIV32(a,b) (((opus_val32)(a))/(opus_val32)(b))
-
-#define SCALEIN(a) ((a)*CELT_SIG_SCALE)
-#define SCALEOUT(a) ((a)*(1/CELT_SIG_SCALE))
-
-#endif /* !FIXED_POINT */
-
-#ifndef GLOBAL_STACK_SIZE
-#ifdef FIXED_POINT
-#define GLOBAL_STACK_SIZE 100000
-#else
-#define GLOBAL_STACK_SIZE 100000
-#endif
-#endif
-
-#endif /* ARCH_H */
diff --git a/src/opus-1.1/celt/arm/arm2gnu.pl b/src/opus-1.1/celt/arm/arm2gnu.pl
deleted file mode 100755
index eab42efa..00000000
--- a/src/opus-1.1/celt/arm/arm2gnu.pl
+++ /dev/null
@@ -1,316 +0,0 @@
-#!/usr/bin/perl
-
-my $bigend; # little/big endian
-my $nxstack;
-
-$nxstack = 0;
-
-eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
- if $running_under_some_shell;
-
-while ($ARGV[0] =~ /^-/) {
- $_ = shift;
- last if /^--/;
- if (/^-n/) {
- $nflag++;
- next;
- }
- die "I don't recognize this switch: $_\\n";
-}
-$printit++ unless $nflag;
-
-$\ = "\n"; # automatically add newline on print
-$n=0;
-
-$thumb = 0; # ARM mode by default, not Thumb.
-@proc_stack = ();
-
-LINE:
-while (<>) {
-
- # For ADRLs we need to add a new line after the substituted one.
- $addPadding = 0;
-
- # First, we do not dare to touch *anything* inside double quotes, do we?
- # Second, if you want a dollar character in the string,
- # insert two of them -- that's how ARM C and assembler treat strings.
- s/^([A-Za-z_]\w*)[ \t]+DCB[ \t]*\"/$1: .ascii \"/ && do { s/\$\$/\$/g; next };
- s/\bDCB\b[ \t]*\"/.ascii \"/ && do { s/\$\$/\$/g; next };
- s/^(\S+)\s+RN\s+(\S+)/$1 .req r$2/ && do { s/\$\$/\$/g; next };
- # If there's nothing on a line but a comment, don't try to apply any further
- # substitutions (this is a cheap hack to avoid mucking up the license header)
- s/^([ \t]*);/$1@/ && do { s/\$\$/\$/g; next };
- # If substituted -- leave immediately !
-
- s/@/,:/;
- s/;/@/;
- while ( /@.*'/ ) {
- s/(@.*)'/$1/g;
- }
- s/\{FALSE\}/0/g;
- s/\{TRUE\}/1/g;
- s/\{(\w\w\w\w+)\}/$1/g;
- s/\bINCLUDE[ \t]*([^ \t\n]+)/.include \"$1\"/;
- s/\bGET[ \t]*([^ \t\n]+)/.include \"${ my $x=$1; $x =~ s|\.s|-gnu.S|; \$x }\"/;
- s/\bIMPORT\b/.extern/;
- s/\bEXPORT\b/.global/;
- s/^(\s+)\[/$1IF/;
- s/^(\s+)\|/$1ELSE/;
- s/^(\s+)\]/$1ENDIF/;
- s/IF *:DEF:/ .ifdef/;
- s/IF *:LNOT: *:DEF:/ .ifndef/;
- s/ELSE/ .else/;
- s/ENDIF/ .endif/;
-
- if( /\bIF\b/ ) {
- s/\bIF\b/ .if/;
- s/=/==/;
- }
- if ( $n == 2) {
- s/\$/\\/g;
- }
- if ($n == 1) {
- s/\$//g;
- s/label//g;
- $n = 2;
- }
- if ( /MACRO/ ) {
- s/MACRO *\n/.macro/;
- $n=1;
- }
- if ( /\bMEND\b/ ) {
- s/\bMEND\b/.endm/;
- $n=0;
- }
-
- # ".rdata" doesn't work in 'as' version 2.13.2, as it is ".rodata" there.
- #
- if ( /\bAREA\b/ ) {
- my $align;
- $align = "2";
- if ( /ALIGN=(\d+)/ ) {
- $align = $1;
- }
- if ( /CODE/ ) {
- $nxstack = 1;
- }
- s/^(.+)CODE(.+)READONLY(.*)/ .text/;
- s/^(.+)DATA(.+)READONLY(.*)/ .section .rdata/;
- s/^(.+)\|\|\.data\|\|(.+)/ .data/;
- s/^(.+)\|\|\.bss\|\|(.+)/ .bss/;
- s/$/; .p2align $align/;
- # Enable NEON instructions but don't produce a binary that requires
- # ARMv7. RVCT does not have equivalent directives, so we just do this
- # for all CODE areas.
- if ( /.text/ ) {
- # Separating .arch, .fpu, etc., by semicolons does not work (gas
- # thinks the semicolon is part of the arch name, even when there's
- # whitespace separating them). Sadly this means our line numbers
- # won't match the original source file (we could use the .line
- # directive, which is documented to be obsolete, but then gdb will
- # show the wrong line in the translated source file).
- s/$/; .arch armv7-a\n .fpu neon\n .object_arch armv4t/;
- }
- }
-
- s/\|\|\.constdata\$(\d+)\|\|/.L_CONST$1/; # ||.constdata$3||
- s/\|\|\.bss\$(\d+)\|\|/.L_BSS$1/; # ||.bss$2||
- s/\|\|\.data\$(\d+)\|\|/.L_DATA$1/; # ||.data$2||
- s/\|\|([a-zA-Z0-9_]+)\@([a-zA-Z0-9_]+)\|\|/@ $&/;
- s/^(\s+)\%(\s)/ .space $1/;
-
- s/\|(.+)\.(\d+)\|/\.$1_$2/; # |L80.123| -> .L80_123
- s/\bCODE32\b/.code 32/ && do {$thumb = 0};
- s/\bCODE16\b/.code 16/ && do {$thumb = 1};
- if (/\bPROC\b/)
- {
- my $prefix;
- my $proc;
- /^([A-Za-z_\.]\w+)\b/;
- $proc = $1;
- $prefix = "";
- if ($proc)
- {
- $prefix = $prefix.sprintf("\t.type\t%s, %%function; ",$proc);
- push(@proc_stack, $proc);
- s/^[A-Za-z_\.]\w+/$&:/;
- }
- $prefix = $prefix."\t.thumb_func; " if ($thumb);
- s/\bPROC\b/@ $&/;
- $_ = $prefix.$_;
- }
- s/^(\s*)(S|Q|SH|U|UQ|UH)ASX\b/$1$2ADDSUBX/;
- s/^(\s*)(S|Q|SH|U|UQ|UH)SAX\b/$1$2SUBADDX/;
- if (/\bENDP\b/)
- {
- my $proc;
- s/\bENDP\b/@ $&/;
- $proc = pop(@proc_stack);
- $_ = "\t.size $proc, .-$proc".$_ if ($proc);
- }
- s/\bSUBT\b/@ $&/;
- s/\bDATA\b/@ $&/; # DATA directive is deprecated -- Asm guide, p.7-25
- s/\bKEEP\b/@ $&/;
- s/\bEXPORTAS\b/@ $&/;
- s/\|\|(.)+\bEQU\b/@ $&/;
- s/\|\|([\w\$]+)\|\|/$1/;
- s/\bENTRY\b/@ $&/;
- s/\bASSERT\b/@ $&/;
- s/\bGBLL\b/@ $&/;
- s/\bGBLA\b/@ $&/;
- s/^\W+OPT\b/@ $&/;
- s/:OR:/|/g;
- s/:SHL:/<</g;
- s/:SHR:/>>/g;
- s/:AND:/&/g;
- s/:LAND:/&&/g;
- s/CPSR/cpsr/;
- s/SPSR/spsr/;
- s/ALIGN$/.balign 4/;
- s/ALIGN\s+([0-9x]+)$/.balign $1/;
- s/psr_cxsf/psr_all/;
- s/LTORG/.ltorg/;
- s/^([A-Za-z_]\w*)[ \t]+EQU/ .set $1,/;
- s/^([A-Za-z_]\w*)[ \t]+SETL/ .set $1,/;
- s/^([A-Za-z_]\w*)[ \t]+SETA/ .set $1,/;
- s/^([A-Za-z_]\w*)[ \t]+\*/ .set $1,/;
-
- # {PC} + 0xdeadfeed --> . + 0xdeadfeed
- s/\{PC\} \+/ \. +/;
-
- # Single hex constant on the line !
- #
- # >>> NOTE <<<
- # Double-precision floats in gcc are always mixed-endian, which means
- # bytes in two words are little-endian, but words are big-endian.
- # So, 0x0000deadfeed0000 would be stored as 0x0000dead at low address
- # and 0xfeed0000 at high address.
- #
- s/\bDCFD\b[ \t]+0x([a-fA-F0-9]{8})([a-fA-F0-9]{8})/.long 0x$1, 0x$2/;
- # Only decimal constants on the line, no hex !
- s/\bDCFD\b[ \t]+([0-9\.\-]+)/.double $1/;
-
- # Single hex constant on the line !
-# s/\bDCFS\b[ \t]+0x([a-f0-9]{8})([a-f0-9]{8})/.long 0x$1, 0x$2/;
- # Only decimal constants on the line, no hex !
-# s/\bDCFS\b[ \t]+([0-9\.\-]+)/.double $1/;
- s/\bDCFS[ \t]+0x/.word 0x/;
- s/\bDCFS\b/.float/;
-
- s/^([A-Za-z_]\w*)[ \t]+DCD/$1 .word/;
- s/\bDCD\b/.word/;
- s/^([A-Za-z_]\w*)[ \t]+DCW/$1 .short/;
- s/\bDCW\b/.short/;
- s/^([A-Za-z_]\w*)[ \t]+DCB/$1 .byte/;
- s/\bDCB\b/.byte/;
- s/^([A-Za-z_]\w*)[ \t]+\%/.comm $1,/;
- s/^[A-Za-z_\.]\w+/$&:/;
- s/^(\d+)/$1:/;
- s/\%(\d+)/$1b_or_f/;
- s/\%[Bb](\d+)/$1b/;
- s/\%[Ff](\d+)/$1f/;
- s/\%[Ff][Tt](\d+)/$1f/;
- s/&([\dA-Fa-f]+)/0x$1/;
- if ( /\b2_[01]+\b/ ) {
- s/\b2_([01]+)\b/conv$1&&&&/g;
- while ( /[01][01][01][01]&&&&/ ) {
- s/0000&&&&/&&&&0/g;
- s/0001&&&&/&&&&1/g;
- s/0010&&&&/&&&&2/g;
- s/0011&&&&/&&&&3/g;
- s/0100&&&&/&&&&4/g;
- s/0101&&&&/&&&&5/g;
- s/0110&&&&/&&&&6/g;
- s/0111&&&&/&&&&7/g;
- s/1000&&&&/&&&&8/g;
- s/1001&&&&/&&&&9/g;
- s/1010&&&&/&&&&A/g;
- s/1011&&&&/&&&&B/g;
- s/1100&&&&/&&&&C/g;
- s/1101&&&&/&&&&D/g;
- s/1110&&&&/&&&&E/g;
- s/1111&&&&/&&&&F/g;
- }
- s/000&&&&/&&&&0/g;
- s/001&&&&/&&&&1/g;
- s/010&&&&/&&&&2/g;
- s/011&&&&/&&&&3/g;
- s/100&&&&/&&&&4/g;
- s/101&&&&/&&&&5/g;
- s/110&&&&/&&&&6/g;
- s/111&&&&/&&&&7/g;
- s/00&&&&/&&&&0/g;
- s/01&&&&/&&&&1/g;
- s/10&&&&/&&&&2/g;
- s/11&&&&/&&&&3/g;
- s/0&&&&/&&&&0/g;
- s/1&&&&/&&&&1/g;
- s/conv&&&&/0x/g;
- }
-
- if ( /commandline/)
- {
- if( /-bigend/)
- {
- $bigend=1;
- }
- }
-
- if ( /\bDCDU\b/ )
- {
- my $cmd=$_;
- my $value;
- my $prefix;
- my $w1;
- my $w2;
- my $w3;
- my $w4;
-
- s/\s+DCDU\b/@ $&/;
-
- $cmd =~ /\bDCDU\b\s+0x(\d+)/;
- $value = $1;
- $value =~ /(\w\w)(\w\w)(\w\w)(\w\w)/;
- $w1 = $1;
- $w2 = $2;
- $w3 = $3;
- $w4 = $4;
-
- if( $bigend ne "")
- {
- # big endian
- $prefix = "\t.byte\t0x".$w1.";".
- "\t.byte\t0x".$w2.";".
- "\t.byte\t0x".$w3.";".
- "\t.byte\t0x".$w4."; ";
- }
- else
- {
- # little endian
- $prefix = "\t.byte\t0x".$w4.";".
- "\t.byte\t0x".$w3.";".
- "\t.byte\t0x".$w2.";".
- "\t.byte\t0x".$w1."; ";
- }
- $_=$prefix.$_;
- }
-
- if ( /\badrl\b/i )
- {
- s/\badrl\s+(\w+)\s*,\s*(\w+)/ldr $1,=$2/i;
- $addPadding = 1;
- }
- s/\bEND\b/@ END/;
-} continue {
- printf ("%s", $_) if $printit;
- if ($addPadding != 0)
- {
- printf (" mov r0,r0\n");
- $addPadding = 0;
- }
-}
-#If we had a code section, mark that this object doesn't need an executable
-# stack.
-if ($nxstack) {
- printf (" .section\t.note.GNU-stack,\"\",\%\%progbits\n");
-}
diff --git a/src/opus-1.1/celt/arm/arm_celt_map.c b/src/opus-1.1/celt/arm/arm_celt_map.c
deleted file mode 100644
index 547a84d1..00000000
--- a/src/opus-1.1/celt/arm/arm_celt_map.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (c) 2010 Xiph.Org Foundation
- * Copyright (c) 2013 Parrot */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "pitch.h"
-
-#if defined(OPUS_HAVE_RTCD)
-
-# if defined(FIXED_POINT)
-opus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
- const opus_val16 *, opus_val32 *, int , int) = {
- celt_pitch_xcorr_c, /* ARMv4 */
- MAY_HAVE_EDSP(celt_pitch_xcorr), /* EDSP */
- MAY_HAVE_MEDIA(celt_pitch_xcorr), /* Media */
- MAY_HAVE_NEON(celt_pitch_xcorr) /* NEON */
-};
-# else
-# error "Floating-point implementation is not supported by ARM asm yet." \
- "Reconfigure with --disable-rtcd or send patches."
-# endif
-
-#endif
diff --git a/src/opus-1.1/celt/arm/armcpu.c b/src/opus-1.1/celt/arm/armcpu.c
deleted file mode 100644
index 17685258..00000000
--- a/src/opus-1.1/celt/arm/armcpu.c
+++ /dev/null
@@ -1,174 +0,0 @@
-/* Copyright (c) 2010 Xiph.Org Foundation
- * Copyright (c) 2013 Parrot */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-/* Original code from libtheora modified to suit to Opus */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#ifdef OPUS_HAVE_RTCD
-
-#include "armcpu.h"
-#include "cpu_support.h"
-#include "os_support.h"
-#include "opus_types.h"
-
-#define OPUS_CPU_ARM_V4 (1)
-#define OPUS_CPU_ARM_EDSP (1<<1)
-#define OPUS_CPU_ARM_MEDIA (1<<2)
-#define OPUS_CPU_ARM_NEON (1<<3)
-
-#if defined(_MSC_VER)
-/*For GetExceptionCode() and EXCEPTION_ILLEGAL_INSTRUCTION.*/
-# define WIN32_LEAN_AND_MEAN
-# define WIN32_EXTRA_LEAN
-# include <windows.h>
-
-static OPUS_INLINE opus_uint32 opus_cpu_capabilities(void){
- opus_uint32 flags;
- flags=0;
- /* MSVC has no OPUS_INLINE __asm support for ARM, but it does let you __emit
- * instructions via their assembled hex code.
- * All of these instructions should be essentially nops. */
-# if defined(OPUS_ARM_MAY_HAVE_EDSP)
- __try{
- /*PLD [r13]*/
- __emit(0xF5DDF000);
- flags|=OPUS_CPU_ARM_EDSP;
- }
- __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){
- /*Ignore exception.*/
- }
-# if defined(OPUS_ARM_MAY_HAVE_MEDIA)
- __try{
- /*SHADD8 r3,r3,r3*/
- __emit(0xE6333F93);
- flags|=OPUS_CPU_ARM_MEDIA;
- }
- __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){
- /*Ignore exception.*/
- }
-# if defined(OPUS_ARM_MAY_HAVE_NEON)
- __try{
- /*VORR q0,q0,q0*/
- __emit(0xF2200150);
- flags|=OPUS_CPU_ARM_NEON;
- }
- __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){
- /*Ignore exception.*/
- }
-# endif
-# endif
-# endif
- return flags;
-}
-
-#elif defined(__linux__)
-/* Linux based */
-opus_uint32 opus_cpu_capabilities(void)
-{
- opus_uint32 flags = 0;
- FILE *cpuinfo;
-
- /* Reading /proc/self/auxv would be easier, but that doesn't work reliably on
- * Android */
- cpuinfo = fopen("/proc/cpuinfo", "r");
-
- if(cpuinfo != NULL)
- {
- /* 512 should be enough for anybody (it's even enough for all the flags that
- * x86 has accumulated... so far). */
- char buf[512];
-
- while(fgets(buf, 512, cpuinfo) != NULL)
- {
-# if defined(OPUS_ARM_MAY_HAVE_EDSP) || defined(OPUS_ARM_MAY_HAVE_NEON)
- /* Search for edsp and neon flag */
- if(memcmp(buf, "Features", 8) == 0)
- {
- char *p;
-# if defined(OPUS_ARM_MAY_HAVE_EDSP)
- p = strstr(buf, " edsp");
- if(p != NULL && (p[5] == ' ' || p[5] == '\n'))
- flags |= OPUS_CPU_ARM_EDSP;
-# endif
-
-# if defined(OPUS_ARM_MAY_HAVE_NEON)
- p = strstr(buf, " neon");
- if(p != NULL && (p[5] == ' ' || p[5] == '\n'))
- flags |= OPUS_CPU_ARM_NEON;
-# endif
- }
-# endif
-
-# if defined(OPUS_ARM_MAY_HAVE_MEDIA)
- /* Search for media capabilities (>= ARMv6) */
- if(memcmp(buf, "CPU architecture:", 17) == 0)
- {
- int version;
- version = atoi(buf+17);
-
- if(version >= 6)
- flags |= OPUS_CPU_ARM_MEDIA;
- }
-# endif
- }
-
- fclose(cpuinfo);
- }
- return flags;
-}
-#else
-/* The feature registers which can tell us what the processor supports are
- * accessible in priveleged modes only, so we can't have a general user-space
- * detection method like on x86.*/
-# error "Configured to use ARM asm but no CPU detection method available for " \
- "your platform. Reconfigure with --disable-rtcd (or send patches)."
-#endif
-
-int opus_select_arch(void)
-{
- opus_uint32 flags = opus_cpu_capabilities();
- int arch = 0;
-
- if(!(flags & OPUS_CPU_ARM_EDSP))
- return arch;
- arch++;
-
- if(!(flags & OPUS_CPU_ARM_MEDIA))
- return arch;
- arch++;
-
- if(!(flags & OPUS_CPU_ARM_NEON))
- return arch;
- arch++;
-
- return arch;
-}
-
-#endif
diff --git a/src/opus-1.1/celt/arm/armcpu.h b/src/opus-1.1/celt/arm/armcpu.h
deleted file mode 100644
index ac574460..00000000
--- a/src/opus-1.1/celt/arm/armcpu.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Copyright (c) 2010 Xiph.Org Foundation
- * Copyright (c) 2013 Parrot */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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(ARMCPU_H)
-# define ARMCPU_H
-
-# if defined(OPUS_ARM_MAY_HAVE_EDSP)
-# define MAY_HAVE_EDSP(name) name ## _edsp
-# else
-# define MAY_HAVE_EDSP(name) name ## _c
-# endif
-
-# if defined(OPUS_ARM_MAY_HAVE_MEDIA)
-# define MAY_HAVE_MEDIA(name) name ## _media
-# else
-# define MAY_HAVE_MEDIA(name) MAY_HAVE_EDSP(name)
-# endif
-
-# if defined(OPUS_ARM_MAY_HAVE_NEON)
-# define MAY_HAVE_NEON(name) name ## _neon
-# else
-# define MAY_HAVE_NEON(name) MAY_HAVE_MEDIA(name)
-# endif
-
-# if defined(OPUS_ARM_PRESUME_EDSP)
-# define PRESUME_EDSP(name) name ## _edsp
-# else
-# define PRESUME_EDSP(name) name ## _c
-# endif
-
-# if defined(OPUS_ARM_PRESUME_MEDIA)
-# define PRESUME_MEDIA(name) name ## _media
-# else
-# define PRESUME_MEDIA(name) PRESUME_EDSP(name)
-# endif
-
-# if defined(OPUS_ARM_PRESUME_NEON)
-# define PRESUME_NEON(name) name ## _neon
-# else
-# define PRESUME_NEON(name) PRESUME_MEDIA(name)
-# endif
-
-# if defined(OPUS_HAVE_RTCD)
-int opus_select_arch(void);
-# endif
-
-#endif
diff --git a/src/opus-1.1/celt/arm/armopts.s.in b/src/opus-1.1/celt/arm/armopts.s.in
deleted file mode 100644
index 3d8aaf27..00000000
--- a/src/opus-1.1/celt/arm/armopts.s.in
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Copyright (C) 2013 Mozilla Corporation */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-; Set the following to 1 if we have EDSP instructions
-; (LDRD/STRD, etc., ARMv5E and later).
-OPUS_ARM_MAY_HAVE_EDSP * @OPUS_ARM_MAY_HAVE_EDSP@
-
-; Set the following to 1 if we have ARMv6 media instructions.
-OPUS_ARM_MAY_HAVE_MEDIA * @OPUS_ARM_MAY_HAVE_MEDIA@
-
-; Set the following to 1 if we have NEON (some ARMv7)
-OPUS_ARM_MAY_HAVE_NEON * @OPUS_ARM_MAY_HAVE_NEON@
-
-END
diff --git a/src/opus-1.1/celt/arm/celt_pitch_xcorr_arm.s b/src/opus-1.1/celt/arm/celt_pitch_xcorr_arm.s
deleted file mode 100644
index 09917b16..00000000
--- a/src/opus-1.1/celt/arm/celt_pitch_xcorr_arm.s
+++ /dev/null
@@ -1,545 +0,0 @@
-; Copyright (c) 2007-2008 CSIRO
-; Copyright (c) 2007-2009 Xiph.Org Foundation
-; Copyright (c) 2013 Parrot
-; Written by Aurélien Zanelli
-;
-; 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.
-;
-; 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 COPYRIGHT OWNER
-; 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.
-
- AREA |.text|, CODE, READONLY
-
- GET celt/arm/armopts.s
-
-IF OPUS_ARM_MAY_HAVE_EDSP
- EXPORT celt_pitch_xcorr_edsp
-ENDIF
-
-IF OPUS_ARM_MAY_HAVE_NEON
- EXPORT celt_pitch_xcorr_neon
-ENDIF
-
-IF OPUS_ARM_MAY_HAVE_NEON
-
-; Compute sum[k]=sum(x[j]*y[j+k],j=0...len-1), k=0...3
-xcorr_kernel_neon PROC
- ; input:
- ; r3 = int len
- ; r4 = opus_val16 *x
- ; r5 = opus_val16 *y
- ; q0 = opus_val32 sum[4]
- ; output:
- ; q0 = opus_val32 sum[4]
- ; preserved: r0-r3, r6-r11, d2, q4-q7, q9-q15
- ; internal usage:
- ; r12 = int j
- ; d3 = y_3|y_2|y_1|y_0
- ; q2 = y_B|y_A|y_9|y_8|y_7|y_6|y_5|y_4
- ; q3 = x_7|x_6|x_5|x_4|x_3|x_2|x_1|x_0
- ; q8 = scratch
- ;
- ; Load y[0...3]
- ; This requires len>0 to always be valid (which we assert in the C code).
- VLD1.16 {d5}, [r5]!
- SUBS r12, r3, #8
- BLE xcorr_kernel_neon_process4
-; Process 8 samples at a time.
-; This loop loads one y value more than we actually need. Therefore we have to
-; stop as soon as there are 8 or fewer samples left (instead of 7), to avoid
-; reading past the end of the array.
-xcorr_kernel_neon_process8
- ; This loop has 19 total instructions (10 cycles to issue, minimum), with
- ; - 2 cycles of ARM insrtuctions,
- ; - 10 cycles of load/store/byte permute instructions, and
- ; - 9 cycles of data processing instructions.
- ; On a Cortex A8, we dual-issue the maximum amount (9 cycles) between the
- ; latter two categories, meaning the whole loop should run in 10 cycles per
- ; iteration, barring cache misses.
- ;
- ; Load x[0...7]
- VLD1.16 {d6, d7}, [r4]!
- ; Unlike VMOV, VAND is a data processsing instruction (and doesn't get
- ; assembled to VMOV, like VORR would), so it dual-issues with the prior VLD1.
- VAND d3, d5, d5
- SUBS r12, r12, #8
- ; Load y[4...11]
- VLD1.16 {d4, d5}, [r5]!
- VMLAL.S16 q0, d3, d6[0]
- VEXT.16 d16, d3, d4, #1
- VMLAL.S16 q0, d4, d7[0]
- VEXT.16 d17, d4, d5, #1
- VMLAL.S16 q0, d16, d6[1]
- VEXT.16 d16, d3, d4, #2
- VMLAL.S16 q0, d17, d7[1]
- VEXT.16 d17, d4, d5, #2
- VMLAL.S16 q0, d16, d6[2]
- VEXT.16 d16, d3, d4, #3
- VMLAL.S16 q0, d17, d7[2]
- VEXT.16 d17, d4, d5, #3
- VMLAL.S16 q0, d16, d6[3]
- VMLAL.S16 q0, d17, d7[3]
- BGT xcorr_kernel_neon_process8
-; Process 4 samples here if we have > 4 left (still reading one extra y value).
-xcorr_kernel_neon_process4
- ADDS r12, r12, #4
- BLE xcorr_kernel_neon_process2
- ; Load x[0...3]
- VLD1.16 d6, [r4]!
- ; Use VAND since it's a data processing instruction again.
- VAND d4, d5, d5
- SUB r12, r12, #4
- ; Load y[4...7]
- VLD1.16 d5, [r5]!
- VMLAL.S16 q0, d4, d6[0]
- VEXT.16 d16, d4, d5, #1
- VMLAL.S16 q0, d16, d6[1]
- VEXT.16 d16, d4, d5, #2
- VMLAL.S16 q0, d16, d6[2]
- VEXT.16 d16, d4, d5, #3
- VMLAL.S16 q0, d16, d6[3]
-; Process 2 samples here if we have > 2 left (still reading one extra y value).
-xcorr_kernel_neon_process2
- ADDS r12, r12, #2
- BLE xcorr_kernel_neon_process1
- ; Load x[0...1]
- VLD2.16 {d6[],d7[]}, [r4]!
- ; Use VAND since it's a data processing instruction again.
- VAND d4, d5, d5
- SUB r12, r12, #2
- ; Load y[4...5]
- VLD1.32 {d5[]}, [r5]!
- VMLAL.S16 q0, d4, d6
- VEXT.16 d16, d4, d5, #1
- ; Replace bottom copy of {y5,y4} in d5 with {y3,y2} from d4, using VSRI
- ; instead of VEXT, since it's a data-processing instruction.
- VSRI.64 d5, d4, #32
- VMLAL.S16 q0, d16, d7
-; Process 1 sample using the extra y value we loaded above.
-xcorr_kernel_neon_process1
- ; Load next *x
- VLD1.16 {d6[]}, [r4]!
- ADDS r12, r12, #1
- ; y[0...3] are left in d5 from prior iteration(s) (if any)
- VMLAL.S16 q0, d5, d6
- MOVLE pc, lr
-; Now process 1 last sample, not reading ahead.
- ; Load last *y
- VLD1.16 {d4[]}, [r5]!
- VSRI.64 d4, d5, #16
- ; Load last *x
- VLD1.16 {d6[]}, [r4]!
- VMLAL.S16 q0, d4, d6
- MOV pc, lr
- ENDP
-
-; opus_val32 celt_pitch_xcorr_neon(opus_val16 *_x, opus_val16 *_y,
-; opus_val32 *xcorr, int len, int max_pitch)
-celt_pitch_xcorr_neon PROC
- ; input:
- ; r0 = opus_val16 *_x
- ; r1 = opus_val16 *_y
- ; r2 = opus_val32 *xcorr
- ; r3 = int len
- ; output:
- ; r0 = int maxcorr
- ; internal usage:
- ; r4 = opus_val16 *x (for xcorr_kernel_neon())
- ; r5 = opus_val16 *y (for xcorr_kernel_neon())
- ; r6 = int max_pitch
- ; r12 = int j
- ; q15 = int maxcorr[4] (q15 is not used by xcorr_kernel_neon())
- STMFD sp!, {r4-r6, lr}
- LDR r6, [sp, #16]
- VMOV.S32 q15, #1
- ; if (max_pitch < 4) goto celt_pitch_xcorr_neon_process4_done
- SUBS r6, r6, #4
- BLT celt_pitch_xcorr_neon_process4_done
-celt_pitch_xcorr_neon_process4
- ; xcorr_kernel_neon parameters:
- ; r3 = len, r4 = _x, r5 = _y, q0 = {0, 0, 0, 0}
- MOV r4, r0
- MOV r5, r1
- VEOR q0, q0, q0
- ; xcorr_kernel_neon only modifies r4, r5, r12, and q0...q3.
- ; So we don't save/restore any other registers.
- BL xcorr_kernel_neon
- SUBS r6, r6, #4
- VST1.32 {q0}, [r2]!
- ; _y += 4
- ADD r1, r1, #8
- VMAX.S32 q15, q15, q0
- ; if (max_pitch < 4) goto celt_pitch_xcorr_neon_process4_done
- BGE celt_pitch_xcorr_neon_process4
-; We have less than 4 sums left to compute.
-celt_pitch_xcorr_neon_process4_done
- ADDS r6, r6, #4
- ; Reduce maxcorr to a single value
- VMAX.S32 d30, d30, d31
- VPMAX.S32 d30, d30, d30
- ; if (max_pitch <= 0) goto celt_pitch_xcorr_neon_done
- BLE celt_pitch_xcorr_neon_done
-; Now compute each remaining sum one at a time.
-celt_pitch_xcorr_neon_process_remaining
- MOV r4, r0
- MOV r5, r1
- VMOV.I32 q0, #0
- SUBS r12, r3, #8
- BLT celt_pitch_xcorr_neon_process_remaining4
-; Sum terms 8 at a time.
-celt_pitch_xcorr_neon_process_remaining_loop8
- ; Load x[0...7]
- VLD1.16 {q1}, [r4]!
- ; Load y[0...7]
- VLD1.16 {q2}, [r5]!
- SUBS r12, r12, #8
- VMLAL.S16 q0, d4, d2
- VMLAL.S16 q0, d5, d3
- BGE celt_pitch_xcorr_neon_process_remaining_loop8
-; Sum terms 4 at a time.
-celt_pitch_xcorr_neon_process_remaining4
- ADDS r12, r12, #4
- BLT celt_pitch_xcorr_neon_process_remaining4_done
- ; Load x[0...3]
- VLD1.16 {d2}, [r4]!
- ; Load y[0...3]
- VLD1.16 {d3}, [r5]!
- SUB r12, r12, #4
- VMLAL.S16 q0, d3, d2
-celt_pitch_xcorr_neon_process_remaining4_done
- ; Reduce the sum to a single value.
- VADD.S32 d0, d0, d1
- VPADDL.S32 d0, d0
- ADDS r12, r12, #4
- BLE celt_pitch_xcorr_neon_process_remaining_loop_done
-; Sum terms 1 at a time.
-celt_pitch_xcorr_neon_process_remaining_loop1
- VLD1.16 {d2[]}, [r4]!
- VLD1.16 {d3[]}, [r5]!
- SUBS r12, r12, #1
- VMLAL.S16 q0, d2, d3
- BGT celt_pitch_xcorr_neon_process_remaining_loop1
-celt_pitch_xcorr_neon_process_remaining_loop_done
- VST1.32 {d0[0]}, [r2]!
- VMAX.S32 d30, d30, d0
- SUBS r6, r6, #1
- ; _y++
- ADD r1, r1, #2
- ; if (--max_pitch > 0) goto celt_pitch_xcorr_neon_process_remaining
- BGT celt_pitch_xcorr_neon_process_remaining
-celt_pitch_xcorr_neon_done
- VMOV.32 r0, d30[0]
- LDMFD sp!, {r4-r6, pc}
- ENDP
-
-ENDIF
-
-IF OPUS_ARM_MAY_HAVE_EDSP
-
-; This will get used on ARMv7 devices without NEON, so it has been optimized
-; to take advantage of dual-issuing where possible.
-xcorr_kernel_edsp PROC
- ; input:
- ; r3 = int len
- ; r4 = opus_val16 *_x (must be 32-bit aligned)
- ; r5 = opus_val16 *_y (must be 32-bit aligned)
- ; r6...r9 = opus_val32 sum[4]
- ; output:
- ; r6...r9 = opus_val32 sum[4]
- ; preserved: r0-r5
- ; internal usage
- ; r2 = int j
- ; r12,r14 = opus_val16 x[4]
- ; r10,r11 = opus_val16 y[4]
- STMFD sp!, {r2,r4,r5,lr}
- LDR r10, [r5], #4 ; Load y[0...1]
- SUBS r2, r3, #4 ; j = len-4
- LDR r11, [r5], #4 ; Load y[2...3]
- BLE xcorr_kernel_edsp_process4_done
- LDR r12, [r4], #4 ; Load x[0...1]
- ; Stall
-xcorr_kernel_edsp_process4
- ; The multiplies must issue from pipeline 0, and can't dual-issue with each
- ; other. Every other instruction here dual-issues with a multiply, and is
- ; thus "free". There should be no stalls in the body of the loop.
- SMLABB r6, r12, r10, r6 ; sum[0] = MAC16_16(sum[0],x_0,y_0)
- LDR r14, [r4], #4 ; Load x[2...3]
- SMLABT r7, r12, r10, r7 ; sum[1] = MAC16_16(sum[1],x_0,y_1)
- SUBS r2, r2, #4 ; j-=4
- SMLABB r8, r12, r11, r8 ; sum[2] = MAC16_16(sum[2],x_0,y_2)
- SMLABT r9, r12, r11, r9 ; sum[3] = MAC16_16(sum[3],x_0,y_3)
- SMLATT r6, r12, r10, r6 ; sum[0] = MAC16_16(sum[0],x_1,y_1)
- LDR r10, [r5], #4 ; Load y[4...5]
- SMLATB r7, r12, r11, r7 ; sum[1] = MAC16_16(sum[1],x_1,y_2)
- SMLATT r8, r12, r11, r8 ; sum[2] = MAC16_16(sum[2],x_1,y_3)
- SMLATB r9, r12, r10, r9 ; sum[3] = MAC16_16(sum[3],x_1,y_4)
- LDRGT r12, [r4], #4 ; Load x[0...1]
- SMLABB r6, r14, r11, r6 ; sum[0] = MAC16_16(sum[0],x_2,y_2)
- SMLABT r7, r14, r11, r7 ; sum[1] = MAC16_16(sum[1],x_2,y_3)
- SMLABB r8, r14, r10, r8 ; sum[2] = MAC16_16(sum[2],x_2,y_4)
- SMLABT r9, r14, r10, r9 ; sum[3] = MAC16_16(sum[3],x_2,y_5)
- SMLATT r6, r14, r11, r6 ; sum[0] = MAC16_16(sum[0],x_3,y_3)
- LDR r11, [r5], #4 ; Load y[6...7]
- SMLATB r7, r14, r10, r7 ; sum[1] = MAC16_16(sum[1],x_3,y_4)
- SMLATT r8, r14, r10, r8 ; sum[2] = MAC16_16(sum[2],x_3,y_5)
- SMLATB r9, r14, r11, r9 ; sum[3] = MAC16_16(sum[3],x_3,y_6)
- BGT xcorr_kernel_edsp_process4
-xcorr_kernel_edsp_process4_done
- ADDS r2, r2, #4
- BLE xcorr_kernel_edsp_done
- LDRH r12, [r4], #2 ; r12 = *x++
- SUBS r2, r2, #1 ; j--
- ; Stall
- SMLABB r6, r12, r10, r6 ; sum[0] = MAC16_16(sum[0],x,y_0)
- LDRGTH r14, [r4], #2 ; r14 = *x++
- SMLABT r7, r12, r10, r7 ; sum[1] = MAC16_16(sum[1],x,y_1)
- SMLABB r8, r12, r11, r8 ; sum[2] = MAC16_16(sum[2],x,y_2)
- SMLABT r9, r12, r11, r9 ; sum[3] = MAC16_16(sum[3],x,y_3)
- BLE xcorr_kernel_edsp_done
- SMLABT r6, r14, r10, r6 ; sum[0] = MAC16_16(sum[0],x,y_1)
- SUBS r2, r2, #1 ; j--
- SMLABB r7, r14, r11, r7 ; sum[1] = MAC16_16(sum[1],x,y_2)
- LDRH r10, [r5], #2 ; r10 = y_4 = *y++
- SMLABT r8, r14, r11, r8 ; sum[2] = MAC16_16(sum[2],x,y_3)
- LDRGTH r12, [r4], #2 ; r12 = *x++
- SMLABB r9, r14, r10, r9 ; sum[3] = MAC16_16(sum[3],x,y_4)
- BLE xcorr_kernel_edsp_done
- SMLABB r6, r12, r11, r6 ; sum[0] = MAC16_16(sum[0],tmp,y_2)
- CMP r2, #1 ; j--
- SMLABT r7, r12, r11, r7 ; sum[1] = MAC16_16(sum[1],tmp,y_3)
- LDRH r2, [r5], #2 ; r2 = y_5 = *y++
- SMLABB r8, r12, r10, r8 ; sum[2] = MAC16_16(sum[2],tmp,y_4)
- LDRGTH r14, [r4] ; r14 = *x
- SMLABB r9, r12, r2, r9 ; sum[3] = MAC16_16(sum[3],tmp,y_5)
- BLE xcorr_kernel_edsp_done
- SMLABT r6, r14, r11, r6 ; sum[0] = MAC16_16(sum[0],tmp,y_3)
- LDRH r11, [r5] ; r11 = y_6 = *y
- SMLABB r7, r14, r10, r7 ; sum[1] = MAC16_16(sum[1],tmp,y_4)
- SMLABB r8, r14, r2, r8 ; sum[2] = MAC16_16(sum[2],tmp,y_5)
- SMLABB r9, r14, r11, r9 ; sum[3] = MAC16_16(sum[3],tmp,y_6)
-xcorr_kernel_edsp_done
- LDMFD sp!, {r2,r4,r5,pc}
- ENDP
-
-celt_pitch_xcorr_edsp PROC
- ; input:
- ; r0 = opus_val16 *_x (must be 32-bit aligned)
- ; r1 = opus_val16 *_y (only needs to be 16-bit aligned)
- ; r2 = opus_val32 *xcorr
- ; r3 = int len
- ; output:
- ; r0 = maxcorr
- ; internal usage
- ; r4 = opus_val16 *x
- ; r5 = opus_val16 *y
- ; r6 = opus_val32 sum0
- ; r7 = opus_val32 sum1
- ; r8 = opus_val32 sum2
- ; r9 = opus_val32 sum3
- ; r1 = int max_pitch
- ; r12 = int j
- STMFD sp!, {r4-r11, lr}
- MOV r5, r1
- LDR r1, [sp, #36]
- MOV r4, r0
- TST r5, #3
- ; maxcorr = 1
- MOV r0, #1
- BEQ celt_pitch_xcorr_edsp_process1u_done
-; Compute one sum at the start to make y 32-bit aligned.
- SUBS r12, r3, #4
- ; r14 = sum = 0
- MOV r14, #0
- LDRH r8, [r5], #2
- BLE celt_pitch_xcorr_edsp_process1u_loop4_done
- LDR r6, [r4], #4
- MOV r8, r8, LSL #16
-celt_pitch_xcorr_edsp_process1u_loop4
- LDR r9, [r5], #4
- SMLABT r14, r6, r8, r14 ; sum = MAC16_16(sum, x_0, y_0)
- LDR r7, [r4], #4
- SMLATB r14, r6, r9, r14 ; sum = MAC16_16(sum, x_1, y_1)
- LDR r8, [r5], #4
- SMLABT r14, r7, r9, r14 ; sum = MAC16_16(sum, x_2, y_2)
- SUBS r12, r12, #4 ; j-=4
- SMLATB r14, r7, r8, r14 ; sum = MAC16_16(sum, x_3, y_3)
- LDRGT r6, [r4], #4
- BGT celt_pitch_xcorr_edsp_process1u_loop4
- MOV r8, r8, LSR #16
-celt_pitch_xcorr_edsp_process1u_loop4_done
- ADDS r12, r12, #4
-celt_pitch_xcorr_edsp_process1u_loop1
- LDRGEH r6, [r4], #2
- ; Stall
- SMLABBGE r14, r6, r8, r14 ; sum = MAC16_16(sum, *x, *y)
- SUBGES r12, r12, #1
- LDRGTH r8, [r5], #2
- BGT celt_pitch_xcorr_edsp_process1u_loop1
- ; Restore _x
- SUB r4, r4, r3, LSL #1
- ; Restore and advance _y
- SUB r5, r5, r3, LSL #1
- ; maxcorr = max(maxcorr, sum)
- CMP r0, r14
- ADD r5, r5, #2
- MOVLT r0, r14
- SUBS r1, r1, #1
- ; xcorr[i] = sum
- STR r14, [r2], #4
- BLE celt_pitch_xcorr_edsp_done
-celt_pitch_xcorr_edsp_process1u_done
- ; if (max_pitch < 4) goto celt_pitch_xcorr_edsp_process2
- SUBS r1, r1, #4
- BLT celt_pitch_xcorr_edsp_process2
-celt_pitch_xcorr_edsp_process4
- ; xcorr_kernel_edsp parameters:
- ; r3 = len, r4 = _x, r5 = _y, r6...r9 = sum[4] = {0, 0, 0, 0}
- MOV r6, #0
- MOV r7, #0
- MOV r8, #0
- MOV r9, #0
- BL xcorr_kernel_edsp ; xcorr_kernel_edsp(_x, _y+i, xcorr+i, len)
- ; maxcorr = max(maxcorr, sum0, sum1, sum2, sum3)
- CMP r0, r6
- ; _y+=4
- ADD r5, r5, #8
- MOVLT r0, r6
- CMP r0, r7
- MOVLT r0, r7
- CMP r0, r8
- MOVLT r0, r8
- CMP r0, r9
- MOVLT r0, r9
- STMIA r2!, {r6-r9}
- SUBS r1, r1, #4
- BGE celt_pitch_xcorr_edsp_process4
-celt_pitch_xcorr_edsp_process2
- ADDS r1, r1, #2
- BLT celt_pitch_xcorr_edsp_process1a
- SUBS r12, r3, #4
- ; {r10, r11} = {sum0, sum1} = {0, 0}
- MOV r10, #0
- MOV r11, #0
- LDR r8, [r5], #4
- BLE celt_pitch_xcorr_edsp_process2_loop_done
- LDR r6, [r4], #4
- LDR r9, [r5], #4
-celt_pitch_xcorr_edsp_process2_loop4
- SMLABB r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_0, y_0)
- LDR r7, [r4], #4
- SMLABT r11, r6, r8, r11 ; sum1 = MAC16_16(sum1, x_0, y_1)
- SUBS r12, r12, #4 ; j-=4
- SMLATT r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_1, y_1)
- LDR r8, [r5], #4
- SMLATB r11, r6, r9, r11 ; sum1 = MAC16_16(sum1, x_1, y_2)
- LDRGT r6, [r4], #4
- SMLABB r10, r7, r9, r10 ; sum0 = MAC16_16(sum0, x_2, y_2)
- SMLABT r11, r7, r9, r11 ; sum1 = MAC16_16(sum1, x_2, y_3)
- SMLATT r10, r7, r9, r10 ; sum0 = MAC16_16(sum0, x_3, y_3)
- LDRGT r9, [r5], #4
- SMLATB r11, r7, r8, r11 ; sum1 = MAC16_16(sum1, x_3, y_4)
- BGT celt_pitch_xcorr_edsp_process2_loop4
-celt_pitch_xcorr_edsp_process2_loop_done
- ADDS r12, r12, #2
- BLE celt_pitch_xcorr_edsp_process2_1
- LDR r6, [r4], #4
- ; Stall
- SMLABB r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_0, y_0)
- LDR r9, [r5], #4
- SMLABT r11, r6, r8, r11 ; sum1 = MAC16_16(sum1, x_0, y_1)
- SUB r12, r12, #2
- SMLATT r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_1, y_1)
- MOV r8, r9
- SMLATB r11, r6, r9, r11 ; sum1 = MAC16_16(sum1, x_1, y_2)
-celt_pitch_xcorr_edsp_process2_1
- LDRH r6, [r4], #2
- ADDS r12, r12, #1
- ; Stall
- SMLABB r10, r6, r8, r10 ; sum0 = MAC16_16(sum0, x_0, y_0)
- LDRGTH r7, [r4], #2
- SMLABT r11, r6, r8, r11 ; sum1 = MAC16_16(sum1, x_0, y_1)
- BLE celt_pitch_xcorr_edsp_process2_done
- LDRH r9, [r5], #2
- SMLABT r10, r7, r8, r10 ; sum0 = MAC16_16(sum0, x_0, y_1)
- SMLABB r11, r7, r9, r11 ; sum1 = MAC16_16(sum1, x_0, y_2)
-celt_pitch_xcorr_edsp_process2_done
- ; Restore _x
- SUB r4, r4, r3, LSL #1
- ; Restore and advance _y
- SUB r5, r5, r3, LSL #1
- ; maxcorr = max(maxcorr, sum0)
- CMP r0, r10
- ADD r5, r5, #2
- MOVLT r0, r10
- SUB r1, r1, #2
- ; maxcorr = max(maxcorr, sum1)
- CMP r0, r11
- ; xcorr[i] = sum
- STR r10, [r2], #4
- MOVLT r0, r11
- STR r11, [r2], #4
-celt_pitch_xcorr_edsp_process1a
- ADDS r1, r1, #1
- BLT celt_pitch_xcorr_edsp_done
- SUBS r12, r3, #4
- ; r14 = sum = 0
- MOV r14, #0
- BLT celt_pitch_xcorr_edsp_process1a_loop_done
- LDR r6, [r4], #4
- LDR r8, [r5], #4
- LDR r7, [r4], #4
- LDR r9, [r5], #4
-celt_pitch_xcorr_edsp_process1a_loop4
- SMLABB r14, r6, r8, r14 ; sum = MAC16_16(sum, x_0, y_0)
- SUBS r12, r12, #4 ; j-=4
- SMLATT r14, r6, r8, r14 ; sum = MAC16_16(sum, x_1, y_1)
- LDRGE r6, [r4], #4
- SMLABB r14, r7, r9, r14 ; sum = MAC16_16(sum, x_2, y_2)
- LDRGE r8, [r5], #4
- SMLATT r14, r7, r9, r14 ; sum = MAC16_16(sum, x_3, y_3)
- LDRGE r7, [r4], #4
- LDRGE r9, [r5], #4
- BGE celt_pitch_xcorr_edsp_process1a_loop4
-celt_pitch_xcorr_edsp_process1a_loop_done
- ADDS r12, r12, #2
- LDRGE r6, [r4], #4
- LDRGE r8, [r5], #4
- ; Stall
- SMLABBGE r14, r6, r8, r14 ; sum = MAC16_16(sum, x_0, y_0)
- SUBGE r12, r12, #2
- SMLATTGE r14, r6, r8, r14 ; sum = MAC16_16(sum, x_1, y_1)
- ADDS r12, r12, #1
- LDRGEH r6, [r4], #2
- LDRGEH r8, [r5], #2
- ; Stall
- SMLABBGE r14, r6, r8, r14 ; sum = MAC16_16(sum, *x, *y)
- ; maxcorr = max(maxcorr, sum)
- CMP r0, r14
- ; xcorr[i] = sum
- STR r14, [r2], #4
- MOVLT r0, r14
-celt_pitch_xcorr_edsp_done
- LDMFD sp!, {r4-r11, pc}
- ENDP
-
-ENDIF
-
-END
diff --git a/src/opus-1.1/celt/arm/fixed_armv4.h b/src/opus-1.1/celt/arm/fixed_armv4.h
deleted file mode 100644
index b690bc8c..00000000
--- a/src/opus-1.1/celt/arm/fixed_armv4.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* Copyright (C) 2013 Xiph.Org Foundation and contributors */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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_ARMv4_H
-#define FIXED_ARMv4_H
-
-/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */
-#undef MULT16_32_Q16
-static OPUS_INLINE opus_val32 MULT16_32_Q16_armv4(opus_val16 a, opus_val32 b)
-{
- unsigned rd_lo;
- int rd_hi;
- __asm__(
- "#MULT16_32_Q16\n\t"
- "smull %0, %1, %2, %3\n\t"
- : "=&r"(rd_lo), "=&r"(rd_hi)
- : "%r"(b),"r"(a<<16)
- );
- return rd_hi;
-}
-#define MULT16_32_Q16(a, b) (MULT16_32_Q16_armv4(a, b))
-
-
-/** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */
-#undef MULT16_32_Q15
-static OPUS_INLINE opus_val32 MULT16_32_Q15_armv4(opus_val16 a, opus_val32 b)
-{
- unsigned rd_lo;
- int rd_hi;
- __asm__(
- "#MULT16_32_Q15\n\t"
- "smull %0, %1, %2, %3\n\t"
- : "=&r"(rd_lo), "=&r"(rd_hi)
- : "%r"(b), "r"(a<<16)
- );
- /*We intentionally don't OR in the high bit of rd_lo for speed.*/
- return rd_hi<<1;
-}
-#define MULT16_32_Q15(a, b) (MULT16_32_Q15_armv4(a, b))
-
-
-/** 16x32 multiply, followed by a 15-bit shift right and 32-bit add.
- b must fit in 31 bits.
- Result fits in 32 bits. */
-#undef MAC16_32_Q15
-#define MAC16_32_Q15(c, a, b) ADD32(c, MULT16_32_Q15(a, b))
-
-
-/** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */
-#undef MULT32_32_Q31
-#define MULT32_32_Q31(a,b) (opus_val32)((((opus_int64)(a)) * ((opus_int64)(b)))>>31)
-
-#endif
diff --git a/src/opus-1.1/celt/arm/fixed_armv5e.h b/src/opus-1.1/celt/arm/fixed_armv5e.h
deleted file mode 100644
index 1194a7d3..00000000
--- a/src/opus-1.1/celt/arm/fixed_armv5e.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/* Copyright (C) 2007-2009 Xiph.Org Foundation
- Copyright (C) 2003-2008 Jean-Marc Valin
- Copyright (C) 2007-2008 CSIRO
- Copyright (C) 2013 Parrot */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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_ARMv5E_H
-#define FIXED_ARMv5E_H
-
-#include "fixed_armv4.h"
-
-/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */
-#undef MULT16_32_Q16
-static OPUS_INLINE opus_val32 MULT16_32_Q16_armv5e(opus_val16 a, opus_val32 b)
-{
- int res;
- __asm__(
- "#MULT16_32_Q16\n\t"
- "smulwb %0, %1, %2\n\t"
- : "=r"(res)
- : "r"(b),"r"(a)
- );
- return res;
-}
-#define MULT16_32_Q16(a, b) (MULT16_32_Q16_armv5e(a, b))
-
-
-/** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */
-#undef MULT16_32_Q15
-static OPUS_INLINE opus_val32 MULT16_32_Q15_armv5e(opus_val16 a, opus_val32 b)
-{
- int res;
- __asm__(
- "#MULT16_32_Q15\n\t"
- "smulwb %0, %1, %2\n\t"
- : "=r"(res)
- : "r"(b), "r"(a)
- );
- return res<<1;
-}
-#define MULT16_32_Q15(a, b) (MULT16_32_Q15_armv5e(a, b))
-
-
-/** 16x32 multiply, followed by a 15-bit shift right and 32-bit add.
- b must fit in 31 bits.
- Result fits in 32 bits. */
-#undef MAC16_32_Q15
-static OPUS_INLINE opus_val32 MAC16_32_Q15_armv5e(opus_val32 c, opus_val16 a,
- opus_val32 b)
-{
- int res;
- __asm__(
- "#MAC16_32_Q15\n\t"
- "smlawb %0, %1, %2, %3;\n"
- : "=r"(res)
- : "r"(b<<1), "r"(a), "r"(c)
- );
- return res;
-}
-#define MAC16_32_Q15(c, a, b) (MAC16_32_Q15_armv5e(c, a, b))
-
-/** 16x16 multiply-add where the result fits in 32 bits */
-#undef MAC16_16
-static OPUS_INLINE opus_val32 MAC16_16_armv5e(opus_val32 c, opus_val16 a,
- opus_val16 b)
-{
- int res;
- __asm__(
- "#MAC16_16\n\t"
- "smlabb %0, %1, %2, %3;\n"
- : "=r"(res)
- : "r"(a), "r"(b), "r"(c)
- );
- return res;
-}
-#define MAC16_16(c, a, b) (MAC16_16_armv5e(c, a, b))
-
-/** 16x16 multiplication where the result fits in 32 bits */
-#undef MULT16_16
-static OPUS_INLINE opus_val32 MULT16_16_armv5e(opus_val16 a, opus_val16 b)
-{
- int res;
- __asm__(
- "#MULT16_16\n\t"
- "smulbb %0, %1, %2;\n"
- : "=r"(res)
- : "r"(a), "r"(b)
- );
- return res;
-}
-#define MULT16_16(a, b) (MULT16_16_armv5e(a, b))
-
-#endif
diff --git a/src/opus-1.1/celt/arm/kiss_fft_armv4.h b/src/opus-1.1/celt/arm/kiss_fft_armv4.h
deleted file mode 100644
index e4faad6f..00000000
--- a/src/opus-1.1/celt/arm/kiss_fft_armv4.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*Copyright (c) 2013, Xiph.Org Foundation and contributors.
-
- All rights reserved.
-
- 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.
-
- 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 COPYRIGHT OWNER 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 KISS_FFT_ARMv4_H
-#define KISS_FFT_ARMv4_H
-
-#if !defined(KISS_FFT_GUTS_H)
-#error "This file should only be included from _kiss_fft_guts.h"
-#endif
-
-#ifdef FIXED_POINT
-
-#undef C_MUL
-#define C_MUL(m,a,b) \
- do{ \
- int br__; \
- int bi__; \
- int tt__; \
- __asm__ __volatile__( \
- "#C_MUL\n\t" \
- "ldrsh %[br], [%[bp], #0]\n\t" \
- "ldm %[ap], {r0,r1}\n\t" \
- "ldrsh %[bi], [%[bp], #2]\n\t" \
- "smull %[tt], %[mi], r1, %[br]\n\t" \
- "smlal %[tt], %[mi], r0, %[bi]\n\t" \
- "rsb %[bi], %[bi], #0\n\t" \
- "smull %[br], %[mr], r0, %[br]\n\t" \
- "mov %[tt], %[tt], lsr #15\n\t" \
- "smlal %[br], %[mr], r1, %[bi]\n\t" \
- "orr %[mi], %[tt], %[mi], lsl #17\n\t" \
- "mov %[br], %[br], lsr #15\n\t" \
- "orr %[mr], %[br], %[mr], lsl #17\n\t" \
- : [mr]"=r"((m).r), [mi]"=r"((m).i), \
- [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \
- : [ap]"r"(&(a)), [bp]"r"(&(b)) \
- : "r0", "r1" \
- ); \
- } \
- while(0)
-
-#undef C_MUL4
-#define C_MUL4(m,a,b) \
- do{ \
- int br__; \
- int bi__; \
- int tt__; \
- __asm__ __volatile__( \
- "#C_MUL4\n\t" \
- "ldrsh %[br], [%[bp], #0]\n\t" \
- "ldm %[ap], {r0,r1}\n\t" \
- "ldrsh %[bi], [%[bp], #2]\n\t" \
- "smull %[tt], %[mi], r1, %[br]\n\t" \
- "smlal %[tt], %[mi], r0, %[bi]\n\t" \
- "rsb %[bi], %[bi], #0\n\t" \
- "smull %[br], %[mr], r0, %[br]\n\t" \
- "mov %[tt], %[tt], lsr #17\n\t" \
- "smlal %[br], %[mr], r1, %[bi]\n\t" \
- "orr %[mi], %[tt], %[mi], lsl #15\n\t" \
- "mov %[br], %[br], lsr #17\n\t" \
- "orr %[mr], %[br], %[mr], lsl #15\n\t" \
- : [mr]"=r"((m).r), [mi]"=r"((m).i), \
- [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \
- : [ap]"r"(&(a)), [bp]"r"(&(b)) \
- : "r0", "r1" \
- ); \
- } \
- while(0)
-
-#undef C_MULC
-#define C_MULC(m,a,b) \
- do{ \
- int br__; \
- int bi__; \
- int tt__; \
- __asm__ __volatile__( \
- "#C_MULC\n\t" \
- "ldrsh %[br], [%[bp], #0]\n\t" \
- "ldm %[ap], {r0,r1}\n\t" \
- "ldrsh %[bi], [%[bp], #2]\n\t" \
- "smull %[tt], %[mr], r0, %[br]\n\t" \
- "smlal %[tt], %[mr], r1, %[bi]\n\t" \
- "rsb %[bi], %[bi], #0\n\t" \
- "smull %[br], %[mi], r1, %[br]\n\t" \
- "mov %[tt], %[tt], lsr #15\n\t" \
- "smlal %[br], %[mi], r0, %[bi]\n\t" \
- "orr %[mr], %[tt], %[mr], lsl #17\n\t" \
- "mov %[br], %[br], lsr #15\n\t" \
- "orr %[mi], %[br], %[mi], lsl #17\n\t" \
- : [mr]"=r"((m).r), [mi]"=r"((m).i), \
- [br]"=&r"(br__), [bi]"=r"(bi__), [tt]"=r"(tt__) \
- : [ap]"r"(&(a)), [bp]"r"(&(b)) \
- : "r0", "r1" \
- ); \
- } \
- while(0)
-
-#endif /* FIXED_POINT */
-
-#endif /* KISS_FFT_ARMv4_H */
diff --git a/src/opus-1.1/celt/arm/kiss_fft_armv5e.h b/src/opus-1.1/celt/arm/kiss_fft_armv5e.h
deleted file mode 100644
index 9eca183d..00000000
--- a/src/opus-1.1/celt/arm/kiss_fft_armv5e.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*Copyright (c) 2013, Xiph.Org Foundation and contributors.
-
- All rights reserved.
-
- 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.
-
- 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 COPYRIGHT OWNER 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 KISS_FFT_ARMv5E_H
-#define KISS_FFT_ARMv5E_H
-
-#if !defined(KISS_FFT_GUTS_H)
-#error "This file should only be included from _kiss_fft_guts.h"
-#endif
-
-#ifdef FIXED_POINT
-
-#if defined(__thumb__)||defined(__thumb2__)
-#define LDRD_CONS "Q"
-#else
-#define LDRD_CONS "Uq"
-#endif
-
-#undef C_MUL
-#define C_MUL(m,a,b) \
- do{ \
- int mr1__; \
- int mr2__; \
- int mi__; \
- long long aval__; \
- int bval__; \
- __asm__( \
- "#C_MUL\n\t" \
- "ldrd %[aval], %H[aval], %[ap]\n\t" \
- "ldr %[bval], %[bp]\n\t" \
- "smulwb %[mi], %H[aval], %[bval]\n\t" \
- "smulwb %[mr1], %[aval], %[bval]\n\t" \
- "smulwt %[mr2], %H[aval], %[bval]\n\t" \
- "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \
- : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \
- [aval]"=&r"(aval__), [bval]"=r"(bval__) \
- : [ap]LDRD_CONS(a), [bp]"m"(b) \
- ); \
- (m).r = SHL32(SUB32(mr1__, mr2__), 1); \
- (m).i = SHL32(mi__, 1); \
- } \
- while(0)
-
-#undef C_MUL4
-#define C_MUL4(m,a,b) \
- do{ \
- int mr1__; \
- int mr2__; \
- int mi__; \
- long long aval__; \
- int bval__; \
- __asm__( \
- "#C_MUL4\n\t" \
- "ldrd %[aval], %H[aval], %[ap]\n\t" \
- "ldr %[bval], %[bp]\n\t" \
- "smulwb %[mi], %H[aval], %[bval]\n\t" \
- "smulwb %[mr1], %[aval], %[bval]\n\t" \
- "smulwt %[mr2], %H[aval], %[bval]\n\t" \
- "smlawt %[mi], %[aval], %[bval], %[mi]\n\t" \
- : [mr1]"=r"(mr1__), [mr2]"=r"(mr2__), [mi]"=r"(mi__), \
- [aval]"=&r"(aval__), [bval]"=r"(bval__) \
- : [ap]LDRD_CONS(a), [bp]"m"(b) \
- ); \
- (m).r = SHR32(SUB32(mr1__, mr2__), 1); \
- (m).i = SHR32(mi__, 1); \
- } \
- while(0)
-
-#undef C_MULC
-#define C_MULC(m,a,b) \
- do{ \
- int mr__; \
- int mi1__; \
- int mi2__; \
- long long aval__; \
- int bval__; \
- __asm__( \
- "#C_MULC\n\t" \
- "ldrd %[aval], %H[aval], %[ap]\n\t" \
- "ldr %[bval], %[bp]\n\t" \
- "smulwb %[mr], %[aval], %[bval]\n\t" \
- "smulwb %[mi1], %H[aval], %[bval]\n\t" \
- "smulwt %[mi2], %[aval], %[bval]\n\t" \
- "smlawt %[mr], %H[aval], %[bval], %[mr]\n\t" \
- : [mr]"=r"(mr__), [mi1]"=r"(mi1__), [mi2]"=r"(mi2__), \
- [aval]"=&r"(aval__), [bval]"=r"(bval__) \
- : [ap]LDRD_CONS(a), [bp]"m"(b) \
- ); \
- (m).r = SHL32(mr__, 1); \
- (m).i = SHL32(SUB32(mi1__, mi2__), 1); \
- } \
- while(0)
-
-#endif /* FIXED_POINT */
-
-#endif /* KISS_FFT_GUTS_H */
diff --git a/src/opus-1.1/celt/arm/pitch_arm.h b/src/opus-1.1/celt/arm/pitch_arm.h
deleted file mode 100644
index a07f8ac2..00000000
--- a/src/opus-1.1/celt/arm/pitch_arm.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Copyright (c) 2010 Xiph.Org Foundation
- * Copyright (c) 2013 Parrot */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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(PITCH_ARM_H)
-# define PITCH_ARM_H
-
-# include "armcpu.h"
-
-# if defined(FIXED_POINT)
-
-# if defined(OPUS_ARM_MAY_HAVE_NEON)
-opus_val32 celt_pitch_xcorr_neon(const opus_val16 *_x, const opus_val16 *_y,
- opus_val32 *xcorr, int len, int max_pitch);
-# endif
-
-# if defined(OPUS_ARM_MAY_HAVE_MEDIA)
-# define celt_pitch_xcorr_media MAY_HAVE_EDSP(celt_pitch_xcorr)
-# endif
-
-# if defined(OPUS_ARM_MAY_HAVE_EDSP)
-opus_val32 celt_pitch_xcorr_edsp(const opus_val16 *_x, const opus_val16 *_y,
- opus_val32 *xcorr, int len, int max_pitch);
-# endif
-
-# if !defined(OPUS_HAVE_RTCD)
-# define OVERRIDE_PITCH_XCORR (1)
-# define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \
- ((void)(arch),PRESUME_NEON(celt_pitch_xcorr)(_x, _y, xcorr, len, max_pitch))
-# endif
-
-# endif
-
-#endif
diff --git a/src/opus-1.1/celt/bands.c b/src/opus-1.1/celt/bands.c
deleted file mode 100644
index cce56e2f..00000000
--- a/src/opus-1.1/celt/bands.c
+++ /dev/null
@@ -1,1518 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Copyright (c) 2008-2009 Gregory Maxwell
- Written by Jean-Marc Valin and Gregory Maxwell */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <math.h>
-#include "bands.h"
-#include "modes.h"
-#include "vq.h"
-#include "cwrs.h"
-#include "stack_alloc.h"
-#include "os_support.h"
-#include "mathops.h"
-#include "rate.h"
-#include "quant_bands.h"
-#include "pitch.h"
-
-int hysteresis_decision(opus_val16 val, const opus_val16 *thresholds, const opus_val16 *hysteresis, int N, int prev)
-{
- int i;
- for (i=0;i<N;i++)
- {
- if (val < thresholds[i])
- break;
- }
- if (i>prev && val < thresholds[prev]+hysteresis[prev])
- i=prev;
- if (i<prev && val > thresholds[prev-1]-hysteresis[prev-1])
- i=prev;
- return i;
-}
-
-opus_uint32 celt_lcg_rand(opus_uint32 seed)
-{
- return 1664525 * seed + 1013904223;
-}
-
-/* This is a cos() approximation designed to be bit-exact on any platform. Bit exactness
- with this approximation is important because it has an impact on the bit allocation */
-static opus_int16 bitexact_cos(opus_int16 x)
-{
- opus_int32 tmp;
- opus_int16 x2;
- tmp = (4096+((opus_int32)(x)*(x)))>>13;
- celt_assert(tmp<=32767);
- x2 = tmp;
- x2 = (32767-x2) + FRAC_MUL16(x2, (-7651 + FRAC_MUL16(x2, (8277 + FRAC_MUL16(-626, x2)))));
- celt_assert(x2<=32766);
- return 1+x2;
-}
-
-static int bitexact_log2tan(int isin,int icos)
-{
- int lc;
- int ls;
- lc=EC_ILOG(icos);
- ls=EC_ILOG(isin);
- icos<<=15-lc;
- isin<<=15-ls;
- return (ls-lc)*(1<<11)
- +FRAC_MUL16(isin, FRAC_MUL16(isin, -2597) + 7932)
- -FRAC_MUL16(icos, FRAC_MUL16(icos, -2597) + 7932);
-}
-
-#ifdef FIXED_POINT
-/* Compute the amplitude (sqrt energy) in each of the bands */
-void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int M)
-{
- int i, c, N;
- const opus_int16 *eBands = m->eBands;
- N = M*m->shortMdctSize;
- c=0; do {
- for (i=0;i<end;i++)
- {
- int j;
- opus_val32 maxval=0;
- opus_val32 sum = 0;
-
- j=M*eBands[i]; do {
- maxval = MAX32(maxval, X[j+c*N]);
- maxval = MAX32(maxval, -X[j+c*N]);
- } while (++j<M*eBands[i+1]);
-
- if (maxval > 0)
- {
- int shift = celt_ilog2(maxval)-10;
- j=M*eBands[i]; do {
- sum = MAC16_16(sum, EXTRACT16(VSHR32(X[j+c*N],shift)),
- EXTRACT16(VSHR32(X[j+c*N],shift)));
- } while (++j<M*eBands[i+1]);
- /* We're adding one here to ensure the normalized band isn't larger than unity norm */
- bandE[i+c*m->nbEBands] = EPSILON+VSHR32(EXTEND32(celt_sqrt(sum)),-shift);
- } else {
- bandE[i+c*m->nbEBands] = EPSILON;
- }
- /*printf ("%f ", bandE[i+c*m->nbEBands]);*/
- }
- } while (++c<C);
- /*printf ("\n");*/
-}
-
-/* Normalise each band such that the energy is one. */
-void normalise_bands(const CELTMode *m, const celt_sig * OPUS_RESTRICT freq, celt_norm * OPUS_RESTRICT X, const celt_ener *bandE, int end, int C, int M)
-{
- int i, c, N;
- const opus_int16 *eBands = m->eBands;
- N = M*m->shortMdctSize;
- c=0; do {
- i=0; do {
- opus_val16 g;
- int j,shift;
- opus_val16 E;
- shift = celt_zlog2(bandE[i+c*m->nbEBands])-13;
- E = VSHR32(bandE[i+c*m->nbEBands], shift);
- g = EXTRACT16(celt_rcp(SHL32(E,3)));
- j=M*eBands[i]; do {
- X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g);
- } while (++j<M*eBands[i+1]);
- } while (++i<end);
- } while (++c<C);
-}
-
-#else /* FIXED_POINT */
-/* Compute the amplitude (sqrt energy) in each of the bands */
-void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int M)
-{
- int i, c, N;
- const opus_int16 *eBands = m->eBands;
- N = M*m->shortMdctSize;
- c=0; do {
- for (i=0;i<end;i++)
- {
- int j;
- opus_val32 sum = 1e-27f;
- for (j=M*eBands[i];j<M*eBands[i+1];j++)
- sum += X[j+c*N]*X[j+c*N];
- bandE[i+c*m->nbEBands] = celt_sqrt(sum);
- /*printf ("%f ", bandE[i+c*m->nbEBands]);*/
- }
- } while (++c<C);
- /*printf ("\n");*/
-}
-
-/* Normalise each band such that the energy is one. */
-void normalise_bands(const CELTMode *m, const celt_sig * OPUS_RESTRICT freq, celt_norm * OPUS_RESTRICT X, const celt_ener *bandE, int end, int C, int M)
-{
- int i, c, N;
- const opus_int16 *eBands = m->eBands;
- N = M*m->shortMdctSize;
- c=0; do {
- for (i=0;i<end;i++)
- {
- int j;
- opus_val16 g = 1.f/(1e-27f+bandE[i+c*m->nbEBands]);
- for (j=M*eBands[i];j<M*eBands[i+1];j++)
- X[j+c*N] = freq[j+c*N]*g;
- }
- } while (++c<C);
-}
-
-#endif /* FIXED_POINT */
-
-/* De-normalise the energy to produce the synthesis from the unit-energy bands */
-void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X,
- celt_sig * OPUS_RESTRICT freq, const opus_val16 *bandLogE, int start, int end, int C, int M)
-{
- int i, c, N;
- const opus_int16 *eBands = m->eBands;
- N = M*m->shortMdctSize;
- celt_assert2(C<=2, "denormalise_bands() not implemented for >2 channels");
- c=0; do {
- celt_sig * OPUS_RESTRICT f;
- const celt_norm * OPUS_RESTRICT x;
- f = freq+c*N;
- x = X+c*N+M*eBands[start];
- for (i=0;i<M*eBands[start];i++)
- *f++ = 0;
- for (i=start;i<end;i++)
- {
- int j, band_end;
- opus_val16 g;
- opus_val16 lg;
-#ifdef FIXED_POINT
- int shift;
-#endif
- j=M*eBands[i];
- band_end = M*eBands[i+1];
- lg = ADD16(bandLogE[i+c*m->nbEBands], SHL16((opus_val16)eMeans[i],6));
-#ifndef FIXED_POINT
- g = celt_exp2(lg);
-#else
- /* Handle the integer part of the log energy */
- shift = 16-(lg>>DB_SHIFT);
- if (shift>31)
- {
- shift=0;
- g=0;
- } else {
- /* Handle the fractional part. */
- g = celt_exp2_frac(lg&((1<<DB_SHIFT)-1));
- }
- /* Handle extreme gains with negative shift. */
- if (shift<0)
- {
- /* For shift < -2 we'd be likely to overflow, so we're capping
- the gain here. This shouldn't happen unless the bitstream is
- already corrupted. */
- if (shift < -2)
- {
- g = 32767;
- shift = -2;
- }
- do {
- *f++ = SHL32(MULT16_16(*x++, g), -shift);
- } while (++j<band_end);
- } else
-#endif
- /* Be careful of the fixed-point "else" just above when changing this code */
- do {
- *f++ = SHR32(MULT16_16(*x++, g), shift);
- } while (++j<band_end);
- }
- celt_assert(start <= end);
- for (i=M*eBands[end];i<N;i++)
- *f++ = 0;
- } while (++c<C);
-}
-
-/* This prevents energy collapse for transients with multiple short MDCTs */
-void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_masks, int LM, int C, int size,
- int start, int end, opus_val16 *logE, opus_val16 *prev1logE,
- opus_val16 *prev2logE, int *pulses, opus_uint32 seed)
-{
- int c, i, j, k;
- for (i=start;i<end;i++)
- {
- int N0;
- opus_val16 thresh, sqrt_1;
- int depth;
-#ifdef FIXED_POINT
- int shift;
- opus_val32 thresh32;
-#endif
-
- N0 = m->eBands[i+1]-m->eBands[i];
- /* depth in 1/8 bits */
- depth = (1+pulses[i])/((m->eBands[i+1]-m->eBands[i])<<LM);
-
-#ifdef FIXED_POINT
- thresh32 = SHR32(celt_exp2(-SHL16(depth, 10-BITRES)),1);
- thresh = MULT16_32_Q15(QCONST16(0.5f, 15), MIN32(32767,thresh32));
- {
- opus_val32 t;
- t = N0<<LM;
- shift = celt_ilog2(t)>>1;
- t = SHL32(t, (7-shift)<<1);
- sqrt_1 = celt_rsqrt_norm(t);
- }
-#else
- thresh = .5f*celt_exp2(-.125f*depth);
- sqrt_1 = celt_rsqrt(N0<<LM);
-#endif
-
- c=0; do
- {
- celt_norm *X;
- opus_val16 prev1;
- opus_val16 prev2;
- opus_val32 Ediff;
- opus_val16 r;
- int renormalize=0;
- prev1 = prev1logE[c*m->nbEBands+i];
- prev2 = prev2logE[c*m->nbEBands+i];
- if (C==1)
- {
- prev1 = MAX16(prev1,prev1logE[m->nbEBands+i]);
- prev2 = MAX16(prev2,prev2logE[m->nbEBands+i]);
- }
- Ediff = EXTEND32(logE[c*m->nbEBands+i])-EXTEND32(MIN16(prev1,prev2));
- Ediff = MAX32(0, Ediff);
-
-#ifdef FIXED_POINT
- if (Ediff < 16384)
- {
- opus_val32 r32 = SHR32(celt_exp2(-EXTRACT16(Ediff)),1);
- r = 2*MIN16(16383,r32);
- } else {
- r = 0;
- }
- if (LM==3)
- r = MULT16_16_Q14(23170, MIN32(23169, r));
- r = SHR16(MIN16(thresh, r),1);
- r = SHR32(MULT16_16_Q15(sqrt_1, r),shift);
-#else
- /* r needs to be multiplied by 2 or 2*sqrt(2) depending on LM because
- short blocks don't have the same energy as long */
- r = 2.f*celt_exp2(-Ediff);
- if (LM==3)
- r *= 1.41421356f;
- r = MIN16(thresh, r);
- r = r*sqrt_1;
-#endif
- X = X_+c*size+(m->eBands[i]<<LM);
- for (k=0;k<1<<LM;k++)
- {
- /* Detect collapse */
- if (!(collapse_masks[i*C+c]&1<<k))
- {
- /* Fill with noise */
- for (j=0;j<N0;j++)
- {
- seed = celt_lcg_rand(seed);
- X[(j<<LM)+k] = (seed&0x8000 ? r : -r);
- }
- renormalize = 1;
- }
- }
- /* We just added some energy, so we need to renormalise */
- if (renormalize)
- renormalise_vector(X, N0<<LM, Q15ONE);
- } while (++c<C);
- }
-}
-
-static void intensity_stereo(const CELTMode *m, celt_norm *X, celt_norm *Y, const celt_ener *bandE, int bandID, int N)
-{
- int i = bandID;
- int j;
- opus_val16 a1, a2;
- opus_val16 left, right;
- opus_val16 norm;
-#ifdef FIXED_POINT
- int shift = celt_zlog2(MAX32(bandE[i], bandE[i+m->nbEBands]))-13;
-#endif
- left = VSHR32(bandE[i],shift);
- right = VSHR32(bandE[i+m->nbEBands],shift);
- norm = EPSILON + celt_sqrt(EPSILON+MULT16_16(left,left)+MULT16_16(right,right));
- a1 = DIV32_16(SHL32(EXTEND32(left),14),norm);
- a2 = DIV32_16(SHL32(EXTEND32(right),14),norm);
- for (j=0;j<N;j++)
- {
- celt_norm r, l;
- l = X[j];
- r = Y[j];
- X[j] = MULT16_16_Q14(a1,l) + MULT16_16_Q14(a2,r);
- /* Side is not encoded, no need to calculate */
- }
-}
-
-static void stereo_split(celt_norm *X, celt_norm *Y, int N)
-{
- int j;
- for (j=0;j<N;j++)
- {
- celt_norm r, l;
- l = MULT16_16_Q15(QCONST16(.70710678f,15), X[j]);
- r = MULT16_16_Q15(QCONST16(.70710678f,15), Y[j]);
- X[j] = l+r;
- Y[j] = r-l;
- }
-}
-
-static void stereo_merge(celt_norm *X, celt_norm *Y, opus_val16 mid, int N)
-{
- int j;
- opus_val32 xp=0, side=0;
- opus_val32 El, Er;
- opus_val16 mid2;
-#ifdef FIXED_POINT
- int kl, kr;
-#endif
- opus_val32 t, lgain, rgain;
-
- /* Compute the norm of X+Y and X-Y as |X|^2 + |Y|^2 +/- sum(xy) */
- dual_inner_prod(Y, X, Y, N, &xp, &side);
- /* Compensating for the mid normalization */
- xp = MULT16_32_Q15(mid, xp);
- /* mid and side are in Q15, not Q14 like X and Y */
- mid2 = SHR32(mid, 1);
- El = MULT16_16(mid2, mid2) + side - 2*xp;
- Er = MULT16_16(mid2, mid2) + side + 2*xp;
- if (Er < QCONST32(6e-4f, 28) || El < QCONST32(6e-4f, 28))
- {
- for (j=0;j<N;j++)
- Y[j] = X[j];
- return;
- }
-
-#ifdef FIXED_POINT
- kl = celt_ilog2(El)>>1;
- kr = celt_ilog2(Er)>>1;
-#endif
- t = VSHR32(El, (kl-7)<<1);
- lgain = celt_rsqrt_norm(t);
- t = VSHR32(Er, (kr-7)<<1);
- rgain = celt_rsqrt_norm(t);
-
-#ifdef FIXED_POINT
- if (kl < 7)
- kl = 7;
- if (kr < 7)
- kr = 7;
-#endif
-
- for (j=0;j<N;j++)
- {
- celt_norm r, l;
- /* Apply mid scaling (side is already scaled) */
- l = MULT16_16_Q15(mid, X[j]);
- r = Y[j];
- X[j] = EXTRACT16(PSHR32(MULT16_16(lgain, SUB16(l,r)), kl+1));
- Y[j] = EXTRACT16(PSHR32(MULT16_16(rgain, ADD16(l,r)), kr+1));
- }
-}
-
-/* Decide whether we should spread the pulses in the current frame */
-int spreading_decision(const CELTMode *m, celt_norm *X, int *average,
- int last_decision, int *hf_average, int *tapset_decision, int update_hf,
- int end, int C, int M)
-{
- int i, c, N0;
- int sum = 0, nbBands=0;
- const opus_int16 * OPUS_RESTRICT eBands = m->eBands;
- int decision;
- int hf_sum=0;
-
- celt_assert(end>0);
-
- N0 = M*m->shortMdctSize;
-
- if (M*(eBands[end]-eBands[end-1]) <= 8)
- return SPREAD_NONE;
- c=0; do {
- for (i=0;i<end;i++)
- {
- int j, N, tmp=0;
- int tcount[3] = {0,0,0};
- celt_norm * OPUS_RESTRICT x = X+M*eBands[i]+c*N0;
- N = M*(eBands[i+1]-eBands[i]);
- if (N<=8)
- continue;
- /* Compute rough CDF of |x[j]| */
- for (j=0;j<N;j++)
- {
- opus_val32 x2N; /* Q13 */
-
- x2N = MULT16_16(MULT16_16_Q15(x[j], x[j]), N);
- if (x2N < QCONST16(0.25f,13))
- tcount[0]++;
- if (x2N < QCONST16(0.0625f,13))
- tcount[1]++;
- if (x2N < QCONST16(0.015625f,13))
- tcount[2]++;
- }
-
- /* Only include four last bands (8 kHz and up) */
- if (i>m->nbEBands-4)
- hf_sum += 32*(tcount[1]+tcount[0])/N;
- tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N);
- sum += tmp*256;
- nbBands++;
- }
- } while (++c<C);
-
- if (update_hf)
- {
- if (hf_sum)
- hf_sum /= C*(4-m->nbEBands+end);
- *hf_average = (*hf_average+hf_sum)>>1;
- hf_sum = *hf_average;
- if (*tapset_decision==2)
- hf_sum += 4;
- else if (*tapset_decision==0)
- hf_sum -= 4;
- if (hf_sum > 22)
- *tapset_decision=2;
- else if (hf_sum > 18)
- *tapset_decision=1;
- else
- *tapset_decision=0;
- }
- /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/
- celt_assert(nbBands>0); /* end has to be non-zero */
- sum /= nbBands;
- /* Recursive averaging */
- sum = (sum+*average)>>1;
- *average = sum;
- /* Hysteresis */
- sum = (3*sum + (((3-last_decision)<<7) + 64) + 2)>>2;
- if (sum < 80)
- {
- decision = SPREAD_AGGRESSIVE;
- } else if (sum < 256)
- {
- decision = SPREAD_NORMAL;
- } else if (sum < 384)
- {
- decision = SPREAD_LIGHT;
- } else {
- decision = SPREAD_NONE;
- }
-#ifdef FUZZING
- decision = rand()&0x3;
- *tapset_decision=rand()%3;
-#endif
- return decision;
-}
-
-/* Indexing table for converting from natural Hadamard to ordery Hadamard
- This is essentially a bit-reversed Gray, on top of which we've added
- an inversion of the order because we want the DC at the end rather than
- the beginning. The lines are for N=2, 4, 8, 16 */
-static const int ordery_table[] = {
- 1, 0,
- 3, 0, 2, 1,
- 7, 0, 4, 3, 6, 1, 5, 2,
- 15, 0, 8, 7, 12, 3, 11, 4, 14, 1, 9, 6, 13, 2, 10, 5,
-};
-
-static void deinterleave_hadamard(celt_norm *X, int N0, int stride, int hadamard)
-{
- int i,j;
- VARDECL(celt_norm, tmp);
- int N;
- SAVE_STACK;
- N = N0*stride;
- ALLOC(tmp, N, celt_norm);
- celt_assert(stride>0);
- if (hadamard)
- {
- const int *ordery = ordery_table+stride-2;
- for (i=0;i<stride;i++)
- {
- for (j=0;j<N0;j++)
- tmp[ordery[i]*N0+j] = X[j*stride+i];
- }
- } else {
- for (i=0;i<stride;i++)
- for (j=0;j<N0;j++)
- tmp[i*N0+j] = X[j*stride+i];
- }
- for (j=0;j<N;j++)
- X[j] = tmp[j];
- RESTORE_STACK;
-}
-
-static void interleave_hadamard(celt_norm *X, int N0, int stride, int hadamard)
-{
- int i,j;
- VARDECL(celt_norm, tmp);
- int N;
- SAVE_STACK;
- N = N0*stride;
- ALLOC(tmp, N, celt_norm);
- if (hadamard)
- {
- const int *ordery = ordery_table+stride-2;
- for (i=0;i<stride;i++)
- for (j=0;j<N0;j++)
- tmp[j*stride+i] = X[ordery[i]*N0+j];
- } else {
- for (i=0;i<stride;i++)
- for (j=0;j<N0;j++)
- tmp[j*stride+i] = X[i*N0+j];
- }
- for (j=0;j<N;j++)
- X[j] = tmp[j];
- RESTORE_STACK;
-}
-
-void haar1(celt_norm *X, int N0, int stride)
-{
- int i, j;
- N0 >>= 1;
- for (i=0;i<stride;i++)
- for (j=0;j<N0;j++)
- {
- celt_norm tmp1, tmp2;
- tmp1 = MULT16_16_Q15(QCONST16(.70710678f,15), X[stride*2*j+i]);
- tmp2 = MULT16_16_Q15(QCONST16(.70710678f,15), X[stride*(2*j+1)+i]);
- X[stride*2*j+i] = tmp1 + tmp2;
- X[stride*(2*j+1)+i] = tmp1 - tmp2;
- }
-}
-
-static int compute_qn(int N, int b, int offset, int pulse_cap, int stereo)
-{
- static const opus_int16 exp2_table8[8] =
- {16384, 17866, 19483, 21247, 23170, 25267, 27554, 30048};
- int qn, qb;
- int N2 = 2*N-1;
- if (stereo && N==2)
- N2--;
- /* The upper limit ensures that in a stereo split with itheta==16384, we'll
- always have enough bits left over to code at least one pulse in the
- side; otherwise it would collapse, since it doesn't get folded. */
- qb = IMIN(b-pulse_cap-(4<<BITRES), (b+N2*offset)/N2);
-
- qb = IMIN(8<<BITRES, qb);
-
- if (qb<(1<<BITRES>>1)) {
- qn = 1;
- } else {
- qn = exp2_table8[qb&0x7]>>(14-(qb>>BITRES));
- qn = (qn+1)>>1<<1;
- }
- celt_assert(qn <= 256);
- return qn;
-}
-
-struct band_ctx {
- int encode;
- const CELTMode *m;
- int i;
- int intensity;
- int spread;
- int tf_change;
- ec_ctx *ec;
- opus_int32 remaining_bits;
- const celt_ener *bandE;
- opus_uint32 seed;
-};
-
-struct split_ctx {
- int inv;
- int imid;
- int iside;
- int delta;
- int itheta;
- int qalloc;
-};
-
-static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx,
- celt_norm *X, celt_norm *Y, int N, int *b, int B, int B0,
- int LM,
- int stereo, int *fill)
-{
- int qn;
- int itheta=0;
- int delta;
- int imid, iside;
- int qalloc;
- int pulse_cap;
- int offset;
- opus_int32 tell;
- int inv=0;
- int encode;
- const CELTMode *m;
- int i;
- int intensity;
- ec_ctx *ec;
- const celt_ener *bandE;
-
- encode = ctx->encode;
- m = ctx->m;
- i = ctx->i;
- intensity = ctx->intensity;
- ec = ctx->ec;
- bandE = ctx->bandE;
-
- /* Decide on the resolution to give to the split parameter theta */
- pulse_cap = m->logN[i]+LM*(1<<BITRES);
- offset = (pulse_cap>>1) - (stereo&&N==2 ? QTHETA_OFFSET_TWOPHASE : QTHETA_OFFSET);
- qn = compute_qn(N, *b, offset, pulse_cap, stereo);
- if (stereo && i>=intensity)
- qn = 1;
- if (encode)
- {
- /* theta is the atan() of the ratio between the (normalized)
- side and mid. With just that parameter, we can re-scale both
- mid and side because we know that 1) they have unit norm and
- 2) they are orthogonal. */
- itheta = stereo_itheta(X, Y, stereo, N);
- }
- tell = ec_tell_frac(ec);
- if (qn!=1)
- {
- if (encode)
- itheta = (itheta*qn+8192)>>14;
-
- /* Entropy coding of the angle. We use a uniform pdf for the
- time split, a step for stereo, and a triangular one for the rest. */
- if (stereo && N>2)
- {
- int p0 = 3;
- int x = itheta;
- int x0 = qn/2;
- int ft = p0*(x0+1) + x0;
- /* Use a probability of p0 up to itheta=8192 and then use 1 after */
- if (encode)
- {
- ec_encode(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft);
- } else {
- int fs;
- fs=ec_decode(ec,ft);
- if (fs<(x0+1)*p0)
- x=fs/p0;
- else
- x=x0+1+(fs-(x0+1)*p0);
- ec_dec_update(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft);
- itheta = x;
- }
- } else if (B0>1 || stereo) {
- /* Uniform pdf */
- if (encode)
- ec_enc_uint(ec, itheta, qn+1);
- else
- itheta = ec_dec_uint(ec, qn+1);
- } else {
- int fs=1, ft;
- ft = ((qn>>1)+1)*((qn>>1)+1);
- if (encode)
- {
- int fl;
-
- fs = itheta <= (qn>>1) ? itheta + 1 : qn + 1 - itheta;
- fl = itheta <= (qn>>1) ? itheta*(itheta + 1)>>1 :
- ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1);
-
- ec_encode(ec, fl, fl+fs, ft);
- } else {
- /* Triangular pdf */
- int fl=0;
- int fm;
- fm = ec_decode(ec, ft);
-
- if (fm < ((qn>>1)*((qn>>1) + 1)>>1))
- {
- itheta = (isqrt32(8*(opus_uint32)fm + 1) - 1)>>1;
- fs = itheta + 1;
- fl = itheta*(itheta + 1)>>1;
- }
- else
- {
- itheta = (2*(qn + 1)
- - isqrt32(8*(opus_uint32)(ft - fm - 1) + 1))>>1;
- fs = qn + 1 - itheta;
- fl = ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1);
- }
-
- ec_dec_update(ec, fl, fl+fs, ft);
- }
- }
- itheta = (opus_int32)itheta*16384/qn;
- if (encode && stereo)
- {
- if (itheta==0)
- intensity_stereo(m, X, Y, bandE, i, N);
- else
- stereo_split(X, Y, N);
- }
- /* NOTE: Renormalising X and Y *may* help fixed-point a bit at very high rate.
- Let's do that at higher complexity */
- } else if (stereo) {
- if (encode)
- {
- inv = itheta > 8192;
- if (inv)
- {
- int j;
- for (j=0;j<N;j++)
- Y[j] = -Y[j];
- }
- intensity_stereo(m, X, Y, bandE, i, N);
- }
- if (*b>2<<BITRES && ctx->remaining_bits > 2<<BITRES)
- {
- if (encode)
- ec_enc_bit_logp(ec, inv, 2);
- else
- inv = ec_dec_bit_logp(ec, 2);
- } else
- inv = 0;
- itheta = 0;
- }
- qalloc = ec_tell_frac(ec) - tell;
- *b -= qalloc;
-
- if (itheta == 0)
- {
- imid = 32767;
- iside = 0;
- *fill &= (1<<B)-1;
- delta = -16384;
- } else if (itheta == 16384)
- {
- imid = 0;
- iside = 32767;
- *fill &= ((1<<B)-1)<<B;
- delta = 16384;
- } else {
- imid = bitexact_cos((opus_int16)itheta);
- iside = bitexact_cos((opus_int16)(16384-itheta));
- /* This is the mid vs side allocation that minimizes squared error
- in that band. */
- delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid));
- }
-
- sctx->inv = inv;
- sctx->imid = imid;
- sctx->iside = iside;
- sctx->delta = delta;
- sctx->itheta = itheta;
- sctx->qalloc = qalloc;
-}
-static unsigned quant_band_n1(struct band_ctx *ctx, celt_norm *X, celt_norm *Y, int b,
- celt_norm *lowband_out)
-{
-#ifdef RESYNTH
- int resynth = 1;
-#else
- int resynth = !ctx->encode;
-#endif
- int c;
- int stereo;
- celt_norm *x = X;
- int encode;
- ec_ctx *ec;
-
- encode = ctx->encode;
- ec = ctx->ec;
-
- stereo = Y != NULL;
- c=0; do {
- int sign=0;
- if (ctx->remaining_bits>=1<<BITRES)
- {
- if (encode)
- {
- sign = x[0]<0;
- ec_enc_bits(ec, sign, 1);
- } else {
- sign = ec_dec_bits(ec, 1);
- }
- ctx->remaining_bits -= 1<<BITRES;
- b-=1<<BITRES;
- }
- if (resynth)
- x[0] = sign ? -NORM_SCALING : NORM_SCALING;
- x = Y;
- } while (++c<1+stereo);
- if (lowband_out)
- lowband_out[0] = SHR16(X[0],4);
- return 1;
-}
-
-/* This function is responsible for encoding and decoding a mono partition.
- It can split the band in two and transmit the energy difference with
- the two half-bands. It can be called recursively so bands can end up being
- split in 8 parts. */
-static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X,
- int N, int b, int B, celt_norm *lowband,
- int LM,
- opus_val16 gain, int fill)
-{
- const unsigned char *cache;
- int q;
- int curr_bits;
- int imid=0, iside=0;
- int B0=B;
- opus_val16 mid=0, side=0;
- unsigned cm=0;
-#ifdef RESYNTH
- int resynth = 1;
-#else
- int resynth = !ctx->encode;
-#endif
- celt_norm *Y=NULL;
- int encode;
- const CELTMode *m;
- int i;
- int spread;
- ec_ctx *ec;
-
- encode = ctx->encode;
- m = ctx->m;
- i = ctx->i;
- spread = ctx->spread;
- ec = ctx->ec;
-
- /* If we need 1.5 more bit than we can produce, split the band in two. */
- cache = m->cache.bits + m->cache.index[(LM+1)*m->nbEBands+i];
- if (LM != -1 && b > cache[cache[0]]+12 && N>2)
- {
- int mbits, sbits, delta;
- int itheta;
- int qalloc;
- struct split_ctx sctx;
- celt_norm *next_lowband2=NULL;
- opus_int32 rebalance;
-
- N >>= 1;
- Y = X+N;
- LM -= 1;
- if (B==1)
- fill = (fill&1)|(fill<<1);
- B = (B+1)>>1;
-
- compute_theta(ctx, &sctx, X, Y, N, &b, B, B0,
- LM, 0, &fill);
- imid = sctx.imid;
- iside = sctx.iside;
- delta = sctx.delta;
- itheta = sctx.itheta;
- qalloc = sctx.qalloc;
-#ifdef FIXED_POINT
- mid = imid;
- side = iside;
-#else
- mid = (1.f/32768)*imid;
- side = (1.f/32768)*iside;
-#endif
-
- /* Give more bits to low-energy MDCTs than they would otherwise deserve */
- if (B0>1 && (itheta&0x3fff))
- {
- if (itheta > 8192)
- /* Rough approximation for pre-echo masking */
- delta -= delta>>(4-LM);
- else
- /* Corresponds to a forward-masking slope of 1.5 dB per 10 ms */
- delta = IMIN(0, delta + (N<<BITRES>>(5-LM)));
- }
- mbits = IMAX(0, IMIN(b, (b-delta)/2));
- sbits = b-mbits;
- ctx->remaining_bits -= qalloc;
-
- if (lowband)
- next_lowband2 = lowband+N; /* >32-bit split case */
-
- rebalance = ctx->remaining_bits;
- if (mbits >= sbits)
- {
- cm = quant_partition(ctx, X, N, mbits, B,
- lowband, LM,
- MULT16_16_P15(gain,mid), fill);
- rebalance = mbits - (rebalance-ctx->remaining_bits);
- if (rebalance > 3<<BITRES && itheta!=0)
- sbits += rebalance - (3<<BITRES);
- cm |= quant_partition(ctx, Y, N, sbits, B,
- next_lowband2, LM,
- MULT16_16_P15(gain,side), fill>>B)<<(B0>>1);
- } else {
- cm = quant_partition(ctx, Y, N, sbits, B,
- next_lowband2, LM,
- MULT16_16_P15(gain,side), fill>>B)<<(B0>>1);
- rebalance = sbits - (rebalance-ctx->remaining_bits);
- if (rebalance > 3<<BITRES && itheta!=16384)
- mbits += rebalance - (3<<BITRES);
- cm |= quant_partition(ctx, X, N, mbits, B,
- lowband, LM,
- MULT16_16_P15(gain,mid), fill);
- }
- } else {
- /* This is the basic no-split case */
- q = bits2pulses(m, i, LM, b);
- curr_bits = pulses2bits(m, i, LM, q);
- ctx->remaining_bits -= curr_bits;
-
- /* Ensures we can never bust the budget */
- while (ctx->remaining_bits < 0 && q > 0)
- {
- ctx->remaining_bits += curr_bits;
- q--;
- curr_bits = pulses2bits(m, i, LM, q);
- ctx->remaining_bits -= curr_bits;
- }
-
- if (q!=0)
- {
- int K = get_pulses(q);
-
- /* Finally do the actual quantization */
- if (encode)
- {
- cm = alg_quant(X, N, K, spread, B, ec
-#ifdef RESYNTH
- , gain
-#endif
- );
- } else {
- cm = alg_unquant(X, N, K, spread, B, ec, gain);
- }
- } else {
- /* If there's no pulse, fill the band anyway */
- int j;
- if (resynth)
- {
- unsigned cm_mask;
- /* B can be as large as 16, so this shift might overflow an int on a
- 16-bit platform; use a long to get defined behavior.*/
- cm_mask = (unsigned)(1UL<<B)-1;
- fill &= cm_mask;
- if (!fill)
- {
- for (j=0;j<N;j++)
- X[j] = 0;
- } else {
- if (lowband == NULL)
- {
- /* Noise */
- for (j=0;j<N;j++)
- {
- ctx->seed = celt_lcg_rand(ctx->seed);
- X[j] = (celt_norm)((opus_int32)ctx->seed>>20);
- }
- cm = cm_mask;
- } else {
- /* Folded spectrum */
- for (j=0;j<N;j++)
- {
- opus_val16 tmp;
- ctx->seed = celt_lcg_rand(ctx->seed);
- /* About 48 dB below the "normal" folding level */
- tmp = QCONST16(1.0f/256, 10);
- tmp = (ctx->seed)&0x8000 ? tmp : -tmp;
- X[j] = lowband[j]+tmp;
- }
- cm = fill;
- }
- renormalise_vector(X, N, gain);
- }
- }
- }
- }
-
- return cm;
-}
-
-
-/* This function is responsible for encoding and decoding a band for the mono case. */
-static unsigned quant_band(struct band_ctx *ctx, celt_norm *X,
- int N, int b, int B, celt_norm *lowband,
- int LM, celt_norm *lowband_out,
- opus_val16 gain, celt_norm *lowband_scratch, int fill)
-{
- int N0=N;
- int N_B=N;
- int N_B0;
- int B0=B;
- int time_divide=0;
- int recombine=0;
- int longBlocks;
- unsigned cm=0;
-#ifdef RESYNTH
- int resynth = 1;
-#else
- int resynth = !ctx->encode;
-#endif
- int k;
- int encode;
- int tf_change;
-
- encode = ctx->encode;
- tf_change = ctx->tf_change;
-
- longBlocks = B0==1;
-
- N_B /= B;
-
- /* Special case for one sample */
- if (N==1)
- {
- return quant_band_n1(ctx, X, NULL, b, lowband_out);
- }
-
- if (tf_change>0)
- recombine = tf_change;
- /* Band recombining to increase frequency resolution */
-
- if (lowband_scratch && lowband && (recombine || ((N_B&1) == 0 && tf_change<0) || B0>1))
- {
- int j;
- for (j=0;j<N;j++)
- lowband_scratch[j] = lowband[j];
- lowband = lowband_scratch;
- }
-
- for (k=0;k<recombine;k++)
- {
- static const unsigned char bit_interleave_table[16]={
- 0,1,1,1,2,3,3,3,2,3,3,3,2,3,3,3
- };
- if (encode)
- haar1(X, N>>k, 1<<k);
- if (lowband)
- haar1(lowband, N>>k, 1<<k);
- fill = bit_interleave_table[fill&0xF]|bit_interleave_table[fill>>4]<<2;
- }
- B>>=recombine;
- N_B<<=recombine;
-
- /* Increasing the time resolution */
- while ((N_B&1) == 0 && tf_change<0)
- {
- if (encode)
- haar1(X, N_B, B);
- if (lowband)
- haar1(lowband, N_B, B);
- fill |= fill<<B;
- B <<= 1;
- N_B >>= 1;
- time_divide++;
- tf_change++;
- }
- B0=B;
- N_B0 = N_B;
-
- /* Reorganize the samples in time order instead of frequency order */
- if (B0>1)
- {
- if (encode)
- deinterleave_hadamard(X, N_B>>recombine, B0<<recombine, longBlocks);
- if (lowband)
- deinterleave_hadamard(lowband, N_B>>recombine, B0<<recombine, longBlocks);
- }
-
- cm = quant_partition(ctx, X, N, b, B, lowband,
- LM, gain, fill);
-
- /* This code is used by the decoder and by the resynthesis-enabled encoder */
- if (resynth)
- {
- /* Undo the sample reorganization going from time order to frequency order */
- if (B0>1)
- interleave_hadamard(X, N_B>>recombine, B0<<recombine, longBlocks);
-
- /* Undo time-freq changes that we did earlier */
- N_B = N_B0;
- B = B0;
- for (k=0;k<time_divide;k++)
- {
- B >>= 1;
- N_B <<= 1;
- cm |= cm>>B;
- haar1(X, N_B, B);
- }
-
- for (k=0;k<recombine;k++)
- {
- static const unsigned char bit_deinterleave_table[16]={
- 0x00,0x03,0x0C,0x0F,0x30,0x33,0x3C,0x3F,
- 0xC0,0xC3,0xCC,0xCF,0xF0,0xF3,0xFC,0xFF
- };
- cm = bit_deinterleave_table[cm];
- haar1(X, N0>>k, 1<<k);
- }
- B<<=recombine;
-
- /* Scale output for later folding */
- if (lowband_out)
- {
- int j;
- opus_val16 n;
- n = celt_sqrt(SHL32(EXTEND32(N0),22));
- for (j=0;j<N0;j++)
- lowband_out[j] = MULT16_16_Q15(n,X[j]);
- }
- cm &= (1<<B)-1;
- }
- return cm;
-}
-
-
-/* This function is responsible for encoding and decoding a band for the stereo case. */
-static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm *Y,
- int N, int b, int B, celt_norm *lowband,
- int LM, celt_norm *lowband_out,
- celt_norm *lowband_scratch, int fill)
-{
- int imid=0, iside=0;
- int inv = 0;
- opus_val16 mid=0, side=0;
- unsigned cm=0;
-#ifdef RESYNTH
- int resynth = 1;
-#else
- int resynth = !ctx->encode;
-#endif
- int mbits, sbits, delta;
- int itheta;
- int qalloc;
- struct split_ctx sctx;
- int orig_fill;
- int encode;
- ec_ctx *ec;
-
- encode = ctx->encode;
- ec = ctx->ec;
-
- /* Special case for one sample */
- if (N==1)
- {
- return quant_band_n1(ctx, X, Y, b, lowband_out);
- }
-
- orig_fill = fill;
-
- compute_theta(ctx, &sctx, X, Y, N, &b, B, B,
- LM, 1, &fill);
- inv = sctx.inv;
- imid = sctx.imid;
- iside = sctx.iside;
- delta = sctx.delta;
- itheta = sctx.itheta;
- qalloc = sctx.qalloc;
-#ifdef FIXED_POINT
- mid = imid;
- side = iside;
-#else
- mid = (1.f/32768)*imid;
- side = (1.f/32768)*iside;
-#endif
-
- /* This is a special case for N=2 that only works for stereo and takes
- advantage of the fact that mid and side are orthogonal to encode
- the side with just one bit. */
- if (N==2)
- {
- int c;
- int sign=0;
- celt_norm *x2, *y2;
- mbits = b;
- sbits = 0;
- /* Only need one bit for the side. */
- if (itheta != 0 && itheta != 16384)
- sbits = 1<<BITRES;
- mbits -= sbits;
- c = itheta > 8192;
- ctx->remaining_bits -= qalloc+sbits;
-
- x2 = c ? Y : X;
- y2 = c ? X : Y;
- if (sbits)
- {
- if (encode)
- {
- /* Here we only need to encode a sign for the side. */
- sign = x2[0]*y2[1] - x2[1]*y2[0] < 0;
- ec_enc_bits(ec, sign, 1);
- } else {
- sign = ec_dec_bits(ec, 1);
- }
- }
- sign = 1-2*sign;
- /* We use orig_fill here because we want to fold the side, but if
- itheta==16384, we'll have cleared the low bits of fill. */
- cm = quant_band(ctx, x2, N, mbits, B, lowband,
- LM, lowband_out, Q15ONE, lowband_scratch, orig_fill);
- /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse),
- and there's no need to worry about mixing with the other channel. */
- y2[0] = -sign*x2[1];
- y2[1] = sign*x2[0];
- if (resynth)
- {
- celt_norm tmp;
- X[0] = MULT16_16_Q15(mid, X[0]);
- X[1] = MULT16_16_Q15(mid, X[1]);
- Y[0] = MULT16_16_Q15(side, Y[0]);
- Y[1] = MULT16_16_Q15(side, Y[1]);
- tmp = X[0];
- X[0] = SUB16(tmp,Y[0]);
- Y[0] = ADD16(tmp,Y[0]);
- tmp = X[1];
- X[1] = SUB16(tmp,Y[1]);
- Y[1] = ADD16(tmp,Y[1]);
- }
- } else {
- /* "Normal" split code */
- opus_int32 rebalance;
-
- mbits = IMAX(0, IMIN(b, (b-delta)/2));
- sbits = b-mbits;
- ctx->remaining_bits -= qalloc;
-
- rebalance = ctx->remaining_bits;
- if (mbits >= sbits)
- {
- /* In stereo mode, we do not apply a scaling to the mid because we need the normalized
- mid for folding later. */
- cm = quant_band(ctx, X, N, mbits, B,
- lowband, LM, lowband_out,
- Q15ONE, lowband_scratch, fill);
- rebalance = mbits - (rebalance-ctx->remaining_bits);
- if (rebalance > 3<<BITRES && itheta!=0)
- sbits += rebalance - (3<<BITRES);
-
- /* For a stereo split, the high bits of fill are always zero, so no
- folding will be done to the side. */
- cm |= quant_band(ctx, Y, N, sbits, B,
- NULL, LM, NULL,
- side, NULL, fill>>B);
- } else {
- /* For a stereo split, the high bits of fill are always zero, so no
- folding will be done to the side. */
- cm = quant_band(ctx, Y, N, sbits, B,
- NULL, LM, NULL,
- side, NULL, fill>>B);
- rebalance = sbits - (rebalance-ctx->remaining_bits);
- if (rebalance > 3<<BITRES && itheta!=16384)
- mbits += rebalance - (3<<BITRES);
- /* In stereo mode, we do not apply a scaling to the mid because we need the normalized
- mid for folding later. */
- cm |= quant_band(ctx, X, N, mbits, B,
- lowband, LM, lowband_out,
- Q15ONE, lowband_scratch, fill);
- }
- }
-
-
- /* This code is used by the decoder and by the resynthesis-enabled encoder */
- if (resynth)
- {
- if (N!=2)
- stereo_merge(X, Y, mid, N);
- if (inv)
- {
- int j;
- for (j=0;j<N;j++)
- Y[j] = -Y[j];
- }
- }
- return cm;
-}
-
-
-void quant_all_bands(int encode, const CELTMode *m, int start, int end,
- celt_norm *X_, celt_norm *Y_, unsigned char *collapse_masks, const celt_ener *bandE, int *pulses,
- int shortBlocks, int spread, int dual_stereo, int intensity, int *tf_res,
- opus_int32 total_bits, opus_int32 balance, ec_ctx *ec, int LM, int codedBands, opus_uint32 *seed)
-{
- int i;
- opus_int32 remaining_bits;
- const opus_int16 * OPUS_RESTRICT eBands = m->eBands;
- celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2;
- VARDECL(celt_norm, _norm);
- celt_norm *lowband_scratch;
- int B;
- int M;
- int lowband_offset;
- int update_lowband = 1;
- int C = Y_ != NULL ? 2 : 1;
- int norm_offset;
-#ifdef RESYNTH
- int resynth = 1;
-#else
- int resynth = !encode;
-#endif
- struct band_ctx ctx;
- SAVE_STACK;
-
- M = 1<<LM;
- B = shortBlocks ? M : 1;
- norm_offset = M*eBands[start];
- /* No need to allocate norm for the last band because we don't need an
- output in that band. */
- ALLOC(_norm, C*(M*eBands[m->nbEBands-1]-norm_offset), celt_norm);
- norm = _norm;
- norm2 = norm + M*eBands[m->nbEBands-1]-norm_offset;
- /* We can use the last band as scratch space because we don't need that
- scratch space for the last band. */
- lowband_scratch = X_+M*eBands[m->nbEBands-1];
-
- lowband_offset = 0;
- ctx.bandE = bandE;
- ctx.ec = ec;
- ctx.encode = encode;
- ctx.intensity = intensity;
- ctx.m = m;
- ctx.seed = *seed;
- ctx.spread = spread;
- for (i=start;i<end;i++)
- {
- opus_int32 tell;
- int b;
- int N;
- opus_int32 curr_balance;
- int effective_lowband=-1;
- celt_norm * OPUS_RESTRICT X, * OPUS_RESTRICT Y;
- int tf_change=0;
- unsigned x_cm;
- unsigned y_cm;
- int last;
-
- ctx.i = i;
- last = (i==end-1);
-
- X = X_+M*eBands[i];
- if (Y_!=NULL)
- Y = Y_+M*eBands[i];
- else
- Y = NULL;
- N = M*eBands[i+1]-M*eBands[i];
- tell = ec_tell_frac(ec);
-
- /* Compute how many bits we want to allocate to this band */
- if (i != start)
- balance -= tell;
- remaining_bits = total_bits-tell-1;
- ctx.remaining_bits = remaining_bits;
- if (i <= codedBands-1)
- {
- curr_balance = balance / IMIN(3, codedBands-i);
- b = IMAX(0, IMIN(16383, IMIN(remaining_bits+1,pulses[i]+curr_balance)));
- } else {
- b = 0;
- }
-
- if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowband_offset==0))
- lowband_offset = i;
-
- tf_change = tf_res[i];
- ctx.tf_change = tf_change;
- if (i>=m->effEBands)
- {
- X=norm;
- if (Y_!=NULL)
- Y = norm;
- lowband_scratch = NULL;
- }
- if (i==end-1)
- lowband_scratch = NULL;
-
- /* Get a conservative estimate of the collapse_mask's for the bands we're
- going to be folding from. */
- if (lowband_offset != 0 && (spread!=SPREAD_AGGRESSIVE || B>1 || tf_change<0))
- {
- int fold_start;
- int fold_end;
- int fold_i;
- /* This ensures we never repeat spectral content within one band */
- effective_lowband = IMAX(0, M*eBands[lowband_offset]-norm_offset-N);
- fold_start = lowband_offset;
- while(M*eBands[--fold_start] > effective_lowband+norm_offset);
- fold_end = lowband_offset-1;
- while(M*eBands[++fold_end] < effective_lowband+norm_offset+N);
- x_cm = y_cm = 0;
- fold_i = fold_start; do {
- x_cm |= collapse_masks[fold_i*C+0];
- y_cm |= collapse_masks[fold_i*C+C-1];
- } while (++fold_i<fold_end);
- }
- /* Otherwise, we'll be using the LCG to fold, so all blocks will (almost
- always) be non-zero. */
- else
- x_cm = y_cm = (1<<B)-1;
-
- if (dual_stereo && i==intensity)
- {
- int j;
-
- /* Switch off dual stereo to do intensity. */
- dual_stereo = 0;
- if (resynth)
- for (j=0;j<M*eBands[i]-norm_offset;j++)
- norm[j] = HALF32(norm[j]+norm2[j]);
- }
- if (dual_stereo)
- {
- x_cm = quant_band(&ctx, X, N, b/2, B,
- effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
- last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm);
- y_cm = quant_band(&ctx, Y, N, b/2, B,
- effective_lowband != -1 ? norm2+effective_lowband : NULL, LM,
- last?NULL:norm2+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, y_cm);
- } else {
- if (Y!=NULL)
- {
- x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
- effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
- last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm);
- } else {
- x_cm = quant_band(&ctx, X, N, b, B,
- effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
- last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm|y_cm);
- }
- y_cm = x_cm;
- }
- collapse_masks[i*C+0] = (unsigned char)x_cm;
- collapse_masks[i*C+C-1] = (unsigned char)y_cm;
- balance += pulses[i] + tell;
-
- /* Update the folding position only as long as we have 1 bit/sample depth. */
- update_lowband = b>(N<<BITRES);
- }
- *seed = ctx.seed;
-
- RESTORE_STACK;
-}
-
diff --git a/src/opus-1.1/celt/bands.h b/src/opus-1.1/celt/bands.h
deleted file mode 100644
index 96ba52a6..00000000
--- a/src/opus-1.1/celt/bands.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Copyright (c) 2008-2009 Gregory Maxwell
- Written by Jean-Marc Valin and Gregory Maxwell */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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 BANDS_H
-#define BANDS_H
-
-#include "arch.h"
-#include "modes.h"
-#include "entenc.h"
-#include "entdec.h"
-#include "rate.h"
-
-/** Compute the amplitude (sqrt energy) in each of the bands
- * @param m Mode data
- * @param X Spectrum
- * @param bandE Square root of the energy for each band (returned)
- */
-void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int M);
-
-/*void compute_noise_energies(const CELTMode *m, const celt_sig *X, const opus_val16 *tonality, celt_ener *bandE);*/
-
-/** Normalise each band of X such that the energy in each band is
- equal to 1
- * @param m Mode data
- * @param X Spectrum (returned normalised)
- * @param bandE Square root of the energy for each band
- */
-void normalise_bands(const CELTMode *m, const celt_sig * OPUS_RESTRICT freq, celt_norm * OPUS_RESTRICT X, const celt_ener *bandE, int end, int C, int M);
-
-/** Denormalise each band of X to restore full amplitude
- * @param m Mode data
- * @param X Spectrum (returned de-normalised)
- * @param bandE Square root of the energy for each band
- */
-void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X,
- celt_sig * OPUS_RESTRICT freq, const opus_val16 *bandE, int start, int end, int C, int M);
-
-#define SPREAD_NONE (0)
-#define SPREAD_LIGHT (1)
-#define SPREAD_NORMAL (2)
-#define SPREAD_AGGRESSIVE (3)
-
-int spreading_decision(const CELTMode *m, celt_norm *X, int *average,
- int last_decision, int *hf_average, int *tapset_decision, int update_hf,
- int end, int C, int M);
-
-#ifdef MEASURE_NORM_MSE
-void measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, float *bandE0, int M, int N, int C);
-#endif
-
-void haar1(celt_norm *X, int N0, int stride);
-
-/** Quantisation/encoding of the residual spectrum
- * @param encode flag that indicates whether we're encoding (1) or decoding (0)
- * @param m Mode data
- * @param start First band to process
- * @param end Last band to process + 1
- * @param X Residual (normalised)
- * @param Y Residual (normalised) for second channel (or NULL for mono)
- * @param collapse_masks Anti-collapse tracking mask
- * @param bandE Square root of the energy for each band
- * @param pulses Bit allocation (per band) for PVQ
- * @param shortBlocks Zero for long blocks, non-zero for short blocks
- * @param spread Amount of spreading to use
- * @param dual_stereo Zero for MS stereo, non-zero for dual stereo
- * @param intensity First band to use intensity stereo
- * @param tf_res Time-frequency resolution change
- * @param total_bits Total number of bits that can be used for the frame (including the ones already spent)
- * @param balance Number of unallocated bits
- * @param en Entropy coder state
- * @param LM log2() of the number of 2.5 subframes in the frame
- * @param codedBands Last band to receive bits + 1
- * @param seed Random generator seed
- */
-void quant_all_bands(int encode, const CELTMode *m, int start, int end,
- celt_norm * X, celt_norm * Y, unsigned char *collapse_masks, const celt_ener *bandE, int *pulses,
- int shortBlocks, int spread, int dual_stereo, int intensity, int *tf_res,
- opus_int32 total_bits, opus_int32 balance, ec_ctx *ec, int M, int codedBands, opus_uint32 *seed);
-
-void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_masks, int LM, int C, int size,
- int start, int end, opus_val16 *logE, opus_val16 *prev1logE,
- opus_val16 *prev2logE, int *pulses, opus_uint32 seed);
-
-opus_uint32 celt_lcg_rand(opus_uint32 seed);
-
-int hysteresis_decision(opus_val16 val, const opus_val16 *thresholds, const opus_val16 *hysteresis, int N, int prev);
-
-#endif /* BANDS_H */
diff --git a/src/opus-1.1/celt/celt.c b/src/opus-1.1/celt/celt.c
deleted file mode 100644
index 3e0ce6e6..00000000
--- a/src/opus-1.1/celt/celt.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2010 Xiph.Org Foundation
- Copyright (c) 2008 Gregory Maxwell
- Written by Jean-Marc Valin and Gregory Maxwell */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#define CELT_C
-
-#include "os_support.h"
-#include "mdct.h"
-#include <math.h>
-#include "celt.h"
-#include "pitch.h"
-#include "bands.h"
-#include "modes.h"
-#include "entcode.h"
-#include "quant_bands.h"
-#include "rate.h"
-#include "stack_alloc.h"
-#include "mathops.h"
-#include "float_cast.h"
-#include <stdarg.h>
-#include "celt_lpc.h"
-#include "vq.h"
-
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "unknown"
-#endif
-
-
-int resampling_factor(opus_int32 rate)
-{
- int ret;
- switch (rate)
- {
- case 48000:
- ret = 1;
- break;
- case 24000:
- ret = 2;
- break;
- case 16000:
- ret = 3;
- break;
- case 12000:
- ret = 4;
- break;
- case 8000:
- ret = 6;
- break;
- default:
-#ifndef CUSTOM_MODES
- celt_assert(0);
-#endif
- ret = 0;
- break;
- }
- return ret;
-}
-
-#ifndef OVERRIDE_COMB_FILTER_CONST
-static void comb_filter_const(opus_val32 *y, opus_val32 *x, int T, int N,
- opus_val16 g10, opus_val16 g11, opus_val16 g12)
-{
- opus_val32 x0, x1, x2, x3, x4;
- int i;
- x4 = x[-T-2];
- x3 = x[-T-1];
- x2 = x[-T];
- x1 = x[-T+1];
- for (i=0;i<N;i++)
- {
- x0=x[i-T+2];
- y[i] = x[i]
- + MULT16_32_Q15(g10,x2)
- + MULT16_32_Q15(g11,ADD32(x1,x3))
- + MULT16_32_Q15(g12,ADD32(x0,x4));
- x4=x3;
- x3=x2;
- x2=x1;
- x1=x0;
- }
-
-}
-#endif
-
-void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N,
- opus_val16 g0, opus_val16 g1, int tapset0, int tapset1,
- const opus_val16 *window, int overlap)
-{
- int i;
- /* printf ("%d %d %f %f\n", T0, T1, g0, g1); */
- opus_val16 g00, g01, g02, g10, g11, g12;
- opus_val32 x0, x1, x2, x3, x4;
- static const opus_val16 gains[3][3] = {
- {QCONST16(0.3066406250f, 15), QCONST16(0.2170410156f, 15), QCONST16(0.1296386719f, 15)},
- {QCONST16(0.4638671875f, 15), QCONST16(0.2680664062f, 15), QCONST16(0.f, 15)},
- {QCONST16(0.7998046875f, 15), QCONST16(0.1000976562f, 15), QCONST16(0.f, 15)}};
-
- if (g0==0 && g1==0)
- {
- /* OPT: Happens to work without the OPUS_MOVE(), but only because the current encoder already copies x to y */
- if (x!=y)
- OPUS_MOVE(y, x, N);
- return;
- }
- g00 = MULT16_16_Q15(g0, gains[tapset0][0]);
- g01 = MULT16_16_Q15(g0, gains[tapset0][1]);
- g02 = MULT16_16_Q15(g0, gains[tapset0][2]);
- g10 = MULT16_16_Q15(g1, gains[tapset1][0]);
- g11 = MULT16_16_Q15(g1, gains[tapset1][1]);
- g12 = MULT16_16_Q15(g1, gains[tapset1][2]);
- x1 = x[-T1+1];
- x2 = x[-T1 ];
- x3 = x[-T1-1];
- x4 = x[-T1-2];
- for (i=0;i<overlap;i++)
- {
- opus_val16 f;
- x0=x[i-T1+2];
- f = MULT16_16_Q15(window[i],window[i]);
- y[i] = x[i]
- + MULT16_32_Q15(MULT16_16_Q15((Q15ONE-f),g00),x[i-T0])
- + MULT16_32_Q15(MULT16_16_Q15((Q15ONE-f),g01),ADD32(x[i-T0+1],x[i-T0-1]))
- + MULT16_32_Q15(MULT16_16_Q15((Q15ONE-f),g02),ADD32(x[i-T0+2],x[i-T0-2]))
- + MULT16_32_Q15(MULT16_16_Q15(f,g10),x2)
- + MULT16_32_Q15(MULT16_16_Q15(f,g11),ADD32(x1,x3))
- + MULT16_32_Q15(MULT16_16_Q15(f,g12),ADD32(x0,x4));
- x4=x3;
- x3=x2;
- x2=x1;
- x1=x0;
-
- }
- if (g1==0)
- {
- /* OPT: Happens to work without the OPUS_MOVE(), but only because the current encoder already copies x to y */
- if (x!=y)
- OPUS_MOVE(y+overlap, x+overlap, N-overlap);
- return;
- }
-
- /* Compute the part with the constant filter. */
- comb_filter_const(y+i, x+i, T1, N-i, g10, g11, g12);
-}
-
-const signed char tf_select_table[4][8] = {
- {0, -1, 0, -1, 0,-1, 0,-1},
- {0, -1, 0, -2, 1, 0, 1,-1},
- {0, -2, 0, -3, 2, 0, 1,-1},
- {0, -2, 0, -3, 3, 0, 1,-1},
-};
-
-
-void init_caps(const CELTMode *m,int *cap,int LM,int C)
-{
- int i;
- for (i=0;i<m->nbEBands;i++)
- {
- int N;
- N=(m->eBands[i+1]-m->eBands[i])<<LM;
- cap[i] = (m->cache.caps[m->nbEBands*(2*LM+C-1)+i]+64)*C*N>>2;
- }
-}
-
-
-
-const char *opus_strerror(int error)
-{
- static const char * const error_strings[8] = {
- "success",
- "invalid argument",
- "buffer too small",
- "internal error",
- "corrupted stream",
- "request not implemented",
- "invalid state",
- "memory allocation failed"
- };
- if (error > 0 || error < -7)
- return "unknown error";
- else
- return error_strings[-error];
-}
-
-const char *opus_get_version_string(void)
-{
- return "libopus " PACKAGE_VERSION
-#ifdef FIXED_POINT
- "-fixed"
-#endif
-#ifdef FUZZING
- "-fuzzing"
-#endif
- ;
-}
diff --git a/src/opus-1.1/celt/celt.h b/src/opus-1.1/celt/celt.h
deleted file mode 100644
index 5deea1f0..00000000
--- a/src/opus-1.1/celt/celt.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Copyright (c) 2008 Gregory Maxwell
- Written by Jean-Marc Valin and Gregory Maxwell */
-/**
- @file celt.h
- @brief Contains all the functions for encoding and decoding audio
- */
-
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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 CELT_H
-#define CELT_H
-
-#include "opus_types.h"
-#include "opus_defines.h"
-#include "opus_custom.h"
-#include "entenc.h"
-#include "entdec.h"
-#include "arch.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define CELTEncoder OpusCustomEncoder
-#define CELTDecoder OpusCustomDecoder
-#define CELTMode OpusCustomMode
-
-typedef struct {
- int valid;
- float tonality;
- float tonality_slope;
- float noisiness;
- float activity;
- float music_prob;
- int bandwidth;
-}AnalysisInfo;
-
-#define __celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (const CELTMode**)(ptr)))
-
-#define __celt_check_analysis_ptr(ptr) ((ptr) + ((ptr) - (const AnalysisInfo*)(ptr)))
-
-/* Encoder/decoder Requests */
-
-/* Expose this option again when variable framesize actually works */
-#define OPUS_FRAMESIZE_VARIABLE 5010 /**< Optimize the frame size dynamically */
-
-
-#define CELT_SET_PREDICTION_REQUEST 10002
-/** Controls the use of interframe prediction.
- 0=Independent frames
- 1=Short term interframe prediction allowed
- 2=Long term prediction allowed
- */
-#define CELT_SET_PREDICTION(x) CELT_SET_PREDICTION_REQUEST, __opus_check_int(x)
-
-#define CELT_SET_INPUT_CLIPPING_REQUEST 10004
-#define CELT_SET_INPUT_CLIPPING(x) CELT_SET_INPUT_CLIPPING_REQUEST, __opus_check_int(x)
-
-#define CELT_GET_AND_CLEAR_ERROR_REQUEST 10007
-#define CELT_GET_AND_CLEAR_ERROR(x) CELT_GET_AND_CLEAR_ERROR_REQUEST, __opus_check_int_ptr(x)
-
-#define CELT_SET_CHANNELS_REQUEST 10008
-#define CELT_SET_CHANNELS(x) CELT_SET_CHANNELS_REQUEST, __opus_check_int(x)
-
-
-/* Internal */
-#define CELT_SET_START_BAND_REQUEST 10010
-#define CELT_SET_START_BAND(x) CELT_SET_START_BAND_REQUEST, __opus_check_int(x)
-
-#define CELT_SET_END_BAND_REQUEST 10012
-#define CELT_SET_END_BAND(x) CELT_SET_END_BAND_REQUEST, __opus_check_int(x)
-
-#define CELT_GET_MODE_REQUEST 10015
-/** Get the CELTMode used by an encoder or decoder */
-#define CELT_GET_MODE(x) CELT_GET_MODE_REQUEST, __celt_check_mode_ptr_ptr(x)
-
-#define CELT_SET_SIGNALLING_REQUEST 10016
-#define CELT_SET_SIGNALLING(x) CELT_SET_SIGNALLING_REQUEST, __opus_check_int(x)
-
-#define CELT_SET_TONALITY_REQUEST 10018
-#define CELT_SET_TONALITY(x) CELT_SET_TONALITY_REQUEST, __opus_check_int(x)
-#define CELT_SET_TONALITY_SLOPE_REQUEST 10020
-#define CELT_SET_TONALITY_SLOPE(x) CELT_SET_TONALITY_SLOPE_REQUEST, __opus_check_int(x)
-
-#define CELT_SET_ANALYSIS_REQUEST 10022
-#define CELT_SET_ANALYSIS(x) CELT_SET_ANALYSIS_REQUEST, __celt_check_analysis_ptr(x)
-
-#define OPUS_SET_LFE_REQUEST 10024
-#define OPUS_SET_LFE(x) OPUS_SET_LFE_REQUEST, __opus_check_int(x)
-
-#define OPUS_SET_ENERGY_MASK_REQUEST 10026
-#define OPUS_SET_ENERGY_MASK(x) OPUS_SET_ENERGY_MASK_REQUEST, __opus_check_val16_ptr(x)
-
-/* Encoder stuff */
-
-int celt_encoder_get_size(int channels);
-
-int celt_encode_with_ec(OpusCustomEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc);
-
-int celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels,
- int arch);
-
-
-
-/* Decoder stuff */
-
-int celt_decoder_get_size(int channels);
-
-
-int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels);
-
-int celt_decode_with_ec(OpusCustomDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec);
-
-#define celt_encoder_ctl opus_custom_encoder_ctl
-#define celt_decoder_ctl opus_custom_decoder_ctl
-
-
-#ifdef CUSTOM_MODES
-#define OPUS_CUSTOM_NOSTATIC
-#else
-#define OPUS_CUSTOM_NOSTATIC static OPUS_INLINE
-#endif
-
-static const unsigned char trim_icdf[11] = {126, 124, 119, 109, 87, 41, 19, 9, 4, 2, 0};
-/* Probs: NONE: 21.875%, LIGHT: 6.25%, NORMAL: 65.625%, AGGRESSIVE: 6.25% */
-static const unsigned char spread_icdf[4] = {25, 23, 2, 0};
-
-static const unsigned char tapset_icdf[3]={2,1,0};
-
-#ifdef CUSTOM_MODES
-static const unsigned char toOpusTable[20] = {
- 0xE0, 0xE8, 0xF0, 0xF8,
- 0xC0, 0xC8, 0xD0, 0xD8,
- 0xA0, 0xA8, 0xB0, 0xB8,
- 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x88, 0x90, 0x98,
-};
-
-static const unsigned char fromOpusTable[16] = {
- 0x80, 0x88, 0x90, 0x98,
- 0x40, 0x48, 0x50, 0x58,
- 0x20, 0x28, 0x30, 0x38,
- 0x00, 0x08, 0x10, 0x18
-};
-
-static OPUS_INLINE int toOpus(unsigned char c)
-{
- int ret=0;
- if (c<0xA0)
- ret = toOpusTable[c>>3];
- if (ret == 0)
- return -1;
- else
- return ret|(c&0x7);
-}
-
-static OPUS_INLINE int fromOpus(unsigned char c)
-{
- if (c<0x80)
- return -1;
- else
- return fromOpusTable[(c>>3)-16] | (c&0x7);
-}
-#endif /* CUSTOM_MODES */
-
-#define COMBFILTER_MAXPERIOD 1024
-#define COMBFILTER_MINPERIOD 15
-
-extern const signed char tf_select_table[4][8];
-
-int resampling_factor(opus_int32 rate);
-
-void celt_preemphasis(const opus_val16 * OPUS_RESTRICT pcmp, celt_sig * OPUS_RESTRICT inp,
- int N, int CC, int upsample, const opus_val16 *coef, celt_sig *mem, int clip);
-
-void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N,
- opus_val16 g0, opus_val16 g1, int tapset0, int tapset1,
- const opus_val16 *window, int overlap);
-
-void init_caps(const CELTMode *m,int *cap,int LM,int C);
-
-#ifdef RESYNTH
-void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, const opus_val16 *coef, celt_sig *mem, celt_sig * OPUS_RESTRICT scratch);
-
-void compute_inv_mdcts(const CELTMode *mode, int shortBlocks, celt_sig *X,
- celt_sig * OPUS_RESTRICT out_mem[], int C, int LM);
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* CELT_H */
diff --git a/src/opus-1.1/celt/celt_decoder.c b/src/opus-1.1/celt/celt_decoder.c
deleted file mode 100644
index 830398ee..00000000
--- a/src/opus-1.1/celt/celt_decoder.c
+++ /dev/null
@@ -1,1195 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2010 Xiph.Org Foundation
- Copyright (c) 2008 Gregory Maxwell
- Written by Jean-Marc Valin and Gregory Maxwell */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#define CELT_DECODER_C
-
-#include "cpu_support.h"
-#include "os_support.h"
-#include "mdct.h"
-#include <math.h>
-#include "celt.h"
-#include "pitch.h"
-#include "bands.h"
-#include "modes.h"
-#include "entcode.h"
-#include "quant_bands.h"
-#include "rate.h"
-#include "stack_alloc.h"
-#include "mathops.h"
-#include "float_cast.h"
-#include <stdarg.h>
-#include "celt_lpc.h"
-#include "vq.h"
-
-/**********************************************************************/
-/* */
-/* DECODER */
-/* */
-/**********************************************************************/
-#define DECODE_BUFFER_SIZE 2048
-
-/** Decoder state
- @brief Decoder state
- */
-struct OpusCustomDecoder {
- const OpusCustomMode *mode;
- int overlap;
- int channels;
- int stream_channels;
-
- int downsample;
- int start, end;
- int signalling;
- int arch;
-
- /* Everything beyond this point gets cleared on a reset */
-#define DECODER_RESET_START rng
-
- opus_uint32 rng;
- int error;
- int last_pitch_index;
- int loss_count;
- int postfilter_period;
- int postfilter_period_old;
- opus_val16 postfilter_gain;
- opus_val16 postfilter_gain_old;
- int postfilter_tapset;
- int postfilter_tapset_old;
-
- celt_sig preemph_memD[2];
-
- celt_sig _decode_mem[1]; /* Size = channels*(DECODE_BUFFER_SIZE+mode->overlap) */
- /* opus_val16 lpc[], Size = channels*LPC_ORDER */
- /* opus_val16 oldEBands[], Size = 2*mode->nbEBands */
- /* opus_val16 oldLogE[], Size = 2*mode->nbEBands */
- /* opus_val16 oldLogE2[], Size = 2*mode->nbEBands */
- /* opus_val16 backgroundLogE[], Size = 2*mode->nbEBands */
-};
-
-int celt_decoder_get_size(int channels)
-{
- const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL);
- return opus_custom_decoder_get_size(mode, channels);
-}
-
-OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_get_size(const CELTMode *mode, int channels)
-{
- int size = sizeof(struct CELTDecoder)
- + (channels*(DECODE_BUFFER_SIZE+mode->overlap)-1)*sizeof(celt_sig)
- + channels*LPC_ORDER*sizeof(opus_val16)
- + 4*2*mode->nbEBands*sizeof(opus_val16);
- return size;
-}
-
-#ifdef CUSTOM_MODES
-CELTDecoder *opus_custom_decoder_create(const CELTMode *mode, int channels, int *error)
-{
- int ret;
- CELTDecoder *st = (CELTDecoder *)opus_alloc(opus_custom_decoder_get_size(mode, channels));
- ret = opus_custom_decoder_init(st, mode, channels);
- if (ret != OPUS_OK)
- {
- opus_custom_decoder_destroy(st);
- st = NULL;
- }
- if (error)
- *error = ret;
- return st;
-}
-#endif /* CUSTOM_MODES */
-
-int celt_decoder_init(CELTDecoder *st, opus_int32 sampling_rate, int channels)
-{
- int ret;
- ret = opus_custom_decoder_init(st, opus_custom_mode_create(48000, 960, NULL), channels);
- if (ret != OPUS_OK)
- return ret;
- st->downsample = resampling_factor(sampling_rate);
- if (st->downsample==0)
- return OPUS_BAD_ARG;
- else
- return OPUS_OK;
-}
-
-OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels)
-{
- if (channels < 0 || channels > 2)
- return OPUS_BAD_ARG;
-
- if (st==NULL)
- return OPUS_ALLOC_FAIL;
-
- OPUS_CLEAR((char*)st, opus_custom_decoder_get_size(mode, channels));
-
- st->mode = mode;
- st->overlap = mode->overlap;
- st->stream_channels = st->channels = channels;
-
- st->downsample = 1;
- st->start = 0;
- st->end = st->mode->effEBands;
- st->signalling = 1;
- st->arch = opus_select_arch();
-
- st->loss_count = 0;
-
- opus_custom_decoder_ctl(st, OPUS_RESET_STATE);
-
- return OPUS_OK;
-}
-
-#ifdef CUSTOM_MODES
-void opus_custom_decoder_destroy(CELTDecoder *st)
-{
- opus_free(st);
-}
-#endif /* CUSTOM_MODES */
-
-static OPUS_INLINE opus_val16 SIG2WORD16(celt_sig x)
-{
-#ifdef FIXED_POINT
- x = PSHR32(x, SIG_SHIFT);
- x = MAX32(x, -32768);
- x = MIN32(x, 32767);
- return EXTRACT16(x);
-#else
- return (opus_val16)x;
-#endif
-}
-
-#ifndef RESYNTH
-static
-#endif
-void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, const opus_val16 *coef, celt_sig *mem, celt_sig * OPUS_RESTRICT scratch)
-{
- int c;
- int Nd;
- int apply_downsampling=0;
- opus_val16 coef0;
-
- coef0 = coef[0];
- Nd = N/downsample;
- c=0; do {
- int j;
- celt_sig * OPUS_RESTRICT x;
- opus_val16 * OPUS_RESTRICT y;
- celt_sig m = mem[c];
- x =in[c];
- y = pcm+c;
-#ifdef CUSTOM_MODES
- if (coef[1] != 0)
- {
- opus_val16 coef1 = coef[1];
- opus_val16 coef3 = coef[3];
- for (j=0;j<N;j++)
- {
- celt_sig tmp = x[j] + m + VERY_SMALL;
- m = MULT16_32_Q15(coef0, tmp)
- - MULT16_32_Q15(coef1, x[j]);
- tmp = SHL32(MULT16_32_Q15(coef3, tmp), 2);
- scratch[j] = tmp;
- }
- apply_downsampling=1;
- } else
-#endif
- if (downsample>1)
- {
- /* Shortcut for the standard (non-custom modes) case */
- for (j=0;j<N;j++)
- {
- celt_sig tmp = x[j] + m + VERY_SMALL;
- m = MULT16_32_Q15(coef0, tmp);
- scratch[j] = tmp;
- }
- apply_downsampling=1;
- } else {
- /* Shortcut for the standard (non-custom modes) case */
- for (j=0;j<N;j++)
- {
- celt_sig tmp = x[j] + m + VERY_SMALL;
- m = MULT16_32_Q15(coef0, tmp);
- y[j*C] = SCALEOUT(SIG2WORD16(tmp));
- }
- }
- mem[c] = m;
-
- if (apply_downsampling)
- {
- /* Perform down-sampling */
- for (j=0;j<Nd;j++)
- y[j*C] = SCALEOUT(SIG2WORD16(scratch[j*downsample]));
- }
- } while (++c<C);
-}
-
-/** Compute the IMDCT and apply window for all sub-frames and
- all channels in a frame */
-#ifndef RESYNTH
-static
-#endif
-void compute_inv_mdcts(const CELTMode *mode, int shortBlocks, celt_sig *X,
- celt_sig * OPUS_RESTRICT out_mem[], int C, int LM)
-{
- int b, c;
- int B;
- int N;
- int shift;
- const int overlap = OVERLAP(mode);
-
- if (shortBlocks)
- {
- B = shortBlocks;
- N = mode->shortMdctSize;
- shift = mode->maxLM;
- } else {
- B = 1;
- N = mode->shortMdctSize<<LM;
- shift = mode->maxLM-LM;
- }
- c=0; do {
- /* IMDCT on the interleaved the sub-frames, overlap-add is performed by the IMDCT */
- for (b=0;b<B;b++)
- clt_mdct_backward(&mode->mdct, &X[b+c*N*B], out_mem[c]+N*b, mode->window, overlap, shift, B);
- } while (++c<C);
-}
-
-static void tf_decode(int start, int end, int isTransient, int *tf_res, int LM, ec_dec *dec)
-{
- int i, curr, tf_select;
- int tf_select_rsv;
- int tf_changed;
- int logp;
- opus_uint32 budget;
- opus_uint32 tell;
-
- budget = dec->storage*8;
- tell = ec_tell(dec);
- logp = isTransient ? 2 : 4;
- tf_select_rsv = LM>0 && tell+logp+1<=budget;
- budget -= tf_select_rsv;
- tf_changed = curr = 0;
- for (i=start;i<end;i++)
- {
- if (tell+logp<=budget)
- {
- curr ^= ec_dec_bit_logp(dec, logp);
- tell = ec_tell(dec);
- tf_changed |= curr;
- }
- tf_res[i] = curr;
- logp = isTransient ? 4 : 5;
- }
- tf_select = 0;
- if (tf_select_rsv &&
- tf_select_table[LM][4*isTransient+0+tf_changed] !=
- tf_select_table[LM][4*isTransient+2+tf_changed])
- {
- tf_select = ec_dec_bit_logp(dec, 1);
- }
- for (i=start;i<end;i++)
- {
- tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+tf_res[i]];
- }
-}
-
-/* The maximum pitch lag to allow in the pitch-based PLC. It's possible to save
- CPU time in the PLC pitch search by making this smaller than MAX_PERIOD. The
- current value corresponds to a pitch of 66.67 Hz. */
-#define PLC_PITCH_LAG_MAX (720)
-/* The minimum pitch lag to allow in the pitch-based PLC. This corresponds to a
- pitch of 480 Hz. */
-#define PLC_PITCH_LAG_MIN (100)
-
-static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, opus_val16 * OPUS_RESTRICT pcm, int N, int LM)
-{
- int c;
- int i;
- const int C = st->channels;
- celt_sig *decode_mem[2];
- celt_sig *out_syn[2];
- opus_val16 *lpc;
- opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
- const OpusCustomMode *mode;
- int nbEBands;
- int overlap;
- int start;
- int downsample;
- int loss_count;
- int noise_based;
- const opus_int16 *eBands;
- VARDECL(celt_sig, scratch);
- SAVE_STACK;
-
- mode = st->mode;
- nbEBands = mode->nbEBands;
- overlap = mode->overlap;
- eBands = mode->eBands;
-
- c=0; do {
- decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap);
- out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N;
- } while (++c<C);
- lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*C);
- oldBandE = lpc+C*LPC_ORDER;
- oldLogE = oldBandE + 2*nbEBands;
- oldLogE2 = oldLogE + 2*nbEBands;
- backgroundLogE = oldLogE2 + 2*nbEBands;
-
- loss_count = st->loss_count;
- start = st->start;
- downsample = st->downsample;
- noise_based = loss_count >= 5 || start != 0;
- ALLOC(scratch, noise_based?N*C:N, celt_sig);
- if (noise_based)
- {
- /* Noise-based PLC/CNG */
- celt_sig *freq;
- VARDECL(celt_norm, X);
- opus_uint32 seed;
- opus_val16 *plcLogE;
- int end;
- int effEnd;
-
- end = st->end;
- effEnd = IMAX(start, IMIN(end, mode->effEBands));
-
- /* Share the interleaved signal MDCT coefficient buffer with the
- deemphasis scratch buffer. */
- freq = scratch;
- ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */
-
- if (loss_count >= 5)
- plcLogE = backgroundLogE;
- else {
- /* Energy decay */
- opus_val16 decay = loss_count==0 ?
- QCONST16(1.5f, DB_SHIFT) : QCONST16(.5f, DB_SHIFT);
- c=0; do
- {
- for (i=start;i<end;i++)
- oldBandE[c*nbEBands+i] -= decay;
- } while (++c<C);
- plcLogE = oldBandE;
- }
- seed = st->rng;
- for (c=0;c<C;c++)
- {
- for (i=start;i<effEnd;i++)
- {
- int j;
- int boffs;
- int blen;
- boffs = N*c+(eBands[i]<<LM);
- blen = (eBands[i+1]-eBands[i])<<LM;
- for (j=0;j<blen;j++)
- {
- seed = celt_lcg_rand(seed);
- X[boffs+j] = (celt_norm)((opus_int32)seed>>20);
- }
- renormalise_vector(X+boffs, blen, Q15ONE);
- }
- }
- st->rng = seed;
-
- denormalise_bands(mode, X, freq, plcLogE, start, effEnd, C, 1<<LM);
-
- c=0; do {
- int bound = eBands[effEnd]<<LM;
- if (downsample!=1)
- bound = IMIN(bound, N/downsample);
- for (i=bound;i<N;i++)
- freq[c*N+i] = 0;
- } while (++c<C);
- c=0; do {
- OPUS_MOVE(decode_mem[c], decode_mem[c]+N,
- DECODE_BUFFER_SIZE-N+(overlap>>1));
- } while (++c<C);
- compute_inv_mdcts(mode, 0, freq, out_syn, C, LM);
- } else {
- /* Pitch-based PLC */
- const opus_val16 *window;
- opus_val16 fade = Q15ONE;
- int pitch_index;
- VARDECL(opus_val32, etmp);
- VARDECL(opus_val16, exc);
-
- if (loss_count == 0)
- {
- VARDECL( opus_val16, lp_pitch_buf );
- ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 );
- pitch_downsample(decode_mem, lp_pitch_buf,
- DECODE_BUFFER_SIZE, C, st->arch);
- pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf,
- DECODE_BUFFER_SIZE-PLC_PITCH_LAG_MAX,
- PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, st->arch);
- pitch_index = PLC_PITCH_LAG_MAX-pitch_index;
- st->last_pitch_index = pitch_index;
- } else {
- pitch_index = st->last_pitch_index;
- fade = QCONST16(.8f,15);
- }
-
- ALLOC(etmp, overlap, opus_val32);
- ALLOC(exc, MAX_PERIOD, opus_val16);
- window = mode->window;
- c=0; do {
- opus_val16 decay;
- opus_val16 attenuation;
- opus_val32 S1=0;
- celt_sig *buf;
- int extrapolation_offset;
- int extrapolation_len;
- int exc_length;
- int j;
-
- buf = decode_mem[c];
- for (i=0;i<MAX_PERIOD;i++) {
- exc[i] = ROUND16(buf[DECODE_BUFFER_SIZE-MAX_PERIOD+i], SIG_SHIFT);
- }
-
- if (loss_count == 0)
- {
- opus_val32 ac[LPC_ORDER+1];
- /* Compute LPC coefficients for the last MAX_PERIOD samples before
- the first loss so we can work in the excitation-filter domain. */
- _celt_autocorr(exc, ac, window, overlap,
- LPC_ORDER, MAX_PERIOD, st->arch);
- /* Add a noise floor of -40 dB. */
-#ifdef FIXED_POINT
- ac[0] += SHR32(ac[0],13);
-#else
- ac[0] *= 1.0001f;
-#endif
- /* Use lag windowing to stabilize the Levinson-Durbin recursion. */
- for (i=1;i<=LPC_ORDER;i++)
- {
- /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
-#ifdef FIXED_POINT
- ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
-#else
- ac[i] -= ac[i]*(0.008f*0.008f)*i*i;
-#endif
- }
- _celt_lpc(lpc+c*LPC_ORDER, ac, LPC_ORDER);
- }
- /* We want the excitation for 2 pitch periods in order to look for a
- decaying signal, but we can't get more than MAX_PERIOD. */
- exc_length = IMIN(2*pitch_index, MAX_PERIOD);
- /* Initialize the LPC history with the samples just before the start
- of the region for which we're computing the excitation. */
- {
- opus_val16 lpc_mem[LPC_ORDER];
- for (i=0;i<LPC_ORDER;i++)
- {
- lpc_mem[i] =
- ROUND16(buf[DECODE_BUFFER_SIZE-exc_length-1-i], SIG_SHIFT);
- }
- /* Compute the excitation for exc_length samples before the loss. */
- celt_fir(exc+MAX_PERIOD-exc_length, lpc+c*LPC_ORDER,
- exc+MAX_PERIOD-exc_length, exc_length, LPC_ORDER, lpc_mem);
- }
-
- /* Check if the waveform is decaying, and if so how fast.
- We do this to avoid adding energy when concealing in a segment
- with decaying energy. */
- {
- opus_val32 E1=1, E2=1;
- int decay_length;
-#ifdef FIXED_POINT
- int shift = IMAX(0,2*celt_zlog2(celt_maxabs16(&exc[MAX_PERIOD-exc_length], exc_length))-20);
-#endif
- decay_length = exc_length>>1;
- for (i=0;i<decay_length;i++)
- {
- opus_val16 e;
- e = exc[MAX_PERIOD-decay_length+i];
- E1 += SHR32(MULT16_16(e, e), shift);
- e = exc[MAX_PERIOD-2*decay_length+i];
- E2 += SHR32(MULT16_16(e, e), shift);
- }
- E1 = MIN32(E1, E2);
- decay = celt_sqrt(frac_div32(SHR32(E1, 1), E2));
- }
-
- /* Move the decoder memory one frame to the left to give us room to
- add the data for the new frame. We ignore the overlap that extends
- past the end of the buffer, because we aren't going to use it. */
- OPUS_MOVE(buf, buf+N, DECODE_BUFFER_SIZE-N);
-
- /* Extrapolate from the end of the excitation with a period of
- "pitch_index", scaling down each period by an additional factor of
- "decay". */
- extrapolation_offset = MAX_PERIOD-pitch_index;
- /* We need to extrapolate enough samples to cover a complete MDCT
- window (including overlap/2 samples on both sides). */
- extrapolation_len = N+overlap;
- /* We also apply fading if this is not the first loss. */
- attenuation = MULT16_16_Q15(fade, decay);
- for (i=j=0;i<extrapolation_len;i++,j++)
- {
- opus_val16 tmp;
- if (j >= pitch_index) {
- j -= pitch_index;
- attenuation = MULT16_16_Q15(attenuation, decay);
- }
- buf[DECODE_BUFFER_SIZE-N+i] =
- SHL32(EXTEND32(MULT16_16_Q15(attenuation,
- exc[extrapolation_offset+j])), SIG_SHIFT);
- /* Compute the energy of the previously decoded signal whose
- excitation we're copying. */
- tmp = ROUND16(
- buf[DECODE_BUFFER_SIZE-MAX_PERIOD-N+extrapolation_offset+j],
- SIG_SHIFT);
- S1 += SHR32(MULT16_16(tmp, tmp), 8);
- }
-
- {
- opus_val16 lpc_mem[LPC_ORDER];
- /* Copy the last decoded samples (prior to the overlap region) to
- synthesis filter memory so we can have a continuous signal. */
- for (i=0;i<LPC_ORDER;i++)
- lpc_mem[i] = ROUND16(buf[DECODE_BUFFER_SIZE-N-1-i], SIG_SHIFT);
- /* Apply the synthesis filter to convert the excitation back into
- the signal domain. */
- celt_iir(buf+DECODE_BUFFER_SIZE-N, lpc+c*LPC_ORDER,
- buf+DECODE_BUFFER_SIZE-N, extrapolation_len, LPC_ORDER,
- lpc_mem);
- }
-
- /* Check if the synthesis energy is higher than expected, which can
- happen with the signal changes during our window. If so,
- attenuate. */
- {
- opus_val32 S2=0;
- for (i=0;i<extrapolation_len;i++)
- {
- opus_val16 tmp = ROUND16(buf[DECODE_BUFFER_SIZE-N+i], SIG_SHIFT);
- S2 += SHR32(MULT16_16(tmp, tmp), 8);
- }
- /* This checks for an "explosion" in the synthesis. */
-#ifdef FIXED_POINT
- if (!(S1 > SHR32(S2,2)))
-#else
- /* The float test is written this way to catch NaNs in the output
- of the IIR filter at the same time. */
- if (!(S1 > 0.2f*S2))
-#endif
- {
- for (i=0;i<extrapolation_len;i++)
- buf[DECODE_BUFFER_SIZE-N+i] = 0;
- } else if (S1 < S2)
- {
- opus_val16 ratio = celt_sqrt(frac_div32(SHR32(S1,1)+1,S2+1));
- for (i=0;i<overlap;i++)
- {
- opus_val16 tmp_g = Q15ONE
- - MULT16_16_Q15(window[i], Q15ONE-ratio);
- buf[DECODE_BUFFER_SIZE-N+i] =
- MULT16_32_Q15(tmp_g, buf[DECODE_BUFFER_SIZE-N+i]);
- }
- for (i=overlap;i<extrapolation_len;i++)
- {
- buf[DECODE_BUFFER_SIZE-N+i] =
- MULT16_32_Q15(ratio, buf[DECODE_BUFFER_SIZE-N+i]);
- }
- }
- }
-
- /* Apply the pre-filter to the MDCT overlap for the next frame because
- the post-filter will be re-applied in the decoder after the MDCT
- overlap. */
- comb_filter(etmp, buf+DECODE_BUFFER_SIZE,
- st->postfilter_period, st->postfilter_period, overlap,
- -st->postfilter_gain, -st->postfilter_gain,
- st->postfilter_tapset, st->postfilter_tapset, NULL, 0);
-
- /* Simulate TDAC on the concealed audio so that it blends with the
- MDCT of the next frame. */
- for (i=0;i<overlap/2;i++)
- {
- buf[DECODE_BUFFER_SIZE+i] =
- MULT16_32_Q15(window[i], etmp[overlap-1-i])
- + MULT16_32_Q15(window[overlap-i-1], etmp[i]);
- }
- } while (++c<C);
- }
-
- deemphasis(out_syn, pcm, N, C, downsample,
- mode->preemph, st->preemph_memD, scratch);
-
- st->loss_count = loss_count+1;
-
- RESTORE_STACK;
-}
-
-int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_val16 * OPUS_RESTRICT pcm, int frame_size, ec_dec *dec)
-{
- int c, i, N;
- int spread_decision;
- opus_int32 bits;
- ec_dec _dec;
- VARDECL(celt_sig, freq);
- VARDECL(celt_norm, X);
- VARDECL(int, fine_quant);
- VARDECL(int, pulses);
- VARDECL(int, cap);
- VARDECL(int, offsets);
- VARDECL(int, fine_priority);
- VARDECL(int, tf_res);
- VARDECL(unsigned char, collapse_masks);
- celt_sig *decode_mem[2];
- celt_sig *out_syn[2];
- opus_val16 *lpc;
- opus_val16 *oldBandE, *oldLogE, *oldLogE2, *backgroundLogE;
-
- int shortBlocks;
- int isTransient;
- int intra_ener;
- const int CC = st->channels;
- int LM, M;
- int effEnd;
- int codedBands;
- int alloc_trim;
- int postfilter_pitch;
- opus_val16 postfilter_gain;
- int intensity=0;
- int dual_stereo=0;
- opus_int32 total_bits;
- opus_int32 balance;
- opus_int32 tell;
- int dynalloc_logp;
- int postfilter_tapset;
- int anti_collapse_rsv;
- int anti_collapse_on=0;
- int silence;
- int C = st->stream_channels;
- const OpusCustomMode *mode;
- int nbEBands;
- int overlap;
- const opus_int16 *eBands;
- ALLOC_STACK;
-
- mode = st->mode;
- nbEBands = mode->nbEBands;
- overlap = mode->overlap;
- eBands = mode->eBands;
- frame_size *= st->downsample;
-
- c=0; do {
- decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap);
- } while (++c<CC);
- lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+overlap)*CC);
- oldBandE = lpc+CC*LPC_ORDER;
- oldLogE = oldBandE + 2*nbEBands;
- oldLogE2 = oldLogE + 2*nbEBands;
- backgroundLogE = oldLogE2 + 2*nbEBands;
-
-#ifdef CUSTOM_MODES
- if (st->signalling && data!=NULL)
- {
- int data0=data[0];
- /* Convert "standard mode" to Opus header */
- if (mode->Fs==48000 && mode->shortMdctSize==120)
- {
- data0 = fromOpus(data0);
- if (data0<0)
- return OPUS_INVALID_PACKET;
- }
- st->end = IMAX(1, mode->effEBands-2*(data0>>5));
- LM = (data0>>3)&0x3;
- C = 1 + ((data0>>2)&0x1);
- data++;
- len--;
- if (LM>mode->maxLM)
- return OPUS_INVALID_PACKET;
- if (frame_size < mode->shortMdctSize<<LM)
- return OPUS_BUFFER_TOO_SMALL;
- else
- frame_size = mode->shortMdctSize<<LM;
- } else {
-#else
- {
-#endif
- for (LM=0;LM<=mode->maxLM;LM++)
- if (mode->shortMdctSize<<LM==frame_size)
- break;
- if (LM>mode->maxLM)
- return OPUS_BAD_ARG;
- }
- M=1<<LM;
-
- if (len<0 || len>1275 || pcm==NULL)
- return OPUS_BAD_ARG;
-
- N = M*mode->shortMdctSize;
-
- effEnd = st->end;
- if (effEnd > mode->effEBands)
- effEnd = mode->effEBands;
-
- if (data == NULL || len<=1)
- {
- celt_decode_lost(st, pcm, N, LM);
- RESTORE_STACK;
- return frame_size/st->downsample;
- }
-
- if (dec == NULL)
- {
- ec_dec_init(&_dec,(unsigned char*)data,len);
- dec = &_dec;
- }
-
- if (C==1)
- {
- for (i=0;i<nbEBands;i++)
- oldBandE[i]=MAX16(oldBandE[i],oldBandE[nbEBands+i]);
- }
-
- total_bits = len*8;
- tell = ec_tell(dec);
-
- if (tell >= total_bits)
- silence = 1;
- else if (tell==1)
- silence = ec_dec_bit_logp(dec, 15);
- else
- silence = 0;
- if (silence)
- {
- /* Pretend we've read all the remaining bits */
- tell = len*8;
- dec->nbits_total+=tell-ec_tell(dec);
- }
-
- postfilter_gain = 0;
- postfilter_pitch = 0;
- postfilter_tapset = 0;
- if (st->start==0 && tell+16 <= total_bits)
- {
- if(ec_dec_bit_logp(dec, 1))
- {
- int qg, octave;
- octave = ec_dec_uint(dec, 6);
- postfilter_pitch = (16<<octave)+ec_dec_bits(dec, 4+octave)-1;
- qg = ec_dec_bits(dec, 3);
- if (ec_tell(dec)+2<=total_bits)
- postfilter_tapset = ec_dec_icdf(dec, tapset_icdf, 2);
- postfilter_gain = QCONST16(.09375f,15)*(qg+1);
- }
- tell = ec_tell(dec);
- }
-
- if (LM > 0 && tell+3 <= total_bits)
- {
- isTransient = ec_dec_bit_logp(dec, 3);
- tell = ec_tell(dec);
- }
- else
- isTransient = 0;
-
- if (isTransient)
- shortBlocks = M;
- else
- shortBlocks = 0;
-
- /* Decode the global flags (first symbols in the stream) */
- intra_ener = tell+3<=total_bits ? ec_dec_bit_logp(dec, 3) : 0;
- /* Get band energies */
- unquant_coarse_energy(mode, st->start, st->end, oldBandE,
- intra_ener, dec, C, LM);
-
- ALLOC(tf_res, nbEBands, int);
- tf_decode(st->start, st->end, isTransient, tf_res, LM, dec);
-
- tell = ec_tell(dec);
- spread_decision = SPREAD_NORMAL;
- if (tell+4 <= total_bits)
- spread_decision = ec_dec_icdf(dec, spread_icdf, 5);
-
- ALLOC(cap, nbEBands, int);
-
- init_caps(mode,cap,LM,C);
-
- ALLOC(offsets, nbEBands, int);
-
- dynalloc_logp = 6;
- total_bits<<=BITRES;
- tell = ec_tell_frac(dec);
- for (i=st->start;i<st->end;i++)
- {
- int width, quanta;
- int dynalloc_loop_logp;
- int boost;
- width = C*(eBands[i+1]-eBands[i])<<LM;
- /* quanta is 6 bits, but no more than 1 bit/sample
- and no less than 1/8 bit/sample */
- quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
- dynalloc_loop_logp = dynalloc_logp;
- boost = 0;
- while (tell+(dynalloc_loop_logp<<BITRES) < total_bits && boost < cap[i])
- {
- int flag;
- flag = ec_dec_bit_logp(dec, dynalloc_loop_logp);
- tell = ec_tell_frac(dec);
- if (!flag)
- break;
- boost += quanta;
- total_bits -= quanta;
- dynalloc_loop_logp = 1;
- }
- offsets[i] = boost;
- /* Making dynalloc more likely */
- if (boost>0)
- dynalloc_logp = IMAX(2, dynalloc_logp-1);
- }
-
- ALLOC(fine_quant, nbEBands, int);
- alloc_trim = tell+(6<<BITRES) <= total_bits ?
- ec_dec_icdf(dec, trim_icdf, 7) : 5;
-
- bits = (((opus_int32)len*8)<<BITRES) - ec_tell_frac(dec) - 1;
- anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
- bits -= anti_collapse_rsv;
-
- ALLOC(pulses, nbEBands, int);
- ALLOC(fine_priority, nbEBands, int);
-
- codedBands = compute_allocation(mode, st->start, st->end, offsets, cap,
- alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
- fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
-
- unquant_fine_energy(mode, st->start, st->end, oldBandE, fine_quant, dec, C);
-
- /* Decode fixed codebook */
- ALLOC(collapse_masks, C*nbEBands, unsigned char);
- ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */
-
- quant_all_bands(0, mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_masks,
- NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
- len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng);
-
- if (anti_collapse_rsv > 0)
- {
- anti_collapse_on = ec_dec_bits(dec, 1);
- }
-
- unquant_energy_finalise(mode, st->start, st->end, oldBandE,
- fine_quant, fine_priority, len*8-ec_tell(dec), dec, C);
-
- if (anti_collapse_on)
- anti_collapse(mode, X, collapse_masks, LM, C, N,
- st->start, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng);
-
- ALLOC(freq, IMAX(CC,C)*N, celt_sig); /**< Interleaved signal MDCTs */
-
- if (silence)
- {
- for (i=0;i<C*nbEBands;i++)
- oldBandE[i] = -QCONST16(28.f,DB_SHIFT);
- for (i=0;i<C*N;i++)
- freq[i] = 0;
- } else {
- /* Synthesis */
- denormalise_bands(mode, X, freq, oldBandE, st->start, effEnd, C, M);
- }
- c=0; do {
- OPUS_MOVE(decode_mem[c], decode_mem[c]+N, DECODE_BUFFER_SIZE-N+overlap/2);
- } while (++c<CC);
-
- c=0; do {
- int bound = M*eBands[effEnd];
- if (st->downsample!=1)
- bound = IMIN(bound, N/st->downsample);
- for (i=bound;i<N;i++)
- freq[c*N+i] = 0;
- } while (++c<C);
-
- c=0; do {
- out_syn[c] = decode_mem[c]+DECODE_BUFFER_SIZE-N;
- } while (++c<CC);
-
- if (CC==2&&C==1)
- {
- for (i=0;i<N;i++)
- freq[N+i] = freq[i];
- }
- if (CC==1&&C==2)
- {
- for (i=0;i<N;i++)
- freq[i] = HALF32(ADD32(freq[i],freq[N+i]));
- }
-
- /* Compute inverse MDCTs */
- compute_inv_mdcts(mode, shortBlocks, freq, out_syn, CC, LM);
-
- c=0; do {
- st->postfilter_period=IMAX(st->postfilter_period, COMBFILTER_MINPERIOD);
- st->postfilter_period_old=IMAX(st->postfilter_period_old, COMBFILTER_MINPERIOD);
- comb_filter(out_syn[c], out_syn[c], st->postfilter_period_old, st->postfilter_period, mode->shortMdctSize,
- st->postfilter_gain_old, st->postfilter_gain, st->postfilter_tapset_old, st->postfilter_tapset,
- mode->window, overlap);
- if (LM!=0)
- comb_filter(out_syn[c]+mode->shortMdctSize, out_syn[c]+mode->shortMdctSize, st->postfilter_period, postfilter_pitch, N-mode->shortMdctSize,
- st->postfilter_gain, postfilter_gain, st->postfilter_tapset, postfilter_tapset,
- mode->window, overlap);
-
- } while (++c<CC);
- st->postfilter_period_old = st->postfilter_period;
- st->postfilter_gain_old = st->postfilter_gain;
- st->postfilter_tapset_old = st->postfilter_tapset;
- st->postfilter_period = postfilter_pitch;
- st->postfilter_gain = postfilter_gain;
- st->postfilter_tapset = postfilter_tapset;
- if (LM!=0)
- {
- st->postfilter_period_old = st->postfilter_period;
- st->postfilter_gain_old = st->postfilter_gain;
- st->postfilter_tapset_old = st->postfilter_tapset;
- }
-
- if (C==1) {
- for (i=0;i<nbEBands;i++)
- oldBandE[nbEBands+i]=oldBandE[i];
- }
-
- /* In case start or end were to change */
- if (!isTransient)
- {
- for (i=0;i<2*nbEBands;i++)
- oldLogE2[i] = oldLogE[i];
- for (i=0;i<2*nbEBands;i++)
- oldLogE[i] = oldBandE[i];
- for (i=0;i<2*nbEBands;i++)
- backgroundLogE[i] = MIN16(backgroundLogE[i] + M*QCONST16(0.001f,DB_SHIFT), oldBandE[i]);
- } else {
- for (i=0;i<2*nbEBands;i++)
- oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]);
- }
- c=0; do
- {
- for (i=0;i<st->start;i++)
- {
- oldBandE[c*nbEBands+i]=0;
- oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT);
- }
- for (i=st->end;i<nbEBands;i++)
- {
- oldBandE[c*nbEBands+i]=0;
- oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT);
- }
- } while (++c<2);
- st->rng = dec->rng;
-
- /* We reuse freq[] as scratch space for the de-emphasis */
- deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, freq);
- st->loss_count = 0;
- RESTORE_STACK;
- if (ec_tell(dec) > 8*len)
- return OPUS_INTERNAL_ERROR;
- if(ec_get_error(dec))
- st->error = 1;
- return frame_size/st->downsample;
-}
-
-
-#ifdef CUSTOM_MODES
-
-#ifdef FIXED_POINT
-int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size)
-{
- return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL);
-}
-
-#ifndef DISABLE_FLOAT_API
-int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size)
-{
- int j, ret, C, N;
- VARDECL(opus_int16, out);
- ALLOC_STACK;
-
- if (pcm==NULL)
- return OPUS_BAD_ARG;
-
- C = st->channels;
- N = frame_size;
-
- ALLOC(out, C*N, opus_int16);
- ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL);
- if (ret>0)
- for (j=0;j<C*ret;j++)
- pcm[j]=out[j]*(1.f/32768.f);
-
- RESTORE_STACK;
- return ret;
-}
-#endif /* DISABLE_FLOAT_API */
-
-#else
-
-int opus_custom_decode_float(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, float * OPUS_RESTRICT pcm, int frame_size)
-{
- return celt_decode_with_ec(st, data, len, pcm, frame_size, NULL);
-}
-
-int opus_custom_decode(CELTDecoder * OPUS_RESTRICT st, const unsigned char *data, int len, opus_int16 * OPUS_RESTRICT pcm, int frame_size)
-{
- int j, ret, C, N;
- VARDECL(celt_sig, out);
- ALLOC_STACK;
-
- if (pcm==NULL)
- return OPUS_BAD_ARG;
-
- C = st->channels;
- N = frame_size;
- ALLOC(out, C*N, celt_sig);
-
- ret=celt_decode_with_ec(st, data, len, out, frame_size, NULL);
-
- if (ret>0)
- for (j=0;j<C*ret;j++)
- pcm[j] = FLOAT2INT16 (out[j]);
-
- RESTORE_STACK;
- return ret;
-}
-
-#endif
-#endif /* CUSTOM_MODES */
-
-int opus_custom_decoder_ctl(CELTDecoder * OPUS_RESTRICT st, int request, ...)
-{
- va_list ap;
-
- va_start(ap, request);
- switch (request)
- {
- case CELT_SET_START_BAND_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- if (value<0 || value>=st->mode->nbEBands)
- goto bad_arg;
- st->start = value;
- }
- break;
- case CELT_SET_END_BAND_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- if (value<1 || value>st->mode->nbEBands)
- goto bad_arg;
- st->end = value;
- }
- break;
- case CELT_SET_CHANNELS_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- if (value<1 || value>2)
- goto bad_arg;
- st->stream_channels = value;
- }
- break;
- case CELT_GET_AND_CLEAR_ERROR_REQUEST:
- {
- opus_int32 *value = va_arg(ap, opus_int32*);
- if (value==NULL)
- goto bad_arg;
- *value=st->error;
- st->error = 0;
- }
- break;
- case OPUS_GET_LOOKAHEAD_REQUEST:
- {
- opus_int32 *value = va_arg(ap, opus_int32*);
- if (value==NULL)
- goto bad_arg;
- *value = st->overlap/st->downsample;
- }
- break;
- case OPUS_RESET_STATE:
- {
- int i;
- opus_val16 *lpc, *oldBandE, *oldLogE, *oldLogE2;
- lpc = (opus_val16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*st->channels);
- oldBandE = lpc+st->channels*LPC_ORDER;
- oldLogE = oldBandE + 2*st->mode->nbEBands;
- oldLogE2 = oldLogE + 2*st->mode->nbEBands;
- OPUS_CLEAR((char*)&st->DECODER_RESET_START,
- opus_custom_decoder_get_size(st->mode, st->channels)-
- ((char*)&st->DECODER_RESET_START - (char*)st));
- for (i=0;i<2*st->mode->nbEBands;i++)
- oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT);
- }
- break;
- case OPUS_GET_PITCH_REQUEST:
- {
- opus_int32 *value = va_arg(ap, opus_int32*);
- if (value==NULL)
- goto bad_arg;
- *value = st->postfilter_period;
- }
- break;
- case CELT_GET_MODE_REQUEST:
- {
- const CELTMode ** value = va_arg(ap, const CELTMode**);
- if (value==0)
- goto bad_arg;
- *value=st->mode;
- }
- break;
- case CELT_SET_SIGNALLING_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- st->signalling = value;
- }
- break;
- case OPUS_GET_FINAL_RANGE_REQUEST:
- {
- opus_uint32 * value = va_arg(ap, opus_uint32 *);
- if (value==0)
- goto bad_arg;
- *value=st->rng;
- }
- break;
- default:
- goto bad_request;
- }
- va_end(ap);
- return OPUS_OK;
-bad_arg:
- va_end(ap);
- return OPUS_BAD_ARG;
-bad_request:
- va_end(ap);
- return OPUS_UNIMPLEMENTED;
-}
diff --git a/src/opus-1.1/celt/celt_encoder.c b/src/opus-1.1/celt/celt_encoder.c
deleted file mode 100644
index ffff0775..00000000
--- a/src/opus-1.1/celt/celt_encoder.c
+++ /dev/null
@@ -1,2353 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2010 Xiph.Org Foundation
- Copyright (c) 2008 Gregory Maxwell
- Written by Jean-Marc Valin and Gregory Maxwell */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#define CELT_ENCODER_C
-
-#include "cpu_support.h"
-#include "os_support.h"
-#include "mdct.h"
-#include <math.h>
-#include "celt.h"
-#include "pitch.h"
-#include "bands.h"
-#include "modes.h"
-#include "entcode.h"
-#include "quant_bands.h"
-#include "rate.h"
-#include "stack_alloc.h"
-#include "mathops.h"
-#include "float_cast.h"
-#include <stdarg.h>
-#include "celt_lpc.h"
-#include "vq.h"
-
-
-/** Encoder state
- @brief Encoder state
- */
-struct OpusCustomEncoder {
- const OpusCustomMode *mode; /**< Mode used by the encoder */
- int overlap;
- int channels;
- int stream_channels;
-
- int force_intra;
- int clip;
- int disable_pf;
- int complexity;
- int upsample;
- int start, end;
-
- opus_int32 bitrate;
- int vbr;
- int signalling;
- int constrained_vbr; /* If zero, VBR can do whatever it likes with the rate */
- int loss_rate;
- int lsb_depth;
- int variable_duration;
- int lfe;
- int arch;
-
- /* Everything beyond this point gets cleared on a reset */
-#define ENCODER_RESET_START rng
-
- opus_uint32 rng;
- int spread_decision;
- opus_val32 delayedIntra;
- int tonal_average;
- int lastCodedBands;
- int hf_average;
- int tapset_decision;
-
- int prefilter_period;
- opus_val16 prefilter_gain;
- int prefilter_tapset;
-#ifdef RESYNTH
- int prefilter_period_old;
- opus_val16 prefilter_gain_old;
- int prefilter_tapset_old;
-#endif
- int consec_transient;
- AnalysisInfo analysis;
-
- opus_val32 preemph_memE[2];
- opus_val32 preemph_memD[2];
-
- /* VBR-related parameters */
- opus_int32 vbr_reservoir;
- opus_int32 vbr_drift;
- opus_int32 vbr_offset;
- opus_int32 vbr_count;
- opus_val32 overlap_max;
- opus_val16 stereo_saving;
- int intensity;
- opus_val16 *energy_mask;
- opus_val16 spec_avg;
-
-#ifdef RESYNTH
- /* +MAX_PERIOD/2 to make space for overlap */
- celt_sig syn_mem[2][2*MAX_PERIOD+MAX_PERIOD/2];
-#endif
-
- celt_sig in_mem[1]; /* Size = channels*mode->overlap */
- /* celt_sig prefilter_mem[], Size = channels*COMBFILTER_MAXPERIOD */
- /* opus_val16 oldBandE[], Size = channels*mode->nbEBands */
- /* opus_val16 oldLogE[], Size = channels*mode->nbEBands */
- /* opus_val16 oldLogE2[], Size = channels*mode->nbEBands */
-};
-
-int celt_encoder_get_size(int channels)
-{
- CELTMode *mode = opus_custom_mode_create(48000, 960, NULL);
- return opus_custom_encoder_get_size(mode, channels);
-}
-
-OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int channels)
-{
- int size = sizeof(struct CELTEncoder)
- + (channels*mode->overlap-1)*sizeof(celt_sig) /* celt_sig in_mem[channels*mode->overlap]; */
- + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) /* celt_sig prefilter_mem[channels*COMBFILTER_MAXPERIOD]; */
- + 3*channels*mode->nbEBands*sizeof(opus_val16); /* opus_val16 oldBandE[channels*mode->nbEBands]; */
- /* opus_val16 oldLogE[channels*mode->nbEBands]; */
- /* opus_val16 oldLogE2[channels*mode->nbEBands]; */
- return size;
-}
-
-#ifdef CUSTOM_MODES
-CELTEncoder *opus_custom_encoder_create(const CELTMode *mode, int channels, int *error)
-{
- int ret;
- CELTEncoder *st = (CELTEncoder *)opus_alloc(opus_custom_encoder_get_size(mode, channels));
- /* init will handle the NULL case */
- ret = opus_custom_encoder_init(st, mode, channels);
- if (ret != OPUS_OK)
- {
- opus_custom_encoder_destroy(st);
- st = NULL;
- }
- if (error)
- *error = ret;
- return st;
-}
-#endif /* CUSTOM_MODES */
-
-static int opus_custom_encoder_init_arch(CELTEncoder *st, const CELTMode *mode,
- int channels, int arch)
-{
- if (channels < 0 || channels > 2)
- return OPUS_BAD_ARG;
-
- if (st==NULL || mode==NULL)
- return OPUS_ALLOC_FAIL;
-
- OPUS_CLEAR((char*)st, opus_custom_encoder_get_size(mode, channels));
-
- st->mode = mode;
- st->overlap = mode->overlap;
- st->stream_channels = st->channels = channels;
-
- st->upsample = 1;
- st->start = 0;
- st->end = st->mode->effEBands;
- st->signalling = 1;
-
- st->arch = arch;
-
- st->constrained_vbr = 1;
- st->clip = 1;
-
- st->bitrate = OPUS_BITRATE_MAX;
- st->vbr = 0;
- st->force_intra = 0;
- st->complexity = 5;
- st->lsb_depth=24;
-
- opus_custom_encoder_ctl(st, OPUS_RESET_STATE);
-
- return OPUS_OK;
-}
-
-#ifdef CUSTOM_MODES
-int opus_custom_encoder_init(CELTEncoder *st, const CELTMode *mode, int channels)
-{
- return opus_custom_encoder_init_arch(st, mode, channels, opus_select_arch());
-}
-#endif
-
-int celt_encoder_init(CELTEncoder *st, opus_int32 sampling_rate, int channels,
- int arch)
-{
- int ret;
- ret = opus_custom_encoder_init_arch(st,
- opus_custom_mode_create(48000, 960, NULL), channels, arch);
- if (ret != OPUS_OK)
- return ret;
- st->upsample = resampling_factor(sampling_rate);
- return OPUS_OK;
-}
-
-#ifdef CUSTOM_MODES
-void opus_custom_encoder_destroy(CELTEncoder *st)
-{
- opus_free(st);
-}
-#endif /* CUSTOM_MODES */
-
-
-static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int C,
- opus_val16 *tf_estimate, int *tf_chan)
-{
- int i;
- VARDECL(opus_val16, tmp);
- opus_val32 mem0,mem1;
- int is_transient = 0;
- opus_int32 mask_metric = 0;
- int c;
- opus_val16 tf_max;
- int len2;
- /* Table of 6*64/x, trained on real data to minimize the average error */
- static const unsigned char inv_table[128] = {
- 255,255,156,110, 86, 70, 59, 51, 45, 40, 37, 33, 31, 28, 26, 25,
- 23, 22, 21, 20, 19, 18, 17, 16, 16, 15, 15, 14, 13, 13, 12, 12,
- 12, 12, 11, 11, 11, 10, 10, 10, 9, 9, 9, 9, 9, 9, 8, 8,
- 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2,
- };
- SAVE_STACK;
- ALLOC(tmp, len, opus_val16);
-
- len2=len/2;
- for (c=0;c<C;c++)
- {
- opus_val32 mean;
- opus_int32 unmask=0;
- opus_val32 norm;
- opus_val16 maxE;
- mem0=0;
- mem1=0;
- /* High-pass filter: (1 - 2*z^-1 + z^-2) / (1 - z^-1 + .5*z^-2) */
- for (i=0;i<len;i++)
- {
- opus_val32 x,y;
- x = SHR32(in[i+c*len],SIG_SHIFT);
- y = ADD32(mem0, x);
-#ifdef FIXED_POINT
- mem0 = mem1 + y - SHL32(x,1);
- mem1 = x - SHR32(y,1);
-#else
- mem0 = mem1 + y - 2*x;
- mem1 = x - .5f*y;
-#endif
- tmp[i] = EXTRACT16(SHR32(y,2));
- /*printf("%f ", tmp[i]);*/
- }
- /*printf("\n");*/
- /* First few samples are bad because we don't propagate the memory */
- for (i=0;i<12;i++)
- tmp[i] = 0;
-
-#ifdef FIXED_POINT
- /* Normalize tmp to max range */
- {
- int shift=0;
- shift = 14-celt_ilog2(1+celt_maxabs16(tmp, len));
- if (shift!=0)
- {
- for (i=0;i<len;i++)
- tmp[i] = SHL16(tmp[i], shift);
- }
- }
-#endif
-
- mean=0;
- mem0=0;
- /* Grouping by two to reduce complexity */
- /* Forward pass to compute the post-echo threshold*/
- for (i=0;i<len2;i++)
- {
- opus_val16 x2 = PSHR32(MULT16_16(tmp[2*i],tmp[2*i]) + MULT16_16(tmp[2*i+1],tmp[2*i+1]),16);
- mean += x2;
-#ifdef FIXED_POINT
- /* FIXME: Use PSHR16() instead */
- tmp[i] = mem0 + PSHR32(x2-mem0,4);
-#else
- tmp[i] = mem0 + MULT16_16_P15(QCONST16(.0625f,15),x2-mem0);
-#endif
- mem0 = tmp[i];
- }
-
- mem0=0;
- maxE=0;
- /* Backward pass to compute the pre-echo threshold */
- for (i=len2-1;i>=0;i--)
- {
-#ifdef FIXED_POINT
- /* FIXME: Use PSHR16() instead */
- tmp[i] = mem0 + PSHR32(tmp[i]-mem0,3);
-#else
- tmp[i] = mem0 + MULT16_16_P15(QCONST16(0.125f,15),tmp[i]-mem0);
-#endif
- mem0 = tmp[i];
- maxE = MAX16(maxE, mem0);
- }
- /*for (i=0;i<len2;i++)printf("%f ", tmp[i]/mean);printf("\n");*/
-
- /* Compute the ratio of the "frame energy" over the harmonic mean of the energy.
- This essentially corresponds to a bitrate-normalized temporal noise-to-mask
- ratio */
-
- /* As a compromise with the old transient detector, frame energy is the
- geometric mean of the energy and half the max */
-#ifdef FIXED_POINT
- /* Costs two sqrt() to avoid overflows */
- mean = MULT16_16(celt_sqrt(mean), celt_sqrt(MULT16_16(maxE,len2>>1)));
-#else
- mean = celt_sqrt(mean * maxE*.5*len2);
-#endif
- /* Inverse of the mean energy in Q15+6 */
- norm = SHL32(EXTEND32(len2),6+14)/ADD32(EPSILON,SHR32(mean,1));
- /* Compute harmonic mean discarding the unreliable boundaries
- The data is smooth, so we only take 1/4th of the samples */
- unmask=0;
- for (i=12;i<len2-5;i+=4)
- {
- int id;
-#ifdef FIXED_POINT
- id = IMAX(0,IMIN(127,MULT16_32_Q15(tmp[i],norm))); /* Do not round to nearest */
-#else
- id = IMAX(0,IMIN(127,(int)floor(64*norm*tmp[i]))); /* Do not round to nearest */
-#endif
- unmask += inv_table[id];
- }
- /*printf("%d\n", unmask);*/
- /* Normalize, compensate for the 1/4th of the sample and the factor of 6 in the inverse table */
- unmask = 64*unmask*4/(6*(len2-17));
- if (unmask>mask_metric)
- {
- *tf_chan = c;
- mask_metric = unmask;
- }
- }
- is_transient = mask_metric>200;
-
- /* Arbitrary metric for VBR boost */
- tf_max = MAX16(0,celt_sqrt(27*mask_metric)-42);
- /* *tf_estimate = 1 + MIN16(1, sqrt(MAX16(0, tf_max-30))/20); */
- *tf_estimate = celt_sqrt(MAX16(0, SHL32(MULT16_16(QCONST16(0.0069,14),MIN16(163,tf_max)),14)-QCONST32(0.139,28)));
- /*printf("%d %f\n", tf_max, mask_metric);*/
- RESTORE_STACK;
-#ifdef FUZZING
- is_transient = rand()&0x1;
-#endif
- /*printf("%d %f %d\n", is_transient, (float)*tf_estimate, tf_max);*/
- return is_transient;
-}
-
-/* Looks for sudden increases of energy to decide whether we need to patch
- the transient decision */
-int patch_transient_decision(opus_val16 *newE, opus_val16 *oldE, int nbEBands,
- int end, int C)
-{
- int i, c;
- opus_val32 mean_diff=0;
- opus_val16 spread_old[26];
- /* Apply an aggressive (-6 dB/Bark) spreading function to the old frame to
- avoid false detection caused by irrelevant bands */
- if (C==1)
- {
- spread_old[0] = oldE[0];
- for (i=1;i<end;i++)
- spread_old[i] = MAX16(spread_old[i-1]-QCONST16(1.0f, DB_SHIFT), oldE[i]);
- } else {
- spread_old[0] = MAX16(oldE[0],oldE[nbEBands]);
- for (i=1;i<end;i++)
- spread_old[i] = MAX16(spread_old[i-1]-QCONST16(1.0f, DB_SHIFT),
- MAX16(oldE[i],oldE[i+nbEBands]));
- }
- for (i=end-2;i>=0;i--)
- spread_old[i] = MAX16(spread_old[i], spread_old[i+1]-QCONST16(1.0f, DB_SHIFT));
- /* Compute mean increase */
- c=0; do {
- for (i=2;i<end-1;i++)
- {
- opus_val16 x1, x2;
- x1 = MAX16(0, newE[i]);
- x2 = MAX16(0, spread_old[i]);
- mean_diff = ADD32(mean_diff, EXTEND32(MAX16(0, SUB16(x1, x2))));
- }
- } while (++c<C);
- mean_diff = DIV32(mean_diff, C*(end-3));
- /*printf("%f %f %d\n", mean_diff, max_diff, count);*/
- return mean_diff > QCONST16(1.f, DB_SHIFT);
-}
-
-/** Apply window and compute the MDCT for all sub-frames and
- all channels in a frame */
-static void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * OPUS_RESTRICT in,
- celt_sig * OPUS_RESTRICT out, int C, int CC, int LM, int upsample)
-{
- const int overlap = OVERLAP(mode);
- int N;
- int B;
- int shift;
- int i, b, c;
- if (shortBlocks)
- {
- B = shortBlocks;
- N = mode->shortMdctSize;
- shift = mode->maxLM;
- } else {
- B = 1;
- N = mode->shortMdctSize<<LM;
- shift = mode->maxLM-LM;
- }
- c=0; do {
- for (b=0;b<B;b++)
- {
- /* Interleaving the sub-frames while doing the MDCTs */
- clt_mdct_forward(&mode->mdct, in+c*(B*N+overlap)+b*N, &out[b+c*N*B], mode->window, overlap, shift, B);
- }
- } while (++c<CC);
- if (CC==2&&C==1)
- {
- for (i=0;i<B*N;i++)
- out[i] = ADD32(HALF32(out[i]), HALF32(out[B*N+i]));
- }
- if (upsample != 1)
- {
- c=0; do
- {
- int bound = B*N/upsample;
- for (i=0;i<bound;i++)
- out[c*B*N+i] *= upsample;
- for (;i<B*N;i++)
- out[c*B*N+i] = 0;
- } while (++c<C);
- }
-}
-
-
-void celt_preemphasis(const opus_val16 * OPUS_RESTRICT pcmp, celt_sig * OPUS_RESTRICT inp,
- int N, int CC, int upsample, const opus_val16 *coef, celt_sig *mem, int clip)
-{
- int i;
- opus_val16 coef0;
- celt_sig m;
- int Nu;
-
- coef0 = coef[0];
-
-
- Nu = N/upsample;
- if (upsample!=1)
- {
- for (i=0;i<N;i++)
- inp[i] = 0;
- }
- for (i=0;i<Nu;i++)
- {
- celt_sig x;
-
- x = SCALEIN(pcmp[CC*i]);
-#ifndef FIXED_POINT
- /* Replace NaNs with zeros */
- if (!(x==x))
- x = 0;
-#endif
- inp[i*upsample] = x;
- }
-
-#ifndef FIXED_POINT
- if (clip)
- {
- /* Clip input to avoid encoding non-portable files */
- for (i=0;i<Nu;i++)
- inp[i*upsample] = MAX32(-65536.f, MIN32(65536.f,inp[i*upsample]));
- }
-#else
- (void)clip; /* Avoids a warning about clip being unused. */
-#endif
- m = *mem;
-#ifdef CUSTOM_MODES
- if (coef[1] != 0)
- {
- opus_val16 coef1 = coef[1];
- opus_val16 coef2 = coef[2];
- for (i=0;i<N;i++)
- {
- celt_sig x, tmp;
- x = inp[i];
- /* Apply pre-emphasis */
- tmp = MULT16_16(coef2, x);
- inp[i] = tmp + m;
- m = MULT16_32_Q15(coef1, inp[i]) - MULT16_32_Q15(coef0, tmp);
- }
- } else
-#endif
- {
- for (i=0;i<N;i++)
- {
- celt_sig x;
- x = SHL32(inp[i], SIG_SHIFT);
- /* Apply pre-emphasis */
- inp[i] = x + m;
- m = - MULT16_32_Q15(coef0, x);
- }
- }
- *mem = m;
-}
-
-
-
-static opus_val32 l1_metric(const celt_norm *tmp, int N, int LM, opus_val16 bias)
-{
- int i;
- opus_val32 L1;
- L1 = 0;
- for (i=0;i<N;i++)
- L1 += EXTEND32(ABS16(tmp[i]));
- /* When in doubt, prefer good freq resolution */
- L1 = MAC16_32_Q15(L1, LM*bias, L1);
- return L1;
-
-}
-
-static int tf_analysis(const CELTMode *m, int len, int isTransient,
- int *tf_res, int lambda, celt_norm *X, int N0, int LM,
- int *tf_sum, opus_val16 tf_estimate, int tf_chan)
-{
- int i;
- VARDECL(int, metric);
- int cost0;
- int cost1;
- VARDECL(int, path0);
- VARDECL(int, path1);
- VARDECL(celt_norm, tmp);
- VARDECL(celt_norm, tmp_1);
- int sel;
- int selcost[2];
- int tf_select=0;
- opus_val16 bias;
-
- SAVE_STACK;
- bias = MULT16_16_Q14(QCONST16(.04f,15), MAX16(-QCONST16(.25f,14), QCONST16(.5f,14)-tf_estimate));
- /*printf("%f ", bias);*/
-
- ALLOC(metric, len, int);
- ALLOC(tmp, (m->eBands[len]-m->eBands[len-1])<<LM, celt_norm);
- ALLOC(tmp_1, (m->eBands[len]-m->eBands[len-1])<<LM, celt_norm);
- ALLOC(path0, len, int);
- ALLOC(path1, len, int);
-
- *tf_sum = 0;
- for (i=0;i<len;i++)
- {
- int j, k, N;
- int narrow;
- opus_val32 L1, best_L1;
- int best_level=0;
- N = (m->eBands[i+1]-m->eBands[i])<<LM;
- /* band is too narrow to be split down to LM=-1 */
- narrow = (m->eBands[i+1]-m->eBands[i])==1;
- for (j=0;j<N;j++)
- tmp[j] = X[tf_chan*N0 + j+(m->eBands[i]<<LM)];
- /* Just add the right channel if we're in stereo */
- /*if (C==2)
- for (j=0;j<N;j++)
- tmp[j] = ADD16(SHR16(tmp[j], 1),SHR16(X[N0+j+(m->eBands[i]<<LM)], 1));*/
- L1 = l1_metric(tmp, N, isTransient ? LM : 0, bias);
- best_L1 = L1;
- /* Check the -1 case for transients */
- if (isTransient && !narrow)
- {
- for (j=0;j<N;j++)
- tmp_1[j] = tmp[j];
- haar1(tmp_1, N>>LM, 1<<LM);
- L1 = l1_metric(tmp_1, N, LM+1, bias);
- if (L1<best_L1)
- {
- best_L1 = L1;
- best_level = -1;
- }
- }
- /*printf ("%f ", L1);*/
- for (k=0;k<LM+!(isTransient||narrow);k++)
- {
- int B;
-
- if (isTransient)
- B = (LM-k-1);
- else
- B = k+1;
-
- haar1(tmp, N>>k, 1<<k);
-
- L1 = l1_metric(tmp, N, B, bias);
-
- if (L1 < best_L1)
- {
- best_L1 = L1;
- best_level = k+1;
- }
- }
- /*printf ("%d ", isTransient ? LM-best_level : best_level);*/
- /* metric is in Q1 to be able to select the mid-point (-0.5) for narrower bands */
- if (isTransient)
- metric[i] = 2*best_level;
- else
- metric[i] = -2*best_level;
- *tf_sum += (isTransient ? LM : 0) - metric[i]/2;
- /* For bands that can't be split to -1, set the metric to the half-way point to avoid
- biasing the decision */
- if (narrow && (metric[i]==0 || metric[i]==-2*LM))
- metric[i]-=1;
- /*printf("%d ", metric[i]);*/
- }
- /*printf("\n");*/
- /* Search for the optimal tf resolution, including tf_select */
- tf_select = 0;
- for (sel=0;sel<2;sel++)
- {
- cost0 = 0;
- cost1 = isTransient ? 0 : lambda;
- for (i=1;i<len;i++)
- {
- int curr0, curr1;
- curr0 = IMIN(cost0, cost1 + lambda);
- curr1 = IMIN(cost0 + lambda, cost1);
- cost0 = curr0 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+0]);
- cost1 = curr1 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+1]);
- }
- cost0 = IMIN(cost0, cost1);
- selcost[sel]=cost0;
- }
- /* For now, we're conservative and only allow tf_select=1 for transients.
- * If tests confirm it's useful for non-transients, we could allow it. */
- if (selcost[1]<selcost[0] && isTransient)
- tf_select=1;
- cost0 = 0;
- cost1 = isTransient ? 0 : lambda;
- /* Viterbi forward pass */
- for (i=1;i<len;i++)
- {
- int curr0, curr1;
- int from0, from1;
-
- from0 = cost0;
- from1 = cost1 + lambda;
- if (from0 < from1)
- {
- curr0 = from0;
- path0[i]= 0;
- } else {
- curr0 = from1;
- path0[i]= 1;
- }
-
- from0 = cost0 + lambda;
- from1 = cost1;
- if (from0 < from1)
- {
- curr1 = from0;
- path1[i]= 0;
- } else {
- curr1 = from1;
- path1[i]= 1;
- }
- cost0 = curr0 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+0]);
- cost1 = curr1 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+1]);
- }
- tf_res[len-1] = cost0 < cost1 ? 0 : 1;
- /* Viterbi backward pass to check the decisions */
- for (i=len-2;i>=0;i--)
- {
- if (tf_res[i+1] == 1)
- tf_res[i] = path1[i+1];
- else
- tf_res[i] = path0[i+1];
- }
- /*printf("%d %f\n", *tf_sum, tf_estimate);*/
- RESTORE_STACK;
-#ifdef FUZZING
- tf_select = rand()&0x1;
- tf_res[0] = rand()&0x1;
- for (i=1;i<len;i++)
- tf_res[i] = tf_res[i-1] ^ ((rand()&0xF) == 0);
-#endif
- return tf_select;
-}
-
-static void tf_encode(int start, int end, int isTransient, int *tf_res, int LM, int tf_select, ec_enc *enc)
-{
- int curr, i;
- int tf_select_rsv;
- int tf_changed;
- int logp;
- opus_uint32 budget;
- opus_uint32 tell;
- budget = enc->storage*8;
- tell = ec_tell(enc);
- logp = isTransient ? 2 : 4;
- /* Reserve space to code the tf_select decision. */
- tf_select_rsv = LM>0 && tell+logp+1 <= budget;
- budget -= tf_select_rsv;
- curr = tf_changed = 0;
- for (i=start;i<end;i++)
- {
- if (tell+logp<=budget)
- {
- ec_enc_bit_logp(enc, tf_res[i] ^ curr, logp);
- tell = ec_tell(enc);
- curr = tf_res[i];
- tf_changed |= curr;
- }
- else
- tf_res[i] = curr;
- logp = isTransient ? 4 : 5;
- }
- /* Only code tf_select if it would actually make a difference. */
- if (tf_select_rsv &&
- tf_select_table[LM][4*isTransient+0+tf_changed]!=
- tf_select_table[LM][4*isTransient+2+tf_changed])
- ec_enc_bit_logp(enc, tf_select, 1);
- else
- tf_select = 0;
- for (i=start;i<end;i++)
- tf_res[i] = tf_select_table[LM][4*isTransient+2*tf_select+tf_res[i]];
- /*for(i=0;i<end;i++)printf("%d ", isTransient ? tf_res[i] : LM+tf_res[i]);printf("\n");*/
-}
-
-
-static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X,
- const opus_val16 *bandLogE, int end, int LM, int C, int N0,
- AnalysisInfo *analysis, opus_val16 *stereo_saving, opus_val16 tf_estimate,
- int intensity, opus_val16 surround_trim)
-{
- int i;
- opus_val32 diff=0;
- int c;
- int trim_index = 5;
- opus_val16 trim = QCONST16(5.f, 8);
- opus_val16 logXC, logXC2;
- if (C==2)
- {
- opus_val16 sum = 0; /* Q10 */
- opus_val16 minXC; /* Q10 */
- /* Compute inter-channel correlation for low frequencies */
- for (i=0;i<8;i++)
- {
- int j;
- opus_val32 partial = 0;
- for (j=m->eBands[i]<<LM;j<m->eBands[i+1]<<LM;j++)
- partial = MAC16_16(partial, X[j], X[N0+j]);
- sum = ADD16(sum, EXTRACT16(SHR32(partial, 18)));
- }
- sum = MULT16_16_Q15(QCONST16(1.f/8, 15), sum);
- sum = MIN16(QCONST16(1.f, 10), ABS16(sum));
- minXC = sum;
- for (i=8;i<intensity;i++)
- {
- int j;
- opus_val32 partial = 0;
- for (j=m->eBands[i]<<LM;j<m->eBands[i+1]<<LM;j++)
- partial = MAC16_16(partial, X[j], X[N0+j]);
- minXC = MIN16(minXC, ABS16(EXTRACT16(SHR32(partial, 18))));
- }
- minXC = MIN16(QCONST16(1.f, 10), ABS16(minXC));
- /*printf ("%f\n", sum);*/
- if (sum > QCONST16(.995f,10))
- trim_index-=4;
- else if (sum > QCONST16(.92f,10))
- trim_index-=3;
- else if (sum > QCONST16(.85f,10))
- trim_index-=2;
- else if (sum > QCONST16(.8f,10))
- trim_index-=1;
- /* mid-side savings estimations based on the LF average*/
- logXC = celt_log2(QCONST32(1.001f, 20)-MULT16_16(sum, sum));
- /* mid-side savings estimations based on min correlation */
- logXC2 = MAX16(HALF16(logXC), celt_log2(QCONST32(1.001f, 20)-MULT16_16(minXC, minXC)));
-#ifdef FIXED_POINT
- /* Compensate for Q20 vs Q14 input and convert output to Q8 */
- logXC = PSHR32(logXC-QCONST16(6.f, DB_SHIFT),DB_SHIFT-8);
- logXC2 = PSHR32(logXC2-QCONST16(6.f, DB_SHIFT),DB_SHIFT-8);
-#endif
-
- trim += MAX16(-QCONST16(4.f, 8), MULT16_16_Q15(QCONST16(.75f,15),logXC));
- *stereo_saving = MIN16(*stereo_saving + QCONST16(0.25f, 8), -HALF16(logXC2));
- }
-
- /* Estimate spectral tilt */
- c=0; do {
- for (i=0;i<end-1;i++)
- {
- diff += bandLogE[i+c*m->nbEBands]*(opus_int32)(2+2*i-end);
- }
- } while (++c<C);
- diff /= C*(end-1);
- /*printf("%f\n", diff);*/
- if (diff > QCONST16(2.f, DB_SHIFT))
- trim_index--;
- if (diff > QCONST16(8.f, DB_SHIFT))
- trim_index--;
- if (diff < -QCONST16(4.f, DB_SHIFT))
- trim_index++;
- if (diff < -QCONST16(10.f, DB_SHIFT))
- trim_index++;
- trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), SHR16(diff+QCONST16(1.f, DB_SHIFT),DB_SHIFT-8)/6 ));
- trim -= SHR16(surround_trim, DB_SHIFT-8);
- trim -= 2*SHR16(tf_estimate, 14-8);
-#ifndef DISABLE_FLOAT_API
- if (analysis->valid)
- {
- trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8),
- (opus_val16)(QCONST16(2.f, 8)*(analysis->tonality_slope+.05f))));
- }
-#endif
-
-#ifdef FIXED_POINT
- trim_index = PSHR32(trim, 8);
-#else
- trim_index = (int)floor(.5f+trim);
-#endif
- if (trim_index<0)
- trim_index = 0;
- if (trim_index>10)
- trim_index = 10;
- /*printf("%d\n", trim_index);*/
-#ifdef FUZZING
- trim_index = rand()%11;
-#endif
- return trim_index;
-}
-
-static int stereo_analysis(const CELTMode *m, const celt_norm *X,
- int LM, int N0)
-{
- int i;
- int thetas;
- opus_val32 sumLR = EPSILON, sumMS = EPSILON;
-
- /* Use the L1 norm to model the entropy of the L/R signal vs the M/S signal */
- for (i=0;i<13;i++)
- {
- int j;
- for (j=m->eBands[i]<<LM;j<m->eBands[i+1]<<LM;j++)
- {
- opus_val32 L, R, M, S;
- /* We cast to 32-bit first because of the -32768 case */
- L = EXTEND32(X[j]);
- R = EXTEND32(X[N0+j]);
- M = ADD32(L, R);
- S = SUB32(L, R);
- sumLR = ADD32(sumLR, ADD32(ABS32(L), ABS32(R)));
- sumMS = ADD32(sumMS, ADD32(ABS32(M), ABS32(S)));
- }
- }
- sumMS = MULT16_32_Q15(QCONST16(0.707107f, 15), sumMS);
- thetas = 13;
- /* We don't need thetas for lower bands with LM<=1 */
- if (LM<=1)
- thetas -= 8;
- return MULT16_32_Q15((m->eBands[13]<<(LM+1))+thetas, sumMS)
- > MULT16_32_Q15(m->eBands[13]<<(LM+1), sumLR);
-}
-
-static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 *bandLogE2,
- int nbEBands, int start, int end, int C, int *offsets, int lsb_depth, const opus_int16 *logN,
- int isTransient, int vbr, int constrained_vbr, const opus_int16 *eBands, int LM,
- int effectiveBytes, opus_int32 *tot_boost_, int lfe, opus_val16 *surround_dynalloc)
-{
- int i, c;
- opus_int32 tot_boost=0;
- opus_val16 maxDepth;
- VARDECL(opus_val16, follower);
- VARDECL(opus_val16, noise_floor);
- SAVE_STACK;
- ALLOC(follower, C*nbEBands, opus_val16);
- ALLOC(noise_floor, C*nbEBands, opus_val16);
- for (i=0;i<nbEBands;i++)
- offsets[i] = 0;
- /* Dynamic allocation code */
- maxDepth=-QCONST16(31.9f, DB_SHIFT);
- for (i=0;i<end;i++)
- {
- /* Noise floor must take into account eMeans, the depth, the width of the bands
- and the preemphasis filter (approx. square of bark band ID) */
- noise_floor[i] = MULT16_16(QCONST16(0.0625f, DB_SHIFT),logN[i])
- +QCONST16(.5f,DB_SHIFT)+SHL16(9-lsb_depth,DB_SHIFT)-SHL16(eMeans[i],6)
- +MULT16_16(QCONST16(.0062,DB_SHIFT),(i+5)*(i+5));
- }
- c=0;do
- {
- for (i=0;i<end;i++)
- maxDepth = MAX16(maxDepth, bandLogE[c*nbEBands+i]-noise_floor[i]);
- } while (++c<C);
- /* Make sure that dynamic allocation can't make us bust the budget */
- if (effectiveBytes > 50 && LM>=1 && !lfe)
- {
- int last=0;
- c=0;do
- {
- follower[c*nbEBands] = bandLogE2[c*nbEBands];
- for (i=1;i<end;i++)
- {
- /* The last band to be at least 3 dB higher than the previous one
- is the last we'll consider. Otherwise, we run into problems on
- bandlimited signals. */
- if (bandLogE2[c*nbEBands+i] > bandLogE2[c*nbEBands+i-1]+QCONST16(.5f,DB_SHIFT))
- last=i;
- follower[c*nbEBands+i] = MIN16(follower[c*nbEBands+i-1]+QCONST16(1.5f,DB_SHIFT), bandLogE2[c*nbEBands+i]);
- }
- for (i=last-1;i>=0;i--)
- follower[c*nbEBands+i] = MIN16(follower[c*nbEBands+i], MIN16(follower[c*nbEBands+i+1]+QCONST16(2.f,DB_SHIFT), bandLogE2[c*nbEBands+i]));
- for (i=0;i<end;i++)
- follower[c*nbEBands+i] = MAX16(follower[c*nbEBands+i], noise_floor[i]);
- } while (++c<C);
- if (C==2)
- {
- for (i=start;i<end;i++)
- {
- /* Consider 24 dB "cross-talk" */
- follower[nbEBands+i] = MAX16(follower[nbEBands+i], follower[ i]-QCONST16(4.f,DB_SHIFT));
- follower[ i] = MAX16(follower[ i], follower[nbEBands+i]-QCONST16(4.f,DB_SHIFT));
- follower[i] = HALF16(MAX16(0, bandLogE[i]-follower[i]) + MAX16(0, bandLogE[nbEBands+i]-follower[nbEBands+i]));
- }
- } else {
- for (i=start;i<end;i++)
- {
- follower[i] = MAX16(0, bandLogE[i]-follower[i]);
- }
- }
- for (i=start;i<end;i++)
- follower[i] = MAX16(follower[i], surround_dynalloc[i]);
- /* For non-transient CBR/CVBR frames, halve the dynalloc contribution */
- if ((!vbr || constrained_vbr)&&!isTransient)
- {
- for (i=start;i<end;i++)
- follower[i] = HALF16(follower[i]);
- }
- for (i=start;i<end;i++)
- {
- int width;
- int boost;
- int boost_bits;
-
- if (i<8)
- follower[i] *= 2;
- if (i>=12)
- follower[i] = HALF16(follower[i]);
- follower[i] = MIN16(follower[i], QCONST16(4, DB_SHIFT));
-
- width = C*(eBands[i+1]-eBands[i])<<LM;
- if (width<6)
- {
- boost = (int)SHR32(EXTEND32(follower[i]),DB_SHIFT);
- boost_bits = boost*width<<BITRES;
- } else if (width > 48) {
- boost = (int)SHR32(EXTEND32(follower[i])*8,DB_SHIFT);
- boost_bits = (boost*width<<BITRES)/8;
- } else {
- boost = (int)SHR32(EXTEND32(follower[i])*width/6,DB_SHIFT);
- boost_bits = boost*6<<BITRES;
- }
- /* For CBR and non-transient CVBR frames, limit dynalloc to 1/4 of the bits */
- if ((!vbr || (constrained_vbr&&!isTransient))
- && (tot_boost+boost_bits)>>BITRES>>3 > effectiveBytes/4)
- {
- opus_int32 cap = ((effectiveBytes/4)<<BITRES<<3);
- offsets[i] = cap-tot_boost;
- tot_boost = cap;
- break;
- } else {
- offsets[i] = boost;
- tot_boost += boost_bits;
- }
- }
- }
- *tot_boost_ = tot_boost;
- RESTORE_STACK;
- return maxDepth;
-}
-
-
-static int run_prefilter(CELTEncoder *st, celt_sig *in, celt_sig *prefilter_mem, int CC, int N,
- int prefilter_tapset, int *pitch, opus_val16 *gain, int *qgain, int enabled, int nbAvailableBytes)
-{
- int c;
- VARDECL(celt_sig, _pre);
- celt_sig *pre[2];
- const CELTMode *mode;
- int pitch_index;
- opus_val16 gain1;
- opus_val16 pf_threshold;
- int pf_on;
- int qg;
- SAVE_STACK;
-
- mode = st->mode;
- ALLOC(_pre, CC*(N+COMBFILTER_MAXPERIOD), celt_sig);
-
- pre[0] = _pre;
- pre[1] = _pre + (N+COMBFILTER_MAXPERIOD);
-
-
- c=0; do {
- OPUS_COPY(pre[c], prefilter_mem+c*COMBFILTER_MAXPERIOD, COMBFILTER_MAXPERIOD);
- OPUS_COPY(pre[c]+COMBFILTER_MAXPERIOD, in+c*(N+st->overlap)+st->overlap, N);
- } while (++c<CC);
-
- if (enabled)
- {
- VARDECL(opus_val16, pitch_buf);
- ALLOC(pitch_buf, (COMBFILTER_MAXPERIOD+N)>>1, opus_val16);
-
- pitch_downsample(pre, pitch_buf, COMBFILTER_MAXPERIOD+N, CC, st->arch);
- /* Don't search for the fir last 1.5 octave of the range because
- there's too many false-positives due to short-term correlation */
- pitch_search(pitch_buf+(COMBFILTER_MAXPERIOD>>1), pitch_buf, N,
- COMBFILTER_MAXPERIOD-3*COMBFILTER_MINPERIOD, &pitch_index,
- st->arch);
- pitch_index = COMBFILTER_MAXPERIOD-pitch_index;
-
- gain1 = remove_doubling(pitch_buf, COMBFILTER_MAXPERIOD, COMBFILTER_MINPERIOD,
- N, &pitch_index, st->prefilter_period, st->prefilter_gain);
- if (pitch_index > COMBFILTER_MAXPERIOD-2)
- pitch_index = COMBFILTER_MAXPERIOD-2;
- gain1 = MULT16_16_Q15(QCONST16(.7f,15),gain1);
- /*printf("%d %d %f %f\n", pitch_change, pitch_index, gain1, st->analysis.tonality);*/
- if (st->loss_rate>2)
- gain1 = HALF32(gain1);
- if (st->loss_rate>4)
- gain1 = HALF32(gain1);
- if (st->loss_rate>8)
- gain1 = 0;
- } else {
- gain1 = 0;
- pitch_index = COMBFILTER_MINPERIOD;
- }
-
- /* Gain threshold for enabling the prefilter/postfilter */
- pf_threshold = QCONST16(.2f,15);
-
- /* Adjusting the threshold based on rate and continuity */
- if (abs(pitch_index-st->prefilter_period)*10>pitch_index)
- pf_threshold += QCONST16(.2f,15);
- if (nbAvailableBytes<25)
- pf_threshold += QCONST16(.1f,15);
- if (nbAvailableBytes<35)
- pf_threshold += QCONST16(.1f,15);
- if (st->prefilter_gain > QCONST16(.4f,15))
- pf_threshold -= QCONST16(.1f,15);
- if (st->prefilter_gain > QCONST16(.55f,15))
- pf_threshold -= QCONST16(.1f,15);
-
- /* Hard threshold at 0.2 */
- pf_threshold = MAX16(pf_threshold, QCONST16(.2f,15));
- if (gain1<pf_threshold)
- {
- gain1 = 0;
- pf_on = 0;
- qg = 0;
- } else {
- /*This block is not gated by a total bits check only because
- of the nbAvailableBytes check above.*/
- if (ABS16(gain1-st->prefilter_gain)<QCONST16(.1f,15))
- gain1=st->prefilter_gain;
-
-#ifdef FIXED_POINT
- qg = ((gain1+1536)>>10)/3-1;
-#else
- qg = (int)floor(.5f+gain1*32/3)-1;
-#endif
- qg = IMAX(0, IMIN(7, qg));
- gain1 = QCONST16(0.09375f,15)*(qg+1);
- pf_on = 1;
- }
- /*printf("%d %f\n", pitch_index, gain1);*/
-
- c=0; do {
- int offset = mode->shortMdctSize-st->overlap;
- st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD);
- OPUS_COPY(in+c*(N+st->overlap), st->in_mem+c*(st->overlap), st->overlap);
- if (offset)
- comb_filter(in+c*(N+st->overlap)+st->overlap, pre[c]+COMBFILTER_MAXPERIOD,
- st->prefilter_period, st->prefilter_period, offset, -st->prefilter_gain, -st->prefilter_gain,
- st->prefilter_tapset, st->prefilter_tapset, NULL, 0);
-
- comb_filter(in+c*(N+st->overlap)+st->overlap+offset, pre[c]+COMBFILTER_MAXPERIOD+offset,
- st->prefilter_period, pitch_index, N-offset, -st->prefilter_gain, -gain1,
- st->prefilter_tapset, prefilter_tapset, mode->window, st->overlap);
- OPUS_COPY(st->in_mem+c*(st->overlap), in+c*(N+st->overlap)+N, st->overlap);
-
- if (N>COMBFILTER_MAXPERIOD)
- {
- OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, pre[c]+N, COMBFILTER_MAXPERIOD);
- } else {
- OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, prefilter_mem+c*COMBFILTER_MAXPERIOD+N, COMBFILTER_MAXPERIOD-N);
- OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD+COMBFILTER_MAXPERIOD-N, pre[c]+COMBFILTER_MAXPERIOD, N);
- }
- } while (++c<CC);
-
- RESTORE_STACK;
- *gain = gain1;
- *pitch = pitch_index;
- *qgain = qg;
- return pf_on;
-}
-
-static int compute_vbr(const CELTMode *mode, AnalysisInfo *analysis, opus_int32 base_target,
- int LM, opus_int32 bitrate, int lastCodedBands, int C, int intensity,
- int constrained_vbr, opus_val16 stereo_saving, int tot_boost,
- opus_val16 tf_estimate, int pitch_change, opus_val16 maxDepth,
- int variable_duration, int lfe, int has_surround_mask, opus_val16 surround_masking,
- opus_val16 temporal_vbr)
-{
- /* The target rate in 8th bits per frame */
- opus_int32 target;
- int coded_bins;
- int coded_bands;
- opus_val16 tf_calibration;
- int nbEBands;
- const opus_int16 *eBands;
-
- nbEBands = mode->nbEBands;
- eBands = mode->eBands;
-
- coded_bands = lastCodedBands ? lastCodedBands : nbEBands;
- coded_bins = eBands[coded_bands]<<LM;
- if (C==2)
- coded_bins += eBands[IMIN(intensity, coded_bands)]<<LM;
-
- target = base_target;
-
- /*printf("%f %f %f %f %d %d ", st->analysis.activity, st->analysis.tonality, tf_estimate, st->stereo_saving, tot_boost, coded_bands);*/
-#ifndef DISABLE_FLOAT_API
- if (analysis->valid && analysis->activity<.4)
- target -= (opus_int32)((coded_bins<<BITRES)*(.4f-analysis->activity));
-#endif
- /* Stereo savings */
- if (C==2)
- {
- int coded_stereo_bands;
- int coded_stereo_dof;
- opus_val16 max_frac;
- coded_stereo_bands = IMIN(intensity, coded_bands);
- coded_stereo_dof = (eBands[coded_stereo_bands]<<LM)-coded_stereo_bands;
- /* Maximum fraction of the bits we can save if the signal is mono. */
- max_frac = DIV32_16(MULT16_16(QCONST16(0.8f, 15), coded_stereo_dof), coded_bins);
- stereo_saving = MIN16(stereo_saving, QCONST16(1.f, 8));
- /*printf("%d %d %d ", coded_stereo_dof, coded_bins, tot_boost);*/
- target -= (opus_int32)MIN32(MULT16_32_Q15(max_frac,target),
- SHR32(MULT16_16(stereo_saving-QCONST16(0.1f,8),(coded_stereo_dof<<BITRES)),8));
- }
- /* Boost the rate according to dynalloc (minus the dynalloc average for calibration). */
- target += tot_boost-(16<<LM);
- /* Apply transient boost, compensating for average boost. */
- tf_calibration = variable_duration==OPUS_FRAMESIZE_VARIABLE ?
- QCONST16(0.02f,14) : QCONST16(0.04f,14);
- target += (opus_int32)SHL32(MULT16_32_Q15(tf_estimate-tf_calibration, target),1);
-
-#ifndef DISABLE_FLOAT_API
- /* Apply tonality boost */
- if (analysis->valid && !lfe)
- {
- opus_int32 tonal_target;
- float tonal;
-
- /* Tonality boost (compensating for the average). */
- tonal = MAX16(0.f,analysis->tonality-.15f)-0.09f;
- tonal_target = target + (opus_int32)((coded_bins<<BITRES)*1.2f*tonal);
- if (pitch_change)
- tonal_target += (opus_int32)((coded_bins<<BITRES)*.8f);
- /*printf("%f %f ", analysis->tonality, tonal);*/
- target = tonal_target;
- }
-#endif
-
- if (has_surround_mask&&!lfe)
- {
- opus_int32 surround_target = target + (opus_int32)SHR32(MULT16_16(surround_masking,coded_bins<<BITRES), DB_SHIFT);
- /*printf("%f %d %d %d %d %d %d ", surround_masking, coded_bins, st->end, st->intensity, surround_target, target, st->bitrate);*/
- target = IMAX(target/4, surround_target);
- }
-
- {
- opus_int32 floor_depth;
- int bins;
- bins = eBands[nbEBands-2]<<LM;
- /*floor_depth = SHR32(MULT16_16((C*bins<<BITRES),celt_log2(SHL32(MAX16(1,sample_max),13))), DB_SHIFT);*/
- floor_depth = (opus_int32)SHR32(MULT16_16((C*bins<<BITRES),maxDepth), DB_SHIFT);
- floor_depth = IMAX(floor_depth, target>>2);
- target = IMIN(target, floor_depth);
- /*printf("%f %d\n", maxDepth, floor_depth);*/
- }
-
- if ((!has_surround_mask||lfe) && (constrained_vbr || bitrate<64000))
- {
- opus_val16 rate_factor;
-#ifdef FIXED_POINT
- rate_factor = MAX16(0,(bitrate-32000));
-#else
- rate_factor = MAX16(0,(1.f/32768)*(bitrate-32000));
-#endif
- if (constrained_vbr)
- rate_factor = MIN16(rate_factor, QCONST16(0.67f, 15));
- target = base_target + (opus_int32)MULT16_32_Q15(rate_factor, target-base_target);
-
- }
-
- if (!has_surround_mask && tf_estimate < QCONST16(.2f, 14))
- {
- opus_val16 amount;
- opus_val16 tvbr_factor;
- amount = MULT16_16_Q15(QCONST16(.0000031f, 30), IMAX(0, IMIN(32000, 96000-bitrate)));
- tvbr_factor = SHR32(MULT16_16(temporal_vbr, amount), DB_SHIFT);
- target += (opus_int32)MULT16_32_Q15(tvbr_factor, target);
- }
-
- /* Don't allow more than doubling the rate */
- target = IMIN(2*base_target, target);
-
- return target;
-}
-
-int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes, ec_enc *enc)
-{
- int i, c, N;
- opus_int32 bits;
- ec_enc _enc;
- VARDECL(celt_sig, in);
- VARDECL(celt_sig, freq);
- VARDECL(celt_norm, X);
- VARDECL(celt_ener, bandE);
- VARDECL(opus_val16, bandLogE);
- VARDECL(opus_val16, bandLogE2);
- VARDECL(int, fine_quant);
- VARDECL(opus_val16, error);
- VARDECL(int, pulses);
- VARDECL(int, cap);
- VARDECL(int, offsets);
- VARDECL(int, fine_priority);
- VARDECL(int, tf_res);
- VARDECL(unsigned char, collapse_masks);
- celt_sig *prefilter_mem;
- opus_val16 *oldBandE, *oldLogE, *oldLogE2;
- int shortBlocks=0;
- int isTransient=0;
- const int CC = st->channels;
- const int C = st->stream_channels;
- int LM, M;
- int tf_select;
- int nbFilledBytes, nbAvailableBytes;
- int effEnd;
- int codedBands;
- int tf_sum;
- int alloc_trim;
- int pitch_index=COMBFILTER_MINPERIOD;
- opus_val16 gain1 = 0;
- int dual_stereo=0;
- int effectiveBytes;
- int dynalloc_logp;
- opus_int32 vbr_rate;
- opus_int32 total_bits;
- opus_int32 total_boost;
- opus_int32 balance;
- opus_int32 tell;
- int prefilter_tapset=0;
- int pf_on;
- int anti_collapse_rsv;
- int anti_collapse_on=0;
- int silence=0;
- int tf_chan = 0;
- opus_val16 tf_estimate;
- int pitch_change=0;
- opus_int32 tot_boost;
- opus_val32 sample_max;
- opus_val16 maxDepth;
- const OpusCustomMode *mode;
- int nbEBands;
- int overlap;
- const opus_int16 *eBands;
- int secondMdct;
- int signalBandwidth;
- int transient_got_disabled=0;
- opus_val16 surround_masking=0;
- opus_val16 temporal_vbr=0;
- opus_val16 surround_trim = 0;
- opus_int32 equiv_rate = 510000;
- VARDECL(opus_val16, surround_dynalloc);
- ALLOC_STACK;
-
- mode = st->mode;
- nbEBands = mode->nbEBands;
- overlap = mode->overlap;
- eBands = mode->eBands;
- tf_estimate = 0;
- if (nbCompressedBytes<2 || pcm==NULL)
- {
- RESTORE_STACK;
- return OPUS_BAD_ARG;
- }
-
- frame_size *= st->upsample;
- for (LM=0;LM<=mode->maxLM;LM++)
- if (mode->shortMdctSize<<LM==frame_size)
- break;
- if (LM>mode->maxLM)
- {
- RESTORE_STACK;
- return OPUS_BAD_ARG;
- }
- M=1<<LM;
- N = M*mode->shortMdctSize;
-
- prefilter_mem = st->in_mem+CC*(st->overlap);
- oldBandE = (opus_val16*)(st->in_mem+CC*(st->overlap+COMBFILTER_MAXPERIOD));
- oldLogE = oldBandE + CC*nbEBands;
- oldLogE2 = oldLogE + CC*nbEBands;
-
- if (enc==NULL)
- {
- tell=1;
- nbFilledBytes=0;
- } else {
- tell=ec_tell(enc);
- nbFilledBytes=(tell+4)>>3;
- }
-
-#ifdef CUSTOM_MODES
- if (st->signalling && enc==NULL)
- {
- int tmp = (mode->effEBands-st->end)>>1;
- st->end = IMAX(1, mode->effEBands-tmp);
- compressed[0] = tmp<<5;
- compressed[0] |= LM<<3;
- compressed[0] |= (C==2)<<2;
- /* Convert "standard mode" to Opus header */
- if (mode->Fs==48000 && mode->shortMdctSize==120)
- {
- int c0 = toOpus(compressed[0]);
- if (c0<0)
- {
- RESTORE_STACK;
- return OPUS_BAD_ARG;
- }
- compressed[0] = c0;
- }
- compressed++;
- nbCompressedBytes--;
- }
-#else
- celt_assert(st->signalling==0);
-#endif
-
- /* Can't produce more than 1275 output bytes */
- nbCompressedBytes = IMIN(nbCompressedBytes,1275);
- nbAvailableBytes = nbCompressedBytes - nbFilledBytes;
-
- if (st->vbr && st->bitrate!=OPUS_BITRATE_MAX)
- {
- opus_int32 den=mode->Fs>>BITRES;
- vbr_rate=(st->bitrate*frame_size+(den>>1))/den;
-#ifdef CUSTOM_MODES
- if (st->signalling)
- vbr_rate -= 8<<BITRES;
-#endif
- effectiveBytes = vbr_rate>>(3+BITRES);
- } else {
- opus_int32 tmp;
- vbr_rate = 0;
- tmp = st->bitrate*frame_size;
- if (tell>1)
- tmp += tell;
- if (st->bitrate!=OPUS_BITRATE_MAX)
- nbCompressedBytes = IMAX(2, IMIN(nbCompressedBytes,
- (tmp+4*mode->Fs)/(8*mode->Fs)-!!st->signalling));
- effectiveBytes = nbCompressedBytes;
- }
- if (st->bitrate != OPUS_BITRATE_MAX)
- equiv_rate = st->bitrate - (40*C+20)*((400>>LM) - 50);
-
- if (enc==NULL)
- {
- ec_enc_init(&_enc, compressed, nbCompressedBytes);
- enc = &_enc;
- }
-
- if (vbr_rate>0)
- {
- /* Computes the max bit-rate allowed in VBR mode to avoid violating the
- target rate and buffering.
- We must do this up front so that bust-prevention logic triggers
- correctly if we don't have enough bits. */
- if (st->constrained_vbr)
- {
- opus_int32 vbr_bound;
- opus_int32 max_allowed;
- /* We could use any multiple of vbr_rate as bound (depending on the
- delay).
- This is clamped to ensure we use at least two bytes if the encoder
- was entirely empty, but to allow 0 in hybrid mode. */
- vbr_bound = vbr_rate;
- max_allowed = IMIN(IMAX(tell==1?2:0,
- (vbr_rate+vbr_bound-st->vbr_reservoir)>>(BITRES+3)),
- nbAvailableBytes);
- if(max_allowed < nbAvailableBytes)
- {
- nbCompressedBytes = nbFilledBytes+max_allowed;
- nbAvailableBytes = max_allowed;
- ec_enc_shrink(enc, nbCompressedBytes);
- }
- }
- }
- total_bits = nbCompressedBytes*8;
-
- effEnd = st->end;
- if (effEnd > mode->effEBands)
- effEnd = mode->effEBands;
-
- ALLOC(in, CC*(N+st->overlap), celt_sig);
-
- sample_max=MAX32(st->overlap_max, celt_maxabs16(pcm, C*(N-overlap)/st->upsample));
- st->overlap_max=celt_maxabs16(pcm+C*(N-overlap)/st->upsample, C*overlap/st->upsample);
- sample_max=MAX32(sample_max, st->overlap_max);
-#ifdef FIXED_POINT
- silence = (sample_max==0);
-#else
- silence = (sample_max <= (opus_val16)1/(1<<st->lsb_depth));
-#endif
-#ifdef FUZZING
- if ((rand()&0x3F)==0)
- silence = 1;
-#endif
- if (tell==1)
- ec_enc_bit_logp(enc, silence, 15);
- else
- silence=0;
- if (silence)
- {
- /*In VBR mode there is no need to send more than the minimum. */
- if (vbr_rate>0)
- {
- effectiveBytes=nbCompressedBytes=IMIN(nbCompressedBytes, nbFilledBytes+2);
- total_bits=nbCompressedBytes*8;
- nbAvailableBytes=2;
- ec_enc_shrink(enc, nbCompressedBytes);
- }
- /* Pretend we've filled all the remaining bits with zeros
- (that's what the initialiser did anyway) */
- tell = nbCompressedBytes*8;
- enc->nbits_total+=tell-ec_tell(enc);
- }
- c=0; do {
- celt_preemphasis(pcm+c, in+c*(N+st->overlap)+st->overlap, N, CC, st->upsample,
- mode->preemph, st->preemph_memE+c, st->clip);
- } while (++c<CC);
-
-
-
- /* Find pitch period and gain */
- {
- int enabled;
- int qg;
- enabled = ((st->lfe&&nbAvailableBytes>3) || nbAvailableBytes>12*C) && st->start==0 && !silence && !st->disable_pf
- && st->complexity >= 5 && !(st->consec_transient && LM!=3 && st->variable_duration==OPUS_FRAMESIZE_VARIABLE);
-
- prefilter_tapset = st->tapset_decision;
- pf_on = run_prefilter(st, in, prefilter_mem, CC, N, prefilter_tapset, &pitch_index, &gain1, &qg, enabled, nbAvailableBytes);
- if ((gain1 > QCONST16(.4f,15) || st->prefilter_gain > QCONST16(.4f,15)) && (!st->analysis.valid || st->analysis.tonality > .3)
- && (pitch_index > 1.26*st->prefilter_period || pitch_index < .79*st->prefilter_period))
- pitch_change = 1;
- if (pf_on==0)
- {
- if(st->start==0 && tell+16<=total_bits)
- ec_enc_bit_logp(enc, 0, 1);
- } else {
- /*This block is not gated by a total bits check only because
- of the nbAvailableBytes check above.*/
- int octave;
- ec_enc_bit_logp(enc, 1, 1);
- pitch_index += 1;
- octave = EC_ILOG(pitch_index)-5;
- ec_enc_uint(enc, octave, 6);
- ec_enc_bits(enc, pitch_index-(16<<octave), 4+octave);
- pitch_index -= 1;
- ec_enc_bits(enc, qg, 3);
- ec_enc_icdf(enc, prefilter_tapset, tapset_icdf, 2);
- }
- }
-
- isTransient = 0;
- shortBlocks = 0;
- if (st->complexity >= 1 && !st->lfe)
- {
- isTransient = transient_analysis(in, N+st->overlap, CC,
- &tf_estimate, &tf_chan);
- }
- if (LM>0 && ec_tell(enc)+3<=total_bits)
- {
- if (isTransient)
- shortBlocks = M;
- } else {
- isTransient = 0;
- transient_got_disabled=1;
- }
-
- ALLOC(freq, CC*N, celt_sig); /**< Interleaved signal MDCTs */
- ALLOC(bandE,nbEBands*CC, celt_ener);
- ALLOC(bandLogE,nbEBands*CC, opus_val16);
-
- secondMdct = shortBlocks && st->complexity>=8;
- ALLOC(bandLogE2, C*nbEBands, opus_val16);
- if (secondMdct)
- {
- compute_mdcts(mode, 0, in, freq, C, CC, LM, st->upsample);
- compute_band_energies(mode, freq, bandE, effEnd, C, M);
- amp2Log2(mode, effEnd, st->end, bandE, bandLogE2, C);
- for (i=0;i<C*nbEBands;i++)
- bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT));
- }
-
- compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample);
- if (CC==2&&C==1)
- tf_chan = 0;
- compute_band_energies(mode, freq, bandE, effEnd, C, M);
-
- if (st->lfe)
- {
- for (i=2;i<st->end;i++)
- {
- bandE[i] = IMIN(bandE[i], MULT16_32_Q15(QCONST16(1e-4f,15),bandE[0]));
- bandE[i] = MAX32(bandE[i], EPSILON);
- }
- }
- amp2Log2(mode, effEnd, st->end, bandE, bandLogE, C);
-
- ALLOC(surround_dynalloc, C*nbEBands, opus_val16);
- for(i=0;i<st->end;i++)
- surround_dynalloc[i] = 0;
- /* This computes how much masking takes place between surround channels */
- if (st->start==0&&st->energy_mask&&!st->lfe)
- {
- int mask_end;
- int midband;
- int count_dynalloc;
- opus_val32 mask_avg=0;
- opus_val32 diff=0;
- int count=0;
- mask_end = IMAX(2,st->lastCodedBands);
- for (c=0;c<C;c++)
- {
- for(i=0;i<mask_end;i++)
- {
- opus_val16 mask;
- mask = MAX16(MIN16(st->energy_mask[nbEBands*c+i],
- QCONST16(.25f, DB_SHIFT)), -QCONST16(2.0f, DB_SHIFT));
- if (mask > 0)
- mask = HALF16(mask);
- mask_avg += MULT16_16(mask, eBands[i+1]-eBands[i]);
- count += eBands[i+1]-eBands[i];
- diff += MULT16_16(mask, 1+2*i-mask_end);
- }
- }
- mask_avg = DIV32_16(mask_avg,count);
- mask_avg += QCONST16(.2f, DB_SHIFT);
- diff = diff*6/(C*(mask_end-1)*(mask_end+1)*mask_end);
- /* Again, being conservative */
- diff = HALF32(diff);
- diff = MAX32(MIN32(diff, QCONST32(.031f, DB_SHIFT)), -QCONST32(.031f, DB_SHIFT));
- /* Find the band that's in the middle of the coded spectrum */
- for (midband=0;eBands[midband+1] < eBands[mask_end]/2;midband++);
- count_dynalloc=0;
- for(i=0;i<mask_end;i++)
- {
- opus_val32 lin;
- opus_val16 unmask;
- lin = mask_avg + diff*(i-midband);
- if (C==2)
- unmask = MAX16(st->energy_mask[i], st->energy_mask[nbEBands+i]);
- else
- unmask = st->energy_mask[i];
- unmask = MIN16(unmask, QCONST16(.0f, DB_SHIFT));
- unmask -= lin;
- if (unmask > QCONST16(.25f, DB_SHIFT))
- {
- surround_dynalloc[i] = unmask - QCONST16(.25f, DB_SHIFT);
- count_dynalloc++;
- }
- }
- if (count_dynalloc>=3)
- {
- /* If we need dynalloc in many bands, it's probably because our
- initial masking rate was too low. */
- mask_avg += QCONST16(.25f, DB_SHIFT);
- if (mask_avg>0)
- {
- /* Something went really wrong in the original calculations,
- disabling masking. */
- mask_avg = 0;
- diff = 0;
- for(i=0;i<mask_end;i++)
- surround_dynalloc[i] = 0;
- } else {
- for(i=0;i<mask_end;i++)
- surround_dynalloc[i] = MAX16(0, surround_dynalloc[i]-QCONST16(.25f, DB_SHIFT));
- }
- }
- mask_avg += QCONST16(.2f, DB_SHIFT);
- /* Convert to 1/64th units used for the trim */
- surround_trim = 64*diff;
- /*printf("%d %d ", mask_avg, surround_trim);*/
- surround_masking = mask_avg;
- }
- /* Temporal VBR (but not for LFE) */
- if (!st->lfe)
- {
- opus_val16 follow=-QCONST16(10.0f,DB_SHIFT);
- opus_val32 frame_avg=0;
- opus_val16 offset = shortBlocks?HALF16(SHL16(LM, DB_SHIFT)):0;
- for(i=st->start;i<st->end;i++)
- {
- follow = MAX16(follow-QCONST16(1.f, DB_SHIFT), bandLogE[i]-offset);
- if (C==2)
- follow = MAX16(follow, bandLogE[i+nbEBands]-offset);
- frame_avg += follow;
- }
- frame_avg /= (st->end-st->start);
- temporal_vbr = SUB16(frame_avg,st->spec_avg);
- temporal_vbr = MIN16(QCONST16(3.f, DB_SHIFT), MAX16(-QCONST16(1.5f, DB_SHIFT), temporal_vbr));
- st->spec_avg += MULT16_16_Q15(QCONST16(.02f, 15), temporal_vbr);
- }
- /*for (i=0;i<21;i++)
- printf("%f ", bandLogE[i]);
- printf("\n");*/
-
- if (!secondMdct)
- {
- for (i=0;i<C*nbEBands;i++)
- bandLogE2[i] = bandLogE[i];
- }
-
- /* Last chance to catch any transient we might have missed in the
- time-domain analysis */
- if (LM>0 && ec_tell(enc)+3<=total_bits && !isTransient && st->complexity>=5 && !st->lfe)
- {
- if (patch_transient_decision(bandLogE, oldBandE, nbEBands, st->end, C))
- {
- isTransient = 1;
- shortBlocks = M;
- compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample);
- compute_band_energies(mode, freq, bandE, effEnd, C, M);
- amp2Log2(mode, effEnd, st->end, bandE, bandLogE, C);
- /* Compensate for the scaling of short vs long mdcts */
- for (i=0;i<C*nbEBands;i++)
- bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT));
- tf_estimate = QCONST16(.2f,14);
- }
- }
-
- if (LM>0 && ec_tell(enc)+3<=total_bits)
- ec_enc_bit_logp(enc, isTransient, 3);
-
- ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */
-
- /* Band normalisation */
- normalise_bands(mode, freq, X, bandE, effEnd, C, M);
-
- ALLOC(tf_res, nbEBands, int);
- /* Disable variable tf resolution for hybrid and at very low bitrate */
- if (effectiveBytes>=15*C && st->start==0 && st->complexity>=2 && !st->lfe)
- {
- int lambda;
- if (effectiveBytes<40)
- lambda = 12;
- else if (effectiveBytes<60)
- lambda = 6;
- else if (effectiveBytes<100)
- lambda = 4;
- else
- lambda = 3;
- lambda*=2;
- tf_select = tf_analysis(mode, effEnd, isTransient, tf_res, lambda, X, N, LM, &tf_sum, tf_estimate, tf_chan);
- for (i=effEnd;i<st->end;i++)
- tf_res[i] = tf_res[effEnd-1];
- } else {
- tf_sum = 0;
- for (i=0;i<st->end;i++)
- tf_res[i] = isTransient;
- tf_select=0;
- }
-
- ALLOC(error, C*nbEBands, opus_val16);
- quant_coarse_energy(mode, st->start, st->end, effEnd, bandLogE,
- oldBandE, total_bits, error, enc,
- C, LM, nbAvailableBytes, st->force_intra,
- &st->delayedIntra, st->complexity >= 4, st->loss_rate, st->lfe);
-
- tf_encode(st->start, st->end, isTransient, tf_res, LM, tf_select, enc);
-
- if (ec_tell(enc)+4<=total_bits)
- {
- if (st->lfe)
- {
- st->tapset_decision = 0;
- st->spread_decision = SPREAD_NORMAL;
- } else if (shortBlocks || st->complexity < 3 || nbAvailableBytes < 10*C || st->start != 0)
- {
- if (st->complexity == 0)
- st->spread_decision = SPREAD_NONE;
- else
- st->spread_decision = SPREAD_NORMAL;
- } else {
- /* Disable new spreading+tapset estimator until we can show it works
- better than the old one. So far it seems like spreading_decision()
- works best. */
-#if 0
- if (st->analysis.valid)
- {
- static const opus_val16 spread_thresholds[3] = {-QCONST16(.6f, 15), -QCONST16(.2f, 15), -QCONST16(.07f, 15)};
- static const opus_val16 spread_histeresis[3] = {QCONST16(.15f, 15), QCONST16(.07f, 15), QCONST16(.02f, 15)};
- static const opus_val16 tapset_thresholds[2] = {QCONST16(.0f, 15), QCONST16(.15f, 15)};
- static const opus_val16 tapset_histeresis[2] = {QCONST16(.1f, 15), QCONST16(.05f, 15)};
- st->spread_decision = hysteresis_decision(-st->analysis.tonality, spread_thresholds, spread_histeresis, 3, st->spread_decision);
- st->tapset_decision = hysteresis_decision(st->analysis.tonality_slope, tapset_thresholds, tapset_histeresis, 2, st->tapset_decision);
- } else
-#endif
- {
- st->spread_decision = spreading_decision(mode, X,
- &st->tonal_average, st->spread_decision, &st->hf_average,
- &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M);
- }
- /*printf("%d %d\n", st->tapset_decision, st->spread_decision);*/
- /*printf("%f %d %f %d\n\n", st->analysis.tonality, st->spread_decision, st->analysis.tonality_slope, st->tapset_decision);*/
- }
- ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5);
- }
-
- ALLOC(offsets, nbEBands, int);
-
- maxDepth = dynalloc_analysis(bandLogE, bandLogE2, nbEBands, st->start, st->end, C, offsets,
- st->lsb_depth, mode->logN, isTransient, st->vbr, st->constrained_vbr,
- eBands, LM, effectiveBytes, &tot_boost, st->lfe, surround_dynalloc);
- /* For LFE, everything interesting is in the first band */
- if (st->lfe)
- offsets[0] = IMIN(8, effectiveBytes/3);
- ALLOC(cap, nbEBands, int);
- init_caps(mode,cap,LM,C);
-
- dynalloc_logp = 6;
- total_bits<<=BITRES;
- total_boost = 0;
- tell = ec_tell_frac(enc);
- for (i=st->start;i<st->end;i++)
- {
- int width, quanta;
- int dynalloc_loop_logp;
- int boost;
- int j;
- width = C*(eBands[i+1]-eBands[i])<<LM;
- /* quanta is 6 bits, but no more than 1 bit/sample
- and no less than 1/8 bit/sample */
- quanta = IMIN(width<<BITRES, IMAX(6<<BITRES, width));
- dynalloc_loop_logp = dynalloc_logp;
- boost = 0;
- for (j = 0; tell+(dynalloc_loop_logp<<BITRES) < total_bits-total_boost
- && boost < cap[i]; j++)
- {
- int flag;
- flag = j<offsets[i];
- ec_enc_bit_logp(enc, flag, dynalloc_loop_logp);
- tell = ec_tell_frac(enc);
- if (!flag)
- break;
- boost += quanta;
- total_boost += quanta;
- dynalloc_loop_logp = 1;
- }
- /* Making dynalloc more likely */
- if (j)
- dynalloc_logp = IMAX(2, dynalloc_logp-1);
- offsets[i] = boost;
- }
-
- if (C==2)
- {
- static const opus_val16 intensity_thresholds[21]=
- /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 off*/
- { 1, 2, 3, 4, 5, 6, 7, 8,16,24,36,44,50,56,62,67,72,79,88,106,134};
- static const opus_val16 intensity_histeresis[21]=
- { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 5, 6, 8, 8};
-
- /* Always use MS for 2.5 ms frames until we can do a better analysis */
- if (LM!=0)
- dual_stereo = stereo_analysis(mode, X, LM, N);
-
- st->intensity = hysteresis_decision((opus_val16)(equiv_rate/1000),
- intensity_thresholds, intensity_histeresis, 21, st->intensity);
- st->intensity = IMIN(st->end,IMAX(st->start, st->intensity));
- }
-
- alloc_trim = 5;
- if (tell+(6<<BITRES) <= total_bits - total_boost)
- {
- if (st->lfe)
- alloc_trim = 5;
- else
- alloc_trim = alloc_trim_analysis(mode, X, bandLogE,
- st->end, LM, C, N, &st->analysis, &st->stereo_saving, tf_estimate, st->intensity, surround_trim);
- ec_enc_icdf(enc, alloc_trim, trim_icdf, 7);
- tell = ec_tell_frac(enc);
- }
-
- /* Variable bitrate */
- if (vbr_rate>0)
- {
- opus_val16 alpha;
- opus_int32 delta;
- /* The target rate in 8th bits per frame */
- opus_int32 target, base_target;
- opus_int32 min_allowed;
- int lm_diff = mode->maxLM - LM;
-
- /* Don't attempt to use more than 510 kb/s, even for frames smaller than 20 ms.
- The CELT allocator will just not be able to use more than that anyway. */
- nbCompressedBytes = IMIN(nbCompressedBytes,1275>>(3-LM));
- base_target = vbr_rate - ((40*C+20)<<BITRES);
-
- if (st->constrained_vbr)
- base_target += (st->vbr_offset>>lm_diff);
-
- target = compute_vbr(mode, &st->analysis, base_target, LM, equiv_rate,
- st->lastCodedBands, C, st->intensity, st->constrained_vbr,
- st->stereo_saving, tot_boost, tf_estimate, pitch_change, maxDepth,
- st->variable_duration, st->lfe, st->energy_mask!=NULL, surround_masking,
- temporal_vbr);
-
- /* The current offset is removed from the target and the space used
- so far is added*/
- target=target+tell;
- /* In VBR mode the frame size must not be reduced so much that it would
- result in the encoder running out of bits.
- The margin of 2 bytes ensures that none of the bust-prevention logic
- in the decoder will have triggered so far. */
- min_allowed = ((tell+total_boost+(1<<(BITRES+3))-1)>>(BITRES+3)) + 2 - nbFilledBytes;
-
- nbAvailableBytes = (target+(1<<(BITRES+2)))>>(BITRES+3);
- nbAvailableBytes = IMAX(min_allowed,nbAvailableBytes);
- nbAvailableBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes) - nbFilledBytes;
-
- /* By how much did we "miss" the target on that frame */
- delta = target - vbr_rate;
-
- target=nbAvailableBytes<<(BITRES+3);
-
- /*If the frame is silent we don't adjust our drift, otherwise
- the encoder will shoot to very high rates after hitting a
- span of silence, but we do allow the bitres to refill.
- This means that we'll undershoot our target in CVBR/VBR modes
- on files with lots of silence. */
- if(silence)
- {
- nbAvailableBytes = 2;
- target = 2*8<<BITRES;
- delta = 0;
- }
-
- if (st->vbr_count < 970)
- {
- st->vbr_count++;
- alpha = celt_rcp(SHL32(EXTEND32(st->vbr_count+20),16));
- } else
- alpha = QCONST16(.001f,15);
- /* How many bits have we used in excess of what we're allowed */
- if (st->constrained_vbr)
- st->vbr_reservoir += target - vbr_rate;
- /*printf ("%d\n", st->vbr_reservoir);*/
-
- /* Compute the offset we need to apply in order to reach the target */
- if (st->constrained_vbr)
- {
- st->vbr_drift += (opus_int32)MULT16_32_Q15(alpha,(delta*(1<<lm_diff))-st->vbr_offset-st->vbr_drift);
- st->vbr_offset = -st->vbr_drift;
- }
- /*printf ("%d\n", st->vbr_drift);*/
-
- if (st->constrained_vbr && st->vbr_reservoir < 0)
- {
- /* We're under the min value -- increase rate */
- int adjust = (-st->vbr_reservoir)/(8<<BITRES);
- /* Unless we're just coding silence */
- nbAvailableBytes += silence?0:adjust;
- st->vbr_reservoir = 0;
- /*printf ("+%d\n", adjust);*/
- }
- nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes);
- /*printf("%d\n", nbCompressedBytes*50*8);*/
- /* This moves the raw bits to take into account the new compressed size */
- ec_enc_shrink(enc, nbCompressedBytes);
- }
-
- /* Bit allocation */
- ALLOC(fine_quant, nbEBands, int);
- ALLOC(pulses, nbEBands, int);
- ALLOC(fine_priority, nbEBands, int);
-
- /* bits = packet size - where we are - safety*/
- bits = (((opus_int32)nbCompressedBytes*8)<<BITRES) - ec_tell_frac(enc) - 1;
- anti_collapse_rsv = isTransient&&LM>=2&&bits>=((LM+2)<<BITRES) ? (1<<BITRES) : 0;
- bits -= anti_collapse_rsv;
- signalBandwidth = st->end-1;
-#ifndef DISABLE_FLOAT_API
- if (st->analysis.valid)
- {
- int min_bandwidth;
- if (equiv_rate < (opus_int32)32000*C)
- min_bandwidth = 13;
- else if (equiv_rate < (opus_int32)48000*C)
- min_bandwidth = 16;
- else if (equiv_rate < (opus_int32)60000*C)
- min_bandwidth = 18;
- else if (equiv_rate < (opus_int32)80000*C)
- min_bandwidth = 19;
- else
- min_bandwidth = 20;
- signalBandwidth = IMAX(st->analysis.bandwidth, min_bandwidth);
- }
-#endif
- if (st->lfe)
- signalBandwidth = 1;
- codedBands = compute_allocation(mode, st->start, st->end, offsets, cap,
- alloc_trim, &st->intensity, &dual_stereo, bits, &balance, pulses,
- fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands, signalBandwidth);
- if (st->lastCodedBands)
- st->lastCodedBands = IMIN(st->lastCodedBands+1,IMAX(st->lastCodedBands-1,codedBands));
- else
- st->lastCodedBands = codedBands;
-
- quant_fine_energy(mode, st->start, st->end, oldBandE, error, fine_quant, enc, C);
-
- /* Residual quantisation */
- ALLOC(collapse_masks, C*nbEBands, unsigned char);
- quant_all_bands(1, mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_masks,
- bandE, pulses, shortBlocks, st->spread_decision, dual_stereo, st->intensity, tf_res,
- nbCompressedBytes*(8<<BITRES)-anti_collapse_rsv, balance, enc, LM, codedBands, &st->rng);
-
- if (anti_collapse_rsv > 0)
- {
- anti_collapse_on = st->consec_transient<2;
-#ifdef FUZZING
- anti_collapse_on = rand()&0x1;
-#endif
- ec_enc_bits(enc, anti_collapse_on, 1);
- }
- quant_energy_finalise(mode, st->start, st->end, oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_tell(enc), enc, C);
-
- if (silence)
- {
- for (i=0;i<C*nbEBands;i++)
- oldBandE[i] = -QCONST16(28.f,DB_SHIFT);
- }
-
-#ifdef RESYNTH
- /* Re-synthesis of the coded audio if required */
- {
- celt_sig *out_mem[2];
-
- if (anti_collapse_on)
- {
- anti_collapse(mode, X, collapse_masks, LM, C, N,
- st->start, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng);
- }
-
- if (silence)
- {
- for (i=0;i<C*N;i++)
- freq[i] = 0;
- } else {
- /* Synthesis */
- denormalise_bands(mode, X, freq, oldBandE, st->start, effEnd, C, M);
- }
-
- c=0; do {
- OPUS_MOVE(st->syn_mem[c], st->syn_mem[c]+N, 2*MAX_PERIOD-N+overlap/2);
- } while (++c<CC);
-
- if (CC==2&&C==1)
- {
- for (i=0;i<N;i++)
- freq[N+i] = freq[i];
- }
-
- c=0; do {
- out_mem[c] = st->syn_mem[c]+2*MAX_PERIOD-N;
- } while (++c<CC);
-
- compute_inv_mdcts(mode, shortBlocks, freq, out_mem, CC, LM);
-
- c=0; do {
- st->prefilter_period=IMAX(st->prefilter_period, COMBFILTER_MINPERIOD);
- st->prefilter_period_old=IMAX(st->prefilter_period_old, COMBFILTER_MINPERIOD);
- comb_filter(out_mem[c], out_mem[c], st->prefilter_period_old, st->prefilter_period, mode->shortMdctSize,
- st->prefilter_gain_old, st->prefilter_gain, st->prefilter_tapset_old, st->prefilter_tapset,
- mode->window, st->overlap);
- if (LM!=0)
- comb_filter(out_mem[c]+mode->shortMdctSize, out_mem[c]+mode->shortMdctSize, st->prefilter_period, pitch_index, N-mode->shortMdctSize,
- st->prefilter_gain, gain1, st->prefilter_tapset, prefilter_tapset,
- mode->window, overlap);
- } while (++c<CC);
-
- /* We reuse freq[] as scratch space for the de-emphasis */
- deemphasis(out_mem, (opus_val16*)pcm, N, CC, st->upsample, mode->preemph, st->preemph_memD, freq);
- st->prefilter_period_old = st->prefilter_period;
- st->prefilter_gain_old = st->prefilter_gain;
- st->prefilter_tapset_old = st->prefilter_tapset;
- }
-#endif
-
- st->prefilter_period = pitch_index;
- st->prefilter_gain = gain1;
- st->prefilter_tapset = prefilter_tapset;
-#ifdef RESYNTH
- if (LM!=0)
- {
- st->prefilter_period_old = st->prefilter_period;
- st->prefilter_gain_old = st->prefilter_gain;
- st->prefilter_tapset_old = st->prefilter_tapset;
- }
-#endif
-
- if (CC==2&&C==1) {
- for (i=0;i<nbEBands;i++)
- oldBandE[nbEBands+i]=oldBandE[i];
- }
-
- if (!isTransient)
- {
- for (i=0;i<CC*nbEBands;i++)
- oldLogE2[i] = oldLogE[i];
- for (i=0;i<CC*nbEBands;i++)
- oldLogE[i] = oldBandE[i];
- } else {
- for (i=0;i<CC*nbEBands;i++)
- oldLogE[i] = MIN16(oldLogE[i], oldBandE[i]);
- }
- /* In case start or end were to change */
- c=0; do
- {
- for (i=0;i<st->start;i++)
- {
- oldBandE[c*nbEBands+i]=0;
- oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT);
- }
- for (i=st->end;i<nbEBands;i++)
- {
- oldBandE[c*nbEBands+i]=0;
- oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT);
- }
- } while (++c<CC);
-
- if (isTransient || transient_got_disabled)
- st->consec_transient++;
- else
- st->consec_transient=0;
- st->rng = enc->rng;
-
- /* If there's any room left (can only happen for very high rates),
- it's already filled with zeros */
- ec_enc_done(enc);
-
-#ifdef CUSTOM_MODES
- if (st->signalling)
- nbCompressedBytes++;
-#endif
-
- RESTORE_STACK;
- if (ec_get_error(enc))
- return OPUS_INTERNAL_ERROR;
- else
- return nbCompressedBytes;
-}
-
-
-#ifdef CUSTOM_MODES
-
-#ifdef FIXED_POINT
-int opus_custom_encode(CELTEncoder * OPUS_RESTRICT st, const opus_int16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes)
-{
- return celt_encode_with_ec(st, pcm, frame_size, compressed, nbCompressedBytes, NULL);
-}
-
-#ifndef DISABLE_FLOAT_API
-int opus_custom_encode_float(CELTEncoder * OPUS_RESTRICT st, const float * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes)
-{
- int j, ret, C, N;
- VARDECL(opus_int16, in);
- ALLOC_STACK;
-
- if (pcm==NULL)
- return OPUS_BAD_ARG;
-
- C = st->channels;
- N = frame_size;
- ALLOC(in, C*N, opus_int16);
-
- for (j=0;j<C*N;j++)
- in[j] = FLOAT2INT16(pcm[j]);
-
- ret=celt_encode_with_ec(st,in,frame_size,compressed,nbCompressedBytes, NULL);
-#ifdef RESYNTH
- for (j=0;j<C*N;j++)
- ((float*)pcm)[j]=in[j]*(1.f/32768.f);
-#endif
- RESTORE_STACK;
- return ret;
-}
-#endif /* DISABLE_FLOAT_API */
-#else
-
-int opus_custom_encode(CELTEncoder * OPUS_RESTRICT st, const opus_int16 * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes)
-{
- int j, ret, C, N;
- VARDECL(celt_sig, in);
- ALLOC_STACK;
-
- if (pcm==NULL)
- return OPUS_BAD_ARG;
-
- C=st->channels;
- N=frame_size;
- ALLOC(in, C*N, celt_sig);
- for (j=0;j<C*N;j++) {
- in[j] = SCALEOUT(pcm[j]);
- }
-
- ret = celt_encode_with_ec(st,in,frame_size,compressed,nbCompressedBytes, NULL);
-#ifdef RESYNTH
- for (j=0;j<C*N;j++)
- ((opus_int16*)pcm)[j] = FLOAT2INT16(in[j]);
-#endif
- RESTORE_STACK;
- return ret;
-}
-
-int opus_custom_encode_float(CELTEncoder * OPUS_RESTRICT st, const float * pcm, int frame_size, unsigned char *compressed, int nbCompressedBytes)
-{
- return celt_encode_with_ec(st, pcm, frame_size, compressed, nbCompressedBytes, NULL);
-}
-
-#endif
-
-#endif /* CUSTOM_MODES */
-
-int opus_custom_encoder_ctl(CELTEncoder * OPUS_RESTRICT st, int request, ...)
-{
- va_list ap;
-
- va_start(ap, request);
- switch (request)
- {
- case OPUS_SET_COMPLEXITY_REQUEST:
- {
- int value = va_arg(ap, opus_int32);
- if (value<0 || value>10)
- goto bad_arg;
- st->complexity = value;
- }
- break;
- case CELT_SET_START_BAND_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- if (value<0 || value>=st->mode->nbEBands)
- goto bad_arg;
- st->start = value;
- }
- break;
- case CELT_SET_END_BAND_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- if (value<1 || value>st->mode->nbEBands)
- goto bad_arg;
- st->end = value;
- }
- break;
- case CELT_SET_PREDICTION_REQUEST:
- {
- int value = va_arg(ap, opus_int32);
- if (value<0 || value>2)
- goto bad_arg;
- st->disable_pf = value<=1;
- st->force_intra = value==0;
- }
- break;
- case OPUS_SET_PACKET_LOSS_PERC_REQUEST:
- {
- int value = va_arg(ap, opus_int32);
- if (value<0 || value>100)
- goto bad_arg;
- st->loss_rate = value;
- }
- break;
- case OPUS_SET_VBR_CONSTRAINT_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- st->constrained_vbr = value;
- }
- break;
- case OPUS_SET_VBR_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- st->vbr = value;
- }
- break;
- case OPUS_SET_BITRATE_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- if (value<=500 && value!=OPUS_BITRATE_MAX)
- goto bad_arg;
- value = IMIN(value, 260000*st->channels);
- st->bitrate = value;
- }
- break;
- case CELT_SET_CHANNELS_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- if (value<1 || value>2)
- goto bad_arg;
- st->stream_channels = value;
- }
- break;
- case OPUS_SET_LSB_DEPTH_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- if (value<8 || value>24)
- goto bad_arg;
- st->lsb_depth=value;
- }
- break;
- case OPUS_GET_LSB_DEPTH_REQUEST:
- {
- opus_int32 *value = va_arg(ap, opus_int32*);
- *value=st->lsb_depth;
- }
- break;
- case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- st->variable_duration = value;
- }
- break;
- case OPUS_RESET_STATE:
- {
- int i;
- opus_val16 *oldBandE, *oldLogE, *oldLogE2;
- oldBandE = (opus_val16*)(st->in_mem+st->channels*(st->overlap+COMBFILTER_MAXPERIOD));
- oldLogE = oldBandE + st->channels*st->mode->nbEBands;
- oldLogE2 = oldLogE + st->channels*st->mode->nbEBands;
- OPUS_CLEAR((char*)&st->ENCODER_RESET_START,
- opus_custom_encoder_get_size(st->mode, st->channels)-
- ((char*)&st->ENCODER_RESET_START - (char*)st));
- for (i=0;i<st->channels*st->mode->nbEBands;i++)
- oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT);
- st->vbr_offset = 0;
- st->delayedIntra = 1;
- st->spread_decision = SPREAD_NORMAL;
- st->tonal_average = 256;
- st->hf_average = 0;
- st->tapset_decision = 0;
- }
- break;
-#ifdef CUSTOM_MODES
- case CELT_SET_INPUT_CLIPPING_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- st->clip = value;
- }
- break;
-#endif
- case CELT_SET_SIGNALLING_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- st->signalling = value;
- }
- break;
- case CELT_SET_ANALYSIS_REQUEST:
- {
- AnalysisInfo *info = va_arg(ap, AnalysisInfo *);
- if (info)
- OPUS_COPY(&st->analysis, info, 1);
- }
- break;
- case CELT_GET_MODE_REQUEST:
- {
- const CELTMode ** value = va_arg(ap, const CELTMode**);
- if (value==0)
- goto bad_arg;
- *value=st->mode;
- }
- break;
- case OPUS_GET_FINAL_RANGE_REQUEST:
- {
- opus_uint32 * value = va_arg(ap, opus_uint32 *);
- if (value==0)
- goto bad_arg;
- *value=st->rng;
- }
- break;
- case OPUS_SET_LFE_REQUEST:
- {
- opus_int32 value = va_arg(ap, opus_int32);
- st->lfe = value;
- }
- break;
- case OPUS_SET_ENERGY_MASK_REQUEST:
- {
- opus_val16 *value = va_arg(ap, opus_val16*);
- st->energy_mask = value;
- }
- break;
- default:
- goto bad_request;
- }
- va_end(ap);
- return OPUS_OK;
-bad_arg:
- va_end(ap);
- return OPUS_BAD_ARG;
-bad_request:
- va_end(ap);
- return OPUS_UNIMPLEMENTED;
-}
diff --git a/src/opus-1.1/celt/celt_lpc.c b/src/opus-1.1/celt/celt_lpc.c
deleted file mode 100644
index fa29d626..00000000
--- a/src/opus-1.1/celt/celt_lpc.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/* Copyright (c) 2009-2010 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "celt_lpc.h"
-#include "stack_alloc.h"
-#include "mathops.h"
-#include "pitch.h"
-
-void _celt_lpc(
- opus_val16 *_lpc, /* out: [0...p-1] LPC coefficients */
-const opus_val32 *ac, /* in: [0...p] autocorrelation values */
-int p
-)
-{
- int i, j;
- opus_val32 r;
- opus_val32 error = ac[0];
-#ifdef FIXED_POINT
- opus_val32 lpc[LPC_ORDER];
-#else
- float *lpc = _lpc;
-#endif
-
- for (i = 0; i < p; i++)
- lpc[i] = 0;
- if (ac[0] != 0)
- {
- for (i = 0; i < p; i++) {
- /* Sum up this iteration's reflection coefficient */
- opus_val32 rr = 0;
- for (j = 0; j < i; j++)
- rr += MULT32_32_Q31(lpc[j],ac[i - j]);
- rr += SHR32(ac[i + 1],3);
- r = -frac_div32(SHL32(rr,3), error);
- /* Update LPC coefficients and total error */
- lpc[i] = SHR32(r,3);
- for (j = 0; j < (i+1)>>1; j++)
- {
- opus_val32 tmp1, tmp2;
- tmp1 = lpc[j];
- tmp2 = lpc[i-1-j];
- lpc[j] = tmp1 + MULT32_32_Q31(r,tmp2);
- lpc[i-1-j] = tmp2 + MULT32_32_Q31(r,tmp1);
- }
-
- error = error - MULT32_32_Q31(MULT32_32_Q31(r,r),error);
- /* Bail out once we get 30 dB gain */
-#ifdef FIXED_POINT
- if (error<SHR32(ac[0],10))
- break;
-#else
- if (error<.001f*ac[0])
- break;
-#endif
- }
- }
-#ifdef FIXED_POINT
- for (i=0;i<p;i++)
- _lpc[i] = ROUND16(lpc[i],16);
-#endif
-}
-
-void celt_fir(const opus_val16 *_x,
- const opus_val16 *num,
- opus_val16 *_y,
- int N,
- int ord,
- opus_val16 *mem)
-{
- int i,j;
- VARDECL(opus_val16, rnum);
- VARDECL(opus_val16, x);
- SAVE_STACK;
-
- ALLOC(rnum, ord, opus_val16);
- ALLOC(x, N+ord, opus_val16);
- for(i=0;i<ord;i++)
- rnum[i] = num[ord-i-1];
- for(i=0;i<ord;i++)
- x[i] = mem[ord-i-1];
- for (i=0;i<N;i++)
- x[i+ord]=_x[i];
- for(i=0;i<ord;i++)
- mem[i] = _x[N-i-1];
-#ifdef SMALL_FOOTPRINT
- for (i=0;i<N;i++)
- {
- opus_val32 sum = SHL32(EXTEND32(_x[i]), SIG_SHIFT);
- for (j=0;j<ord;j++)
- {
- sum = MAC16_16(sum,rnum[j],x[i+j]);
- }
- _y[i] = SATURATE16(PSHR32(sum, SIG_SHIFT));
- }
-#else
- for (i=0;i<N-3;i+=4)
- {
- opus_val32 sum[4]={0,0,0,0};
- xcorr_kernel(rnum, x+i, sum, ord);
- _y[i ] = SATURATE16(ADD32(EXTEND32(_x[i ]), PSHR32(sum[0], SIG_SHIFT)));
- _y[i+1] = SATURATE16(ADD32(EXTEND32(_x[i+1]), PSHR32(sum[1], SIG_SHIFT)));
- _y[i+2] = SATURATE16(ADD32(EXTEND32(_x[i+2]), PSHR32(sum[2], SIG_SHIFT)));
- _y[i+3] = SATURATE16(ADD32(EXTEND32(_x[i+3]), PSHR32(sum[3], SIG_SHIFT)));
- }
- for (;i<N;i++)
- {
- opus_val32 sum = 0;
- for (j=0;j<ord;j++)
- sum = MAC16_16(sum,rnum[j],x[i+j]);
- _y[i] = SATURATE16(ADD32(EXTEND32(_x[i]), PSHR32(sum, SIG_SHIFT)));
- }
-#endif
- RESTORE_STACK;
-}
-
-void celt_iir(const opus_val32 *_x,
- const opus_val16 *den,
- opus_val32 *_y,
- int N,
- int ord,
- opus_val16 *mem)
-{
-#ifdef SMALL_FOOTPRINT
- int i,j;
- for (i=0;i<N;i++)
- {
- opus_val32 sum = _x[i];
- for (j=0;j<ord;j++)
- {
- sum -= MULT16_16(den[j],mem[j]);
- }
- for (j=ord-1;j>=1;j--)
- {
- mem[j]=mem[j-1];
- }
- mem[0] = ROUND16(sum,SIG_SHIFT);
- _y[i] = sum;
- }
-#else
- int i,j;
- VARDECL(opus_val16, rden);
- VARDECL(opus_val16, y);
- SAVE_STACK;
-
- celt_assert((ord&3)==0);
- ALLOC(rden, ord, opus_val16);
- ALLOC(y, N+ord, opus_val16);
- for(i=0;i<ord;i++)
- rden[i] = den[ord-i-1];
- for(i=0;i<ord;i++)
- y[i] = -mem[ord-i-1];
- for(;i<N+ord;i++)
- y[i]=0;
- for (i=0;i<N-3;i+=4)
- {
- /* Unroll by 4 as if it were an FIR filter */
- opus_val32 sum[4];
- sum[0]=_x[i];
- sum[1]=_x[i+1];
- sum[2]=_x[i+2];
- sum[3]=_x[i+3];
- xcorr_kernel(rden, y+i, sum, ord);
-
- /* Patch up the result to compensate for the fact that this is an IIR */
- y[i+ord ] = -ROUND16(sum[0],SIG_SHIFT);
- _y[i ] = sum[0];
- sum[1] = MAC16_16(sum[1], y[i+ord ], den[0]);
- y[i+ord+1] = -ROUND16(sum[1],SIG_SHIFT);
- _y[i+1] = sum[1];
- sum[2] = MAC16_16(sum[2], y[i+ord+1], den[0]);
- sum[2] = MAC16_16(sum[2], y[i+ord ], den[1]);
- y[i+ord+2] = -ROUND16(sum[2],SIG_SHIFT);
- _y[i+2] = sum[2];
-
- sum[3] = MAC16_16(sum[3], y[i+ord+2], den[0]);
- sum[3] = MAC16_16(sum[3], y[i+ord+1], den[1]);
- sum[3] = MAC16_16(sum[3], y[i+ord ], den[2]);
- y[i+ord+3] = -ROUND16(sum[3],SIG_SHIFT);
- _y[i+3] = sum[3];
- }
- for (;i<N;i++)
- {
- opus_val32 sum = _x[i];
- for (j=0;j<ord;j++)
- sum -= MULT16_16(rden[j],y[i+j]);
- y[i+ord] = ROUND16(sum,SIG_SHIFT);
- _y[i] = sum;
- }
- for(i=0;i<ord;i++)
- mem[i] = _y[N-i-1];
- RESTORE_STACK;
-#endif
-}
-
-int _celt_autocorr(
- const opus_val16 *x, /* in: [0...n-1] samples x */
- opus_val32 *ac, /* out: [0...lag-1] ac values */
- const opus_val16 *window,
- int overlap,
- int lag,
- int n,
- int arch
- )
-{
- opus_val32 d;
- int i, k;
- int fastN=n-lag;
- int shift;
- const opus_val16 *xptr;
- VARDECL(opus_val16, xx);
- SAVE_STACK;
- ALLOC(xx, n, opus_val16);
- celt_assert(n>0);
- celt_assert(overlap>=0);
- if (overlap == 0)
- {
- xptr = x;
- } else {
- for (i=0;i<n;i++)
- xx[i] = x[i];
- for (i=0;i<overlap;i++)
- {
- xx[i] = MULT16_16_Q15(x[i],window[i]);
- xx[n-i-1] = MULT16_16_Q15(x[n-i-1],window[i]);
- }
- xptr = xx;
- }
- shift=0;
-#ifdef FIXED_POINT
- {
- opus_val32 ac0;
- ac0 = 1+(n<<7);
- if (n&1) ac0 += SHR32(MULT16_16(xptr[0],xptr[0]),9);
- for(i=(n&1);i<n;i+=2)
- {
- ac0 += SHR32(MULT16_16(xptr[i],xptr[i]),9);
- ac0 += SHR32(MULT16_16(xptr[i+1],xptr[i+1]),9);
- }
-
- shift = celt_ilog2(ac0)-30+10;
- shift = (shift)/2;
- if (shift>0)
- {
- for(i=0;i<n;i++)
- xx[i] = PSHR32(xptr[i], shift);
- xptr = xx;
- } else
- shift = 0;
- }
-#endif
- celt_pitch_xcorr(xptr, xptr, ac, fastN, lag+1, arch);
- for (k=0;k<=lag;k++)
- {
- for (i = k+fastN, d = 0; i < n; i++)
- d = MAC16_16(d, xptr[i], xptr[i-k]);
- ac[k] += d;
- }
-#ifdef FIXED_POINT
- shift = 2*shift;
- if (shift<=0)
- ac[0] += SHL32((opus_int32)1, -shift);
- if (ac[0] < 268435456)
- {
- int shift2 = 29 - EC_ILOG(ac[0]);
- for (i=0;i<=lag;i++)
- ac[i] = SHL32(ac[i], shift2);
- shift -= shift2;
- } else if (ac[0] >= 536870912)
- {
- int shift2=1;
- if (ac[0] >= 1073741824)
- shift2++;
- for (i=0;i<=lag;i++)
- ac[i] = SHR32(ac[i], shift2);
- shift += shift2;
- }
-#endif
-
- RESTORE_STACK;
- return shift;
-}
diff --git a/src/opus-1.1/celt/celt_lpc.h b/src/opus-1.1/celt/celt_lpc.h
deleted file mode 100644
index dc2a0a3d..00000000
--- a/src/opus-1.1/celt/celt_lpc.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (c) 2009-2010 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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 PLC_H
-#define PLC_H
-
-#include "arch.h"
-
-#define LPC_ORDER 24
-
-void _celt_lpc(opus_val16 *_lpc, const opus_val32 *ac, int p);
-
-void celt_fir(const opus_val16 *x,
- const opus_val16 *num,
- opus_val16 *y,
- int N,
- int ord,
- opus_val16 *mem);
-
-void celt_iir(const opus_val32 *x,
- const opus_val16 *den,
- opus_val32 *y,
- int N,
- int ord,
- opus_val16 *mem);
-
-int _celt_autocorr(const opus_val16 *x, opus_val32 *ac,
- const opus_val16 *window, int overlap, int lag, int n, int arch);
-
-#endif /* PLC_H */
diff --git a/src/opus-1.1/celt/cpu_support.h b/src/opus-1.1/celt/cpu_support.h
deleted file mode 100644
index d68dbe62..00000000
--- a/src/opus-1.1/celt/cpu_support.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (c) 2010 Xiph.Org Foundation
- * Copyright (c) 2013 Parrot */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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 CPU_SUPPORT_H
-#define CPU_SUPPORT_H
-
-#include "opus_types.h"
-#include "opus_defines.h"
-
-#if defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_ASM)
-#include "arm/armcpu.h"
-
-/* We currently support 4 ARM variants:
- * arch[0] -> ARMv4
- * arch[1] -> ARMv5E
- * arch[2] -> ARMv6
- * arch[3] -> NEON
- */
-#define OPUS_ARCHMASK 3
-
-#else
-#define OPUS_ARCHMASK 0
-
-static OPUS_INLINE int opus_select_arch(void)
-{
- return 0;
-}
-#endif
-
-#endif
diff --git a/src/opus-1.1/celt/cwrs.c b/src/opus-1.1/celt/cwrs.c
deleted file mode 100644
index ad980cc7..00000000
--- a/src/opus-1.1/celt/cwrs.c
+++ /dev/null
@@ -1,697 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Copyright (c) 2007-2009 Timothy B. Terriberry
- Written by Timothy B. Terriberry and Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "os_support.h"
-#include "cwrs.h"
-#include "mathops.h"
-#include "arch.h"
-
-#ifdef CUSTOM_MODES
-
-/*Guaranteed to return a conservatively large estimate of the binary logarithm
- with frac bits of fractional precision.
- Tested for all possible 32-bit inputs with frac=4, where the maximum
- overestimation is 0.06254243 bits.*/
-int log2_frac(opus_uint32 val, int frac)
-{
- int l;
- l=EC_ILOG(val);
- if(val&(val-1)){
- /*This is (val>>l-16), but guaranteed to round up, even if adding a bias
- before the shift would cause overflow (e.g., for 0xFFFFxxxx).
- Doesn't work for val=0, but that case fails the test above.*/
- if(l>16)val=((val-1)>>(l-16))+1;
- else val<<=16-l;
- l=(l-1)<<frac;
- /*Note that we always need one iteration, since the rounding up above means
- that we might need to adjust the integer part of the logarithm.*/
- do{
- int b;
- b=(int)(val>>16);
- l+=b<<frac;
- val=(val+b)>>b;
- val=(val*val+0x7FFF)>>15;
- }
- while(frac-->0);
- /*If val is not exactly 0x8000, then we have to round up the remainder.*/
- return l+(val>0x8000);
- }
- /*Exact powers of two require no rounding.*/
- else return (l-1)<<frac;
-}
-#endif
-
-/*Although derived separately, the pulse vector coding scheme is equivalent to
- a Pyramid Vector Quantizer \cite{Fis86}.
- Some additional notes about an early version appear at
- http://people.xiph.org/~tterribe/notes/cwrs.html, but the codebook ordering
- and the definitions of some terms have evolved since that was written.
-
- The conversion from a pulse vector to an integer index (encoding) and back
- (decoding) is governed by two related functions, V(N,K) and U(N,K).
-
- V(N,K) = the number of combinations, with replacement, of N items, taken K
- at a time, when a sign bit is added to each item taken at least once (i.e.,
- the number of N-dimensional unit pulse vectors with K pulses).
- One way to compute this is via
- V(N,K) = K>0 ? sum(k=1...K,2**k*choose(N,k)*choose(K-1,k-1)) : 1,
- where choose() is the binomial function.
- A table of values for N<10 and K<10 looks like:
- V[10][10] = {
- {1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {1, 2, 2, 2, 2, 2, 2, 2, 2, 2},
- {1, 4, 8, 12, 16, 20, 24, 28, 32, 36},
- {1, 6, 18, 38, 66, 102, 146, 198, 258, 326},
- {1, 8, 32, 88, 192, 360, 608, 952, 1408, 1992},
- {1, 10, 50, 170, 450, 1002, 1970, 3530, 5890, 9290},
- {1, 12, 72, 292, 912, 2364, 5336, 10836, 20256, 35436},
- {1, 14, 98, 462, 1666, 4942, 12642, 28814, 59906, 115598},
- {1, 16, 128, 688, 2816, 9424, 27008, 68464, 157184, 332688},
- {1, 18, 162, 978, 4482, 16722, 53154, 148626, 374274, 864146}
- };
-
- U(N,K) = the number of such combinations wherein N-1 objects are taken at
- most K-1 at a time.
- This is given by
- U(N,K) = sum(k=0...K-1,V(N-1,k))
- = K>0 ? (V(N-1,K-1) + V(N,K-1))/2 : 0.
- The latter expression also makes clear that U(N,K) is half the number of such
- combinations wherein the first object is taken at least once.
- Although it may not be clear from either of these definitions, U(N,K) is the
- natural function to work with when enumerating the pulse vector codebooks,
- not V(N,K).
- U(N,K) is not well-defined for N=0, but with the extension
- U(0,K) = K>0 ? 0 : 1,
- the function becomes symmetric: U(N,K) = U(K,N), with a similar table:
- U[10][10] = {
- {1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
- {0, 1, 3, 5, 7, 9, 11, 13, 15, 17},
- {0, 1, 5, 13, 25, 41, 61, 85, 113, 145},
- {0, 1, 7, 25, 63, 129, 231, 377, 575, 833},
- {0, 1, 9, 41, 129, 321, 681, 1289, 2241, 3649},
- {0, 1, 11, 61, 231, 681, 1683, 3653, 7183, 13073},
- {0, 1, 13, 85, 377, 1289, 3653, 8989, 19825, 40081},
- {0, 1, 15, 113, 575, 2241, 7183, 19825, 48639, 108545},
- {0, 1, 17, 145, 833, 3649, 13073, 40081, 108545, 265729}
- };
-
- With this extension, V(N,K) may be written in terms of U(N,K):
- V(N,K) = U(N,K) + U(N,K+1)
- for all N>=0, K>=0.
- Thus U(N,K+1) represents the number of combinations where the first element
- is positive or zero, and U(N,K) represents the number of combinations where
- it is negative.
- With a large enough table of U(N,K) values, we could write O(N) encoding
- and O(min(N*log(K),N+K)) decoding routines, but such a table would be
- prohibitively large for small embedded devices (K may be as large as 32767
- for small N, and N may be as large as 200).
-
- Both functions obey the same recurrence relation:
- V(N,K) = V(N-1,K) + V(N,K-1) + V(N-1,K-1),
- U(N,K) = U(N-1,K) + U(N,K-1) + U(N-1,K-1),
- for all N>0, K>0, with different initial conditions at N=0 or K=0.
- This allows us to construct a row of one of the tables above given the
- previous row or the next row.
- Thus we can derive O(NK) encoding and decoding routines with O(K) memory
- using only addition and subtraction.
-
- When encoding, we build up from the U(2,K) row and work our way forwards.
- When decoding, we need to start at the U(N,K) row and work our way backwards,
- which requires a means of computing U(N,K).
- U(N,K) may be computed from two previous values with the same N:
- U(N,K) = ((2*N-1)*U(N,K-1) - U(N,K-2))/(K-1) + U(N,K-2)
- for all N>1, and since U(N,K) is symmetric, a similar relation holds for two
- previous values with the same K:
- U(N,K>1) = ((2*K-1)*U(N-1,K) - U(N-2,K))/(N-1) + U(N-2,K)
- for all K>1.
- This allows us to construct an arbitrary row of the U(N,K) table by starting
- with the first two values, which are constants.
- This saves roughly 2/3 the work in our O(NK) decoding routine, but costs O(K)
- multiplications.
- Similar relations can be derived for V(N,K), but are not used here.
-
- For N>0 and K>0, U(N,K) and V(N,K) take on the form of an (N-1)-degree
- polynomial for fixed N.
- The first few are
- U(1,K) = 1,
- U(2,K) = 2*K-1,
- U(3,K) = (2*K-2)*K+1,
- U(4,K) = (((4*K-6)*K+8)*K-3)/3,
- U(5,K) = ((((2*K-4)*K+10)*K-8)*K+3)/3,
- and
- V(1,K) = 2,
- V(2,K) = 4*K,
- V(3,K) = 4*K*K+2,
- V(4,K) = 8*(K*K+2)*K/3,
- V(5,K) = ((4*K*K+20)*K*K+6)/3,
- for all K>0.
- This allows us to derive O(N) encoding and O(N*log(K)) decoding routines for
- small N (and indeed decoding is also O(N) for N<3).
-
- @ARTICLE{Fis86,
- author="Thomas R. Fischer",
- title="A Pyramid Vector Quantizer",
- journal="IEEE Transactions on Information Theory",
- volume="IT-32",
- number=4,
- pages="568--583",
- month=Jul,
- year=1986
- }*/
-
-#if !defined(SMALL_FOOTPRINT)
-
-/*U(N,K) = U(K,N) := N>0?K>0?U(N-1,K)+U(N,K-1)+U(N-1,K-1):0:K>0?1:0*/
-# define CELT_PVQ_U(_n,_k) (CELT_PVQ_U_ROW[IMIN(_n,_k)][IMAX(_n,_k)])
-/*V(N,K) := U(N,K)+U(N,K+1) = the number of PVQ codewords for a band of size N
- with K pulses allocated to it.*/
-# define CELT_PVQ_V(_n,_k) (CELT_PVQ_U(_n,_k)+CELT_PVQ_U(_n,(_k)+1))
-
-/*For each V(N,K) supported, we will access element U(min(N,K+1),max(N,K+1)).
- Thus, the number of entries in row I is the larger of the maximum number of
- pulses we will ever allocate for a given N=I (K=128, or however many fit in
- 32 bits, whichever is smaller), plus one, and the maximum N for which
- K=I-1 pulses fit in 32 bits.
- The largest band size in an Opus Custom mode is 208.
- Otherwise, we can limit things to the set of N which can be achieved by
- splitting a band from a standard Opus mode: 176, 144, 96, 88, 72, 64, 48,
- 44, 36, 32, 24, 22, 18, 16, 8, 4, 2).*/
-#if defined(CUSTOM_MODES)
-static const opus_uint32 CELT_PVQ_U_DATA[1488]={
-#else
-static const opus_uint32 CELT_PVQ_U_DATA[1272]={
-#endif
- /*N=0, K=0...176:*/
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-#if defined(CUSTOM_MODES)
- /*...208:*/
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,
-#endif
- /*N=1, K=1...176:*/
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-#if defined(CUSTOM_MODES)
- /*...208:*/
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1,
-#endif
- /*N=2, K=2...176:*/
- 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41,
- 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79,
- 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113,
- 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143,
- 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173,
- 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203,
- 205, 207, 209, 211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233,
- 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263,
- 265, 267, 269, 271, 273, 275, 277, 279, 281, 283, 285, 287, 289, 291, 293,
- 295, 297, 299, 301, 303, 305, 307, 309, 311, 313, 315, 317, 319, 321, 323,
- 325, 327, 329, 331, 333, 335, 337, 339, 341, 343, 345, 347, 349, 351,
-#if defined(CUSTOM_MODES)
- /*...208:*/
- 353, 355, 357, 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, 379, 381,
- 383, 385, 387, 389, 391, 393, 395, 397, 399, 401, 403, 405, 407, 409, 411,
- 413, 415,
-#endif
- /*N=3, K=3...176:*/
- 13, 25, 41, 61, 85, 113, 145, 181, 221, 265, 313, 365, 421, 481, 545, 613,
- 685, 761, 841, 925, 1013, 1105, 1201, 1301, 1405, 1513, 1625, 1741, 1861,
- 1985, 2113, 2245, 2381, 2521, 2665, 2813, 2965, 3121, 3281, 3445, 3613, 3785,
- 3961, 4141, 4325, 4513, 4705, 4901, 5101, 5305, 5513, 5725, 5941, 6161, 6385,
- 6613, 6845, 7081, 7321, 7565, 7813, 8065, 8321, 8581, 8845, 9113, 9385, 9661,
- 9941, 10225, 10513, 10805, 11101, 11401, 11705, 12013, 12325, 12641, 12961,
- 13285, 13613, 13945, 14281, 14621, 14965, 15313, 15665, 16021, 16381, 16745,
- 17113, 17485, 17861, 18241, 18625, 19013, 19405, 19801, 20201, 20605, 21013,
- 21425, 21841, 22261, 22685, 23113, 23545, 23981, 24421, 24865, 25313, 25765,
- 26221, 26681, 27145, 27613, 28085, 28561, 29041, 29525, 30013, 30505, 31001,
- 31501, 32005, 32513, 33025, 33541, 34061, 34585, 35113, 35645, 36181, 36721,
- 37265, 37813, 38365, 38921, 39481, 40045, 40613, 41185, 41761, 42341, 42925,
- 43513, 44105, 44701, 45301, 45905, 46513, 47125, 47741, 48361, 48985, 49613,
- 50245, 50881, 51521, 52165, 52813, 53465, 54121, 54781, 55445, 56113, 56785,
- 57461, 58141, 58825, 59513, 60205, 60901, 61601,
-#if defined(CUSTOM_MODES)
- /*...208:*/
- 62305, 63013, 63725, 64441, 65161, 65885, 66613, 67345, 68081, 68821, 69565,
- 70313, 71065, 71821, 72581, 73345, 74113, 74885, 75661, 76441, 77225, 78013,
- 78805, 79601, 80401, 81205, 82013, 82825, 83641, 84461, 85285, 86113,
-#endif
- /*N=4, K=4...176:*/
- 63, 129, 231, 377, 575, 833, 1159, 1561, 2047, 2625, 3303, 4089, 4991, 6017,
- 7175, 8473, 9919, 11521, 13287, 15225, 17343, 19649, 22151, 24857, 27775,
- 30913, 34279, 37881, 41727, 45825, 50183, 54809, 59711, 64897, 70375, 76153,
- 82239, 88641, 95367, 102425, 109823, 117569, 125671, 134137, 142975, 152193,
- 161799, 171801, 182207, 193025, 204263, 215929, 228031, 240577, 253575,
- 267033, 280959, 295361, 310247, 325625, 341503, 357889, 374791, 392217,
- 410175, 428673, 447719, 467321, 487487, 508225, 529543, 551449, 573951,
- 597057, 620775, 645113, 670079, 695681, 721927, 748825, 776383, 804609,
- 833511, 863097, 893375, 924353, 956039, 988441, 1021567, 1055425, 1090023,
- 1125369, 1161471, 1198337, 1235975, 1274393, 1313599, 1353601, 1394407,
- 1436025, 1478463, 1521729, 1565831, 1610777, 1656575, 1703233, 1750759,
- 1799161, 1848447, 1898625, 1949703, 2001689, 2054591, 2108417, 2163175,
- 2218873, 2275519, 2333121, 2391687, 2451225, 2511743, 2573249, 2635751,
- 2699257, 2763775, 2829313, 2895879, 2963481, 3032127, 3101825, 3172583,
- 3244409, 3317311, 3391297, 3466375, 3542553, 3619839, 3698241, 3777767,
- 3858425, 3940223, 4023169, 4107271, 4192537, 4278975, 4366593, 4455399,
- 4545401, 4636607, 4729025, 4822663, 4917529, 5013631, 5110977, 5209575,
- 5309433, 5410559, 5512961, 5616647, 5721625, 5827903, 5935489, 6044391,
- 6154617, 6266175, 6379073, 6493319, 6608921, 6725887, 6844225, 6963943,
- 7085049, 7207551,
-#if defined(CUSTOM_MODES)
- /*...208:*/
- 7331457, 7456775, 7583513, 7711679, 7841281, 7972327, 8104825, 8238783,
- 8374209, 8511111, 8649497, 8789375, 8930753, 9073639, 9218041, 9363967,
- 9511425, 9660423, 9810969, 9963071, 10116737, 10271975, 10428793, 10587199,
- 10747201, 10908807, 11072025, 11236863, 11403329, 11571431, 11741177,
- 11912575,
-#endif
- /*N=5, K=5...176:*/
- 321, 681, 1289, 2241, 3649, 5641, 8361, 11969, 16641, 22569, 29961, 39041,
- 50049, 63241, 78889, 97281, 118721, 143529, 172041, 204609, 241601, 283401,
- 330409, 383041, 441729, 506921, 579081, 658689, 746241, 842249, 947241,
- 1061761, 1186369, 1321641, 1468169, 1626561, 1797441, 1981449, 2179241,
- 2391489, 2618881, 2862121, 3121929, 3399041, 3694209, 4008201, 4341801,
- 4695809, 5071041, 5468329, 5888521, 6332481, 6801089, 7295241, 7815849,
- 8363841, 8940161, 9545769, 10181641, 10848769, 11548161, 12280841, 13047849,
- 13850241, 14689089, 15565481, 16480521, 17435329, 18431041, 19468809,
- 20549801, 21675201, 22846209, 24064041, 25329929, 26645121, 28010881,
- 29428489, 30899241, 32424449, 34005441, 35643561, 37340169, 39096641,
- 40914369, 42794761, 44739241, 46749249, 48826241, 50971689, 53187081,
- 55473921, 57833729, 60268041, 62778409, 65366401, 68033601, 70781609,
- 73612041, 76526529, 79526721, 82614281, 85790889, 89058241, 92418049,
- 95872041, 99421961, 103069569, 106816641, 110664969, 114616361, 118672641,
- 122835649, 127107241, 131489289, 135983681, 140592321, 145317129, 150160041,
- 155123009, 160208001, 165417001, 170752009, 176215041, 181808129, 187533321,
- 193392681, 199388289, 205522241, 211796649, 218213641, 224775361, 231483969,
- 238341641, 245350569, 252512961, 259831041, 267307049, 274943241, 282741889,
- 290705281, 298835721, 307135529, 315607041, 324252609, 333074601, 342075401,
- 351257409, 360623041, 370174729, 379914921, 389846081, 399970689, 410291241,
- 420810249, 431530241, 442453761, 453583369, 464921641, 476471169, 488234561,
- 500214441, 512413449, 524834241, 537479489, 550351881, 563454121, 576788929,
- 590359041, 604167209, 618216201, 632508801,
-#if defined(CUSTOM_MODES)
- /*...208:*/
- 647047809, 661836041, 676876329, 692171521, 707724481, 723538089, 739615241,
- 755958849, 772571841, 789457161, 806617769, 824056641, 841776769, 859781161,
- 878072841, 896654849, 915530241, 934702089, 954173481, 973947521, 994027329,
- 1014416041, 1035116809, 1056132801, 1077467201, 1099123209, 1121104041,
- 1143412929, 1166053121, 1189027881, 1212340489, 1235994241,
-#endif
- /*N=6, K=6...96:*/
- 1683, 3653, 7183, 13073, 22363, 36365, 56695, 85305, 124515, 177045, 246047,
- 335137, 448427, 590557, 766727, 982729, 1244979, 1560549, 1937199, 2383409,
- 2908411, 3522221, 4235671, 5060441, 6009091, 7095093, 8332863, 9737793,
- 11326283, 13115773, 15124775, 17372905, 19880915, 22670725, 25765455,
- 29189457, 32968347, 37129037, 41699767, 46710137, 52191139, 58175189,
- 64696159, 71789409, 79491819, 87841821, 96879431, 106646281, 117185651,
- 128542501, 140763503, 153897073, 167993403, 183104493, 199284183, 216588185,
- 235074115, 254801525, 275831935, 298228865, 322057867, 347386557, 374284647,
- 402823977, 433078547, 465124549, 499040399, 534906769, 572806619, 612825229,
- 655050231, 699571641, 746481891, 795875861, 847850911, 902506913, 959946283,
- 1020274013, 1083597703, 1150027593, 1219676595, 1292660325, 1369097135,
- 1449108145, 1532817275, 1620351277, 1711839767, 1807415257, 1907213187,
- 2011371957, 2120032959,
-#if defined(CUSTOM_MODES)
- /*...109:*/
- 2233340609U, 2351442379U, 2474488829U, 2602633639U, 2736033641U, 2874848851U,
- 3019242501U, 3169381071U, 3325434321U, 3487575323U, 3655980493U, 3830829623U,
- 4012305913U,
-#endif
- /*N=7, K=7...54*/
- 8989, 19825, 40081, 75517, 134245, 227305, 369305, 579125, 880685, 1303777,
- 1884961, 2668525, 3707509, 5064793, 6814249, 9041957, 11847485, 15345233,
- 19665841, 24957661, 31388293, 39146185, 48442297, 59511829, 72616013,
- 88043969, 106114625, 127178701, 151620757, 179861305, 212358985, 249612805,
- 292164445, 340600625, 395555537, 457713341, 527810725, 606639529, 695049433,
- 793950709, 904317037, 1027188385, 1163673953, 1314955181, 1482288821,
- 1667010073, 1870535785, 2094367717,
-#if defined(CUSTOM_MODES)
- /*...60:*/
- 2340095869U, 2609401873U, 2904062449U, 3225952925U, 3577050821U, 3959439497U,
-#endif
- /*N=8, K=8...37*/
- 48639, 108545, 224143, 433905, 795455, 1392065, 2340495, 3800305, 5984767,
- 9173505, 13726991, 20103025, 28875327, 40754369, 56610575, 77500017,
- 104692735, 139703809, 184327311, 240673265, 311207743, 398796225, 506750351,
- 638878193, 799538175, 993696769, 1226990095, 1505789553, 1837271615,
- 2229491905U,
-#if defined(CUSTOM_MODES)
- /*...40:*/
- 2691463695U, 3233240945U, 3866006015U,
-#endif
- /*N=9, K=9...28:*/
- 265729, 598417, 1256465, 2485825, 4673345, 8405905, 14546705, 24331777,
- 39490049, 62390545, 96220561, 145198913, 214828609, 312193553, 446304145,
- 628496897, 872893441, 1196924561, 1621925137, 2173806145U,
-#if defined(CUSTOM_MODES)
- /*...29:*/
- 2883810113U,
-#endif
- /*N=10, K=10...24:*/
- 1462563, 3317445, 7059735, 14218905, 27298155, 50250765, 89129247, 152951073,
- 254831667, 413442773, 654862247, 1014889769, 1541911931, 2300409629U,
- 3375210671U,
- /*N=11, K=11...19:*/
- 8097453, 18474633, 39753273, 81270333, 158819253, 298199265, 540279585,
- 948062325, 1616336765,
-#if defined(CUSTOM_MODES)
- /*...20:*/
- 2684641785U,
-#endif
- /*N=12, K=12...18:*/
- 45046719, 103274625, 224298231, 464387817, 921406335, 1759885185,
- 3248227095U,
- /*N=13, K=13...16:*/
- 251595969, 579168825, 1267854873, 2653649025U,
- /*N=14, K=14:*/
- 1409933619
-};
-
-#if defined(CUSTOM_MODES)
-static const opus_uint32 *const CELT_PVQ_U_ROW[15]={
- CELT_PVQ_U_DATA+ 0,CELT_PVQ_U_DATA+ 208,CELT_PVQ_U_DATA+ 415,
- CELT_PVQ_U_DATA+ 621,CELT_PVQ_U_DATA+ 826,CELT_PVQ_U_DATA+1030,
- CELT_PVQ_U_DATA+1233,CELT_PVQ_U_DATA+1336,CELT_PVQ_U_DATA+1389,
- CELT_PVQ_U_DATA+1421,CELT_PVQ_U_DATA+1441,CELT_PVQ_U_DATA+1455,
- CELT_PVQ_U_DATA+1464,CELT_PVQ_U_DATA+1470,CELT_PVQ_U_DATA+1473
-};
-#else
-static const opus_uint32 *const CELT_PVQ_U_ROW[15]={
- CELT_PVQ_U_DATA+ 0,CELT_PVQ_U_DATA+ 176,CELT_PVQ_U_DATA+ 351,
- CELT_PVQ_U_DATA+ 525,CELT_PVQ_U_DATA+ 698,CELT_PVQ_U_DATA+ 870,
- CELT_PVQ_U_DATA+1041,CELT_PVQ_U_DATA+1131,CELT_PVQ_U_DATA+1178,
- CELT_PVQ_U_DATA+1207,CELT_PVQ_U_DATA+1226,CELT_PVQ_U_DATA+1240,
- CELT_PVQ_U_DATA+1248,CELT_PVQ_U_DATA+1254,CELT_PVQ_U_DATA+1257
-};
-#endif
-
-#if defined(CUSTOM_MODES)
-void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){
- int k;
- /*_maxk==0 => there's nothing to do.*/
- celt_assert(_maxk>0);
- _bits[0]=0;
- for(k=1;k<=_maxk;k++)_bits[k]=log2_frac(CELT_PVQ_V(_n,k),_frac);
-}
-#endif
-
-static opus_uint32 icwrs(int _n,const int *_y){
- opus_uint32 i;
- int j;
- int k;
- celt_assert(_n>=2);
- j=_n-1;
- i=_y[j]<0;
- k=abs(_y[j]);
- do{
- j--;
- i+=CELT_PVQ_U(_n-j,k);
- k+=abs(_y[j]);
- if(_y[j]<0)i+=CELT_PVQ_U(_n-j,k+1);
- }
- while(j>0);
- return i;
-}
-
-void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){
- celt_assert(_k>0);
- ec_enc_uint(_enc,icwrs(_n,_y),CELT_PVQ_V(_n,_k));
-}
-
-static void cwrsi(int _n,int _k,opus_uint32 _i,int *_y){
- opus_uint32 p;
- int s;
- int k0;
- celt_assert(_k>0);
- celt_assert(_n>1);
- while(_n>2){
- opus_uint32 q;
- /*Lots of pulses case:*/
- if(_k>=_n){
- const opus_uint32 *row;
- row=CELT_PVQ_U_ROW[_n];
- /*Are the pulses in this dimension negative?*/
- p=row[_k+1];
- s=-(_i>=p);
- _i-=p&s;
- /*Count how many pulses were placed in this dimension.*/
- k0=_k;
- q=row[_n];
- if(q>_i){
- celt_assert(p>q);
- _k=_n;
- do p=CELT_PVQ_U_ROW[--_k][_n];
- while(p>_i);
- }
- else for(p=row[_k];p>_i;p=row[_k])_k--;
- _i-=p;
- *_y++=(k0-_k+s)^s;
- }
- /*Lots of dimensions case:*/
- else{
- /*Are there any pulses in this dimension at all?*/
- p=CELT_PVQ_U_ROW[_k][_n];
- q=CELT_PVQ_U_ROW[_k+1][_n];
- if(p<=_i&&_i<q){
- _i-=p;
- *_y++=0;
- }
- else{
- /*Are the pulses in this dimension negative?*/
- s=-(_i>=q);
- _i-=q&s;
- /*Count how many pulses were placed in this dimension.*/
- k0=_k;
- do p=CELT_PVQ_U_ROW[--_k][_n];
- while(p>_i);
- _i-=p;
- *_y++=(k0-_k+s)^s;
- }
- }
- _n--;
- }
- /*_n==2*/
- p=2*_k+1;
- s=-(_i>=p);
- _i-=p&s;
- k0=_k;
- _k=(_i+1)>>1;
- if(_k)_i-=2*_k-1;
- *_y++=(k0-_k+s)^s;
- /*_n==1*/
- s=-(int)_i;
- *_y=(_k+s)^s;
-}
-
-void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){
- cwrsi(_n,_k,ec_dec_uint(_dec,CELT_PVQ_V(_n,_k)),_y);
-}
-
-#else /* SMALL_FOOTPRINT */
-
-/*Computes the next row/column of any recurrence that obeys the relation
- u[i][j]=u[i-1][j]+u[i][j-1]+u[i-1][j-1].
- _ui0 is the base case for the new row/column.*/
-static OPUS_INLINE void unext(opus_uint32 *_ui,unsigned _len,opus_uint32 _ui0){
- opus_uint32 ui1;
- unsigned j;
- /*This do-while will overrun the array if we don't have storage for at least
- 2 values.*/
- j=1; do {
- ui1=UADD32(UADD32(_ui[j],_ui[j-1]),_ui0);
- _ui[j-1]=_ui0;
- _ui0=ui1;
- } while (++j<_len);
- _ui[j-1]=_ui0;
-}
-
-/*Computes the previous row/column of any recurrence that obeys the relation
- u[i-1][j]=u[i][j]-u[i][j-1]-u[i-1][j-1].
- _ui0 is the base case for the new row/column.*/
-static OPUS_INLINE void uprev(opus_uint32 *_ui,unsigned _n,opus_uint32 _ui0){
- opus_uint32 ui1;
- unsigned j;
- /*This do-while will overrun the array if we don't have storage for at least
- 2 values.*/
- j=1; do {
- ui1=USUB32(USUB32(_ui[j],_ui[j-1]),_ui0);
- _ui[j-1]=_ui0;
- _ui0=ui1;
- } while (++j<_n);
- _ui[j-1]=_ui0;
-}
-
-/*Compute V(_n,_k), as well as U(_n,0..._k+1).
- _u: On exit, _u[i] contains U(_n,i) for i in [0..._k+1].*/
-static opus_uint32 ncwrs_urow(unsigned _n,unsigned _k,opus_uint32 *_u){
- opus_uint32 um2;
- unsigned len;
- unsigned k;
- len=_k+2;
- /*We require storage at least 3 values (e.g., _k>0).*/
- celt_assert(len>=3);
- _u[0]=0;
- _u[1]=um2=1;
- /*If _n==0, _u[0] should be 1 and the rest should be 0.*/
- /*If _n==1, _u[i] should be 1 for i>1.*/
- celt_assert(_n>=2);
- /*If _k==0, the following do-while loop will overflow the buffer.*/
- celt_assert(_k>0);
- k=2;
- do _u[k]=(k<<1)-1;
- while(++k<len);
- for(k=2;k<_n;k++)unext(_u+1,_k+1,1);
- return _u[_k]+_u[_k+1];
-}
-
-/*Returns the _i'th combination of _k elements chosen from a set of size _n
- with associated sign bits.
- _y: Returns the vector of pulses.
- _u: Must contain entries [0..._k+1] of row _n of U() on input.
- Its contents will be destructively modified.*/
-static void cwrsi(int _n,int _k,opus_uint32 _i,int *_y,opus_uint32 *_u){
- int j;
- celt_assert(_n>0);
- j=0;
- do{
- opus_uint32 p;
- int s;
- int yj;
- p=_u[_k+1];
- s=-(_i>=p);
- _i-=p&s;
- yj=_k;
- p=_u[_k];
- while(p>_i)p=_u[--_k];
- _i-=p;
- yj-=_k;
- _y[j]=(yj+s)^s;
- uprev(_u,_k+2,0);
- }
- while(++j<_n);
-}
-
-/*Returns the index of the given combination of K elements chosen from a set
- of size 1 with associated sign bits.
- _y: The vector of pulses, whose sum of absolute values is K.
- _k: Returns K.*/
-static OPUS_INLINE opus_uint32 icwrs1(const int *_y,int *_k){
- *_k=abs(_y[0]);
- return _y[0]<0;
-}
-
-/*Returns the index of the given combination of K elements chosen from a set
- of size _n with associated sign bits.
- _y: The vector of pulses, whose sum of absolute values must be _k.
- _nc: Returns V(_n,_k).*/
-static OPUS_INLINE opus_uint32 icwrs(int _n,int _k,opus_uint32 *_nc,const int *_y,
- opus_uint32 *_u){
- opus_uint32 i;
- int j;
- int k;
- /*We can't unroll the first two iterations of the loop unless _n>=2.*/
- celt_assert(_n>=2);
- _u[0]=0;
- for(k=1;k<=_k+1;k++)_u[k]=(k<<1)-1;
- i=icwrs1(_y+_n-1,&k);
- j=_n-2;
- i+=_u[k];
- k+=abs(_y[j]);
- if(_y[j]<0)i+=_u[k+1];
- while(j-->0){
- unext(_u,_k+2,0);
- i+=_u[k];
- k+=abs(_y[j]);
- if(_y[j]<0)i+=_u[k+1];
- }
- *_nc=_u[k]+_u[k+1];
- return i;
-}
-
-#ifdef CUSTOM_MODES
-void get_required_bits(opus_int16 *_bits,int _n,int _maxk,int _frac){
- int k;
- /*_maxk==0 => there's nothing to do.*/
- celt_assert(_maxk>0);
- _bits[0]=0;
- if (_n==1)
- {
- for (k=1;k<=_maxk;k++)
- _bits[k] = 1<<_frac;
- }
- else {
- VARDECL(opus_uint32,u);
- SAVE_STACK;
- ALLOC(u,_maxk+2U,opus_uint32);
- ncwrs_urow(_n,_maxk,u);
- for(k=1;k<=_maxk;k++)
- _bits[k]=log2_frac(u[k]+u[k+1],_frac);
- RESTORE_STACK;
- }
-}
-#endif /* CUSTOM_MODES */
-
-void encode_pulses(const int *_y,int _n,int _k,ec_enc *_enc){
- opus_uint32 i;
- VARDECL(opus_uint32,u);
- opus_uint32 nc;
- SAVE_STACK;
- celt_assert(_k>0);
- ALLOC(u,_k+2U,opus_uint32);
- i=icwrs(_n,_k,&nc,_y,u);
- ec_enc_uint(_enc,i,nc);
- RESTORE_STACK;
-}
-
-void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){
- VARDECL(opus_uint32,u);
- SAVE_STACK;
- celt_assert(_k>0);
- ALLOC(u,_k+2U,opus_uint32);
- cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u);
- RESTORE_STACK;
-}
-
-#endif /* SMALL_FOOTPRINT */
diff --git a/src/opus-1.1/celt/cwrs.h b/src/opus-1.1/celt/cwrs.h
deleted file mode 100644
index 7dfbd076..00000000
--- a/src/opus-1.1/celt/cwrs.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Copyright (c) 2007-2009 Timothy B. Terriberry
- Written by Timothy B. Terriberry and Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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 CWRS_H
-#define CWRS_H
-
-#include "arch.h"
-#include "stack_alloc.h"
-#include "entenc.h"
-#include "entdec.h"
-
-#ifdef CUSTOM_MODES
-int log2_frac(opus_uint32 val, int frac);
-#endif
-
-void get_required_bits(opus_int16 *bits, int N, int K, int frac);
-
-void encode_pulses(const int *_y, int N, int K, ec_enc *enc);
-
-void decode_pulses(int *_y, int N, int K, ec_dec *dec);
-
-#endif /* CWRS_H */
diff --git a/src/opus-1.1/celt/ecintrin.h b/src/opus-1.1/celt/ecintrin.h
deleted file mode 100644
index 2263cff6..00000000
--- a/src/opus-1.1/celt/ecintrin.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Copyright (c) 2003-2008 Timothy B. Terriberry
- Copyright (c) 2008 Xiph.Org Foundation */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-/*Some common macros for potential platform-specific optimization.*/
-#include "opus_types.h"
-#include <math.h>
-#include <limits.h>
-#include "arch.h"
-#if !defined(_ecintrin_H)
-# define _ecintrin_H (1)
-
-/*Some specific platforms may have optimized intrinsic or OPUS_INLINE assembly
- versions of these functions which can substantially improve performance.
- We define macros for them to allow easy incorporation of these non-ANSI
- features.*/
-
-/*Modern gcc (4.x) can compile the naive versions of min and max with cmov if
- given an appropriate architecture, but the branchless bit-twiddling versions
- are just as fast, and do not require any special target architecture.
- Earlier gcc versions (3.x) compiled both code to the same assembly
- instructions, because of the way they represented ((_b)>(_a)) internally.*/
-# define EC_MINI(_a,_b) ((_a)+(((_b)-(_a))&-((_b)<(_a))))
-
-/*Count leading zeros.
- This macro should only be used for implementing ec_ilog(), if it is defined.
- All other code should use EC_ILOG() instead.*/
-#if defined(_MSC_VER) && (_MSC_VER >= 1400)
-# include <intrin.h>
-/*In _DEBUG mode this is not an intrinsic by default.*/
-# pragma intrinsic(_BitScanReverse)
-
-static __inline int ec_bsr(unsigned long _x){
- unsigned long ret;
- _BitScanReverse(&ret,_x);
- return (int)ret;
-}
-# define EC_CLZ0 (1)
-# define EC_CLZ(_x) (-ec_bsr(_x))
-#elif defined(ENABLE_TI_DSPLIB)
-# include "dsplib.h"
-# define EC_CLZ0 (31)
-# define EC_CLZ(_x) (_lnorm(_x))
-#elif __GNUC_PREREQ(3,4)
-# if INT_MAX>=2147483647
-# define EC_CLZ0 ((int)sizeof(unsigned)*CHAR_BIT)
-# define EC_CLZ(_x) (__builtin_clz(_x))
-# elif LONG_MAX>=2147483647L
-# define EC_CLZ0 ((int)sizeof(unsigned long)*CHAR_BIT)
-# define EC_CLZ(_x) (__builtin_clzl(_x))
-# endif
-#endif
-
-#if defined(EC_CLZ)
-/*Note that __builtin_clz is not defined when _x==0, according to the gcc
- documentation (and that of the BSR instruction that implements it on x86).
- The majority of the time we can never pass it zero.
- When we need to, it can be special cased.*/
-# define EC_ILOG(_x) (EC_CLZ0-EC_CLZ(_x))
-#else
-int ec_ilog(opus_uint32 _v);
-# define EC_ILOG(_x) (ec_ilog(_x))
-#endif
-#endif
diff --git a/src/opus-1.1/celt/entcode.c b/src/opus-1.1/celt/entcode.c
deleted file mode 100644
index fa5d7c7c..00000000
--- a/src/opus-1.1/celt/entcode.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright (c) 2001-2011 Timothy B. Terriberry
-*/
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "entcode.h"
-#include "arch.h"
-
-#if !defined(EC_CLZ)
-/*This is a fallback for systems where we don't know how to access
- a BSR or CLZ instruction (see ecintrin.h).
- If you are optimizing Opus on a new platform and it has a native CLZ or
- BZR (e.g. cell, MIPS, x86, etc) then making it available to Opus will be
- an easy performance win.*/
-int ec_ilog(opus_uint32 _v){
- /*On a Pentium M, this branchless version tested as the fastest on
- 1,000,000,000 random 32-bit integers, edging out a similar version with
- branches, and a 256-entry LUT version.*/
- int ret;
- int m;
- ret=!!_v;
- m=!!(_v&0xFFFF0000)<<4;
- _v>>=m;
- ret|=m;
- m=!!(_v&0xFF00)<<3;
- _v>>=m;
- ret|=m;
- m=!!(_v&0xF0)<<2;
- _v>>=m;
- ret|=m;
- m=!!(_v&0xC)<<1;
- _v>>=m;
- ret|=m;
- ret+=!!(_v&0x2);
- return ret;
-}
-#endif
-
-opus_uint32 ec_tell_frac(ec_ctx *_this){
- opus_uint32 nbits;
- opus_uint32 r;
- int l;
- int i;
- /*To handle the non-integral number of bits still left in the encoder/decoder
- state, we compute the worst-case number of bits of val that must be
- encoded to ensure that the value is inside the range for any possible
- subsequent bits.
- The computation here is independent of val itself (the decoder does not
- even track that value), even though the real number of bits used after
- ec_enc_done() may be 1 smaller if rng is a power of two and the
- corresponding trailing bits of val are all zeros.
- If we did try to track that special case, then coding a value with a
- probability of 1/(1<<n) might sometimes appear to use more than n bits.
- This may help explain the surprising result that a newly initialized
- encoder or decoder claims to have used 1 bit.*/
- nbits=_this->nbits_total<<BITRES;
- l=EC_ILOG(_this->rng);
- r=_this->rng>>(l-16);
- for(i=BITRES;i-->0;){
- int b;
- r=r*r>>15;
- b=(int)(r>>16);
- l=l<<1|b;
- r>>=b;
- }
- return nbits-l;
-}
diff --git a/src/opus-1.1/celt/entcode.h b/src/opus-1.1/celt/entcode.h
deleted file mode 100644
index dd13e49e..00000000
--- a/src/opus-1.1/celt/entcode.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* Copyright (c) 2001-2011 Timothy B. Terriberry
- Copyright (c) 2008-2009 Xiph.Org Foundation */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#include "opus_types.h"
-#include "opus_defines.h"
-
-#if !defined(_entcode_H)
-# define _entcode_H (1)
-# include <limits.h>
-# include <stddef.h>
-# include "ecintrin.h"
-
-/*OPT: ec_window must be at least 32 bits, but if you have fast arithmetic on a
- larger type, you can speed up the decoder by using it here.*/
-typedef opus_uint32 ec_window;
-typedef struct ec_ctx ec_ctx;
-typedef struct ec_ctx ec_enc;
-typedef struct ec_ctx ec_dec;
-
-# define EC_WINDOW_SIZE ((int)sizeof(ec_window)*CHAR_BIT)
-
-/*The number of bits to use for the range-coded part of unsigned integers.*/
-# define EC_UINT_BITS (8)
-
-/*The resolution of fractional-precision bit usage measurements, i.e.,
- 3 => 1/8th bits.*/
-# define BITRES 3
-
-/*The entropy encoder/decoder context.
- We use the same structure for both, so that common functions like ec_tell()
- can be used on either one.*/
-struct ec_ctx{
- /*Buffered input/output.*/
- unsigned char *buf;
- /*The size of the buffer.*/
- opus_uint32 storage;
- /*The offset at which the last byte containing raw bits was read/written.*/
- opus_uint32 end_offs;
- /*Bits that will be read from/written at the end.*/
- ec_window end_window;
- /*Number of valid bits in end_window.*/
- int nend_bits;
- /*The total number of whole bits read/written.
- This does not include partial bits currently in the range coder.*/
- int nbits_total;
- /*The offset at which the next range coder byte will be read/written.*/
- opus_uint32 offs;
- /*The number of values in the current range.*/
- opus_uint32 rng;
- /*In the decoder: the difference between the top of the current range and
- the input value, minus one.
- In the encoder: the low end of the current range.*/
- opus_uint32 val;
- /*In the decoder: the saved normalization factor from ec_decode().
- In the encoder: the number of oustanding carry propagating symbols.*/
- opus_uint32 ext;
- /*A buffered input/output symbol, awaiting carry propagation.*/
- int rem;
- /*Nonzero if an error occurred.*/
- int error;
-};
-
-static OPUS_INLINE opus_uint32 ec_range_bytes(ec_ctx *_this){
- return _this->offs;
-}
-
-static OPUS_INLINE unsigned char *ec_get_buffer(ec_ctx *_this){
- return _this->buf;
-}
-
-static OPUS_INLINE int ec_get_error(ec_ctx *_this){
- return _this->error;
-}
-
-/*Returns the number of bits "used" by the encoded or decoded symbols so far.
- This same number can be computed in either the encoder or the decoder, and is
- suitable for making coding decisions.
- Return: The number of bits.
- This will always be slightly larger than the exact value (e.g., all
- rounding error is in the positive direction).*/
-static OPUS_INLINE int ec_tell(ec_ctx *_this){
- return _this->nbits_total-EC_ILOG(_this->rng);
-}
-
-/*Returns the number of bits "used" by the encoded or decoded symbols so far.
- This same number can be computed in either the encoder or the decoder, and is
- suitable for making coding decisions.
- Return: The number of bits scaled by 2**BITRES.
- This will always be slightly larger than the exact value (e.g., all
- rounding error is in the positive direction).*/
-opus_uint32 ec_tell_frac(ec_ctx *_this);
-
-#endif
diff --git a/src/opus-1.1/celt/entdec.c b/src/opus-1.1/celt/entdec.c
deleted file mode 100644
index 3c264685..00000000
--- a/src/opus-1.1/celt/entdec.c
+++ /dev/null
@@ -1,245 +0,0 @@
-/* Copyright (c) 2001-2011 Timothy B. Terriberry
- Copyright (c) 2008-2009 Xiph.Org Foundation */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stddef.h>
-#include "os_support.h"
-#include "arch.h"
-#include "entdec.h"
-#include "mfrngcod.h"
-
-/*A range decoder.
- This is an entropy decoder based upon \cite{Mar79}, which is itself a
- rediscovery of the FIFO arithmetic code introduced by \cite{Pas76}.
- It is very similar to arithmetic encoding, except that encoding is done with
- digits in any base, instead of with bits, and so it is faster when using
- larger bases (i.e.: a byte).
- The author claims an average waste of $\frac{1}{2}\log_b(2b)$ bits, where $b$
- is the base, longer than the theoretical optimum, but to my knowledge there
- is no published justification for this claim.
- This only seems true when using near-infinite precision arithmetic so that
- the process is carried out with no rounding errors.
-
- An excellent description of implementation details is available at
- http://www.arturocampos.com/ac_range.html
- A recent work \cite{MNW98} which proposes several changes to arithmetic
- encoding for efficiency actually re-discovers many of the principles
- behind range encoding, and presents a good theoretical analysis of them.
-
- End of stream is handled by writing out the smallest number of bits that
- ensures that the stream will be correctly decoded regardless of the value of
- any subsequent bits.
- ec_tell() can be used to determine how many bits were needed to decode
- all the symbols thus far; other data can be packed in the remaining bits of
- the input buffer.
- @PHDTHESIS{Pas76,
- author="Richard Clark Pasco",
- title="Source coding algorithms for fast data compression",
- school="Dept. of Electrical Engineering, Stanford University",
- address="Stanford, CA",
- month=May,
- year=1976
- }
- @INPROCEEDINGS{Mar79,
- author="Martin, G.N.N.",
- title="Range encoding: an algorithm for removing redundancy from a digitised
- message",
- booktitle="Video & Data Recording Conference",
- year=1979,
- address="Southampton",
- month=Jul
- }
- @ARTICLE{MNW98,
- author="Alistair Moffat and Radford Neal and Ian H. Witten",
- title="Arithmetic Coding Revisited",
- journal="{ACM} Transactions on Information Systems",
- year=1998,
- volume=16,
- number=3,
- pages="256--294",
- month=Jul,
- URL="http://www.stanford.edu/class/ee398a/handouts/papers/Moffat98ArithmCoding.pdf"
- }*/
-
-static int ec_read_byte(ec_dec *_this){
- return _this->offs<_this->storage?_this->buf[_this->offs++]:0;
-}
-
-static int ec_read_byte_from_end(ec_dec *_this){
- return _this->end_offs<_this->storage?
- _this->buf[_this->storage-++(_this->end_offs)]:0;
-}
-
-/*Normalizes the contents of val and rng so that rng lies entirely in the
- high-order symbol.*/
-static void ec_dec_normalize(ec_dec *_this){
- /*If the range is too small, rescale it and input some bits.*/
- while(_this->rng<=EC_CODE_BOT){
- int sym;
- _this->nbits_total+=EC_SYM_BITS;
- _this->rng<<=EC_SYM_BITS;
- /*Use up the remaining bits from our last symbol.*/
- sym=_this->rem;
- /*Read the next value from the input.*/
- _this->rem=ec_read_byte(_this);
- /*Take the rest of the bits we need from this new symbol.*/
- sym=(sym<<EC_SYM_BITS|_this->rem)>>(EC_SYM_BITS-EC_CODE_EXTRA);
- /*And subtract them from val, capped to be less than EC_CODE_TOP.*/
- _this->val=((_this->val<<EC_SYM_BITS)+(EC_SYM_MAX&~sym))&(EC_CODE_TOP-1);
- }
-}
-
-void ec_dec_init(ec_dec *_this,unsigned char *_buf,opus_uint32 _storage){
- _this->buf=_buf;
- _this->storage=_storage;
- _this->end_offs=0;
- _this->end_window=0;
- _this->nend_bits=0;
- /*This is the offset from which ec_tell() will subtract partial bits.
- The final value after the ec_dec_normalize() call will be the same as in
- the encoder, but we have to compensate for the bits that are added there.*/
- _this->nbits_total=EC_CODE_BITS+1
- -((EC_CODE_BITS-EC_CODE_EXTRA)/EC_SYM_BITS)*EC_SYM_BITS;
- _this->offs=0;
- _this->rng=1U<<EC_CODE_EXTRA;
- _this->rem=ec_read_byte(_this);
- _this->val=_this->rng-1-(_this->rem>>(EC_SYM_BITS-EC_CODE_EXTRA));
- _this->error=0;
- /*Normalize the interval.*/
- ec_dec_normalize(_this);
-}
-
-unsigned ec_decode(ec_dec *_this,unsigned _ft){
- unsigned s;
- _this->ext=_this->rng/_ft;
- s=(unsigned)(_this->val/_this->ext);
- return _ft-EC_MINI(s+1,_ft);
-}
-
-unsigned ec_decode_bin(ec_dec *_this,unsigned _bits){
- unsigned s;
- _this->ext=_this->rng>>_bits;
- s=(unsigned)(_this->val/_this->ext);
- return (1U<<_bits)-EC_MINI(s+1U,1U<<_bits);
-}
-
-void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft){
- opus_uint32 s;
- s=IMUL32(_this->ext,_ft-_fh);
- _this->val-=s;
- _this->rng=_fl>0?IMUL32(_this->ext,_fh-_fl):_this->rng-s;
- ec_dec_normalize(_this);
-}
-
-/*The probability of having a "one" is 1/(1<<_logp).*/
-int ec_dec_bit_logp(ec_dec *_this,unsigned _logp){
- opus_uint32 r;
- opus_uint32 d;
- opus_uint32 s;
- int ret;
- r=_this->rng;
- d=_this->val;
- s=r>>_logp;
- ret=d<s;
- if(!ret)_this->val=d-s;
- _this->rng=ret?s:r-s;
- ec_dec_normalize(_this);
- return ret;
-}
-
-int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb){
- opus_uint32 r;
- opus_uint32 d;
- opus_uint32 s;
- opus_uint32 t;
- int ret;
- s=_this->rng;
- d=_this->val;
- r=s>>_ftb;
- ret=-1;
- do{
- t=s;
- s=IMUL32(r,_icdf[++ret]);
- }
- while(d<s);
- _this->val=d-s;
- _this->rng=t-s;
- ec_dec_normalize(_this);
- return ret;
-}
-
-opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft){
- unsigned ft;
- unsigned s;
- int ftb;
- /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/
- celt_assert(_ft>1);
- _ft--;
- ftb=EC_ILOG(_ft);
- if(ftb>EC_UINT_BITS){
- opus_uint32 t;
- ftb-=EC_UINT_BITS;
- ft=(unsigned)(_ft>>ftb)+1;
- s=ec_decode(_this,ft);
- ec_dec_update(_this,s,s+1,ft);
- t=(opus_uint32)s<<ftb|ec_dec_bits(_this,ftb);
- if(t<=_ft)return t;
- _this->error=1;
- return _ft;
- }
- else{
- _ft++;
- s=ec_decode(_this,(unsigned)_ft);
- ec_dec_update(_this,s,s+1,(unsigned)_ft);
- return s;
- }
-}
-
-opus_uint32 ec_dec_bits(ec_dec *_this,unsigned _bits){
- ec_window window;
- int available;
- opus_uint32 ret;
- window=_this->end_window;
- available=_this->nend_bits;
- if((unsigned)available<_bits){
- do{
- window|=(ec_window)ec_read_byte_from_end(_this)<<available;
- available+=EC_SYM_BITS;
- }
- while(available<=EC_WINDOW_SIZE-EC_SYM_BITS);
- }
- ret=(opus_uint32)window&(((opus_uint32)1<<_bits)-1U);
- window>>=_bits;
- available-=_bits;
- _this->end_window=window;
- _this->nend_bits=available;
- _this->nbits_total+=_bits;
- return ret;
-}
diff --git a/src/opus-1.1/celt/entdec.h b/src/opus-1.1/celt/entdec.h
deleted file mode 100644
index d8ab3187..00000000
--- a/src/opus-1.1/celt/entdec.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Copyright (c) 2001-2011 Timothy B. Terriberry
- Copyright (c) 2008-2009 Xiph.Org Foundation */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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(_entdec_H)
-# define _entdec_H (1)
-# include <limits.h>
-# include "entcode.h"
-
-/*Initializes the decoder.
- _buf: The input buffer to use.
- Return: 0 on success, or a negative value on error.*/
-void ec_dec_init(ec_dec *_this,unsigned char *_buf,opus_uint32 _storage);
-
-/*Calculates the cumulative frequency for the next symbol.
- This can then be fed into the probability model to determine what that
- symbol is, and the additional frequency information required to advance to
- the next symbol.
- This function cannot be called more than once without a corresponding call to
- ec_dec_update(), or decoding will not proceed correctly.
- _ft: The total frequency of the symbols in the alphabet the next symbol was
- encoded with.
- Return: A cumulative frequency representing the encoded symbol.
- If the cumulative frequency of all the symbols before the one that
- was encoded was fl, and the cumulative frequency of all the symbols
- up to and including the one encoded is fh, then the returned value
- will fall in the range [fl,fh).*/
-unsigned ec_decode(ec_dec *_this,unsigned _ft);
-
-/*Equivalent to ec_decode() with _ft==1<<_bits.*/
-unsigned ec_decode_bin(ec_dec *_this,unsigned _bits);
-
-/*Advance the decoder past the next symbol using the frequency information the
- symbol was encoded with.
- Exactly one call to ec_decode() must have been made so that all necessary
- intermediate calculations are performed.
- _fl: The cumulative frequency of all symbols that come before the symbol
- decoded.
- _fh: The cumulative frequency of all symbols up to and including the symbol
- decoded.
- Together with _fl, this defines the range [_fl,_fh) in which the value
- returned above must fall.
- _ft: The total frequency of the symbols in the alphabet the symbol decoded
- was encoded in.
- This must be the same as passed to the preceding call to ec_decode().*/
-void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft);
-
-/* Decode a bit that has a 1/(1<<_logp) probability of being a one */
-int ec_dec_bit_logp(ec_dec *_this,unsigned _logp);
-
-/*Decodes a symbol given an "inverse" CDF table.
- No call to ec_dec_update() is necessary after this call.
- _icdf: The "inverse" CDF, such that symbol s falls in the range
- [s>0?ft-_icdf[s-1]:0,ft-_icdf[s]), where ft=1<<_ftb.
- The values must be monotonically non-increasing, and the last value
- must be 0.
- _ftb: The number of bits of precision in the cumulative distribution.
- Return: The decoded symbol s.*/
-int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb);
-
-/*Extracts a raw unsigned integer with a non-power-of-2 range from the stream.
- The bits must have been encoded with ec_enc_uint().
- No call to ec_dec_update() is necessary after this call.
- _ft: The number of integers that can be decoded (one more than the max).
- This must be at least one, and no more than 2**32-1.
- Return: The decoded bits.*/
-opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft);
-
-/*Extracts a sequence of raw bits from the stream.
- The bits must have been encoded with ec_enc_bits().
- No call to ec_dec_update() is necessary after this call.
- _ftb: The number of bits to extract.
- This must be between 0 and 25, inclusive.
- Return: The decoded bits.*/
-opus_uint32 ec_dec_bits(ec_dec *_this,unsigned _ftb);
-
-#endif
diff --git a/src/opus-1.1/celt/entenc.c b/src/opus-1.1/celt/entenc.c
deleted file mode 100644
index a7e34ece..00000000
--- a/src/opus-1.1/celt/entenc.c
+++ /dev/null
@@ -1,294 +0,0 @@
-/* Copyright (c) 2001-2011 Timothy B. Terriberry
- Copyright (c) 2008-2009 Xiph.Org Foundation */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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(HAVE_CONFIG_H)
-# include "config.h"
-#endif
-#include "os_support.h"
-#include "arch.h"
-#include "entenc.h"
-#include "mfrngcod.h"
-
-/*A range encoder.
- See entdec.c and the references for implementation details \cite{Mar79,MNW98}.
-
- @INPROCEEDINGS{Mar79,
- author="Martin, G.N.N.",
- title="Range encoding: an algorithm for removing redundancy from a digitised
- message",
- booktitle="Video \& Data Recording Conference",
- year=1979,
- address="Southampton",
- month=Jul
- }
- @ARTICLE{MNW98,
- author="Alistair Moffat and Radford Neal and Ian H. Witten",
- title="Arithmetic Coding Revisited",
- journal="{ACM} Transactions on Information Systems",
- year=1998,
- volume=16,
- number=3,
- pages="256--294",
- month=Jul,
- URL="http://www.stanford.edu/class/ee398/handouts/papers/Moffat98ArithmCoding.pdf"
- }*/
-
-static int ec_write_byte(ec_enc *_this,unsigned _value){
- if(_this->offs+_this->end_offs>=_this->storage)return -1;
- _this->buf[_this->offs++]=(unsigned char)_value;
- return 0;
-}
-
-static int ec_write_byte_at_end(ec_enc *_this,unsigned _value){
- if(_this->offs+_this->end_offs>=_this->storage)return -1;
- _this->buf[_this->storage-++(_this->end_offs)]=(unsigned char)_value;
- return 0;
-}
-
-/*Outputs a symbol, with a carry bit.
- If there is a potential to propagate a carry over several symbols, they are
- buffered until it can be determined whether or not an actual carry will
- occur.
- If the counter for the buffered symbols overflows, then the stream becomes
- undecodable.
- This gives a theoretical limit of a few billion symbols in a single packet on
- 32-bit systems.
- The alternative is to truncate the range in order to force a carry, but
- requires similar carry tracking in the decoder, needlessly slowing it down.*/
-static void ec_enc_carry_out(ec_enc *_this,int _c){
- if(_c!=EC_SYM_MAX){
- /*No further carry propagation possible, flush buffer.*/
- int carry;
- carry=_c>>EC_SYM_BITS;
- /*Don't output a byte on the first write.
- This compare should be taken care of by branch-prediction thereafter.*/
- if(_this->rem>=0)_this->error|=ec_write_byte(_this,_this->rem+carry);
- if(_this->ext>0){
- unsigned sym;
- sym=(EC_SYM_MAX+carry)&EC_SYM_MAX;
- do _this->error|=ec_write_byte(_this,sym);
- while(--(_this->ext)>0);
- }
- _this->rem=_c&EC_SYM_MAX;
- }
- else _this->ext++;
-}
-
-static void ec_enc_normalize(ec_enc *_this){
- /*If the range is too small, output some bits and rescale it.*/
- while(_this->rng<=EC_CODE_BOT){
- ec_enc_carry_out(_this,(int)(_this->val>>EC_CODE_SHIFT));
- /*Move the next-to-high-order symbol into the high-order position.*/
- _this->val=(_this->val<<EC_SYM_BITS)&(EC_CODE_TOP-1);
- _this->rng<<=EC_SYM_BITS;
- _this->nbits_total+=EC_SYM_BITS;
- }
-}
-
-void ec_enc_init(ec_enc *_this,unsigned char *_buf,opus_uint32 _size){
- _this->buf=_buf;
- _this->end_offs=0;
- _this->end_window=0;
- _this->nend_bits=0;
- /*This is the offset from which ec_tell() will subtract partial bits.*/
- _this->nbits_total=EC_CODE_BITS+1;
- _this->offs=0;
- _this->rng=EC_CODE_TOP;
- _this->rem=-1;
- _this->val=0;
- _this->ext=0;
- _this->storage=_size;
- _this->error=0;
-}
-
-void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft){
- opus_uint32 r;
- r=_this->rng/_ft;
- if(_fl>0){
- _this->val+=_this->rng-IMUL32(r,(_ft-_fl));
- _this->rng=IMUL32(r,(_fh-_fl));
- }
- else _this->rng-=IMUL32(r,(_ft-_fh));
- ec_enc_normalize(_this);
-}
-
-void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits){
- opus_uint32 r;
- r=_this->rng>>_bits;
- if(_fl>0){
- _this->val+=_this->rng-IMUL32(r,((1U<<_bits)-_fl));
- _this->rng=IMUL32(r,(_fh-_fl));
- }
- else _this->rng-=IMUL32(r,((1U<<_bits)-_fh));
- ec_enc_normalize(_this);
-}
-
-/*The probability of having a "one" is 1/(1<<_logp).*/
-void ec_enc_bit_logp(ec_enc *_this,int _val,unsigned _logp){
- opus_uint32 r;
- opus_uint32 s;
- opus_uint32 l;
- r=_this->rng;
- l=_this->val;
- s=r>>_logp;
- r-=s;
- if(_val)_this->val=l+r;
- _this->rng=_val?s:r;
- ec_enc_normalize(_this);
-}
-
-void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb){
- opus_uint32 r;
- r=_this->rng>>_ftb;
- if(_s>0){
- _this->val+=_this->rng-IMUL32(r,_icdf[_s-1]);
- _this->rng=IMUL32(r,_icdf[_s-1]-_icdf[_s]);
- }
- else _this->rng-=IMUL32(r,_icdf[_s]);
- ec_enc_normalize(_this);
-}
-
-void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft){
- unsigned ft;
- unsigned fl;
- int ftb;
- /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/
- celt_assert(_ft>1);
- _ft--;
- ftb=EC_ILOG(_ft);
- if(ftb>EC_UINT_BITS){
- ftb-=EC_UINT_BITS;
- ft=(_ft>>ftb)+1;
- fl=(unsigned)(_fl>>ftb);
- ec_encode(_this,fl,fl+1,ft);
- ec_enc_bits(_this,_fl&(((opus_uint32)1<<ftb)-1U),ftb);
- }
- else ec_encode(_this,_fl,_fl+1,_ft+1);
-}
-
-void ec_enc_bits(ec_enc *_this,opus_uint32 _fl,unsigned _bits){
- ec_window window;
- int used;
- window=_this->end_window;
- used=_this->nend_bits;
- celt_assert(_bits>0);
- if(used+_bits>EC_WINDOW_SIZE){
- do{
- _this->error|=ec_write_byte_at_end(_this,(unsigned)window&EC_SYM_MAX);
- window>>=EC_SYM_BITS;
- used-=EC_SYM_BITS;
- }
- while(used>=EC_SYM_BITS);
- }
- window|=(ec_window)_fl<<used;
- used+=_bits;
- _this->end_window=window;
- _this->nend_bits=used;
- _this->nbits_total+=_bits;
-}
-
-void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits){
- int shift;
- unsigned mask;
- celt_assert(_nbits<=EC_SYM_BITS);
- shift=EC_SYM_BITS-_nbits;
- mask=((1<<_nbits)-1)<<shift;
- if(_this->offs>0){
- /*The first byte has been finalized.*/
- _this->buf[0]=(unsigned char)((_this->buf[0]&~mask)|_val<<shift);
- }
- else if(_this->rem>=0){
- /*The first byte is still awaiting carry propagation.*/
- _this->rem=(_this->rem&~mask)|_val<<shift;
- }
- else if(_this->rng<=(EC_CODE_TOP>>_nbits)){
- /*The renormalization loop has never been run.*/
- _this->val=(_this->val&~((opus_uint32)mask<<EC_CODE_SHIFT))|
- (opus_uint32)_val<<(EC_CODE_SHIFT+shift);
- }
- /*The encoder hasn't even encoded _nbits of data yet.*/
- else _this->error=-1;
-}
-
-void ec_enc_shrink(ec_enc *_this,opus_uint32 _size){
- celt_assert(_this->offs+_this->end_offs<=_size);
- OPUS_MOVE(_this->buf+_size-_this->end_offs,
- _this->buf+_this->storage-_this->end_offs,_this->end_offs);
- _this->storage=_size;
-}
-
-void ec_enc_done(ec_enc *_this){
- ec_window window;
- int used;
- opus_uint32 msk;
- opus_uint32 end;
- int l;
- /*We output the minimum number of bits that ensures that the symbols encoded
- thus far will be decoded correctly regardless of the bits that follow.*/
- l=EC_CODE_BITS-EC_ILOG(_this->rng);
- msk=(EC_CODE_TOP-1)>>l;
- end=(_this->val+msk)&~msk;
- if((end|msk)>=_this->val+_this->rng){
- l++;
- msk>>=1;
- end=(_this->val+msk)&~msk;
- }
- while(l>0){
- ec_enc_carry_out(_this,(int)(end>>EC_CODE_SHIFT));
- end=(end<<EC_SYM_BITS)&(EC_CODE_TOP-1);
- l-=EC_SYM_BITS;
- }
- /*If we have a buffered byte flush it into the output buffer.*/
- if(_this->rem>=0||_this->ext>0)ec_enc_carry_out(_this,0);
- /*If we have buffered extra bits, flush them as well.*/
- window=_this->end_window;
- used=_this->nend_bits;
- while(used>=EC_SYM_BITS){
- _this->error|=ec_write_byte_at_end(_this,(unsigned)window&EC_SYM_MAX);
- window>>=EC_SYM_BITS;
- used-=EC_SYM_BITS;
- }
- /*Clear any excess space and add any remaining extra bits to the last byte.*/
- if(!_this->error){
- OPUS_CLEAR(_this->buf+_this->offs,
- _this->storage-_this->offs-_this->end_offs);
- if(used>0){
- /*If there's no range coder data at all, give up.*/
- if(_this->end_offs>=_this->storage)_this->error=-1;
- else{
- l=-l;
- /*If we've busted, don't add too many extra bits to the last byte; it
- would corrupt the range coder data, and that's more important.*/
- if(_this->offs+_this->end_offs>=_this->storage&&l<used){
- window&=(1<<l)-1;
- _this->error=-1;
- }
- _this->buf[_this->storage-_this->end_offs-1]|=(unsigned char)window;
- }
- }
- }
-}
diff --git a/src/opus-1.1/celt/entenc.h b/src/opus-1.1/celt/entenc.h
deleted file mode 100644
index 796bc4d5..00000000
--- a/src/opus-1.1/celt/entenc.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/* Copyright (c) 2001-2011 Timothy B. Terriberry
- Copyright (c) 2008-2009 Xiph.Org Foundation */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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(_entenc_H)
-# define _entenc_H (1)
-# include <stddef.h>
-# include "entcode.h"
-
-/*Initializes the encoder.
- _buf: The buffer to store output bytes in.
- _size: The size of the buffer, in chars.*/
-void ec_enc_init(ec_enc *_this,unsigned char *_buf,opus_uint32 _size);
-/*Encodes a symbol given its frequency information.
- The frequency information must be discernable by the decoder, assuming it
- has read only the previous symbols from the stream.
- It is allowable to change the frequency information, or even the entire
- source alphabet, so long as the decoder can tell from the context of the
- previously encoded information that it is supposed to do so as well.
- _fl: The cumulative frequency of all symbols that come before the one to be
- encoded.
- _fh: The cumulative frequency of all symbols up to and including the one to
- be encoded.
- Together with _fl, this defines the range [_fl,_fh) in which the
- decoded value will fall.
- _ft: The sum of the frequencies of all the symbols*/
-void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft);
-
-/*Equivalent to ec_encode() with _ft==1<<_bits.*/
-void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits);
-
-/* Encode a bit that has a 1/(1<<_logp) probability of being a one */
-void ec_enc_bit_logp(ec_enc *_this,int _val,unsigned _logp);
-
-/*Encodes a symbol given an "inverse" CDF table.
- _s: The index of the symbol to encode.
- _icdf: The "inverse" CDF, such that symbol _s falls in the range
- [_s>0?ft-_icdf[_s-1]:0,ft-_icdf[_s]), where ft=1<<_ftb.
- The values must be monotonically non-increasing, and the last value
- must be 0.
- _ftb: The number of bits of precision in the cumulative distribution.*/
-void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb);
-
-/*Encodes a raw unsigned integer in the stream.
- _fl: The integer to encode.
- _ft: The number of integers that can be encoded (one more than the max).
- This must be at least one, and no more than 2**32-1.*/
-void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft);
-
-/*Encodes a sequence of raw bits in the stream.
- _fl: The bits to encode.
- _ftb: The number of bits to encode.
- This must be between 1 and 25, inclusive.*/
-void ec_enc_bits(ec_enc *_this,opus_uint32 _fl,unsigned _ftb);
-
-/*Overwrites a few bits at the very start of an existing stream, after they
- have already been encoded.
- This makes it possible to have a few flags up front, where it is easy for
- decoders to access them without parsing the whole stream, even if their
- values are not determined until late in the encoding process, without having
- to buffer all the intermediate symbols in the encoder.
- In order for this to work, at least _nbits bits must have already been
- encoded using probabilities that are an exact power of two.
- The encoder can verify the number of encoded bits is sufficient, but cannot
- check this latter condition.
- _val: The bits to encode (in the least _nbits significant bits).
- They will be decoded in order from most-significant to least.
- _nbits: The number of bits to overwrite.
- This must be no more than 8.*/
-void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits);
-
-/*Compacts the data to fit in the target size.
- This moves up the raw bits at the end of the current buffer so they are at
- the end of the new buffer size.
- The caller must ensure that the amount of data that's already been written
- will fit in the new size.
- _size: The number of bytes in the new buffer.
- This must be large enough to contain the bits already written, and
- must be no larger than the existing size.*/
-void ec_enc_shrink(ec_enc *_this,opus_uint32 _size);
-
-/*Indicates that there are no more symbols to encode.
- All reamining output bytes are flushed to the output buffer.
- ec_enc_init() must be called before the encoder can be used again.*/
-void ec_enc_done(ec_enc *_this);
-
-#endif
diff --git a/src/opus-1.1/celt/fixed_debug.h b/src/opus-1.1/celt/fixed_debug.h
deleted file mode 100644
index 80bc9491..00000000
--- a/src/opus-1.1/celt/fixed_debug.h
+++ /dev/null
@@ -1,773 +0,0 @@
-/* Copyright (C) 2003-2008 Jean-Marc Valin
- Copyright (C) 2007-2012 Xiph.Org Foundation */
-/**
- @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.
-
- 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 COPYRIGHT OWNER
- 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>
-#include "opus_defines.h"
-
-#ifdef CELT_C
-OPUS_EXPORT opus_int64 celt_mips=0;
-#else
-extern opus_int64 celt_mips;
-#endif
-
-#define MULT16_16SU(a,b) ((opus_val32)(opus_val16)(a)*(opus_val32)(opus_uint16)(b))
-#define MULT32_32_Q31(a,b) ADD32(ADD32(SHL32(MULT16_16(SHR32((a),16),SHR((b),16)),1), SHR32(MULT16_16SU(SHR32((a),16),((b)&0x0000ffff)),15)), SHR32(MULT16_16SU(SHR32((b),16),((a)&0x0000ffff)),15))
-
-/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */
-#define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR32((b),16)), SHR32(MULT16_16SU((a),((b)&0x0000ffff)),16))
-
-#define MULT16_32_P16(a,b) MULT16_32_PX(a,b,16)
-
-#define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits))))
-#define QCONST32(x,bits) ((opus_val32)(.5+(x)*(((opus_val32)1)<<(bits))))
-
-#define VERIFY_SHORT(x) ((x)<=32767&&(x)>=-32768)
-#define VERIFY_INT(x) ((x)<=2147483647LL&&(x)>=-2147483648LL)
-#define VERIFY_UINT(x) ((x)<=(2147483647LLU<<1))
-
-#define SHR(a,b) SHR32(a,b)
-#define PSHR(a,b) PSHR32(a,b)
-
-static OPUS_INLINE short NEG16(int x)
-{
- int res;
- if (!VERIFY_SHORT(x))
- {
- fprintf (stderr, "NEG16: input is not short: %d\n", (int)x);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = -x;
- if (!VERIFY_SHORT(res))
- {
- fprintf (stderr, "NEG16: output is not short: %d\n", (int)res);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips++;
- return res;
-}
-static OPUS_INLINE int NEG32(opus_int64 x)
-{
- opus_int64 res;
- if (!VERIFY_INT(x))
- {
- fprintf (stderr, "NEG16: input is not int: %d\n", (int)x);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = -x;
- if (!VERIFY_INT(res))
- {
- fprintf (stderr, "NEG16: output is not int: %d\n", (int)res);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=2;
- return res;
-}
-
-#define EXTRACT16(x) EXTRACT16_(x, __FILE__, __LINE__)
-static OPUS_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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = x;
- celt_mips++;
- return res;
-}
-
-#define EXTEND32(x) EXTEND32_(x, __FILE__, __LINE__)
-static OPUS_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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = x;
- celt_mips++;
- return res;
-}
-
-#define SHR16(a, shift) SHR16_(a, shift, __FILE__, __LINE__)
-static OPUS_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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = a>>shift;
- if (!VERIFY_SHORT(res))
- {
- fprintf (stderr, "SHR16: output is not short: %d in %s: line %d\n", res, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips++;
- return res;
-}
-#define SHL16(a, shift) SHL16_(a, shift, __FILE__, __LINE__)
-static OPUS_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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = a<<shift;
- if (!VERIFY_SHORT(res))
- {
- fprintf (stderr, "SHL16: output is not short: %d in %s: line %d\n", res, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips++;
- return res;
-}
-
-static OPUS_INLINE int SHR32(opus_int64 a, int shift)
-{
- opus_int64 res;
- if (!VERIFY_INT(a) || !VERIFY_SHORT(shift))
- {
- fprintf (stderr, "SHR32: inputs are not int: %d %d\n", (int)a, shift);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = a>>shift;
- if (!VERIFY_INT(res))
- {
- fprintf (stderr, "SHR32: output is not int: %d\n", (int)res);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=2;
- return res;
-}
-#define SHL32(a, shift) SHL32_(a, shift, __FILE__, __LINE__)
-static OPUS_INLINE int SHL32_(opus_int64 a, int shift, char *file, int line)
-{
- opus_int64 res;
- if (!VERIFY_INT(a) || !VERIFY_SHORT(shift))
- {
- fprintf (stderr, "SHL32: inputs are not int: %lld %d in %s: line %d\n", a, shift, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = a<<shift;
- if (!VERIFY_INT(res))
- {
- fprintf (stderr, "SHL32: output is not int: %lld<<%d = %lld in %s: line %d\n", a, shift, res, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=2;
- return res;
-}
-
-#define PSHR32(a,shift) (celt_mips--,SHR32(ADD32((a),(((opus_val32)(1)<<((shift))>>1))),shift))
-#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
-
-#define ROUND16(x,a) (celt_mips--,EXTRACT16(PSHR32((x),(a))))
-#define HALF16(x) (SHR16(x,1))
-#define HALF32(x) (SHR32(x,1))
-
-//#define SHR(a,shift) ((a) >> (shift))
-//#define SHL(a,shift) ((a) << (shift))
-
-#define ADD16(a, b) ADD16_(a, b, __FILE__, __LINE__)
-static OPUS_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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- 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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips++;
- return res;
-}
-
-#define SUB16(a, b) SUB16_(a, b, __FILE__, __LINE__)
-static OPUS_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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = a-b;
- if (!VERIFY_SHORT(res))
- {
- fprintf (stderr, "SUB16: output is not short: %d in %s: line %d\n", res, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips++;
- return res;
-}
-
-#define ADD32(a, b) ADD32_(a, b, __FILE__, __LINE__)
-static OPUS_INLINE int ADD32_(opus_int64 a, opus_int64 b, char *file, int line)
-{
- opus_int64 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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = a+b;
- if (!VERIFY_INT(res))
- {
- fprintf (stderr, "ADD32: output is not int: %d in %s: line %d\n", (int)res, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=2;
- return res;
-}
-
-#define SUB32(a, b) SUB32_(a, b, __FILE__, __LINE__)
-static OPUS_INLINE int SUB32_(opus_int64 a, opus_int64 b, char *file, int line)
-{
- opus_int64 res;
- if (!VERIFY_INT(a) || !VERIFY_INT(b))
- {
- fprintf (stderr, "SUB32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = a-b;
- if (!VERIFY_INT(res))
- {
- fprintf (stderr, "SUB32: output is not int: %d in %s: line %d\n", (int)res, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=2;
- return res;
-}
-
-#undef UADD32
-#define UADD32(a, b) UADD32_(a, b, __FILE__, __LINE__)
-static OPUS_INLINE unsigned int UADD32_(opus_uint64 a, opus_uint64 b, char *file, int line)
-{
- opus_uint64 res;
- if (!VERIFY_UINT(a) || !VERIFY_UINT(b))
- {
- fprintf (stderr, "UADD32: inputs are not uint32: %llu %llu in %s: line %d\n", a, b, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = a+b;
- if (!VERIFY_UINT(res))
- {
- fprintf (stderr, "UADD32: output is not uint32: %llu in %s: line %d\n", res, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=2;
- return res;
-}
-
-#undef USUB32
-#define USUB32(a, b) USUB32_(a, b, __FILE__, __LINE__)
-static OPUS_INLINE unsigned int USUB32_(opus_uint64 a, opus_uint64 b, char *file, int line)
-{
- opus_uint64 res;
- if (!VERIFY_UINT(a) || !VERIFY_UINT(b))
- {
- fprintf (stderr, "USUB32: inputs are not uint32: %llu %llu in %s: line %d\n", a, b, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- if (a<b)
- {
- fprintf (stderr, "USUB32: inputs underflow: %llu < %llu in %s: line %d\n", a, b, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = a-b;
- if (!VERIFY_UINT(res))
- {
- fprintf (stderr, "USUB32: output is not uint32: %llu - %llu = %llu in %s: line %d\n", a, b, res, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=2;
- return res;
-}
-
-/* result fits in 16 bits */
-static OPUS_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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = a*b;
- if (!VERIFY_SHORT(res))
- {
- fprintf (stderr, "MULT16_16_16: output is not short: %d\n", res);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips++;
- return res;
-}
-
-#define MULT16_16(a, b) MULT16_16_(a, b, __FILE__, __LINE__)
-static OPUS_INLINE int MULT16_16_(int a, int b, char *file, int line)
-{
- opus_int64 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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = ((opus_int64)a)*b;
- if (!VERIFY_INT(res))
- {
- fprintf (stderr, "MULT16_16: output is not int: %d in %s: line %d\n", (int)res, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips++;
- return res;
-}
-
-#define MAC16_16(c,a,b) (celt_mips-=2,ADD32((c),MULT16_16((a),(b))))
-
-#define MULT16_32_QX(a, b, Q) MULT16_32_QX_(a, b, Q, __FILE__, __LINE__)
-static OPUS_INLINE int MULT16_32_QX_(int a, opus_int64 b, int Q, char *file, int line)
-{
- opus_int64 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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- if (ABS32(b)>=((opus_val32)(1)<<(15+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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = (((opus_int64)a)*(opus_int64)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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- if (Q==15)
- celt_mips+=3;
- else
- celt_mips+=4;
- return res;
-}
-
-#define MULT16_32_PX(a, b, Q) MULT16_32_PX_(a, b, Q, __FILE__, __LINE__)
-static OPUS_INLINE int MULT16_32_PX_(int a, opus_int64 b, int Q, char *file, int line)
-{
- opus_int64 res;
- if (!VERIFY_SHORT(a) || !VERIFY_INT(b))
- {
- fprintf (stderr, "MULT16_32_P%d: inputs are not short+int: %d %d in %s: line %d\n\n", Q, (int)a, (int)b, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- if (ABS32(b)>=((opus_int64)(1)<<(15+Q)))
- {
- fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n\n", Q, (int)a, (int)b,file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = ((((opus_int64)a)*(opus_int64)b) + (((opus_val32)(1)<<Q)>>1))>> Q;
- if (!VERIFY_INT(res))
- {
- fprintf (stderr, "MULT16_32_P%d: output is not int: %d*%d=%d in %s: line %d\n\n", Q, (int)a, (int)b,(int)res, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- if (Q==15)
- celt_mips+=4;
- else
- celt_mips+=5;
- return res;
-}
-
-#define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15)
-#define MAC16_32_Q15(c,a,b) (celt_mips-=2,ADD32((c),MULT16_32_Q15((a),(b))))
-
-static OPUS_INLINE int SATURATE(int a, int b)
-{
- if (a>b)
- a=b;
- if (a<-b)
- a = -b;
- celt_mips+=3;
- return a;
-}
-
-static OPUS_INLINE opus_int16 SATURATE16(opus_int32 a)
-{
- celt_mips+=3;
- if (a>32767)
- return 32767;
- else if (a<-32768)
- return -32768;
- else return a;
-}
-
-static OPUS_INLINE int MULT16_16_Q11_32(int a, int b)
-{
- opus_int64 res;
- if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
- {
- fprintf (stderr, "MULT16_16_Q11: inputs are not short: %d %d\n", a, b);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = ((opus_int64)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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=3;
- return res;
-}
-static OPUS_INLINE short MULT16_16_Q13(int a, int b)
-{
- opus_int64 res;
- if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
- {
- fprintf (stderr, "MULT16_16_Q13: inputs are not short: %d %d\n", a, b);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = ((opus_int64)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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=3;
- return res;
-}
-static OPUS_INLINE short MULT16_16_Q14(int a, int b)
-{
- opus_int64 res;
- if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
- {
- fprintf (stderr, "MULT16_16_Q14: inputs are not short: %d %d\n", a, b);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = ((opus_int64)a)*b;
- res >>= 14;
- if (!VERIFY_SHORT(res))
- {
- fprintf (stderr, "MULT16_16_Q14: output is not short: %d\n", (int)res);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=3;
- return res;
-}
-
-#define MULT16_16_Q15(a, b) MULT16_16_Q15_(a, b, __FILE__, __LINE__)
-static OPUS_INLINE short MULT16_16_Q15_(int a, int b, char *file, int line)
-{
- opus_int64 res;
- if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
- {
- fprintf (stderr, "MULT16_16_Q15: inputs are not short: %d %d in %s: line %d\n", a, b, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = ((opus_int64)a)*b;
- res >>= 15;
- if (!VERIFY_SHORT(res))
- {
- fprintf (stderr, "MULT16_16_Q15: output is not short: %d in %s: line %d\n", (int)res, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=1;
- return res;
-}
-
-static OPUS_INLINE short MULT16_16_P13(int a, int b)
-{
- opus_int64 res;
- if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
- {
- fprintf (stderr, "MULT16_16_P13: inputs are not short: %d %d\n", a, b);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = ((opus_int64)a)*b;
- res += 4096;
- if (!VERIFY_INT(res))
- {
- fprintf (stderr, "MULT16_16_P13: overflow: %d*%d=%d\n", a, b, (int)res);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res >>= 13;
- if (!VERIFY_SHORT(res))
- {
- fprintf (stderr, "MULT16_16_P13: output is not short: %d*%d=%d\n", a, b, (int)res);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=4;
- return res;
-}
-static OPUS_INLINE short MULT16_16_P14(int a, int b)
-{
- opus_int64 res;
- if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
- {
- fprintf (stderr, "MULT16_16_P14: inputs are not short: %d %d\n", a, b);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = ((opus_int64)a)*b;
- res += 8192;
- if (!VERIFY_INT(res))
- {
- fprintf (stderr, "MULT16_16_P14: overflow: %d*%d=%d\n", a, b, (int)res);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res >>= 14;
- if (!VERIFY_SHORT(res))
- {
- fprintf (stderr, "MULT16_16_P14: output is not short: %d*%d=%d\n", a, b, (int)res);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=4;
- return res;
-}
-static OPUS_INLINE short MULT16_16_P15(int a, int b)
-{
- opus_int64 res;
- if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b))
- {
- fprintf (stderr, "MULT16_16_P15: inputs are not short: %d %d\n", a, b);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = ((opus_int64)a)*b;
- res += 16384;
- if (!VERIFY_INT(res))
- {
- fprintf (stderr, "MULT16_16_P15: overflow: %d*%d=%d\n", a, b, (int)res);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res >>= 15;
- if (!VERIFY_SHORT(res))
- {
- fprintf (stderr, "MULT16_16_P15: output is not short: %d*%d=%d\n", a, b, (int)res);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=2;
- return res;
-}
-
-#define DIV32_16(a, b) DIV32_16_(a, b, __FILE__, __LINE__)
-
-static OPUS_INLINE int DIV32_16_(opus_int64 a, opus_int64 b, char *file, int line)
-{
- opus_int64 res;
- if (b==0)
- {
- fprintf(stderr, "DIV32_16: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- 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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- 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;
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=35;
- return res;
-}
-
-#define DIV32(a, b) DIV32_(a, b, __FILE__, __LINE__)
-static OPUS_INLINE int DIV32_(opus_int64 a, opus_int64 b, char *file, int line)
-{
- opus_int64 res;
- if (b==0)
- {
- fprintf(stderr, "DIV32: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- 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);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- res = a/b;
- if (!VERIFY_INT(res))
- {
- fprintf (stderr, "DIV32: output is not int: %d in %s: line %d\n", (int)res, file, line);
-#ifdef FIXED_DEBUG_ASSERT
- celt_assert(0);
-#endif
- }
- celt_mips+=70;
- return res;
-}
-
-#undef PRINT_MIPS
-#define PRINT_MIPS(file) do {fprintf (file, "total complexity = %llu MIPS\n", celt_mips);} while (0);
-
-#endif
diff --git a/src/opus-1.1/celt/fixed_generic.h b/src/opus-1.1/celt/fixed_generic.h
deleted file mode 100644
index ecf018a2..00000000
--- a/src/opus-1.1/celt/fixed_generic.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/* Copyright (C) 2007-2009 Xiph.Org Foundation
- Copyright (C) 2003-2008 Jean-Marc Valin
- Copyright (C) 2007-2008 CSIRO */
-/**
- @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.
-
- 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 COPYRIGHT OWNER
- 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
-
-/** Multiply a 16-bit signed value by a 16-bit unsigned value. The result is a 32-bit signed value */
-#define MULT16_16SU(a,b) ((opus_val32)(opus_val16)(a)*(opus_val32)(opus_uint16)(b))
-
-/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */
-#define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16))
-
-/** 16x32 multiplication, followed by a 16-bit shift right (round-to-nearest). Results fits in 32 bits */
-#define MULT16_32_P16(a,b) ADD32(MULT16_16((a),SHR((b),16)), PSHR(MULT16_16SU((a),((b)&0x0000ffff)),16))
-
-/** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */
-#define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),((b)&0x0000ffff)),15))
-
-/** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */
-#define MULT32_32_Q31(a,b) ADD32(ADD32(SHL(MULT16_16(SHR((a),16),SHR((b),16)),1), SHR(MULT16_16SU(SHR((a),16),((b)&0x0000ffff)),15)), SHR(MULT16_16SU(SHR((b),16),((a)&0x0000ffff)),15))
-
-/** Compile-time conversion of float constant to 16-bit value */
-#define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits))))
-
-/** Compile-time conversion of float constant to 32-bit value */
-#define QCONST32(x,bits) ((opus_val32)(.5+(x)*(((opus_val32)1)<<(bits))))
-
-/** Negate a 16-bit value */
-#define NEG16(x) (-(x))
-/** Negate a 32-bit value */
-#define NEG32(x) (-(x))
-
-/** Change a 32-bit value into a 16-bit value. The value is assumed to fit in 16-bit, otherwise the result is undefined */
-#define EXTRACT16(x) ((opus_val16)(x))
-/** Change a 16-bit value into a 32-bit value */
-#define EXTEND32(x) ((opus_val32)(x))
-
-/** Arithmetic shift-right of a 16-bit value */
-#define SHR16(a,shift) ((a) >> (shift))
-/** Arithmetic shift-left of a 16-bit value */
-#define SHL16(a,shift) ((opus_int16)((opus_uint16)(a)<<(shift)))
-/** Arithmetic shift-right of a 32-bit value */
-#define SHR32(a,shift) ((a) >> (shift))
-/** Arithmetic shift-left of a 32-bit value */
-#define SHL32(a,shift) ((opus_int32)((opus_uint32)(a)<<(shift)))
-
-/** 32-bit arithmetic shift right with rounding-to-nearest instead of rounding down */
-#define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift))
-/** 32-bit arithmetic shift right where the argument can be negative */
-#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
-
-/** "RAW" macros, should not be used outside of this header file */
-#define SHR(a,shift) ((a) >> (shift))
-#define SHL(a,shift) SHL32(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 SATURATE16(x) (EXTRACT16((x)>32767 ? 32767 : (x)<-32768 ? -32768 : (x)))
-
-/** Shift by a and round-to-neareast 32-bit value. Result is a 16-bit value */
-#define ROUND16(x,a) (EXTRACT16(PSHR32((x),(a))))
-/** Divide by two */
-#define HALF16(x) (SHR16(x,1))
-#define HALF32(x) (SHR32(x,1))
-
-/** Add two 16-bit values */
-#define ADD16(a,b) ((opus_val16)((opus_val16)(a)+(opus_val16)(b)))
-/** Subtract two 16-bit values */
-#define SUB16(a,b) ((opus_val16)(a)-(opus_val16)(b))
-/** Add two 32-bit values */
-#define ADD32(a,b) ((opus_val32)(a)+(opus_val32)(b))
-/** Subtract two 32-bit values */
-#define SUB32(a,b) ((opus_val32)(a)-(opus_val32)(b))
-
-/** 16x16 multiplication where the result fits in 16 bits */
-#define MULT16_16_16(a,b) ((((opus_val16)(a))*((opus_val16)(b))))
-
-/* (opus_val32)(opus_val16) gives TI compiler a hint that it's 16x16->32 multiply */
-/** 16x16 multiplication where the result fits in 32 bits */
-#define MULT16_16(a,b) (((opus_val32)(opus_val16)(a))*((opus_val32)(opus_val16)(b)))
-
-/** 16x16 multiply-add where the result fits in 32 bits */
-#define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b))))
-/** 16x32 multiply, followed by a 15-bit shift right and 32-bit add.
- b must fit in 31 bits.
- Result fits in 32 bits. */
-#define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15)))
-
-#define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11))
-#define MULT16_16_Q11(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))
-
-/** Divide a 32-bit value by a 16-bit value. Result fits in 16 bits */
-#define DIV32_16(a,b) ((opus_val16)(((opus_val32)(a))/((opus_val16)(b))))
-
-/** Divide a 32-bit value by a 32-bit value. Result fits in 32 bits */
-#define DIV32(a,b) (((opus_val32)(a))/((opus_val32)(b)))
-
-#endif
diff --git a/src/opus-1.1/celt/float_cast.h b/src/opus-1.1/celt/float_cast.h
deleted file mode 100644
index ede65748..00000000
--- a/src/opus-1.1/celt/float_cast.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/* Copyright (C) 2001 Erik de Castro Lopo <erikd AT mega-nerd DOT com> */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-/* Version 1.1 */
-
-#ifndef FLOAT_CAST_H
-#define FLOAT_CAST_H
-
-
-#include "arch.h"
-
-/*============================================================================
-** On Intel Pentium processors (especially PIII and probably P4), converting
-** from float to int is very slow. To meet the C specs, the code produced by
-** most C compilers targeting Pentium needs to change the FPU rounding mode
-** before the float to int conversion is performed.
-**
-** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It
-** is this flushing of the pipeline which is so slow.
-**
-** Fortunately the ISO C99 specifications define the functions lrint, lrintf,
-** llrint and llrintf which fix this problem as a side effect.
-**
-** On Unix-like systems, the configure process should have detected the
-** presence of these functions. If they weren't found we have to replace them
-** here with a standard C cast.
-*/
-
-/*
-** The C99 prototypes for lrint and lrintf are as follows:
-**
-** long int lrintf (float x) ;
-** long int lrint (double x) ;
-*/
-
-/* The presence of the required functions are detected during the configure
-** process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in
-** the config.h file.
-*/
-
-#if (HAVE_LRINTF)
-
-/* These defines enable functionality introduced with the 1999 ISO C
-** standard. They must be defined before the inclusion of math.h to
-** engage them. If optimisation is enabled, these functions will be
-** inlined. With optimisation switched off, you have to link in the
-** maths library using -lm.
-*/
-
-#define _ISOC9X_SOURCE 1
-#define _ISOC99_SOURCE 1
-
-#define __USE_ISOC9X 1
-#define __USE_ISOC99 1
-
-#include <math.h>
-#define float2int(x) lrintf(x)
-
-#elif (defined(HAVE_LRINT))
-
-#define _ISOC9X_SOURCE 1
-#define _ISOC99_SOURCE 1
-
-#define __USE_ISOC9X 1
-#define __USE_ISOC99 1
-
-#include <math.h>
-#define float2int(x) lrint(x)
-
-#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined (WIN64) || defined (_WIN64))
- #include <xmmintrin.h>
-
- __inline long int float2int(float value)
- {
- return _mm_cvtss_si32(_mm_load_ss(&value));
- }
-#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined (WIN32) || defined (_WIN32))
- #include <math.h>
-
- /* Win32 doesn't seem to have these functions.
- ** Therefore implement OPUS_INLINE versions of these functions here.
- */
-
- __inline long int
- float2int (float flt)
- { int intgr;
-
- _asm
- { fld flt
- fistp intgr
- } ;
-
- return intgr ;
- }
-
-#else
-
-#if (defined(__GNUC__) && defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L)
- /* supported by gcc in C99 mode, but not by all other compilers */
- #warning "Don't have the functions lrint() and lrintf ()."
- #warning "Replacing these functions with a standard C cast."
-#endif /* __STDC_VERSION__ >= 199901L */
- #include <math.h>
- #define float2int(flt) ((int)(floor(.5+flt)))
-#endif
-
-#ifndef DISABLE_FLOAT_API
-static OPUS_INLINE opus_int16 FLOAT2INT16(float x)
-{
- x = x*CELT_SIG_SCALE;
- x = MAX32(x, -32768);
- x = MIN32(x, 32767);
- return (opus_int16)float2int(x);
-}
-#endif /* DISABLE_FLOAT_API */
-
-#endif /* FLOAT_CAST_H */
diff --git a/src/opus-1.1/celt/kiss_fft.c b/src/opus-1.1/celt/kiss_fft.c
deleted file mode 100644
index ad706c73..00000000
--- a/src/opus-1.1/celt/kiss_fft.c
+++ /dev/null
@@ -1,719 +0,0 @@
-/*Copyright (c) 2003-2004, Mark Borgerding
- Lots of modifications by Jean-Marc Valin
- Copyright (c) 2005-2007, Xiph.Org Foundation
- Copyright (c) 2008, Xiph.Org Foundation, CSIRO
-
- All rights reserved.
-
- 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.
-
- 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 COPYRIGHT OWNER 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.*/
-
-/* This code is originally from Mark Borgerding's KISS-FFT but has been
- heavily modified to better suit Opus */
-
-#ifndef SKIP_CONFIG_H
-# ifdef HAVE_CONFIG_H
-# include "config.h"
-# endif
-#endif
-
-#include "_kiss_fft_guts.h"
-#include "arch.h"
-#include "os_support.h"
-#include "mathops.h"
-#include "stack_alloc.h"
-
-/* The guts header contains all the multiplication and addition macros that are defined for
- complex numbers. It also delares the kf_ internal functions.
-*/
-
-static void kf_bfly2(
- kiss_fft_cpx * Fout,
- const size_t fstride,
- const kiss_fft_state *st,
- int m,
- int N,
- int mm
- )
-{
- kiss_fft_cpx * Fout2;
- const kiss_twiddle_cpx * tw1;
- int i,j;
- kiss_fft_cpx * Fout_beg = Fout;
- for (i=0;i<N;i++)
- {
- Fout = Fout_beg + i*mm;
- Fout2 = Fout + m;
- tw1 = st->twiddles;
- for(j=0;j<m;j++)
- {
- kiss_fft_cpx t;
- Fout->r = SHR32(Fout->r, 1);Fout->i = SHR32(Fout->i, 1);
- Fout2->r = SHR32(Fout2->r, 1);Fout2->i = SHR32(Fout2->i, 1);
- C_MUL (t, *Fout2 , *tw1);
- tw1 += fstride;
- C_SUB( *Fout2 , *Fout , t );
- C_ADDTO( *Fout , t );
- ++Fout2;
- ++Fout;
- }
- }
-}
-
-static void ki_bfly2(
- kiss_fft_cpx * Fout,
- const size_t fstride,
- const kiss_fft_state *st,
- int m,
- int N,
- int mm
- )
-{
- kiss_fft_cpx * Fout2;
- const kiss_twiddle_cpx * tw1;
- kiss_fft_cpx t;
- int i,j;
- kiss_fft_cpx * Fout_beg = Fout;
- for (i=0;i<N;i++)
- {
- Fout = Fout_beg + i*mm;
- Fout2 = Fout + m;
- tw1 = st->twiddles;
- for(j=0;j<m;j++)
- {
- C_MULC (t, *Fout2 , *tw1);
- tw1 += fstride;
- C_SUB( *Fout2 , *Fout , t );
- C_ADDTO( *Fout , t );
- ++Fout2;
- ++Fout;
- }
- }
-}
-
-static void kf_bfly4(
- kiss_fft_cpx * Fout,
- const size_t fstride,
- const kiss_fft_state *st,
- int m,
- int N,
- int mm
- )
-{
- const kiss_twiddle_cpx *tw1,*tw2,*tw3;
- kiss_fft_cpx scratch[6];
- const size_t m2=2*m;
- const size_t m3=3*m;
- int i, j;
-
- kiss_fft_cpx * Fout_beg = Fout;
- for (i=0;i<N;i++)
- {
- Fout = Fout_beg + i*mm;
- tw3 = tw2 = tw1 = st->twiddles;
- for (j=0;j<m;j++)
- {
- C_MUL4(scratch[0],Fout[m] , *tw1 );
- C_MUL4(scratch[1],Fout[m2] , *tw2 );
- C_MUL4(scratch[2],Fout[m3] , *tw3 );
-
- Fout->r = PSHR32(Fout->r, 2);
- Fout->i = PSHR32(Fout->i, 2);
- C_SUB( scratch[5] , *Fout, scratch[1] );
- C_ADDTO(*Fout, scratch[1]);
- C_ADD( scratch[3] , scratch[0] , scratch[2] );
- C_SUB( scratch[4] , scratch[0] , scratch[2] );
- C_SUB( Fout[m2], *Fout, scratch[3] );
- tw1 += fstride;
- tw2 += fstride*2;
- tw3 += fstride*3;
- C_ADDTO( *Fout , scratch[3] );
-
- Fout[m].r = scratch[5].r + scratch[4].i;
- Fout[m].i = scratch[5].i - scratch[4].r;
- Fout[m3].r = scratch[5].r - scratch[4].i;
- Fout[m3].i = scratch[5].i + scratch[4].r;
- ++Fout;
- }
- }
-}
-
-static void ki_bfly4(
- kiss_fft_cpx * Fout,
- const size_t fstride,
- const kiss_fft_state *st,
- int m,
- int N,
- int mm
- )
-{
- const kiss_twiddle_cpx *tw1,*tw2,*tw3;
- kiss_fft_cpx scratch[6];
- const size_t m2=2*m;
- const size_t m3=3*m;
- int i, j;
-
- kiss_fft_cpx * Fout_beg = Fout;
- for (i=0;i<N;i++)
- {
- Fout = Fout_beg + i*mm;
- tw3 = tw2 = tw1 = st->twiddles;
- for (j=0;j<m;j++)
- {
- C_MULC(scratch[0],Fout[m] , *tw1 );
- C_MULC(scratch[1],Fout[m2] , *tw2 );
- C_MULC(scratch[2],Fout[m3] , *tw3 );
-
- C_SUB( scratch[5] , *Fout, scratch[1] );
- C_ADDTO(*Fout, scratch[1]);
- C_ADD( scratch[3] , scratch[0] , scratch[2] );
- C_SUB( scratch[4] , scratch[0] , scratch[2] );
- C_SUB( Fout[m2], *Fout, scratch[3] );
- tw1 += fstride;
- tw2 += fstride*2;
- tw3 += fstride*3;
- C_ADDTO( *Fout , scratch[3] );
-
- Fout[m].r = scratch[5].r - scratch[4].i;
- Fout[m].i = scratch[5].i + scratch[4].r;
- Fout[m3].r = scratch[5].r + scratch[4].i;
- Fout[m3].i = scratch[5].i - scratch[4].r;
- ++Fout;
- }
- }
-}
-
-#ifndef RADIX_TWO_ONLY
-
-static void kf_bfly3(
- kiss_fft_cpx * Fout,
- const size_t fstride,
- const kiss_fft_state *st,
- int m,
- int N,
- int mm
- )
-{
- int i;
- size_t k;
- const size_t m2 = 2*m;
- const kiss_twiddle_cpx *tw1,*tw2;
- kiss_fft_cpx scratch[5];
- kiss_twiddle_cpx epi3;
-
- kiss_fft_cpx * Fout_beg = Fout;
- epi3 = st->twiddles[fstride*m];
- for (i=0;i<N;i++)
- {
- Fout = Fout_beg + i*mm;
- tw1=tw2=st->twiddles;
- k=m;
- do {
- C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3);
-
- C_MUL(scratch[1],Fout[m] , *tw1);
- C_MUL(scratch[2],Fout[m2] , *tw2);
-
- C_ADD(scratch[3],scratch[1],scratch[2]);
- C_SUB(scratch[0],scratch[1],scratch[2]);
- tw1 += fstride;
- tw2 += fstride*2;
-
- Fout[m].r = Fout->r - HALF_OF(scratch[3].r);
- Fout[m].i = Fout->i - HALF_OF(scratch[3].i);
-
- C_MULBYSCALAR( scratch[0] , epi3.i );
-
- C_ADDTO(*Fout,scratch[3]);
-
- Fout[m2].r = Fout[m].r + scratch[0].i;
- Fout[m2].i = Fout[m].i - scratch[0].r;
-
- Fout[m].r -= scratch[0].i;
- Fout[m].i += scratch[0].r;
-
- ++Fout;
- } while(--k);
- }
-}
-
-static void ki_bfly3(
- kiss_fft_cpx * Fout,
- const size_t fstride,
- const kiss_fft_state *st,
- int m,
- int N,
- int mm
- )
-{
- int i, k;
- const size_t m2 = 2*m;
- const kiss_twiddle_cpx *tw1,*tw2;
- kiss_fft_cpx scratch[5];
- kiss_twiddle_cpx epi3;
-
- kiss_fft_cpx * Fout_beg = Fout;
- epi3 = st->twiddles[fstride*m];
- for (i=0;i<N;i++)
- {
- Fout = Fout_beg + i*mm;
- tw1=tw2=st->twiddles;
- k=m;
- do{
-
- C_MULC(scratch[1],Fout[m] , *tw1);
- C_MULC(scratch[2],Fout[m2] , *tw2);
-
- C_ADD(scratch[3],scratch[1],scratch[2]);
- C_SUB(scratch[0],scratch[1],scratch[2]);
- tw1 += fstride;
- tw2 += fstride*2;
-
- Fout[m].r = Fout->r - HALF_OF(scratch[3].r);
- Fout[m].i = Fout->i - HALF_OF(scratch[3].i);
-
- C_MULBYSCALAR( scratch[0] , -epi3.i );
-
- C_ADDTO(*Fout,scratch[3]);
-
- Fout[m2].r = Fout[m].r + scratch[0].i;
- Fout[m2].i = Fout[m].i - scratch[0].r;
-
- Fout[m].r -= scratch[0].i;
- Fout[m].i += scratch[0].r;
-
- ++Fout;
- }while(--k);
- }
-}
-
-static void kf_bfly5(
- kiss_fft_cpx * Fout,
- const size_t fstride,
- const kiss_fft_state *st,
- int m,
- int N,
- int mm
- )
-{
- kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4;
- int i, u;
- kiss_fft_cpx scratch[13];
- const kiss_twiddle_cpx * twiddles = st->twiddles;
- const kiss_twiddle_cpx *tw;
- kiss_twiddle_cpx ya,yb;
- kiss_fft_cpx * Fout_beg = Fout;
-
- ya = twiddles[fstride*m];
- yb = twiddles[fstride*2*m];
- tw=st->twiddles;
-
- for (i=0;i<N;i++)
- {
- Fout = Fout_beg + i*mm;
- Fout0=Fout;
- Fout1=Fout0+m;
- Fout2=Fout0+2*m;
- Fout3=Fout0+3*m;
- Fout4=Fout0+4*m;
-
- for ( u=0; u<m; ++u ) {
- C_FIXDIV( *Fout0,5); C_FIXDIV( *Fout1,5); C_FIXDIV( *Fout2,5); C_FIXDIV( *Fout3,5); C_FIXDIV( *Fout4,5);
- scratch[0] = *Fout0;
-
- C_MUL(scratch[1] ,*Fout1, tw[u*fstride]);
- C_MUL(scratch[2] ,*Fout2, tw[2*u*fstride]);
- C_MUL(scratch[3] ,*Fout3, tw[3*u*fstride]);
- C_MUL(scratch[4] ,*Fout4, tw[4*u*fstride]);
-
- C_ADD( scratch[7],scratch[1],scratch[4]);
- C_SUB( scratch[10],scratch[1],scratch[4]);
- C_ADD( scratch[8],scratch[2],scratch[3]);
- C_SUB( scratch[9],scratch[2],scratch[3]);
-
- Fout0->r += scratch[7].r + scratch[8].r;
- Fout0->i += scratch[7].i + scratch[8].i;
-
- scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r);
- scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r);
-
- scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i);
- scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i);
-
- C_SUB(*Fout1,scratch[5],scratch[6]);
- C_ADD(*Fout4,scratch[5],scratch[6]);
-
- scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r);
- scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r);
- scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i);
- scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i);
-
- C_ADD(*Fout2,scratch[11],scratch[12]);
- C_SUB(*Fout3,scratch[11],scratch[12]);
-
- ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4;
- }
- }
-}
-
-static void ki_bfly5(
- kiss_fft_cpx * Fout,
- const size_t fstride,
- const kiss_fft_state *st,
- int m,
- int N,
- int mm
- )
-{
- kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4;
- int i, u;
- kiss_fft_cpx scratch[13];
- const kiss_twiddle_cpx * twiddles = st->twiddles;
- const kiss_twiddle_cpx *tw;
- kiss_twiddle_cpx ya,yb;
- kiss_fft_cpx * Fout_beg = Fout;
-
- ya = twiddles[fstride*m];
- yb = twiddles[fstride*2*m];
- tw=st->twiddles;
-
- for (i=0;i<N;i++)
- {
- Fout = Fout_beg + i*mm;
- Fout0=Fout;
- Fout1=Fout0+m;
- Fout2=Fout0+2*m;
- Fout3=Fout0+3*m;
- Fout4=Fout0+4*m;
-
- for ( u=0; u<m; ++u ) {
- scratch[0] = *Fout0;
-
- C_MULC(scratch[1] ,*Fout1, tw[u*fstride]);
- C_MULC(scratch[2] ,*Fout2, tw[2*u*fstride]);
- C_MULC(scratch[3] ,*Fout3, tw[3*u*fstride]);
- C_MULC(scratch[4] ,*Fout4, tw[4*u*fstride]);
-
- C_ADD( scratch[7],scratch[1],scratch[4]);
- C_SUB( scratch[10],scratch[1],scratch[4]);
- C_ADD( scratch[8],scratch[2],scratch[3]);
- C_SUB( scratch[9],scratch[2],scratch[3]);
-
- Fout0->r += scratch[7].r + scratch[8].r;
- Fout0->i += scratch[7].i + scratch[8].i;
-
- scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r);
- scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r);
-
- scratch[6].r = -S_MUL(scratch[10].i,ya.i) - S_MUL(scratch[9].i,yb.i);
- scratch[6].i = S_MUL(scratch[10].r,ya.i) + S_MUL(scratch[9].r,yb.i);
-
- C_SUB(*Fout1,scratch[5],scratch[6]);
- C_ADD(*Fout4,scratch[5],scratch[6]);
-
- scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r);
- scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r);
- scratch[12].r = S_MUL(scratch[10].i,yb.i) - S_MUL(scratch[9].i,ya.i);
- scratch[12].i = -S_MUL(scratch[10].r,yb.i) + S_MUL(scratch[9].r,ya.i);
-
- C_ADD(*Fout2,scratch[11],scratch[12]);
- C_SUB(*Fout3,scratch[11],scratch[12]);
-
- ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4;
- }
- }
-}
-
-#endif
-
-
-#ifdef CUSTOM_MODES
-
-static
-void compute_bitrev_table(
- int Fout,
- opus_int16 *f,
- const size_t fstride,
- int in_stride,
- opus_int16 * factors,
- const kiss_fft_state *st
- )
-{
- const int p=*factors++; /* the radix */
- const int m=*factors++; /* stage's fft length/p */
-
- /*printf ("fft %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N);*/
- if (m==1)
- {
- int j;
- for (j=0;j<p;j++)
- {
- *f = Fout+j;
- f += fstride*in_stride;
- }
- } else {
- int j;
- for (j=0;j<p;j++)
- {
- compute_bitrev_table( Fout , f, fstride*p, in_stride, factors,st);
- f += fstride*in_stride;
- Fout += m;
- }
- }
-}
-
-/* facbuf is populated by p1,m1,p2,m2, ...
- where
- p[i] * m[i] = m[i-1]
- m0 = n */
-static
-int kf_factor(int n,opus_int16 * facbuf)
-{
- int p=4;
-
- /*factor out powers of 4, powers of 2, then any remaining primes */
- do {
- while (n % p) {
- switch (p) {
- case 4: p = 2; break;
- case 2: p = 3; break;
- default: p += 2; break;
- }
- if (p>32000 || (opus_int32)p*(opus_int32)p > n)
- p = n; /* no more factors, skip to end */
- }
- n /= p;
-#ifdef RADIX_TWO_ONLY
- if (p!=2 && p != 4)
-#else
- if (p>5)
-#endif
- {
- return 0;
- }
- *facbuf++ = p;
- *facbuf++ = n;
- } while (n > 1);
- return 1;
-}
-
-static void compute_twiddles(kiss_twiddle_cpx *twiddles, int nfft)
-{
- int i;
-#ifdef FIXED_POINT
- for (i=0;i<nfft;++i) {
- opus_val32 phase = -i;
- kf_cexp2(twiddles+i, DIV32(SHL32(phase,17),nfft));
- }
-#else
- for (i=0;i<nfft;++i) {
- const double pi=3.14159265358979323846264338327;
- double phase = ( -2*pi /nfft ) * i;
- kf_cexp(twiddles+i, phase );
- }
-#endif
-}
-
-/*
- *
- * Allocates all necessary storage space for the fft and ifft.
- * The return value is a contiguous block of memory. As such,
- * It can be freed with free().
- * */
-kiss_fft_state *opus_fft_alloc_twiddles(int nfft,void * mem,size_t * lenmem, const kiss_fft_state *base)
-{
- kiss_fft_state *st=NULL;
- size_t memneeded = sizeof(struct kiss_fft_state); /* twiddle factors*/
-
- if ( lenmem==NULL ) {
- st = ( kiss_fft_state*)KISS_FFT_MALLOC( memneeded );
- }else{
- if (mem != NULL && *lenmem >= memneeded)
- st = (kiss_fft_state*)mem;
- *lenmem = memneeded;
- }
- if (st) {
- opus_int16 *bitrev;
- kiss_twiddle_cpx *twiddles;
-
- st->nfft=nfft;
-#ifndef FIXED_POINT
- st->scale = 1.f/nfft;
-#endif
- if (base != NULL)
- {
- st->twiddles = base->twiddles;
- st->shift = 0;
- while (nfft<<st->shift != base->nfft && st->shift < 32)
- st->shift++;
- if (st->shift>=32)
- goto fail;
- } else {
- st->twiddles = twiddles = (kiss_twiddle_cpx*)KISS_FFT_MALLOC(sizeof(kiss_twiddle_cpx)*nfft);
- compute_twiddles(twiddles, nfft);
- st->shift = -1;
- }
- if (!kf_factor(nfft,st->factors))
- {
- goto fail;
- }
-
- /* bitrev */
- st->bitrev = bitrev = (opus_int16*)KISS_FFT_MALLOC(sizeof(opus_int16)*nfft);
- if (st->bitrev==NULL)
- goto fail;
- compute_bitrev_table(0, bitrev, 1,1, st->factors,st);
- }
- return st;
-fail:
- opus_fft_free(st);
- return NULL;
-}
-
-kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem )
-{
- return opus_fft_alloc_twiddles(nfft, mem, lenmem, NULL);
-}
-
-void opus_fft_free(const kiss_fft_state *cfg)
-{
- if (cfg)
- {
- opus_free((opus_int16*)cfg->bitrev);
- if (cfg->shift < 0)
- opus_free((kiss_twiddle_cpx*)cfg->twiddles);
- opus_free((kiss_fft_state*)cfg);
- }
-}
-
-#endif /* CUSTOM_MODES */
-
-void opus_fft(const kiss_fft_state *st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout)
-{
- int m2, m;
- int p;
- int L;
- int fstride[MAXFACTORS];
- int i;
- int shift;
-
- /* st->shift can be -1 */
- shift = st->shift>0 ? st->shift : 0;
-
- celt_assert2 (fin != fout, "In-place FFT not supported");
- /* Bit-reverse the input */
- for (i=0;i<st->nfft;i++)
- {
- fout[st->bitrev[i]] = fin[i];
-#ifndef FIXED_POINT
- fout[st->bitrev[i]].r *= st->scale;
- fout[st->bitrev[i]].i *= st->scale;
-#endif
- }
-
- fstride[0] = 1;
- L=0;
- do {
- p = st->factors[2*L];
- m = st->factors[2*L+1];
- fstride[L+1] = fstride[L]*p;
- L++;
- } while(m!=1);
- m = st->factors[2*L-1];
- for (i=L-1;i>=0;i--)
- {
- if (i!=0)
- m2 = st->factors[2*i-1];
- else
- m2 = 1;
- switch (st->factors[2*i])
- {
- case 2:
- kf_bfly2(fout,fstride[i]<<shift,st,m, fstride[i], m2);
- break;
- case 4:
- kf_bfly4(fout,fstride[i]<<shift,st,m, fstride[i], m2);
- break;
- #ifndef RADIX_TWO_ONLY
- case 3:
- kf_bfly3(fout,fstride[i]<<shift,st,m, fstride[i], m2);
- break;
- case 5:
- kf_bfly5(fout,fstride[i]<<shift,st,m, fstride[i], m2);
- break;
- #endif
- }
- m = m2;
- }
-}
-
-void opus_ifft(const kiss_fft_state *st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout)
-{
- int m2, m;
- int p;
- int L;
- int fstride[MAXFACTORS];
- int i;
- int shift;
-
- /* st->shift can be -1 */
- shift = st->shift>0 ? st->shift : 0;
- celt_assert2 (fin != fout, "In-place FFT not supported");
- /* Bit-reverse the input */
- for (i=0;i<st->nfft;i++)
- fout[st->bitrev[i]] = fin[i];
-
- fstride[0] = 1;
- L=0;
- do {
- p = st->factors[2*L];
- m = st->factors[2*L+1];
- fstride[L+1] = fstride[L]*p;
- L++;
- } while(m!=1);
- m = st->factors[2*L-1];
- for (i=L-1;i>=0;i--)
- {
- if (i!=0)
- m2 = st->factors[2*i-1];
- else
- m2 = 1;
- switch (st->factors[2*i])
- {
- case 2:
- ki_bfly2(fout,fstride[i]<<shift,st,m, fstride[i], m2);
- break;
- case 4:
- ki_bfly4(fout,fstride[i]<<shift,st,m, fstride[i], m2);
- break;
-#ifndef RADIX_TWO_ONLY
- case 3:
- ki_bfly3(fout,fstride[i]<<shift,st,m, fstride[i], m2);
- break;
- case 5:
- ki_bfly5(fout,fstride[i]<<shift,st,m, fstride[i], m2);
- break;
-#endif
- }
- m = m2;
- }
-}
-
diff --git a/src/opus-1.1/celt/kiss_fft.h b/src/opus-1.1/celt/kiss_fft.h
deleted file mode 100644
index 66332e3b..00000000
--- a/src/opus-1.1/celt/kiss_fft.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*Copyright (c) 2003-2004, Mark Borgerding
- Lots of modifications by Jean-Marc Valin
- Copyright (c) 2005-2007, Xiph.Org Foundation
- Copyright (c) 2008, Xiph.Org Foundation, CSIRO
-
- All rights reserved.
-
- 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.
-
- 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 COPYRIGHT OWNER 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 KISS_FFT_H
-#define KISS_FFT_H
-
-#include <stdlib.h>
-#include <math.h>
-#include "arch.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef USE_SIMD
-# include <xmmintrin.h>
-# define kiss_fft_scalar __m128
-#define KISS_FFT_MALLOC(nbytes) memalign(16,nbytes)
-#else
-#define KISS_FFT_MALLOC opus_alloc
-#endif
-
-#ifdef FIXED_POINT
-#include "arch.h"
-
-# define kiss_fft_scalar opus_int32
-# define kiss_twiddle_scalar opus_int16
-
-
-#else
-# ifndef kiss_fft_scalar
-/* default is float */
-# define kiss_fft_scalar float
-# define kiss_twiddle_scalar float
-# define KF_SUFFIX _celt_single
-# endif
-#endif
-
-typedef struct {
- kiss_fft_scalar r;
- kiss_fft_scalar i;
-}kiss_fft_cpx;
-
-typedef struct {
- kiss_twiddle_scalar r;
- kiss_twiddle_scalar i;
-}kiss_twiddle_cpx;
-
-#define MAXFACTORS 8
-/* e.g. an fft of length 128 has 4 factors
- as far as kissfft is concerned
- 4*4*4*2
- */
-
-typedef struct kiss_fft_state{
- int nfft;
-#ifndef FIXED_POINT
- kiss_fft_scalar scale;
-#endif
- int shift;
- opus_int16 factors[2*MAXFACTORS];
- const opus_int16 *bitrev;
- const kiss_twiddle_cpx *twiddles;
-} kiss_fft_state;
-
-/*typedef struct kiss_fft_state* kiss_fft_cfg;*/
-
-/**
- * opus_fft_alloc
- *
- * Initialize a FFT (or IFFT) algorithm's cfg/state buffer.
- *
- * typical usage: kiss_fft_cfg mycfg=opus_fft_alloc(1024,0,NULL,NULL);
- *
- * The return value from fft_alloc is a cfg buffer used internally
- * by the fft routine or NULL.
- *
- * If lenmem is NULL, then opus_fft_alloc will allocate a cfg buffer using malloc.
- * The returned value should be free()d when done to avoid memory leaks.
- *
- * The state can be placed in a user supplied buffer 'mem':
- * If lenmem is not NULL and mem is not NULL and *lenmem is large enough,
- * then the function places the cfg in mem and the size used in *lenmem
- * and returns mem.
- *
- * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough),
- * then the function returns NULL and places the minimum cfg
- * buffer size in *lenmem.
- * */
-
-kiss_fft_state *opus_fft_alloc_twiddles(int nfft,void * mem,size_t * lenmem, const kiss_fft_state *base);
-
-kiss_fft_state *opus_fft_alloc(int nfft,void * mem,size_t * lenmem);
-
-/**
- * opus_fft(cfg,in_out_buf)
- *
- * Perform an FFT on a complex input buffer.
- * for a forward FFT,
- * fin should be f[0] , f[1] , ... ,f[nfft-1]
- * fout will be F[0] , F[1] , ... ,F[nfft-1]
- * Note that each element is complex and can be accessed like
- f[k].r and f[k].i
- * */
-void opus_fft(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout);
-void opus_ifft(const kiss_fft_state *cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout);
-
-void opus_fft_free(const kiss_fft_state *cfg);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/opus-1.1/celt/laplace.c b/src/opus-1.1/celt/laplace.c
deleted file mode 100644
index a7bca874..00000000
--- a/src/opus-1.1/celt/laplace.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/* Copyright (c) 2007 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "laplace.h"
-#include "mathops.h"
-
-/* The minimum probability of an energy delta (out of 32768). */
-#define LAPLACE_LOG_MINP (0)
-#define LAPLACE_MINP (1<<LAPLACE_LOG_MINP)
-/* The minimum number of guaranteed representable energy deltas (in one
- direction). */
-#define LAPLACE_NMIN (16)
-
-/* When called, decay is positive and at most 11456. */
-static unsigned ec_laplace_get_freq1(unsigned fs0, int decay)
-{
- unsigned ft;
- ft = 32768 - LAPLACE_MINP*(2*LAPLACE_NMIN) - fs0;
- return ft*(opus_int32)(16384-decay)>>15;
-}
-
-void ec_laplace_encode(ec_enc *enc, int *value, unsigned fs, int decay)
-{
- unsigned fl;
- int val = *value;
- fl = 0;
- if (val)
- {
- int s;
- int i;
- s = -(val<0);
- val = (val+s)^s;
- fl = fs;
- fs = ec_laplace_get_freq1(fs, decay);
- /* Search the decaying part of the PDF.*/
- for (i=1; fs > 0 && i < val; i++)
- {
- fs *= 2;
- fl += fs+2*LAPLACE_MINP;
- fs = (fs*(opus_int32)decay)>>15;
- }
- /* Everything beyond that has probability LAPLACE_MINP. */
- if (!fs)
- {
- int di;
- int ndi_max;
- ndi_max = (32768-fl+LAPLACE_MINP-1)>>LAPLACE_LOG_MINP;
- ndi_max = (ndi_max-s)>>1;
- di = IMIN(val - i, ndi_max - 1);
- fl += (2*di+1+s)*LAPLACE_MINP;
- fs = IMIN(LAPLACE_MINP, 32768-fl);
- *value = (i+di+s)^s;
- }
- else
- {
- fs += LAPLACE_MINP;
- fl += fs&~s;
- }
- celt_assert(fl+fs<=32768);
- celt_assert(fs>0);
- }
- ec_encode_bin(enc, fl, fl+fs, 15);
-}
-
-int ec_laplace_decode(ec_dec *dec, unsigned fs, int decay)
-{
- int val=0;
- unsigned fl;
- unsigned fm;
- fm = ec_decode_bin(dec, 15);
- fl = 0;
- if (fm >= fs)
- {
- val++;
- fl = fs;
- fs = ec_laplace_get_freq1(fs, decay)+LAPLACE_MINP;
- /* Search the decaying part of the PDF.*/
- while(fs > LAPLACE_MINP && fm >= fl+2*fs)
- {
- fs *= 2;
- fl += fs;
- fs = ((fs-2*LAPLACE_MINP)*(opus_int32)decay)>>15;
- fs += LAPLACE_MINP;
- val++;
- }
- /* Everything beyond that has probability LAPLACE_MINP. */
- if (fs <= LAPLACE_MINP)
- {
- int di;
- di = (fm-fl)>>(LAPLACE_LOG_MINP+1);
- val += di;
- fl += 2*di*LAPLACE_MINP;
- }
- if (fm < fl+fs)
- val = -val;
- else
- fl += fs;
- }
- celt_assert(fl<32768);
- celt_assert(fs>0);
- celt_assert(fl<=fm);
- celt_assert(fm<IMIN(fl+fs,32768));
- ec_dec_update(dec, fl, IMIN(fl+fs,32768), 32768);
- return val;
-}
diff --git a/src/opus-1.1/celt/laplace.h b/src/opus-1.1/celt/laplace.h
deleted file mode 100644
index 46c14b5d..00000000
--- a/src/opus-1.1/celt/laplace.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Copyright (c) 2007 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#include "entenc.h"
-#include "entdec.h"
-
-/** Encode a value that is assumed to be the realisation of a
- Laplace-distributed random process
- @param enc Entropy encoder state
- @param value Value to encode
- @param fs Probability of 0, multiplied by 32768
- @param decay Probability of the value +/- 1, multiplied by 16384
-*/
-void ec_laplace_encode(ec_enc *enc, int *value, unsigned fs, int decay);
-
-/** Decode a value that is assumed to be the realisation of a
- Laplace-distributed random process
- @param dec Entropy decoder state
- @param fs Probability of 0, multiplied by 32768
- @param decay Probability of the value +/- 1, multiplied by 16384
- @return Value decoded
- */
-int ec_laplace_decode(ec_dec *dec, unsigned fs, int decay);
diff --git a/src/opus-1.1/celt/mathops.c b/src/opus-1.1/celt/mathops.c
deleted file mode 100644
index 3f8c5dcc..00000000
--- a/src/opus-1.1/celt/mathops.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/* Copyright (c) 2002-2008 Jean-Marc Valin
- Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/**
- @file mathops.h
- @brief Various math functions
-*/
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "mathops.h"
-
-/*Compute floor(sqrt(_val)) with exact arithmetic.
- This has been tested on all possible 32-bit inputs.*/
-unsigned isqrt32(opus_uint32 _val){
- unsigned b;
- unsigned g;
- int bshift;
- /*Uses the second method from
- http://www.azillionmonkeys.com/qed/sqroot.html
- The main idea is to search for the largest binary digit b such that
- (g+b)*(g+b) <= _val, and add it to the solution g.*/
- g=0;
- bshift=(EC_ILOG(_val)-1)>>1;
- b=1U<<bshift;
- do{
- opus_uint32 t;
- t=(((opus_uint32)g<<1)+b)<<bshift;
- if(t<=_val){
- g+=b;
- _val-=t;
- }
- b>>=1;
- bshift--;
- }
- while(bshift>=0);
- return g;
-}
-
-#ifdef FIXED_POINT
-
-opus_val32 frac_div32(opus_val32 a, opus_val32 b)
-{
- opus_val16 rcp;
- opus_val32 result, rem;
- int shift = celt_ilog2(b)-29;
- a = VSHR32(a,shift);
- b = VSHR32(b,shift);
- /* 16-bit reciprocal */
- rcp = ROUND16(celt_rcp(ROUND16(b,16)),3);
- result = MULT16_32_Q15(rcp, a);
- rem = PSHR32(a,2)-MULT32_32_Q31(result, b);
- result = ADD32(result, SHL32(MULT16_32_Q15(rcp, rem),2));
- if (result >= 536870912) /* 2^29 */
- return 2147483647; /* 2^31 - 1 */
- else if (result <= -536870912) /* -2^29 */
- return -2147483647; /* -2^31 */
- else
- return SHL32(result, 2);
-}
-
-/** Reciprocal sqrt approximation in the range [0.25,1) (Q16 in, Q14 out) */
-opus_val16 celt_rsqrt_norm(opus_val32 x)
-{
- opus_val16 n;
- opus_val16 r;
- opus_val16 r2;
- opus_val16 y;
- /* Range of n is [-16384,32767] ([-0.5,1) in Q15). */
- n = x-32768;
- /* Get a rough initial guess for the root.
- The optimal minimax quadratic approximation (using relative error) is
- r = 1.437799046117536+n*(-0.823394375837328+n*0.4096419668459485).
- Coefficients here, and the final result r, are Q14.*/
- r = ADD16(23557, MULT16_16_Q15(n, ADD16(-13490, MULT16_16_Q15(n, 6713))));
- /* We want y = x*r*r-1 in Q15, but x is 32-bit Q16 and r is Q14.
- We can compute the result from n and r using Q15 multiplies with some
- adjustment, carefully done to avoid overflow.
- Range of y is [-1564,1594]. */
- r2 = MULT16_16_Q15(r, r);
- y = SHL16(SUB16(ADD16(MULT16_16_Q15(r2, n), r2), 16384), 1);
- /* Apply a 2nd-order Householder iteration: r += r*y*(y*0.375-0.5).
- This yields the Q14 reciprocal square root of the Q16 x, with a maximum
- relative error of 1.04956E-4, a (relative) RMSE of 2.80979E-5, and a
- peak absolute error of 2.26591/16384. */
- return ADD16(r, MULT16_16_Q15(r, MULT16_16_Q15(y,
- SUB16(MULT16_16_Q15(y, 12288), 16384))));
-}
-
-/** Sqrt approximation (QX input, QX/2 output) */
-opus_val32 celt_sqrt(opus_val32 x)
-{
- int k;
- opus_val16 n;
- opus_val32 rt;
- static const opus_val16 C[5] = {23175, 11561, -3011, 1699, -664};
- if (x==0)
- return 0;
- else if (x>=1073741824)
- return 32767;
- k = (celt_ilog2(x)>>1)-7;
- x = VSHR32(x, 2*k);
- n = x-32768;
- rt = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2],
- MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, (C[4])))))))));
- rt = VSHR32(rt,7-k);
- return rt;
-}
-
-#define L1 32767
-#define L2 -7651
-#define L3 8277
-#define L4 -626
-
-static OPUS_INLINE opus_val16 _celt_cos_pi_2(opus_val16 x)
-{
- opus_val16 x2;
-
- x2 = MULT16_16_P15(x,x);
- return ADD16(1,MIN16(32766,ADD32(SUB16(L1,x2), MULT16_16_P15(x2, ADD32(L2, MULT16_16_P15(x2, ADD32(L3, MULT16_16_P15(L4, x2
- ))))))));
-}
-
-#undef L1
-#undef L2
-#undef L3
-#undef L4
-
-opus_val16 celt_cos_norm(opus_val32 x)
-{
- x = x&0x0001ffff;
- if (x>SHL32(EXTEND32(1), 16))
- x = SUB32(SHL32(EXTEND32(1), 17),x);
- if (x&0x00007fff)
- {
- if (x<SHL32(EXTEND32(1), 15))
- {
- return _celt_cos_pi_2(EXTRACT16(x));
- } else {
- return NEG32(_celt_cos_pi_2(EXTRACT16(65536-x)));
- }
- } else {
- if (x&0x0000ffff)
- return 0;
- else if (x&0x0001ffff)
- return -32767;
- else
- return 32767;
- }
-}
-
-/** Reciprocal approximation (Q15 input, Q16 output) */
-opus_val32 celt_rcp(opus_val32 x)
-{
- int i;
- opus_val16 n;
- opus_val16 r;
- celt_assert2(x>0, "celt_rcp() only defined for positive values");
- i = celt_ilog2(x);
- /* n is Q15 with range [0,1). */
- n = VSHR32(x,i-15)-32768;
- /* Start with a linear approximation:
- r = 1.8823529411764706-0.9411764705882353*n.
- The coefficients and the result are Q14 in the range [15420,30840].*/
- r = ADD16(30840, MULT16_16_Q15(-15420, n));
- /* Perform two Newton iterations:
- r -= r*((r*n)-1.Q15)
- = r*((r*n)+(r-1.Q15)). */
- r = SUB16(r, MULT16_16_Q15(r,
- ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768))));
- /* We subtract an extra 1 in the second iteration to avoid overflow; it also
- neatly compensates for truncation error in the rest of the process. */
- r = SUB16(r, ADD16(1, MULT16_16_Q15(r,
- ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768)))));
- /* r is now the Q15 solution to 2/(n+1), with a maximum relative error
- of 7.05346E-5, a (relative) RMSE of 2.14418E-5, and a peak absolute
- error of 1.24665/32768. */
- return VSHR32(EXTEND32(r),i-16);
-}
-
-#endif
diff --git a/src/opus-1.1/celt/mathops.h b/src/opus-1.1/celt/mathops.h
deleted file mode 100644
index a0525a96..00000000
--- a/src/opus-1.1/celt/mathops.h
+++ /dev/null
@@ -1,258 +0,0 @@
-/* Copyright (c) 2002-2008 Jean-Marc Valin
- Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/**
- @file mathops.h
- @brief Various math functions
-*/
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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 MATHOPS_H
-#define MATHOPS_H
-
-#include "arch.h"
-#include "entcode.h"
-#include "os_support.h"
-
-/* Multiplies two 16-bit fractional values. Bit-exactness of this macro is important */
-#define FRAC_MUL16(a,b) ((16384+((opus_int32)(opus_int16)(a)*(opus_int16)(b)))>>15)
-
-unsigned isqrt32(opus_uint32 _val);
-
-#ifndef OVERRIDE_CELT_MAXABS16
-static OPUS_INLINE opus_val32 celt_maxabs16(const opus_val16 *x, int len)
-{
- int i;
- opus_val16 maxval = 0;
- opus_val16 minval = 0;
- for (i=0;i<len;i++)
- {
- maxval = MAX16(maxval, x[i]);
- minval = MIN16(minval, x[i]);
- }
- return MAX32(EXTEND32(maxval),-EXTEND32(minval));
-}
-#endif
-
-#ifndef OVERRIDE_CELT_MAXABS32
-#ifdef FIXED_POINT
-static OPUS_INLINE opus_val32 celt_maxabs32(const opus_val32 *x, int len)
-{
- int i;
- opus_val32 maxval = 0;
- opus_val32 minval = 0;
- for (i=0;i<len;i++)
- {
- maxval = MAX32(maxval, x[i]);
- minval = MIN32(minval, x[i]);
- }
- return MAX32(maxval, -minval);
-}
-#else
-#define celt_maxabs32(x,len) celt_maxabs16(x,len)
-#endif
-#endif
-
-
-#ifndef FIXED_POINT
-
-#define PI 3.141592653f
-#define celt_sqrt(x) ((float)sqrt(x))
-#define celt_rsqrt(x) (1.f/celt_sqrt(x))
-#define celt_rsqrt_norm(x) (celt_rsqrt(x))
-#define celt_cos_norm(x) ((float)cos((.5f*PI)*(x)))
-#define celt_rcp(x) (1.f/(x))
-#define celt_div(a,b) ((a)/(b))
-#define frac_div32(a,b) ((float)(a)/(b))
-
-#ifdef FLOAT_APPROX
-
-/* Note: This assumes radix-2 floating point with the exponent at bits 23..30 and an offset of 127
- denorm, +/- inf and NaN are *not* handled */
-
-/** Base-2 log approximation (log2(x)). */
-static OPUS_INLINE float celt_log2(float x)
-{
- int integer;
- float frac;
- union {
- float f;
- opus_uint32 i;
- } in;
- in.f = x;
- integer = (in.i>>23)-127;
- in.i -= integer<<23;
- frac = in.f - 1.5f;
- frac = -0.41445418f + frac*(0.95909232f
- + frac*(-0.33951290f + frac*0.16541097f));
- return 1+integer+frac;
-}
-
-/** Base-2 exponential approximation (2^x). */
-static OPUS_INLINE float celt_exp2(float x)
-{
- int integer;
- float frac;
- union {
- float f;
- opus_uint32 i;
- } res;
- integer = floor(x);
- if (integer < -50)
- return 0;
- frac = x-integer;
- /* K0 = 1, K1 = log(2), K2 = 3-4*log(2), K3 = 3*log(2) - 2 */
- res.f = 0.99992522f + frac * (0.69583354f
- + frac * (0.22606716f + 0.078024523f*frac));
- res.i = (res.i + (integer<<23)) & 0x7fffffff;
- return res.f;
-}
-
-#else
-#define celt_log2(x) ((float)(1.442695040888963387*log(x)))
-#define celt_exp2(x) ((float)exp(0.6931471805599453094*(x)))
-#endif
-
-#endif
-
-#ifdef FIXED_POINT
-
-#include "os_support.h"
-
-#ifndef OVERRIDE_CELT_ILOG2
-/** Integer log in base2. Undefined for zero and negative numbers */
-static OPUS_INLINE opus_int16 celt_ilog2(opus_int32 x)
-{
- celt_assert2(x>0, "celt_ilog2() only defined for strictly positive numbers");
- return EC_ILOG(x)-1;
-}
-#endif
-
-
-/** Integer log in base2. Defined for zero, but not for negative numbers */
-static OPUS_INLINE opus_int16 celt_zlog2(opus_val32 x)
-{
- return x <= 0 ? 0 : celt_ilog2(x);
-}
-
-opus_val16 celt_rsqrt_norm(opus_val32 x);
-
-opus_val32 celt_sqrt(opus_val32 x);
-
-opus_val16 celt_cos_norm(opus_val32 x);
-
-/** Base-2 logarithm approximation (log2(x)). (Q14 input, Q10 output) */
-static OPUS_INLINE opus_val16 celt_log2(opus_val32 x)
-{
- int i;
- opus_val16 n, frac;
- /* -0.41509302963303146, 0.9609890551383969, -0.31836011537636605,
- 0.15530808010959576, -0.08556153059057618 */
- static const opus_val16 C[5] = {-6801+(1<<(13-DB_SHIFT)), 15746, -5217, 2545, -1401};
- if (x==0)
- return -32767;
- i = celt_ilog2(x);
- n = VSHR32(x,i-15)-32768-16384;
- frac = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, C[4]))))))));
- return SHL16(i-13,DB_SHIFT)+SHR16(frac,14-DB_SHIFT);
-}
-
-/*
- K0 = 1
- K1 = log(2)
- K2 = 3-4*log(2)
- K3 = 3*log(2) - 2
-*/
-#define D0 16383
-#define D1 22804
-#define D2 14819
-#define D3 10204
-
-static OPUS_INLINE opus_val32 celt_exp2_frac(opus_val16 x)
-{
- opus_val16 frac;
- frac = SHL16(x, 4);
- return ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac))))));
-}
-/** Base-2 exponential approximation (2^x). (Q10 input, Q16 output) */
-static OPUS_INLINE opus_val32 celt_exp2(opus_val16 x)
-{
- int integer;
- opus_val16 frac;
- integer = SHR16(x,10);
- if (integer>14)
- return 0x7f000000;
- else if (integer < -15)
- return 0;
- frac = celt_exp2_frac(x-SHL16(integer,10));
- return VSHR32(EXTEND32(frac), -integer-2);
-}
-
-opus_val32 celt_rcp(opus_val32 x);
-
-#define celt_div(a,b) MULT32_32_Q31((opus_val32)(a),celt_rcp(b))
-
-opus_val32 frac_div32(opus_val32 a, opus_val32 b);
-
-#define M1 32767
-#define M2 -21
-#define M3 -11943
-#define M4 4936
-
-/* Atan approximation using a 4th order polynomial. Input is in Q15 format
- and normalized by pi/4. Output is in Q15 format */
-static OPUS_INLINE opus_val16 celt_atan01(opus_val16 x)
-{
- return MULT16_16_P15(x, ADD32(M1, MULT16_16_P15(x, ADD32(M2, MULT16_16_P15(x, ADD32(M3, MULT16_16_P15(M4, x)))))));
-}
-
-#undef M1
-#undef M2
-#undef M3
-#undef M4
-
-/* atan2() approximation valid for positive input values */
-static OPUS_INLINE opus_val16 celt_atan2p(opus_val16 y, opus_val16 x)
-{
- if (y < x)
- {
- opus_val32 arg;
- arg = celt_div(SHL32(EXTEND32(y),15),x);
- if (arg >= 32767)
- arg = 32767;
- return SHR16(celt_atan01(EXTRACT16(arg)),1);
- } else {
- opus_val32 arg;
- arg = celt_div(SHL32(EXTEND32(x),15),y);
- if (arg >= 32767)
- arg = 32767;
- return 25736-SHR16(celt_atan01(EXTRACT16(arg)),1);
- }
-}
-
-#endif /* FIXED_POINT */
-#endif /* MATHOPS_H */
diff --git a/src/opus-1.1/celt/mdct.c b/src/opus-1.1/celt/mdct.c
deleted file mode 100644
index 90a214ad..00000000
--- a/src/opus-1.1/celt/mdct.c
+++ /dev/null
@@ -1,311 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2008 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-/* This is a simple MDCT implementation that uses a N/4 complex FFT
- to do most of the work. It should be relatively straightforward to
- plug in pretty much and FFT here.
-
- This replaces the Vorbis FFT (and uses the exact same API), which
- was a bit too messy and that was ending up duplicating code
- (might as well use the same FFT everywhere).
-
- The algorithm is similar to (and inspired from) Fabrice Bellard's
- MDCT implementation in FFMPEG, but has differences in signs, ordering
- and scaling in many places.
-*/
-
-#ifndef SKIP_CONFIG_H
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#endif
-
-#include "mdct.h"
-#include "kiss_fft.h"
-#include "_kiss_fft_guts.h"
-#include <math.h>
-#include "os_support.h"
-#include "mathops.h"
-#include "stack_alloc.h"
-
-#ifdef CUSTOM_MODES
-
-int clt_mdct_init(mdct_lookup *l,int N, int maxshift)
-{
- int i;
- int N4;
- kiss_twiddle_scalar *trig;
-#if defined(FIXED_POINT)
- int N2=N>>1;
-#endif
- l->n = N;
- N4 = N>>2;
- l->maxshift = maxshift;
- for (i=0;i<=maxshift;i++)
- {
- if (i==0)
- l->kfft[i] = opus_fft_alloc(N>>2>>i, 0, 0);
- else
- l->kfft[i] = opus_fft_alloc_twiddles(N>>2>>i, 0, 0, l->kfft[0]);
-#ifndef ENABLE_TI_DSPLIB55
- if (l->kfft[i]==NULL)
- return 0;
-#endif
- }
- l->trig = trig = (kiss_twiddle_scalar*)opus_alloc((N4+1)*sizeof(kiss_twiddle_scalar));
- if (l->trig==NULL)
- return 0;
- /* We have enough points that sine isn't necessary */
-#if defined(FIXED_POINT)
- for (i=0;i<=N4;i++)
- trig[i] = TRIG_UPSCALE*celt_cos_norm(DIV32(ADD32(SHL32(EXTEND32(i),17),N2),N));
-#else
- for (i=0;i<=N4;i++)
- trig[i] = (kiss_twiddle_scalar)cos(2*PI*i/N);
-#endif
- return 1;
-}
-
-void clt_mdct_clear(mdct_lookup *l)
-{
- int i;
- for (i=0;i<=l->maxshift;i++)
- opus_fft_free(l->kfft[i]);
- opus_free((kiss_twiddle_scalar*)l->trig);
-}
-
-#endif /* CUSTOM_MODES */
-
-/* Forward MDCT trashes the input array */
-void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out,
- const opus_val16 *window, int overlap, int shift, int stride)
-{
- int i;
- int N, N2, N4;
- kiss_twiddle_scalar sine;
- VARDECL(kiss_fft_scalar, f);
- VARDECL(kiss_fft_scalar, f2);
- SAVE_STACK;
- N = l->n;
- N >>= shift;
- N2 = N>>1;
- N4 = N>>2;
- ALLOC(f, N2, kiss_fft_scalar);
- ALLOC(f2, N2, kiss_fft_scalar);
- /* sin(x) ~= x here */
-#ifdef FIXED_POINT
- sine = TRIG_UPSCALE*(QCONST16(0.7853981f, 15)+N2)/N;
-#else
- sine = (kiss_twiddle_scalar)2*PI*(.125f)/N;
-#endif
-
- /* Consider the input to be composed of four blocks: [a, b, c, d] */
- /* Window, shuffle, fold */
- {
- /* Temp pointers to make it really clear to the compiler what we're doing */
- const kiss_fft_scalar * OPUS_RESTRICT xp1 = in+(overlap>>1);
- const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+N2-1+(overlap>>1);
- kiss_fft_scalar * OPUS_RESTRICT yp = f;
- const opus_val16 * OPUS_RESTRICT wp1 = window+(overlap>>1);
- const opus_val16 * OPUS_RESTRICT wp2 = window+(overlap>>1)-1;
- for(i=0;i<((overlap+3)>>2);i++)
- {
- /* Real part arranged as -d-cR, Imag part arranged as -b+aR*/
- *yp++ = MULT16_32_Q15(*wp2, xp1[N2]) + MULT16_32_Q15(*wp1,*xp2);
- *yp++ = MULT16_32_Q15(*wp1, *xp1) - MULT16_32_Q15(*wp2, xp2[-N2]);
- xp1+=2;
- xp2-=2;
- wp1+=2;
- wp2-=2;
- }
- wp1 = window;
- wp2 = window+overlap-1;
- for(;i<N4-((overlap+3)>>2);i++)
- {
- /* Real part arranged as a-bR, Imag part arranged as -c-dR */
- *yp++ = *xp2;
- *yp++ = *xp1;
- xp1+=2;
- xp2-=2;
- }
- for(;i<N4;i++)
- {
- /* Real part arranged as a-bR, Imag part arranged as -c-dR */
- *yp++ = -MULT16_32_Q15(*wp1, xp1[-N2]) + MULT16_32_Q15(*wp2, *xp2);
- *yp++ = MULT16_32_Q15(*wp2, *xp1) + MULT16_32_Q15(*wp1, xp2[N2]);
- xp1+=2;
- xp2-=2;
- wp1+=2;
- wp2-=2;
- }
- }
- /* Pre-rotation */
- {
- kiss_fft_scalar * OPUS_RESTRICT yp = f;
- const kiss_twiddle_scalar *t = &l->trig[0];
- for(i=0;i<N4;i++)
- {
- kiss_fft_scalar re, im, yr, yi;
- re = yp[0];
- im = yp[1];
- yr = -S_MUL(re,t[i<<shift]) - S_MUL(im,t[(N4-i)<<shift]);
- yi = -S_MUL(im,t[i<<shift]) + S_MUL(re,t[(N4-i)<<shift]);
- /* works because the cos is nearly one */
- *yp++ = yr + S_MUL(yi,sine);
- *yp++ = yi - S_MUL(yr,sine);
- }
- }
-
- /* N/4 complex FFT, down-scales by 4/N */
- opus_fft(l->kfft[shift], (kiss_fft_cpx *)f, (kiss_fft_cpx *)f2);
-
- /* Post-rotate */
- {
- /* Temp pointers to make it really clear to the compiler what we're doing */
- const kiss_fft_scalar * OPUS_RESTRICT fp = f2;
- kiss_fft_scalar * OPUS_RESTRICT yp1 = out;
- kiss_fft_scalar * OPUS_RESTRICT yp2 = out+stride*(N2-1);
- const kiss_twiddle_scalar *t = &l->trig[0];
- /* Temp pointers to make it really clear to the compiler what we're doing */
- for(i=0;i<N4;i++)
- {
- kiss_fft_scalar yr, yi;
- yr = S_MUL(fp[1],t[(N4-i)<<shift]) + S_MUL(fp[0],t[i<<shift]);
- yi = S_MUL(fp[0],t[(N4-i)<<shift]) - S_MUL(fp[1],t[i<<shift]);
- /* works because the cos is nearly one */
- *yp1 = yr - S_MUL(yi,sine);
- *yp2 = yi + S_MUL(yr,sine);;
- fp += 2;
- yp1 += 2*stride;
- yp2 -= 2*stride;
- }
- }
- RESTORE_STACK;
-}
-
-void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_scalar * OPUS_RESTRICT out,
- const opus_val16 * OPUS_RESTRICT window, int overlap, int shift, int stride)
-{
- int i;
- int N, N2, N4;
- kiss_twiddle_scalar sine;
- VARDECL(kiss_fft_scalar, f2);
- SAVE_STACK;
- N = l->n;
- N >>= shift;
- N2 = N>>1;
- N4 = N>>2;
- ALLOC(f2, N2, kiss_fft_scalar);
- /* sin(x) ~= x here */
-#ifdef FIXED_POINT
- sine = TRIG_UPSCALE*(QCONST16(0.7853981f, 15)+N2)/N;
-#else
- sine = (kiss_twiddle_scalar)2*PI*(.125f)/N;
-#endif
-
- /* Pre-rotate */
- {
- /* Temp pointers to make it really clear to the compiler what we're doing */
- const kiss_fft_scalar * OPUS_RESTRICT xp1 = in;
- const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+stride*(N2-1);
- kiss_fft_scalar * OPUS_RESTRICT yp = f2;
- const kiss_twiddle_scalar *t = &l->trig[0];
- for(i=0;i<N4;i++)
- {
- kiss_fft_scalar yr, yi;
- yr = -S_MUL(*xp2, t[i<<shift]) + S_MUL(*xp1,t[(N4-i)<<shift]);
- yi = -S_MUL(*xp2, t[(N4-i)<<shift]) - S_MUL(*xp1,t[i<<shift]);
- /* works because the cos is nearly one */
- *yp++ = yr - S_MUL(yi,sine);
- *yp++ = yi + S_MUL(yr,sine);
- xp1+=2*stride;
- xp2-=2*stride;
- }
- }
-
- /* Inverse N/4 complex FFT. This one should *not* downscale even in fixed-point */
- opus_ifft(l->kfft[shift], (kiss_fft_cpx *)f2, (kiss_fft_cpx *)(out+(overlap>>1)));
-
- /* Post-rotate and de-shuffle from both ends of the buffer at once to make
- it in-place. */
- {
- kiss_fft_scalar * OPUS_RESTRICT yp0 = out+(overlap>>1);
- kiss_fft_scalar * OPUS_RESTRICT yp1 = out+(overlap>>1)+N2-2;
- const kiss_twiddle_scalar *t = &l->trig[0];
- /* Loop to (N4+1)>>1 to handle odd N4. When N4 is odd, the
- middle pair will be computed twice. */
- for(i=0;i<(N4+1)>>1;i++)
- {
- kiss_fft_scalar re, im, yr, yi;
- kiss_twiddle_scalar t0, t1;
- re = yp0[0];
- im = yp0[1];
- t0 = t[i<<shift];
- t1 = t[(N4-i)<<shift];
- /* We'd scale up by 2 here, but instead it's done when mixing the windows */
- yr = S_MUL(re,t0) - S_MUL(im,t1);
- yi = S_MUL(im,t0) + S_MUL(re,t1);
- re = yp1[0];
- im = yp1[1];
- /* works because the cos is nearly one */
- yp0[0] = -(yr - S_MUL(yi,sine));
- yp1[1] = yi + S_MUL(yr,sine);
-
- t0 = t[(N4-i-1)<<shift];
- t1 = t[(i+1)<<shift];
- /* We'd scale up by 2 here, but instead it's done when mixing the windows */
- yr = S_MUL(re,t0) - S_MUL(im,t1);
- yi = S_MUL(im,t0) + S_MUL(re,t1);
- /* works because the cos is nearly one */
- yp1[0] = -(yr - S_MUL(yi,sine));
- yp0[1] = yi + S_MUL(yr,sine);
- yp0 += 2;
- yp1 -= 2;
- }
- }
-
- /* Mirror on both sides for TDAC */
- {
- kiss_fft_scalar * OPUS_RESTRICT xp1 = out+overlap-1;
- kiss_fft_scalar * OPUS_RESTRICT yp1 = out;
- const opus_val16 * OPUS_RESTRICT wp1 = window;
- const opus_val16 * OPUS_RESTRICT wp2 = window+overlap-1;
-
- for(i = 0; i < overlap/2; i++)
- {
- kiss_fft_scalar x1, x2;
- x1 = *xp1;
- x2 = *yp1;
- *yp1++ = MULT16_32_Q15(*wp2, x2) - MULT16_32_Q15(*wp1, x1);
- *xp1-- = MULT16_32_Q15(*wp1, x2) + MULT16_32_Q15(*wp2, x1);
- wp1++;
- wp2--;
- }
- }
- RESTORE_STACK;
-}
diff --git a/src/opus-1.1/celt/mdct.h b/src/opus-1.1/celt/mdct.h
deleted file mode 100644
index d7218213..00000000
--- a/src/opus-1.1/celt/mdct.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2008 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-/* This is a simple MDCT implementation that uses a N/4 complex FFT
- to do most of the work. It should be relatively straightforward to
- plug in pretty much and FFT here.
-
- This replaces the Vorbis FFT (and uses the exact same API), which
- was a bit too messy and that was ending up duplicating code
- (might as well use the same FFT everywhere).
-
- The algorithm is similar to (and inspired from) Fabrice Bellard's
- MDCT implementation in FFMPEG, but has differences in signs, ordering
- and scaling in many places.
-*/
-
-#ifndef MDCT_H
-#define MDCT_H
-
-#include "opus_defines.h"
-#include "kiss_fft.h"
-#include "arch.h"
-
-typedef struct {
- int n;
- int maxshift;
- const kiss_fft_state *kfft[4];
- const kiss_twiddle_scalar * OPUS_RESTRICT trig;
-} mdct_lookup;
-
-int clt_mdct_init(mdct_lookup *l,int N, int maxshift);
-void clt_mdct_clear(mdct_lookup *l);
-
-/** Compute a forward MDCT and scale by 4/N, trashes the input array */
-void clt_mdct_forward(const mdct_lookup *l, kiss_fft_scalar *in,
- kiss_fft_scalar * OPUS_RESTRICT out,
- const opus_val16 *window, int overlap, int shift, int stride);
-
-/** Compute a backward MDCT (no scaling) and performs weighted overlap-add
- (scales implicitly by 1/2) */
-void clt_mdct_backward(const mdct_lookup *l, kiss_fft_scalar *in,
- kiss_fft_scalar * OPUS_RESTRICT out,
- const opus_val16 * OPUS_RESTRICT window, int overlap, int shift, int stride);
-
-#endif
diff --git a/src/opus-1.1/celt/mfrngcod.h b/src/opus-1.1/celt/mfrngcod.h
deleted file mode 100644
index 809152a5..00000000
--- a/src/opus-1.1/celt/mfrngcod.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Copyright (c) 2001-2008 Timothy B. Terriberry
- Copyright (c) 2008-2009 Xiph.Org Foundation */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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(_mfrngcode_H)
-# define _mfrngcode_H (1)
-# include "entcode.h"
-
-/*Constants used by the entropy encoder/decoder.*/
-
-/*The number of bits to output at a time.*/
-# define EC_SYM_BITS (8)
-/*The total number of bits in each of the state registers.*/
-# define EC_CODE_BITS (32)
-/*The maximum symbol value.*/
-# define EC_SYM_MAX ((1U<<EC_SYM_BITS)-1)
-/*Bits to shift by to move a symbol into the high-order position.*/
-# define EC_CODE_SHIFT (EC_CODE_BITS-EC_SYM_BITS-1)
-/*Carry bit of the high-order range symbol.*/
-# define EC_CODE_TOP (((opus_uint32)1U)<<(EC_CODE_BITS-1))
-/*Low-order bit of the high-order range symbol.*/
-# define EC_CODE_BOT (EC_CODE_TOP>>EC_SYM_BITS)
-/*The number of bits available for the last, partial symbol in the code field.*/
-# define EC_CODE_EXTRA ((EC_CODE_BITS-2)%EC_SYM_BITS+1)
-#endif
diff --git a/src/opus-1.1/celt/modes.c b/src/opus-1.1/celt/modes.c
deleted file mode 100644
index 42e68e1c..00000000
--- a/src/opus-1.1/celt/modes.c
+++ /dev/null
@@ -1,438 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Copyright (c) 2008 Gregory Maxwell
- Written by Jean-Marc Valin and Gregory Maxwell */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "celt.h"
-#include "modes.h"
-#include "rate.h"
-#include "os_support.h"
-#include "stack_alloc.h"
-#include "quant_bands.h"
-
-static const opus_int16 eband5ms[] = {
-/*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100
-};
-
-/* Alternate tuning (partially derived from Vorbis) */
-#define BITALLOC_SIZE 11
-/* Bit allocation table in units of 1/32 bit/sample (0.1875 dB SNR) */
-static const unsigned char band_allocation[] = {
-/*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 90, 80, 75, 69, 63, 56, 49, 40, 34, 29, 20, 18, 10, 0, 0, 0, 0, 0, 0, 0, 0,
-110,100, 90, 84, 78, 71, 65, 58, 51, 45, 39, 32, 26, 20, 12, 0, 0, 0, 0, 0, 0,
-118,110,103, 93, 86, 80, 75, 70, 65, 59, 53, 47, 40, 31, 23, 15, 4, 0, 0, 0, 0,
-126,119,112,104, 95, 89, 83, 78, 72, 66, 60, 54, 47, 39, 32, 25, 17, 12, 1, 0, 0,
-134,127,120,114,103, 97, 91, 85, 78, 72, 66, 60, 54, 47, 41, 35, 29, 23, 16, 10, 1,
-144,137,130,124,113,107,101, 95, 88, 82, 76, 70, 64, 57, 51, 45, 39, 33, 26, 15, 1,
-152,145,138,132,123,117,111,105, 98, 92, 86, 80, 74, 67, 61, 55, 49, 43, 36, 20, 1,
-162,155,148,142,133,127,121,115,108,102, 96, 90, 84, 77, 71, 65, 59, 53, 46, 30, 1,
-172,165,158,152,143,137,131,125,118,112,106,100, 94, 87, 81, 75, 69, 63, 56, 45, 20,
-200,200,200,200,200,200,200,200,198,193,188,183,178,173,168,163,158,153,148,129,104,
-};
-
-#ifndef CUSTOM_MODES_ONLY
- #ifdef FIXED_POINT
- #include "static_modes_fixed.h"
- #else
- #include "static_modes_float.h"
- #endif
-#endif /* CUSTOM_MODES_ONLY */
-
-#ifndef M_PI
-#define M_PI 3.141592653
-#endif
-
-#ifdef CUSTOM_MODES
-
-/* Defining 25 critical bands for the full 0-20 kHz audio bandwidth
- Taken from http://ccrma.stanford.edu/~jos/bbt/Bark_Frequency_Scale.html */
-#define BARK_BANDS 25
-static const opus_int16 bark_freq[BARK_BANDS+1] = {
- 0, 100, 200, 300, 400,
- 510, 630, 770, 920, 1080,
- 1270, 1480, 1720, 2000, 2320,
- 2700, 3150, 3700, 4400, 5300,
- 6400, 7700, 9500, 12000, 15500,
- 20000};
-
-static opus_int16 *compute_ebands(opus_int32 Fs, int frame_size, int res, int *nbEBands)
-{
- opus_int16 *eBands;
- int i, j, lin, low, high, nBark, offset=0;
-
- /* All modes that have 2.5 ms short blocks use the same definition */
- if (Fs == 400*(opus_int32)frame_size)
- {
- *nbEBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1;
- eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+1));
- for (i=0;i<*nbEBands+1;i++)
- eBands[i] = eband5ms[i];
- return eBands;
- }
- /* Find the number of critical bands supported by our sampling rate */
- for (nBark=1;nBark<BARK_BANDS;nBark++)
- if (bark_freq[nBark+1]*2 >= Fs)
- break;
-
- /* Find where the linear part ends (i.e. where the spacing is more than min_width */
- for (lin=0;lin<nBark;lin++)
- if (bark_freq[lin+1]-bark_freq[lin] >= res)
- break;
-
- low = (bark_freq[lin]+res/2)/res;
- high = nBark-lin;
- *nbEBands = low+high;
- eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+2));
-
- if (eBands==NULL)
- return NULL;
-
- /* Linear spacing (min_width) */
- for (i=0;i<low;i++)
- eBands[i] = i;
- if (low>0)
- offset = eBands[low-1]*res - bark_freq[lin-1];
- /* Spacing follows critical bands */
- for (i=0;i<high;i++)
- {
- int target = bark_freq[lin+i];
- /* Round to an even value */
- eBands[i+low] = (target+offset/2+res)/(2*res)*2;
- offset = eBands[i+low]*res - target;
- }
- /* Enforce the minimum spacing at the boundary */
- for (i=0;i<*nbEBands;i++)
- if (eBands[i] < i)
- eBands[i] = i;
- /* Round to an even value */
- eBands[*nbEBands] = (bark_freq[nBark]+res)/(2*res)*2;
- if (eBands[*nbEBands] > frame_size)
- eBands[*nbEBands] = frame_size;
- for (i=1;i<*nbEBands-1;i++)
- {
- if (eBands[i+1]-eBands[i] < eBands[i]-eBands[i-1])
- {
- eBands[i] -= (2*eBands[i]-eBands[i-1]-eBands[i+1])/2;
- }
- }
- /* Remove any empty bands. */
- for (i=j=0;i<*nbEBands;i++)
- if(eBands[i+1]>eBands[j])
- eBands[++j]=eBands[i+1];
- *nbEBands=j;
-
- for (i=1;i<*nbEBands;i++)
- {
- /* Every band must be smaller than the last band. */
- celt_assert(eBands[i]-eBands[i-1]<=eBands[*nbEBands]-eBands[*nbEBands-1]);
- /* Each band must be no larger than twice the size of the previous one. */
- celt_assert(eBands[i+1]-eBands[i]<=2*(eBands[i]-eBands[i-1]));
- }
-
- return eBands;
-}
-
-static void compute_allocation_table(CELTMode *mode)
-{
- int i, j;
- unsigned char *allocVectors;
- int maxBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1;
-
- mode->nbAllocVectors = BITALLOC_SIZE;
- allocVectors = opus_alloc(sizeof(unsigned char)*(BITALLOC_SIZE*mode->nbEBands));
- if (allocVectors==NULL)
- return;
-
- /* Check for standard mode */
- if (mode->Fs == 400*(opus_int32)mode->shortMdctSize)
- {
- for (i=0;i<BITALLOC_SIZE*mode->nbEBands;i++)
- allocVectors[i] = band_allocation[i];
- mode->allocVectors = allocVectors;
- return;
- }
- /* If not the standard mode, interpolate */
- /* Compute per-codec-band allocation from per-critical-band matrix */
- for (i=0;i<BITALLOC_SIZE;i++)
- {
- for (j=0;j<mode->nbEBands;j++)
- {
- int k;
- for (k=0;k<maxBands;k++)
- {
- if (400*(opus_int32)eband5ms[k] > mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize)
- break;
- }
- if (k>maxBands-1)
- allocVectors[i*mode->nbEBands+j] = band_allocation[i*maxBands + maxBands-1];
- else {
- opus_int32 a0, a1;
- a1 = mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize - 400*(opus_int32)eband5ms[k-1];
- a0 = 400*(opus_int32)eband5ms[k] - mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize;
- allocVectors[i*mode->nbEBands+j] = (a0*band_allocation[i*maxBands+k-1]
- + a1*band_allocation[i*maxBands+k])/(a0+a1);
- }
- }
- }
-
- /*printf ("\n");
- for (i=0;i<BITALLOC_SIZE;i++)
- {
- for (j=0;j<mode->nbEBands;j++)
- printf ("%d ", allocVectors[i*mode->nbEBands+j]);
- printf ("\n");
- }
- exit(0);*/
-
- mode->allocVectors = allocVectors;
-}
-
-#endif /* CUSTOM_MODES */
-
-CELTMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error)
-{
- int i;
-#ifdef CUSTOM_MODES
- CELTMode *mode=NULL;
- int res;
- opus_val16 *window;
- opus_int16 *logN;
- int LM;
- ALLOC_STACK;
-#if !defined(VAR_ARRAYS) && !defined(USE_ALLOCA)
- if (global_stack==NULL)
- goto failure;
-#endif
-#endif
-
-#ifndef CUSTOM_MODES_ONLY
- for (i=0;i<TOTAL_MODES;i++)
- {
- int j;
- for (j=0;j<4;j++)
- {
- if (Fs == static_mode_list[i]->Fs &&
- (frame_size<<j) == static_mode_list[i]->shortMdctSize*static_mode_list[i]->nbShortMdcts)
- {
- if (error)
- *error = OPUS_OK;
- return (CELTMode*)static_mode_list[i];
- }
- }
- }
-#endif /* CUSTOM_MODES_ONLY */
-
-#ifndef CUSTOM_MODES
- if (error)
- *error = OPUS_BAD_ARG;
- return NULL;
-#else
-
- /* The good thing here is that permutation of the arguments will automatically be invalid */
-
- if (Fs < 8000 || Fs > 96000)
- {
- if (error)
- *error = OPUS_BAD_ARG;
- return NULL;
- }
- if (frame_size < 40 || frame_size > 1024 || frame_size%2!=0)
- {
- if (error)
- *error = OPUS_BAD_ARG;
- return NULL;
- }
- /* Frames of less than 1ms are not supported. */
- if ((opus_int32)frame_size*1000 < Fs)
- {
- if (error)
- *error = OPUS_BAD_ARG;
- return NULL;
- }
-
- if ((opus_int32)frame_size*75 >= Fs && (frame_size%16)==0)
- {
- LM = 3;
- } else if ((opus_int32)frame_size*150 >= Fs && (frame_size%8)==0)
- {
- LM = 2;
- } else if ((opus_int32)frame_size*300 >= Fs && (frame_size%4)==0)
- {
- LM = 1;
- } else
- {
- LM = 0;
- }
-
- /* Shorts longer than 3.3ms are not supported. */
- if ((opus_int32)(frame_size>>LM)*300 > Fs)
- {
- if (error)
- *error = OPUS_BAD_ARG;
- return NULL;
- }
-
- mode = opus_alloc(sizeof(CELTMode));
- if (mode==NULL)
- goto failure;
- mode->Fs = Fs;
-
- /* Pre/de-emphasis depends on sampling rate. The "standard" pre-emphasis
- is defined as A(z) = 1 - 0.85*z^-1 at 48 kHz. Other rates should
- approximate that. */
- if(Fs < 12000) /* 8 kHz */
- {
- mode->preemph[0] = QCONST16(0.3500061035f, 15);
- mode->preemph[1] = -QCONST16(0.1799926758f, 15);
- mode->preemph[2] = QCONST16(0.2719968125f, SIG_SHIFT); /* exact 1/preemph[3] */
- mode->preemph[3] = QCONST16(3.6765136719f, 13);
- } else if(Fs < 24000) /* 16 kHz */
- {
- mode->preemph[0] = QCONST16(0.6000061035f, 15);
- mode->preemph[1] = -QCONST16(0.1799926758f, 15);
- mode->preemph[2] = QCONST16(0.4424998650f, SIG_SHIFT); /* exact 1/preemph[3] */
- mode->preemph[3] = QCONST16(2.2598876953f, 13);
- } else if(Fs < 40000) /* 32 kHz */
- {
- mode->preemph[0] = QCONST16(0.7799987793f, 15);
- mode->preemph[1] = -QCONST16(0.1000061035f, 15);
- mode->preemph[2] = QCONST16(0.7499771125f, SIG_SHIFT); /* exact 1/preemph[3] */
- mode->preemph[3] = QCONST16(1.3333740234f, 13);
- } else /* 48 kHz */
- {
- mode->preemph[0] = QCONST16(0.8500061035f, 15);
- mode->preemph[1] = QCONST16(0.0f, 15);
- mode->preemph[2] = QCONST16(1.f, SIG_SHIFT);
- mode->preemph[3] = QCONST16(1.f, 13);
- }
-
- mode->maxLM = LM;
- mode->nbShortMdcts = 1<<LM;
- mode->shortMdctSize = frame_size/mode->nbShortMdcts;
- res = (mode->Fs+mode->shortMdctSize)/(2*mode->shortMdctSize);
-
- mode->eBands = compute_ebands(Fs, mode->shortMdctSize, res, &mode->nbEBands);
- if (mode->eBands==NULL)
- goto failure;
-#if !defined(SMALL_FOOTPRINT)
- /* Make sure we don't allocate a band larger than our PVQ table.
- 208 should be enough, but let's be paranoid. */
- if ((mode->eBands[mode->nbEBands] - mode->eBands[mode->nbEBands-1])<<LM >
- 208) {
- goto failure;
- }
-#endif
-
- mode->effEBands = mode->nbEBands;
- while (mode->eBands[mode->effEBands] > mode->shortMdctSize)
- mode->effEBands--;
-
- /* Overlap must be divisible by 4 */
- mode->overlap = ((mode->shortMdctSize>>2)<<2);
-
- compute_allocation_table(mode);
- if (mode->allocVectors==NULL)
- goto failure;
-
- window = (opus_val16*)opus_alloc(mode->overlap*sizeof(opus_val16));
- if (window==NULL)
- goto failure;
-
-#ifndef FIXED_POINT
- for (i=0;i<mode->overlap;i++)
- window[i] = Q15ONE*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap));
-#else
- for (i=0;i<mode->overlap;i++)
- window[i] = MIN32(32767,floor(.5+32768.*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap))));
-#endif
- mode->window = window;
-
- logN = (opus_int16*)opus_alloc(mode->nbEBands*sizeof(opus_int16));
- if (logN==NULL)
- goto failure;
-
- for (i=0;i<mode->nbEBands;i++)
- logN[i] = log2_frac(mode->eBands[i+1]-mode->eBands[i], BITRES);
- mode->logN = logN;
-
- compute_pulse_cache(mode, mode->maxLM);
-
- if (clt_mdct_init(&mode->mdct, 2*mode->shortMdctSize*mode->nbShortMdcts,
- mode->maxLM) == 0)
- goto failure;
-
- if (error)
- *error = OPUS_OK;
-
- return mode;
-failure:
- if (error)
- *error = OPUS_ALLOC_FAIL;
- if (mode!=NULL)
- opus_custom_mode_destroy(mode);
- return NULL;
-#endif /* !CUSTOM_MODES */
-}
-
-#ifdef CUSTOM_MODES
-void opus_custom_mode_destroy(CELTMode *mode)
-{
- if (mode == NULL)
- return;
-#ifndef CUSTOM_MODES_ONLY
- {
- int i;
- for (i=0;i<TOTAL_MODES;i++)
- {
- if (mode == static_mode_list[i])
- {
- return;
- }
- }
- }
-#endif /* CUSTOM_MODES_ONLY */
- opus_free((opus_int16*)mode->eBands);
- opus_free((opus_int16*)mode->allocVectors);
-
- opus_free((opus_val16*)mode->window);
- opus_free((opus_int16*)mode->logN);
-
- opus_free((opus_int16*)mode->cache.index);
- opus_free((unsigned char*)mode->cache.bits);
- opus_free((unsigned char*)mode->cache.caps);
- clt_mdct_clear(&mode->mdct);
-
- opus_free((CELTMode *)mode);
-}
-#endif
diff --git a/src/opus-1.1/celt/modes.h b/src/opus-1.1/celt/modes.h
deleted file mode 100644
index c8340f98..00000000
--- a/src/opus-1.1/celt/modes.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Copyright (c) 2008 Gregory Maxwell
- Written by Jean-Marc Valin and Gregory Maxwell */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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 MODES_H
-#define MODES_H
-
-#include "opus_types.h"
-#include "celt.h"
-#include "arch.h"
-#include "mdct.h"
-#include "entenc.h"
-#include "entdec.h"
-
-#define MAX_PERIOD 1024
-
-#ifndef OVERLAP
-#define OVERLAP(mode) ((mode)->overlap)
-#endif
-
-#ifndef FRAMESIZE
-#define FRAMESIZE(mode) ((mode)->mdctSize)
-#endif
-
-typedef struct {
- int size;
- const opus_int16 *index;
- const unsigned char *bits;
- const unsigned char *caps;
-} PulseCache;
-
-/** Mode definition (opaque)
- @brief Mode definition
- */
-struct OpusCustomMode {
- opus_int32 Fs;
- int overlap;
-
- int nbEBands;
- int effEBands;
- opus_val16 preemph[4];
- const opus_int16 *eBands; /**< Definition for each "pseudo-critical band" */
-
- int maxLM;
- int nbShortMdcts;
- int shortMdctSize;
-
- int nbAllocVectors; /**< Number of lines in the matrix below */
- const unsigned char *allocVectors; /**< Number of bits in each band for several rates */
- const opus_int16 *logN;
-
- const opus_val16 *window;
- mdct_lookup mdct;
- PulseCache cache;
-};
-
-
-#endif
diff --git a/src/opus-1.1/celt/opus_custom_demo.c b/src/opus-1.1/celt/opus_custom_demo.c
deleted file mode 100644
index ae41c0de..00000000
--- a/src/opus-1.1/celt/opus_custom_demo.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "opus_custom.h"
-#include "arch.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-
-#define MAX_PACKET 1275
-
-int main(int argc, char *argv[])
-{
- int err;
- char *inFile, *outFile;
- FILE *fin, *fout;
- OpusCustomMode *mode=NULL;
- OpusCustomEncoder *enc;
- OpusCustomDecoder *dec;
- int len;
- opus_int32 frame_size, channels, rate;
- int bytes_per_packet;
- unsigned char data[MAX_PACKET];
- int complexity;
-#if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH)
- int i;
- double rmsd = 0;
-#endif
- int count = 0;
- opus_int32 skip;
- opus_int16 *in, *out;
- if (argc != 9 && argc != 8 && argc != 7)
- {
- fprintf (stderr, "Usage: test_opus_custom <rate> <channels> <frame size> "
- " <bytes per packet> [<complexity> [packet loss rate]] "
- "<input> <output>\n");
- return 1;
- }
-
- rate = (opus_int32)atol(argv[1]);
- channels = atoi(argv[2]);
- frame_size = atoi(argv[3]);
- mode = opus_custom_mode_create(rate, frame_size, NULL);
- if (mode == NULL)
- {
- fprintf(stderr, "failed to create a mode\n");
- return 1;
- }
-
- bytes_per_packet = atoi(argv[4]);
- if (bytes_per_packet < 0 || bytes_per_packet > MAX_PACKET)
- {
- fprintf (stderr, "bytes per packet must be between 0 and %d\n",
- MAX_PACKET);
- return 1;
- }
-
- inFile = argv[argc-2];
- fin = fopen(inFile, "rb");
- if (!fin)
- {
- fprintf (stderr, "Could not open input file %s\n", argv[argc-2]);
- return 1;
- }
- outFile = argv[argc-1];
- fout = fopen(outFile, "wb+");
- if (!fout)
- {
- fprintf (stderr, "Could not open output file %s\n", argv[argc-1]);
- fclose(fin);
- return 1;
- }
-
- enc = opus_custom_encoder_create(mode, channels, &err);
- if (err != 0)
- {
- fprintf(stderr, "Failed to create the encoder: %s\n", opus_strerror(err));
- fclose(fin);
- fclose(fout);
- return 1;
- }
- dec = opus_custom_decoder_create(mode, channels, &err);
- if (err != 0)
- {
- fprintf(stderr, "Failed to create the decoder: %s\n", opus_strerror(err));
- fclose(fin);
- fclose(fout);
- return 1;
- }
- opus_custom_decoder_ctl(dec, OPUS_GET_LOOKAHEAD(&skip));
-
- if (argc>7)
- {
- complexity=atoi(argv[5]);
- opus_custom_encoder_ctl(enc,OPUS_SET_COMPLEXITY(complexity));
- }
-
- in = (opus_int16*)malloc(frame_size*channels*sizeof(opus_int16));
- out = (opus_int16*)malloc(frame_size*channels*sizeof(opus_int16));
-
- while (!feof(fin))
- {
- int ret;
- err = fread(in, sizeof(short), frame_size*channels, fin);
- if (feof(fin))
- break;
- len = opus_custom_encode(enc, in, frame_size, data, bytes_per_packet);
- if (len <= 0)
- fprintf (stderr, "opus_custom_encode() failed: %s\n", opus_strerror(len));
-
- /* This is for simulating bit errors */
-#if 0
- int errors = 0;
- int eid = 0;
- /* This simulates random bit error */
- for (i=0;i<len*8;i++)
- {
- if (rand()%atoi(argv[8])==0)
- {
- if (i<64)
- {
- errors++;
- eid = i;
- }
- data[i/8] ^= 1<<(7-(i%8));
- }
- }
- if (errors == 1)
- data[eid/8] ^= 1<<(7-(eid%8));
- else if (errors%2 == 1)
- data[rand()%8] ^= 1<<rand()%8;
-#endif
-
-#if 1 /* Set to zero to use the encoder's output instead */
- /* This is to simulate packet loss */
- if (argc==9 && rand()%1000<atoi(argv[argc-3]))
- /*if (errors && (errors%2==0))*/
- ret = opus_custom_decode(dec, NULL, len, out, frame_size);
- else
- ret = opus_custom_decode(dec, data, len, out, frame_size);
- if (ret < 0)
- fprintf(stderr, "opus_custom_decode() failed: %s\n", opus_strerror(ret));
-#else
- for (i=0;i<ret*channels;i++)
- out[i] = in[i];
-#endif
-#if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH)
- for (i=0;i<ret*channels;i++)
- {
- rmsd += (in[i]-out[i])*1.0*(in[i]-out[i]);
- /*out[i] -= in[i];*/
- }
-#endif
- count++;
- fwrite(out+skip*channels, sizeof(short), (ret-skip)*channels, fout);
- skip = 0;
- }
- PRINT_MIPS(stderr);
-
- opus_custom_encoder_destroy(enc);
- opus_custom_decoder_destroy(dec);
- fclose(fin);
- fclose(fout);
- opus_custom_mode_destroy(mode);
- free(in);
- free(out);
-#if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH)
- if (rmsd > 0)
- {
- rmsd = sqrt(rmsd/(1.0*frame_size*channels*count));
- fprintf (stderr, "Error: encoder doesn't match decoder\n");
- fprintf (stderr, "RMS mismatch is %f\n", rmsd);
- return 1;
- } else {
- fprintf (stderr, "Encoder matches decoder!!\n");
- }
-#endif
- return 0;
-}
-
diff --git a/src/opus-1.1/celt/os_support.h b/src/opus-1.1/celt/os_support.h
deleted file mode 100644
index 5e47e3cf..00000000
--- a/src/opus-1.1/celt/os_support.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/* 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.
-
- 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
-
-#ifdef CUSTOM_SUPPORT
-# include "custom_support.h"
-#endif
-
-#include "opus_types.h"
-#include "opus_defines.h"
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-/** Opus wrapper for malloc(). To do your own dynamic allocation, all you need to do is replace this function and opus_free */
-#ifndef OVERRIDE_OPUS_ALLOC
-static OPUS_INLINE void *opus_alloc (size_t size)
-{
- return malloc(size);
-}
-#endif
-
-/** Same as celt_alloc(), except that the area is only needed inside a CELT call (might cause problem with wideband though) */
-#ifndef OVERRIDE_OPUS_ALLOC_SCRATCH
-static OPUS_INLINE void *opus_alloc_scratch (size_t size)
-{
- /* Scratch space doesn't need to be cleared */
- return opus_alloc(size);
-}
-#endif
-
-/** Opus wrapper for free(). To do your own dynamic allocation, all you need to do is replace this function and opus_alloc */
-#ifndef OVERRIDE_OPUS_FREE
-static OPUS_INLINE void opus_free (void *ptr)
-{
- free(ptr);
-}
-#endif
-
-/** Copy n bytes of memory from src to dst. The 0* term provides compile-time type checking */
-#ifndef OVERRIDE_OPUS_COPY
-#define OPUS_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) ))
-#endif
-
-/** Copy n bytes of memory from src to dst, allowing overlapping regions. The 0* term
- provides compile-time type checking */
-#ifndef OVERRIDE_OPUS_MOVE
-#define OPUS_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) ))
-#endif
-
-/** Set n elements of dst to zero, starting at address s */
-#ifndef OVERRIDE_OPUS_CLEAR
-#define OPUS_CLEAR(dst, n) (memset((dst), 0, (n)*sizeof(*(dst))))
-#endif
-
-/*#ifdef __GNUC__
-#pragma GCC poison printf sprintf
-#pragma GCC poison malloc free realloc calloc
-#endif*/
-
-#endif /* OS_SUPPORT_H */
-
diff --git a/src/opus-1.1/celt/pitch.c b/src/opus-1.1/celt/pitch.c
deleted file mode 100644
index d2b30544..00000000
--- a/src/opus-1.1/celt/pitch.c
+++ /dev/null
@@ -1,537 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/**
- @file pitch.c
- @brief Pitch analysis
- */
-
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "pitch.h"
-#include "os_support.h"
-#include "modes.h"
-#include "stack_alloc.h"
-#include "mathops.h"
-#include "celt_lpc.h"
-
-static void find_best_pitch(opus_val32 *xcorr, opus_val16 *y, int len,
- int max_pitch, int *best_pitch
-#ifdef FIXED_POINT
- , int yshift, opus_val32 maxcorr
-#endif
- )
-{
- int i, j;
- opus_val32 Syy=1;
- opus_val16 best_num[2];
- opus_val32 best_den[2];
-#ifdef FIXED_POINT
- int xshift;
-
- xshift = celt_ilog2(maxcorr)-14;
-#endif
-
- best_num[0] = -1;
- best_num[1] = -1;
- best_den[0] = 0;
- best_den[1] = 0;
- best_pitch[0] = 0;
- best_pitch[1] = 1;
- for (j=0;j<len;j++)
- Syy = ADD32(Syy, SHR32(MULT16_16(y[j],y[j]), yshift));
- for (i=0;i<max_pitch;i++)
- {
- if (xcorr[i]>0)
- {
- opus_val16 num;
- opus_val32 xcorr16;
- xcorr16 = EXTRACT16(VSHR32(xcorr[i], xshift));
-#ifndef FIXED_POINT
- /* Considering the range of xcorr16, this should avoid both underflows
- and overflows (inf) when squaring xcorr16 */
- xcorr16 *= 1e-12f;
-#endif
- num = MULT16_16_Q15(xcorr16,xcorr16);
- if (MULT16_32_Q15(num,best_den[1]) > MULT16_32_Q15(best_num[1],Syy))
- {
- if (MULT16_32_Q15(num,best_den[0]) > MULT16_32_Q15(best_num[0],Syy))
- {
- best_num[1] = best_num[0];
- best_den[1] = best_den[0];
- best_pitch[1] = best_pitch[0];
- best_num[0] = num;
- best_den[0] = Syy;
- best_pitch[0] = i;
- } else {
- best_num[1] = num;
- best_den[1] = Syy;
- best_pitch[1] = i;
- }
- }
- }
- Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y[i]),yshift);
- Syy = MAX32(1, Syy);
- }
-}
-
-static void celt_fir5(const opus_val16 *x,
- const opus_val16 *num,
- opus_val16 *y,
- int N,
- opus_val16 *mem)
-{
- int i;
- opus_val16 num0, num1, num2, num3, num4;
- opus_val32 mem0, mem1, mem2, mem3, mem4;
- num0=num[0];
- num1=num[1];
- num2=num[2];
- num3=num[3];
- num4=num[4];
- mem0=mem[0];
- mem1=mem[1];
- mem2=mem[2];
- mem3=mem[3];
- mem4=mem[4];
- for (i=0;i<N;i++)
- {
- opus_val32 sum = SHL32(EXTEND32(x[i]), SIG_SHIFT);
- sum = MAC16_16(sum,num0,mem0);
- sum = MAC16_16(sum,num1,mem1);
- sum = MAC16_16(sum,num2,mem2);
- sum = MAC16_16(sum,num3,mem3);
- sum = MAC16_16(sum,num4,mem4);
- mem4 = mem3;
- mem3 = mem2;
- mem2 = mem1;
- mem1 = mem0;
- mem0 = x[i];
- y[i] = ROUND16(sum, SIG_SHIFT);
- }
- mem[0]=mem0;
- mem[1]=mem1;
- mem[2]=mem2;
- mem[3]=mem3;
- mem[4]=mem4;
-}
-
-
-void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x_lp,
- int len, int C, int arch)
-{
- int i;
- opus_val32 ac[5];
- opus_val16 tmp=Q15ONE;
- opus_val16 lpc[4], mem[5]={0,0,0,0,0};
- opus_val16 lpc2[5];
- opus_val16 c1 = QCONST16(.8f,15);
-#ifdef FIXED_POINT
- int shift;
- opus_val32 maxabs = celt_maxabs32(x[0], len);
- if (C==2)
- {
- opus_val32 maxabs_1 = celt_maxabs32(x[1], len);
- maxabs = MAX32(maxabs, maxabs_1);
- }
- if (maxabs<1)
- maxabs=1;
- shift = celt_ilog2(maxabs)-10;
- if (shift<0)
- shift=0;
- if (C==2)
- shift++;
-#endif
- for (i=1;i<len>>1;i++)
- x_lp[i] = SHR32(HALF32(HALF32(x[0][(2*i-1)]+x[0][(2*i+1)])+x[0][2*i]), shift);
- x_lp[0] = SHR32(HALF32(HALF32(x[0][1])+x[0][0]), shift);
- if (C==2)
- {
- for (i=1;i<len>>1;i++)
- x_lp[i] += SHR32(HALF32(HALF32(x[1][(2*i-1)]+x[1][(2*i+1)])+x[1][2*i]), shift);
- x_lp[0] += SHR32(HALF32(HALF32(x[1][1])+x[1][0]), shift);
- }
-
- _celt_autocorr(x_lp, ac, NULL, 0,
- 4, len>>1, arch);
-
- /* Noise floor -40 dB */
-#ifdef FIXED_POINT
- ac[0] += SHR32(ac[0],13);
-#else
- ac[0] *= 1.0001f;
-#endif
- /* Lag windowing */
- for (i=1;i<=4;i++)
- {
- /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
-#ifdef FIXED_POINT
- ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
-#else
- ac[i] -= ac[i]*(.008f*i)*(.008f*i);
-#endif
- }
-
- _celt_lpc(lpc, ac, 4);
- for (i=0;i<4;i++)
- {
- tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp);
- lpc[i] = MULT16_16_Q15(lpc[i], tmp);
- }
- /* Add a zero */
- lpc2[0] = lpc[0] + QCONST16(.8f,SIG_SHIFT);
- lpc2[1] = lpc[1] + MULT16_16_Q15(c1,lpc[0]);
- lpc2[2] = lpc[2] + MULT16_16_Q15(c1,lpc[1]);
- lpc2[3] = lpc[3] + MULT16_16_Q15(c1,lpc[2]);
- lpc2[4] = MULT16_16_Q15(c1,lpc[3]);
- celt_fir5(x_lp, lpc2, x_lp, len>>1, mem);
-}
-
-#if 0 /* This is a simple version of the pitch correlation that should work
- well on DSPs like Blackfin and TI C5x/C6x */
-
-#ifdef FIXED_POINT
-opus_val32
-#else
-void
-#endif
-celt_pitch_xcorr(opus_val16 *x, opus_val16 *y, opus_val32 *xcorr, int len, int max_pitch)
-{
- int i, j;
-#ifdef FIXED_POINT
- opus_val32 maxcorr=1;
-#endif
- for (i=0;i<max_pitch;i++)
- {
- opus_val32 sum = 0;
- for (j=0;j<len;j++)
- sum = MAC16_16(sum, x[j],y[i+j]);
- xcorr[i] = sum;
-#ifdef FIXED_POINT
- maxcorr = MAX32(maxcorr, sum);
-#endif
- }
-#ifdef FIXED_POINT
- return maxcorr;
-#endif
-}
-
-#else /* Unrolled version of the pitch correlation -- runs faster on x86 and ARM */
-
-#ifdef FIXED_POINT
-opus_val32
-#else
-void
-#endif
-celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y, opus_val32 *xcorr, int len, int max_pitch)
-{
- int i,j;
- /*The EDSP version requires that max_pitch is at least 1, and that _x is
- 32-bit aligned.
- Since it's hard to put asserts in assembly, put them here.*/
- celt_assert(max_pitch>0);
- celt_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0);
-#ifdef FIXED_POINT
- opus_val32 maxcorr=1;
-#endif
- for (i=0;i<max_pitch-3;i+=4)
- {
- opus_val32 sum[4]={0,0,0,0};
- xcorr_kernel(_x, _y+i, sum, len);
- xcorr[i]=sum[0];
- xcorr[i+1]=sum[1];
- xcorr[i+2]=sum[2];
- xcorr[i+3]=sum[3];
-#ifdef FIXED_POINT
- sum[0] = MAX32(sum[0], sum[1]);
- sum[2] = MAX32(sum[2], sum[3]);
- sum[0] = MAX32(sum[0], sum[2]);
- maxcorr = MAX32(maxcorr, sum[0]);
-#endif
- }
- /* In case max_pitch isn't a multiple of 4, do non-unrolled version. */
- for (;i<max_pitch;i++)
- {
- opus_val32 sum = 0;
- for (j=0;j<len;j++)
- sum = MAC16_16(sum, _x[j],_y[i+j]);
- xcorr[i] = sum;
-#ifdef FIXED_POINT
- maxcorr = MAX32(maxcorr, sum);
-#endif
- }
-#ifdef FIXED_POINT
- return maxcorr;
-#endif
-}
-
-#endif
-void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTRICT y,
- int len, int max_pitch, int *pitch, int arch)
-{
- int i, j;
- int lag;
- int best_pitch[2]={0,0};
- VARDECL(opus_val16, x_lp4);
- VARDECL(opus_val16, y_lp4);
- VARDECL(opus_val32, xcorr);
-#ifdef FIXED_POINT
- opus_val32 maxcorr;
- opus_val32 xmax, ymax;
- int shift=0;
-#endif
- int offset;
-
- SAVE_STACK;
-
- celt_assert(len>0);
- celt_assert(max_pitch>0);
- lag = len+max_pitch;
-
- ALLOC(x_lp4, len>>2, opus_val16);
- ALLOC(y_lp4, lag>>2, opus_val16);
- ALLOC(xcorr, max_pitch>>1, opus_val32);
-
- /* Downsample by 2 again */
- for (j=0;j<len>>2;j++)
- x_lp4[j] = x_lp[2*j];
- for (j=0;j<lag>>2;j++)
- y_lp4[j] = y[2*j];
-
-#ifdef FIXED_POINT
- xmax = celt_maxabs16(x_lp4, len>>2);
- ymax = celt_maxabs16(y_lp4, lag>>2);
- shift = celt_ilog2(MAX32(1, MAX32(xmax, ymax)))-11;
- if (shift>0)
- {
- for (j=0;j<len>>2;j++)
- x_lp4[j] = SHR16(x_lp4[j], shift);
- for (j=0;j<lag>>2;j++)
- y_lp4[j] = SHR16(y_lp4[j], shift);
- /* Use double the shift for a MAC */
- shift *= 2;
- } else {
- shift = 0;
- }
-#endif
-
- /* Coarse search with 4x decimation */
-
-#ifdef FIXED_POINT
- maxcorr =
-#endif
- celt_pitch_xcorr(x_lp4, y_lp4, xcorr, len>>2, max_pitch>>2, arch);
-
- find_best_pitch(xcorr, y_lp4, len>>2, max_pitch>>2, best_pitch
-#ifdef FIXED_POINT
- , 0, maxcorr
-#endif
- );
-
- /* Finer search with 2x decimation */
-#ifdef FIXED_POINT
- maxcorr=1;
-#endif
- for (i=0;i<max_pitch>>1;i++)
- {
- opus_val32 sum=0;
- xcorr[i] = 0;
- if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2)
- continue;
- for (j=0;j<len>>1;j++)
- sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift);
- xcorr[i] = MAX32(-1, sum);
-#ifdef FIXED_POINT
- maxcorr = MAX32(maxcorr, sum);
-#endif
- }
- find_best_pitch(xcorr, y, len>>1, max_pitch>>1, best_pitch
-#ifdef FIXED_POINT
- , shift+1, maxcorr
-#endif
- );
-
- /* Refine by pseudo-interpolation */
- if (best_pitch[0]>0 && best_pitch[0]<(max_pitch>>1)-1)
- {
- opus_val32 a, b, c;
- a = xcorr[best_pitch[0]-1];
- b = xcorr[best_pitch[0]];
- c = xcorr[best_pitch[0]+1];
- if ((c-a) > MULT16_32_Q15(QCONST16(.7f,15),b-a))
- offset = 1;
- else if ((a-c) > MULT16_32_Q15(QCONST16(.7f,15),b-c))
- offset = -1;
- else
- offset = 0;
- } else {
- offset = 0;
- }
- *pitch = 2*best_pitch[0]-offset;
-
- RESTORE_STACK;
-}
-
-static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3, 2};
-opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod,
- int N, int *T0_, int prev_period, opus_val16 prev_gain)
-{
- int k, i, T, T0;
- opus_val16 g, g0;
- opus_val16 pg;
- opus_val32 xy,xx,yy,xy2;
- opus_val32 xcorr[3];
- opus_val32 best_xy, best_yy;
- int offset;
- int minperiod0;
- VARDECL(opus_val32, yy_lookup);
- SAVE_STACK;
-
- minperiod0 = minperiod;
- maxperiod /= 2;
- minperiod /= 2;
- *T0_ /= 2;
- prev_period /= 2;
- N /= 2;
- x += maxperiod;
- if (*T0_>=maxperiod)
- *T0_=maxperiod-1;
-
- T = T0 = *T0_;
- ALLOC(yy_lookup, maxperiod+1, opus_val32);
- dual_inner_prod(x, x, x-T0, N, &xx, &xy);
- yy_lookup[0] = xx;
- yy=xx;
- for (i=1;i<=maxperiod;i++)
- {
- yy = yy+MULT16_16(x[-i],x[-i])-MULT16_16(x[N-i],x[N-i]);
- yy_lookup[i] = MAX32(0, yy);
- }
- yy = yy_lookup[T0];
- best_xy = xy;
- best_yy = yy;
-#ifdef FIXED_POINT
- {
- opus_val32 x2y2;
- int sh, t;
- x2y2 = 1+HALF32(MULT32_32_Q31(xx,yy));
- sh = celt_ilog2(x2y2)>>1;
- t = VSHR32(x2y2, 2*(sh-7));
- g = g0 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1);
- }
-#else
- g = g0 = xy/celt_sqrt(1+xx*yy);
-#endif
- /* Look for any pitch at T/k */
- for (k=2;k<=15;k++)
- {
- int T1, T1b;
- opus_val16 g1;
- opus_val16 cont=0;
- opus_val16 thresh;
- T1 = (2*T0+k)/(2*k);
- if (T1 < minperiod)
- break;
- /* Look for another strong correlation at T1b */
- if (k==2)
- {
- if (T1+T0>maxperiod)
- T1b = T0;
- else
- T1b = T0+T1;
- } else
- {
- T1b = (2*second_check[k]*T0+k)/(2*k);
- }
- dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2);
- xy += xy2;
- yy = yy_lookup[T1] + yy_lookup[T1b];
-#ifdef FIXED_POINT
- {
- opus_val32 x2y2;
- int sh, t;
- x2y2 = 1+MULT32_32_Q31(xx,yy);
- sh = celt_ilog2(x2y2)>>1;
- t = VSHR32(x2y2, 2*(sh-7));
- g1 = VSHR32(MULT16_32_Q15(celt_rsqrt_norm(t), xy),sh+1);
- }
-#else
- g1 = xy/celt_sqrt(1+2.f*xx*1.f*yy);
-#endif
- if (abs(T1-prev_period)<=1)
- cont = prev_gain;
- else if (abs(T1-prev_period)<=2 && 5*k*k < T0)
- cont = HALF32(prev_gain);
- else
- cont = 0;
- thresh = MAX16(QCONST16(.3f,15), MULT16_16_Q15(QCONST16(.7f,15),g0)-cont);
- /* Bias against very high pitch (very short period) to avoid false-positives
- due to short-term correlation */
- if (T1<3*minperiod)
- thresh = MAX16(QCONST16(.4f,15), MULT16_16_Q15(QCONST16(.85f,15),g0)-cont);
- else if (T1<2*minperiod)
- thresh = MAX16(QCONST16(.5f,15), MULT16_16_Q15(QCONST16(.9f,15),g0)-cont);
- if (g1 > thresh)
- {
- best_xy = xy;
- best_yy = yy;
- T = T1;
- g = g1;
- }
- }
- best_xy = MAX32(0, best_xy);
- if (best_yy <= best_xy)
- pg = Q15ONE;
- else
- pg = SHR32(frac_div32(best_xy,best_yy+1),16);
-
- for (k=0;k<3;k++)
- {
- int T1 = T+k-1;
- xy = 0;
- for (i=0;i<N;i++)
- xy = MAC16_16(xy, x[i], x[i-T1]);
- xcorr[k] = xy;
- }
- if ((xcorr[2]-xcorr[0]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[0]))
- offset = 1;
- else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[2]))
- offset = -1;
- else
- offset = 0;
- if (pg > g)
- pg = g;
- *T0_ = 2*T+offset;
-
- if (*T0_<minperiod0)
- *T0_=minperiod0;
- RESTORE_STACK;
- return pg;
-}
diff --git a/src/opus-1.1/celt/pitch.h b/src/opus-1.1/celt/pitch.h
deleted file mode 100644
index df317ecc..00000000
--- a/src/opus-1.1/celt/pitch.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/**
- @file pitch.h
- @brief Pitch analysis
- */
-
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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 PITCH_H
-#define PITCH_H
-
-#include "modes.h"
-#include "cpu_support.h"
-
-#if defined(__SSE__) && !defined(FIXED_POINT)
-#include "x86/pitch_sse.h"
-#endif
-
-#if defined(OPUS_ARM_ASM) && defined(FIXED_POINT)
-# include "arm/pitch_arm.h"
-#endif
-
-void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x_lp,
- int len, int C, int arch);
-
-void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTRICT y,
- int len, int max_pitch, int *pitch, int arch);
-
-opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod,
- int N, int *T0, int prev_period, opus_val16 prev_gain);
-
-/* OPT: This is the kernel you really want to optimize. It gets used a lot
- by the prefilter and by the PLC. */
-#ifndef OVERRIDE_XCORR_KERNEL
-static OPUS_INLINE void xcorr_kernel(const opus_val16 * x, const opus_val16 * y, opus_val32 sum[4], int len)
-{
- int j;
- opus_val16 y_0, y_1, y_2, y_3;
- celt_assert(len>=3);
- y_3=0; /* gcc doesn't realize that y_3 can't be used uninitialized */
- y_0=*y++;
- y_1=*y++;
- y_2=*y++;
- for (j=0;j<len-3;j+=4)
- {
- opus_val16 tmp;
- tmp = *x++;
- y_3=*y++;
- sum[0] = MAC16_16(sum[0],tmp,y_0);
- sum[1] = MAC16_16(sum[1],tmp,y_1);
- sum[2] = MAC16_16(sum[2],tmp,y_2);
- sum[3] = MAC16_16(sum[3],tmp,y_3);
- tmp=*x++;
- y_0=*y++;
- sum[0] = MAC16_16(sum[0],tmp,y_1);
- sum[1] = MAC16_16(sum[1],tmp,y_2);
- sum[2] = MAC16_16(sum[2],tmp,y_3);
- sum[3] = MAC16_16(sum[3],tmp,y_0);
- tmp=*x++;
- y_1=*y++;
- sum[0] = MAC16_16(sum[0],tmp,y_2);
- sum[1] = MAC16_16(sum[1],tmp,y_3);
- sum[2] = MAC16_16(sum[2],tmp,y_0);
- sum[3] = MAC16_16(sum[3],tmp,y_1);
- tmp=*x++;
- y_2=*y++;
- sum[0] = MAC16_16(sum[0],tmp,y_3);
- sum[1] = MAC16_16(sum[1],tmp,y_0);
- sum[2] = MAC16_16(sum[2],tmp,y_1);
- sum[3] = MAC16_16(sum[3],tmp,y_2);
- }
- if (j++<len)
- {
- opus_val16 tmp = *x++;
- y_3=*y++;
- sum[0] = MAC16_16(sum[0],tmp,y_0);
- sum[1] = MAC16_16(sum[1],tmp,y_1);
- sum[2] = MAC16_16(sum[2],tmp,y_2);
- sum[3] = MAC16_16(sum[3],tmp,y_3);
- }
- if (j++<len)
- {
- opus_val16 tmp=*x++;
- y_0=*y++;
- sum[0] = MAC16_16(sum[0],tmp,y_1);
- sum[1] = MAC16_16(sum[1],tmp,y_2);
- sum[2] = MAC16_16(sum[2],tmp,y_3);
- sum[3] = MAC16_16(sum[3],tmp,y_0);
- }
- if (j<len)
- {
- opus_val16 tmp=*x++;
- y_1=*y++;
- sum[0] = MAC16_16(sum[0],tmp,y_2);
- sum[1] = MAC16_16(sum[1],tmp,y_3);
- sum[2] = MAC16_16(sum[2],tmp,y_0);
- sum[3] = MAC16_16(sum[3],tmp,y_1);
- }
-}
-#endif /* OVERRIDE_XCORR_KERNEL */
-
-#ifndef OVERRIDE_DUAL_INNER_PROD
-static OPUS_INLINE void dual_inner_prod(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02,
- int N, opus_val32 *xy1, opus_val32 *xy2)
-{
- int i;
- opus_val32 xy01=0;
- opus_val32 xy02=0;
- for (i=0;i<N;i++)
- {
- xy01 = MAC16_16(xy01, x[i], y01[i]);
- xy02 = MAC16_16(xy02, x[i], y02[i]);
- }
- *xy1 = xy01;
- *xy2 = xy02;
-}
-#endif
-
-#ifdef FIXED_POINT
-opus_val32
-#else
-void
-#endif
-celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y,
- opus_val32 *xcorr, int len, int max_pitch);
-
-#if !defined(OVERRIDE_PITCH_XCORR)
-/*Is run-time CPU detection enabled on this platform?*/
-# if defined(OPUS_HAVE_RTCD)
-extern
-# if defined(FIXED_POINT)
-opus_val32
-# else
-void
-# endif
-(*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
- const opus_val16 *, opus_val32 *, int, int);
-
-# define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \
- ((*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK])(_x, _y, \
- xcorr, len, max_pitch))
-# else
-# define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \
- ((void)(arch),celt_pitch_xcorr_c(_x, _y, xcorr, len, max_pitch))
-# endif
-#endif
-
-#endif
diff --git a/src/opus-1.1/celt/quant_bands.c b/src/opus-1.1/celt/quant_bands.c
deleted file mode 100644
index ac6952c2..00000000
--- a/src/opus-1.1/celt/quant_bands.c
+++ /dev/null
@@ -1,556 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "quant_bands.h"
-#include "laplace.h"
-#include <math.h>
-#include "os_support.h"
-#include "arch.h"
-#include "mathops.h"
-#include "stack_alloc.h"
-#include "rate.h"
-
-#ifdef FIXED_POINT
-/* Mean energy in each band quantized in Q4 */
-const signed char eMeans[25] = {
- 103,100, 92, 85, 81,
- 77, 72, 70, 78, 75,
- 73, 71, 78, 74, 69,
- 72, 70, 74, 76, 71,
- 60, 60, 60, 60, 60
-};
-#else
-/* Mean energy in each band quantized in Q4 and converted back to float */
-const opus_val16 eMeans[25] = {
- 6.437500f, 6.250000f, 5.750000f, 5.312500f, 5.062500f,
- 4.812500f, 4.500000f, 4.375000f, 4.875000f, 4.687500f,
- 4.562500f, 4.437500f, 4.875000f, 4.625000f, 4.312500f,
- 4.500000f, 4.375000f, 4.625000f, 4.750000f, 4.437500f,
- 3.750000f, 3.750000f, 3.750000f, 3.750000f, 3.750000f
-};
-#endif
-/* prediction coefficients: 0.9, 0.8, 0.65, 0.5 */
-#ifdef FIXED_POINT
-static const opus_val16 pred_coef[4] = {29440, 26112, 21248, 16384};
-static const opus_val16 beta_coef[4] = {30147, 22282, 12124, 6554};
-static const opus_val16 beta_intra = 4915;
-#else
-static const opus_val16 pred_coef[4] = {29440/32768., 26112/32768., 21248/32768., 16384/32768.};
-static const opus_val16 beta_coef[4] = {30147/32768., 22282/32768., 12124/32768., 6554/32768.};
-static const opus_val16 beta_intra = 4915/32768.;
-#endif
-
-/*Parameters of the Laplace-like probability models used for the coarse energy.
- There is one pair of parameters for each frame size, prediction type
- (inter/intra), and band number.
- The first number of each pair is the probability of 0, and the second is the
- decay rate, both in Q8 precision.*/
-static const unsigned char e_prob_model[4][2][42] = {
- /*120 sample frames.*/
- {
- /*Inter*/
- {
- 72, 127, 65, 129, 66, 128, 65, 128, 64, 128, 62, 128, 64, 128,
- 64, 128, 92, 78, 92, 79, 92, 78, 90, 79, 116, 41, 115, 40,
- 114, 40, 132, 26, 132, 26, 145, 17, 161, 12, 176, 10, 177, 11
- },
- /*Intra*/
- {
- 24, 179, 48, 138, 54, 135, 54, 132, 53, 134, 56, 133, 55, 132,
- 55, 132, 61, 114, 70, 96, 74, 88, 75, 88, 87, 74, 89, 66,
- 91, 67, 100, 59, 108, 50, 120, 40, 122, 37, 97, 43, 78, 50
- }
- },
- /*240 sample frames.*/
- {
- /*Inter*/
- {
- 83, 78, 84, 81, 88, 75, 86, 74, 87, 71, 90, 73, 93, 74,
- 93, 74, 109, 40, 114, 36, 117, 34, 117, 34, 143, 17, 145, 18,
- 146, 19, 162, 12, 165, 10, 178, 7, 189, 6, 190, 8, 177, 9
- },
- /*Intra*/
- {
- 23, 178, 54, 115, 63, 102, 66, 98, 69, 99, 74, 89, 71, 91,
- 73, 91, 78, 89, 86, 80, 92, 66, 93, 64, 102, 59, 103, 60,
- 104, 60, 117, 52, 123, 44, 138, 35, 133, 31, 97, 38, 77, 45
- }
- },
- /*480 sample frames.*/
- {
- /*Inter*/
- {
- 61, 90, 93, 60, 105, 42, 107, 41, 110, 45, 116, 38, 113, 38,
- 112, 38, 124, 26, 132, 27, 136, 19, 140, 20, 155, 14, 159, 16,
- 158, 18, 170, 13, 177, 10, 187, 8, 192, 6, 175, 9, 159, 10
- },
- /*Intra*/
- {
- 21, 178, 59, 110, 71, 86, 75, 85, 84, 83, 91, 66, 88, 73,
- 87, 72, 92, 75, 98, 72, 105, 58, 107, 54, 115, 52, 114, 55,
- 112, 56, 129, 51, 132, 40, 150, 33, 140, 29, 98, 35, 77, 42
- }
- },
- /*960 sample frames.*/
- {
- /*Inter*/
- {
- 42, 121, 96, 66, 108, 43, 111, 40, 117, 44, 123, 32, 120, 36,
- 119, 33, 127, 33, 134, 34, 139, 21, 147, 23, 152, 20, 158, 25,
- 154, 26, 166, 21, 173, 16, 184, 13, 184, 10, 150, 13, 139, 15
- },
- /*Intra*/
- {
- 22, 178, 63, 114, 74, 82, 84, 83, 92, 82, 103, 62, 96, 72,
- 96, 67, 101, 73, 107, 72, 113, 55, 118, 52, 125, 52, 118, 52,
- 117, 55, 135, 49, 137, 39, 157, 32, 145, 29, 97, 33, 77, 40
- }
- }
-};
-
-static const unsigned char small_energy_icdf[3]={2,1,0};
-
-static opus_val32 loss_distortion(const opus_val16 *eBands, opus_val16 *oldEBands, int start, int end, int len, int C)
-{
- int c, i;
- opus_val32 dist = 0;
- c=0; do {
- for (i=start;i<end;i++)
- {
- opus_val16 d = SUB16(SHR16(eBands[i+c*len], 3), SHR16(oldEBands[i+c*len], 3));
- dist = MAC16_16(dist, d,d);
- }
- } while (++c<C);
- return MIN32(200,SHR32(dist,2*DB_SHIFT-6));
-}
-
-static int quant_coarse_energy_impl(const CELTMode *m, int start, int end,
- const opus_val16 *eBands, opus_val16 *oldEBands,
- opus_int32 budget, opus_int32 tell,
- const unsigned char *prob_model, opus_val16 *error, ec_enc *enc,
- int C, int LM, int intra, opus_val16 max_decay, int lfe)
-{
- int i, c;
- int badness = 0;
- opus_val32 prev[2] = {0,0};
- opus_val16 coef;
- opus_val16 beta;
-
- if (tell+3 <= budget)
- ec_enc_bit_logp(enc, intra, 3);
- if (intra)
- {
- coef = 0;
- beta = beta_intra;
- } else {
- beta = beta_coef[LM];
- coef = pred_coef[LM];
- }
-
- /* Encode at a fixed coarse resolution */
- for (i=start;i<end;i++)
- {
- c=0;
- do {
- int bits_left;
- int qi, qi0;
- opus_val32 q;
- opus_val16 x;
- opus_val32 f, tmp;
- opus_val16 oldE;
- opus_val16 decay_bound;
- x = eBands[i+c*m->nbEBands];
- oldE = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]);
-#ifdef FIXED_POINT
- f = SHL32(EXTEND32(x),7) - PSHR32(MULT16_16(coef,oldE), 8) - prev[c];
- /* Rounding to nearest integer here is really important! */
- qi = (f+QCONST32(.5f,DB_SHIFT+7))>>(DB_SHIFT+7);
- decay_bound = EXTRACT16(MAX32(-QCONST16(28.f,DB_SHIFT),
- SUB32((opus_val32)oldEBands[i+c*m->nbEBands],max_decay)));
-#else
- f = x-coef*oldE-prev[c];
- /* Rounding to nearest integer here is really important! */
- qi = (int)floor(.5f+f);
- decay_bound = MAX16(-QCONST16(28.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]) - max_decay;
-#endif
- /* Prevent the energy from going down too quickly (e.g. for bands
- that have just one bin) */
- if (qi < 0 && x < decay_bound)
- {
- qi += (int)SHR16(SUB16(decay_bound,x), DB_SHIFT);
- if (qi > 0)
- qi = 0;
- }
- qi0 = qi;
- /* If we don't have enough bits to encode all the energy, just assume
- something safe. */
- tell = ec_tell(enc);
- bits_left = budget-tell-3*C*(end-i);
- if (i!=start && bits_left < 30)
- {
- if (bits_left < 24)
- qi = IMIN(1, qi);
- if (bits_left < 16)
- qi = IMAX(-1, qi);
- }
- if (lfe && i>=2)
- qi = IMIN(qi, 0);
- if (budget-tell >= 15)
- {
- int pi;
- pi = 2*IMIN(i,20);
- ec_laplace_encode(enc, &qi,
- prob_model[pi]<<7, prob_model[pi+1]<<6);
- }
- else if(budget-tell >= 2)
- {
- qi = IMAX(-1, IMIN(qi, 1));
- ec_enc_icdf(enc, 2*qi^-(qi<0), small_energy_icdf, 2);
- }
- else if(budget-tell >= 1)
- {
- qi = IMIN(0, qi);
- ec_enc_bit_logp(enc, -qi, 1);
- }
- else
- qi = -1;
- error[i+c*m->nbEBands] = PSHR32(f,7) - SHL16(qi,DB_SHIFT);
- badness += abs(qi0-qi);
- q = (opus_val32)SHL32(EXTEND32(qi),DB_SHIFT);
-
- tmp = PSHR32(MULT16_16(coef,oldE),8) + prev[c] + SHL32(q,7);
-#ifdef FIXED_POINT
- tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp);
-#endif
- oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7);
- prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8));
- } while (++c < C);
- }
- return lfe ? 0 : badness;
-}
-
-void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd,
- const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget,
- opus_val16 *error, ec_enc *enc, int C, int LM, int nbAvailableBytes,
- int force_intra, opus_val32 *delayedIntra, int two_pass, int loss_rate, int lfe)
-{
- int intra;
- opus_val16 max_decay;
- VARDECL(opus_val16, oldEBands_intra);
- VARDECL(opus_val16, error_intra);
- ec_enc enc_start_state;
- opus_uint32 tell;
- int badness1=0;
- opus_int32 intra_bias;
- opus_val32 new_distortion;
- SAVE_STACK;
-
- intra = force_intra || (!two_pass && *delayedIntra>2*C*(end-start) && nbAvailableBytes > (end-start)*C);
- intra_bias = (opus_int32)((budget**delayedIntra*loss_rate)/(C*512));
- new_distortion = loss_distortion(eBands, oldEBands, start, effEnd, m->nbEBands, C);
-
- tell = ec_tell(enc);
- if (tell+3 > budget)
- two_pass = intra = 0;
-
- max_decay = QCONST16(16.f,DB_SHIFT);
- if (end-start>10)
- {
-#ifdef FIXED_POINT
- max_decay = MIN32(max_decay, SHL32(EXTEND32(nbAvailableBytes),DB_SHIFT-3));
-#else
- max_decay = MIN32(max_decay, .125f*nbAvailableBytes);
-#endif
- }
- if (lfe)
- max_decay=3;
- enc_start_state = *enc;
-
- ALLOC(oldEBands_intra, C*m->nbEBands, opus_val16);
- ALLOC(error_intra, C*m->nbEBands, opus_val16);
- OPUS_COPY(oldEBands_intra, oldEBands, C*m->nbEBands);
-
- if (two_pass || intra)
- {
- badness1 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands_intra, budget,
- tell, e_prob_model[LM][1], error_intra, enc, C, LM, 1, max_decay, lfe);
- }
-
- if (!intra)
- {
- unsigned char *intra_buf;
- ec_enc enc_intra_state;
- opus_int32 tell_intra;
- opus_uint32 nstart_bytes;
- opus_uint32 nintra_bytes;
- opus_uint32 save_bytes;
- int badness2;
- VARDECL(unsigned char, intra_bits);
-
- tell_intra = ec_tell_frac(enc);
-
- enc_intra_state = *enc;
-
- nstart_bytes = ec_range_bytes(&enc_start_state);
- nintra_bytes = ec_range_bytes(&enc_intra_state);
- intra_buf = ec_get_buffer(&enc_intra_state) + nstart_bytes;
- save_bytes = nintra_bytes-nstart_bytes;
- if (save_bytes == 0)
- save_bytes = ALLOC_NONE;
- ALLOC(intra_bits, save_bytes, unsigned char);
- /* Copy bits from intra bit-stream */
- OPUS_COPY(intra_bits, intra_buf, nintra_bytes - nstart_bytes);
-
- *enc = enc_start_state;
-
- badness2 = quant_coarse_energy_impl(m, start, end, eBands, oldEBands, budget,
- tell, e_prob_model[LM][intra], error, enc, C, LM, 0, max_decay, lfe);
-
- if (two_pass && (badness1 < badness2 || (badness1 == badness2 && ((opus_int32)ec_tell_frac(enc))+intra_bias > tell_intra)))
- {
- *enc = enc_intra_state;
- /* Copy intra bits to bit-stream */
- OPUS_COPY(intra_buf, intra_bits, nintra_bytes - nstart_bytes);
- OPUS_COPY(oldEBands, oldEBands_intra, C*m->nbEBands);
- OPUS_COPY(error, error_intra, C*m->nbEBands);
- intra = 1;
- }
- } else {
- OPUS_COPY(oldEBands, oldEBands_intra, C*m->nbEBands);
- OPUS_COPY(error, error_intra, C*m->nbEBands);
- }
-
- if (intra)
- *delayedIntra = new_distortion;
- else
- *delayedIntra = ADD32(MULT16_32_Q15(MULT16_16_Q15(pred_coef[LM], pred_coef[LM]),*delayedIntra),
- new_distortion);
-
- RESTORE_STACK;
-}
-
-void quant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, ec_enc *enc, int C)
-{
- int i, c;
-
- /* Encode finer resolution */
- for (i=start;i<end;i++)
- {
- opus_int16 frac = 1<<fine_quant[i];
- if (fine_quant[i] <= 0)
- continue;
- c=0;
- do {
- int q2;
- opus_val16 offset;
-#ifdef FIXED_POINT
- /* Has to be without rounding */
- q2 = (error[i+c*m->nbEBands]+QCONST16(.5f,DB_SHIFT))>>(DB_SHIFT-fine_quant[i]);
-#else
- q2 = (int)floor((error[i+c*m->nbEBands]+.5f)*frac);
-#endif
- if (q2 > frac-1)
- q2 = frac-1;
- if (q2<0)
- q2 = 0;
- ec_enc_bits(enc, q2, fine_quant[i]);
-#ifdef FIXED_POINT
- offset = SUB16(SHR32(SHL32(EXTEND32(q2),DB_SHIFT)+QCONST16(.5f,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT));
-#else
- offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f;
-#endif
- oldEBands[i+c*m->nbEBands] += offset;
- error[i+c*m->nbEBands] -= offset;
- /*printf ("%f ", error[i] - offset);*/
- } while (++c < C);
- }
-}
-
-void quant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int C)
-{
- int i, prio, c;
-
- /* Use up the remaining bits */
- for (prio=0;prio<2;prio++)
- {
- for (i=start;i<end && bits_left>=C ;i++)
- {
- if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio)
- continue;
- c=0;
- do {
- int q2;
- opus_val16 offset;
- q2 = error[i+c*m->nbEBands]<0 ? 0 : 1;
- ec_enc_bits(enc, q2, 1);
-#ifdef FIXED_POINT
- offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1);
-#else
- offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384);
-#endif
- oldEBands[i+c*m->nbEBands] += offset;
- bits_left--;
- } while (++c < C);
- }
- }
-}
-
-void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int intra, ec_dec *dec, int C, int LM)
-{
- const unsigned char *prob_model = e_prob_model[LM][intra];
- int i, c;
- opus_val32 prev[2] = {0, 0};
- opus_val16 coef;
- opus_val16 beta;
- opus_int32 budget;
- opus_int32 tell;
-
- if (intra)
- {
- coef = 0;
- beta = beta_intra;
- } else {
- beta = beta_coef[LM];
- coef = pred_coef[LM];
- }
-
- budget = dec->storage*8;
-
- /* Decode at a fixed coarse resolution */
- for (i=start;i<end;i++)
- {
- c=0;
- do {
- int qi;
- opus_val32 q;
- opus_val32 tmp;
- /* It would be better to express this invariant as a
- test on C at function entry, but that isn't enough
- to make the static analyzer happy. */
- celt_assert(c<2);
- tell = ec_tell(dec);
- if(budget-tell>=15)
- {
- int pi;
- pi = 2*IMIN(i,20);
- qi = ec_laplace_decode(dec,
- prob_model[pi]<<7, prob_model[pi+1]<<6);
- }
- else if(budget-tell>=2)
- {
- qi = ec_dec_icdf(dec, small_energy_icdf, 2);
- qi = (qi>>1)^-(qi&1);
- }
- else if(budget-tell>=1)
- {
- qi = -ec_dec_bit_logp(dec, 1);
- }
- else
- qi = -1;
- q = (opus_val32)SHL32(EXTEND32(qi),DB_SHIFT);
-
- oldEBands[i+c*m->nbEBands] = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]);
- tmp = PSHR32(MULT16_16(coef,oldEBands[i+c*m->nbEBands]),8) + prev[c] + SHL32(q,7);
-#ifdef FIXED_POINT
- tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp);
-#endif
- oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7);
- prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8));
- } while (++c < C);
- }
-}
-
-void unquant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, ec_dec *dec, int C)
-{
- int i, c;
- /* Decode finer resolution */
- for (i=start;i<end;i++)
- {
- if (fine_quant[i] <= 0)
- continue;
- c=0;
- do {
- int q2;
- opus_val16 offset;
- q2 = ec_dec_bits(dec, fine_quant[i]);
-#ifdef FIXED_POINT
- offset = SUB16(SHR32(SHL32(EXTEND32(q2),DB_SHIFT)+QCONST16(.5f,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT));
-#else
- offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f;
-#endif
- oldEBands[i+c*m->nbEBands] += offset;
- } while (++c < C);
- }
-}
-
-void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, int *fine_priority, int bits_left, ec_dec *dec, int C)
-{
- int i, prio, c;
-
- /* Use up the remaining bits */
- for (prio=0;prio<2;prio++)
- {
- for (i=start;i<end && bits_left>=C ;i++)
- {
- if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio)
- continue;
- c=0;
- do {
- int q2;
- opus_val16 offset;
- q2 = ec_dec_bits(dec, 1);
-#ifdef FIXED_POINT
- offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1);
-#else
- offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384);
-#endif
- oldEBands[i+c*m->nbEBands] += offset;
- bits_left--;
- } while (++c < C);
- }
- }
-}
-
-void amp2Log2(const CELTMode *m, int effEnd, int end,
- celt_ener *bandE, opus_val16 *bandLogE, int C)
-{
- int c, i;
- c=0;
- do {
- for (i=0;i<effEnd;i++)
- bandLogE[i+c*m->nbEBands] =
- celt_log2(SHL32(bandE[i+c*m->nbEBands],2))
- - SHL16((opus_val16)eMeans[i],6);
- for (i=effEnd;i<end;i++)
- bandLogE[c*m->nbEBands+i] = -QCONST16(14.f,DB_SHIFT);
- } while (++c < C);
-}
diff --git a/src/opus-1.1/celt/quant_bands.h b/src/opus-1.1/celt/quant_bands.h
deleted file mode 100644
index 0490bca4..00000000
--- a/src/opus-1.1/celt/quant_bands.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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 QUANT_BANDS
-#define QUANT_BANDS
-
-#include "arch.h"
-#include "modes.h"
-#include "entenc.h"
-#include "entdec.h"
-#include "mathops.h"
-
-#ifdef FIXED_POINT
-extern const signed char eMeans[25];
-#else
-extern const opus_val16 eMeans[25];
-#endif
-
-void amp2Log2(const CELTMode *m, int effEnd, int end,
- celt_ener *bandE, opus_val16 *bandLogE, int C);
-
-void log2Amp(const CELTMode *m, int start, int end,
- celt_ener *eBands, const opus_val16 *oldEBands, int C);
-
-void quant_coarse_energy(const CELTMode *m, int start, int end, int effEnd,
- const opus_val16 *eBands, opus_val16 *oldEBands, opus_uint32 budget,
- opus_val16 *error, ec_enc *enc, int C, int LM,
- int nbAvailableBytes, int force_intra, opus_val32 *delayedIntra,
- int two_pass, int loss_rate, int lfe);
-
-void quant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, ec_enc *enc, int C);
-
-void quant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int C);
-
-void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int intra, ec_dec *dec, int C, int LM);
-
-void unquant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, ec_dec *dec, int C);
-
-void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, int *fine_priority, int bits_left, ec_dec *dec, int C);
-
-#endif /* QUANT_BANDS */
diff --git a/src/opus-1.1/celt/rate.c b/src/opus-1.1/celt/rate.c
deleted file mode 100644
index e13d839d..00000000
--- a/src/opus-1.1/celt/rate.c
+++ /dev/null
@@ -1,638 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <math.h>
-#include "modes.h"
-#include "cwrs.h"
-#include "arch.h"
-#include "os_support.h"
-
-#include "entcode.h"
-#include "rate.h"
-
-static const unsigned char LOG2_FRAC_TABLE[24]={
- 0,
- 8,13,
- 16,19,21,23,
- 24,26,27,28,29,30,31,32,
- 32,33,34,34,35,36,36,37,37
-};
-
-#ifdef CUSTOM_MODES
-
-/*Determines if V(N,K) fits in a 32-bit unsigned integer.
- N and K are themselves limited to 15 bits.*/
-static int fits_in32(int _n, int _k)
-{
- static const opus_int16 maxN[15] = {
- 32767, 32767, 32767, 1476, 283, 109, 60, 40,
- 29, 24, 20, 18, 16, 14, 13};
- static const opus_int16 maxK[15] = {
- 32767, 32767, 32767, 32767, 1172, 238, 95, 53,
- 36, 27, 22, 18, 16, 15, 13};
- if (_n>=14)
- {
- if (_k>=14)
- return 0;
- else
- return _n <= maxN[_k];
- } else {
- return _k <= maxK[_n];
- }
-}
-
-void compute_pulse_cache(CELTMode *m, int LM)
-{
- int C;
- int i;
- int j;
- int curr=0;
- int nbEntries=0;
- int entryN[100], entryK[100], entryI[100];
- const opus_int16 *eBands = m->eBands;
- PulseCache *cache = &m->cache;
- opus_int16 *cindex;
- unsigned char *bits;
- unsigned char *cap;
-
- cindex = (opus_int16 *)opus_alloc(sizeof(cache->index[0])*m->nbEBands*(LM+2));
- cache->index = cindex;
-
- /* Scan for all unique band sizes */
- for (i=0;i<=LM+1;i++)
- {
- for (j=0;j<m->nbEBands;j++)
- {
- int k;
- int N = (eBands[j+1]-eBands[j])<<i>>1;
- cindex[i*m->nbEBands+j] = -1;
- /* Find other bands that have the same size */
- for (k=0;k<=i;k++)
- {
- int n;
- for (n=0;n<m->nbEBands && (k!=i || n<j);n++)
- {
- if (N == (eBands[n+1]-eBands[n])<<k>>1)
- {
- cindex[i*m->nbEBands+j] = cindex[k*m->nbEBands+n];
- break;
- }
- }
- }
- if (cache->index[i*m->nbEBands+j] == -1 && N!=0)
- {
- int K;
- entryN[nbEntries] = N;
- K = 0;
- while (fits_in32(N,get_pulses(K+1)) && K<MAX_PSEUDO)
- K++;
- entryK[nbEntries] = K;
- cindex[i*m->nbEBands+j] = curr;
- entryI[nbEntries] = curr;
-
- curr += K+1;
- nbEntries++;
- }
- }
- }
- bits = (unsigned char *)opus_alloc(sizeof(unsigned char)*curr);
- cache->bits = bits;
- cache->size = curr;
- /* Compute the cache for all unique sizes */
- for (i=0;i<nbEntries;i++)
- {
- unsigned char *ptr = bits+entryI[i];
- opus_int16 tmp[MAX_PULSES+1];
- get_required_bits(tmp, entryN[i], get_pulses(entryK[i]), BITRES);
- for (j=1;j<=entryK[i];j++)
- ptr[j] = tmp[get_pulses(j)]-1;
- ptr[0] = entryK[i];
- }
-
- /* Compute the maximum rate for each band at which we'll reliably use as
- many bits as we ask for. */
- cache->caps = cap = (unsigned char *)opus_alloc(sizeof(cache->caps[0])*(LM+1)*2*m->nbEBands);
- for (i=0;i<=LM;i++)
- {
- for (C=1;C<=2;C++)
- {
- for (j=0;j<m->nbEBands;j++)
- {
- int N0;
- int max_bits;
- N0 = m->eBands[j+1]-m->eBands[j];
- /* N=1 bands only have a sign bit and fine bits. */
- if (N0<<i == 1)
- max_bits = C*(1+MAX_FINE_BITS)<<BITRES;
- else
- {
- const unsigned char *pcache;
- opus_int32 num;
- opus_int32 den;
- int LM0;
- int N;
- int offset;
- int ndof;
- int qb;
- int k;
- LM0 = 0;
- /* Even-sized bands bigger than N=2 can be split one more time.
- As of commit 44203907 all bands >1 are even, including custom modes.*/
- if (N0 > 2)
- {
- N0>>=1;
- LM0--;
- }
- /* N0=1 bands can't be split down to N<2. */
- else if (N0 <= 1)
- {
- LM0=IMIN(i,1);
- N0<<=LM0;
- }
- /* Compute the cost for the lowest-level PVQ of a fully split
- band. */
- pcache = bits + cindex[(LM0+1)*m->nbEBands+j];
- max_bits = pcache[pcache[0]]+1;
- /* Add in the cost of coding regular splits. */
- N = N0;
- for(k=0;k<i-LM0;k++){
- max_bits <<= 1;
- /* Offset the number of qtheta bits by log2(N)/2
- + QTHETA_OFFSET compared to their "fair share" of
- total/N */
- offset = ((m->logN[j]+((LM0+k)<<BITRES))>>1)-QTHETA_OFFSET;
- /* The number of qtheta bits we'll allocate if the remainder
- is to be max_bits.
- The average measured cost for theta is 0.89701 times qb,
- approximated here as 459/512. */
- num=459*(opus_int32)((2*N-1)*offset+max_bits);
- den=((opus_int32)(2*N-1)<<9)-459;
- qb = IMIN((num+(den>>1))/den, 57);
- celt_assert(qb >= 0);
- max_bits += qb;
- N <<= 1;
- }
- /* Add in the cost of a stereo split, if necessary. */
- if (C==2)
- {
- max_bits <<= 1;
- offset = ((m->logN[j]+(i<<BITRES))>>1)-(N==2?QTHETA_OFFSET_TWOPHASE:QTHETA_OFFSET);
- ndof = 2*N-1-(N==2);
- /* The average measured cost for theta with the step PDF is
- 0.95164 times qb, approximated here as 487/512. */
- num = (N==2?512:487)*(opus_int32)(max_bits+ndof*offset);
- den = ((opus_int32)ndof<<9)-(N==2?512:487);
- qb = IMIN((num+(den>>1))/den, (N==2?64:61));
- celt_assert(qb >= 0);
- max_bits += qb;
- }
- /* Add the fine bits we'll use. */
- /* Compensate for the extra DoF in stereo */
- ndof = C*N + ((C==2 && N>2) ? 1 : 0);
- /* Offset the number of fine bits by log2(N)/2 + FINE_OFFSET
- compared to their "fair share" of total/N */
- offset = ((m->logN[j] + (i<<BITRES))>>1)-FINE_OFFSET;
- /* N=2 is the only point that doesn't match the curve */
- if (N==2)
- offset += 1<<BITRES>>2;
- /* The number of fine bits we'll allocate if the remainder is
- to be max_bits. */
- num = max_bits+ndof*offset;
- den = (ndof-1)<<BITRES;
- qb = IMIN((num+(den>>1))/den, MAX_FINE_BITS);
- celt_assert(qb >= 0);
- max_bits += C*qb<<BITRES;
- }
- max_bits = (4*max_bits/(C*((m->eBands[j+1]-m->eBands[j])<<i)))-64;
- celt_assert(max_bits >= 0);
- celt_assert(max_bits < 256);
- *cap++ = (unsigned char)max_bits;
- }
- }
- }
-}
-
-#endif /* CUSTOM_MODES */
-
-#define ALLOC_STEPS 6
-
-static OPUS_INLINE int interp_bits2pulses(const CELTMode *m, int start, int end, int skip_start,
- const int *bits1, const int *bits2, const int *thresh, const int *cap, opus_int32 total, opus_int32 *_balance,
- int skip_rsv, int *intensity, int intensity_rsv, int *dual_stereo, int dual_stereo_rsv, int *bits,
- int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth)
-{
- opus_int32 psum;
- int lo, hi;
- int i, j;
- int logM;
- int stereo;
- int codedBands=-1;
- int alloc_floor;
- opus_int32 left, percoeff;
- int done;
- opus_int32 balance;
- SAVE_STACK;
-
- alloc_floor = C<<BITRES;
- stereo = C>1;
-
- logM = LM<<BITRES;
- lo = 0;
- hi = 1<<ALLOC_STEPS;
- for (i=0;i<ALLOC_STEPS;i++)
- {
- int mid = (lo+hi)>>1;
- psum = 0;
- done = 0;
- for (j=end;j-->start;)
- {
- int tmp = bits1[j] + (mid*(opus_int32)bits2[j]>>ALLOC_STEPS);
- if (tmp >= thresh[j] || done)
- {
- done = 1;
- /* Don't allocate more than we can actually use */
- psum += IMIN(tmp, cap[j]);
- } else {
- if (tmp >= alloc_floor)
- psum += alloc_floor;
- }
- }
- if (psum > total)
- hi = mid;
- else
- lo = mid;
- }
- psum = 0;
- /*printf ("interp bisection gave %d\n", lo);*/
- done = 0;
- for (j=end;j-->start;)
- {
- int tmp = bits1[j] + (lo*bits2[j]>>ALLOC_STEPS);
- if (tmp < thresh[j] && !done)
- {
- if (tmp >= alloc_floor)
- tmp = alloc_floor;
- else
- tmp = 0;
- } else
- done = 1;
- /* Don't allocate more than we can actually use */
- tmp = IMIN(tmp, cap[j]);
- bits[j] = tmp;
- psum += tmp;
- }
-
- /* Decide which bands to skip, working backwards from the end. */
- for (codedBands=end;;codedBands--)
- {
- int band_width;
- int band_bits;
- int rem;
- j = codedBands-1;
- /* Never skip the first band, nor a band that has been boosted by
- dynalloc.
- In the first case, we'd be coding a bit to signal we're going to waste
- all the other bits.
- In the second case, we'd be coding a bit to redistribute all the bits
- we just signaled should be cocentrated in this band. */
- if (j<=skip_start)
- {
- /* Give the bit we reserved to end skipping back. */
- total += skip_rsv;
- break;
- }
- /*Figure out how many left-over bits we would be adding to this band.
- This can include bits we've stolen back from higher, skipped bands.*/
- left = total-psum;
- percoeff = left/(m->eBands[codedBands]-m->eBands[start]);
- left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
- rem = IMAX(left-(m->eBands[j]-m->eBands[start]),0);
- band_width = m->eBands[codedBands]-m->eBands[j];
- band_bits = (int)(bits[j] + percoeff*band_width + rem);
- /*Only code a skip decision if we're above the threshold for this band.
- Otherwise it is force-skipped.
- This ensures that we have enough bits to code the skip flag.*/
- if (band_bits >= IMAX(thresh[j], alloc_floor+(1<<BITRES)))
- {
- if (encode)
- {
- /*This if() block is the only part of the allocation function that
- is not a mandatory part of the bitstream: any bands we choose to
- skip here must be explicitly signaled.*/
- /*Choose a threshold with some hysteresis to keep bands from
- fluctuating in and out.*/
-#ifdef FUZZING
- if ((rand()&0x1) == 0)
-#else
- if (codedBands<=start+2 || (band_bits > ((j<prev?7:9)*band_width<<LM<<BITRES)>>4 && j<=signalBandwidth))
-#endif
- {
- ec_enc_bit_logp(ec, 1, 1);
- break;
- }
- ec_enc_bit_logp(ec, 0, 1);
- } else if (ec_dec_bit_logp(ec, 1)) {
- break;
- }
- /*We used a bit to skip this band.*/
- psum += 1<<BITRES;
- band_bits -= 1<<BITRES;
- }
- /*Reclaim the bits originally allocated to this band.*/
- psum -= bits[j]+intensity_rsv;
- if (intensity_rsv > 0)
- intensity_rsv = LOG2_FRAC_TABLE[j-start];
- psum += intensity_rsv;
- if (band_bits >= alloc_floor)
- {
- /*If we have enough for a fine energy bit per channel, use it.*/
- psum += alloc_floor;
- bits[j] = alloc_floor;
- } else {
- /*Otherwise this band gets nothing at all.*/
- bits[j] = 0;
- }
- }
-
- celt_assert(codedBands > start);
- /* Code the intensity and dual stereo parameters. */
- if (intensity_rsv > 0)
- {
- if (encode)
- {
- *intensity = IMIN(*intensity, codedBands);
- ec_enc_uint(ec, *intensity-start, codedBands+1-start);
- }
- else
- *intensity = start+ec_dec_uint(ec, codedBands+1-start);
- }
- else
- *intensity = 0;
- if (*intensity <= start)
- {
- total += dual_stereo_rsv;
- dual_stereo_rsv = 0;
- }
- if (dual_stereo_rsv > 0)
- {
- if (encode)
- ec_enc_bit_logp(ec, *dual_stereo, 1);
- else
- *dual_stereo = ec_dec_bit_logp(ec, 1);
- }
- else
- *dual_stereo = 0;
-
- /* Allocate the remaining bits */
- left = total-psum;
- percoeff = left/(m->eBands[codedBands]-m->eBands[start]);
- left -= (m->eBands[codedBands]-m->eBands[start])*percoeff;
- for (j=start;j<codedBands;j++)
- bits[j] += ((int)percoeff*(m->eBands[j+1]-m->eBands[j]));
- for (j=start;j<codedBands;j++)
- {
- int tmp = (int)IMIN(left, m->eBands[j+1]-m->eBands[j]);
- bits[j] += tmp;
- left -= tmp;
- }
- /*for (j=0;j<end;j++)printf("%d ", bits[j]);printf("\n");*/
-
- balance = 0;
- for (j=start;j<codedBands;j++)
- {
- int N0, N, den;
- int offset;
- int NClogN;
- opus_int32 excess, bit;
-
- celt_assert(bits[j] >= 0);
- N0 = m->eBands[j+1]-m->eBands[j];
- N=N0<<LM;
- bit = (opus_int32)bits[j]+balance;
-
- if (N>1)
- {
- excess = MAX32(bit-cap[j],0);
- bits[j] = bit-excess;
-
- /* Compensate for the extra DoF in stereo */
- den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0));
-
- NClogN = den*(m->logN[j] + logM);
-
- /* Offset for the number of fine bits by log2(N)/2 + FINE_OFFSET
- compared to their "fair share" of total/N */
- offset = (NClogN>>1)-den*FINE_OFFSET;
-
- /* N=2 is the only point that doesn't match the curve */
- if (N==2)
- offset += den<<BITRES>>2;
-
- /* Changing the offset for allocating the second and third
- fine energy bit */
- if (bits[j] + offset < den*2<<BITRES)
- offset += NClogN>>2;
- else if (bits[j] + offset < den*3<<BITRES)
- offset += NClogN>>3;
-
- /* Divide with rounding */
- ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1))) / (den<<BITRES));
-
- /* Make sure not to bust */
- if (C*ebits[j] > (bits[j]>>BITRES))
- ebits[j] = bits[j] >> stereo >> BITRES;
-
- /* More than that is useless because that's about as far as PVQ can go */
- ebits[j] = IMIN(ebits[j], MAX_FINE_BITS);
-
- /* If we rounded down or capped this band, make it a candidate for the
- final fine energy pass */
- fine_priority[j] = ebits[j]*(den<<BITRES) >= bits[j]+offset;
-
- /* Remove the allocated fine bits; the rest are assigned to PVQ */
- bits[j] -= C*ebits[j]<<BITRES;
-
- } else {
- /* For N=1, all bits go to fine energy except for a single sign bit */
- excess = MAX32(0,bit-(C<<BITRES));
- bits[j] = bit-excess;
- ebits[j] = 0;
- fine_priority[j] = 1;
- }
-
- /* Fine energy can't take advantage of the re-balancing in
- quant_all_bands().
- Instead, do the re-balancing here.*/
- if(excess > 0)
- {
- int extra_fine;
- int extra_bits;
- extra_fine = IMIN(excess>>(stereo+BITRES),MAX_FINE_BITS-ebits[j]);
- ebits[j] += extra_fine;
- extra_bits = extra_fine*C<<BITRES;
- fine_priority[j] = extra_bits >= excess-balance;
- excess -= extra_bits;
- }
- balance = excess;
-
- celt_assert(bits[j] >= 0);
- celt_assert(ebits[j] >= 0);
- }
- /* Save any remaining bits over the cap for the rebalancing in
- quant_all_bands(). */
- *_balance = balance;
-
- /* The skipped bands use all their bits for fine energy. */
- for (;j<end;j++)
- {
- ebits[j] = bits[j] >> stereo >> BITRES;
- celt_assert(C*ebits[j]<<BITRES == bits[j]);
- bits[j] = 0;
- fine_priority[j] = ebits[j]<1;
- }
- RESTORE_STACK;
- return codedBands;
-}
-
-int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stereo,
- opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth)
-{
- int lo, hi, len, j;
- int codedBands;
- int skip_start;
- int skip_rsv;
- int intensity_rsv;
- int dual_stereo_rsv;
- VARDECL(int, bits1);
- VARDECL(int, bits2);
- VARDECL(int, thresh);
- VARDECL(int, trim_offset);
- SAVE_STACK;
-
- total = IMAX(total, 0);
- len = m->nbEBands;
- skip_start = start;
- /* Reserve a bit to signal the end of manually skipped bands. */
- skip_rsv = total >= 1<<BITRES ? 1<<BITRES : 0;
- total -= skip_rsv;
- /* Reserve bits for the intensity and dual stereo parameters. */
- intensity_rsv = dual_stereo_rsv = 0;
- if (C==2)
- {
- intensity_rsv = LOG2_FRAC_TABLE[end-start];
- if (intensity_rsv>total)
- intensity_rsv = 0;
- else
- {
- total -= intensity_rsv;
- dual_stereo_rsv = total>=1<<BITRES ? 1<<BITRES : 0;
- total -= dual_stereo_rsv;
- }
- }
- ALLOC(bits1, len, int);
- ALLOC(bits2, len, int);
- ALLOC(thresh, len, int);
- ALLOC(trim_offset, len, int);
-
- for (j=start;j<end;j++)
- {
- /* Below this threshold, we're sure not to allocate any PVQ bits */
- thresh[j] = IMAX((C)<<BITRES, (3*(m->eBands[j+1]-m->eBands[j])<<LM<<BITRES)>>4);
- /* Tilt of the allocation curve */
- trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1)
- *(1<<(LM+BITRES))>>6;
- /* Giving less resolution to single-coefficient bands because they get
- more benefit from having one coarse value per coefficient*/
- if ((m->eBands[j+1]-m->eBands[j])<<LM==1)
- trim_offset[j] -= C<<BITRES;
- }
- lo = 1;
- hi = m->nbAllocVectors - 1;
- do
- {
- int done = 0;
- int psum = 0;
- int mid = (lo+hi) >> 1;
- for (j=end;j-->start;)
- {
- int bitsj;
- int N = m->eBands[j+1]-m->eBands[j];
- bitsj = C*N*m->allocVectors[mid*len+j]<<LM>>2;
- if (bitsj > 0)
- bitsj = IMAX(0, bitsj + trim_offset[j]);
- bitsj += offsets[j];
- if (bitsj >= thresh[j] || done)
- {
- done = 1;
- /* Don't allocate more than we can actually use */
- psum += IMIN(bitsj, cap[j]);
- } else {
- if (bitsj >= C<<BITRES)
- psum += C<<BITRES;
- }
- }
- if (psum > total)
- hi = mid - 1;
- else
- lo = mid + 1;
- /*printf ("lo = %d, hi = %d\n", lo, hi);*/
- }
- while (lo <= hi);
- hi = lo--;
- /*printf ("interp between %d and %d\n", lo, hi);*/
- for (j=start;j<end;j++)
- {
- int bits1j, bits2j;
- int N = m->eBands[j+1]-m->eBands[j];
- bits1j = C*N*m->allocVectors[lo*len+j]<<LM>>2;
- bits2j = hi>=m->nbAllocVectors ?
- cap[j] : C*N*m->allocVectors[hi*len+j]<<LM>>2;
- if (bits1j > 0)
- bits1j = IMAX(0, bits1j + trim_offset[j]);
- if (bits2j > 0)
- bits2j = IMAX(0, bits2j + trim_offset[j]);
- if (lo > 0)
- bits1j += offsets[j];
- bits2j += offsets[j];
- if (offsets[j]>0)
- skip_start = j;
- bits2j = IMAX(0,bits2j-bits1j);
- bits1[j] = bits1j;
- bits2[j] = bits2j;
- }
- codedBands = interp_bits2pulses(m, start, end, skip_start, bits1, bits2, thresh, cap,
- total, balance, skip_rsv, intensity, intensity_rsv, dual_stereo, dual_stereo_rsv,
- pulses, ebits, fine_priority, C, LM, ec, encode, prev, signalBandwidth);
- RESTORE_STACK;
- return codedBands;
-}
-
diff --git a/src/opus-1.1/celt/rate.h b/src/opus-1.1/celt/rate.h
deleted file mode 100644
index f1e06611..00000000
--- a/src/opus-1.1/celt/rate.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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 RATE_H
-#define RATE_H
-
-#define MAX_PSEUDO 40
-#define LOG_MAX_PSEUDO 6
-
-#define MAX_PULSES 128
-
-#define MAX_FINE_BITS 8
-
-#define FINE_OFFSET 21
-#define QTHETA_OFFSET 4
-#define QTHETA_OFFSET_TWOPHASE 16
-
-#include "cwrs.h"
-#include "modes.h"
-
-void compute_pulse_cache(CELTMode *m, int LM);
-
-static OPUS_INLINE int get_pulses(int i)
-{
- return i<8 ? i : (8 + (i&7)) << ((i>>3)-1);
-}
-
-static OPUS_INLINE int bits2pulses(const CELTMode *m, int band, int LM, int bits)
-{
- int i;
- int lo, hi;
- const unsigned char *cache;
-
- LM++;
- cache = m->cache.bits + m->cache.index[LM*m->nbEBands+band];
-
- lo = 0;
- hi = cache[0];
- bits--;
- for (i=0;i<LOG_MAX_PSEUDO;i++)
- {
- int mid = (lo+hi+1)>>1;
- /* OPT: Make sure this is implemented with a conditional move */
- if ((int)cache[mid] >= bits)
- hi = mid;
- else
- lo = mid;
- }
- if (bits- (lo == 0 ? -1 : (int)cache[lo]) <= (int)cache[hi]-bits)
- return lo;
- else
- return hi;
-}
-
-static OPUS_INLINE int pulses2bits(const CELTMode *m, int band, int LM, int pulses)
-{
- const unsigned char *cache;
-
- LM++;
- cache = m->cache.bits + m->cache.index[LM*m->nbEBands+band];
- return pulses == 0 ? 0 : cache[pulses]+1;
-}
-
-/** Compute the pulse allocation, i.e. how many pulses will go in each
- * band.
- @param m mode
- @param offsets Requested increase or decrease in the number of bits for
- each band
- @param total Number of bands
- @param pulses Number of pulses per band (returned)
- @return Total number of bits allocated
-*/
-int compute_allocation(const CELTMode *m, int start, int end, const int *offsets, const int *cap, int alloc_trim, int *intensity, int *dual_stero,
- opus_int32 total, opus_int32 *balance, int *pulses, int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth);
-
-#endif
diff --git a/src/opus-1.1/celt/stack_alloc.h b/src/opus-1.1/celt/stack_alloc.h
deleted file mode 100644
index 316a6ce1..00000000
--- a/src/opus-1.1/celt/stack_alloc.h
+++ /dev/null
@@ -1,178 +0,0 @@
-/* Copyright (C) 2002-2003 Jean-Marc Valin
- Copyright (C) 2007-2009 Xiph.Org Foundation */
-/**
- @file stack_alloc.h
- @brief Temporary memory allocation on stack
-*/
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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 STACK_ALLOC_H
-#define STACK_ALLOC_H
-
-#include "opus_types.h"
-#include "opus_defines.h"
-
-#if (!defined (VAR_ARRAYS) && !defined (USE_ALLOCA) && !defined (NONTHREADSAFE_PSEUDOSTACK))
-#error "Opus requires one of VAR_ARRAYS, USE_ALLOCA, or NONTHREADSAFE_PSEUDOSTACK be defined to select the temporary allocation mode."
-#endif
-
-#ifdef USE_ALLOCA
-# ifdef WIN32
-# include <malloc.h>
-# else
-# ifdef HAVE_ALLOCA_H
-# include <alloca.h>
-# else
-# include <stdlib.h>
-# endif
-# endif
-#endif
-
-/**
- * @def ALIGN(stack, size)
- *
- * Aligns the stack to a 'size' boundary
- *
- * @param stack Stack
- * @param size New size boundary
- */
-
-/**
- * @def PUSH(stack, size, type)
- *
- * Allocates 'size' elements of type 'type' on the stack
- *
- * @param stack Stack
- * @param size Number of elements
- * @param type Type of element
- */
-
-/**
- * @def VARDECL(var)
- *
- * Declare variable on stack
- *
- * @param var Variable to declare
- */
-
-/**
- * @def ALLOC(var, size, type)
- *
- * Allocate 'size' elements of 'type' on stack
- *
- * @param var Name of variable to allocate
- * @param size Number of elements
- * @param type Type of element
- */
-
-#if defined(VAR_ARRAYS)
-
-#define VARDECL(type, var)
-#define ALLOC(var, size, type) type var[size]
-#define SAVE_STACK
-#define RESTORE_STACK
-#define ALLOC_STACK
-/* C99 does not allow VLAs of size zero */
-#define ALLOC_NONE 1
-
-#elif defined(USE_ALLOCA)
-
-#define VARDECL(type, var) type *var
-
-# ifdef WIN32
-# define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size)))
-# else
-# define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size)))
-# endif
-
-#define SAVE_STACK
-#define RESTORE_STACK
-#define ALLOC_STACK
-#define ALLOC_NONE 0
-
-#else
-
-#ifdef CELT_C
-char *global_stack=0;
-#else
-extern char *global_stack;
-#endif /* CELT_C */
-
-#ifdef ENABLE_VALGRIND
-
-#include <valgrind/memcheck.h>
-
-#ifdef CELT_C
-char *global_stack_top=0;
-#else
-extern char *global_stack_top;
-#endif /* CELT_C */
-
-#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1))
-#define PUSH(stack, size, type) (VALGRIND_MAKE_MEM_NOACCESS(stack, global_stack_top-stack),ALIGN((stack),sizeof(type)/sizeof(char)),VALGRIND_MAKE_MEM_UNDEFINED(stack, ((size)*sizeof(type)/sizeof(char))),(stack)+=(2*(size)*sizeof(type)/sizeof(char)),(type*)((stack)-(2*(size)*sizeof(type)/sizeof(char))))
-#define RESTORE_STACK ((global_stack = _saved_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack))
-#define ALLOC_STACK char *_saved_stack; ((global_stack = (global_stack==0) ? ((global_stack_top=opus_alloc_scratch(GLOBAL_STACK_SIZE*2)+(GLOBAL_STACK_SIZE*2))-(GLOBAL_STACK_SIZE*2)) : global_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack)); _saved_stack = global_stack;
-
-#else
-
-#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1))
-#define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)/sizeof(char)),(stack)+=(size)*(sizeof(type)/sizeof(char)),(type*)((stack)-(size)*(sizeof(type)/sizeof(char))))
-#define RESTORE_STACK (global_stack = _saved_stack)
-#define ALLOC_STACK char *_saved_stack; (global_stack = (global_stack==0) ? opus_alloc_scratch(GLOBAL_STACK_SIZE) : global_stack); _saved_stack = global_stack;
-
-#endif /* ENABLE_VALGRIND */
-
-#include "os_support.h"
-#define VARDECL(type, var) type *var
-#define ALLOC(var, size, type) var = PUSH(global_stack, size, type)
-#define SAVE_STACK char *_saved_stack = global_stack;
-#define ALLOC_NONE 0
-
-#endif /* VAR_ARRAYS */
-
-
-#ifdef ENABLE_VALGRIND
-
-#include <valgrind/memcheck.h>
-#define OPUS_CHECK_ARRAY(ptr, len) VALGRIND_CHECK_MEM_IS_DEFINED(ptr, len*sizeof(*ptr))
-#define OPUS_CHECK_VALUE(value) VALGRIND_CHECK_VALUE_IS_DEFINED(value)
-#define OPUS_CHECK_ARRAY_COND(ptr, len) VALGRIND_CHECK_MEM_IS_DEFINED(ptr, len*sizeof(*ptr))
-#define OPUS_CHECK_VALUE_COND(value) VALGRIND_CHECK_VALUE_IS_DEFINED(value)
-#define OPUS_PRINT_INT(value) do {fprintf(stderr, #value " = %d at %s:%d\n", value, __FILE__, __LINE__);}while(0)
-#define OPUS_FPRINTF fprintf
-
-#else
-
-static OPUS_INLINE int _opus_false(void) {return 0;}
-#define OPUS_CHECK_ARRAY(ptr, len) _opus_false()
-#define OPUS_CHECK_VALUE(value) _opus_false()
-#define OPUS_PRINT_INT(value) do{}while(0)
-#define OPUS_FPRINTF (void)
-
-#endif
-
-
-#endif /* STACK_ALLOC_H */
diff --git a/src/opus-1.1/celt/static_modes_fixed.h b/src/opus-1.1/celt/static_modes_fixed.h
deleted file mode 100644
index 216df9e6..00000000
--- a/src/opus-1.1/celt/static_modes_fixed.h
+++ /dev/null
@@ -1,595 +0,0 @@
-/* The contents of this file was automatically generated by dump_modes.c
- with arguments: 48000 960
- It contains static definitions for some pre-defined modes. */
-#include "modes.h"
-#include "rate.h"
-
-#ifndef DEF_WINDOW120
-#define DEF_WINDOW120
-static const opus_val16 window120[120] = {
-2, 20, 55, 108, 178,
-266, 372, 494, 635, 792,
-966, 1157, 1365, 1590, 1831,
-2089, 2362, 2651, 2956, 3276,
-3611, 3961, 4325, 4703, 5094,
-5499, 5916, 6346, 6788, 7241,
-7705, 8179, 8663, 9156, 9657,
-10167, 10684, 11207, 11736, 12271,
-12810, 13353, 13899, 14447, 14997,
-15547, 16098, 16648, 17197, 17744,
-18287, 18827, 19363, 19893, 20418,
-20936, 21447, 21950, 22445, 22931,
-23407, 23874, 24330, 24774, 25208,
-25629, 26039, 26435, 26819, 27190,
-27548, 27893, 28224, 28541, 28845,
-29135, 29411, 29674, 29924, 30160,
-30384, 30594, 30792, 30977, 31151,
-31313, 31463, 31602, 31731, 31849,
-31958, 32057, 32148, 32229, 32303,
-32370, 32429, 32481, 32528, 32568,
-32604, 32634, 32661, 32683, 32701,
-32717, 32729, 32740, 32748, 32754,
-32758, 32762, 32764, 32766, 32767,
-32767, 32767, 32767, 32767, 32767,
-};
-#endif
-
-#ifndef DEF_LOGN400
-#define DEF_LOGN400
-static const opus_int16 logN400[21] = {
-0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, };
-#endif
-
-#ifndef DEF_PULSE_CACHE50
-#define DEF_PULSE_CACHE50
-static const opus_int16 cache_index50[105] = {
--1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41,
-82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41,
-41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41,
-41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305,
-318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240,
-305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240,
-240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387,
-};
-static const unsigned char cache_bits50[392] = {
-40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28,
-31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50,
-51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65,
-66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61,
-64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92,
-94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123,
-124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94,
-97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139,
-142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35,
-28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149,
-153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225,
-229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157,
-166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63,
-86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250,
-25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180,
-185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89,
-110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41,
-74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138,
-163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214,
-228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49,
-90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47,
-87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57,
-106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187,
-224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127,
-182, 234, };
-static const unsigned char cache_caps50[168] = {
-224, 224, 224, 224, 224, 224, 224, 224, 160, 160, 160, 160, 185, 185, 185,
-178, 178, 168, 134, 61, 37, 224, 224, 224, 224, 224, 224, 224, 224, 240,
-240, 240, 240, 207, 207, 207, 198, 198, 183, 144, 66, 40, 160, 160, 160,
-160, 160, 160, 160, 160, 185, 185, 185, 185, 193, 193, 193, 183, 183, 172,
-138, 64, 38, 240, 240, 240, 240, 240, 240, 240, 240, 207, 207, 207, 207,
-204, 204, 204, 193, 193, 180, 143, 66, 40, 185, 185, 185, 185, 185, 185,
-185, 185, 193, 193, 193, 193, 193, 193, 193, 183, 183, 172, 138, 65, 39,
-207, 207, 207, 207, 207, 207, 207, 207, 204, 204, 204, 204, 201, 201, 201,
-188, 188, 176, 141, 66, 40, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 194, 194, 194, 184, 184, 173, 139, 65, 39, 204, 204, 204,
-204, 204, 204, 204, 204, 201, 201, 201, 201, 198, 198, 198, 187, 187, 175,
-140, 66, 40, };
-#endif
-
-#ifndef FFT_TWIDDLES48000_960
-#define FFT_TWIDDLES48000_960
-static const kiss_twiddle_cpx fft_twiddles48000_960[480] = {
-{32767, 0}, {32766, -429},
-{32757, -858}, {32743, -1287},
-{32724, -1715}, {32698, -2143},
-{32667, -2570}, {32631, -2998},
-{32588, -3425}, {32541, -3851},
-{32488, -4277}, {32429, -4701},
-{32364, -5125}, {32295, -5548},
-{32219, -5971}, {32138, -6393},
-{32051, -6813}, {31960, -7231},
-{31863, -7650}, {31760, -8067},
-{31652, -8481}, {31539, -8895},
-{31419, -9306}, {31294, -9716},
-{31165, -10126}, {31030, -10532},
-{30889, -10937}, {30743, -11340},
-{30592, -11741}, {30436, -12141},
-{30274, -12540}, {30107, -12935},
-{29936, -13328}, {29758, -13718},
-{29577, -14107}, {29390, -14493},
-{29197, -14875}, {29000, -15257},
-{28797, -15635}, {28590, -16010},
-{28379, -16384}, {28162, -16753},
-{27940, -17119}, {27714, -17484},
-{27482, -17845}, {27246, -18205},
-{27006, -18560}, {26760, -18911},
-{26510, -19260}, {26257, -19606},
-{25997, -19947}, {25734, -20286},
-{25466, -20621}, {25194, -20952},
-{24918, -21281}, {24637, -21605},
-{24353, -21926}, {24063, -22242},
-{23770, -22555}, {23473, -22865},
-{23171, -23171}, {22866, -23472},
-{22557, -23769}, {22244, -24063},
-{21927, -24352}, {21606, -24636},
-{21282, -24917}, {20954, -25194},
-{20622, -25465}, {20288, -25733},
-{19949, -25997}, {19607, -26255},
-{19261, -26509}, {18914, -26760},
-{18561, -27004}, {18205, -27246},
-{17846, -27481}, {17485, -27713},
-{17122, -27940}, {16755, -28162},
-{16385, -28378}, {16012, -28590},
-{15636, -28797}, {15258, -28999},
-{14878, -29197}, {14494, -29389},
-{14108, -29576}, {13720, -29757},
-{13329, -29934}, {12937, -30107},
-{12540, -30274}, {12142, -30435},
-{11744, -30592}, {11342, -30743},
-{10939, -30889}, {10534, -31030},
-{10127, -31164}, {9718, -31294},
-{9307, -31418}, {8895, -31537},
-{8482, -31652}, {8067, -31759},
-{7650, -31862}, {7233, -31960},
-{6815, -32051}, {6393, -32138},
-{5973, -32219}, {5549, -32294},
-{5127, -32364}, {4703, -32429},
-{4278, -32487}, {3852, -32541},
-{3426, -32588}, {2999, -32630},
-{2572, -32667}, {2144, -32698},
-{1716, -32724}, {1287, -32742},
-{860, -32757}, {430, -32766},
-{0, -32767}, {-429, -32766},
-{-858, -32757}, {-1287, -32743},
-{-1715, -32724}, {-2143, -32698},
-{-2570, -32667}, {-2998, -32631},
-{-3425, -32588}, {-3851, -32541},
-{-4277, -32488}, {-4701, -32429},
-{-5125, -32364}, {-5548, -32295},
-{-5971, -32219}, {-6393, -32138},
-{-6813, -32051}, {-7231, -31960},
-{-7650, -31863}, {-8067, -31760},
-{-8481, -31652}, {-8895, -31539},
-{-9306, -31419}, {-9716, -31294},
-{-10126, -31165}, {-10532, -31030},
-{-10937, -30889}, {-11340, -30743},
-{-11741, -30592}, {-12141, -30436},
-{-12540, -30274}, {-12935, -30107},
-{-13328, -29936}, {-13718, -29758},
-{-14107, -29577}, {-14493, -29390},
-{-14875, -29197}, {-15257, -29000},
-{-15635, -28797}, {-16010, -28590},
-{-16384, -28379}, {-16753, -28162},
-{-17119, -27940}, {-17484, -27714},
-{-17845, -27482}, {-18205, -27246},
-{-18560, -27006}, {-18911, -26760},
-{-19260, -26510}, {-19606, -26257},
-{-19947, -25997}, {-20286, -25734},
-{-20621, -25466}, {-20952, -25194},
-{-21281, -24918}, {-21605, -24637},
-{-21926, -24353}, {-22242, -24063},
-{-22555, -23770}, {-22865, -23473},
-{-23171, -23171}, {-23472, -22866},
-{-23769, -22557}, {-24063, -22244},
-{-24352, -21927}, {-24636, -21606},
-{-24917, -21282}, {-25194, -20954},
-{-25465, -20622}, {-25733, -20288},
-{-25997, -19949}, {-26255, -19607},
-{-26509, -19261}, {-26760, -18914},
-{-27004, -18561}, {-27246, -18205},
-{-27481, -17846}, {-27713, -17485},
-{-27940, -17122}, {-28162, -16755},
-{-28378, -16385}, {-28590, -16012},
-{-28797, -15636}, {-28999, -15258},
-{-29197, -14878}, {-29389, -14494},
-{-29576, -14108}, {-29757, -13720},
-{-29934, -13329}, {-30107, -12937},
-{-30274, -12540}, {-30435, -12142},
-{-30592, -11744}, {-30743, -11342},
-{-30889, -10939}, {-31030, -10534},
-{-31164, -10127}, {-31294, -9718},
-{-31418, -9307}, {-31537, -8895},
-{-31652, -8482}, {-31759, -8067},
-{-31862, -7650}, {-31960, -7233},
-{-32051, -6815}, {-32138, -6393},
-{-32219, -5973}, {-32294, -5549},
-{-32364, -5127}, {-32429, -4703},
-{-32487, -4278}, {-32541, -3852},
-{-32588, -3426}, {-32630, -2999},
-{-32667, -2572}, {-32698, -2144},
-{-32724, -1716}, {-32742, -1287},
-{-32757, -860}, {-32766, -430},
-{-32767, 0}, {-32766, 429},
-{-32757, 858}, {-32743, 1287},
-{-32724, 1715}, {-32698, 2143},
-{-32667, 2570}, {-32631, 2998},
-{-32588, 3425}, {-32541, 3851},
-{-32488, 4277}, {-32429, 4701},
-{-32364, 5125}, {-32295, 5548},
-{-32219, 5971}, {-32138, 6393},
-{-32051, 6813}, {-31960, 7231},
-{-31863, 7650}, {-31760, 8067},
-{-31652, 8481}, {-31539, 8895},
-{-31419, 9306}, {-31294, 9716},
-{-31165, 10126}, {-31030, 10532},
-{-30889, 10937}, {-30743, 11340},
-{-30592, 11741}, {-30436, 12141},
-{-30274, 12540}, {-30107, 12935},
-{-29936, 13328}, {-29758, 13718},
-{-29577, 14107}, {-29390, 14493},
-{-29197, 14875}, {-29000, 15257},
-{-28797, 15635}, {-28590, 16010},
-{-28379, 16384}, {-28162, 16753},
-{-27940, 17119}, {-27714, 17484},
-{-27482, 17845}, {-27246, 18205},
-{-27006, 18560}, {-26760, 18911},
-{-26510, 19260}, {-26257, 19606},
-{-25997, 19947}, {-25734, 20286},
-{-25466, 20621}, {-25194, 20952},
-{-24918, 21281}, {-24637, 21605},
-{-24353, 21926}, {-24063, 22242},
-{-23770, 22555}, {-23473, 22865},
-{-23171, 23171}, {-22866, 23472},
-{-22557, 23769}, {-22244, 24063},
-{-21927, 24352}, {-21606, 24636},
-{-21282, 24917}, {-20954, 25194},
-{-20622, 25465}, {-20288, 25733},
-{-19949, 25997}, {-19607, 26255},
-{-19261, 26509}, {-18914, 26760},
-{-18561, 27004}, {-18205, 27246},
-{-17846, 27481}, {-17485, 27713},
-{-17122, 27940}, {-16755, 28162},
-{-16385, 28378}, {-16012, 28590},
-{-15636, 28797}, {-15258, 28999},
-{-14878, 29197}, {-14494, 29389},
-{-14108, 29576}, {-13720, 29757},
-{-13329, 29934}, {-12937, 30107},
-{-12540, 30274}, {-12142, 30435},
-{-11744, 30592}, {-11342, 30743},
-{-10939, 30889}, {-10534, 31030},
-{-10127, 31164}, {-9718, 31294},
-{-9307, 31418}, {-8895, 31537},
-{-8482, 31652}, {-8067, 31759},
-{-7650, 31862}, {-7233, 31960},
-{-6815, 32051}, {-6393, 32138},
-{-5973, 32219}, {-5549, 32294},
-{-5127, 32364}, {-4703, 32429},
-{-4278, 32487}, {-3852, 32541},
-{-3426, 32588}, {-2999, 32630},
-{-2572, 32667}, {-2144, 32698},
-{-1716, 32724}, {-1287, 32742},
-{-860, 32757}, {-430, 32766},
-{0, 32767}, {429, 32766},
-{858, 32757}, {1287, 32743},
-{1715, 32724}, {2143, 32698},
-{2570, 32667}, {2998, 32631},
-{3425, 32588}, {3851, 32541},
-{4277, 32488}, {4701, 32429},
-{5125, 32364}, {5548, 32295},
-{5971, 32219}, {6393, 32138},
-{6813, 32051}, {7231, 31960},
-{7650, 31863}, {8067, 31760},
-{8481, 31652}, {8895, 31539},
-{9306, 31419}, {9716, 31294},
-{10126, 31165}, {10532, 31030},
-{10937, 30889}, {11340, 30743},
-{11741, 30592}, {12141, 30436},
-{12540, 30274}, {12935, 30107},
-{13328, 29936}, {13718, 29758},
-{14107, 29577}, {14493, 29390},
-{14875, 29197}, {15257, 29000},
-{15635, 28797}, {16010, 28590},
-{16384, 28379}, {16753, 28162},
-{17119, 27940}, {17484, 27714},
-{17845, 27482}, {18205, 27246},
-{18560, 27006}, {18911, 26760},
-{19260, 26510}, {19606, 26257},
-{19947, 25997}, {20286, 25734},
-{20621, 25466}, {20952, 25194},
-{21281, 24918}, {21605, 24637},
-{21926, 24353}, {22242, 24063},
-{22555, 23770}, {22865, 23473},
-{23171, 23171}, {23472, 22866},
-{23769, 22557}, {24063, 22244},
-{24352, 21927}, {24636, 21606},
-{24917, 21282}, {25194, 20954},
-{25465, 20622}, {25733, 20288},
-{25997, 19949}, {26255, 19607},
-{26509, 19261}, {26760, 18914},
-{27004, 18561}, {27246, 18205},
-{27481, 17846}, {27713, 17485},
-{27940, 17122}, {28162, 16755},
-{28378, 16385}, {28590, 16012},
-{28797, 15636}, {28999, 15258},
-{29197, 14878}, {29389, 14494},
-{29576, 14108}, {29757, 13720},
-{29934, 13329}, {30107, 12937},
-{30274, 12540}, {30435, 12142},
-{30592, 11744}, {30743, 11342},
-{30889, 10939}, {31030, 10534},
-{31164, 10127}, {31294, 9718},
-{31418, 9307}, {31537, 8895},
-{31652, 8482}, {31759, 8067},
-{31862, 7650}, {31960, 7233},
-{32051, 6815}, {32138, 6393},
-{32219, 5973}, {32294, 5549},
-{32364, 5127}, {32429, 4703},
-{32487, 4278}, {32541, 3852},
-{32588, 3426}, {32630, 2999},
-{32667, 2572}, {32698, 2144},
-{32724, 1716}, {32742, 1287},
-{32757, 860}, {32766, 430},
-};
-#ifndef FFT_BITREV480
-#define FFT_BITREV480
-static const opus_int16 fft_bitrev480[480] = {
-0, 120, 240, 360, 30, 150, 270, 390, 60, 180, 300, 420, 90, 210, 330,
-450, 15, 135, 255, 375, 45, 165, 285, 405, 75, 195, 315, 435, 105, 225,
-345, 465, 5, 125, 245, 365, 35, 155, 275, 395, 65, 185, 305, 425, 95,
-215, 335, 455, 20, 140, 260, 380, 50, 170, 290, 410, 80, 200, 320, 440,
-110, 230, 350, 470, 10, 130, 250, 370, 40, 160, 280, 400, 70, 190, 310,
-430, 100, 220, 340, 460, 25, 145, 265, 385, 55, 175, 295, 415, 85, 205,
-325, 445, 115, 235, 355, 475, 1, 121, 241, 361, 31, 151, 271, 391, 61,
-181, 301, 421, 91, 211, 331, 451, 16, 136, 256, 376, 46, 166, 286, 406,
-76, 196, 316, 436, 106, 226, 346, 466, 6, 126, 246, 366, 36, 156, 276,
-396, 66, 186, 306, 426, 96, 216, 336, 456, 21, 141, 261, 381, 51, 171,
-291, 411, 81, 201, 321, 441, 111, 231, 351, 471, 11, 131, 251, 371, 41,
-161, 281, 401, 71, 191, 311, 431, 101, 221, 341, 461, 26, 146, 266, 386,
-56, 176, 296, 416, 86, 206, 326, 446, 116, 236, 356, 476, 2, 122, 242,
-362, 32, 152, 272, 392, 62, 182, 302, 422, 92, 212, 332, 452, 17, 137,
-257, 377, 47, 167, 287, 407, 77, 197, 317, 437, 107, 227, 347, 467, 7,
-127, 247, 367, 37, 157, 277, 397, 67, 187, 307, 427, 97, 217, 337, 457,
-22, 142, 262, 382, 52, 172, 292, 412, 82, 202, 322, 442, 112, 232, 352,
-472, 12, 132, 252, 372, 42, 162, 282, 402, 72, 192, 312, 432, 102, 222,
-342, 462, 27, 147, 267, 387, 57, 177, 297, 417, 87, 207, 327, 447, 117,
-237, 357, 477, 3, 123, 243, 363, 33, 153, 273, 393, 63, 183, 303, 423,
-93, 213, 333, 453, 18, 138, 258, 378, 48, 168, 288, 408, 78, 198, 318,
-438, 108, 228, 348, 468, 8, 128, 248, 368, 38, 158, 278, 398, 68, 188,
-308, 428, 98, 218, 338, 458, 23, 143, 263, 383, 53, 173, 293, 413, 83,
-203, 323, 443, 113, 233, 353, 473, 13, 133, 253, 373, 43, 163, 283, 403,
-73, 193, 313, 433, 103, 223, 343, 463, 28, 148, 268, 388, 58, 178, 298,
-418, 88, 208, 328, 448, 118, 238, 358, 478, 4, 124, 244, 364, 34, 154,
-274, 394, 64, 184, 304, 424, 94, 214, 334, 454, 19, 139, 259, 379, 49,
-169, 289, 409, 79, 199, 319, 439, 109, 229, 349, 469, 9, 129, 249, 369,
-39, 159, 279, 399, 69, 189, 309, 429, 99, 219, 339, 459, 24, 144, 264,
-384, 54, 174, 294, 414, 84, 204, 324, 444, 114, 234, 354, 474, 14, 134,
-254, 374, 44, 164, 284, 404, 74, 194, 314, 434, 104, 224, 344, 464, 29,
-149, 269, 389, 59, 179, 299, 419, 89, 209, 329, 449, 119, 239, 359, 479,
-};
-#endif
-
-#ifndef FFT_BITREV240
-#define FFT_BITREV240
-static const opus_int16 fft_bitrev240[240] = {
-0, 60, 120, 180, 15, 75, 135, 195, 30, 90, 150, 210, 45, 105, 165,
-225, 5, 65, 125, 185, 20, 80, 140, 200, 35, 95, 155, 215, 50, 110,
-170, 230, 10, 70, 130, 190, 25, 85, 145, 205, 40, 100, 160, 220, 55,
-115, 175, 235, 1, 61, 121, 181, 16, 76, 136, 196, 31, 91, 151, 211,
-46, 106, 166, 226, 6, 66, 126, 186, 21, 81, 141, 201, 36, 96, 156,
-216, 51, 111, 171, 231, 11, 71, 131, 191, 26, 86, 146, 206, 41, 101,
-161, 221, 56, 116, 176, 236, 2, 62, 122, 182, 17, 77, 137, 197, 32,
-92, 152, 212, 47, 107, 167, 227, 7, 67, 127, 187, 22, 82, 142, 202,
-37, 97, 157, 217, 52, 112, 172, 232, 12, 72, 132, 192, 27, 87, 147,
-207, 42, 102, 162, 222, 57, 117, 177, 237, 3, 63, 123, 183, 18, 78,
-138, 198, 33, 93, 153, 213, 48, 108, 168, 228, 8, 68, 128, 188, 23,
-83, 143, 203, 38, 98, 158, 218, 53, 113, 173, 233, 13, 73, 133, 193,
-28, 88, 148, 208, 43, 103, 163, 223, 58, 118, 178, 238, 4, 64, 124,
-184, 19, 79, 139, 199, 34, 94, 154, 214, 49, 109, 169, 229, 9, 69,
-129, 189, 24, 84, 144, 204, 39, 99, 159, 219, 54, 114, 174, 234, 14,
-74, 134, 194, 29, 89, 149, 209, 44, 104, 164, 224, 59, 119, 179, 239,
-};
-#endif
-
-#ifndef FFT_BITREV120
-#define FFT_BITREV120
-static const opus_int16 fft_bitrev120[120] = {
-0, 30, 60, 90, 15, 45, 75, 105, 5, 35, 65, 95, 20, 50, 80,
-110, 10, 40, 70, 100, 25, 55, 85, 115, 1, 31, 61, 91, 16, 46,
-76, 106, 6, 36, 66, 96, 21, 51, 81, 111, 11, 41, 71, 101, 26,
-56, 86, 116, 2, 32, 62, 92, 17, 47, 77, 107, 7, 37, 67, 97,
-22, 52, 82, 112, 12, 42, 72, 102, 27, 57, 87, 117, 3, 33, 63,
-93, 18, 48, 78, 108, 8, 38, 68, 98, 23, 53, 83, 113, 13, 43,
-73, 103, 28, 58, 88, 118, 4, 34, 64, 94, 19, 49, 79, 109, 9,
-39, 69, 99, 24, 54, 84, 114, 14, 44, 74, 104, 29, 59, 89, 119,
-};
-#endif
-
-#ifndef FFT_BITREV60
-#define FFT_BITREV60
-static const opus_int16 fft_bitrev60[60] = {
-0, 15, 30, 45, 5, 20, 35, 50, 10, 25, 40, 55, 1, 16, 31,
-46, 6, 21, 36, 51, 11, 26, 41, 56, 2, 17, 32, 47, 7, 22,
-37, 52, 12, 27, 42, 57, 3, 18, 33, 48, 8, 23, 38, 53, 13,
-28, 43, 58, 4, 19, 34, 49, 9, 24, 39, 54, 14, 29, 44, 59,
-};
-#endif
-
-#ifndef FFT_STATE48000_960_0
-#define FFT_STATE48000_960_0
-static const kiss_fft_state fft_state48000_960_0 = {
-480, /* nfft */
--1, /* shift */
-{4, 120, 4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, }, /* factors */
-fft_bitrev480, /* bitrev */
-fft_twiddles48000_960, /* bitrev */
-};
-#endif
-
-#ifndef FFT_STATE48000_960_1
-#define FFT_STATE48000_960_1
-static const kiss_fft_state fft_state48000_960_1 = {
-240, /* nfft */
-1, /* shift */
-{4, 60, 4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
-fft_bitrev240, /* bitrev */
-fft_twiddles48000_960, /* bitrev */
-};
-#endif
-
-#ifndef FFT_STATE48000_960_2
-#define FFT_STATE48000_960_2
-static const kiss_fft_state fft_state48000_960_2 = {
-120, /* nfft */
-2, /* shift */
-{4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
-fft_bitrev120, /* bitrev */
-fft_twiddles48000_960, /* bitrev */
-};
-#endif
-
-#ifndef FFT_STATE48000_960_3
-#define FFT_STATE48000_960_3
-static const kiss_fft_state fft_state48000_960_3 = {
-60, /* nfft */
-3, /* shift */
-{4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
-fft_bitrev60, /* bitrev */
-fft_twiddles48000_960, /* bitrev */
-};
-#endif
-
-#endif
-
-#ifndef MDCT_TWIDDLES960
-#define MDCT_TWIDDLES960
-static const opus_val16 mdct_twiddles960[481] = {
-32767, 32767, 32767, 32767, 32766,
-32763, 32762, 32759, 32757, 32753,
-32751, 32747, 32743, 32738, 32733,
-32729, 32724, 32717, 32711, 32705,
-32698, 32690, 32683, 32676, 32667,
-32658, 32650, 32640, 32631, 32620,
-32610, 32599, 32588, 32577, 32566,
-32554, 32541, 32528, 32515, 32502,
-32487, 32474, 32459, 32444, 32429,
-32413, 32397, 32381, 32364, 32348,
-32331, 32313, 32294, 32277, 32257,
-32239, 32219, 32200, 32180, 32159,
-32138, 32118, 32096, 32074, 32051,
-32029, 32006, 31984, 31960, 31936,
-31912, 31888, 31863, 31837, 31812,
-31786, 31760, 31734, 31707, 31679,
-31652, 31624, 31596, 31567, 31539,
-31508, 31479, 31450, 31419, 31388,
-31357, 31326, 31294, 31262, 31230,
-31198, 31164, 31131, 31097, 31063,
-31030, 30994, 30959, 30924, 30889,
-30853, 30816, 30779, 30743, 30705,
-30668, 30629, 30592, 30553, 30515,
-30475, 30435, 30396, 30356, 30315,
-30274, 30233, 30191, 30149, 30107,
-30065, 30022, 29979, 29936, 29891,
-29847, 29803, 29758, 29713, 29668,
-29622, 29577, 29529, 29483, 29436,
-29390, 29341, 29293, 29246, 29197,
-29148, 29098, 29050, 29000, 28949,
-28899, 28848, 28797, 28746, 28694,
-28642, 28590, 28537, 28485, 28432,
-28378, 28324, 28271, 28217, 28162,
-28106, 28051, 27995, 27940, 27884,
-27827, 27770, 27713, 27657, 27598,
-27540, 27481, 27423, 27365, 27305,
-27246, 27187, 27126, 27066, 27006,
-26945, 26883, 26822, 26760, 26698,
-26636, 26574, 26510, 26448, 26383,
-26320, 26257, 26191, 26127, 26062,
-25997, 25931, 25866, 25800, 25734,
-25667, 25601, 25533, 25466, 25398,
-25330, 25262, 25194, 25125, 25056,
-24987, 24917, 24848, 24778, 24707,
-24636, 24566, 24495, 24424, 24352,
-24280, 24208, 24135, 24063, 23990,
-23917, 23842, 23769, 23695, 23622,
-23546, 23472, 23398, 23322, 23246,
-23171, 23095, 23018, 22942, 22866,
-22788, 22711, 22634, 22557, 22478,
-22400, 22322, 22244, 22165, 22085,
-22006, 21927, 21846, 21766, 21687,
-21606, 21524, 21443, 21363, 21282,
-21199, 21118, 21035, 20954, 20870,
-20788, 20705, 20621, 20538, 20455,
-20371, 20286, 20202, 20118, 20034,
-19947, 19863, 19777, 19692, 19606,
-19520, 19434, 19347, 19260, 19174,
-19088, 18999, 18911, 18825, 18737,
-18648, 18560, 18472, 18384, 18294,
-18205, 18116, 18025, 17936, 17846,
-17757, 17666, 17576, 17485, 17395,
-17303, 17212, 17122, 17030, 16937,
-16846, 16755, 16662, 16569, 16477,
-16385, 16291, 16198, 16105, 16012,
-15917, 15824, 15730, 15636, 15541,
-15447, 15352, 15257, 15162, 15067,
-14973, 14875, 14781, 14685, 14589,
-14493, 14396, 14300, 14204, 14107,
-14010, 13914, 13815, 13718, 13621,
-13524, 13425, 13328, 13230, 13133,
-13033, 12935, 12836, 12738, 12638,
-12540, 12441, 12341, 12241, 12142,
-12044, 11943, 11843, 11744, 11643,
-11542, 11442, 11342, 11241, 11139,
-11039, 10939, 10836, 10736, 10635,
-10534, 10431, 10330, 10228, 10127,
-10024, 9921, 9820, 9718, 9614,
-9512, 9410, 9306, 9204, 9101,
-8998, 8895, 8791, 8689, 8585,
-8481, 8377, 8274, 8171, 8067,
-7962, 7858, 7753, 7650, 7545,
-7441, 7336, 7231, 7129, 7023,
-6917, 6813, 6709, 6604, 6498,
-6393, 6288, 6182, 6077, 5973,
-5867, 5760, 5656, 5549, 5445,
-5339, 5232, 5127, 5022, 4914,
-4809, 4703, 4596, 4490, 4384,
-4278, 4171, 4065, 3958, 3852,
-3745, 3640, 3532, 3426, 3318,
-3212, 3106, 2998, 2891, 2786,
-2679, 2570, 2465, 2358, 2251,
-2143, 2037, 1929, 1823, 1715,
-1609, 1501, 1393, 1287, 1180,
-1073, 964, 858, 751, 644,
-535, 429, 322, 214, 107,
-0, };
-#endif
-
-static const CELTMode mode48000_960_120 = {
-48000, /* Fs */
-120, /* overlap */
-21, /* nbEBands */
-21, /* effEBands */
-{27853, 0, 4096, 8192, }, /* preemph */
-eband5ms, /* eBands */
-3, /* maxLM */
-8, /* nbShortMdcts */
-120, /* shortMdctSize */
-11, /* nbAllocVectors */
-band_allocation, /* allocVectors */
-logN400, /* logN */
-window120, /* window */
-{1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960}, /* mdct */
-{392, cache_index50, cache_bits50, cache_caps50}, /* cache */
-};
-
-/* List of all the available modes */
-#define TOTAL_MODES 1
-static const CELTMode * const static_mode_list[TOTAL_MODES] = {
-&mode48000_960_120,
-};
diff --git a/src/opus-1.1/celt/static_modes_float.h b/src/opus-1.1/celt/static_modes_float.h
deleted file mode 100644
index 5d7e7b8e..00000000
--- a/src/opus-1.1/celt/static_modes_float.h
+++ /dev/null
@@ -1,599 +0,0 @@
-/* The contents of this file was automatically generated by dump_modes.c
- with arguments: 48000 960
- It contains static definitions for some pre-defined modes. */
-#include "modes.h"
-#include "rate.h"
-
-#ifndef DEF_WINDOW120
-#define DEF_WINDOW120
-static const opus_val16 window120[120] = {
-6.7286966e-05f, 0.00060551348f, 0.0016815970f, 0.0032947962f, 0.0054439943f,
-0.0081276923f, 0.011344001f, 0.015090633f, 0.019364886f, 0.024163635f,
-0.029483315f, 0.035319905f, 0.041668911f, 0.048525347f, 0.055883718f,
-0.063737999f, 0.072081616f, 0.080907428f, 0.090207705f, 0.099974111f,
-0.11019769f, 0.12086883f, 0.13197729f, 0.14351214f, 0.15546177f,
-0.16781389f, 0.18055550f, 0.19367290f, 0.20715171f, 0.22097682f,
-0.23513243f, 0.24960208f, 0.26436860f, 0.27941419f, 0.29472040f,
-0.31026818f, 0.32603788f, 0.34200931f, 0.35816177f, 0.37447407f,
-0.39092462f, 0.40749142f, 0.42415215f, 0.44088423f, 0.45766484f,
-0.47447104f, 0.49127978f, 0.50806798f, 0.52481261f, 0.54149077f,
-0.55807973f, 0.57455701f, 0.59090049f, 0.60708841f, 0.62309951f,
-0.63891306f, 0.65450896f, 0.66986776f, 0.68497077f, 0.69980010f,
-0.71433873f, 0.72857055f, 0.74248043f, 0.75605424f, 0.76927895f,
-0.78214257f, 0.79463430f, 0.80674445f, 0.81846456f, 0.82978733f,
-0.84070669f, 0.85121779f, 0.86131698f, 0.87100183f, 0.88027111f,
-0.88912479f, 0.89756398f, 0.90559094f, 0.91320904f, 0.92042270f,
-0.92723738f, 0.93365955f, 0.93969656f, 0.94535671f, 0.95064907f,
-0.95558353f, 0.96017067f, 0.96442171f, 0.96834849f, 0.97196334f,
-0.97527906f, 0.97830883f, 0.98106616f, 0.98356480f, 0.98581869f,
-0.98784191f, 0.98964856f, 0.99125274f, 0.99266849f, 0.99390969f,
-0.99499004f, 0.99592297f, 0.99672162f, 0.99739874f, 0.99796667f,
-0.99843728f, 0.99882195f, 0.99913147f, 0.99937606f, 0.99956527f,
-0.99970802f, 0.99981248f, 0.99988613f, 0.99993565f, 0.99996697f,
-0.99998518f, 0.99999457f, 0.99999859f, 0.99999982f, 1.0000000f,
-};
-#endif
-
-#ifndef DEF_LOGN400
-#define DEF_LOGN400
-static const opus_int16 logN400[21] = {
-0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 16, 16, 16, 21, 21, 24, 29, 34, 36, };
-#endif
-
-#ifndef DEF_PULSE_CACHE50
-#define DEF_PULSE_CACHE50
-static const opus_int16 cache_index50[105] = {
--1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 41, 41, 41,
-82, 82, 123, 164, 200, 222, 0, 0, 0, 0, 0, 0, 0, 0, 41,
-41, 41, 41, 123, 123, 123, 164, 164, 240, 266, 283, 295, 41, 41, 41,
-41, 41, 41, 41, 41, 123, 123, 123, 123, 240, 240, 240, 266, 266, 305,
-318, 328, 336, 123, 123, 123, 123, 123, 123, 123, 123, 240, 240, 240, 240,
-305, 305, 305, 318, 318, 343, 351, 358, 364, 240, 240, 240, 240, 240, 240,
-240, 240, 305, 305, 305, 305, 343, 343, 343, 351, 351, 370, 376, 382, 387,
-};
-static const unsigned char cache_bits50[392] = {
-40, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 40, 15, 23, 28,
-31, 34, 36, 38, 39, 41, 42, 43, 44, 45, 46, 47, 47, 49, 50,
-51, 52, 53, 54, 55, 55, 57, 58, 59, 60, 61, 62, 63, 63, 65,
-66, 67, 68, 69, 70, 71, 71, 40, 20, 33, 41, 48, 53, 57, 61,
-64, 66, 69, 71, 73, 75, 76, 78, 80, 82, 85, 87, 89, 91, 92,
-94, 96, 98, 101, 103, 105, 107, 108, 110, 112, 114, 117, 119, 121, 123,
-124, 126, 128, 40, 23, 39, 51, 60, 67, 73, 79, 83, 87, 91, 94,
-97, 100, 102, 105, 107, 111, 115, 118, 121, 124, 126, 129, 131, 135, 139,
-142, 145, 148, 150, 153, 155, 159, 163, 166, 169, 172, 174, 177, 179, 35,
-28, 49, 65, 78, 89, 99, 107, 114, 120, 126, 132, 136, 141, 145, 149,
-153, 159, 165, 171, 176, 180, 185, 189, 192, 199, 205, 211, 216, 220, 225,
-229, 232, 239, 245, 251, 21, 33, 58, 79, 97, 112, 125, 137, 148, 157,
-166, 174, 182, 189, 195, 201, 207, 217, 227, 235, 243, 251, 17, 35, 63,
-86, 106, 123, 139, 152, 165, 177, 187, 197, 206, 214, 222, 230, 237, 250,
-25, 31, 55, 75, 91, 105, 117, 128, 138, 146, 154, 161, 168, 174, 180,
-185, 190, 200, 208, 215, 222, 229, 235, 240, 245, 255, 16, 36, 65, 89,
-110, 128, 144, 159, 173, 185, 196, 207, 217, 226, 234, 242, 250, 11, 41,
-74, 103, 128, 151, 172, 191, 209, 225, 241, 255, 9, 43, 79, 110, 138,
-163, 186, 207, 227, 246, 12, 39, 71, 99, 123, 144, 164, 182, 198, 214,
-228, 241, 253, 9, 44, 81, 113, 142, 168, 192, 214, 235, 255, 7, 49,
-90, 127, 160, 191, 220, 247, 6, 51, 95, 134, 170, 203, 234, 7, 47,
-87, 123, 155, 184, 212, 237, 6, 52, 97, 137, 174, 208, 240, 5, 57,
-106, 151, 192, 231, 5, 59, 111, 158, 202, 243, 5, 55, 103, 147, 187,
-224, 5, 60, 113, 161, 206, 248, 4, 65, 122, 175, 224, 4, 67, 127,
-182, 234, };
-static const unsigned char cache_caps50[168] = {
-224, 224, 224, 224, 224, 224, 224, 224, 160, 160, 160, 160, 185, 185, 185,
-178, 178, 168, 134, 61, 37, 224, 224, 224, 224, 224, 224, 224, 224, 240,
-240, 240, 240, 207, 207, 207, 198, 198, 183, 144, 66, 40, 160, 160, 160,
-160, 160, 160, 160, 160, 185, 185, 185, 185, 193, 193, 193, 183, 183, 172,
-138, 64, 38, 240, 240, 240, 240, 240, 240, 240, 240, 207, 207, 207, 207,
-204, 204, 204, 193, 193, 180, 143, 66, 40, 185, 185, 185, 185, 185, 185,
-185, 185, 193, 193, 193, 193, 193, 193, 193, 183, 183, 172, 138, 65, 39,
-207, 207, 207, 207, 207, 207, 207, 207, 204, 204, 204, 204, 201, 201, 201,
-188, 188, 176, 141, 66, 40, 193, 193, 193, 193, 193, 193, 193, 193, 193,
-193, 193, 193, 194, 194, 194, 184, 184, 173, 139, 65, 39, 204, 204, 204,
-204, 204, 204, 204, 204, 201, 201, 201, 201, 198, 198, 198, 187, 187, 175,
-140, 66, 40, };
-#endif
-
-#ifndef FFT_TWIDDLES48000_960
-#define FFT_TWIDDLES48000_960
-static const kiss_twiddle_cpx fft_twiddles48000_960[480] = {
-{1.0000000f, -0.0000000f}, {0.99991433f, -0.013089596f},
-{0.99965732f, -0.026176948f}, {0.99922904f, -0.039259816f},
-{0.99862953f, -0.052335956f}, {0.99785892f, -0.065403129f},
-{0.99691733f, -0.078459096f}, {0.99580493f, -0.091501619f},
-{0.99452190f, -0.10452846f}, {0.99306846f, -0.11753740f},
-{0.99144486f, -0.13052619f}, {0.98965139f, -0.14349262f},
-{0.98768834f, -0.15643447f}, {0.98555606f, -0.16934950f},
-{0.98325491f, -0.18223553f}, {0.98078528f, -0.19509032f},
-{0.97814760f, -0.20791169f}, {0.97534232f, -0.22069744f},
-{0.97236992f, -0.23344536f}, {0.96923091f, -0.24615329f},
-{0.96592583f, -0.25881905f}, {0.96245524f, -0.27144045f},
-{0.95881973f, -0.28401534f}, {0.95501994f, -0.29654157f},
-{0.95105652f, -0.30901699f}, {0.94693013f, -0.32143947f},
-{0.94264149f, -0.33380686f}, {0.93819134f, -0.34611706f},
-{0.93358043f, -0.35836795f}, {0.92880955f, -0.37055744f},
-{0.92387953f, -0.38268343f}, {0.91879121f, -0.39474386f},
-{0.91354546f, -0.40673664f}, {0.90814317f, -0.41865974f},
-{0.90258528f, -0.43051110f}, {0.89687274f, -0.44228869f},
-{0.89100652f, -0.45399050f}, {0.88498764f, -0.46561452f},
-{0.87881711f, -0.47715876f}, {0.87249601f, -0.48862124f},
-{0.86602540f, -0.50000000f}, {0.85940641f, -0.51129309f},
-{0.85264016f, -0.52249856f}, {0.84572782f, -0.53361452f},
-{0.83867057f, -0.54463904f}, {0.83146961f, -0.55557023f},
-{0.82412619f, -0.56640624f}, {0.81664156f, -0.57714519f},
-{0.80901699f, -0.58778525f}, {0.80125381f, -0.59832460f},
-{0.79335334f, -0.60876143f}, {0.78531693f, -0.61909395f},
-{0.77714596f, -0.62932039f}, {0.76884183f, -0.63943900f},
-{0.76040597f, -0.64944805f}, {0.75183981f, -0.65934582f},
-{0.74314483f, -0.66913061f}, {0.73432251f, -0.67880075f},
-{0.72537437f, -0.68835458f}, {0.71630194f, -0.69779046f},
-{0.70710678f, -0.70710678f}, {0.69779046f, -0.71630194f},
-{0.68835458f, -0.72537437f}, {0.67880075f, -0.73432251f},
-{0.66913061f, -0.74314483f}, {0.65934582f, -0.75183981f},
-{0.64944805f, -0.76040597f}, {0.63943900f, -0.76884183f},
-{0.62932039f, -0.77714596f}, {0.61909395f, -0.78531693f},
-{0.60876143f, -0.79335334f}, {0.59832460f, -0.80125381f},
-{0.58778525f, -0.80901699f}, {0.57714519f, -0.81664156f},
-{0.56640624f, -0.82412619f}, {0.55557023f, -0.83146961f},
-{0.54463904f, -0.83867057f}, {0.53361452f, -0.84572782f},
-{0.52249856f, -0.85264016f}, {0.51129309f, -0.85940641f},
-{0.50000000f, -0.86602540f}, {0.48862124f, -0.87249601f},
-{0.47715876f, -0.87881711f}, {0.46561452f, -0.88498764f},
-{0.45399050f, -0.89100652f}, {0.44228869f, -0.89687274f},
-{0.43051110f, -0.90258528f}, {0.41865974f, -0.90814317f},
-{0.40673664f, -0.91354546f}, {0.39474386f, -0.91879121f},
-{0.38268343f, -0.92387953f}, {0.37055744f, -0.92880955f},
-{0.35836795f, -0.93358043f}, {0.34611706f, -0.93819134f},
-{0.33380686f, -0.94264149f}, {0.32143947f, -0.94693013f},
-{0.30901699f, -0.95105652f}, {0.29654157f, -0.95501994f},
-{0.28401534f, -0.95881973f}, {0.27144045f, -0.96245524f},
-{0.25881905f, -0.96592583f}, {0.24615329f, -0.96923091f},
-{0.23344536f, -0.97236992f}, {0.22069744f, -0.97534232f},
-{0.20791169f, -0.97814760f}, {0.19509032f, -0.98078528f},
-{0.18223553f, -0.98325491f}, {0.16934950f, -0.98555606f},
-{0.15643447f, -0.98768834f}, {0.14349262f, -0.98965139f},
-{0.13052619f, -0.99144486f}, {0.11753740f, -0.99306846f},
-{0.10452846f, -0.99452190f}, {0.091501619f, -0.99580493f},
-{0.078459096f, -0.99691733f}, {0.065403129f, -0.99785892f},
-{0.052335956f, -0.99862953f}, {0.039259816f, -0.99922904f},
-{0.026176948f, -0.99965732f}, {0.013089596f, -0.99991433f},
-{6.1230318e-17f, -1.0000000f}, {-0.013089596f, -0.99991433f},
-{-0.026176948f, -0.99965732f}, {-0.039259816f, -0.99922904f},
-{-0.052335956f, -0.99862953f}, {-0.065403129f, -0.99785892f},
-{-0.078459096f, -0.99691733f}, {-0.091501619f, -0.99580493f},
-{-0.10452846f, -0.99452190f}, {-0.11753740f, -0.99306846f},
-{-0.13052619f, -0.99144486f}, {-0.14349262f, -0.98965139f},
-{-0.15643447f, -0.98768834f}, {-0.16934950f, -0.98555606f},
-{-0.18223553f, -0.98325491f}, {-0.19509032f, -0.98078528f},
-{-0.20791169f, -0.97814760f}, {-0.22069744f, -0.97534232f},
-{-0.23344536f, -0.97236992f}, {-0.24615329f, -0.96923091f},
-{-0.25881905f, -0.96592583f}, {-0.27144045f, -0.96245524f},
-{-0.28401534f, -0.95881973f}, {-0.29654157f, -0.95501994f},
-{-0.30901699f, -0.95105652f}, {-0.32143947f, -0.94693013f},
-{-0.33380686f, -0.94264149f}, {-0.34611706f, -0.93819134f},
-{-0.35836795f, -0.93358043f}, {-0.37055744f, -0.92880955f},
-{-0.38268343f, -0.92387953f}, {-0.39474386f, -0.91879121f},
-{-0.40673664f, -0.91354546f}, {-0.41865974f, -0.90814317f},
-{-0.43051110f, -0.90258528f}, {-0.44228869f, -0.89687274f},
-{-0.45399050f, -0.89100652f}, {-0.46561452f, -0.88498764f},
-{-0.47715876f, -0.87881711f}, {-0.48862124f, -0.87249601f},
-{-0.50000000f, -0.86602540f}, {-0.51129309f, -0.85940641f},
-{-0.52249856f, -0.85264016f}, {-0.53361452f, -0.84572782f},
-{-0.54463904f, -0.83867057f}, {-0.55557023f, -0.83146961f},
-{-0.56640624f, -0.82412619f}, {-0.57714519f, -0.81664156f},
-{-0.58778525f, -0.80901699f}, {-0.59832460f, -0.80125381f},
-{-0.60876143f, -0.79335334f}, {-0.61909395f, -0.78531693f},
-{-0.62932039f, -0.77714596f}, {-0.63943900f, -0.76884183f},
-{-0.64944805f, -0.76040597f}, {-0.65934582f, -0.75183981f},
-{-0.66913061f, -0.74314483f}, {-0.67880075f, -0.73432251f},
-{-0.68835458f, -0.72537437f}, {-0.69779046f, -0.71630194f},
-{-0.70710678f, -0.70710678f}, {-0.71630194f, -0.69779046f},
-{-0.72537437f, -0.68835458f}, {-0.73432251f, -0.67880075f},
-{-0.74314483f, -0.66913061f}, {-0.75183981f, -0.65934582f},
-{-0.76040597f, -0.64944805f}, {-0.76884183f, -0.63943900f},
-{-0.77714596f, -0.62932039f}, {-0.78531693f, -0.61909395f},
-{-0.79335334f, -0.60876143f}, {-0.80125381f, -0.59832460f},
-{-0.80901699f, -0.58778525f}, {-0.81664156f, -0.57714519f},
-{-0.82412619f, -0.56640624f}, {-0.83146961f, -0.55557023f},
-{-0.83867057f, -0.54463904f}, {-0.84572782f, -0.53361452f},
-{-0.85264016f, -0.52249856f}, {-0.85940641f, -0.51129309f},
-{-0.86602540f, -0.50000000f}, {-0.87249601f, -0.48862124f},
-{-0.87881711f, -0.47715876f}, {-0.88498764f, -0.46561452f},
-{-0.89100652f, -0.45399050f}, {-0.89687274f, -0.44228869f},
-{-0.90258528f, -0.43051110f}, {-0.90814317f, -0.41865974f},
-{-0.91354546f, -0.40673664f}, {-0.91879121f, -0.39474386f},
-{-0.92387953f, -0.38268343f}, {-0.92880955f, -0.37055744f},
-{-0.93358043f, -0.35836795f}, {-0.93819134f, -0.34611706f},
-{-0.94264149f, -0.33380686f}, {-0.94693013f, -0.32143947f},
-{-0.95105652f, -0.30901699f}, {-0.95501994f, -0.29654157f},
-{-0.95881973f, -0.28401534f}, {-0.96245524f, -0.27144045f},
-{-0.96592583f, -0.25881905f}, {-0.96923091f, -0.24615329f},
-{-0.97236992f, -0.23344536f}, {-0.97534232f, -0.22069744f},
-{-0.97814760f, -0.20791169f}, {-0.98078528f, -0.19509032f},
-{-0.98325491f, -0.18223553f}, {-0.98555606f, -0.16934950f},
-{-0.98768834f, -0.15643447f}, {-0.98965139f, -0.14349262f},
-{-0.99144486f, -0.13052619f}, {-0.99306846f, -0.11753740f},
-{-0.99452190f, -0.10452846f}, {-0.99580493f, -0.091501619f},
-{-0.99691733f, -0.078459096f}, {-0.99785892f, -0.065403129f},
-{-0.99862953f, -0.052335956f}, {-0.99922904f, -0.039259816f},
-{-0.99965732f, -0.026176948f}, {-0.99991433f, -0.013089596f},
-{-1.0000000f, -1.2246064e-16f}, {-0.99991433f, 0.013089596f},
-{-0.99965732f, 0.026176948f}, {-0.99922904f, 0.039259816f},
-{-0.99862953f, 0.052335956f}, {-0.99785892f, 0.065403129f},
-{-0.99691733f, 0.078459096f}, {-0.99580493f, 0.091501619f},
-{-0.99452190f, 0.10452846f}, {-0.99306846f, 0.11753740f},
-{-0.99144486f, 0.13052619f}, {-0.98965139f, 0.14349262f},
-{-0.98768834f, 0.15643447f}, {-0.98555606f, 0.16934950f},
-{-0.98325491f, 0.18223553f}, {-0.98078528f, 0.19509032f},
-{-0.97814760f, 0.20791169f}, {-0.97534232f, 0.22069744f},
-{-0.97236992f, 0.23344536f}, {-0.96923091f, 0.24615329f},
-{-0.96592583f, 0.25881905f}, {-0.96245524f, 0.27144045f},
-{-0.95881973f, 0.28401534f}, {-0.95501994f, 0.29654157f},
-{-0.95105652f, 0.30901699f}, {-0.94693013f, 0.32143947f},
-{-0.94264149f, 0.33380686f}, {-0.93819134f, 0.34611706f},
-{-0.93358043f, 0.35836795f}, {-0.92880955f, 0.37055744f},
-{-0.92387953f, 0.38268343f}, {-0.91879121f, 0.39474386f},
-{-0.91354546f, 0.40673664f}, {-0.90814317f, 0.41865974f},
-{-0.90258528f, 0.43051110f}, {-0.89687274f, 0.44228869f},
-{-0.89100652f, 0.45399050f}, {-0.88498764f, 0.46561452f},
-{-0.87881711f, 0.47715876f}, {-0.87249601f, 0.48862124f},
-{-0.86602540f, 0.50000000f}, {-0.85940641f, 0.51129309f},
-{-0.85264016f, 0.52249856f}, {-0.84572782f, 0.53361452f},
-{-0.83867057f, 0.54463904f}, {-0.83146961f, 0.55557023f},
-{-0.82412619f, 0.56640624f}, {-0.81664156f, 0.57714519f},
-{-0.80901699f, 0.58778525f}, {-0.80125381f, 0.59832460f},
-{-0.79335334f, 0.60876143f}, {-0.78531693f, 0.61909395f},
-{-0.77714596f, 0.62932039f}, {-0.76884183f, 0.63943900f},
-{-0.76040597f, 0.64944805f}, {-0.75183981f, 0.65934582f},
-{-0.74314483f, 0.66913061f}, {-0.73432251f, 0.67880075f},
-{-0.72537437f, 0.68835458f}, {-0.71630194f, 0.69779046f},
-{-0.70710678f, 0.70710678f}, {-0.69779046f, 0.71630194f},
-{-0.68835458f, 0.72537437f}, {-0.67880075f, 0.73432251f},
-{-0.66913061f, 0.74314483f}, {-0.65934582f, 0.75183981f},
-{-0.64944805f, 0.76040597f}, {-0.63943900f, 0.76884183f},
-{-0.62932039f, 0.77714596f}, {-0.61909395f, 0.78531693f},
-{-0.60876143f, 0.79335334f}, {-0.59832460f, 0.80125381f},
-{-0.58778525f, 0.80901699f}, {-0.57714519f, 0.81664156f},
-{-0.56640624f, 0.82412619f}, {-0.55557023f, 0.83146961f},
-{-0.54463904f, 0.83867057f}, {-0.53361452f, 0.84572782f},
-{-0.52249856f, 0.85264016f}, {-0.51129309f, 0.85940641f},
-{-0.50000000f, 0.86602540f}, {-0.48862124f, 0.87249601f},
-{-0.47715876f, 0.87881711f}, {-0.46561452f, 0.88498764f},
-{-0.45399050f, 0.89100652f}, {-0.44228869f, 0.89687274f},
-{-0.43051110f, 0.90258528f}, {-0.41865974f, 0.90814317f},
-{-0.40673664f, 0.91354546f}, {-0.39474386f, 0.91879121f},
-{-0.38268343f, 0.92387953f}, {-0.37055744f, 0.92880955f},
-{-0.35836795f, 0.93358043f}, {-0.34611706f, 0.93819134f},
-{-0.33380686f, 0.94264149f}, {-0.32143947f, 0.94693013f},
-{-0.30901699f, 0.95105652f}, {-0.29654157f, 0.95501994f},
-{-0.28401534f, 0.95881973f}, {-0.27144045f, 0.96245524f},
-{-0.25881905f, 0.96592583f}, {-0.24615329f, 0.96923091f},
-{-0.23344536f, 0.97236992f}, {-0.22069744f, 0.97534232f},
-{-0.20791169f, 0.97814760f}, {-0.19509032f, 0.98078528f},
-{-0.18223553f, 0.98325491f}, {-0.16934950f, 0.98555606f},
-{-0.15643447f, 0.98768834f}, {-0.14349262f, 0.98965139f},
-{-0.13052619f, 0.99144486f}, {-0.11753740f, 0.99306846f},
-{-0.10452846f, 0.99452190f}, {-0.091501619f, 0.99580493f},
-{-0.078459096f, 0.99691733f}, {-0.065403129f, 0.99785892f},
-{-0.052335956f, 0.99862953f}, {-0.039259816f, 0.99922904f},
-{-0.026176948f, 0.99965732f}, {-0.013089596f, 0.99991433f},
-{-1.8369095e-16f, 1.0000000f}, {0.013089596f, 0.99991433f},
-{0.026176948f, 0.99965732f}, {0.039259816f, 0.99922904f},
-{0.052335956f, 0.99862953f}, {0.065403129f, 0.99785892f},
-{0.078459096f, 0.99691733f}, {0.091501619f, 0.99580493f},
-{0.10452846f, 0.99452190f}, {0.11753740f, 0.99306846f},
-{0.13052619f, 0.99144486f}, {0.14349262f, 0.98965139f},
-{0.15643447f, 0.98768834f}, {0.16934950f, 0.98555606f},
-{0.18223553f, 0.98325491f}, {0.19509032f, 0.98078528f},
-{0.20791169f, 0.97814760f}, {0.22069744f, 0.97534232f},
-{0.23344536f, 0.97236992f}, {0.24615329f, 0.96923091f},
-{0.25881905f, 0.96592583f}, {0.27144045f, 0.96245524f},
-{0.28401534f, 0.95881973f}, {0.29654157f, 0.95501994f},
-{0.30901699f, 0.95105652f}, {0.32143947f, 0.94693013f},
-{0.33380686f, 0.94264149f}, {0.34611706f, 0.93819134f},
-{0.35836795f, 0.93358043f}, {0.37055744f, 0.92880955f},
-{0.38268343f, 0.92387953f}, {0.39474386f, 0.91879121f},
-{0.40673664f, 0.91354546f}, {0.41865974f, 0.90814317f},
-{0.43051110f, 0.90258528f}, {0.44228869f, 0.89687274f},
-{0.45399050f, 0.89100652f}, {0.46561452f, 0.88498764f},
-{0.47715876f, 0.87881711f}, {0.48862124f, 0.87249601f},
-{0.50000000f, 0.86602540f}, {0.51129309f, 0.85940641f},
-{0.52249856f, 0.85264016f}, {0.53361452f, 0.84572782f},
-{0.54463904f, 0.83867057f}, {0.55557023f, 0.83146961f},
-{0.56640624f, 0.82412619f}, {0.57714519f, 0.81664156f},
-{0.58778525f, 0.80901699f}, {0.59832460f, 0.80125381f},
-{0.60876143f, 0.79335334f}, {0.61909395f, 0.78531693f},
-{0.62932039f, 0.77714596f}, {0.63943900f, 0.76884183f},
-{0.64944805f, 0.76040597f}, {0.65934582f, 0.75183981f},
-{0.66913061f, 0.74314483f}, {0.67880075f, 0.73432251f},
-{0.68835458f, 0.72537437f}, {0.69779046f, 0.71630194f},
-{0.70710678f, 0.70710678f}, {0.71630194f, 0.69779046f},
-{0.72537437f, 0.68835458f}, {0.73432251f, 0.67880075f},
-{0.74314483f, 0.66913061f}, {0.75183981f, 0.65934582f},
-{0.76040597f, 0.64944805f}, {0.76884183f, 0.63943900f},
-{0.77714596f, 0.62932039f}, {0.78531693f, 0.61909395f},
-{0.79335334f, 0.60876143f}, {0.80125381f, 0.59832460f},
-{0.80901699f, 0.58778525f}, {0.81664156f, 0.57714519f},
-{0.82412619f, 0.56640624f}, {0.83146961f, 0.55557023f},
-{0.83867057f, 0.54463904f}, {0.84572782f, 0.53361452f},
-{0.85264016f, 0.52249856f}, {0.85940641f, 0.51129309f},
-{0.86602540f, 0.50000000f}, {0.87249601f, 0.48862124f},
-{0.87881711f, 0.47715876f}, {0.88498764f, 0.46561452f},
-{0.89100652f, 0.45399050f}, {0.89687274f, 0.44228869f},
-{0.90258528f, 0.43051110f}, {0.90814317f, 0.41865974f},
-{0.91354546f, 0.40673664f}, {0.91879121f, 0.39474386f},
-{0.92387953f, 0.38268343f}, {0.92880955f, 0.37055744f},
-{0.93358043f, 0.35836795f}, {0.93819134f, 0.34611706f},
-{0.94264149f, 0.33380686f}, {0.94693013f, 0.32143947f},
-{0.95105652f, 0.30901699f}, {0.95501994f, 0.29654157f},
-{0.95881973f, 0.28401534f}, {0.96245524f, 0.27144045f},
-{0.96592583f, 0.25881905f}, {0.96923091f, 0.24615329f},
-{0.97236992f, 0.23344536f}, {0.97534232f, 0.22069744f},
-{0.97814760f, 0.20791169f}, {0.98078528f, 0.19509032f},
-{0.98325491f, 0.18223553f}, {0.98555606f, 0.16934950f},
-{0.98768834f, 0.15643447f}, {0.98965139f, 0.14349262f},
-{0.99144486f, 0.13052619f}, {0.99306846f, 0.11753740f},
-{0.99452190f, 0.10452846f}, {0.99580493f, 0.091501619f},
-{0.99691733f, 0.078459096f}, {0.99785892f, 0.065403129f},
-{0.99862953f, 0.052335956f}, {0.99922904f, 0.039259816f},
-{0.99965732f, 0.026176948f}, {0.99991433f, 0.013089596f},
-};
-#ifndef FFT_BITREV480
-#define FFT_BITREV480
-static const opus_int16 fft_bitrev480[480] = {
-0, 120, 240, 360, 30, 150, 270, 390, 60, 180, 300, 420, 90, 210, 330,
-450, 15, 135, 255, 375, 45, 165, 285, 405, 75, 195, 315, 435, 105, 225,
-345, 465, 5, 125, 245, 365, 35, 155, 275, 395, 65, 185, 305, 425, 95,
-215, 335, 455, 20, 140, 260, 380, 50, 170, 290, 410, 80, 200, 320, 440,
-110, 230, 350, 470, 10, 130, 250, 370, 40, 160, 280, 400, 70, 190, 310,
-430, 100, 220, 340, 460, 25, 145, 265, 385, 55, 175, 295, 415, 85, 205,
-325, 445, 115, 235, 355, 475, 1, 121, 241, 361, 31, 151, 271, 391, 61,
-181, 301, 421, 91, 211, 331, 451, 16, 136, 256, 376, 46, 166, 286, 406,
-76, 196, 316, 436, 106, 226, 346, 466, 6, 126, 246, 366, 36, 156, 276,
-396, 66, 186, 306, 426, 96, 216, 336, 456, 21, 141, 261, 381, 51, 171,
-291, 411, 81, 201, 321, 441, 111, 231, 351, 471, 11, 131, 251, 371, 41,
-161, 281, 401, 71, 191, 311, 431, 101, 221, 341, 461, 26, 146, 266, 386,
-56, 176, 296, 416, 86, 206, 326, 446, 116, 236, 356, 476, 2, 122, 242,
-362, 32, 152, 272, 392, 62, 182, 302, 422, 92, 212, 332, 452, 17, 137,
-257, 377, 47, 167, 287, 407, 77, 197, 317, 437, 107, 227, 347, 467, 7,
-127, 247, 367, 37, 157, 277, 397, 67, 187, 307, 427, 97, 217, 337, 457,
-22, 142, 262, 382, 52, 172, 292, 412, 82, 202, 322, 442, 112, 232, 352,
-472, 12, 132, 252, 372, 42, 162, 282, 402, 72, 192, 312, 432, 102, 222,
-342, 462, 27, 147, 267, 387, 57, 177, 297, 417, 87, 207, 327, 447, 117,
-237, 357, 477, 3, 123, 243, 363, 33, 153, 273, 393, 63, 183, 303, 423,
-93, 213, 333, 453, 18, 138, 258, 378, 48, 168, 288, 408, 78, 198, 318,
-438, 108, 228, 348, 468, 8, 128, 248, 368, 38, 158, 278, 398, 68, 188,
-308, 428, 98, 218, 338, 458, 23, 143, 263, 383, 53, 173, 293, 413, 83,
-203, 323, 443, 113, 233, 353, 473, 13, 133, 253, 373, 43, 163, 283, 403,
-73, 193, 313, 433, 103, 223, 343, 463, 28, 148, 268, 388, 58, 178, 298,
-418, 88, 208, 328, 448, 118, 238, 358, 478, 4, 124, 244, 364, 34, 154,
-274, 394, 64, 184, 304, 424, 94, 214, 334, 454, 19, 139, 259, 379, 49,
-169, 289, 409, 79, 199, 319, 439, 109, 229, 349, 469, 9, 129, 249, 369,
-39, 159, 279, 399, 69, 189, 309, 429, 99, 219, 339, 459, 24, 144, 264,
-384, 54, 174, 294, 414, 84, 204, 324, 444, 114, 234, 354, 474, 14, 134,
-254, 374, 44, 164, 284, 404, 74, 194, 314, 434, 104, 224, 344, 464, 29,
-149, 269, 389, 59, 179, 299, 419, 89, 209, 329, 449, 119, 239, 359, 479,
-};
-#endif
-
-#ifndef FFT_BITREV240
-#define FFT_BITREV240
-static const opus_int16 fft_bitrev240[240] = {
-0, 60, 120, 180, 15, 75, 135, 195, 30, 90, 150, 210, 45, 105, 165,
-225, 5, 65, 125, 185, 20, 80, 140, 200, 35, 95, 155, 215, 50, 110,
-170, 230, 10, 70, 130, 190, 25, 85, 145, 205, 40, 100, 160, 220, 55,
-115, 175, 235, 1, 61, 121, 181, 16, 76, 136, 196, 31, 91, 151, 211,
-46, 106, 166, 226, 6, 66, 126, 186, 21, 81, 141, 201, 36, 96, 156,
-216, 51, 111, 171, 231, 11, 71, 131, 191, 26, 86, 146, 206, 41, 101,
-161, 221, 56, 116, 176, 236, 2, 62, 122, 182, 17, 77, 137, 197, 32,
-92, 152, 212, 47, 107, 167, 227, 7, 67, 127, 187, 22, 82, 142, 202,
-37, 97, 157, 217, 52, 112, 172, 232, 12, 72, 132, 192, 27, 87, 147,
-207, 42, 102, 162, 222, 57, 117, 177, 237, 3, 63, 123, 183, 18, 78,
-138, 198, 33, 93, 153, 213, 48, 108, 168, 228, 8, 68, 128, 188, 23,
-83, 143, 203, 38, 98, 158, 218, 53, 113, 173, 233, 13, 73, 133, 193,
-28, 88, 148, 208, 43, 103, 163, 223, 58, 118, 178, 238, 4, 64, 124,
-184, 19, 79, 139, 199, 34, 94, 154, 214, 49, 109, 169, 229, 9, 69,
-129, 189, 24, 84, 144, 204, 39, 99, 159, 219, 54, 114, 174, 234, 14,
-74, 134, 194, 29, 89, 149, 209, 44, 104, 164, 224, 59, 119, 179, 239,
-};
-#endif
-
-#ifndef FFT_BITREV120
-#define FFT_BITREV120
-static const opus_int16 fft_bitrev120[120] = {
-0, 30, 60, 90, 15, 45, 75, 105, 5, 35, 65, 95, 20, 50, 80,
-110, 10, 40, 70, 100, 25, 55, 85, 115, 1, 31, 61, 91, 16, 46,
-76, 106, 6, 36, 66, 96, 21, 51, 81, 111, 11, 41, 71, 101, 26,
-56, 86, 116, 2, 32, 62, 92, 17, 47, 77, 107, 7, 37, 67, 97,
-22, 52, 82, 112, 12, 42, 72, 102, 27, 57, 87, 117, 3, 33, 63,
-93, 18, 48, 78, 108, 8, 38, 68, 98, 23, 53, 83, 113, 13, 43,
-73, 103, 28, 58, 88, 118, 4, 34, 64, 94, 19, 49, 79, 109, 9,
-39, 69, 99, 24, 54, 84, 114, 14, 44, 74, 104, 29, 59, 89, 119,
-};
-#endif
-
-#ifndef FFT_BITREV60
-#define FFT_BITREV60
-static const opus_int16 fft_bitrev60[60] = {
-0, 15, 30, 45, 5, 20, 35, 50, 10, 25, 40, 55, 1, 16, 31,
-46, 6, 21, 36, 51, 11, 26, 41, 56, 2, 17, 32, 47, 7, 22,
-37, 52, 12, 27, 42, 57, 3, 18, 33, 48, 8, 23, 38, 53, 13,
-28, 43, 58, 4, 19, 34, 49, 9, 24, 39, 54, 14, 29, 44, 59,
-};
-#endif
-
-#ifndef FFT_STATE48000_960_0
-#define FFT_STATE48000_960_0
-static const kiss_fft_state fft_state48000_960_0 = {
-480, /* nfft */
-0.002083333f, /* scale */
--1, /* shift */
-{4, 120, 4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, }, /* factors */
-fft_bitrev480, /* bitrev */
-fft_twiddles48000_960, /* bitrev */
-};
-#endif
-
-#ifndef FFT_STATE48000_960_1
-#define FFT_STATE48000_960_1
-static const kiss_fft_state fft_state48000_960_1 = {
-240, /* nfft */
-0.004166667f, /* scale */
-1, /* shift */
-{4, 60, 4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
-fft_bitrev240, /* bitrev */
-fft_twiddles48000_960, /* bitrev */
-};
-#endif
-
-#ifndef FFT_STATE48000_960_2
-#define FFT_STATE48000_960_2
-static const kiss_fft_state fft_state48000_960_2 = {
-120, /* nfft */
-0.008333333f, /* scale */
-2, /* shift */
-{4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
-fft_bitrev120, /* bitrev */
-fft_twiddles48000_960, /* bitrev */
-};
-#endif
-
-#ifndef FFT_STATE48000_960_3
-#define FFT_STATE48000_960_3
-static const kiss_fft_state fft_state48000_960_3 = {
-60, /* nfft */
-0.016666667f, /* scale */
-3, /* shift */
-{4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */
-fft_bitrev60, /* bitrev */
-fft_twiddles48000_960, /* bitrev */
-};
-#endif
-
-#endif
-
-#ifndef MDCT_TWIDDLES960
-#define MDCT_TWIDDLES960
-static const opus_val16 mdct_twiddles960[481] = {
-1.0000000f, 0.99999465f, 0.99997858f, 0.99995181f, 0.99991433f,
-0.99986614f, 0.99980724f, 0.99973764f, 0.99965732f, 0.99956631f,
-0.99946459f, 0.99935216f, 0.99922904f, 0.99909521f, 0.99895068f,
-0.99879546f, 0.99862953f, 0.99845292f, 0.99826561f, 0.99806761f,
-0.99785892f, 0.99763955f, 0.99740949f, 0.99716875f, 0.99691733f,
-0.99665524f, 0.99638247f, 0.99609903f, 0.99580493f, 0.99550016f,
-0.99518473f, 0.99485864f, 0.99452190f, 0.99417450f, 0.99381646f,
-0.99344778f, 0.99306846f, 0.99267850f, 0.99227791f, 0.99186670f,
-0.99144486f, 0.99101241f, 0.99056934f, 0.99011566f, 0.98965139f,
-0.98917651f, 0.98869104f, 0.98819498f, 0.98768834f, 0.98717112f,
-0.98664333f, 0.98610497f, 0.98555606f, 0.98499659f, 0.98442657f,
-0.98384600f, 0.98325491f, 0.98265328f, 0.98204113f, 0.98141846f,
-0.98078528f, 0.98014159f, 0.97948742f, 0.97882275f, 0.97814760f,
-0.97746197f, 0.97676588f, 0.97605933f, 0.97534232f, 0.97461487f,
-0.97387698f, 0.97312866f, 0.97236992f, 0.97160077f, 0.97082121f,
-0.97003125f, 0.96923091f, 0.96842019f, 0.96759909f, 0.96676764f,
-0.96592582f, 0.96507367f, 0.96421118f, 0.96333837f, 0.96245523f,
-0.96156180f, 0.96065806f, 0.95974403f, 0.95881973f, 0.95788517f,
-0.95694034f, 0.95598526f, 0.95501995f, 0.95404440f, 0.95305864f,
-0.95206267f, 0.95105651f, 0.95004016f, 0.94901364f, 0.94797697f,
-0.94693013f, 0.94587315f, 0.94480604f, 0.94372882f, 0.94264149f,
-0.94154406f, 0.94043656f, 0.93931897f, 0.93819133f, 0.93705365f,
-0.93590592f, 0.93474818f, 0.93358042f, 0.93240268f, 0.93121493f,
-0.93001722f, 0.92880955f, 0.92759193f, 0.92636438f, 0.92512690f,
-0.92387953f, 0.92262225f, 0.92135509f, 0.92007809f, 0.91879121f,
-0.91749449f, 0.91618795f, 0.91487161f, 0.91354545f, 0.91220952f,
-0.91086382f, 0.90950836f, 0.90814316f, 0.90676824f, 0.90538363f,
-0.90398929f, 0.90258528f, 0.90117161f, 0.89974828f, 0.89831532f,
-0.89687273f, 0.89542055f, 0.89395877f, 0.89248742f, 0.89100652f,
-0.88951606f, 0.88801610f, 0.88650661f, 0.88498764f, 0.88345918f,
-0.88192125f, 0.88037390f, 0.87881711f, 0.87725090f, 0.87567531f,
-0.87409035f, 0.87249599f, 0.87089232f, 0.86927933f, 0.86765699f,
-0.86602540f, 0.86438453f, 0.86273437f, 0.86107503f, 0.85940641f,
-0.85772862f, 0.85604161f, 0.85434547f, 0.85264014f, 0.85092572f,
-0.84920218f, 0.84746955f, 0.84572781f, 0.84397704f, 0.84221721f,
-0.84044838f, 0.83867056f, 0.83688375f, 0.83508799f, 0.83328325f,
-0.83146961f, 0.82964704f, 0.82781562f, 0.82597530f, 0.82412620f,
-0.82226820f, 0.82040144f, 0.81852589f, 0.81664154f, 0.81474847f,
-0.81284665f, 0.81093620f, 0.80901698f, 0.80708914f, 0.80515262f,
-0.80320752f, 0.80125378f, 0.79929149f, 0.79732067f, 0.79534125f,
-0.79335335f, 0.79135691f, 0.78935204f, 0.78733867f, 0.78531691f,
-0.78328674f, 0.78124818f, 0.77920122f, 0.77714595f, 0.77508232f,
-0.77301043f, 0.77093026f, 0.76884183f, 0.76674517f, 0.76464026f,
-0.76252720f, 0.76040593f, 0.75827656f, 0.75613907f, 0.75399349f,
-0.75183978f, 0.74967807f, 0.74750833f, 0.74533054f, 0.74314481f,
-0.74095112f, 0.73874950f, 0.73653993f, 0.73432251f, 0.73209718f,
-0.72986405f, 0.72762307f, 0.72537438f, 0.72311787f, 0.72085359f,
-0.71858162f, 0.71630192f, 0.71401459f, 0.71171956f, 0.70941701f,
-0.70710677f, 0.70478900f, 0.70246363f, 0.70013079f, 0.69779041f,
-0.69544260f, 0.69308738f, 0.69072466f, 0.68835458f, 0.68597709f,
-0.68359229f, 0.68120013f, 0.67880072f, 0.67639404f, 0.67398011f,
-0.67155892f, 0.66913059f, 0.66669509f, 0.66425240f, 0.66180265f,
-0.65934581f, 0.65688191f, 0.65441092f, 0.65193298f, 0.64944801f,
-0.64695613f, 0.64445727f, 0.64195160f, 0.63943902f, 0.63691954f,
-0.63439328f, 0.63186019f, 0.62932037f, 0.62677377f, 0.62422055f,
-0.62166055f, 0.61909394f, 0.61652065f, 0.61394081f, 0.61135435f,
-0.60876139f, 0.60616195f, 0.60355593f, 0.60094349f, 0.59832457f,
-0.59569929f, 0.59306758f, 0.59042957f, 0.58778523f, 0.58513460f,
-0.58247766f, 0.57981452f, 0.57714518f, 0.57446961f, 0.57178793f,
-0.56910013f, 0.56640624f, 0.56370623f, 0.56100023f, 0.55828818f,
-0.55557020f, 0.55284627f, 0.55011641f, 0.54738067f, 0.54463901f,
-0.54189157f, 0.53913828f, 0.53637921f, 0.53361450f, 0.53084398f,
-0.52806787f, 0.52528601f, 0.52249852f, 0.51970543f, 0.51690688f,
-0.51410279f, 0.51129310f, 0.50847793f, 0.50565732f, 0.50283139f,
-0.49999997f, 0.49716321f, 0.49432122f, 0.49147383f, 0.48862118f,
-0.48576340f, 0.48290042f, 0.48003216f, 0.47715876f, 0.47428025f,
-0.47139677f, 0.46850813f, 0.46561448f, 0.46271584f, 0.45981235f,
-0.45690383f, 0.45399042f, 0.45107214f, 0.44814915f, 0.44522124f,
-0.44228868f, 0.43935137f, 0.43640926f, 0.43346247f, 0.43051104f,
-0.42755511f, 0.42459449f, 0.42162932f, 0.41865964f, 0.41568558f,
-0.41270697f, 0.40972393f, 0.40673661f, 0.40374494f, 0.40074884f,
-0.39774844f, 0.39474390f, 0.39173501f, 0.38872193f, 0.38570469f,
-0.38268343f, 0.37965796f, 0.37662842f, 0.37359496f, 0.37055739f,
-0.36751585f, 0.36447038f, 0.36142122f, 0.35836797f, 0.35531089f,
-0.35225000f, 0.34918544f, 0.34611704f, 0.34304493f, 0.33996926f,
-0.33688983f, 0.33380680f, 0.33072019f, 0.32763015f, 0.32453650f,
-0.32143936f, 0.31833890f, 0.31523503f, 0.31212767f, 0.30901696f,
-0.30590306f, 0.30278577f, 0.29966524f, 0.29654150f, 0.29341470f,
-0.29028464f, 0.28715147f, 0.28401522f, 0.28087605f, 0.27773376f,
-0.27458861f, 0.27144052f, 0.26828940f, 0.26513541f, 0.26197859f,
-0.25881907f, 0.25565666f, 0.25249152f, 0.24932367f, 0.24615327f,
-0.24298012f, 0.23980436f, 0.23662604f, 0.23344530f, 0.23026206f,
-0.22707623f, 0.22388809f, 0.22069744f, 0.21750443f, 0.21430908f,
-0.21111156f, 0.20791165f, 0.20470953f, 0.20150520f, 0.19829884f,
-0.19509024f, 0.19187955f, 0.18866692f, 0.18545227f, 0.18223552f,
-0.17901681f, 0.17579631f, 0.17257380f, 0.16934945f, 0.16612328f,
-0.16289546f, 0.15966577f, 0.15643437f, 0.15320141f, 0.14996669f,
-0.14673037f, 0.14349260f, 0.14025329f, 0.13701235f, 0.13376995f,
-0.13052612f, 0.12728101f, 0.12403442f, 0.12078650f, 0.11753740f,
-0.11428693f, 0.11103523f, 0.10778234f, 0.10452842f, 0.10127326f,
-0.098017137f, 0.094759842f, 0.091501652f, 0.088242363f, 0.084982129f,
-0.081721103f, 0.078459084f, 0.075196224f, 0.071932560f, 0.068668243f,
-0.065403073f, 0.062137201f, 0.058870665f, 0.055603617f, 0.052335974f,
-0.049067651f, 0.045798921f, 0.042529582f, 0.039259788f, 0.035989573f,
-0.032719092f, 0.029448142f, 0.026176876f, 0.022905329f, 0.019633657f,
-0.016361655f, 0.013089478f, 0.0098171604f, 0.0065449764f, 0.0032724839f,
--4.3711390e-08f, };
-#endif
-
-static const CELTMode mode48000_960_120 = {
-48000, /* Fs */
-120, /* overlap */
-21, /* nbEBands */
-21, /* effEBands */
-{0.85000610f, 0.0000000f, 1.0000000f, 1.0000000f, }, /* preemph */
-eband5ms, /* eBands */
-3, /* maxLM */
-8, /* nbShortMdcts */
-120, /* shortMdctSize */
-11, /* nbAllocVectors */
-band_allocation, /* allocVectors */
-logN400, /* logN */
-window120, /* window */
-{1920, 3, {&fft_state48000_960_0, &fft_state48000_960_1, &fft_state48000_960_2, &fft_state48000_960_3, }, mdct_twiddles960}, /* mdct */
-{392, cache_index50, cache_bits50, cache_caps50}, /* cache */
-};
-
-/* List of all the available modes */
-#define TOTAL_MODES 1
-static const CELTMode * const static_mode_list[TOTAL_MODES] = {
-&mode48000_960_120,
-};
diff --git a/src/opus-1.1/celt/vq.c b/src/opus-1.1/celt/vq.c
deleted file mode 100644
index 98a0f36c..00000000
--- a/src/opus-1.1/celt/vq.c
+++ /dev/null
@@ -1,415 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "mathops.h"
-#include "cwrs.h"
-#include "vq.h"
-#include "arch.h"
-#include "os_support.h"
-#include "bands.h"
-#include "rate.h"
-
-static void exp_rotation1(celt_norm *X, int len, int stride, opus_val16 c, opus_val16 s)
-{
- int i;
- celt_norm *Xptr;
- Xptr = X;
- for (i=0;i<len-stride;i++)
- {
- celt_norm x1, x2;
- x1 = Xptr[0];
- x2 = Xptr[stride];
- Xptr[stride] = EXTRACT16(SHR32(MULT16_16(c,x2) + MULT16_16(s,x1), 15));
- *Xptr++ = EXTRACT16(SHR32(MULT16_16(c,x1) - MULT16_16(s,x2), 15));
- }
- Xptr = &X[len-2*stride-1];
- for (i=len-2*stride-1;i>=0;i--)
- {
- celt_norm x1, x2;
- x1 = Xptr[0];
- x2 = Xptr[stride];
- Xptr[stride] = EXTRACT16(SHR32(MULT16_16(c,x2) + MULT16_16(s,x1), 15));
- *Xptr-- = EXTRACT16(SHR32(MULT16_16(c,x1) - MULT16_16(s,x2), 15));
- }
-}
-
-static void exp_rotation(celt_norm *X, int len, int dir, int stride, int K, int spread)
-{
- static const int SPREAD_FACTOR[3]={15,10,5};
- int i;
- opus_val16 c, s;
- opus_val16 gain, theta;
- int stride2=0;
- int factor;
-
- if (2*K>=len || spread==SPREAD_NONE)
- return;
- factor = SPREAD_FACTOR[spread-1];
-
- gain = celt_div((opus_val32)MULT16_16(Q15_ONE,len),(opus_val32)(len+factor*K));
- theta = HALF16(MULT16_16_Q15(gain,gain));
-
- c = celt_cos_norm(EXTEND32(theta));
- s = celt_cos_norm(EXTEND32(SUB16(Q15ONE,theta))); /* sin(theta) */
-
- if (len>=8*stride)
- {
- stride2 = 1;
- /* This is just a simple (equivalent) way of computing sqrt(len/stride) with rounding.
- It's basically incrementing long as (stride2+0.5)^2 < len/stride. */
- while ((stride2*stride2+stride2)*stride + (stride>>2) < len)
- stride2++;
- }
- /*NOTE: As a minor optimization, we could be passing around log2(B), not B, for both this and for
- extract_collapse_mask().*/
- len /= stride;
- for (i=0;i<stride;i++)
- {
- if (dir < 0)
- {
- if (stride2)
- exp_rotation1(X+i*len, len, stride2, s, c);
- exp_rotation1(X+i*len, len, 1, c, s);
- } else {
- exp_rotation1(X+i*len, len, 1, c, -s);
- if (stride2)
- exp_rotation1(X+i*len, len, stride2, s, -c);
- }
- }
-}
-
-/** Takes the pitch vector and the decoded residual vector, computes the gain
- that will give ||p+g*y||=1 and mixes the residual with the pitch. */
-static void normalise_residual(int * OPUS_RESTRICT iy, celt_norm * OPUS_RESTRICT X,
- int N, opus_val32 Ryy, opus_val16 gain)
-{
- int i;
-#ifdef FIXED_POINT
- int k;
-#endif
- opus_val32 t;
- opus_val16 g;
-
-#ifdef FIXED_POINT
- k = celt_ilog2(Ryy)>>1;
-#endif
- t = VSHR32(Ryy, 2*(k-7));
- g = MULT16_16_P15(celt_rsqrt_norm(t),gain);
-
- i=0;
- do
- X[i] = EXTRACT16(PSHR32(MULT16_16(g, iy[i]), k+1));
- while (++i < N);
-}
-
-static unsigned extract_collapse_mask(int *iy, int N, int B)
-{
- unsigned collapse_mask;
- int N0;
- int i;
- if (B<=1)
- return 1;
- /*NOTE: As a minor optimization, we could be passing around log2(B), not B, for both this and for
- exp_rotation().*/
- N0 = N/B;
- collapse_mask = 0;
- i=0; do {
- int j;
- j=0; do {
- collapse_mask |= (iy[i*N0+j]!=0)<<i;
- } while (++j<N0);
- } while (++i<B);
- return collapse_mask;
-}
-
-unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, ec_enc *enc
-#ifdef RESYNTH
- , opus_val16 gain
-#endif
- )
-{
- VARDECL(celt_norm, y);
- VARDECL(int, iy);
- VARDECL(opus_val16, signx);
- int i, j;
- opus_val16 s;
- int pulsesLeft;
- opus_val32 sum;
- opus_val32 xy;
- opus_val16 yy;
- unsigned collapse_mask;
- SAVE_STACK;
-
- celt_assert2(K>0, "alg_quant() needs at least one pulse");
- celt_assert2(N>1, "alg_quant() needs at least two dimensions");
-
- ALLOC(y, N, celt_norm);
- ALLOC(iy, N, int);
- ALLOC(signx, N, opus_val16);
-
- exp_rotation(X, N, 1, B, K, spread);
-
- /* Get rid of the sign */
- sum = 0;
- j=0; do {
- if (X[j]>0)
- signx[j]=1;
- else {
- signx[j]=-1;
- X[j]=-X[j];
- }
- iy[j] = 0;
- y[j] = 0;
- } while (++j<N);
-
- xy = yy = 0;
-
- pulsesLeft = K;
-
- /* Do a pre-search by projecting on the pyramid */
- if (K > (N>>1))
- {
- opus_val16 rcp;
- j=0; do {
- sum += X[j];
- } while (++j<N);
-
- /* If X is too small, just replace it with a pulse at 0 */
-#ifdef FIXED_POINT
- if (sum <= K)
-#else
- /* Prevents infinities and NaNs from causing too many pulses
- to be allocated. 64 is an approximation of infinity here. */
- if (!(sum > EPSILON && sum < 64))
-#endif
- {
- X[0] = QCONST16(1.f,14);
- j=1; do
- X[j]=0;
- while (++j<N);
- sum = QCONST16(1.f,14);
- }
- rcp = EXTRACT16(MULT16_32_Q16(K-1, celt_rcp(sum)));
- j=0; do {
-#ifdef FIXED_POINT
- /* It's really important to round *towards zero* here */
- iy[j] = MULT16_16_Q15(X[j],rcp);
-#else
- iy[j] = (int)floor(rcp*X[j]);
-#endif
- y[j] = (celt_norm)iy[j];
- yy = MAC16_16(yy, y[j],y[j]);
- xy = MAC16_16(xy, X[j],y[j]);
- y[j] *= 2;
- pulsesLeft -= iy[j];
- } while (++j<N);
- }
- celt_assert2(pulsesLeft>=1, "Allocated too many pulses in the quick pass");
-
- /* This should never happen, but just in case it does (e.g. on silence)
- we fill the first bin with pulses. */
-#ifdef FIXED_POINT_DEBUG
- celt_assert2(pulsesLeft<=N+3, "Not enough pulses in the quick pass");
-#endif
- if (pulsesLeft > N+3)
- {
- opus_val16 tmp = (opus_val16)pulsesLeft;
- yy = MAC16_16(yy, tmp, tmp);
- yy = MAC16_16(yy, tmp, y[0]);
- iy[0] += pulsesLeft;
- pulsesLeft=0;
- }
-
- s = 1;
- for (i=0;i<pulsesLeft;i++)
- {
- int best_id;
- opus_val32 best_num = -VERY_LARGE16;
- opus_val16 best_den = 0;
-#ifdef FIXED_POINT
- int rshift;
-#endif
-#ifdef FIXED_POINT
- rshift = 1+celt_ilog2(K-pulsesLeft+i+1);
-#endif
- best_id = 0;
- /* The squared magnitude term gets added anyway, so we might as well
- add it outside the loop */
- yy = ADD32(yy, 1);
- j=0;
- do {
- opus_val16 Rxy, Ryy;
- /* Temporary sums of the new pulse(s) */
- Rxy = EXTRACT16(SHR32(ADD32(xy, EXTEND32(X[j])),rshift));
- /* We're multiplying y[j] by two so we don't have to do it here */
- Ryy = ADD16(yy, y[j]);
-
- /* Approximate score: we maximise Rxy/sqrt(Ryy) (we're guaranteed that
- Rxy is positive because the sign is pre-computed) */
- Rxy = MULT16_16_Q15(Rxy,Rxy);
- /* The idea is to check for num/den >= best_num/best_den, but that way
- we can do it without any division */
- /* OPT: Make sure to use conditional moves here */
- if (MULT16_16(best_den, Rxy) > MULT16_16(Ryy, best_num))
- {
- best_den = Ryy;
- best_num = Rxy;
- best_id = j;
- }
- } while (++j<N);
-
- /* Updating the sums of the new pulse(s) */
- xy = ADD32(xy, EXTEND32(X[best_id]));
- /* We're multiplying y[j] by two so we don't have to do it here */
- yy = ADD16(yy, y[best_id]);
-
- /* Only now that we've made the final choice, update y/iy */
- /* Multiplying y[j] by 2 so we don't have to do it everywhere else */
- y[best_id] += 2*s;
- iy[best_id]++;
- }
-
- /* Put the original sign back */
- j=0;
- do {
- X[j] = MULT16_16(signx[j],X[j]);
- if (signx[j] < 0)
- iy[j] = -iy[j];
- } while (++j<N);
- encode_pulses(iy, N, K, enc);
-
-#ifdef RESYNTH
- normalise_residual(iy, X, N, yy, gain);
- exp_rotation(X, N, -1, B, K, spread);
-#endif
-
- collapse_mask = extract_collapse_mask(iy, N, B);
- RESTORE_STACK;
- return collapse_mask;
-}
-
-/** Decode pulse vector and combine the result with the pitch vector to produce
- the final normalised signal in the current band. */
-unsigned alg_unquant(celt_norm *X, int N, int K, int spread, int B,
- ec_dec *dec, opus_val16 gain)
-{
- int i;
- opus_val32 Ryy;
- unsigned collapse_mask;
- VARDECL(int, iy);
- SAVE_STACK;
-
- celt_assert2(K>0, "alg_unquant() needs at least one pulse");
- celt_assert2(N>1, "alg_unquant() needs at least two dimensions");
- ALLOC(iy, N, int);
- decode_pulses(iy, N, K, dec);
- Ryy = 0;
- i=0;
- do {
- Ryy = MAC16_16(Ryy, iy[i], iy[i]);
- } while (++i < N);
- normalise_residual(iy, X, N, Ryy, gain);
- exp_rotation(X, N, -1, B, K, spread);
- collapse_mask = extract_collapse_mask(iy, N, B);
- RESTORE_STACK;
- return collapse_mask;
-}
-
-void renormalise_vector(celt_norm *X, int N, opus_val16 gain)
-{
- int i;
-#ifdef FIXED_POINT
- int k;
-#endif
- opus_val32 E = EPSILON;
- opus_val16 g;
- opus_val32 t;
- celt_norm *xptr = X;
- for (i=0;i<N;i++)
- {
- E = MAC16_16(E, *xptr, *xptr);
- xptr++;
- }
-#ifdef FIXED_POINT
- k = celt_ilog2(E)>>1;
-#endif
- t = VSHR32(E, 2*(k-7));
- g = MULT16_16_P15(celt_rsqrt_norm(t),gain);
-
- xptr = X;
- for (i=0;i<N;i++)
- {
- *xptr = EXTRACT16(PSHR32(MULT16_16(g, *xptr), k+1));
- xptr++;
- }
- /*return celt_sqrt(E);*/
-}
-
-int stereo_itheta(celt_norm *X, celt_norm *Y, int stereo, int N)
-{
- int i;
- int itheta;
- opus_val16 mid, side;
- opus_val32 Emid, Eside;
-
- Emid = Eside = EPSILON;
- if (stereo)
- {
- for (i=0;i<N;i++)
- {
- celt_norm m, s;
- m = ADD16(SHR16(X[i],1),SHR16(Y[i],1));
- s = SUB16(SHR16(X[i],1),SHR16(Y[i],1));
- Emid = MAC16_16(Emid, m, m);
- Eside = MAC16_16(Eside, s, s);
- }
- } else {
- for (i=0;i<N;i++)
- {
- celt_norm m, s;
- m = X[i];
- s = Y[i];
- Emid = MAC16_16(Emid, m, m);
- Eside = MAC16_16(Eside, s, s);
- }
- }
- mid = celt_sqrt(Emid);
- side = celt_sqrt(Eside);
-#ifdef FIXED_POINT
- /* 0.63662 = 2/pi */
- itheta = MULT16_16_Q15(QCONST16(0.63662f,15),celt_atan2p(side, mid));
-#else
- itheta = (int)floor(.5f+16384*0.63662f*atan2(side,mid));
-#endif
-
- return itheta;
-}
diff --git a/src/opus-1.1/celt/vq.h b/src/opus-1.1/celt/vq.h
deleted file mode 100644
index ffdc69cd..00000000
--- a/src/opus-1.1/celt/vq.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (c) 2007-2008 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/**
- @file vq.h
- @brief Vector quantisation of the residual
- */
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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 VQ_H
-#define VQ_H
-
-#include "entenc.h"
-#include "entdec.h"
-#include "modes.h"
-
-/** Algebraic pulse-vector quantiser. The signal x is replaced by the sum of
- * the pitch and a combination of pulses such that its norm is still equal
- * to 1. This is the function that will typically require the most CPU.
- * @param X Residual signal to quantise/encode (returns quantised version)
- * @param N Number of samples to encode
- * @param K Number of pulses to use
- * @param enc Entropy encoder state
- * @ret A mask indicating which blocks in the band received pulses
-*/
-unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B,
- ec_enc *enc
-#ifdef RESYNTH
- , opus_val16 gain
-#endif
- );
-
-/** Algebraic pulse decoder
- * @param X Decoded normalised spectrum (returned)
- * @param N Number of samples to decode
- * @param K Number of pulses to use
- * @param dec Entropy decoder state
- * @ret A mask indicating which blocks in the band received pulses
- */
-unsigned alg_unquant(celt_norm *X, int N, int K, int spread, int B,
- ec_dec *dec, opus_val16 gain);
-
-void renormalise_vector(celt_norm *X, int N, opus_val16 gain);
-
-int stereo_itheta(celt_norm *X, celt_norm *Y, int stereo, int N);
-
-#endif /* VQ_H */
diff --git a/src/opus-1.1/celt/x86/pitch_sse.h b/src/opus-1.1/celt/x86/pitch_sse.h
deleted file mode 100644
index 695122a5..00000000
--- a/src/opus-1.1/celt/x86/pitch_sse.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/* Copyright (c) 2013 Jean-Marc Valin and John Ridges */
-/**
- @file pitch_sse.h
- @brief Pitch analysis
- */
-
-/*
- 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.
-
- 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 COPYRIGHT OWNER
- 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 PITCH_SSE_H
-#define PITCH_SSE_H
-
-#include <xmmintrin.h>
-#include "arch.h"
-
-#define OVERRIDE_XCORR_KERNEL
-static OPUS_INLINE void xcorr_kernel(const opus_val16 *x, const opus_val16 *y, opus_val32 sum[4], int len)
-{
- int j;
- __m128 xsum1, xsum2;
- xsum1 = _mm_loadu_ps(sum);
- xsum2 = _mm_setzero_ps();
-
- for (j = 0; j < len-3; j += 4)
- {
- __m128 x0 = _mm_loadu_ps(x+j);
- __m128 yj = _mm_loadu_ps(y+j);
- __m128 y3 = _mm_loadu_ps(y+j+3);
-
- xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(_mm_shuffle_ps(x0,x0,0x00),yj));
- xsum2 = _mm_add_ps(xsum2,_mm_mul_ps(_mm_shuffle_ps(x0,x0,0x55),
- _mm_shuffle_ps(yj,y3,0x49)));
- xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(_mm_shuffle_ps(x0,x0,0xaa),
- _mm_shuffle_ps(yj,y3,0x9e)));
- xsum2 = _mm_add_ps(xsum2,_mm_mul_ps(_mm_shuffle_ps(x0,x0,0xff),y3));
- }
- if (j < len)
- {
- xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(_mm_load1_ps(x+j),_mm_loadu_ps(y+j)));
- if (++j < len)
- {
- xsum2 = _mm_add_ps(xsum2,_mm_mul_ps(_mm_load1_ps(x+j),_mm_loadu_ps(y+j)));
- if (++j < len)
- {
- xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(_mm_load1_ps(x+j),_mm_loadu_ps(y+j)));
- }
- }
- }
- _mm_storeu_ps(sum,_mm_add_ps(xsum1,xsum2));
-}
-
-#define OVERRIDE_DUAL_INNER_PROD
-static OPUS_INLINE void dual_inner_prod(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02,
- int N, opus_val32 *xy1, opus_val32 *xy2)
-{
- int i;
- __m128 xsum1, xsum2;
- xsum1 = _mm_setzero_ps();
- xsum2 = _mm_setzero_ps();
- for (i=0;i<N-3;i+=4)
- {
- __m128 xi = _mm_loadu_ps(x+i);
- __m128 y1i = _mm_loadu_ps(y01+i);
- __m128 y2i = _mm_loadu_ps(y02+i);
- xsum1 = _mm_add_ps(xsum1,_mm_mul_ps(xi, y1i));
- xsum2 = _mm_add_ps(xsum2,_mm_mul_ps(xi, y2i));
- }
- /* Horizontal sum */
- xsum1 = _mm_add_ps(xsum1, _mm_movehl_ps(xsum1, xsum1));
- xsum1 = _mm_add_ss(xsum1, _mm_shuffle_ps(xsum1, xsum1, 0x55));
- _mm_store_ss(xy1, xsum1);
- xsum2 = _mm_add_ps(xsum2, _mm_movehl_ps(xsum2, xsum2));
- xsum2 = _mm_add_ss(xsum2, _mm_shuffle_ps(xsum2, xsum2, 0x55));
- _mm_store_ss(xy2, xsum2);
- for (;i<N;i++)
- {
- *xy1 = MAC16_16(*xy1, x[i], y01[i]);
- *xy2 = MAC16_16(*xy2, x[i], y02[i]);
- }
-}
-
-#define OVERRIDE_COMB_FILTER_CONST
-static OPUS_INLINE void comb_filter_const(opus_val32 *y, opus_val32 *x, int T, int N,
- opus_val16 g10, opus_val16 g11, opus_val16 g12)
-{
- int i;
- __m128 x0v;
- __m128 g10v, g11v, g12v;
- g10v = _mm_load1_ps(&g10);
- g11v = _mm_load1_ps(&g11);
- g12v = _mm_load1_ps(&g12);
- x0v = _mm_loadu_ps(&x[-T-2]);
- for (i=0;i<N-3;i+=4)
- {
- __m128 yi, yi2, x1v, x2v, x3v, x4v;
- const opus_val32 *xp = &x[i-T-2];
- yi = _mm_loadu_ps(x+i);
- x4v = _mm_loadu_ps(xp+4);
-#if 0
- /* Slower version with all loads */
- x1v = _mm_loadu_ps(xp+1);
- x2v = _mm_loadu_ps(xp+2);
- x3v = _mm_loadu_ps(xp+3);
-#else
- x2v = _mm_shuffle_ps(x0v, x4v, 0x4e);
- x1v = _mm_shuffle_ps(x0v, x2v, 0x99);
- x3v = _mm_shuffle_ps(x2v, x4v, 0x99);
-#endif
-
- yi = _mm_add_ps(yi, _mm_mul_ps(g10v,x2v));
-#if 0 /* Set to 1 to make it bit-exact with the non-SSE version */
- yi = _mm_add_ps(yi, _mm_mul_ps(g11v,_mm_add_ps(x3v,x1v)));
- yi = _mm_add_ps(yi, _mm_mul_ps(g12v,_mm_add_ps(x4v,x0v)));
-#else
- /* Use partial sums */
- yi2 = _mm_add_ps(_mm_mul_ps(g11v,_mm_add_ps(x3v,x1v)),
- _mm_mul_ps(g12v,_mm_add_ps(x4v,x0v)));
- yi = _mm_add_ps(yi, yi2);
-#endif
- x0v=x4v;
- _mm_storeu_ps(y+i, yi);
- }
-#ifdef CUSTOM_MODES
- for (;i<N;i++)
- {
- y[i] = x[i]
- + MULT16_32_Q15(g10,x[i-T])
- + MULT16_32_Q15(g11,ADD32(x[i-T+1],x[i-T-1]))
- + MULT16_32_Q15(g12,ADD32(x[i-T+2],x[i-T-2]));
- }
-#endif
-}
-
-#endif