diff options
author | jm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2005-03-15 08:18:02 +0300 |
---|---|---|
committer | jm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2005-03-15 08:18:02 +0300 |
commit | 6f0e96a431295717233408f3439fd3b55c383891 (patch) | |
tree | 2f9a8099399430e4b6776c4e18fdd908e0f7e57e | |
parent | 10619de5d020727296dacb7c768d3e1e77b55ab1 (diff) |
Merged a modified version of Jamey Hicks' C55 patch, fixed a
long-standing fixed-point wideband overflow. Replaced some
"+" and "-" with ADD() and SUB().
git-svn-id: http://svn.xiph.org/trunk/speex@9076 0101bb08-14d6-0310-b084-bc0e0c8e3800
-rw-r--r-- | configure.ac | 10 | ||||
-rw-r--r-- | include/speex/speex_bits.h | 8 | ||||
-rw-r--r-- | include/speex/speex_header.h | 34 | ||||
-rw-r--r-- | libspeex/arch.h | 22 | ||||
-rw-r--r-- | libspeex/bits.c | 177 | ||||
-rw-r--r-- | libspeex/cb_search.c | 16 | ||||
-rw-r--r-- | libspeex/filters.c | 45 | ||||
-rw-r--r-- | libspeex/filters.h | 2 | ||||
-rw-r--r-- | libspeex/fixed_arm4.h | 1 | ||||
-rw-r--r-- | libspeex/fixed_arm5e.h | 1 | ||||
-rw-r--r-- | libspeex/fixed_debug.h | 1 | ||||
-rw-r--r-- | libspeex/fixed_generic.h | 38 | ||||
-rw-r--r-- | libspeex/jitter.c | 3 | ||||
-rw-r--r-- | libspeex/lpc.c | 20 | ||||
-rw-r--r-- | libspeex/lsp.c | 18 | ||||
-rw-r--r-- | libspeex/ltp.c | 18 | ||||
-rw-r--r-- | libspeex/misc.c | 54 | ||||
-rw-r--r-- | libspeex/misc.h | 7 | ||||
-rw-r--r-- | libspeex/modes.c | 16 | ||||
-rw-r--r-- | libspeex/nb_celp.c | 14 | ||||
-rw-r--r-- | libspeex/quant_lsp.c | 12 | ||||
-rw-r--r-- | libspeex/sb_celp.c | 53 | ||||
-rw-r--r-- | libspeex/speex.c | 8 | ||||
-rw-r--r-- | libspeex/speex_callbacks.c | 1 | ||||
-rw-r--r-- | libspeex/speex_header.c | 2 | ||||
-rw-r--r-- | libspeex/testenc.c | 2 |
26 files changed, 373 insertions, 210 deletions
diff --git a/configure.ac b/configure.ac index e146de5..0c3972a 100644 --- a/configure.ac +++ b/configure.ac @@ -59,6 +59,11 @@ AC_DEFINE_UNQUOTED(SPEEX_MINOR_VERSION, ${SPEEX_MINOR_VERSION}, [Version minor]) AC_DEFINE_UNQUOTED(SPEEX_MICRO_VERSION, ${SPEEX_MICRO_VERSION}, [Version micro]) AC_DEFINE_UNQUOTED(SPEEX_EXTRA_VERSION, "${SPEEX_EXTRA_VERSION}", [Version extra]) +AC_ARG_ENABLE(wideband, [ --disable-wideband disable wideband codec], +[if test "$enableval" = no; then + AC_DEFINE([DISABLE_WIDEBAND], , [Disable wideband codec]) +fi]) + AC_ARG_ENABLE(valgrind, [ --enable-valgrind enable valgrind extra checks], [if test "$enableval" = yes; then AC_DEFINE([ENABLE_VALGRIND], , [Enable valgrind extra checks]) @@ -95,6 +100,11 @@ AC_ARG_ENABLE(epic-48k, [ --enable-epic-48k enable support for Epic 4.8 k AC_DEFINE([EPIC_48K], , [Enable support for Epic 4.8 kbps mode]) fi]) +AC_ARG_ENABLE(ti-c55x, [ --enable-ti-c55x enable support for TI C55X DSP], +[if test "$enableval" = yes; then + AC_DEFINE([TI_C55X], , [Enable support for TI C55X DSP]) +fi]) + dnl Output the makefiles and version.h. AC_OUTPUT([Makefile libspeex/Makefile src/Makefile doc/Makefile Speex.spec diff --git a/include/speex/speex_bits.h b/include/speex/speex_bits.h index 9fb1e4e..b77202f 100644 --- a/include/speex/speex_bits.h +++ b/include/speex/speex_bits.h @@ -42,11 +42,11 @@ extern "C" { /** Bit-packing data structure representing (part of) a bit-stream. */ typedef struct SpeexBits { - char *bytes; /**< "raw" data */ + char *chars; /**< "raw" data */ int nbBits; /**< Total number of bits stored in the stream*/ - int bytePtr; /**< Position of the byte "cursor" */ - int bitPtr; /**< Position of the bit "cursor" within the current byte */ - int owner; /**< Does the struct "own" the "raw" buffer (member "bytes") */ + int charPtr; /**< Position of the byte "cursor" */ + int bitPtr; /**< Position of the bit "cursor" within the current char */ + int owner; /**< Does the struct "own" the "raw" buffer (member "chars") */ int overflow;/**< Set to one if we try to read past the valid data */ int buf_size;/**< Allocated size for buffer */ int reserved1; /**< Reserved for future use */ diff --git a/include/speex/speex_header.h b/include/speex/speex_header.h index 1ff12b7..a159140 100644 --- a/include/speex/speex_header.h +++ b/include/speex/speex_header.h @@ -43,26 +43,30 @@ extern "C" { struct SpeexMode; +typedef signed long spx_int32_t; + +#define SPEEX_HEADER_STRING_LENGTH 8 + /** Maximum number of characters for encoding the Speex version number in the header */ #define SPEEX_HEADER_VERSION_LENGTH 20 /** Speex header info for file-based formats */ typedef struct SpeexHeader { - char speex_string[8]; /**< Identifies a Speex bit-stream, always set to "Speex " */ - char speex_version[SPEEX_HEADER_VERSION_LENGTH]; /**< Speex version */ - int speex_version_id; /**< Version for Speex (for checking compatibility) */ - int header_size; /**< Total size of the header ( sizeof(SpeexHeader) ) */ - int rate; /**< Sampling rate used */ - int mode; /**< Mode used (0 for narrowband, 1 for wideband) */ - int mode_bitstream_version; /**< Version ID of the bit-stream */ - int nb_channels; /**< Number of channels encoded */ - int bitrate; /**< Bit-rate used */ - int frame_size; /**< Size of frames */ - int vbr; /**< 1 for a VBR encoding, 0 otherwise */ - int frames_per_packet; /**< Number of frames stored per Ogg packet */ - int extra_headers; /**< Number of additional headers after the comments */ - int reserved1; /**< Reserved for future use, must be zero */ - int reserved2; /**< Reserved for future use, must be zero */ + char speex_string[SPEEX_HEADER_STRING_LENGTH]; /**< Identifies a Speex bit-stream, always set to "Speex " */ + char speex_version[SPEEX_HEADER_VERSION_LENGTH]; /**< Speex version */ + spx_int32_t speex_version_id; /**< Version for Speex (for checking compatibility) */ + spx_int32_t header_size; /**< Total size of the header ( sizeof(SpeexHeader) ) */ + spx_int32_t rate; /**< Sampling rate used */ + spx_int32_t mode; /**< Mode used (0 for narrowband, 1 for wideband) */ + spx_int32_t mode_bitstream_version; /**< Version ID of the bit-stream */ + spx_int32_t nb_channels; /**< Number of channels encoded */ + spx_int32_t bitrate; /**< Bit-rate used */ + spx_int32_t frame_size; /**< Size of frames */ + spx_int32_t vbr; /**< 1 for a VBR encoding, 0 otherwise */ + spx_int32_t frames_per_packet; /**< Number of frames stored per Ogg packet */ + spx_int32_t extra_headers; /**< Number of additional headers after the comments */ + spx_int32_t reserved1; /**< Reserved for future use, must be zero */ + spx_int32_t reserved2; /**< Reserved for future use, must be zero */ } SpeexHeader; /** Initializes a SpeexHeader using basic information */ diff --git a/libspeex/arch.h b/libspeex/arch.h index a7ca495..6a430a4 100644 --- a/libspeex/arch.h +++ b/libspeex/arch.h @@ -37,6 +37,10 @@ #define ABS(x) ((x) < 0 ? (-(x)) : (x)) +/* FIXME: Should provide better detection */ +/*typedef signed long spx_int32_t;*/ +typedef unsigned long spx_uint32_t; + #ifdef FIXED_POINT typedef signed short spx_word16_t; @@ -109,8 +113,8 @@ typedef float spx_word64_t; #define SUB32(a,b) ((a)-(b)) #define ADD64(a,b) ((a)+(b)) #define MULT16_16_16(a,b) ((a)*(b)) -#define MULT16_16(a,b) ((a)*(b)) -#define MAC16_16(c,a,b) ((c)+(a)*(b)) +#define MULT16_16(a,b) ((spx_word32_t)(a)*(spx_word32_t)(b)) +#define MAC16_16(c,a,b) ((c)+(spx_word32_t)(a)*(spx_word32_t)(b)) #define MULT16_32_Q11(a,b) ((a)*(b)) #define MULT16_32_Q13(a,b) ((a)*(b)) @@ -133,5 +137,19 @@ typedef float spx_word64_t; #endif +#ifdef CONFIG_TI_C55X + +/* 2 on TI C5x DSP */ +#define BYTES_PER_CHAR 2 +#define BITS_PER_CHAR 16 +#define LOG2_BITS_PER_CHAR 4 + +#else + +#define BYTES_PER_CHAR 1 +#define BITS_PER_CHAR 8 +#define LOG2_BITS_PER_CHAR 3 + +#endif #endif diff --git a/libspeex/bits.c b/libspeex/bits.c index 59aacf9..4569f14 100644 --- a/libspeex/bits.c +++ b/libspeex/bits.c @@ -40,16 +40,16 @@ #include "misc.h" /** Maximum size of the bit-stream (for fixed-size allocation) */ -#define MAX_BYTES_PER_FRAME 2000 +#define MAX_BYTES_PER_FRAME (2000/BYTES_PER_CHAR) void speex_bits_init(SpeexBits *bits) { - bits->bytes = (char*)speex_alloc(MAX_BYTES_PER_FRAME); + bits->chars = (char*)speex_alloc(MAX_BYTES_PER_FRAME); bits->buf_size = MAX_BYTES_PER_FRAME; - bits->bytes[0]=0; + bits->chars[0]=0; bits->nbBits=0; - bits->bytePtr=0; + bits->charPtr=0; bits->bitPtr=0; bits->owner=1; bits->overflow=0; @@ -57,12 +57,12 @@ void speex_bits_init(SpeexBits *bits) void speex_bits_init_buffer(SpeexBits *bits, void *buff, int buf_size) { - bits->bytes = (char*)buff; + bits->chars = (char*)buff; bits->buf_size = buf_size; - bits->bytes[0]=0; + bits->chars[0]=0; bits->nbBits=0; - bits->bytePtr=0; + bits->charPtr=0; bits->bitPtr=0; bits->owner=0; bits->overflow=0; @@ -71,27 +71,27 @@ void speex_bits_init_buffer(SpeexBits *bits, void *buff, int buf_size) void speex_bits_destroy(SpeexBits *bits) { if (bits->owner) - speex_free(bits->bytes); + speex_free(bits->chars); /* Will do something once the allocation is dynamic */ } void speex_bits_reset(SpeexBits *bits) { - bits->bytes[0]=0; + bits->chars[0]=0; bits->nbBits=0; - bits->bytePtr=0; + bits->charPtr=0; bits->bitPtr=0; bits->overflow=0; } void speex_bits_rewind(SpeexBits *bits) { - bits->bytePtr=0; + bits->charPtr=0; bits->bitPtr=0; bits->overflow=0; } -void speex_bits_read_from(SpeexBits *bits, char *bytes, int len) +void speex_bits_read_from(SpeexBits *bits, char *chars, int len) { int i; if (len > bits->buf_size) @@ -99,11 +99,11 @@ void speex_bits_read_from(SpeexBits *bits, char *bytes, int len) speex_warning_int("Packet if larger than allocated buffer: ", len); if (bits->owner) { - char *tmp = (char*)speex_realloc(bits->bytes, len); + char *tmp = (char*)speex_realloc(bits->chars, len); if (tmp) { bits->buf_size=len; - bits->bytes=tmp; + bits->chars=tmp; } else { len=bits->buf_size; speex_warning("Could not resize input buffer: truncating input"); @@ -114,9 +114,9 @@ void speex_bits_read_from(SpeexBits *bits, char *bytes, int len) } } for (i=0;i<len;i++) - bits->bytes[i]=bytes[i]; + bits->chars[i]=chars[i]; bits->nbBits=len<<3; - bits->bytePtr=0; + bits->charPtr=0; bits->bitPtr=0; bits->overflow=0; } @@ -124,104 +124,111 @@ void speex_bits_read_from(SpeexBits *bits, char *bytes, int len) static void speex_bits_flush(SpeexBits *bits) { int i; - if (bits->bytePtr>0) + int nchars = ((bits->nbBits+BITS_PER_CHAR-1)>>LOG2_BITS_PER_CHAR); + if (bits->charPtr>0) { - for (i=bits->bytePtr;i<((bits->nbBits+7)>>3);i++) - bits->bytes[i-bits->bytePtr]=bits->bytes[i]; + for (i=bits->charPtr;i<nchars; i++) + bits->chars[i-bits->charPtr]=bits->chars[i]; } - bits->nbBits -= bits->bytePtr<<3; - bits->bytePtr=0; + bits->nbBits -= bits->charPtr<<LOG2_BITS_PER_CHAR; + bits->charPtr=0; } -void speex_bits_read_whole_bytes(SpeexBits *bits, char *bytes, int len) +void speex_bits_read_whole_bytes(SpeexBits *bits, char *chars, int nbytes) { int i,pos; + int nchars = nbytes/BYTES_PER_CHAR; - if (((bits->nbBits+7)>>3)+len > bits->buf_size) + if (((bits->nbBits+BITS_PER_CHAR-1)>>LOG2_BITS_PER_CHAR)+nchars > bits->buf_size) { /* Packet is larger than allocated buffer */ if (bits->owner) { - char *tmp = (char*)speex_realloc(bits->bytes, (bits->nbBits>>3)+len+1); + char *tmp = (char*)speex_realloc(bits->chars, (bits->nbBits>>LOG2_BITS_PER_CHAR)+nchars+1); if (tmp) { - bits->buf_size=(bits->nbBits>>3)+len+1; - bits->bytes=tmp; + bits->buf_size=(bits->nbBits>>LOG2_BITS_PER_CHAR)+nchars+1; + bits->chars=tmp; } else { - len=bits->buf_size-(bits->nbBits>>3)-1; + nchars=bits->buf_size-(bits->nbBits>>LOG2_BITS_PER_CHAR)-1; speex_warning("Could not resize input buffer: truncating input"); } } else { speex_warning("Do not own input buffer: truncating input"); - len=bits->buf_size; + nchars=bits->buf_size; } } speex_bits_flush(bits); - pos=bits->nbBits>>3; - for (i=0;i<len;i++) - bits->bytes[pos+i]=bytes[i]; - bits->nbBits+=len<<3; + pos=bits->nbBits>>LOG2_BITS_PER_CHAR; + for (i=0;i<nchars;i++) + bits->chars[pos+i]=chars[i]; + bits->nbBits+=nchars<<LOG2_BITS_PER_CHAR; } -int speex_bits_write(SpeexBits *bits, char *bytes, int max_len) +int speex_bits_write(SpeexBits *bits, char *chars, int max_nbytes) { int i; - int bytePtr, bitPtr, nbBits; + int max_nchars = max_nbytes/BYTES_PER_CHAR; + int charPtr, bitPtr, nbBits; /* Insert terminator, but save the data so we can put it back after */ bitPtr=bits->bitPtr; - bytePtr=bits->bytePtr; + charPtr=bits->charPtr; nbBits=bits->nbBits; speex_bits_insert_terminator(bits); bits->bitPtr=bitPtr; - bits->bytePtr=bytePtr; + bits->charPtr=charPtr; bits->nbBits=nbBits; - if (max_len > ((bits->nbBits+7)>>3)) - max_len = ((bits->nbBits+7)>>3); - for (i=0;i<max_len;i++) - bytes[i]=bits->bytes[i]; - return max_len; + if (max_nchars > ((bits->nbBits+BITS_PER_CHAR-1)>>LOG2_BITS_PER_CHAR)) + max_nchars = ((bits->nbBits+BITS_PER_CHAR-1)>>LOG2_BITS_PER_CHAR); +#if BYTES_PER_CHAR==1 +#define HTOLS(A) (A) +#else +#define HTOLS(A) ((((A) >> 8)&0xff)|(((A) & 0xff)<<8)) +#endif + for (i=0;i<max_nchars;i++) + chars[i]=HTOLS(bits->chars[i]); + return max_nchars*BYTES_PER_CHAR; } -int speex_bits_write_whole_bytes(SpeexBits *bits, char *bytes, int max_len) +int speex_bits_write_whole_bytes(SpeexBits *bits, char *chars, int max_nbytes) { + int max_nchars = max_nbytes/BYTES_PER_CHAR; int i; - if (max_len > ((bits->nbBits)>>3)) - max_len = ((bits->nbBits)>>3); - for (i=0;i<max_len;i++) - bytes[i]=bits->bytes[i]; + if (max_nchars > ((bits->nbBits)>>LOG2_BITS_PER_CHAR)) + max_nchars = ((bits->nbBits)>>LOG2_BITS_PER_CHAR); + for (i=0;i<max_nchars;i++) + chars[i]=bits->chars[i]; if (bits->bitPtr>0) - bits->bytes[0]=bits->bytes[max_len]; + bits->chars[0]=bits->chars[max_nchars]; else - bits->bytes[0]=0; - for (i=1;i<((bits->nbBits)>>3)+1;i++) - bits->bytes[i]=0; - bits->bytePtr=0; - bits->nbBits &= 7; - return max_len; + bits->chars[0]=0; + for (i=1;i<((bits->nbBits)>>LOG2_BITS_PER_CHAR)+1;i++) + bits->chars[i]=0; + bits->charPtr=0; + bits->nbBits &= (BITS_PER_CHAR-1); + return max_nchars*BYTES_PER_CHAR; } - void speex_bits_pack(SpeexBits *bits, int data, int nbBits) { - int i; unsigned int d=data; - if (bits->bytePtr+((nbBits+bits->bitPtr)>>3) >= bits->buf_size) + if (bits->charPtr+((nbBits+bits->bitPtr)>>LOG2_BITS_PER_CHAR) >= bits->buf_size) { speex_warning("Buffer too small to pack bits"); if (bits->owner) { - char *tmp = (char*)speex_realloc(bits->bytes, ((bits->buf_size+5)*3)>>1); + int new_nchars = ((bits->buf_size+5)*3)>>1; + char *tmp = (char*)speex_realloc(bits->chars, new_nchars); if (tmp) { - for (i=bits->buf_size;i<(((bits->buf_size+5)*3)>>1);i++) - tmp[i]=0; - bits->buf_size=((bits->buf_size+5)*3)>>1; - bits->bytes=tmp; + speex_memset_bytes(tmp, 0, new_nchars); + bits->buf_size=new_nchars; + bits->chars=tmp; } else { speex_warning("Could not resize input buffer: not packing"); return; @@ -236,14 +243,14 @@ void speex_bits_pack(SpeexBits *bits, int data, int nbBits) { int bit; bit = (d>>(nbBits-1))&1; - bits->bytes[bits->bytePtr] |= bit<<(7-bits->bitPtr); + bits->chars[bits->charPtr] |= bit<<(7-bits->bitPtr); bits->bitPtr++; if (bits->bitPtr==8) { bits->bitPtr=0; - bits->bytePtr++; - bits->bytes[bits->bytePtr] = 0; + bits->charPtr++; + bits->chars[bits->charPtr] = 0; } bits->nbBits++; nbBits--; @@ -264,19 +271,19 @@ int speex_bits_unpack_signed(SpeexBits *bits, int nbBits) unsigned int speex_bits_unpack_unsigned(SpeexBits *bits, int nbBits) { unsigned int d=0; - if ((bits->bytePtr<<3)+bits->bitPtr+nbBits>bits->nbBits) + if ((bits->charPtr<<LOG2_BITS_PER_CHAR)+bits->bitPtr+nbBits>bits->nbBits) bits->overflow=1; if (bits->overflow) return 0; while(nbBits) { d<<=1; - d |= (bits->bytes[bits->bytePtr]>>(7-bits->bitPtr))&1; + d |= (bits->chars[bits->charPtr]>>(BITS_PER_CHAR-1 - bits->bitPtr))&1; bits->bitPtr++; - if (bits->bitPtr==8) + if (bits->bitPtr==BITS_PER_CHAR) { bits->bitPtr=0; - bits->bytePtr++; + bits->charPtr++; } nbBits--; } @@ -286,26 +293,26 @@ unsigned int speex_bits_unpack_unsigned(SpeexBits *bits, int nbBits) unsigned int speex_bits_peek_unsigned(SpeexBits *bits, int nbBits) { unsigned int d=0; - int bitPtr, bytePtr; - char *bytes; + int bitPtr, charPtr; + char *chars; - if ((bits->bytePtr<<3)+bits->bitPtr+nbBits>bits->nbBits) + if ((bits->charPtr<<LOG2_BITS_PER_CHAR)+bits->bitPtr+nbBits>bits->nbBits) bits->overflow=1; if (bits->overflow) return 0; bitPtr=bits->bitPtr; - bytePtr=bits->bytePtr; - bytes = bits->bytes; + charPtr=bits->charPtr; + chars = bits->chars; while(nbBits) { d<<=1; - d |= (bytes[bytePtr]>>(7-bitPtr))&1; + d |= (chars[charPtr]>>(BITS_PER_CHAR-1 - bitPtr))&1; bitPtr++; - if (bitPtr==8) + if (bitPtr==BITS_PER_CHAR) { bitPtr=0; - bytePtr++; + charPtr++; } nbBits--; } @@ -314,21 +321,21 @@ unsigned int speex_bits_peek_unsigned(SpeexBits *bits, int nbBits) int speex_bits_peek(SpeexBits *bits) { - if ((bits->bytePtr<<3)+bits->bitPtr+1>bits->nbBits) + if ((bits->charPtr<<LOG2_BITS_PER_CHAR)+bits->bitPtr+1>bits->nbBits) bits->overflow=1; if (bits->overflow) return 0; - return (bits->bytes[bits->bytePtr]>>(7-bits->bitPtr))&1; + return (bits->chars[bits->charPtr]>>(BITS_PER_CHAR-1 - bits->bitPtr))&1; } void speex_bits_advance(SpeexBits *bits, int n) { - if (((bits->bytePtr<<3)+bits->bitPtr+n>bits->nbBits) || bits->overflow){ + if (((bits->charPtr<<LOG2_BITS_PER_CHAR)+bits->bitPtr+n>bits->nbBits) || bits->overflow){ bits->overflow=1; return; } - bits->bytePtr += (bits->bitPtr+n) >> 3; /*divide by 8*/ - bits->bitPtr = (bits->bitPtr+n) & 7; /* modulo by 8*/ + bits->charPtr += (bits->bitPtr+n) >> LOG2_BITS_PER_CHAR; /* divide by BITS_PER_CHAR */ + bits->bitPtr = (bits->bitPtr+n) & (BITS_PER_CHAR-1); /* modulo by BITS_PER_CHAR */ } int speex_bits_remaining(SpeexBits *bits) @@ -336,18 +343,18 @@ int speex_bits_remaining(SpeexBits *bits) if (bits->overflow) return -1; else - return bits->nbBits-((bits->bytePtr<<3)+bits->bitPtr); + return bits->nbBits-((bits->charPtr<<LOG2_BITS_PER_CHAR)+bits->bitPtr); } int speex_bits_nbytes(SpeexBits *bits) { - return ((bits->nbBits+7)>>3); + return ((bits->nbBits+BITS_PER_CHAR-1)>>LOG2_BITS_PER_CHAR); } void speex_bits_insert_terminator(SpeexBits *bits) { - if (bits->bitPtr<7) + if (bits->bitPtr<BITS_PER_CHAR-1) speex_bits_pack(bits, 0, 1); - while (bits->bitPtr<7) + while (bits->bitPtr<BITS_PER_CHAR-1) speex_bits_pack(bits, 1, 1); } diff --git a/libspeex/cb_search.c b/libspeex/cb_search.c index 7bf5716..0099da0 100644 --- a/libspeex/cb_search.c +++ b/libspeex/cb_search.c @@ -168,10 +168,10 @@ int update_target res = resp+rind*subvect_size; if (sign>0) for (m=0;m<subvect_size;m++) - t[subvect_size*i+m] -= res[m]; + t[subvect_size*i+m] = SUB16(t[subvect_size*i+m], res[m]); else for (m=0;m<subvect_size;m++) - t[subvect_size*i+m] += res[m]; + t[subvect_size*i+m] = ADD16(t[subvect_size*i+m], res[m]); #ifdef FIXED_POINT if (sign) @@ -217,7 +217,7 @@ int update_target /* Update excitation */ /* FIXME: We could update the excitation directly above */ for (j=0;j<nsf;j++) - exc[j]+=e[j]; + exc[j]=ADD32(exc[j],e[j]); /* Update target: only update target if necessary */ if (update_target) @@ -226,7 +226,7 @@ int update_target ALLOC(r2, nsf, spx_sig_t); syn_percep_zero(e, ak, awk1, awk2, r2, nsf,p, stack); for (j=0;j<nsf;j++) - target[j]-=r2[j]; + target[j]=SUB32(target[j],r2[j]); } } @@ -393,10 +393,10 @@ int update_target res = resp+rind*subvect_size; if (sign>0) for (m=0;m<subvect_size;m++) - t[subvect_size*i+m] -= res[m]; + t[subvect_size*i+m] = SUB16(t[subvect_size*i+m], res[m]); else for (m=0;m<subvect_size;m++) - t[subvect_size*i+m] += res[m]; + t[subvect_size*i+m] = ADD16(t[subvect_size*i+m], res[m]); } /*compute error (distance)*/ @@ -512,14 +512,14 @@ int update_target } /* Update excitation */ for (j=0;j<nsf;j++) - exc[j]+=e[j]; + exc[j]=ADD32(exc[j],e[j]); /* Update target: only update target if necessary */ if (update_target) { syn_percep_zero(e, ak, awk1, awk2, r2, nsf,p, stack); for (j=0;j<nsf;j++) - target[j]-=r2[j]; + target[j]=SUB32(target[j],r2[j]); } } diff --git a/libspeex/filters.c b/libspeex/filters.c index 966b786..e76ddfd 100644 --- a/libspeex/filters.c +++ b/libspeex/filters.c @@ -148,14 +148,14 @@ spx_word16_t compute_rms(const spx_sig_t *x, int len) spx_word32_t sum2=0; spx_word16_t tmp; tmp = SHR(x[i],sig_shift); - sum2 += MULT16_16(tmp,tmp); + sum2 = MAC16_16(sum2,tmp,tmp); tmp = SHR(x[i+1],sig_shift); - sum2 += MULT16_16(tmp,tmp); + sum2 = MAC16_16(sum2,tmp,tmp); tmp = SHR(x[i+2],sig_shift); - sum2 += MULT16_16(tmp,tmp); + sum2 = MAC16_16(sum2,tmp,tmp); tmp = SHR(x[i+3],sig_shift); - sum2 += MULT16_16(tmp,tmp); - sum += SHR(sum2,6); + sum2 = MAC16_16(sum2,tmp,tmp); + sum = ADD32(sum,SHR(sum2,6)); } return SHR(SHL((spx_word32_t)spx_sqrt(1+DIV32(sum,len)),(sig_shift+3)),SIG_SHIFT); @@ -166,7 +166,7 @@ spx_word16_t compute_rms(const spx_sig_t *x, int len) #else -int normalize16(const spx_sig_t *x, spx_word16_t *y, int max_scale, int len) +int normalize16(const spx_sig_t *x, spx_word16_t *y, spx_sig_t max_scale, int len) { int i; spx_sig_t max_val=1; @@ -201,11 +201,9 @@ void filter_mem2(const spx_sig_t *x, const spx_coef_t *num, const spx_coef_t *de for (i=0;i<N;i++) { - int xh,xl,yh,yl; xi=SATURATE(x[i],805306368); yi = SATURATE(ADD32(xi, SHL(mem[0],2)),805306368); nyi = -yi; - xh = xi>>15; xl=xi&0x00007fff; yh = yi>>15; yl=yi&0x00007fff; for (j=0;j<ord-1;j++) { mem[j] = MAC16_32_Q15(MAC16_32_Q15(mem[j+1], num[j+1],xi), den[j+1],nyi); @@ -222,11 +220,9 @@ void iir_mem2(const spx_sig_t *x, const spx_coef_t *den, spx_sig_t *y, int N, in for (i=0;i<N;i++) { - int yh,yl; xi=SATURATE(x[i],805306368); yi = SATURATE(xi + (mem[0]<<2),805306368); nyi = -yi; - yh = yi>>15; yl=yi&0x00007fff; for (j=0;j<ord-1;j++) { mem[j] = MAC16_32_Q15(mem[j+1],den[j+1],nyi); @@ -247,10 +243,8 @@ void fir_mem2(const spx_sig_t *x, const spx_coef_t *num, spx_sig_t *y, int N, in for (i=0;i<N;i++) { - int xh,xl; xi=SATURATE(x[i],805306368); yi = xi + (mem[0]<<2); - xh = xi>>15; xl=xi&0x00007fff; for (j=0;j<ord-1;j++) { mem[j] = MAC16_32_Q15(mem[j+1], num[j+1],xi); @@ -258,7 +252,6 @@ void fir_mem2(const spx_sig_t *x, const spx_coef_t *num, spx_sig_t *y, int N, in mem[ord-1] = MULT16_32_Q15(num[ord],xi); y[i] = SATURATE(yi,805306368); } - } #else @@ -384,11 +377,11 @@ void qmf_decomp(const spx_word16_t *xx, const spx_word16_t *aa, spx_sig_t *y1, s y2[k]=0; for (j=0;j<M2;j++) { - y1[k]+=SHR(MULT16_16(a[j],ADD16(x[i+j],x2[i-j])),1); - y2[k]-=SHR(MULT16_16(a[j],SUB16(x[i+j],x2[i-j])),1); + y1[k]=ADD32(y1[k],SHR(MULT16_16(a[j],ADD16(x[i+j],x2[i-j])),1)); + y2[k]=SUB32(y2[k],SHR(MULT16_16(a[j],SUB16(x[i+j],x2[i-j])),1)); j++; - y1[k]+=SHR(MULT16_16(a[j],ADD16(x[i+j],x2[i-j])),1); - y2[k]+=SHR(MULT16_16(a[j],SUB16(x[i+j],x2[i-j])),1); + y1[k]=ADD32(y1[k],SHR(MULT16_16(a[j],ADD16(x[i+j],x2[i-j])),1)); + y2[k]=ADD32(y2[k],SHR(MULT16_16(a[j],SUB16(x[i+j],x2[i-j])),1)); } } for (i=0;i<M-1;i++) @@ -427,19 +420,19 @@ void fir_mem_up(const spx_sig_t *x, const spx_word16_t *a, spx_sig_t *y, int N, a1 = a[j+1]; x1 = xx[N-2+j-i]; - y0 += SHR(MULT16_16(a0, x1),1); - y1 += SHR(MULT16_16(a1, x1),1); - y2 += SHR(MULT16_16(a0, x0),1); - y3 += SHR(MULT16_16(a1, x0),1); + y0 = ADD32(y0,SHR(MULT16_16(a0, x1),1)); + y1 = ADD32(y1,SHR(MULT16_16(a1, x1),1)); + y2 = ADD32(y2,SHR(MULT16_16(a0, x0),1)); + y3 = ADD32(y3,SHR(MULT16_16(a1, x0),1)); a0 = a[j+2]; a1 = a[j+3]; x0 = xx[N+j-i]; - y0 += SHR(MULT16_16(a0, x0),1); - y1 += SHR(MULT16_16(a1, x0),1); - y2 += SHR(MULT16_16(a0, x1),1); - y3 += SHR(MULT16_16(a1, x1),1); + y0 = ADD32(y0,SHR(MULT16_16(a0, x0),1)); + y1 = ADD32(y1,SHR(MULT16_16(a1, x0),1)); + y2 = ADD32(y2,SHR(MULT16_16(a0, x1),1)); + y3 = ADD32(y3,SHR(MULT16_16(a1, x1),1)); } y[i] = y0; y[i+1] = y1; @@ -516,7 +509,7 @@ CombFilterMem *mem { spx_word32_t exc1, exc2; - fact += step; + fact = ADD16(fact,step); exc1 = SHL(MULT16_32_Q15(SHL(pitch_gain[0],7),exc[i-pitch+1]) + MULT16_32_Q15(SHL(pitch_gain[1],7),exc[i-pitch]) + diff --git a/libspeex/filters.h b/libspeex/filters.h index df43fc8..6dcecbd 100644 --- a/libspeex/filters.h +++ b/libspeex/filters.h @@ -41,7 +41,7 @@ void signal_div(const spx_sig_t *x, spx_sig_t *y, spx_word32_t scale, int len); #ifdef FIXED_POINT -int normalize16(const spx_sig_t *x, spx_word16_t *y, int max_scale, int len); +int normalize16(const spx_sig_t *x, spx_word16_t *y, spx_sig_t max_scale, int len); #endif diff --git a/libspeex/fixed_arm4.h b/libspeex/fixed_arm4.h index 6a239f5..e57c912 100644 --- a/libspeex/fixed_arm4.h +++ b/libspeex/fixed_arm4.h @@ -92,6 +92,7 @@ static inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) { #define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11))) +#define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13))) #define MULT16_16_Q11(a,b) (SHR(MULT16_16((a),(b)),11)) #define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) diff --git a/libspeex/fixed_arm5e.h b/libspeex/fixed_arm5e.h index 34fa8ab..b8a5773 100644 --- a/libspeex/fixed_arm5e.h +++ b/libspeex/fixed_arm5e.h @@ -102,6 +102,7 @@ static inline spx_word32_t MAC16_32_Q11(spx_word32_t a, spx_word16_t x, spx_word } #define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11))) +#define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13))) #define MULT16_16_Q11(a,b) (SHR(MULT16_16((a),(b)),11)) #define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) diff --git a/libspeex/fixed_debug.h b/libspeex/fixed_debug.h index e48c8aa..5e835b1 100644 --- a/libspeex/fixed_debug.h +++ b/libspeex/fixed_debug.h @@ -137,6 +137,7 @@ static inline int MULT16_16(int a, int b) #define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) #define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11))) +#define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13))) #define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12)) #define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13)) diff --git a/libspeex/fixed_generic.h b/libspeex/fixed_generic.h index a1ac244..48e8d67 100644 --- a/libspeex/fixed_generic.h +++ b/libspeex/fixed_generic.h @@ -36,27 +36,30 @@ #define FIXED_GENERIC_H #define SHR(a,shift) ((a) >> (shift)) -#define SHL(a,shift) ((a) << (shift)) +#define SHL(a,shift) ((spx_word32_t)(a) << (shift)) -#define SATURATE(x,a) ((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)) +#define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) -#define ADD16(a,b) ((short)((short)(a)+(short)(b))) -#define SUB16(a,b) ((a)-(b)) -#define ADD32(a,b) ((a)+(b)) -#define SUB32(a,b) ((a)-(b)) -#define ADD64(a,b) ((a)+(b)) +static inline spx_word32_t slow_saturate(spx_word32_t x, spx_word16_t a) +{ + return (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))); +} + +#define ADD16(a,b) ((spx_word16_t)((spx_word16_t)(a)+(spx_word16_t)(b))) +#define SUB16(a,b) ((spx_word16_t)(a)-(spx_word16_t)(b)) +#define ADD32(a,b) ((spx_word32_t)(a)+(spx_word32_t)(b)) +#define SUB32(a,b) ((spx_word32_t)(a)-(spx_word32_t)(b)) +#define ADD64(a,b) ((spx_word64_t)(a)+(spx_word64_t)(b)) #define PSHR(a,shift) (SHR((a)+(1<<((shift)-1)),shift)) /* result fits in 16 bits */ -#define MULT16_16_16(a,b) ((((short)(a))*((short)(b)))) - -#define MULT16_16(a,b) (((short)(a))*((short)(b))) - - +#define MULT16_16_16(a,b) ((((spx_word16_t)(a))*((spx_word16_t)(b)))) +/* (spx_word32_t)(spx_word16_t) gives TI compiler a hint that it's 16x16->32 multiply */ +#define MULT16_16(a,b) (((spx_word32_t)(spx_word16_t)(a))*((spx_word32_t)(spx_word16_t)(b))) -#define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) +#define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) #define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12)) #define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13)) #define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14)) @@ -69,6 +72,7 @@ #define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11))) +#define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13))) #define MULT16_16_Q11(a,b) (SHR(MULT16_16((a),(b)),11)) #define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) @@ -81,11 +85,7 @@ #define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15)) - - -#define DIV32_16(a,b) ((short)(((signed int)(a))/((short)(b)))) -#define DIV32(a,b) (((signed int)(a))/((signed int)(b))) - - +#define DIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a))/((spx_word16_t)(b)))) +#define DIV32(a,b) (((spx_word32_t)(a))/((spx_word32_t)(b))) #endif diff --git a/libspeex/jitter.c b/libspeex/jitter.c index 0f0cd85..362d7d5 100644 --- a/libspeex/jitter.c +++ b/libspeex/jitter.c @@ -40,6 +40,7 @@ #define NULL 0 #endif +#include "misc.h" #include <speex/speex.h> #include <speex/speex_bits.h> #include <speex/speex_jitter.h> @@ -139,7 +140,7 @@ void speex_jitter_put(SpeexJitter *jitter, char *packet, int len, int timestamp) /* Copy packet in buffer */ if (len>SPEEX_JITTER_MAX_PACKET_SIZE) len=SPEEX_JITTER_MAX_PACKET_SIZE; - for (j=0;j<len;j++) + for (j=0;j<len/BYTES_PER_CHAR;j++) jitter->buf[i][j]=packet[j]; jitter->timestamp[i]=timestamp; jitter->len[i]=len; diff --git a/libspeex/lpc.c b/libspeex/lpc.c index 45167f9..d53c438 100644 --- a/libspeex/lpc.c +++ b/libspeex/lpc.c @@ -90,9 +90,9 @@ int p /* Sum up this iteration's reflection coefficient */ spx_word32_t rr = -SHL(ac[i + 1],13); for (j = 0; j < i; j++) - rr -= MULT16_16(lpc[j],ac[i - j]); + rr = SUB32(rr,MULT16_16(lpc[j],ac[i - j])); #ifdef FIXED_POINT - r = DIV32_16(rr,error+16); + r = DIV32_16(rr,ADD16(error,16)); #else r = rr/(error+.003*ac[0]); #endif @@ -101,13 +101,13 @@ int p for (j = 0; j < i>>1; j++) { spx_word16_t tmp = lpc[j]; - lpc[j] += MULT16_16_Q13(r,lpc[i-1-j]); - lpc[i-1-j] += MULT16_16_Q13(r,tmp); + lpc[j] = MAC16_16_Q13(lpc[j],r,lpc[i-1-j]); + lpc[i-1-j] = MAC16_16_Q13(lpc[i-1-j],r,tmp); } if (i & 1) - lpc[j] += MULT16_16_Q13(lpc[j],r); + lpc[j] = MAC16_16_Q13(lpc[j],lpc[j],r); - error -= MULT16_16_Q13(r,MULT16_16_Q13(error,r)); + error = SUB16(error,MULT16_16_Q13(r,MULT16_16_Q13(error,r))); } return error; } @@ -135,8 +135,8 @@ int n int shift, ac_shift; for (j=0;j<n;j++) - ac0 += SHR(MULT16_16(x[j],x[j]),8); - ac0 += n; + ac0 = ADD32(ac0,SHR(MULT16_16(x[j],x[j]),8)); + ac0 = ADD32(ac0,n); shift = 8; while (shift && ac0<0x40000000) { @@ -156,10 +156,10 @@ int n d=0; for (j=i;j<n;j++) { - d += MULT16_16(x[j],x[j-i]) >> shift; + d = ADD32(d,SHR(MULT16_16(x[j],x[j-i]), shift)); } - ac[i] = d >> ac_shift; + ac[i] = SHR(d, ac_shift); } } diff --git a/libspeex/lsp.c b/libspeex/lsp.c index 00b41bf..6d70348 100644 --- a/libspeex/lsp.c +++ b/libspeex/lsp.c @@ -6,7 +6,8 @@ Original copyright AUTHOR......: David Rowe DATE CREATED: 24/2/93 -Modified by Jean-Marc Valin +Heavily modified by Jean-Marc Valin (fixed-point, optimizations, + additional functions, ...) This file contains functions for converting Linear Prediction Coefficients (LPC) to Line Spectral Pair (LSP) and back. Note that the @@ -98,10 +99,10 @@ static spx_word16_t spx_cos(spx_word16_t x) #define C2 -0.49558072 #define C3 0.03679168*/ -#define C1 0.9999932946 -#define C2 -0.4999124376 -#define C3 0.0414877472 -#define C4 -0.0012712095 +#define C1 0.9999932946f +#define C2 -0.4999124376f +#define C3 0.0414877472f +#define C4 -0.0012712095f #define SPX_PI_2 1.5707963268 @@ -465,10 +466,11 @@ void lsp_to_lpc(spx_lsp_t *freq,spx_coef_t *ak,int lpcrdr, char *stack) xout1 = xin1 + *(n4+1); xout2 = xin2 - *(n4+2); /* FIXME: perhaps apply bandwidth expansion in case of overflow? */ - if (xout1 + xout2>256*32766) + /*FIXME: Is it OK to have a long constant? */ + if (xout1 + xout2>SHL(32766,8)) ak[j] = 32767; - else if (xout1 + xout2 < -256*32767) - ak[j] = -32768; + else if (xout1 + xout2 < -SHL(32766,8)) + ak[j] = -32767; else ak[j] = PSHR(ADD32(xout1,xout2),8); *(n4+1) = xin1; diff --git a/libspeex/ltp.c b/libspeex/ltp.c index 217d51b..431f0ad 100644 --- a/libspeex/ltp.c +++ b/libspeex/ltp.c @@ -272,19 +272,19 @@ void open_loop_nbest_pitch(spx_sig_t *sw, int start, int end, int len, int *pitc /** Finds the best quantized 3-tap pitch predictor by analysis by synthesis */ static spx_word64_t pitch_gain_search_3tap( -spx_sig_t target[], /* Target vector */ -spx_coef_t ak[], /* LPCs for this subframe */ -spx_coef_t awk1[], /* Weighted LPCs #1 for this subframe */ -spx_coef_t awk2[], /* Weighted LPCs #2 for this subframe */ -spx_sig_t exc[], /* Excitation */ +const spx_sig_t target[], /* Target vector */ +const spx_coef_t ak[], /* LPCs for this subframe */ +const spx_coef_t awk1[], /* Weighted LPCs #1 for this subframe */ +const spx_coef_t awk2[], /* Weighted LPCs #2 for this subframe */ +spx_sig_t exc[], /* Excitation */ const void *par, int pitch, /* Pitch value */ int p, /* Number of LPC coeffs */ int nsf, /* Number of samples in subframe */ SpeexBits *bits, char *stack, -spx_sig_t *exc2, -spx_sig_t *r, +const spx_sig_t *exc2, +const spx_sig_t *r, spx_sig_t *new_target, int *cdbk_index, int cdbk_offset @@ -487,8 +487,8 @@ int cdbk_offset { spx_word16_t perr2; spx_sig_t tmp = SHL((MULT16_32_Q15(SHL(gain[0],7),x[2][i])+MULT16_32_Q15(SHL(gain[1],7),x[1][i])+MULT16_32_Q15(SHL(gain[2],7),x[0][i])),2); - spx_sig_t perr=target[i]-tmp; - new_target[i] = target[i] - tmp; + spx_sig_t perr=SUB32(target[i],tmp); + new_target[i] = SUB32(target[i], tmp); perr2 = PSHR(perr,15); err = ADD64(err,MULT16_16(perr2,perr2)); diff --git a/libspeex/misc.c b/libspeex/misc.c index 27cd0c1..d412f49 100644 --- a/libspeex/misc.c +++ b/libspeex/misc.c @@ -55,9 +55,9 @@ long long spx_mips=0; #endif -unsigned int be_int(unsigned int i) +spx_uint32_t be_int(spx_uint32_t i) { - unsigned int ret=i; + spx_uint32_t ret=i; #ifndef WORDS_BIGENDIAN ret = i>>24; ret += (i>>8)&0x0000ff00; @@ -67,9 +67,9 @@ unsigned int be_int(unsigned int i) return ret; } -unsigned int le_int(unsigned int i) +spx_uint32_t le_int(spx_uint32_t i) { - unsigned int ret=i; + spx_uint32_t ret=i; #ifdef WORDS_BIGENDIAN ret = i>>24; ret += (i>>8)&0x0000ff00; @@ -99,6 +99,50 @@ unsigned short le_short(unsigned short s) return ret; } +#if BYTES_PER_CHAR == 2 +void speex_memcpy_bytes(char *dst, char *src, int nbytes) +{ + int i; + int nchars = nbytes/BYTES_PER_CHAR; + for (i=0;i<nchars;i++) + dst[i]=src[i]; + if (nbytes & 1) { + /* copy in the last byte */ + int last_i = nchars; + char last_dst_char = dst[last_i]; + char last_src_char = src[last_i]; + last_dst_char &= 0xff00; + last_dst_char |= (last_src_char & 0x00ff); + dst[last_i] = last_dst_char; + } +} +void speex_memset_bytes(char *dst, char c, int nbytes) +{ + int i; + short cc = ((c << 8) | c); + int nchars = nbytes/BYTES_PER_CHAR; + for (i=0;i<nchars;i++) + dst[i]=cc; + if (nbytes & 1) { + /* copy in the last byte */ + int last_i = nchars; + char last_dst_char = dst[last_i]; + last_dst_char &= 0xff00; + last_dst_char |= (c & 0x00ff); + dst[last_i] = last_dst_char; + } +} +#else +void speex_memcpy_bytes(char *dst, char *src, int nbytes) +{ + memcpy(dst, src, nbytes); +} +void speex_memset_bytes(char *dst, char src, int nbytes) +{ + memset(dst, src, nbytes); +} +#endif + void *speex_alloc (int size) { return calloc(size,1); @@ -150,5 +194,5 @@ float speex_rand(float std) void _speex_putc(int ch, void *file) { FILE *f = (FILE *)file; - fputc(ch, f); + fprintf(f, "%c", ch); } diff --git a/libspeex/misc.h b/libspeex/misc.h index c004f55..cfb7c94 100644 --- a/libspeex/misc.h +++ b/libspeex/misc.h @@ -49,8 +49,8 @@ void print_vec(float *vec, int len, char *name); #endif -unsigned int be_int(unsigned int i); -unsigned int le_int(unsigned int i); +spx_uint32_t be_int(spx_uint32_t i); +spx_uint32_t le_int(spx_uint32_t i); unsigned short be_short(unsigned short s); @@ -68,6 +68,9 @@ void speex_free (void *ptr); /** Speex wrapper for mem_move */ void *speex_move (void *dest, void *src, int n); +void speex_memcpy_bytes(char *dst, char *src, int nbytes); +void speex_memset_bytes(char *dst, char src, int nbytes); + void speex_error(char *str); void speex_warning(char *str); diff --git a/libspeex/modes.c b/libspeex/modes.c index 360a177..4c3ae55 100644 --- a/libspeex/modes.c +++ b/libspeex/modes.c @@ -150,6 +150,8 @@ static const split_cb_params split_cb_sb = { 0, }; +#ifndef DISABLE_WIDEBAND + /* Split-VQ innovation for high-band wideband */ static const split_cb_params split_cb_high = { 8, /*subvect_size*/ @@ -169,6 +171,8 @@ static const split_cb_params split_cb_high_lbr = { 0, }; +#endif + /* 2150 bps "vocoder-like" mode for comfort noise */ static const SpeexSubmode nb_submode1 = { 0, @@ -454,7 +458,11 @@ static const SpeexSubmode wb_submode2 = { /*Innovation quantization*/ split_cb_search_shape_sign, split_cb_shape_sign_unquant, +#ifdef DISABLE_WIDEBAND + NULL, +#else &split_cb_high_lbr, +#endif #ifdef FIXED_POINT 27853, 19661, 8192, -1, #else @@ -479,7 +487,11 @@ static const SpeexSubmode wb_submode3 = { /*Innovation quantization*/ split_cb_search_shape_sign, split_cb_shape_sign_unquant, +#ifdef DISABLE_WIDEBAND + NULL, +#else &split_cb_high, +#endif #ifdef FIXED_POINT 24576, 22938, 1638, -1, @@ -504,7 +516,11 @@ static const SpeexSubmode wb_submode4 = { /*Innovation quantization*/ split_cb_search_shape_sign, split_cb_shape_sign_unquant, +#ifdef DISABLE_WIDEBAND + NULL, +#else &split_cb_high, +#endif #ifdef FIXED_POINT 24576, 24576, 0, -1, #else diff --git a/libspeex/nb_celp.c b/libspeex/nb_celp.c index e6c33c7..de1771e 100644 --- a/libspeex/nb_celp.c +++ b/libspeex/nb_celp.c @@ -667,7 +667,8 @@ int nb_encode(void *state, void *vin, SpeexBits *bits) spx_word32_t pi_g=st->interp_qlpc[0]; for (i=1;i<=st->lpcSize;i+=2) { - pi_g += -st->interp_qlpc[i] + st->interp_qlpc[i+1]; + /*pi_g += -st->interp_qlpc[i] + st->interp_qlpc[i+1];*/ + pi_g = ADD32(pi_g, SUB32(st->interp_qlpc[i+1],st->interp_qlpc[i])); } st->pi_gain[sub] = pi_g; } @@ -851,7 +852,7 @@ int nb_encode(void *state, void *vin, SpeexBits *bits) signal_mul(innov, innov, ener, st->subframeSize); for (i=0;i<st->subframeSize;i++) - exc[i] += innov[i]; + exc[i] = ADD32(exc[i],innov[i]); } else { speex_error("No fixed codebook"); } @@ -870,7 +871,7 @@ int nb_encode(void *state, void *vin, SpeexBits *bits) innov2, syn_resp, bits, stack, st->complexity, 0); signal_mul(innov2, innov2, (spx_word32_t) (ener*(1/2.2)), st->subframeSize); for (i=0;i<st->subframeSize;i++) - exc[i] += innov2[i]; + exc[i] = ADD32(exc[i],innov2[i]); stack = tmp_stack; } @@ -1415,7 +1416,8 @@ int nb_decode(void *state, SpeexBits *bits, void *vout) spx_word32_t pi_g=st->interp_qlpc[0]; for (i=1;i<=st->lpcSize;i+=2) { - pi_g += -st->interp_qlpc[i] + st->interp_qlpc[i+1]; + /*pi_g += -st->interp_qlpc[i] + st->interp_qlpc[i+1];*/ + pi_g = ADD32(pi_g, SUB32(st->interp_qlpc[i+1],st->interp_qlpc[i])); } st->pi_gain[sub] = pi_g; } @@ -1565,7 +1567,7 @@ int nb_decode(void *state, SpeexBits *bits, void *vout) } } else { for (i=0;i<st->subframeSize;i++) - exc[i]+=innov[i]; + exc[i]=ADD32(exc[i],innov[i]); /*print_vec(exc, 40, "innov");*/ } /* Decode second codebook (only for some modes) */ @@ -1579,7 +1581,7 @@ int nb_decode(void *state, SpeexBits *bits, void *vout) SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), st->subframeSize, bits, stack); signal_mul(innov2, innov2, (spx_word32_t) (ener*(1/2.2)), st->subframeSize); for (i=0;i<st->subframeSize;i++) - exc[i] += innov2[i]; + exc[i] = ADD32(exc[i],innov2[i]); stack = tmp_stack; } diff --git a/libspeex/quant_lsp.c b/libspeex/quant_lsp.c index cdaf0f9..7961443 100644 --- a/libspeex/quant_lsp.c +++ b/libspeex/quant_lsp.c @@ -295,6 +295,16 @@ void lsp_unquant_lbr(spx_lsp_t *lsp, int order, SpeexBits *bits) } +#ifdef DISABLE_WIDEBAND +void lsp_quant_high(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits) +{ + speex_error("Wideband and Ultra-wideband are disabled"); +} +void lsp_unquant_high(spx_lsp_t *lsp, int order, SpeexBits *bits) +{ + speex_error("Wideband and Ultra-wideband are disabled"); +} +#else extern const signed char high_lsp_cdbk[]; extern const signed char high_lsp_cdbk2[]; @@ -364,6 +374,8 @@ void lsp_unquant_high(spx_lsp_t *lsp, int order, SpeexBits *bits) lsp[i] += LSP_DIV_512(high_lsp_cdbk2[id*order+i]); } +#endif + #ifdef EPIC_48K diff --git a/libspeex/sb_celp.c b/libspeex/sb_celp.c index d34678d..7525708 100644 --- a/libspeex/sb_celp.c +++ b/libspeex/sb_celp.c @@ -46,6 +46,48 @@ #include "ltp.h" #include "misc.h" +#ifdef DISABLE_WIDEBAND +void *sb_encoder_init(const SpeexMode *m) +{ + speex_error("Wideband and Ultra-wideband are disabled"); + return NULL; +} +void sb_encoder_destroy(void *state) +{ + speex_error("Wideband and Ultra-wideband are disabled"); +} +int sb_encode(void *state, void *vin, SpeexBits *bits) +{ + speex_error("Wideband and Ultra-wideband are disabled"); + return -2; +} +void *sb_decoder_init(const SpeexMode *m) +{ + speex_error("Wideband and Ultra-wideband are disabled"); + return NULL; +} +void sb_decoder_destroy(void *state) +{ + speex_error("Wideband and Ultra-wideband are disabled"); +} +int sb_decode(void *state, SpeexBits *bits, void *vout) +{ + speex_error("Wideband and Ultra-wideband are disabled"); + return -2; +} +int sb_encoder_ctl(void *state, int request, void *ptr) +{ + speex_error("Wideband and Ultra-wideband are disabled"); + return -2; +} +int sb_decoder_ctl(void *state, int request, void *ptr) +{ + speex_error("Wideband and Ultra-wideband are disabled"); + return -2; +} +#else + + #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif @@ -307,7 +349,7 @@ int sb_encode(void *state, void *vin, SpeexBits *bits) qmf_decomp(in, h0, st->x0d, st->x1d, st->full_frame_size, QMF_ORDER, st->h0_mem, stack); for (i=0;i<st->frame_size;i++) - low[i] = PSHR(st->x0d[i],SIG_SHIFT); + low[i] = SATURATE(PSHR(st->x0d[i],SIG_SHIFT),32767); /* Encode the narrowband part*/ speex_encode_native(st->st_low, low, bits); @@ -679,7 +721,7 @@ int sb_encode(void *state, void *vin, SpeexBits *bits) signal_mul(innov, innov, scale, st->subframeSize); for (i=0;i<st->subframeSize;i++) - exc[i] += innov[i]; + exc[i] = ADD32(exc[i], innov[i]); if (SUBMODE(double_codebook)) { char *tmp_stack=stack; @@ -695,7 +737,7 @@ int sb_encode(void *state, void *vin, SpeexBits *bits) for (i=0;i<st->subframeSize;i++) innov2[i]*=scale*(1/2.5)/SIG_SCALING; for (i=0;i<st->subframeSize;i++) - exc[i] += innov2[i]; + exc[i] = ADD32(exc[i],innov2[i]); stack = tmp_stack; } @@ -1106,7 +1148,7 @@ int sb_decode(void *state, SpeexBits *bits, void *vout) for (i=0;i<st->subframeSize;i++) innov2[i]*=scale/(float)SIG_SCALING*(1/2.5); for (i=0;i<st->subframeSize;i++) - exc[i] += innov2[i]; + exc[i] = ADD32(exc[i],innov2[i]); stack = tmp_stack; } @@ -1462,3 +1504,6 @@ int sb_decoder_ctl(void *state, int request, void *ptr) } return 0; } + +#endif + diff --git a/libspeex/speex.c b/libspeex/speex.c index 20f163b..24b3d85 100644 --- a/libspeex/speex.c +++ b/libspeex/speex.c @@ -103,7 +103,9 @@ int speex_encode(void *state, float *in, SpeexBits *bits) int speex_encode_int(void *state, short *in, SpeexBits *bits) { - return (*((SpeexMode**)state))->enc(state, in, bits); + SpeexMode *mode; + mode = *(SpeexMode**)state; + return (mode)->enc(state, in, bits); } int speex_decode(void *state, SpeexBits *bits, float *out) @@ -120,7 +122,8 @@ int speex_decode(void *state, SpeexBits *bits, float *out) int speex_decode_int(void *state, SpeexBits *bits, short *out) { - return (*((SpeexMode**)state))->dec(state, bits, out); + SpeexMode *mode = *(SpeexMode**)state; + return (mode)->dec(state, bits, out); } #else @@ -260,7 +263,6 @@ int speex_lib_ctl(int request, void *ptr) default: speex_warning_int("Unknown wb_mode_query request: ", request); return -1; - break; } return 0; } diff --git a/libspeex/speex_callbacks.c b/libspeex/speex_callbacks.c index a1d4a30..0b99188 100644 --- a/libspeex/speex_callbacks.c +++ b/libspeex/speex_callbacks.c @@ -125,6 +125,7 @@ int speex_std_char_handler(SpeexBits *bits, void *state, void *data) unsigned char ch; ch = speex_bits_unpack_unsigned(bits, 8); _speex_putc(ch, data); + /*printf("speex_std_char_handler ch=%x\n", ch);*/ return 0; } diff --git a/libspeex/speex_header.c b/libspeex/speex_header.c index 89482f3..7f674e7 100644 --- a/libspeex/speex_header.c +++ b/libspeex/speex_header.c @@ -35,8 +35,8 @@ #include "config.h" #endif -#include <speex/speex_header.h> #include "misc.h" +#include <speex/speex_header.h> #include <speex/speex.h> #ifndef NULL diff --git a/libspeex/testenc.c b/libspeex/testenc.c index f7a4d8e..2d8c785 100644 --- a/libspeex/testenc.c +++ b/libspeex/testenc.c @@ -55,7 +55,7 @@ int main(int argc, char **argv) speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp); tmp=4; speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp); - tmp=5; + tmp=1; speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp); speex_mode_query(&speex_nb_mode, SPEEX_MODE_FRAME_SIZE, &tmp); |