Merge "stagefright aacenc/amrwbenc: Remove trailing whitespace"

This commit is contained in:
Conley Owens
2011-07-18 12:37:16 -07:00
committed by Android Code Review
150 changed files with 5142 additions and 5142 deletions

View File

@@ -59,7 +59,7 @@ LOCAL_MODULE := libstagefright_aacenc
LOCAL_ARM_MODE := arm LOCAL_ARM_MODE := arm
LOCAL_STATIC_LIBRARIES := LOCAL_STATIC_LIBRARIES :=
LOCAL_SHARED_LIBRARIES := LOCAL_SHARED_LIBRARIES :=

View File

@@ -29,11 +29,11 @@
#include "cmnMemory.h" #include "cmnMemory.h"
#define VO_AAC_E_OUTPUT 1 #define VO_AAC_E_OUTPUT 1
#define READ_SIZE (1024*8) #define READ_SIZE (1024*8)
unsigned char outBuf[1024*8]; unsigned char outBuf[1024*8];
unsigned char inBuf[READ_SIZE]; unsigned char inBuf[READ_SIZE];
const char* HelpString = const char* HelpString =
"VisualOn AAC encoder Usage:\n" "VisualOn AAC encoder Usage:\n"
"voAACEncTest -if <inputfile.pcm> -of <outputfile.aac> -sr <samplerate> -ch <channel> -br <bitrate> -adts <adts> \n" "voAACEncTest -if <inputfile.pcm> -of <outputfile.aac> -sr <samplerate> -ch <channel> -br <bitrate> -adts <adts> \n"
"-if input file name \n" "-if input file name \n"
@@ -49,7 +49,7 @@ static int parsecmdline(int argc, char **argv,char **input_filename, char **ou
{ {
// notice that: // notice that:
// bitRate/nChannels > 8000 // bitRate/nChannels > 8000
// bitRate/nChannels < 160000 // bitRate/nChannels < 160000
// bitRate/nChannels < sampleRate*6 // bitRate/nChannels < sampleRate*6
param->adtsUsed = 1; param->adtsUsed = 1;
param->bitRate = 0; param->bitRate = 0;
@@ -69,7 +69,7 @@ static int parsecmdline(int argc, char **argv,char **input_filename, char **ou
{ {
argv++; argv++;
argc--; argc--;
*input_filename = *argv; *input_filename = *argv;
} }
else if (!strcmp(*argv, "-of")) else if (!strcmp(*argv, "-of"))
{ {
@@ -173,7 +173,7 @@ int main(int argc, char **argv)
/* open output file */ /* open output file */
if(isOutput) if(isOutput)
{ {
outfile = fopen(outfileName, "wb"); outfile = fopen(outfileName, "wb");
if (!outfile) { if (!outfile) {
printf("Open output file fail..."); printf("Open output file fail...");
return -1; return -1;
@@ -195,7 +195,7 @@ int main(int argc, char **argv)
return -1; return -1;
} }
// Get API; // Get API;
pfunc = dlsym(handle, "voGetAACEncAPI"); pfunc = dlsym(handle, "voGetAACEncAPI");
if(pfunc == 0) if(pfunc == 0)
{ {
printf("open function error......"); printf("open function error......");
@@ -215,13 +215,13 @@ int main(int argc, char **argv)
return -1; return -1;
} }
returnCode = AudioAPI.SetParam(hCodec, VO_PID_AAC_ENCPARAM, &aacpara); returnCode = AudioAPI.SetParam(hCodec, VO_PID_AAC_ENCPARAM, &aacpara);
inData.Buffer = inBuf; inData.Buffer = inBuf;
bytesLeft = ReadFile2Buf(infile,inData.Buffer,READ_SIZE); bytesLeft = ReadFile2Buf(infile,inData.Buffer,READ_SIZE);
//####################################### Encoding Section ######################################### //####################################### Encoding Section #########################################
do { do {
inData.Length = bytesLeft; inData.Length = bytesLeft;
@@ -229,9 +229,9 @@ int main(int argc, char **argv)
outData.Length = 1024*8; outData.Length = 1024*8;
t1 = clock(); t1 = clock();
returnCode = AudioAPI.SetInputData(hCodec,&inData); returnCode = AudioAPI.SetInputData(hCodec,&inData);
do { do {
outData.Buffer = outBuf; outData.Buffer = outBuf;
outData.Length = 1024*8; outData.Length = 1024*8;

View File

@@ -2,15 +2,15 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_SRC_FILES := AAC_E_SAMPLES.c LOCAL_SRC_FILES := AAC_E_SAMPLES.c
LOCAL_SRC_FILES += \ LOCAL_SRC_FILES += \
../../../Common/cmnMemory.c ../../../Common/cmnMemory.c
LOCAL_MODULE := TestvoAACEnc LOCAL_MODULE := TestvoAACEnc
LOCAL_ARM_MODE := arm LOCAL_ARM_MODE := arm
LOCAL_STATIC_LIBRARIES := LOCAL_STATIC_LIBRARIES :=
LOCAL_SHARED_LIBRARIES := libvoAACEnc LOCAL_SHARED_LIBRARIES := libvoAACEnc
@@ -20,5 +20,5 @@ LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/../../../Include \ $(LOCAL_PATH)/../../../Include \
LOCAL_CFLAGS := $(VO_CFLAGS) LOCAL_CFLAGS := $(VO_CFLAGS)
include $(BUILD_EXECUTABLE) include $(BUILD_EXECUTABLE)

View File

@@ -25,8 +25,8 @@ VOMT:= exe
# module macros # module macros
# please append the additional macro definitions here for your module if necessary. # please append the additional macro definitions here for your module if necessary.
# e.g. -DVISUALON, macro VISUALON defined for your module # e.g. -DVISUALON, macro VISUALON defined for your module
VOMM:= #ARMV5E VOMM:= #ARMV5E
@@ -36,7 +36,7 @@ VOTARGET:= voAACEncTestv7
# please modify here to be sure to see the g1.mk # please modify here to be sure to see the g1.mk
include ../../../../Tools/eclair.mk include ../../../../Tools/eclair.mk
# dependent libraries. # dependent libraries.
VODEPLIBS:=-ldl VODEPLIBS:=-ldl
@@ -51,5 +51,5 @@ VORELDIR:=../../../../../Release/
# please modify here to be sure to see the doit.mk # please modify here to be sure to see the doit.mk
include ../../../../Tools/doit.mk include ../../../../Tools/doit.mk

View File

@@ -16,8 +16,8 @@
# please list all objects needed by your target here # please list all objects needed by your target here
OBJS:=AAC_E_SAMPLES.o cmnMemory.o OBJS:=AAC_E_SAMPLES.o cmnMemory.o
# please list all directories that all source files relative with your module(.h .c .cpp) locate # please list all directories that all source files relative with your module(.h .c .cpp) locate
VOSRCDIR:=../ ../../../../include ../../../../Common VOSRCDIR:=../ ../../../../include ../../../../Common

View File

@@ -28,10 +28,10 @@ ifeq ($(VOMT), exe)
TARGET=$(VOTARGET) TARGET=$(VOTARGET)
endif endif
CFLAGS=$(VOCFLAGS) $(addprefix -I, $(VOSRCDIR)) CFLAGS=$(VOCFLAGS) $(addprefix -I, $(VOSRCDIR))
CPPFLAGS=$(VOCPPFLAGS) $(addprefix -I, $(VOSRCDIR)) CPPFLAGS=$(VOCPPFLAGS) $(addprefix -I, $(VOSRCDIR))
ifneq ($(VOTT), pc) ifneq ($(VOTT), pc)
ASFLAGS=$(VOASFLAGS) $(addprefix -I, $(VOSRCDIR)) ASFLAGS=$(VOASFLAGS) $(addprefix -I, $(VOSRCDIR))
endif endif
LDFLAGS:=$(VOLDFLAGS) LDFLAGS:=$(VOLDFLAGS)
@@ -90,7 +90,7 @@ ifneq ($(VODBG), yes)
endif endif
$(LIB_DYNAMIC):$(OBJS) $(LIB_DYNAMIC):$(OBJS)
$(GG) $(LDFLAGS) -o $@ $(OBJDIR)/*.o -Wl,--whole-archive $(VOSTCLIBS) -Wl,--no-whole-archive $(VOTLDEPS) $(GG) $(LDFLAGS) -o $@ $(OBJDIR)/*.o -Wl,--whole-archive $(VOSTCLIBS) -Wl,--no-whole-archive $(VOTLDEPS)
ifneq ($(VODBG), yes) ifneq ($(VODBG), yes)
$(STRIP) $@ $(STRIP) $@
endif endif

View File

@@ -14,10 +14,10 @@
# ** limitations under the License. # ** limitations under the License.
# */ # */
# special macro definitions for building # special macro definitions for building
VOPREDEF=-DLINUX -D_LINUX VOPREDEF=-DLINUX -D_LINUX
VOPRJ ?= VOPRJ ?=
VONJ ?= eclair VONJ ?= eclair
VOTT ?= v6 VOTT ?= v6
# control the version to release out # control the version to release out
@@ -80,19 +80,19 @@ CCTINC:=-I$(TCROOTPATH)/system/core/include \
-I$(TCROOTPATH)/bionic/libthread_db/include \ -I$(TCROOTPATH)/bionic/libthread_db/include \
-I$(TCROOTPATH)/bionic/libm/arm \ -I$(TCROOTPATH)/bionic/libm/arm \
-I$(TCROOTPATH)/bionic/libm \ -I$(TCROOTPATH)/bionic/libm \
-I$(TCROOTPATH)/frameworks/base/include/android_runtime -I$(TCROOTPATH)/frameworks/base/include/android_runtime
#-I$(TCROOTPATH)/out/target/product/$(VOTP)/obj/SHARED_LIBRARIES/libm_intermediates #-I$(TCROOTPATH)/out/target/product/$(VOTP)/obj/SHARED_LIBRARIES/libm_intermediates
CCTCFLAGS:=-msoft-float -mthumb-interwork -fno-exceptions -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -fmessage-length=0 -finline-functions -finline-limit=600 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -fstrict-aliasing -funswitch-loops CCTCFLAGS:=-msoft-float -mthumb-interwork -fno-exceptions -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -fmessage-length=0 -finline-functions -finline-limit=600 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -fstrict-aliasing -funswitch-loops
#-fwide-exec-charset=charset=UTF-32 #-fwide-exec-charset=charset=UTF-32
# for target exe # for target exe
TELDFLAGS:=-nostdlib -Bdynamic -Wl,-T,$(TCROOTPATH)/build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--no-undefined -Wl,-rpath-link=$(CCTLIB) -L$(CCTLIB) TELDFLAGS:=-nostdlib -Bdynamic -Wl,-T,$(TCROOTPATH)/build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--no-undefined -Wl,-rpath-link=$(CCTLIB) -L$(CCTLIB)
VOTEDEPS:=$(CCTLIB)/crtbegin_dynamic.o $(CCTLIB)/crtend_android.o $(TCPATH)/lib/gcc/arm-eabi/$(GCCVER)/interwork/libgcc.a -lc -lm VOTEDEPS:=$(CCTLIB)/crtbegin_dynamic.o $(CCTLIB)/crtend_android.o $(TCPATH)/lib/gcc/arm-eabi/$(GCCVER)/interwork/libgcc.a -lc -lm
# for target lib # for target lib
TLLDFLAGS:=-nostdlib -Wl,-T,$(TCROOTPATH)/build/core/armelf.xsc -Wl,--gc-sections -Wl,-shared,-Bsymbolic -L$(CCTLIB) -Wl,--no-whole-archive -Wl,--no-undefined $(TCPATH)/lib/gcc/arm-eabi/$(GCCVER)/interwork/libgcc.a TLLDFLAGS:=-nostdlib -Wl,-T,$(TCROOTPATH)/build/core/armelf.xsc -Wl,--gc-sections -Wl,-shared,-Bsymbolic -L$(CCTLIB) -Wl,--no-whole-archive -Wl,--no-undefined $(TCPATH)/lib/gcc/arm-eabi/$(GCCVER)/interwork/libgcc.a
VOTLDEPS:=-lm -lc VOTLDEPS:=-lm -lc
@@ -113,7 +113,7 @@ VOASFLAGS:=-march=armv5te -mfpu=vfp
endif endif
ifeq ($(VOTT), v6) ifeq ($(VOTT), v6)
#VOCFLAGS:=-march=armv6 -mtune=arm1136jf-s #VOCFLAGS:=-march=armv6 -mtune=arm1136jf-s
#VOASFLAGS:=-march=armv6 #VOASFLAGS:=-march=armv6
VOCFLAGS:=-march=armv6j -mtune=arm1136jf-s -mfpu=vfp -mfloat-abi=softfp -mapcs -mtpcs-leaf-frame -mlong-calls VOCFLAGS:=-march=armv6j -mtune=arm1136jf-s -mfpu=vfp -mfloat-abi=softfp -mapcs -mtpcs-leaf-frame -mlong-calls
VOASFLAGS:=-march=armv6j -mcpu=arm1136jf-s -mfpu=arm1136jf-s -mfloat-abi=softfp -mapcs-float -mapcs-reentrant VOASFLAGS:=-march=armv6j -mcpu=arm1136jf-s -mfpu=arm1136jf-s -mfloat-abi=softfp -mapcs-float -mapcs-reentrant
@@ -133,7 +133,7 @@ endif
#global compiling options for ARM target #global compiling options for ARM target
ifneq ($(VOTT), pc) ifneq ($(VOTT), pc)
VOASFLAGS+=--strip-local-absolute -R VOASFLAGS+=--strip-local-absolute -R
endif endif
ifeq ($(VODBG), yes) ifeq ($(VODBG), yes)
@@ -167,6 +167,6 @@ ifeq ($(VODBG), yes)
#VOLDFLAGS:= #VOLDFLAGS:=
endif endif
# where to place object files # where to place object files
OBJDIR=obj OBJDIR=obj

View File

@@ -91,7 +91,7 @@ __inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
#else #else
Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2); Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
#endif #endif
/* Long sub, 2 */ /* Long sub, 2 */
#if (L_SUB_IS_INLINE) #if (L_SUB_IS_INLINE)
__inline Word32 L_sub(Word32 L_var1, Word32 L_var2); __inline Word32 L_sub(Word32 L_var1, Word32 L_var2);
@@ -119,7 +119,7 @@ __inline Word16 add (Word16 var1, Word16 var2);
#else #else
Word16 add (Word16 var1, Word16 var2); Word16 add (Word16 var1, Word16 var2);
#endif #endif
/* Short sub, 1 */ /* Short sub, 1 */
#if (SUB_IS_INLINE) #if (SUB_IS_INLINE)
__inline Word16 sub(Word16 var1, Word16 var2); __inline Word16 sub(Word16 var1, Word16 var2);
@@ -227,48 +227,48 @@ Word32 L_shr_r (Word32 L_var1, Word16 var2);
#if ARMV4_INASM #if ARMV4_INASM
__inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2) __inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2)
{ {
Word32 result; Word32 result;
asm volatile( asm volatile(
"MOV %[result], %[L_var1], ASR %[var2] \n" "MOV %[result], %[L_var1], ASR %[var2] \n"
:[result]"=r"(result) :[result]"=r"(result)
:[L_var1]"r"(L_var1), [var2]"r"(var2) :[L_var1]"r"(L_var1), [var2]"r"(var2)
); );
return result; return result;
} }
__inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2) __inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2)
{ {
Word32 result; Word32 result;
asm volatile( asm volatile(
"MOV r2, %[L_var1] \n" "MOV r2, %[L_var1] \n"
"MOV r3, #0x7fffffff\n" "MOV r3, #0x7fffffff\n"
"MOV %[result], %[L_var1], ASL %[var2] \n" "MOV %[result], %[L_var1], ASL %[var2] \n"
"TEQ r2, %[result], ASR %[var2]\n" "TEQ r2, %[result], ASR %[var2]\n"
"EORNE %[result],r3,r2,ASR#31\n" "EORNE %[result],r3,r2,ASR#31\n"
:[result]"+r"(result) :[result]"+r"(result)
:[L_var1]"r"(L_var1), [var2]"r"(var2) :[L_var1]"r"(L_var1), [var2]"r"(var2)
:"r2", "r3" :"r2", "r3"
); );
return result; return result;
} }
__inline Word32 ASM_shr(Word32 L_var1, Word16 var2) __inline Word32 ASM_shr(Word32 L_var1, Word16 var2)
{ {
Word32 result; Word32 result;
asm volatile( asm volatile(
"CMP %[var2], #15\n" "CMP %[var2], #15\n"
"MOVGE %[var2], #15\n" "MOVGE %[var2], #15\n"
"MOV %[result], %[L_var1], ASR %[var2]\n" "MOV %[result], %[L_var1], ASR %[var2]\n"
:[result]"=r"(result) :[result]"=r"(result)
:[L_var1]"r"(L_var1), [var2]"r"(var2) :[L_var1]"r"(L_var1), [var2]"r"(var2)
); );
return result; return result;
} }
__inline Word32 ASM_shl(Word32 L_var1, Word16 var2) __inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
{ {
Word32 result; Word32 result;
asm volatile( asm volatile(
"CMP %[var2], #16\n" "CMP %[var2], #16\n"
"MOVGE %[var2], #16\n" "MOVGE %[var2], #16\n"
"MOV %[result], %[L_var1], ASL %[var2]\n" "MOV %[result], %[L_var1], ASL %[var2]\n"
@@ -280,9 +280,9 @@ __inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
:[result]"+r"(result) :[result]"+r"(result)
:[L_var1]"r"(L_var1), [var2]"r"(var2) :[L_var1]"r"(L_var1), [var2]"r"(var2)
:"r2", "r3" :"r2", "r3"
); );
return result; return result;
} }
#endif #endif
/*___________________________________________________________________________ /*___________________________________________________________________________
@@ -300,17 +300,17 @@ __inline Word16 saturate(Word32 L_var1)
"MOV r3, #1\n" "MOV r3, #1\n"
"MOV r2,%[L_var1],ASR#15\n" "MOV r2,%[L_var1],ASR#15\n"
"RSB r3, r3, r3, LSL #15\n" "RSB r3, r3, r3, LSL #15\n"
"TEQ r2,%[L_var1],ASR#31\n" "TEQ r2,%[L_var1],ASR#31\n"
"EORNE %[result],r3,%[L_var1],ASR#31\n" "EORNE %[result],r3,%[L_var1],ASR#31\n"
:[result]"+r"(result) :[result]"+r"(result)
:[L_var1]"r"(L_var1) :[L_var1]"r"(L_var1)
:"r2", "r3" :"r2", "r3"
); );
return result; return result;
#else #else
Word16 var_out; Word16 var_out;
//var_out = (L_var1 > (Word32)0X00007fffL) ? (MAX_16) : ((L_var1 < (Word32)0xffff8000L) ? (MIN_16) : ((Word16)L_var1)); //var_out = (L_var1 > (Word32)0X00007fffL) ? (MAX_16) : ((L_var1 < (Word32)0xffff8000L) ? (MIN_16) : ((Word16)L_var1));
if (L_var1 > 0X00007fffL) if (L_var1 > 0X00007fffL)
@@ -419,13 +419,13 @@ __inline Word16 shr (Word16 var1, Word16 var2)
__inline Word32 L_mult(Word16 var1, Word16 var2) __inline Word32 L_mult(Word16 var1, Word16 var2)
{ {
#if ARMV5TE_L_MULT #if ARMV5TE_L_MULT
Word32 result; Word32 result;
asm volatile( asm volatile(
"SMULBB %[result], %[var1], %[var2] \n" "SMULBB %[result], %[var1], %[var2] \n"
"QADD %[result], %[result], %[result] \n" "QADD %[result], %[result], %[result] \n"
:[result]"+r"(result) :[result]"+r"(result)
:[var1]"r"(var1), [var2]"r"(var2) :[var1]"r"(var1), [var2]"r"(var2)
); );
return result; return result;
#else #else
Word32 L_var_out; Word32 L_var_out;
@@ -449,14 +449,14 @@ __inline Word32 L_mult(Word16 var1, Word16 var2)
__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2) __inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
{ {
#if ARMV5TE_L_MSU #if ARMV5TE_L_MSU
Word32 result; Word32 result;
asm volatile( asm volatile(
"SMULBB %[result], %[var1], %[var2] \n" "SMULBB %[result], %[var1], %[var2] \n"
"QADD %[result], %[result], %[result] \n" "QADD %[result], %[result], %[result] \n"
"QSUB %[result], %[L_var3], %[result]\n" "QSUB %[result], %[L_var3], %[result]\n"
:[result]"+r"(result) :[result]"+r"(result)
:[L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2) :[L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
); );
return result; return result;
#else #else
Word32 L_var_out; Word32 L_var_out;
@@ -473,12 +473,12 @@ __inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
__inline Word32 L_sub(Word32 L_var1, Word32 L_var2) __inline Word32 L_sub(Word32 L_var1, Word32 L_var2)
{ {
#if ARMV5TE_L_SUB #if ARMV5TE_L_SUB
Word32 result; Word32 result;
asm volatile( asm volatile(
"QSUB %[result], %[L_var1], %[L_var2]\n" "QSUB %[result], %[L_var1], %[L_var2]\n"
:[result]"+r"(result) :[result]"+r"(result)
:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2) :[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
); );
return result; return result;
#else #else
Word32 L_var_out; Word32 L_var_out;
@@ -588,9 +588,9 @@ __inline Word32 L_shr (Word32 L_var1, Word16 var2)
__inline Word16 add (Word16 var1, Word16 var2) __inline Word16 add (Word16 var1, Word16 var2)
{ {
#if ARMV5TE_ADD #if ARMV5TE_ADD
Word32 result; Word32 result;
asm volatile( asm volatile(
"ADD %[result], %[var1], %[var2] \n" "ADD %[result], %[var1], %[var2] \n"
"MOV r3, #0x1\n" "MOV r3, #0x1\n"
"MOV r2, %[result], ASR #15\n" "MOV r2, %[result], ASR #15\n"
"RSB r3, r3, r3, LSL, #15\n" "RSB r3, r3, r3, LSL, #15\n"
@@ -599,7 +599,7 @@ __inline Word16 add (Word16 var1, Word16 var2)
:[result]"+r"(result) :[result]"+r"(result)
:[var1]"r"(var1), [var2]"r"(var2) :[var1]"r"(var1), [var2]"r"(var2)
:"r2", "r3" :"r2", "r3"
); );
return result; return result;
#else #else
Word16 var_out; Word16 var_out;
@@ -618,18 +618,18 @@ __inline Word16 add (Word16 var1, Word16 var2)
__inline Word16 sub(Word16 var1, Word16 var2) __inline Word16 sub(Word16 var1, Word16 var2)
{ {
#if ARMV5TE_SUB #if ARMV5TE_SUB
Word32 result; Word32 result;
asm volatile( asm volatile(
"MOV r3, #1\n" "MOV r3, #1\n"
"SUB %[result], %[var1], %[var2] \n" "SUB %[result], %[var1], %[var2] \n"
"RSB r3,r3,r3,LSL#15\n" "RSB r3,r3,r3,LSL#15\n"
"MOV r2, %[var1], ASR #15 \n" "MOV r2, %[var1], ASR #15 \n"
"TEQ r2, %[var1], ASR #31 \n" "TEQ r2, %[var1], ASR #31 \n"
"EORNE %[result], r3, %[result], ASR #31 \n" "EORNE %[result], r3, %[result], ASR #31 \n"
:[result]"+r"(result) :[result]"+r"(result)
:[var1]"r"(var1), [var2]"r"(var2) :[var1]"r"(var1), [var2]"r"(var2)
:"r2", "r3" :"r2", "r3"
); );
return result; return result;
#else #else
Word16 var_out; Word16 var_out;
@@ -637,7 +637,7 @@ __inline Word16 sub(Word16 var1, Word16 var2)
L_diff = (Word32) var1 - var2; L_diff = (Word32) var1 - var2;
var_out = saturate(L_diff); var_out = saturate(L_diff);
return (var_out); return (var_out);
#endif #endif
} }
@@ -657,16 +657,16 @@ __inline Word16 div_s (Word16 var1, Word16 var2)
{ {
var_out = 0; var_out = 0;
L_num = (Word32) var1; L_num = (Word32) var1;
L_denom = (Word32) var2; L_denom = (Word32) var2;
//return (L_num<<15)/var2; //return (L_num<<15)/var2;
for (iteration = 0; iteration < 15; iteration++) for (iteration = 0; iteration < 15; iteration++)
{ {
var_out <<= 1; var_out <<= 1;
L_num <<= 1; L_num <<= 1;
if (L_num >= L_denom) if (L_num >= L_denom)
{ {
L_num -= L_denom; L_num -= L_denom;
@@ -683,8 +683,8 @@ __inline Word16 div_s (Word16 var1, Word16 var2)
__inline Word16 mult (Word16 var1, Word16 var2) __inline Word16 mult (Word16 var1, Word16 var2)
{ {
#if ARMV5TE_MULT #if ARMV5TE_MULT
Word32 result; Word32 result;
asm volatile( asm volatile(
"SMULBB r2, %[var1], %[var2] \n" "SMULBB r2, %[var1], %[var2] \n"
"MOV r3, #1\n" "MOV r3, #1\n"
"MOV %[result], r2, ASR #15\n" "MOV %[result], r2, ASR #15\n"
@@ -695,7 +695,7 @@ __inline Word16 mult (Word16 var1, Word16 var2)
:[result]"+r"(result) :[result]"+r"(result)
:[var1]"r"(var1), [var2]"r"(var2) :[var1]"r"(var1), [var2]"r"(var2)
:"r2", "r3" :"r2", "r3"
); );
return result; return result;
#else #else
Word16 var_out; Word16 var_out;
@@ -718,8 +718,8 @@ __inline Word16 mult (Word16 var1, Word16 var2)
__inline Word16 norm_s (Word16 var1) __inline Word16 norm_s (Word16 var1)
{ {
#if ARMV5TE_NORM_S #if ARMV5TE_NORM_S
Word16 result; Word16 result;
asm volatile( asm volatile(
"MOV r2,%[var1] \n" "MOV r2,%[var1] \n"
"CMP r2, #0\n" "CMP r2, #0\n"
"RSBLT %[var1], %[var1], #0 \n" "RSBLT %[var1], %[var1], #0 \n"
@@ -727,11 +727,11 @@ __inline Word16 norm_s (Word16 var1)
"SUBNE %[result], %[result], #17\n" "SUBNE %[result], %[result], #17\n"
"MOVEQ %[result], #0\n" "MOVEQ %[result], #0\n"
"CMP r2, #-1\n" "CMP r2, #-1\n"
"MOVEQ %[result], #15\n" "MOVEQ %[result], #15\n"
:[result]"+r"(result) :[result]"+r"(result)
:[var1]"r"(var1) :[var1]"r"(var1)
:"r2" :"r2"
); );
return result; return result;
#else #else
Word16 var_out; Word16 var_out;
@@ -768,15 +768,15 @@ __inline Word16 norm_s (Word16 var1)
__inline Word16 norm_l (Word32 L_var1) __inline Word16 norm_l (Word32 L_var1)
{ {
#if ARMV5TE_NORM_L #if ARMV5TE_NORM_L
Word16 result; Word16 result;
asm volatile( asm volatile(
"CMP %[L_var1], #0\n" "CMP %[L_var1], #0\n"
"CLZNE %[result], %[L_var1]\n" "CLZNE %[result], %[L_var1]\n"
"SUBNE %[result], %[result], #1\n" "SUBNE %[result], %[result], #1\n"
"MOVEQ %[result], #0\n" "MOVEQ %[result], #0\n"
:[result]"+r"(result) :[result]"+r"(result)
:[L_var1]"r"(L_var1) :[L_var1]"r"(L_var1)
); );
return result; return result;
#else #else
//Word16 var_out; //Word16 var_out;
@@ -805,84 +805,84 @@ __inline Word16 norm_l (Word32 L_var1)
//} //}
//return (var_out); //return (var_out);
Word16 a16; Word16 a16;
Word16 r = 0 ; Word16 r = 0 ;
if ( L_var1 < 0 ) { if ( L_var1 < 0 ) {
L_var1 = ~L_var1; L_var1 = ~L_var1;
} }
if (0 == (L_var1 & 0x7fff8000)) { if (0 == (L_var1 & 0x7fff8000)) {
a16 = extract_l(L_var1); a16 = extract_l(L_var1);
r += 16; r += 16;
if (0 == (a16 & 0x7f80)) { if (0 == (a16 & 0x7f80)) {
r += 8; r += 8;
if (0 == (a16 & 0x0078)) { if (0 == (a16 & 0x0078)) {
r += 4; r += 4;
if (0 == (a16 & 0x0006)) { if (0 == (a16 & 0x0006)) {
r += 2; r += 2;
if (0 == (a16 & 0x0001)) { if (0 == (a16 & 0x0001)) {
r += 1; r += 1;
} }
} }
else { else {
if (0 == (a16 & 0x0004)) { if (0 == (a16 & 0x0004)) {
r += 1; r += 1;
} }
} }
} }
else { else {
if (0 == (a16 & 0x0060)) { if (0 == (a16 & 0x0060)) {
r += 2; r += 2;
if (0 == (a16 & 0x0010)) { if (0 == (a16 & 0x0010)) {
r += 1; r += 1;
} }
} }
else { else {
if (0 == (a16 & 0x0040)) { if (0 == (a16 & 0x0040)) {
r += 1; r += 1;
} }
} }
} }
} }
else { else {
if (0 == (a16 & 0x7800)) { if (0 == (a16 & 0x7800)) {
r += 4; r += 4;
if (0 == (a16 & 0x0600)) { if (0 == (a16 & 0x0600)) {
r += 2; r += 2;
if (0 == (a16 & 0x0100)) { if (0 == (a16 & 0x0100)) {
r += 1; r += 1;
} }
} }
else { else {
if (0 == (a16 & 0x0400)) { if (0 == (a16 & 0x0400)) {
r += 1; r += 1;
} }
} }
} }
else { else {
if (0 == (a16 & 0x6000)) { if (0 == (a16 & 0x6000)) {
r += 2; r += 2;
if (0 == (a16 & 0x1000)) { if (0 == (a16 & 0x1000)) {
r += 1; r += 1;
} }
} }
else { else {
if (0 == (a16 & 0x4000)) { if (0 == (a16 & 0x4000)) {
r += 1; r += 1;
} }
@@ -892,38 +892,38 @@ __inline Word16 norm_l (Word32 L_var1)
} }
else { else {
a16 = extract_h(L_var1); a16 = extract_h(L_var1);
if (0 == (a16 & 0x7f80)) { if (0 == (a16 & 0x7f80)) {
r += 8; r += 8;
if (0 == (a16 & 0x0078)) { if (0 == (a16 & 0x0078)) {
r += 4 ; r += 4 ;
if (0 == (a16 & 0x0006)) { if (0 == (a16 & 0x0006)) {
r += 2; r += 2;
if (0 == (a16 & 0x0001)) { if (0 == (a16 & 0x0001)) {
r += 1; r += 1;
} }
} }
else { else {
if (0 == (a16 & 0x0004)) { if (0 == (a16 & 0x0004)) {
r += 1; r += 1;
} }
} }
} }
else { else {
if (0 == (a16 & 0x0060)) { if (0 == (a16 & 0x0060)) {
r += 2; r += 2;
if (0 == (a16 & 0x0010)) { if (0 == (a16 & 0x0010)) {
r += 1; r += 1;
} }
} }
else { else {
if (0 == (a16 & 0x0040)) { if (0 == (a16 & 0x0040)) {
r += 1; r += 1;
} }
@@ -931,35 +931,35 @@ __inline Word16 norm_l (Word32 L_var1)
} }
} }
else { else {
if (0 == (a16 & 0x7800)) { if (0 == (a16 & 0x7800)) {
r += 4; r += 4;
if (0 == (a16 & 0x0600)) { if (0 == (a16 & 0x0600)) {
r += 2; r += 2;
if (0 == (a16 & 0x0100)) { if (0 == (a16 & 0x0100)) {
r += 1; r += 1;
} }
} }
else { else {
if (0 == (a16 & 0x0400)) { if (0 == (a16 & 0x0400)) {
r += 1; r += 1;
} }
} }
} }
else { else {
if (0 == (a16 & 0x6000)) { if (0 == (a16 & 0x6000)) {
r += 2; r += 2;
if (0 == (a16 & 0x1000)) { if (0 == (a16 & 0x1000)) {
r += 1; r += 1;
} }
} }
else { else {
if (0 == (a16 & 0x4000)) { if (0 == (a16 & 0x4000)) {
return 1; return 1;
} }
@@ -967,7 +967,7 @@ __inline Word16 norm_l (Word32 L_var1)
} }
} }
} }
return r ; return r ;
#endif #endif
} }
@@ -978,17 +978,17 @@ __inline Word16 norm_l (Word32 L_var1)
__inline Word16 round16(Word32 L_var1) __inline Word16 round16(Word32 L_var1)
{ {
#if ARMV5TE_ROUND #if ARMV5TE_ROUND
Word16 result; Word16 result;
asm volatile( asm volatile(
"MOV r1,#0x00008000\n" "MOV r1,#0x00008000\n"
"QADD %[result], %[L_var1], r1\n" "QADD %[result], %[L_var1], r1\n"
"MOV %[result], %[result], ASR #16 \n" "MOV %[result], %[result], ASR #16 \n"
:[result]"+r"(result) :[result]"+r"(result)
:[L_var1]"r"(L_var1) :[L_var1]"r"(L_var1)
:"r1" :"r1"
); );
return result; return result;
#else #else
Word16 var_out; Word16 var_out;
Word32 L_rounded; Word32 L_rounded;
@@ -1004,14 +1004,14 @@ __inline Word16 round16(Word32 L_var1)
__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2) __inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
{ {
#if ARMV5TE_L_MAC #if ARMV5TE_L_MAC
Word32 result; Word32 result;
asm volatile( asm volatile(
"SMULBB %[result], %[var1], %[var2]\n" "SMULBB %[result], %[var1], %[var2]\n"
"QADD %[result], %[result], %[result]\n" "QADD %[result], %[result], %[result]\n"
"QADD %[result], %[result], %[L_var3]\n" "QADD %[result], %[result], %[L_var3]\n"
:[result]"+r"(result) :[result]"+r"(result)
: [L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2) : [L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
); );
return result; return result;
#else #else
Word32 L_var_out; Word32 L_var_out;
@@ -1028,12 +1028,12 @@ __inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
__inline Word32 L_add (Word32 L_var1, Word32 L_var2) __inline Word32 L_add (Word32 L_var1, Word32 L_var2)
{ {
#if ARMV5TE_L_ADD #if ARMV5TE_L_ADD
Word32 result; Word32 result;
asm volatile( asm volatile(
"QADD %[result], %[L_var1], %[L_var2]\n" "QADD %[result], %[L_var1], %[L_var2]\n"
:[result]"+r"(result) :[result]"+r"(result)
:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2) :[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
); );
return result; return result;
#else #else
Word32 L_var_out; Word32 L_var_out;
@@ -1114,7 +1114,7 @@ __inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)
L_var3 = L_msu (L_var3, var1, var2); L_var3 = L_msu (L_var3, var1, var2);
var_out = (Word16)((L_var3 + 0x8000L) >> 16); var_out = (Word16)((L_var3 + 0x8000L) >> 16);
return (var_out); return (var_out);
} }
#endif #endif

View File

@@ -16,7 +16,7 @@
/******************************************************************************* /*******************************************************************************
File: basicop2.c File: basicop2.c
Content: Basic arithmetic operators. Content: Basic arithmetic operators.
*******************************************************************************/ *******************************************************************************/
@@ -462,7 +462,7 @@ Word32 L_mult(Word16 var1, Word16 var2)
{ {
L_var_out = MAX_32; L_var_out = MAX_32;
} }
return (L_var_out); return (L_var_out);
} }
#endif #endif

View File

@@ -17,7 +17,7 @@
File: oper_32b.c File: oper_32b.c
Content: This file contains operations in double precision. Content: This file contains operations in double precision.
*******************************************************************************/ *******************************************************************************/
#include "typedef.h" #include "typedef.h"
@@ -200,12 +200,12 @@ Word32 Div_32 (Word32 L_num, Word32 denom)
} }
/*! /*!
\brief calculates the log dualis times 4 of argument \brief calculates the log dualis times 4 of argument
iLog4(x) = (Word32)(4 * log(value)/log(2.0)) iLog4(x) = (Word32)(4 * log(value)/log(2.0))
\return ilog4 value \return ilog4 value
*/ */
Word16 iLog4(Word32 value) Word16 iLog4(Word32 value)
{ {
@@ -225,7 +225,7 @@ Word16 iLog4(Word32 value)
iLog4 = (-(iLog4 << 2) - norm_s(tmp16)) - 1; iLog4 = (-(iLog4 << 2) - norm_s(tmp16)) - 1;
} }
else { else {
iLog4 = -128; /* -(INT_BITS*4); */ iLog4 = -128; /* -(INT_BITS*4); */
} }
return iLog4; return iLog4;
@@ -268,79 +268,79 @@ Word32 rsqrt(Word32 value, /*!< Operand to square root (0.0 ... 1) */
} }
static const Word32 pow2Table[POW2_TABLE_SIZE] = { static const Word32 pow2Table[POW2_TABLE_SIZE] = {
0x7fffffff, 0x7fa765ad, 0x7f4f08ae, 0x7ef6e8da, 0x7fffffff, 0x7fa765ad, 0x7f4f08ae, 0x7ef6e8da,
0x7e9f0606, 0x7e476009, 0x7deff6b6, 0x7d98c9e6, 0x7e9f0606, 0x7e476009, 0x7deff6b6, 0x7d98c9e6,
0x7d41d96e, 0x7ceb2523, 0x7c94acde, 0x7c3e7073, 0x7d41d96e, 0x7ceb2523, 0x7c94acde, 0x7c3e7073,
0x7be86fb9, 0x7b92aa88, 0x7b3d20b6, 0x7ae7d21a, 0x7be86fb9, 0x7b92aa88, 0x7b3d20b6, 0x7ae7d21a,
0x7a92be8b, 0x7a3de5df, 0x79e947ef, 0x7994e492, 0x7a92be8b, 0x7a3de5df, 0x79e947ef, 0x7994e492,
0x7940bb9e, 0x78ecccec, 0x78991854, 0x78459dac, 0x7940bb9e, 0x78ecccec, 0x78991854, 0x78459dac,
0x77f25cce, 0x779f5591, 0x774c87cc, 0x76f9f359, 0x77f25cce, 0x779f5591, 0x774c87cc, 0x76f9f359,
0x76a7980f, 0x765575c8, 0x76038c5b, 0x75b1dba2, 0x76a7980f, 0x765575c8, 0x76038c5b, 0x75b1dba2,
0x75606374, 0x750f23ab, 0x74be1c20, 0x746d4cac, 0x75606374, 0x750f23ab, 0x74be1c20, 0x746d4cac,
0x741cb528, 0x73cc556d, 0x737c2d55, 0x732c3cba, 0x741cb528, 0x73cc556d, 0x737c2d55, 0x732c3cba,
0x72dc8374, 0x728d015d, 0x723db650, 0x71eea226, 0x72dc8374, 0x728d015d, 0x723db650, 0x71eea226,
0x719fc4b9, 0x71511de4, 0x7102ad80, 0x70b47368, 0x719fc4b9, 0x71511de4, 0x7102ad80, 0x70b47368,
0x70666f76, 0x7018a185, 0x6fcb096f, 0x6f7da710, 0x70666f76, 0x7018a185, 0x6fcb096f, 0x6f7da710,
0x6f307a41, 0x6ee382de, 0x6e96c0c3, 0x6e4a33c9, 0x6f307a41, 0x6ee382de, 0x6e96c0c3, 0x6e4a33c9,
0x6dfddbcc, 0x6db1b8a8, 0x6d65ca38, 0x6d1a1057, 0x6dfddbcc, 0x6db1b8a8, 0x6d65ca38, 0x6d1a1057,
0x6cce8ae1, 0x6c8339b2, 0x6c381ca6, 0x6bed3398, 0x6cce8ae1, 0x6c8339b2, 0x6c381ca6, 0x6bed3398,
0x6ba27e66, 0x6b57fce9, 0x6b0daeff, 0x6ac39485, 0x6ba27e66, 0x6b57fce9, 0x6b0daeff, 0x6ac39485,
0x6a79ad56, 0x6a2ff94f, 0x69e6784d, 0x699d2a2c, 0x6a79ad56, 0x6a2ff94f, 0x69e6784d, 0x699d2a2c,
0x69540ec9, 0x690b2601, 0x68c26fb1, 0x6879ebb6, 0x69540ec9, 0x690b2601, 0x68c26fb1, 0x6879ebb6,
0x683199ed, 0x67e97a34, 0x67a18c68, 0x6759d065, 0x683199ed, 0x67e97a34, 0x67a18c68, 0x6759d065,
0x6712460b, 0x66caed35, 0x6683c5c3, 0x663ccf92, 0x6712460b, 0x66caed35, 0x6683c5c3, 0x663ccf92,
0x65f60a80, 0x65af766a, 0x6569132f, 0x6522e0ad, 0x65f60a80, 0x65af766a, 0x6569132f, 0x6522e0ad,
0x64dcdec3, 0x64970d4f, 0x64516c2e, 0x640bfb41, 0x64dcdec3, 0x64970d4f, 0x64516c2e, 0x640bfb41,
0x63c6ba64, 0x6381a978, 0x633cc85b, 0x62f816eb, 0x63c6ba64, 0x6381a978, 0x633cc85b, 0x62f816eb,
0x62b39509, 0x626f4292, 0x622b1f66, 0x61e72b65, 0x62b39509, 0x626f4292, 0x622b1f66, 0x61e72b65,
0x61a3666d, 0x615fd05f, 0x611c6919, 0x60d9307b, 0x61a3666d, 0x615fd05f, 0x611c6919, 0x60d9307b,
0x60962665, 0x60534ab7, 0x60109d51, 0x5fce1e12, 0x60962665, 0x60534ab7, 0x60109d51, 0x5fce1e12,
0x5f8bccdb, 0x5f49a98c, 0x5f07b405, 0x5ec5ec26, 0x5f8bccdb, 0x5f49a98c, 0x5f07b405, 0x5ec5ec26,
0x5e8451d0, 0x5e42e4e3, 0x5e01a540, 0x5dc092c7, 0x5e8451d0, 0x5e42e4e3, 0x5e01a540, 0x5dc092c7,
0x5d7fad59, 0x5d3ef4d7, 0x5cfe6923, 0x5cbe0a1c, 0x5d7fad59, 0x5d3ef4d7, 0x5cfe6923, 0x5cbe0a1c,
0x5c7dd7a4, 0x5c3dd19c, 0x5bfdf7e5, 0x5bbe4a61, 0x5c7dd7a4, 0x5c3dd19c, 0x5bfdf7e5, 0x5bbe4a61,
0x5b7ec8f2, 0x5b3f7377, 0x5b0049d4, 0x5ac14bea, 0x5b7ec8f2, 0x5b3f7377, 0x5b0049d4, 0x5ac14bea,
0x5a82799a, 0x5a43d2c6, 0x5a055751, 0x59c7071c, 0x5a82799a, 0x5a43d2c6, 0x5a055751, 0x59c7071c,
0x5988e209, 0x594ae7fb, 0x590d18d3, 0x58cf7474, 0x5988e209, 0x594ae7fb, 0x590d18d3, 0x58cf7474,
0x5891fac1, 0x5854ab9b, 0x581786e6, 0x57da8c83, 0x5891fac1, 0x5854ab9b, 0x581786e6, 0x57da8c83,
0x579dbc57, 0x57611642, 0x57249a29, 0x56e847ef, 0x579dbc57, 0x57611642, 0x57249a29, 0x56e847ef,
0x56ac1f75, 0x567020a0, 0x56344b52, 0x55f89f70, 0x56ac1f75, 0x567020a0, 0x56344b52, 0x55f89f70,
0x55bd1cdb, 0x5581c378, 0x55469329, 0x550b8bd4, 0x55bd1cdb, 0x5581c378, 0x55469329, 0x550b8bd4,
0x54d0ad5b, 0x5495f7a1, 0x545b6a8b, 0x542105fd, 0x54d0ad5b, 0x5495f7a1, 0x545b6a8b, 0x542105fd,
0x53e6c9db, 0x53acb607, 0x5372ca68, 0x533906e0, 0x53e6c9db, 0x53acb607, 0x5372ca68, 0x533906e0,
0x52ff6b55, 0x52c5f7aa, 0x528cabc3, 0x52538786, 0x52ff6b55, 0x52c5f7aa, 0x528cabc3, 0x52538786,
0x521a8ad7, 0x51e1b59a, 0x51a907b4, 0x5170810b, 0x521a8ad7, 0x51e1b59a, 0x51a907b4, 0x5170810b,
0x51382182, 0x50ffe8fe, 0x50c7d765, 0x508fec9c, 0x51382182, 0x50ffe8fe, 0x50c7d765, 0x508fec9c,
0x50582888, 0x50208b0e, 0x4fe91413, 0x4fb1c37c, 0x50582888, 0x50208b0e, 0x4fe91413, 0x4fb1c37c,
0x4f7a9930, 0x4f439514, 0x4f0cb70c, 0x4ed5ff00, 0x4f7a9930, 0x4f439514, 0x4f0cb70c, 0x4ed5ff00,
0x4e9f6cd4, 0x4e69006e, 0x4e32b9b4, 0x4dfc988c, 0x4e9f6cd4, 0x4e69006e, 0x4e32b9b4, 0x4dfc988c,
0x4dc69cdd, 0x4d90c68b, 0x4d5b157e, 0x4d25899c, 0x4dc69cdd, 0x4d90c68b, 0x4d5b157e, 0x4d25899c,
0x4cf022ca, 0x4cbae0ef, 0x4c85c3f1, 0x4c50cbb8, 0x4cf022ca, 0x4cbae0ef, 0x4c85c3f1, 0x4c50cbb8,
0x4c1bf829, 0x4be7492b, 0x4bb2bea5, 0x4b7e587d, 0x4c1bf829, 0x4be7492b, 0x4bb2bea5, 0x4b7e587d,
0x4b4a169c, 0x4b15f8e6, 0x4ae1ff43, 0x4aae299b, 0x4b4a169c, 0x4b15f8e6, 0x4ae1ff43, 0x4aae299b,
0x4a7a77d5, 0x4a46e9d6, 0x4a137f88, 0x49e038d0, 0x4a7a77d5, 0x4a46e9d6, 0x4a137f88, 0x49e038d0,
0x49ad1598, 0x497a15c4, 0x4947393f, 0x49147fee, 0x49ad1598, 0x497a15c4, 0x4947393f, 0x49147fee,
0x48e1e9ba, 0x48af768a, 0x487d2646, 0x484af8d6, 0x48e1e9ba, 0x48af768a, 0x487d2646, 0x484af8d6,
0x4818ee22, 0x47e70611, 0x47b5408c, 0x47839d7b, 0x4818ee22, 0x47e70611, 0x47b5408c, 0x47839d7b,
0x47521cc6, 0x4720be55, 0x46ef8210, 0x46be67e0, 0x47521cc6, 0x4720be55, 0x46ef8210, 0x46be67e0,
0x468d6fae, 0x465c9961, 0x462be4e2, 0x45fb521a, 0x468d6fae, 0x465c9961, 0x462be4e2, 0x45fb521a,
0x45cae0f2, 0x459a9152, 0x456a6323, 0x453a564d, 0x45cae0f2, 0x459a9152, 0x456a6323, 0x453a564d,
0x450a6abb, 0x44daa054, 0x44aaf702, 0x447b6ead, 0x450a6abb, 0x44daa054, 0x44aaf702, 0x447b6ead,
0x444c0740, 0x441cc0a3, 0x43ed9ac0, 0x43be9580, 0x444c0740, 0x441cc0a3, 0x43ed9ac0, 0x43be9580,
0x438fb0cb, 0x4360ec8d, 0x433248ae, 0x4303c517, 0x438fb0cb, 0x4360ec8d, 0x433248ae, 0x4303c517,
0x42d561b4, 0x42a71e6c, 0x4278fb2b, 0x424af7da, 0x42d561b4, 0x42a71e6c, 0x4278fb2b, 0x424af7da,
0x421d1462, 0x41ef50ae, 0x41c1aca8, 0x41942839, 0x421d1462, 0x41ef50ae, 0x41c1aca8, 0x41942839,
0x4166c34c, 0x41397dcc, 0x410c57a2, 0x40df50b8, 0x4166c34c, 0x41397dcc, 0x410c57a2, 0x40df50b8,
0x40b268fa, 0x4085a051, 0x4058f6a8, 0x402c6be9 0x40b268fa, 0x4085a051, 0x4058f6a8, 0x402c6be9
}; };
/*! /*!
\brief calculates 2 ^ (x/y) for x<=0, y > 0, x <= 32768 * y \brief calculates 2 ^ (x/y) for x<=0, y > 0, x <= 32768 * y
avoids integer division avoids integer division
\return \return
*/ */
Word32 pow2_xy(Word32 x, Word32 y) Word32 pow2_xy(Word32 x, Word32 y)
{ {
@@ -355,7 +355,7 @@ Word32 pow2_xy(Word32 x, Word32 y)
fPart = tmp2 - iPart*y; fPart = tmp2 - iPart*y;
iPart = min(iPart,INT_BITS-1); iPart = min(iPart,INT_BITS-1);
res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart; res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart;
return(res); return(res);
} }

View File

@@ -51,21 +51,21 @@ __inline Word32 L_mpy_ls(Word32 L_var2, Word16 var1)
swHigh1 = (Word16)(L_var2 >> 16); swHigh1 = (Word16)(L_var2 >> 16);
l_var_out = (long)swLow1 * (long)var1 >> 15; l_var_out = (long)swLow1 * (long)var1 >> 15;
l_var_out += swHigh1 * var1 << 1; l_var_out += swHigh1 * var1 << 1;
return(l_var_out); return(l_var_out);
} }
__inline Word32 L_mpy_wx(Word32 L_var2, Word16 var1) __inline Word32 L_mpy_wx(Word32 L_var2, Word16 var1)
{ {
#if ARMV5TE_L_MPY_LS #if ARMV5TE_L_MPY_LS
Word32 result; Word32 result;
asm volatile( asm volatile(
"SMULWB %[result], %[L_var2], %[var1] \n" "SMULWB %[result], %[L_var2], %[var1] \n"
:[result]"+r"(result) :[result]"+r"(result)
:[L_var2]"r"(L_var2), [var1]"r"(var1) :[L_var2]"r"(L_var2), [var1]"r"(var1)
); );
return result; return result;
#else #else
unsigned short swLow1; unsigned short swLow1;
@@ -75,9 +75,9 @@ __inline Word32 L_mpy_wx(Word32 L_var2, Word16 var1)
swLow1 = (unsigned short)(L_var2); swLow1 = (unsigned short)(L_var2);
swHigh1 = (Word16)(L_var2 >> 16); swHigh1 = (Word16)(L_var2 >> 16);
l_var_out = (long)swLow1 * (long)var1 >> 16; l_var_out = (long)swLow1 * (long)var1 >> 16;
l_var_out += swHigh1 * var1; l_var_out += swHigh1 * var1;
return(l_var_out); return(l_var_out);
#endif #endif
} }

View File

@@ -30,7 +30,7 @@
/* /*
* this is the original code from the ETSI file typedef.h * this is the original code from the ETSI file typedef.h
*/ */
#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__) #if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__)
typedef signed char Word8; typedef signed char Word8;
typedef short Word16; typedef short Word16;

View File

@@ -55,7 +55,7 @@
#define INT_BITS 32 #define INT_BITS 32
/* /*
******************************************************************************** ********************************************************************************
* DEFINITION OF CONSTANTS * DEFINITION OF CONSTANTS
******************************************************************************** ********************************************************************************
*/ */
/* /*
@@ -120,12 +120,12 @@ typedef unsigned __int64 UWord64;
#define ARMV5TE_L_MULT 1 #define ARMV5TE_L_MULT 1
#define ARMV5TE_L_MAC 1 #define ARMV5TE_L_MAC 1
#define ARMV5TE_L_MSU 1 #define ARMV5TE_L_MSU 1
#define ARMV5TE_DIV_S 1 #define ARMV5TE_DIV_S 1
#define ARMV5TE_ROUND 1 #define ARMV5TE_ROUND 1
#define ARMV5TE_MULT 1 #define ARMV5TE_MULT 1
#define ARMV5TE_NORM_S 1 #define ARMV5TE_NORM_S 1
#define ARMV5TE_NORM_L 1 #define ARMV5TE_NORM_L 1
#define ARMV5TE_L_MPY_LS 1 #define ARMV5TE_L_MPY_LS 1
@@ -149,7 +149,7 @@ typedef unsigned __int64 UWord64;
#define ROUND_IS_INLINE 1 //define round as inline function #define ROUND_IS_INLINE 1 //define round as inline function
#define L_MAC_IS_INLINE 1 //define L_mac as inline function #define L_MAC_IS_INLINE 1 //define L_mac as inline function
#define L_ADD_IS_INLINE 1 //define L_add as inline function #define L_ADD_IS_INLINE 1 //define L_add as inline function
#define EXTRACT_H_IS_INLINE 1 //define extract_h as inline function #define EXTRACT_H_IS_INLINE 1 //define extract_h as inline function
#define EXTRACT_L_IS_INLINE 1 //define extract_l as inline function //??? #define EXTRACT_L_IS_INLINE 1 //define extract_l as inline function //???
#define MULT_R_IS_INLINE 1 //define mult_r as inline function #define MULT_R_IS_INLINE 1 //define mult_r as inline function
#define SHR_R_IS_INLINE 1 //define shr_r as inline function #define SHR_R_IS_INLINE 1 //define shr_r as inline function

View File

@@ -25,9 +25,9 @@ VOMT:= lib
# module macros # module macros
# please append the additional macro definitions here for your module if necessary. # please append the additional macro definitions here for your module if necessary.
# e.g. -DVISUALON, macro VISUALON defined for your module # e.g. -DVISUALON, macro VISUALON defined for your module
VOMM:= -DARMV5E -DARM_INASM -DARMV5_INASM VOMM:= -DARMV5E -DARM_INASM -DARMV5_INASM
@@ -36,10 +36,10 @@ VOTARGET:=libvoAACEncv5
# please modify here to be sure to see the g1.mk # please modify here to be sure to see the g1.mk
include ../../../../../Tools/eclair.mk include ../../../../../Tools/eclair.mk
# dependent libraries. # dependent libraries.
VODEPLIBS:=#-ldl -lstdc++ VODEPLIBS:=#-ldl -lstdc++
# module source # module source
# please modify here to be sure to see the ms.mk which specifies all source info of your module # please modify here to be sure to see the ms.mk which specifies all source info of your module
@@ -51,5 +51,5 @@ VORELDIR:=../../../../../../Release
# please modify here to be sure to see the doit.mk # please modify here to be sure to see the doit.mk
include ../../../../../Tools/doit.mk include ../../../../../Tools/doit.mk

View File

@@ -25,9 +25,9 @@ VOMT:= lib
# module macros # module macros
# please append the additional macro definitions here for your module if necessary. # please append the additional macro definitions here for your module if necessary.
# e.g. -DVISUALON, macro VISUALON defined for your module # e.g. -DVISUALON, macro VISUALON defined for your module
VOMM:= -DARMV5E -DARMV7Neon -DARM_INASM -DARMV5_INASM VOMM:= -DARMV5E -DARMV7Neon -DARM_INASM -DARMV5_INASM
@@ -36,10 +36,10 @@ VOTARGET:=libvoAACEncv7
# please modify here to be sure to see the g1.mk # please modify here to be sure to see the g1.mk
include ../../../../../Tools/eclair.mk include ../../../../../Tools/eclair.mk
# dependent libraries. # dependent libraries.
VODEPLIBS:=#-ldl -lstdc++ VODEPLIBS:=#-ldl -lstdc++
# module source # module source
# please modify here to be sure to see the ms.mk which specifies all source info of your module # please modify here to be sure to see the ms.mk which specifies all source info of your module
@@ -51,5 +51,5 @@ VORELDIR:=../../../../../../Release
# please modify here to be sure to see the doit.mk # please modify here to be sure to see the doit.mk
include ../../../../../Tools/doit.mk include ../../../../../Tools/doit.mk

View File

@@ -16,7 +16,7 @@
# Just acting as Father Makefile of Modules # Just acting as Father Makefile of Modules
# please keep the name 'makefile' unchanged # please keep the name 'makefile' unchanged
# Module Subdirs # Module Subdirs
VOMSD:=$(dir $(shell find . -name 'Makefile')) VOMSD:=$(dir $(shell find . -name 'Makefile'))

View File

@@ -21,22 +21,22 @@ OBJS:=basicop2.o oper_32b.o aac_rom.o aacenc.o aacenc_core.o adj_thr.o \
dyn_bits.o grp_data.o interface.o line_pe.o memalign.o ms_stereo.o \ dyn_bits.o grp_data.o interface.o line_pe.o memalign.o ms_stereo.o \
pre_echo_control.o psy_configuration.o psy_main.o qc_main.o quantize.o sf_estim.o \ pre_echo_control.o psy_configuration.o psy_main.o qc_main.o quantize.o sf_estim.o \
spreading.o stat_bits.o tns.o transform.o spreading.o stat_bits.o tns.o transform.o
# please list all directories that all source files relative with your module(.h .c .cpp) locate # please list all directories that all source files relative with your module(.h .c .cpp) locate
VOSRCDIR:=../../../src \ VOSRCDIR:=../../../src \
../../../inc \ ../../../inc \
../../../basic_op\ ../../../basic_op\
../../../../../Include ../../../../../Include
ifeq ($(VOTT), v5) ifeq ($(VOTT), v5)
OBJS+= AutoCorrelation_v5.o band_nrg_v5.o CalcWindowEnergy_v5.o \ OBJS+= AutoCorrelation_v5.o band_nrg_v5.o CalcWindowEnergy_v5.o \
PrePostMDCT_v5.o R4R8First_v5.o Radix4FFT_v5.o PrePostMDCT_v5.o R4R8First_v5.o Radix4FFT_v5.o
VOSRCDIR+= ../../../src/asm/ARMV5E/ VOSRCDIR+= ../../../src/asm/ARMV5E/
endif endif
ifeq ($(VOTT), v7) ifeq ($(VOTT), v7)
OBJS+= AutoCorrelation_v5.o band_nrg_v5.o CalcWindowEnergy_v5.o \ OBJS+= AutoCorrelation_v5.o band_nrg_v5.o CalcWindowEnergy_v5.o \
PrePostMDCT_v7.o R4R8First_v7.o Radix4FFT_v7.o PrePostMDCT_v7.o R4R8First_v7.o Radix4FFT_v7.o
VOSRCDIR+= ../../../src/asm/ARMV5E/ VOSRCDIR+= ../../../src/asm/ARMV5E/
VOSRCDIR+= ../../../src/asm/ARMV7/ VOSRCDIR+= ../../../src/asm/ARMV7/
endif endif

View File

@@ -16,7 +16,7 @@
/******************************************************************************* /*******************************************************************************
File: aac_rom.h File: aac_rom.h
Content: constant tables Content: constant tables
*******************************************************************************/ *******************************************************************************/

View File

@@ -47,7 +47,7 @@ typedef struct {
typedef struct { typedef struct {
AACENC_CONFIG config; /* Word16 size: 8 */ AACENC_CONFIG config; /* Word16 size: 8 */
ELEMENT_INFO elInfo; /* Word16 size: 4 */ ELEMENT_INFO elInfo; /* Word16 size: 4 */

View File

@@ -16,7 +16,7 @@
/******************************************************************************* /*******************************************************************************
File: adj_thr.h File: adj_thr.h
Content: Threshold compensation function Content: Threshold compensation function
*******************************************************************************/ *******************************************************************************/
@@ -44,7 +44,7 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
PSY_OUT_ELEMENT *psyOutElement, PSY_OUT_ELEMENT *psyOutElement,
Word16 *chBitDistribution, Word16 *chBitDistribution,
Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB], Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB], Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
QC_OUT_ELEMENT* qcOE, QC_OUT_ELEMENT* qcOE,
ELEMENT_BITS* elBits, ELEMENT_BITS* elBits,
const Word16 nChannels, const Word16 nChannels,

View File

@@ -16,7 +16,7 @@
/******************************************************************************* /*******************************************************************************
File: adj_thr_data.h File: adj_thr_data.h
Content: Threshold compensation parameter Content: Threshold compensation parameter
*******************************************************************************/ *******************************************************************************/

View File

@@ -26,7 +26,7 @@
#include "qc_data.h" #include "qc_data.h"
#include "tns.h" #include "tns.h"
#include "channel_map.h" #include "channel_map.h"
#include "interface.h" #include "interface.h"
struct BITSTREAMENCODER_INIT struct BITSTREAMENCODER_INIT
{ {

View File

@@ -55,11 +55,11 @@ typedef struct {
Word16 windowShape; Word16 windowShape;
Word16 groupingMask; Word16 groupingMask;
Word16 sfbOffsets[MAX_GROUPED_SFB+1]; Word16 sfbOffsets[MAX_GROUPED_SFB+1];
Word16 mdctScale; Word16 mdctScale;
Word32 *sfbEnergy; Word32 *sfbEnergy;
Word32 *sfbSpreadedEnergy; Word32 *sfbSpreadedEnergy;
Word32 *sfbThreshold; Word32 *sfbThreshold;
Word32 *mdctSpectrum; Word32 *mdctSpectrum;
Word32 sfbEnSumLR; Word32 sfbEnSumLR;
Word32 sfbEnSumMS; Word32 sfbEnSumMS;
Word32 sfbDist[MAX_GROUPED_SFB]; Word32 sfbDist[MAX_GROUPED_SFB];

View File

@@ -24,8 +24,8 @@
#define __LINE_PE_H #define __LINE_PE_H
#include "psy_const.h" #include "psy_const.h"
#include "interface.h" #include "interface.h"
typedef struct { typedef struct {
@@ -72,4 +72,4 @@ void calcSfbPe(PE_DATA *peData,
#endif #endif

View File

@@ -69,7 +69,7 @@ enum
#define BLOCK_SWITCHING_OFFSET (1*1024+3*128+64+128) #define BLOCK_SWITCHING_OFFSET (1*1024+3*128+64+128)
#define BLOCK_SWITCHING_DATA_SIZE FRAME_LEN_LONG #define BLOCK_SWITCHING_DATA_SIZE FRAME_LEN_LONG
#define TRANSFORM_OFFSET_LONG 0 #define TRANSFORM_OFFSET_LONG 0
#define TRANSFORM_OFFSET_SHORT 448 #define TRANSFORM_OFFSET_SHORT 448

View File

@@ -54,9 +54,9 @@ Word16 psyMainInit( PSY_KERNEL *hPsy,
Word16 bandwidth); Word16 bandwidth);
Word16 psyMain(Word16 nChannels, /*!< total number of channels */ Word16 psyMain(Word16 nChannels, /*!< total number of channels */
ELEMENT_INFO *elemInfo, ELEMENT_INFO *elemInfo,
Word16 *timeSignal, /*!< interleaved time signal */ Word16 *timeSignal, /*!< interleaved time signal */
PSY_DATA psyData[MAX_CHANNELS], PSY_DATA psyData[MAX_CHANNELS],
TNS_DATA tnsData[MAX_CHANNELS], TNS_DATA tnsData[MAX_CHANNELS],
PSY_CONFIGURATION_LONG* psyConfLong, PSY_CONFIGURATION_LONG* psyConfLong,

View File

@@ -35,7 +35,7 @@ void QCOutDelete(QC_OUT *hQC, VO_MEM_OPERATOR *pMemOP);
Word16 QCNew(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP); Word16 QCNew(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP);
Word16 QCInit(QC_STATE *hQC, Word16 QCInit(QC_STATE *hQC,
struct QC_INIT *init); struct QC_INIT *init);
void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP); void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP);

View File

@@ -28,7 +28,7 @@
#define MAX_QUANT 8191 #define MAX_QUANT 8191
void QuantizeSpectrum(Word16 sfbCnt, void QuantizeSpectrum(Word16 sfbCnt,
Word16 maxSfbPerGroup, Word16 maxSfbPerGroup,
Word16 sfbPerGroup, Word16 sfbPerGroup,
Word16 *sfbOffset, Word32 *mdctSpectrum, Word16 *sfbOffset, Word32 *mdctSpectrum,

View File

@@ -23,7 +23,7 @@
#ifndef __SF_ESTIM_H__ #ifndef __SF_ESTIM_H__
#define __SF_ESTIM_H__ #define __SF_ESTIM_H__
/* /*
Scale factor estimation Scale factor estimation
*/ */
#include "psy_const.h" #include "psy_const.h"
#include "interface.h" #include "interface.h"

View File

@@ -28,7 +28,7 @@
Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
PSY_OUT_ELEMENT *psyOutElement, PSY_OUT_ELEMENT *psyOutElement,
Word16 nChannels, Word16 nChannels,
Word16 adtsUsed); Word16 adtsUsed);
#endif /* __STAT_BITS_H */ #endif /* __STAT_BITS_H */

View File

@@ -44,7 +44,7 @@ typedef struct{
}TNS_INFO_TAB; }TNS_INFO_TAB;
void GetTnsParam(TNS_CONFIG_TABULATED *tnsConfigTab, void GetTnsParam(TNS_CONFIG_TABULATED *tnsConfigTab,
Word32 bitRate, Word16 channels, Word16 blockType); Word32 bitRate, Word16 channels, Word16 blockType);
void GetTnsMaxBands(Word32 samplingRate, Word16 blockType, Word16* tnsMaxSfb); void GetTnsMaxBands(Word32 samplingRate, Word16 blockType, Word16* tnsMaxSfb);

View File

@@ -24,7 +24,7 @@
#define __TRANSFORM_H__ #define __TRANSFORM_H__
#include "typedef.h" #include "typedef.h"
void Transform_Real(Word16 *mdctDelayBuffer, void Transform_Real(Word16 *mdctDelayBuffer,
Word16 *timeSignal, Word16 *timeSignal,
Word16 chIncrement, /*! channel increment */ Word16 chIncrement, /*! channel increment */

File diff suppressed because it is too large Load Diff

View File

@@ -48,7 +48,7 @@ VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_COD
interMem = 0; interMem = 0;
error = 0; error = 0;
/* init the memory operator */ /* init the memory operator */
if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL ) if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )
{ {
@@ -113,7 +113,7 @@ VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_COD
{ {
mem_free(pMemOP, hAacEnc, VO_INDEX_ENC_AAC); mem_free(pMemOP, hAacEnc, VO_INDEX_ENC_AAC);
hAacEnc = NULL; hAacEnc = NULL;
} }
*phCodec = NULL; *phCodec = NULL;
return VO_ERR_OUTOF_MEMORY; return VO_ERR_OUTOF_MEMORY;
} }
@@ -168,9 +168,9 @@ VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput)
{ {
return VO_ERR_INVALID_ARG; return VO_ERR_INVALID_ARG;
} }
hAacEnc = (AAC_ENCODER *)hCodec; hAacEnc = (AAC_ENCODER *)hCodec;
/* init input pcm buffer and length*/ /* init input pcm buffer and length*/
hAacEnc->inbuf = (short *)pInput->Buffer; hAacEnc->inbuf = (short *)pInput->Buffer;
hAacEnc->inlen = pInput->Length / sizeof(short); hAacEnc->inlen = pInput->Length / sizeof(short);
@@ -178,12 +178,12 @@ VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput)
hAacEnc->encbuf = hAacEnc->inbuf; hAacEnc->encbuf = hAacEnc->inbuf;
hAacEnc->enclen = hAacEnc->inlen; hAacEnc->enclen = hAacEnc->inlen;
/* rebuild intra pcm buffer and length*/ /* rebuild intra pcm buffer and length*/
if(hAacEnc->intlen) if(hAacEnc->intlen)
{ {
length = min(hAacEnc->config.nChannelsIn*AACENC_BLOCKSIZE - hAacEnc->intlen, hAacEnc->inlen); length = min(hAacEnc->config.nChannelsIn*AACENC_BLOCKSIZE - hAacEnc->intlen, hAacEnc->inlen);
hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf + hAacEnc->intlen, hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf + hAacEnc->intlen,
hAacEnc->inbuf, length*sizeof(short)); hAacEnc->inbuf, length*sizeof(short));
hAacEnc->encbuf = hAacEnc->intbuf; hAacEnc->encbuf = hAacEnc->intbuf;
@@ -192,7 +192,7 @@ VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput)
hAacEnc->inbuf += length; hAacEnc->inbuf += length;
hAacEnc->inlen -= length; hAacEnc->inlen -= length;
} }
return VO_ERR_NONE; return VO_ERR_NONE;
} }
@@ -219,11 +219,11 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput,
/* check the input pcm buffer and length*/ /* check the input pcm buffer and length*/
if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen) if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen)
{ {
length = hAacEnc->enclen; length = hAacEnc->enclen;
if(hAacEnc->intlen == 0) if(hAacEnc->intlen == 0)
{ {
hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf, hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf,
hAacEnc->encbuf, length*sizeof(short)); hAacEnc->encbuf, length*sizeof(short));
hAacEnc->uselength += length*sizeof(short); hAacEnc->uselength += length*sizeof(short);
} }
else else
@@ -236,7 +236,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput,
pOutput->Length = 0; pOutput->Length = 0;
if(pOutInfo) if(pOutInfo)
pOutInfo->InputUsed = hAacEnc->uselength; pOutInfo->InputUsed = hAacEnc->uselength;
return VO_ERR_INPUT_BUFFER_SMALL; return VO_ERR_INPUT_BUFFER_SMALL;
} }
/* check the output aac buffer and length*/ /* check the output aac buffer and length*/
@@ -254,7 +254,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput,
/* update the input pcm buffer and length*/ /* update the input pcm buffer and length*/
if(hAacEnc->intlen) if(hAacEnc->intlen)
{ {
length = inbuflen - hAacEnc->intlen; length = inbuflen - hAacEnc->intlen;
hAacEnc->encbuf = hAacEnc->inbuf; hAacEnc->encbuf = hAacEnc->inbuf;
hAacEnc->enclen = hAacEnc->inlen; hAacEnc->enclen = hAacEnc->inlen;
hAacEnc->uselength += length*sizeof(short); hAacEnc->uselength += length*sizeof(short);
@@ -265,7 +265,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput,
hAacEnc->encbuf = hAacEnc->encbuf + inbuflen; hAacEnc->encbuf = hAacEnc->encbuf + inbuflen;
hAacEnc->enclen = hAacEnc->enclen - inbuflen; hAacEnc->enclen = hAacEnc->enclen - inbuflen;
hAacEnc->uselength += inbuflen*sizeof(short); hAacEnc->uselength += inbuflen*sizeof(short);
} }
/* update the output aac information */ /* update the output aac information */
if(pOutInfo) if(pOutInfo)
@@ -287,7 +287,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput,
VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec) VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec)
{ {
AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec; AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
if(NULL != hAacEnc) if(NULL != hAacEnc)
{ {
/* close the aac encoder */ /* close the aac encoder */
@@ -296,7 +296,7 @@ VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec)
/* free the aac encoder handle*/ /* free the aac encoder handle*/
mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC); mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC);
hAacEnc = NULL; hAacEnc = NULL;
} }
return VO_ERR_NONE; return VO_ERR_NONE;
} }
@@ -319,7 +319,7 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
if(NULL == hAacEnc) if(NULL == hAacEnc)
return VO_ERR_INVALID_ARG; return VO_ERR_INVALID_ARG;
switch(uParamID) switch(uParamID)
{ {
case VO_PID_AAC_ENCPARAM: /* init aac encoder parameter*/ case VO_PID_AAC_ENCPARAM: /* init aac encoder parameter*/
@@ -354,11 +354,11 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
SampleRateIdx = i; SampleRateIdx = i;
tmp = 441; tmp = 441;
if(config.sampleRate%8000 == 0) if(config.sampleRate%8000 == 0)
tmp =480; tmp =480;
/* check the bitrate */ /* check the bitrate */
if(config.bitRate!=0 && (config.bitRate/config.nChannelsOut < 4000) || if(config.bitRate!=0 && (config.bitRate/config.nChannelsOut < 4000) ||
(config.bitRate/config.nChannelsOut > 160000) || (config.bitRate/config.nChannelsOut > 160000) ||
(config.bitRate > config.sampleRate*6*config.nChannelsOut)) (config.bitRate > config.sampleRate*6*config.nChannelsOut))
{ {
config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut; config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
@@ -385,7 +385,7 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
/* init aac encoder core */ /* init aac encoder core */
ret = AacEncOpen(hAacEnc, config); ret = AacEncOpen(hAacEnc, config);
if(ret) if(ret)
return VO_ERR_AUDIO_UNSFEATURE; return VO_ERR_AUDIO_UNSFEATURE;
break; break;
case VO_PID_AUDIO_FORMAT: /* init pcm channel and samplerate*/ case VO_PID_AUDIO_FORMAT: /* init pcm channel and samplerate*/
@@ -426,7 +426,7 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
/* update the bitrates */ /* update the bitrates */
tmp = 441; tmp = 441;
if(config.sampleRate%8000 == 0) if(config.sampleRate%8000 == 0)
tmp =480; tmp =480;
config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut; config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
@@ -449,10 +449,10 @@ VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
} }
config.bandWidth = BandwithCoefTab[i][SampleRateIdx]; config.bandWidth = BandwithCoefTab[i][SampleRateIdx];
/* init aac encoder core */ /* init aac encoder core */
ret = AacEncOpen(hAacEnc, config); ret = AacEncOpen(hAacEnc, config);
if(ret) if(ret)
return VO_ERR_AUDIO_UNSFEATURE; return VO_ERR_AUDIO_UNSFEATURE;
break; break;
default: default:
@@ -483,7 +483,7 @@ VO_S32 VO_API voGetAACEncAPI(VO_AUDIO_CODECAPI * pDecHandle)
{ {
if(pDecHandle == NULL) if(pDecHandle == NULL)
return VO_ERR_INVALID_ARG; return VO_ERR_INVALID_ARG;
pDecHandle->Init = voAACEncInit; pDecHandle->Init = voAACEncInit;
pDecHandle->SetInputData = voAACEncSetInputData; pDecHandle->SetInputData = voAACEncSetInputData;
pDecHandle->GetOutputData = voAACEncGetOutputData; pDecHandle->GetOutputData = voAACEncGetOutputData;

View File

@@ -43,8 +43,8 @@ void AacInitDefaultConfig(AACENC_CONFIG *config)
config->adtsUsed = 1; config->adtsUsed = 1;
config->nChannelsIn = 2; config->nChannelsIn = 2;
config->nChannelsOut = 2; config->nChannelsOut = 2;
config->bitRate = 128000; config->bitRate = 128000;
config->bandWidth = 0; config->bandWidth = 0;
} }
/******************************************************************************** /********************************************************************************
@@ -63,11 +63,11 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder
Word16 profile = 1; Word16 profile = 1;
ELEMENT_INFO *elInfo = NULL; ELEMENT_INFO *elInfo = NULL;
if (hAacEnc==0) { if (hAacEnc==0) {
error=1; error=1;
} }
if (!error) { if (!error) {
hAacEnc->config = config; hAacEnc->config = config;
} }
@@ -83,7 +83,7 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder
if (!error) { if (!error) {
/* use or not tns tool for long and short block */ /* use or not tns tool for long and short block */
Word16 tnsMask=3; Word16 tnsMask=3;
/* init encoder psychoacoustic */ /* init encoder psychoacoustic */
error = psyMainInit(&hAacEnc->psyKernel, error = psyMainInit(&hAacEnc->psyKernel,
@@ -107,10 +107,10 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder
qcInit.elInfo = &hAacEnc->elInfo; qcInit.elInfo = &hAacEnc->elInfo;
qcInit.maxBits = (Word16) (MAXBITS_COEF*elInfo->nChannelsInEl); qcInit.maxBits = (Word16) (MAXBITS_COEF*elInfo->nChannelsInEl);
qcInit.bitRes = qcInit.maxBits; qcInit.bitRes = qcInit.maxBits;
qcInit.averageBits = (Word16) ((config.bitRate * FRAME_LEN_LONG) / config.sampleRate); qcInit.averageBits = (Word16) ((config.bitRate * FRAME_LEN_LONG) / config.sampleRate);
qcInit.padding.paddingRest = config.sampleRate; qcInit.padding.paddingRest = config.sampleRate;
qcInit.meanPe = (Word16) ((10 * FRAME_LEN_LONG * hAacEnc->config.bandWidth) / qcInit.meanPe = (Word16) ((10 * FRAME_LEN_LONG * hAacEnc->config.bandWidth) /
(config.sampleRate>>1)); (config.sampleRate>>1));
@@ -118,17 +118,17 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder
qcInit.maxBitFac = (Word16) ((100 * (MAXBITS_COEF-MINBITS_COEF)* elInfo->nChannelsInEl)/ qcInit.maxBitFac = (Word16) ((100 * (MAXBITS_COEF-MINBITS_COEF)* elInfo->nChannelsInEl)/
(qcInit.averageBits?qcInit.averageBits:1)); (qcInit.averageBits?qcInit.averageBits:1));
qcInit.bitrate = config.bitRate; qcInit.bitrate = config.bitRate;
error = QCInit(&hAacEnc->qcKernel, &qcInit); error = QCInit(&hAacEnc->qcKernel, &qcInit);
} }
/* init bitstream encoder */ /* init bitstream encoder */
if (!error) { if (!error) {
hAacEnc->bseInit.nChannels = elInfo->nChannelsInEl; hAacEnc->bseInit.nChannels = elInfo->nChannelsInEl;
hAacEnc->bseInit.bitrate = config.bitRate; hAacEnc->bseInit.bitrate = config.bitRate;
hAacEnc->bseInit.sampleRate = config.sampleRate; hAacEnc->bseInit.sampleRate = config.sampleRate;
hAacEnc->bseInit.profile = profile; hAacEnc->bseInit.profile = profile;
} }
return error; return error;
@@ -152,14 +152,14 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
ELEMENT_INFO *elInfo = &aacEnc->elInfo; ELEMENT_INFO *elInfo = &aacEnc->elInfo;
Word16 globUsedBits; Word16 globUsedBits;
Word16 ancDataBytes, ancDataBytesLeft; Word16 ancDataBytes, ancDataBytesLeft;
ancDataBytes = ancDataBytesLeft = *numAncBytes; ancDataBytes = ancDataBytesLeft = *numAncBytes;
/* init output aac data buffer and length */ /* init output aac data buffer and length */
aacEnc->hBitStream = CreateBitBuffer(&aacEnc->bitStream, outBytes, *numOutBytes); aacEnc->hBitStream = CreateBitBuffer(&aacEnc->bitStream, outBytes, *numOutBytes);
/* psychoacoustic process */ /* psychoacoustic process */
psyMain(aacEnc->config.nChannelsOut, psyMain(aacEnc->config.nChannelsOut,
elInfo, elInfo,
timeSignal, timeSignal,
&aacEnc->psyKernel.psyData[elInfo->ChannelIndex[0]], &aacEnc->psyKernel.psyData[elInfo->ChannelIndex[0]],
@@ -175,9 +175,9 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
AdjustBitrate(&aacEnc->qcKernel, AdjustBitrate(&aacEnc->qcKernel,
aacEnc->config.bitRate, aacEnc->config.bitRate,
aacEnc->config.sampleRate); aacEnc->config.sampleRate);
/* quantization and coding process */ /* quantization and coding process */
QCMain(&aacEnc->qcKernel, QCMain(&aacEnc->qcKernel,
&aacEnc->qcKernel.elementBits, &aacEnc->qcKernel.elementBits,
&aacEnc->qcKernel.adjThr.adjThrStateElem, &aacEnc->qcKernel.adjThr.adjThrStateElem,
&aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]], &aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]],
@@ -193,11 +193,11 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
&aacEnc->qcOut); &aacEnc->qcOut);
/* write bitstream process */ /* write bitstream process */
WriteBitstream(aacEnc->hBitStream, WriteBitstream(aacEnc->hBitStream,
*elInfo, *elInfo,
&aacEnc->qcOut, &aacEnc->qcOut,
&aacEnc->psyOut, &aacEnc->psyOut,
&globUsedBits, &globUsedBits,
ancBytes, ancBytes,
aacEnc->psyKernel.sampleRateIdx); aacEnc->psyKernel.sampleRateIdx);
@@ -219,7 +219,7 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
**********************************************************************************/ **********************************************************************************/
void AacEncClose (AAC_ENCODER* hAacEnc, VO_MEM_OPERATOR *pMemOP) void AacEncClose (AAC_ENCODER* hAacEnc, VO_MEM_OPERATOR *pMemOP)
{ {
if (hAacEnc) { if (hAacEnc) {
QCDelete(&hAacEnc->qcKernel, pMemOP); QCDelete(&hAacEnc->qcKernel, pMemOP);
QCOutDelete(&hAacEnc->qcOut, pMemOP); QCOutDelete(&hAacEnc->qcOut, pMemOP);

View File

@@ -71,7 +71,7 @@ static void calcThreshExp(Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB],
Word32 *pthrExp, *psfbThre; Word32 *pthrExp, *psfbThre;
for (ch=0; ch<nChannels; ch++) { for (ch=0; ch<nChannels; ch++) {
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup) for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup)
pthrExp = &(thrExp[ch][sfbGrp]); pthrExp = &(thrExp[ch][sfbGrp]);
psfbThre = psyOutChan->sfbThreshold + sfbGrp; psfbThre = psyOutChan->sfbThreshold + sfbGrp;
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
@@ -96,21 +96,21 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
Word32 nSfb, avgEn; Word32 nSfb, avgEn;
Word16 log_avgEn = 0; Word16 log_avgEn = 0;
Word32 startRatio_x_avgEn = 0; Word32 startRatio_x_avgEn = 0;
for (ch=0; ch<nChannels; ch++) { for (ch=0; ch<nChannels; ch++) {
PSY_OUT_CHANNEL* psyOutChan = &psyOutChannel[ch]; PSY_OUT_CHANNEL* psyOutChan = &psyOutChannel[ch];
/* calc average energy per scalefactor band */ /* calc average energy per scalefactor band */
avgEn = 0; avgEn = 0;
nSfb = 0; nSfb = 0;
for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) { for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) {
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
avgEn = L_add(avgEn, psyOutChan->sfbEnergy[sfbOffs+sfb]); avgEn = L_add(avgEn, psyOutChan->sfbEnergy[sfbOffs+sfb]);
nSfb = nSfb + 1; nSfb = nSfb + 1;
} }
} }
if (nSfb > 0) { if (nSfb > 0) {
avgEn = avgEn / nSfb; avgEn = avgEn / nSfb;
@@ -118,7 +118,7 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
startRatio_x_avgEn = fixmul(msaParam->startRatio, avgEn); startRatio_x_avgEn = fixmul(msaParam->startRatio, avgEn);
} }
/* reduce minSnr requirement by minSnr^minSnrRed dependent on avgEn/sfbEn */ /* reduce minSnr requirement by minSnr^minSnrRed dependent on avgEn/sfbEn */
for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) { for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) {
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
@@ -126,22 +126,22 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
Word16 dbRatio, minSnrRed; Word16 dbRatio, minSnrRed;
Word32 snrRed; Word32 snrRed;
Word16 newMinSnr; Word16 newMinSnr;
dbRatio = log_avgEn - logSfbEnergy[ch][sfbOffs+sfb]; dbRatio = log_avgEn - logSfbEnergy[ch][sfbOffs+sfb];
dbRatio = dbRatio + (dbRatio << 1); dbRatio = dbRatio + (dbRatio << 1);
minSnrRed = 110 - ((dbRatio + (dbRatio << 1)) >> 2); minSnrRed = 110 - ((dbRatio + (dbRatio << 1)) >> 2);
minSnrRed = max(minSnrRed, 20); /* 110: (0.375(redOffs)+1)*80, minSnrRed = max(minSnrRed, 20); /* 110: (0.375(redOffs)+1)*80,
3: 0.00375(redRatioFac)*80 3: 0.00375(redRatioFac)*80
20: 0.25(maxRed) * 80 */ 20: 0.25(maxRed) * 80 */
snrRed = minSnrRed * iLog4((psyOutChan->sfbMinSnr[sfbOffs+sfb] << 16)); snrRed = minSnrRed * iLog4((psyOutChan->sfbMinSnr[sfbOffs+sfb] << 16));
/* /*
snrRedI si now scaled by 80 (minSnrRed) and 4 (ffr_iLog4) snrRedI si now scaled by 80 (minSnrRed) and 4 (ffr_iLog4)
*/ */
newMinSnr = round16(pow2_xy(snrRed,80*4)); newMinSnr = round16(pow2_xy(snrRed,80*4));
psyOutChan->sfbMinSnr[sfbOffs+sfb] = min(newMinSnr, minSnrLimit); psyOutChan->sfbMinSnr[sfbOffs+sfb] = min(newMinSnr, minSnrLimit);
} }
} }
@@ -169,7 +169,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
for (ch=0; ch<nChannels; ch++) { for (ch=0; ch<nChannels; ch++) {
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
if (psyOutChan->windowSequence != SHORT_WINDOW) { if (psyOutChan->windowSequence != SHORT_WINDOW) {
for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp; psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp;
@@ -194,7 +194,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
if (ahParam->modifyMinSnr) { if (ahParam->modifyMinSnr) {
for(ch=0; ch<nChannels; ch++) { for(ch=0; ch<nChannels; ch++) {
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
if (psyOutChan->windowSequence != SHORT_WINDOW) if (psyOutChan->windowSequence != SHORT_WINDOW)
threshold = HOLE_THR_LONG; threshold = HOLE_THR_LONG;
else else
@@ -204,39 +204,39 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
Word16 *psfbMinSnr = psyOutChan->sfbMinSnr + sfbGrp; Word16 *psfbMinSnr = psyOutChan->sfbMinSnr + sfbGrp;
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
Word32 sfbEn, sfbEnm1, sfbEnp1, avgEn; Word32 sfbEn, sfbEnm1, sfbEnp1, avgEn;
if (sfb > 0) if (sfb > 0)
sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp+sfb-1]; sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp+sfb-1];
else else
sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp]; sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp];
if (sfb < (psyOutChan->maxSfbPerGroup-1)) if (sfb < (psyOutChan->maxSfbPerGroup-1))
sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb+1]; sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb+1];
else else
sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb]; sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb];
avgEn = (sfbEnm1 + sfbEnp1) >> 1; avgEn = (sfbEnm1 + sfbEnp1) >> 1;
sfbEn = psyOutChan->sfbEnergy[sfbGrp+sfb]; sfbEn = psyOutChan->sfbEnergy[sfbGrp+sfb];
if (sfbEn > avgEn && avgEn > 0) { if (sfbEn > avgEn && avgEn > 0) {
Word32 tmpMinSnr; Word32 tmpMinSnr;
shift = norm_l(sfbEn); shift = norm_l(sfbEn);
tmpMinSnr = Div_32(L_mpy_ls(avgEn, minSnrLimit) << shift, sfbEn << shift ); tmpMinSnr = Div_32(L_mpy_ls(avgEn, minSnrLimit) << shift, sfbEn << shift );
tmpMinSnr = max(tmpMinSnr, HOLE_THR_LONG); tmpMinSnr = max(tmpMinSnr, HOLE_THR_LONG);
tmpMinSnr = max(tmpMinSnr, threshold); tmpMinSnr = max(tmpMinSnr, threshold);
*psfbMinSnr = min(*psfbMinSnr, tmpMinSnr); *psfbMinSnr = min(*psfbMinSnr, tmpMinSnr);
} }
/* valley ? */ /* valley ? */
if ((sfbEn < (avgEn >> 1)) && (sfbEn > 0)) { if ((sfbEn < (avgEn >> 1)) && (sfbEn > 0)) {
Word32 tmpMinSnr; Word32 tmpMinSnr;
Word32 minSnrEn = L_mpy_wx(avgEn, *psfbMinSnr); Word32 minSnrEn = L_mpy_wx(avgEn, *psfbMinSnr);
if(minSnrEn < sfbEn) { if(minSnrEn < sfbEn) {
shift = norm_l(sfbEn); shift = norm_l(sfbEn);
tmpMinSnr = Div_32( minSnrEn << shift, sfbEn<<shift); tmpMinSnr = Div_32( minSnrEn << shift, sfbEn<<shift);
} }
else { else {
tmpMinSnr = MAX_16; tmpMinSnr = MAX_16;
} }
tmpMinSnr = min(minSnrLimit, tmpMinSnr); tmpMinSnr = min(minSnrLimit, tmpMinSnr);
@@ -251,7 +251,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
/* stereo: adapt the minimum requirements sfbMinSnr of mid and /* stereo: adapt the minimum requirements sfbMinSnr of mid and
side channels */ side channels */
if (nChannels == 2) { if (nChannels == 2) {
PSY_OUT_CHANNEL *psyOutChanM = &psyOutChannel[0]; PSY_OUT_CHANNEL *psyOutChanM = &psyOutChannel[0];
PSY_OUT_CHANNEL *psyOutChanS = &psyOutChannel[1]; PSY_OUT_CHANNEL *psyOutChanS = &psyOutChannel[1];
@@ -260,30 +260,30 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
Word32 sfbEnM = psyOutChanM->sfbEnergy[sfb]; Word32 sfbEnM = psyOutChanM->sfbEnergy[sfb];
Word32 sfbEnS = psyOutChanS->sfbEnergy[sfb]; Word32 sfbEnS = psyOutChanS->sfbEnergy[sfb];
Word32 maxSfbEn = max(sfbEnM, sfbEnS); Word32 maxSfbEn = max(sfbEnM, sfbEnS);
Word32 maxThr = L_mpy_wx(maxSfbEn, psyOutChanM->sfbMinSnr[sfb]) >> 1; Word32 maxThr = L_mpy_wx(maxSfbEn, psyOutChanM->sfbMinSnr[sfb]) >> 1;
if(maxThr >= sfbEnM) { if(maxThr >= sfbEnM) {
psyOutChanM->sfbMinSnr[sfb] = MAX_16; psyOutChanM->sfbMinSnr[sfb] = MAX_16;
} }
else { else {
shift = norm_l(sfbEnM); shift = norm_l(sfbEnM);
psyOutChanM->sfbMinSnr[sfb] = min(max(psyOutChanM->sfbMinSnr[sfb], psyOutChanM->sfbMinSnr[sfb] = min(max(psyOutChanM->sfbMinSnr[sfb],
round16(Div_32(maxThr<<shift, sfbEnM << shift))), minSnrLimit); round16(Div_32(maxThr<<shift, sfbEnM << shift))), minSnrLimit);
} }
if(maxThr >= sfbEnS) { if(maxThr >= sfbEnS) {
psyOutChanS->sfbMinSnr[sfb] = MAX_16; psyOutChanS->sfbMinSnr[sfb] = MAX_16;
} }
else { else {
shift = norm_l(sfbEnS); shift = norm_l(sfbEnS);
psyOutChanS->sfbMinSnr[sfb] = min(max(psyOutChanS->sfbMinSnr[sfb], psyOutChanS->sfbMinSnr[sfb] = min(max(psyOutChanS->sfbMinSnr[sfb],
round16(Div_32(maxThr << shift, sfbEnS << shift))), minSnrLimit); round16(Div_32(maxThr << shift, sfbEnS << shift))), minSnrLimit);
} }
if (sfbEnM > psyOutChanM->sfbSpreadedEnergy[sfb]) if (sfbEnM > psyOutChanM->sfbSpreadedEnergy[sfb])
psyOutChanS->sfbSpreadedEnergy[sfb] = L_mpy_ls(sfbEnS, MS_THRSPREAD_COEF); psyOutChanS->sfbSpreadedEnergy[sfb] = L_mpy_ls(sfbEnS, MS_THRSPREAD_COEF);
if (sfbEnS > psyOutChanS->sfbSpreadedEnergy[sfb]) if (sfbEnS > psyOutChanS->sfbSpreadedEnergy[sfb])
psyOutChanM->sfbSpreadedEnergy[sfb] = L_mpy_ls(sfbEnM, MS_THRSPREAD_COEF); psyOutChanM->sfbSpreadedEnergy[sfb] = L_mpy_ls(sfbEnM, MS_THRSPREAD_COEF);
} }
@@ -297,7 +297,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
Word16 *pahFlag = ahFlag[ch] + sfbGrp; Word16 *pahFlag = ahFlag[ch] + sfbGrp;
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
if ((psyOutChan->sfbSpreadedEnergy[sfbGrp+sfb] > psyOutChan->sfbEnergy[sfbGrp+sfb]) || if ((psyOutChan->sfbSpreadedEnergy[sfbGrp+sfb] > psyOutChan->sfbEnergy[sfbGrp+sfb]) ||
(psyOutChan->sfbEnergy[sfbGrp+sfb] <= psyOutChan->sfbThreshold[sfbGrp+sfb]) || (psyOutChan->sfbEnergy[sfbGrp+sfb] <= psyOutChan->sfbThreshold[sfbGrp+sfb]) ||
(psyOutChan->sfbMinSnr[sfbGrp+sfb] == MAX_16)) { (psyOutChan->sfbMinSnr[sfbGrp+sfb] == MAX_16)) {
@@ -308,7 +308,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
} }
} }
for (sfb=psyOutChan->maxSfbPerGroup; sfb<psyOutChan->sfbPerGroup; sfb++) { for (sfb=psyOutChan->maxSfbPerGroup; sfb<psyOutChan->sfbPerGroup; sfb++) {
*pahFlag++ = NO_AH; *pahFlag++ = NO_AH;
} }
} }
} }
@@ -331,15 +331,15 @@ static void calcPeNoAH(Word16 *pe,
Word16 ch, sfb, sfbGrp; Word16 ch, sfb, sfbGrp;
int ipe, iconstPart, inActiveLines; int ipe, iconstPart, inActiveLines;
ipe = 0; ipe = 0;
iconstPart = 0; iconstPart = 0;
inActiveLines = 0; inActiveLines = 0;
for(ch=0; ch<nChannels; ch++) { for(ch=0; ch<nChannels; ch++) {
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch]; PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
if (ahFlag[ch][sfbGrp+sfb] < AH_ACTIVE) { if (ahFlag[ch][sfbGrp+sfb] < AH_ACTIVE) {
ipe = ipe + peChanData->sfbPe[sfbGrp+sfb]; ipe = ipe + peChanData->sfbPe[sfbGrp+sfb];
iconstPart = iconstPart + peChanData->sfbConstPart[sfbGrp+sfb]; iconstPart = iconstPart + peChanData->sfbConstPart[sfbGrp+sfb];
@@ -349,9 +349,9 @@ static void calcPeNoAH(Word16 *pe,
} }
} }
*pe = saturate(ipe); *pe = saturate(ipe);
*constPart = saturate(iconstPart); *constPart = saturate(iconstPart);
*nActiveLines = saturate(inActiveLines); *nActiveLines = saturate(inActiveLines);
} }
/******************************************************************************** /********************************************************************************
@@ -367,16 +367,16 @@ static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
const Word32 redVal) const Word32 redVal)
{ {
Word32 sfbThrReduced; Word32 sfbThrReduced;
Word32 *psfbEn, *psfbThr; Word32 *psfbEn, *psfbThr;
Word16 ch, sfb, sfbGrp; Word16 ch, sfb, sfbGrp;
for(ch=0; ch<nChannels; ch++) { for(ch=0; ch<nChannels; ch++) {
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) { for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
psfbEn = psyOutChan->sfbEnergy + sfbGrp; psfbEn = psyOutChan->sfbEnergy + sfbGrp;
psfbThr = psyOutChan->sfbThreshold + sfbGrp; psfbThr = psyOutChan->sfbThreshold + sfbGrp;
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
if (*psfbEn > *psfbThr) { if (*psfbEn > *psfbThr) {
/* threshold reduction formula */ /* threshold reduction formula */
Word32 tmp = thrExp[ch][sfbGrp+sfb] + redVal; Word32 tmp = thrExp[ch][sfbGrp+sfb] + redVal;
@@ -384,11 +384,11 @@ static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
sfbThrReduced = fixmul(tmp, tmp); sfbThrReduced = fixmul(tmp, tmp);
/* avoid holes */ /* avoid holes */
tmp = L_mpy_ls(*psfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]); tmp = L_mpy_ls(*psfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]);
if ((sfbThrReduced > tmp) && if ((sfbThrReduced > tmp) &&
(ahFlag[ch][sfbGrp+sfb] != NO_AH)){ (ahFlag[ch][sfbGrp+sfb] != NO_AH)){
sfbThrReduced = max(tmp, *psfbThr); sfbThrReduced = max(tmp, *psfbThr);
ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE; ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE;
} }
*psfbThr = sfbThrReduced; *psfbThr = sfbThrReduced;
} }
@@ -426,7 +426,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
Word32 sfbThrReduced; Word32 sfbThrReduced;
/* for each sfb calc relative factors for pe changes */ /* for each sfb calc relative factors for pe changes */
normFactor = 1; normFactor = 1;
for(ch=0; ch<nChannels; ch++) { for(ch=0; ch<nChannels; ch++) {
psyOutChan = &psyOutChannel[ch]; psyOutChan = &psyOutChannel[ch];
peChanData = &peData->peChannelData[ch]; peChanData = &peData->peChannelData[ch];
@@ -436,22 +436,22 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
pahFlag = ahFlag[ch] + sfbGrp; pahFlag = ahFlag[ch] + sfbGrp;
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
Word32 redThrExp = thrExp[ch][sfbGrp+sfb] + redVal; Word32 redThrExp = thrExp[ch][sfbGrp+sfb] + redVal;
if (((*pahFlag < AH_ACTIVE) || (deltaPe > 0)) && (redThrExp > 0) ) { if (((*pahFlag < AH_ACTIVE) || (deltaPe > 0)) && (redThrExp > 0) ) {
*psfbPeFactors = (*psfbNActiveLines) * (0x7fffffff / redThrExp); *psfbPeFactors = (*psfbNActiveLines) * (0x7fffffff / redThrExp);
normFactor = L_add(normFactor, *psfbPeFactors); normFactor = L_add(normFactor, *psfbPeFactors);
} }
else { else {
*psfbPeFactors = 0; *psfbPeFactors = 0;
} }
psfbPeFactors++; psfbPeFactors++;
pahFlag++; psfbNActiveLines++; pahFlag++; psfbNActiveLines++;
} }
} }
} }
/* calculate new thresholds */ /* calculate new thresholds */
for(ch=0; ch<nChannels; ch++) { for(ch=0; ch<nChannels; ch++) {
psyOutChan = &psyOutChannel[ch]; psyOutChan = &psyOutChannel[ch];
@@ -464,7 +464,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
/* pe difference for this sfb */ /* pe difference for this sfb */
deltaSfbPe = *psfbPeFactors * deltaPe; deltaSfbPe = *psfbPeFactors * deltaPe;
/* thr3(n) = thr2(n)*2^deltaSfbPe/b(n) */ /* thr3(n) = thr2(n)*2^deltaSfbPe/b(n) */
if (*psfbNActiveLines > 0) { if (*psfbNActiveLines > 0) {
/* new threshold */ /* new threshold */
Word32 thrFactor; Word32 thrFactor;
@@ -476,7 +476,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
reduce threshold reduce threshold
*/ */
thrFactor = pow2_xy(L_negate(deltaSfbPe), (normFactor* (*psfbNActiveLines))); thrFactor = pow2_xy(L_negate(deltaSfbPe), (normFactor* (*psfbNActiveLines)));
sfbThrReduced = L_mpy_ls(sfbThr, round16(thrFactor)); sfbThrReduced = L_mpy_ls(sfbThr, round16(thrFactor));
} }
else { else {
@@ -484,28 +484,28 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
increase threshold increase threshold
*/ */
thrFactor = pow2_xy(deltaSfbPe, (normFactor * (*psfbNActiveLines))); thrFactor = pow2_xy(deltaSfbPe, (normFactor * (*psfbNActiveLines)));
if(thrFactor > sfbThr) { if(thrFactor > sfbThr) {
shift = norm_l(thrFactor); shift = norm_l(thrFactor);
sfbThrReduced = Div_32( sfbThr << shift, thrFactor<<shift ); sfbThrReduced = Div_32( sfbThr << shift, thrFactor<<shift );
} }
else { else {
sfbThrReduced = MAX_32; sfbThrReduced = MAX_32;
} }
} }
/* avoid hole */ /* avoid hole */
sfbEn = L_mpy_ls(sfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]); sfbEn = L_mpy_ls(sfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]);
if ((sfbThrReduced > sfbEn) && if ((sfbThrReduced > sfbEn) &&
(*pahFlag == AH_INACTIVE)) { (*pahFlag == AH_INACTIVE)) {
sfbThrReduced = max(sfbEn, sfbThr); sfbThrReduced = max(sfbEn, sfbThr);
*pahFlag = AH_ACTIVE; *pahFlag = AH_ACTIVE;
} }
psyOutChan->sfbThreshold[sfbGrp+sfb] = sfbThrReduced; psyOutChan->sfbThreshold[sfbGrp+sfb] = sfbThrReduced;
} }
pahFlag++; psfbNActiveLines++; psfbPeFactors++; pahFlag++; psfbNActiveLines++; psfbPeFactors++;
@@ -521,8 +521,8 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
* description: if the desired pe can not be reached, reduce pe by reducing minSnr * description: if the desired pe can not be reached, reduce pe by reducing minSnr
* *
**********************************************************************************/ **********************************************************************************/
static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
PE_DATA *peData, PE_DATA *peData,
Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
const Word16 nChannels, const Word16 nChannels,
const Word16 desiredPe) const Word16 desiredPe)
@@ -531,9 +531,9 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
Word16 deltaPe; Word16 deltaPe;
/* start at highest freq down to 0 */ /* start at highest freq down to 0 */
sfbSubWin = psyOutChannel[0].maxSfbPerGroup; sfbSubWin = psyOutChannel[0].maxSfbPerGroup;
while (peData->pe > desiredPe && sfbSubWin > 0) { while (peData->pe > desiredPe && sfbSubWin > 0) {
sfbSubWin = sfbSubWin - 1; sfbSubWin = sfbSubWin - 1;
/* loop over all subwindows */ /* loop over all subwindows */
for (sfb=sfbSubWin; sfb<psyOutChannel[0].sfbCnt; for (sfb=sfbSubWin; sfb<psyOutChannel[0].sfbCnt;
@@ -541,10 +541,10 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
/* loop over all channels */ /* loop over all channels */
PE_CHANNEL_DATA* peChan = peData->peChannelData; PE_CHANNEL_DATA* peChan = peData->peChannelData;
PSY_OUT_CHANNEL* psyOutCh = psyOutChannel; PSY_OUT_CHANNEL* psyOutCh = psyOutChannel;
for (ch=0; ch<nChannels; ch++) { for (ch=0; ch<nChannels; ch++) {
if (ahFlag[ch][sfb] != NO_AH && if (ahFlag[ch][sfb] != NO_AH &&
psyOutCh->sfbMinSnr[sfb] < minSnrLimit) { psyOutCh->sfbMinSnr[sfb] < minSnrLimit) {
psyOutCh->sfbMinSnr[sfb] = minSnrLimit; psyOutCh->sfbMinSnr[sfb] = minSnrLimit;
psyOutCh->sfbThreshold[sfb] = psyOutCh->sfbThreshold[sfb] =
L_mpy_ls(psyOutCh->sfbEnergy[sfb], psyOutCh->sfbMinSnr[sfb]); L_mpy_ls(psyOutCh->sfbEnergy[sfb], psyOutCh->sfbMinSnr[sfb]);
@@ -552,12 +552,12 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
deltaPe = ((peChan->sfbNLines4[sfb] + (peChan->sfbNLines4[sfb] >> 1)) >> 2) - deltaPe = ((peChan->sfbNLines4[sfb] + (peChan->sfbNLines4[sfb] >> 1)) >> 2) -
peChan->sfbPe[sfb]; peChan->sfbPe[sfb];
peData->pe = peData->pe + deltaPe; peData->pe = peData->pe + deltaPe;
peChan->pe = peChan->pe + deltaPe; peChan->pe = peChan->pe + deltaPe;
} }
peChan += 1; psyOutCh += 1; peChan += 1; psyOutCh += 1;
} }
/* stop if enough has been saved */ /* stop if enough has been saved */
if (peData->pe <= desiredPe) if (peData->pe <= desiredPe)
break; break;
} }
@@ -567,13 +567,13 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
/******************************************************************************** /********************************************************************************
* *
* function name:allowMoreHoles * function name:allowMoreHoles
* description: if the desired pe can not be reached, some more scalefactor bands * description: if the desired pe can not be reached, some more scalefactor bands
* have to be quantized to zero * have to be quantized to zero
* *
**********************************************************************************/ **********************************************************************************/
static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
PSY_OUT_ELEMENT *psyOutElement, PSY_OUT_ELEMENT *psyOutElement,
PE_DATA *peData, PE_DATA *peData,
Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
const AH_PARAM *ahParam, const AH_PARAM *ahParam,
const Word16 nChannels, const Word16 nChannels,
@@ -582,46 +582,46 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
Word16 ch, sfb; Word16 ch, sfb;
Word16 actPe, shift; Word16 actPe, shift;
actPe = peData->pe; actPe = peData->pe;
/* for MS allow hole in the channel with less energy */ /* for MS allow hole in the channel with less energy */
if (nChannels==2 && if (nChannels==2 &&
psyOutChannel[0].windowSequence==psyOutChannel[1].windowSequence) { psyOutChannel[0].windowSequence==psyOutChannel[1].windowSequence) {
PSY_OUT_CHANNEL *psyOutChanL = &psyOutChannel[0]; PSY_OUT_CHANNEL *psyOutChanL = &psyOutChannel[0];
PSY_OUT_CHANNEL *psyOutChanR = &psyOutChannel[1]; PSY_OUT_CHANNEL *psyOutChanR = &psyOutChannel[1];
for (sfb=0; sfb<psyOutChanL->sfbCnt; sfb++) { for (sfb=0; sfb<psyOutChanL->sfbCnt; sfb++) {
Word32 minEn; Word32 minEn;
if (psyOutElement->toolsInfo.msMask[sfb]) { if (psyOutElement->toolsInfo.msMask[sfb]) {
/* allow hole in side channel ? */ /* allow hole in side channel ? */
minEn = L_mpy_ls(psyOutChanL->sfbEnergy[sfb], (minSnrLimit * psyOutChanL->sfbMinSnr[sfb]) >> 16); minEn = L_mpy_ls(psyOutChanL->sfbEnergy[sfb], (minSnrLimit * psyOutChanL->sfbMinSnr[sfb]) >> 16);
if (ahFlag[1][sfb] != NO_AH && if (ahFlag[1][sfb] != NO_AH &&
minEn > psyOutChanR->sfbEnergy[sfb]) { minEn > psyOutChanR->sfbEnergy[sfb]) {
ahFlag[1][sfb] = NO_AH; ahFlag[1][sfb] = NO_AH;
psyOutChanR->sfbThreshold[sfb] = L_add(psyOutChanR->sfbEnergy[sfb], psyOutChanR->sfbEnergy[sfb]); psyOutChanR->sfbThreshold[sfb] = L_add(psyOutChanR->sfbEnergy[sfb], psyOutChanR->sfbEnergy[sfb]);
actPe = actPe - peData->peChannelData[1].sfbPe[sfb]; actPe = actPe - peData->peChannelData[1].sfbPe[sfb];
} }
/* allow hole in mid channel ? */ /* allow hole in mid channel ? */
else { else {
minEn = L_mpy_ls(psyOutChanR->sfbEnergy[sfb], (minSnrLimit * psyOutChanR->sfbMinSnr[sfb]) >> 16); minEn = L_mpy_ls(psyOutChanR->sfbEnergy[sfb], (minSnrLimit * psyOutChanR->sfbMinSnr[sfb]) >> 16);
if (ahFlag[0][sfb]!= NO_AH && if (ahFlag[0][sfb]!= NO_AH &&
minEn > psyOutChanL->sfbEnergy[sfb]) { minEn > psyOutChanL->sfbEnergy[sfb]) {
ahFlag[0][sfb] = NO_AH; ahFlag[0][sfb] = NO_AH;
psyOutChanL->sfbThreshold[sfb] = L_add(psyOutChanL->sfbEnergy[sfb], psyOutChanL->sfbEnergy[sfb]); psyOutChanL->sfbThreshold[sfb] = L_add(psyOutChanL->sfbEnergy[sfb], psyOutChanL->sfbEnergy[sfb]);
actPe = actPe - peData->peChannelData[0].sfbPe[sfb]; actPe = actPe - peData->peChannelData[0].sfbPe[sfb];
} }
} }
if (actPe < desiredPe) if (actPe < desiredPe)
break; break;
} }
} }
} }
/* subsequently erase bands */ /* subsequently erase bands */
if (actPe > desiredPe) { if (actPe > desiredPe) {
Word16 startSfb[2]; Word16 startSfb[2];
Word32 avgEn, minEn; Word32 avgEn, minEn;
@@ -634,20 +634,20 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
/* do not go below startSfb */ /* do not go below startSfb */
for (ch=0; ch<nChannels; ch++) { for (ch=0; ch<nChannels; ch++) {
if (psyOutChannel[ch].windowSequence != SHORT_WINDOW) if (psyOutChannel[ch].windowSequence != SHORT_WINDOW)
startSfb[ch] = ahParam->startSfbL; startSfb[ch] = ahParam->startSfbL;
else else
startSfb[ch] = ahParam->startSfbS; startSfb[ch] = ahParam->startSfbS;
} }
avgEn = 0; avgEn = 0;
minEn = MAX_32; minEn = MAX_32;
ahCnt = 0; ahCnt = 0;
for (ch=0; ch<nChannels; ch++) { for (ch=0; ch<nChannels; ch++) {
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
for (sfb=startSfb[ch]; sfb<psyOutChan->sfbCnt; sfb++) { for (sfb=startSfb[ch]; sfb<psyOutChan->sfbCnt; sfb++) {
if ((ahFlag[ch][sfb] != NO_AH) && if ((ahFlag[ch][sfb] != NO_AH) &&
(psyOutChan->sfbEnergy[sfb] > psyOutChan->sfbThreshold[sfb])) { (psyOutChan->sfbEnergy[sfb] > psyOutChan->sfbThreshold[sfb])) {
minEn = min(minEn, psyOutChan->sfbEnergy[sfb]); minEn = min(minEn, psyOutChan->sfbEnergy[sfb]);
@@ -656,7 +656,7 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
} }
} }
} }
if(ahCnt) { if(ahCnt) {
Word32 iahCnt; Word32 iahCnt;
shift = norm_l(ahCnt); shift = norm_l(ahCnt);
@@ -674,46 +674,46 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
/* start with lowest energy border at highest sfb */ /* start with lowest energy border at highest sfb */
maxSfb = psyOutChannel[0].sfbCnt - 1; maxSfb = psyOutChannel[0].sfbCnt - 1;
minSfb = startSfb[0]; minSfb = startSfb[0];
if (nChannels == 2) { if (nChannels == 2) {
maxSfb = max(maxSfb, (psyOutChannel[1].sfbCnt - 1)); maxSfb = max(maxSfb, (psyOutChannel[1].sfbCnt - 1));
minSfb = min(minSfb, startSfb[1]); minSfb = min(minSfb, startSfb[1]);
} }
sfb = maxSfb; sfb = maxSfb;
enIdx = 0; enIdx = 0;
done = 0; done = 0;
while (!done) { while (!done) {
for (ch=0; ch<nChannels; ch++) { for (ch=0; ch<nChannels; ch++) {
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
if (sfb>=startSfb[ch] && sfb<psyOutChan->sfbCnt) { if (sfb>=startSfb[ch] && sfb<psyOutChan->sfbCnt) {
/* sfb energy below border ? */ /* sfb energy below border ? */
if (ahFlag[ch][sfb] != NO_AH && psyOutChan->sfbEnergy[sfb] < en[enIdx]){ if (ahFlag[ch][sfb] != NO_AH && psyOutChan->sfbEnergy[sfb] < en[enIdx]){
/* allow hole */ /* allow hole */
ahFlag[ch][sfb] = NO_AH; ahFlag[ch][sfb] = NO_AH;
psyOutChan->sfbThreshold[sfb] = L_add(psyOutChan->sfbEnergy[sfb], psyOutChan->sfbEnergy[sfb]); psyOutChan->sfbThreshold[sfb] = L_add(psyOutChan->sfbEnergy[sfb], psyOutChan->sfbEnergy[sfb]);
actPe = actPe - peData->peChannelData[ch].sfbPe[sfb]; actPe = actPe - peData->peChannelData[ch].sfbPe[sfb];
} }
if (actPe < desiredPe) { if (actPe < desiredPe) {
done = 1; done = 1;
break; break;
} }
} }
} }
sfb = sfb - 1; sfb = sfb - 1;
if (sfb < minSfb) { if (sfb < minSfb) {
/* restart with next energy border */ /* restart with next energy border */
sfb = maxSfb; sfb = maxSfb;
enIdx = enIdx + 1; enIdx = enIdx + 1;
if (enIdx - 4 >= 0) if (enIdx - 4 >= 0)
done = 1; done = 1;
} }
} }
} }
@@ -748,13 +748,13 @@ static void adaptThresholdsToPe(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
initAvoidHoleFlag(peData->ahFlag, psyOutChannel, psyOutElement, nChannels, ahParam); initAvoidHoleFlag(peData->ahFlag, psyOutChannel, psyOutElement, nChannels, ahParam);
noRedPe = peData->pe; noRedPe = peData->pe;
constPart = peData->constPart; constPart = peData->constPart;
nActiveLines = peData->nActiveLines; nActiveLines = peData->nActiveLines;
/* first guess of reduction value t^0.25 = 2^((a-pen)/4*b) */ /* first guess of reduction value t^0.25 = 2^((a-pen)/4*b) */
avgThrExp = pow2_xy((constPart - noRedPe), (nActiveLines << 2)); avgThrExp = pow2_xy((constPart - noRedPe), (nActiveLines << 2));
/* r1 = 2^((a-per)/4*b) - t^0.25 */ /* r1 = 2^((a-per)/4*b) - t^0.25 */
redVal = pow2_xy((constPart - desiredPe), (nActiveLines << 2)) - avgThrExp; redVal = pow2_xy((constPart - desiredPe), (nActiveLines << 2)) - avgThrExp;
@@ -763,40 +763,40 @@ static void adaptThresholdsToPe(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
/* pe after first guess */ /* pe after first guess */
calcSfbPe(peData, psyOutChannel, nChannels); calcSfbPe(peData, psyOutChannel, nChannels);
redPe = peData->pe; redPe = peData->pe;
iter = 0; iter = 0;
do { do {
/* pe for bands where avoid hole is inactive */ /* pe for bands where avoid hole is inactive */
calcPeNoAH(&redPeNoAH, &constPartNoAH, &nActiveLinesNoAH, calcPeNoAH(&redPeNoAH, &constPartNoAH, &nActiveLinesNoAH,
peData, peData->ahFlag, psyOutChannel, nChannels); peData, peData->ahFlag, psyOutChannel, nChannels);
desiredPeNoAH = desiredPe -(redPe - redPeNoAH); desiredPeNoAH = desiredPe -(redPe - redPeNoAH);
if (desiredPeNoAH < 0) { if (desiredPeNoAH < 0) {
desiredPeNoAH = 0; desiredPeNoAH = 0;
} }
/* second guess */ /* second guess */
if (nActiveLinesNoAH > 0) { if (nActiveLinesNoAH > 0) {
avgThrExp = pow2_xy((constPartNoAH - redPeNoAH), (nActiveLinesNoAH << 2)); avgThrExp = pow2_xy((constPartNoAH - redPeNoAH), (nActiveLinesNoAH << 2));
redVal = (redVal + pow2_xy((constPartNoAH - desiredPeNoAH), (nActiveLinesNoAH << 2))) - avgThrExp; redVal = (redVal + pow2_xy((constPartNoAH - desiredPeNoAH), (nActiveLinesNoAH << 2))) - avgThrExp;
/* reduce thresholds */ /* reduce thresholds */
reduceThresholds(psyOutChannel, peData->ahFlag, peData->thrExp, nChannels, redVal); reduceThresholds(psyOutChannel, peData->ahFlag, peData->thrExp, nChannels, redVal);
} }
calcSfbPe(peData, psyOutChannel, nChannels); calcSfbPe(peData, psyOutChannel, nChannels);
redPe = peData->pe; redPe = peData->pe;
iter = iter+1; iter = iter+1;
} while ((20 * abs_s(redPe - desiredPe) > desiredPe) && (iter < 2)); } while ((20 * abs_s(redPe - desiredPe) > desiredPe) && (iter < 2));
if ((100 * redPe < 115 * desiredPe)) { if ((100 * redPe < 115 * desiredPe)) {
correctThresh(psyOutChannel, peData->ahFlag, peData, peData->thrExp, redVal, correctThresh(psyOutChannel, peData->ahFlag, peData, peData->thrExp, redVal,
nChannels, desiredPe - redPe); nChannels, desiredPe - redPe);
@@ -863,7 +863,7 @@ static Word16 calcBitSpend(Word16 fillLevel,
if(clipHigh-clipLow) if(clipHigh-clipLow)
bitspend = (minBitSpend + ((maxBitSpend - minBitSpend)*(fillLevel - clipLow) / bitspend = (minBitSpend + ((maxBitSpend - minBitSpend)*(fillLevel - clipLow) /
(clipHigh-clipLow))); (clipHigh-clipLow)));
return (bitspend); return (bitspend);
} }
@@ -884,19 +884,19 @@ static void adjustPeMinMax(const Word16 currPe,
Word16 minFacHi, maxFacHi, minFacLo, maxFacLo; Word16 minFacHi, maxFacHi, minFacLo, maxFacLo;
Word16 diff; Word16 diff;
Word16 minDiff = extract_l(currPe / 6); Word16 minDiff = extract_l(currPe / 6);
minFacHi = 30; minFacHi = 30;
maxFacHi = 100; maxFacHi = 100;
minFacLo = 14; minFacLo = 14;
maxFacLo = 7; maxFacLo = 7;
diff = currPe - *peMax ; diff = currPe - *peMax ;
if (diff > 0) { if (diff > 0) {
*peMin = *peMin + ((diff * minFacHi) / 100); *peMin = *peMin + ((diff * minFacHi) / 100);
*peMax = *peMax + ((diff * maxFacHi) / 100); *peMax = *peMax + ((diff * maxFacHi) / 100);
} else { } else {
diff = *peMin - currPe; diff = *peMin - currPe;
if (diff > 0) { if (diff > 0) {
*peMin = *peMin - ((diff * minFacLo) / 100); *peMin = *peMin - ((diff * minFacLo) / 100);
*peMax = *peMax - ((diff * maxFacLo) / 100); *peMax = *peMax - ((diff * maxFacLo) / 100);
@@ -906,7 +906,7 @@ static void adjustPeMinMax(const Word16 currPe,
} }
} }
if ((*peMax - *peMin) < minDiff) { if ((*peMax - *peMin) < minDiff) {
Word16 partLo, partHi; Word16 partLo, partHi;
@@ -969,7 +969,7 @@ static Word16 bitresCalcBitFac( const Word16 bitresBits,
(adjThrChan->peMax - adjThrChan->peMin)); (adjThrChan->peMax - adjThrChan->peMin));
else else
bitresFac = 0x7fff; bitresFac = 0x7fff;
bitresFac = min(bitresFac, bitresFac = min(bitresFac,
(100-30 + extract_l((100 * bitresBits) / avgBits))); (100-30 + extract_l((100 * bitresBits) / avgBits)));
@@ -995,23 +995,23 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr,
/* common for all elements: */ /* common for all elements: */
/* parameters for bitres control */ /* parameters for bitres control */
hAdjThr->bresParamLong.clipSaveLow = 20; hAdjThr->bresParamLong.clipSaveLow = 20;
hAdjThr->bresParamLong.clipSaveHigh = 95; hAdjThr->bresParamLong.clipSaveHigh = 95;
hAdjThr->bresParamLong.minBitSave = -5; hAdjThr->bresParamLong.minBitSave = -5;
hAdjThr->bresParamLong.maxBitSave = 30; hAdjThr->bresParamLong.maxBitSave = 30;
hAdjThr->bresParamLong.clipSpendLow = 20; hAdjThr->bresParamLong.clipSpendLow = 20;
hAdjThr->bresParamLong.clipSpendHigh = 95; hAdjThr->bresParamLong.clipSpendHigh = 95;
hAdjThr->bresParamLong.minBitSpend = -10; hAdjThr->bresParamLong.minBitSpend = -10;
hAdjThr->bresParamLong.maxBitSpend = 40; hAdjThr->bresParamLong.maxBitSpend = 40;
hAdjThr->bresParamShort.clipSaveLow = 20; hAdjThr->bresParamShort.clipSaveLow = 20;
hAdjThr->bresParamShort.clipSaveHigh = 75; hAdjThr->bresParamShort.clipSaveHigh = 75;
hAdjThr->bresParamShort.minBitSave = 0; hAdjThr->bresParamShort.minBitSave = 0;
hAdjThr->bresParamShort.maxBitSave = 20; hAdjThr->bresParamShort.maxBitSave = 20;
hAdjThr->bresParamShort.clipSpendLow = 20; hAdjThr->bresParamShort.clipSpendLow = 20;
hAdjThr->bresParamShort.clipSpendHigh = 75; hAdjThr->bresParamShort.clipSpendHigh = 75;
hAdjThr->bresParamShort.minBitSpend = -5; hAdjThr->bresParamShort.minBitSpend = -5;
hAdjThr->bresParamShort.maxBitSpend = 50; hAdjThr->bresParamShort.maxBitSpend = 50;
/* specific for each element: */ /* specific for each element: */
@@ -1020,7 +1020,7 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr,
atsElem->peMax = extract_l(((120*meanPe) / 100)); atsElem->peMax = extract_l(((120*meanPe) / 100));
/* additional pe offset to correct pe2bits for low bitrates */ /* additional pe offset to correct pe2bits for low bitrates */
atsElem->peOffset = 0; atsElem->peOffset = 0;
if (chBitrate < 32000) { if (chBitrate < 32000) {
atsElem->peOffset = max(50, (100 - extract_l((100 * chBitrate) / 32000))); atsElem->peOffset = max(50, (100 - extract_l((100 * chBitrate) / 32000)));
} }
@@ -1039,24 +1039,24 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr,
/* minSnr adaptation */ /* minSnr adaptation */
/* maximum reduction of minSnr goes down to minSnr^maxRed */ /* maximum reduction of minSnr goes down to minSnr^maxRed */
msaParam->maxRed = 0x20000000; /* *0.25f / msaParam->maxRed = 0x20000000; /* *0.25f /
/* start adaptation of minSnr for avgEn/sfbEn > startRatio */ /* start adaptation of minSnr for avgEn/sfbEn > startRatio */
msaParam->startRatio = 0x0ccccccd; /* 10 */ msaParam->startRatio = 0x0ccccccd; /* 10 */
/* maximum minSnr reduction to minSnr^maxRed is reached for /* maximum minSnr reduction to minSnr^maxRed is reached for
avgEn/sfbEn >= maxRatio */ avgEn/sfbEn >= maxRatio */
msaParam->maxRatio = 0x0020c49c; /* 1000 */ msaParam->maxRatio = 0x0020c49c; /* 1000 */
/* helper variables to interpolate minSnr reduction for /* helper variables to interpolate minSnr reduction for
avgEn/sfbEn between startRatio and maxRatio */ avgEn/sfbEn between startRatio and maxRatio */
msaParam->redRatioFac = 0xfb333333; /* -0.75/20 */ msaParam->redRatioFac = 0xfb333333; /* -0.75/20 */
msaParam->redOffs = 0x30000000; /* msaParam->redRatioFac * 10*log10(msaParam->startRatio) */
msaParam->redOffs = 0x30000000; /* msaParam->redRatioFac * 10*log10(msaParam->startRatio) */
/* pe correction */ /* pe correction */
atsElem->peLast = 0; atsElem->peLast = 0;
atsElem->dynBitsLast = 0; atsElem->dynBitsLast = 0;
atsElem->peCorrectionFactor = 100; /* 1.0 */ atsElem->peCorrectionFactor = 100; /* 1.0 */
} }
@@ -1069,20 +1069,20 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr,
*****************************************************************************/ *****************************************************************************/
static void calcPeCorrection(Word16 *correctionFac, static void calcPeCorrection(Word16 *correctionFac,
const Word16 peAct, const Word16 peAct,
const Word16 peLast, const Word16 peLast,
const Word16 bitsLast) const Word16 bitsLast)
{ {
Word32 peAct100 = 100 * peAct; Word32 peAct100 = 100 * peAct;
Word32 peLast100 = 100 * peLast; Word32 peLast100 = 100 * peLast;
Word16 peBitsLast = bits2pe(bitsLast); Word16 peBitsLast = bits2pe(bitsLast);
if ((bitsLast > 0) && if ((bitsLast > 0) &&
(peAct100 < (150 * peLast)) && (peAct100 > (70 * peLast)) && (peAct100 < (150 * peLast)) && (peAct100 > (70 * peLast)) &&
((120 * peBitsLast) > peLast100 ) && (( 65 * peBitsLast) < peLast100)) ((120 * peBitsLast) > peLast100 ) && (( 65 * peBitsLast) < peLast100))
{ {
Word16 newFac = (100 * peLast) / peBitsLast; Word16 newFac = (100 * peLast) / peBitsLast;
/* dead zone */ /* dead zone */
if (newFac < 100) { if (newFac < 100) {
newFac = min(((110 * newFac) / 100), 100); newFac = min(((110 * newFac) / 100), 100);
newFac = max(newFac, 85); newFac = max(newFac, 85);
@@ -1091,13 +1091,13 @@ static void calcPeCorrection(Word16 *correctionFac,
newFac = max(((90 * newFac) / 100), 100); newFac = max(((90 * newFac) / 100), 100);
newFac = min(newFac, 115); newFac = min(newFac, 115);
} }
if ((newFac > 100 && *correctionFac < 100) || if ((newFac > 100 && *correctionFac < 100) ||
(newFac < 100 && *correctionFac > 100)) { (newFac < 100 && *correctionFac > 100)) {
*correctionFac = 100; *correctionFac = 100;
} }
/* faster adaptation towards 1.0, slower in the other direction */ /* faster adaptation towards 1.0, slower in the other direction */
if ((*correctionFac < 100 && newFac < *correctionFac) || if ((*correctionFac < 100 && newFac < *correctionFac) ||
(*correctionFac > 100 && newFac > *correctionFac)) (*correctionFac > 100 && newFac > *correctionFac))
*correctionFac = (85 * *correctionFac + 15 * newFac) / 100; *correctionFac = (85 * *correctionFac + 15 * newFac) / 100;
@@ -1107,7 +1107,7 @@ static void calcPeCorrection(Word16 *correctionFac,
*correctionFac = max(*correctionFac, 85); *correctionFac = max(*correctionFac, 85);
} }
else { else {
*correctionFac = 100; *correctionFac = 100;
} }
} }
@@ -1123,40 +1123,40 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
PSY_OUT_ELEMENT *psyOutElement, PSY_OUT_ELEMENT *psyOutElement,
Word16 *chBitDistribution, Word16 *chBitDistribution,
Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB], Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB], Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
QC_OUT_ELEMENT *qcOE, QC_OUT_ELEMENT *qcOE,
ELEMENT_BITS *elBits, ELEMENT_BITS *elBits,
const Word16 nChannels, const Word16 nChannels,
const Word16 maxBitFac) const Word16 maxBitFac)
{ {
PE_DATA peData; PE_DATA peData;
Word16 noRedPe, grantedPe, grantedPeCorr; Word16 noRedPe, grantedPe, grantedPeCorr;
Word16 curWindowSequence; Word16 curWindowSequence;
Word16 bitFactor; Word16 bitFactor;
Word16 avgBits = (elBits->averageBits - (qcOE->staticBitsUsed + qcOE->ancBitsUsed)); Word16 avgBits = (elBits->averageBits - (qcOE->staticBitsUsed + qcOE->ancBitsUsed));
Word16 bitresBits = elBits->bitResLevel; Word16 bitresBits = elBits->bitResLevel;
Word16 maxBitresBits = elBits->maxBits; Word16 maxBitresBits = elBits->maxBits;
Word16 sideInfoBits = (qcOE->staticBitsUsed + qcOE->ancBitsUsed); Word16 sideInfoBits = (qcOE->staticBitsUsed + qcOE->ancBitsUsed);
Word16 ch; Word16 ch;
prepareSfbPe(&peData, psyOutChannel, logSfbEnergy, sfbNRelevantLines, nChannels, AdjThrStateElement->peOffset); prepareSfbPe(&peData, psyOutChannel, logSfbEnergy, sfbNRelevantLines, nChannels, AdjThrStateElement->peOffset);
/* pe without reduction */ /* pe without reduction */
calcSfbPe(&peData, psyOutChannel, nChannels); calcSfbPe(&peData, psyOutChannel, nChannels);
noRedPe = peData.pe; noRedPe = peData.pe;
curWindowSequence = LONG_WINDOW; curWindowSequence = LONG_WINDOW;
if (nChannels == 2) { if (nChannels == 2) {
if ((psyOutChannel[0].windowSequence == SHORT_WINDOW) || if ((psyOutChannel[0].windowSequence == SHORT_WINDOW) ||
(psyOutChannel[1].windowSequence == SHORT_WINDOW)) { (psyOutChannel[1].windowSequence == SHORT_WINDOW)) {
curWindowSequence = SHORT_WINDOW; curWindowSequence = SHORT_WINDOW;
} }
} }
else { else {
curWindowSequence = psyOutChannel[0].windowSequence; curWindowSequence = psyOutChannel[0].windowSequence;
} }
@@ -1170,13 +1170,13 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
grantedPe = ((bitFactor * bits2pe(avgBits)) / 100); grantedPe = ((bitFactor * bits2pe(avgBits)) / 100);
/* correction of pe value */ /* correction of pe value */
calcPeCorrection(&(AdjThrStateElement->peCorrectionFactor), calcPeCorrection(&(AdjThrStateElement->peCorrectionFactor),
min(grantedPe, noRedPe), min(grantedPe, noRedPe),
AdjThrStateElement->peLast, AdjThrStateElement->peLast,
AdjThrStateElement->dynBitsLast); AdjThrStateElement->dynBitsLast);
grantedPeCorr = (grantedPe * AdjThrStateElement->peCorrectionFactor) / 100; grantedPeCorr = (grantedPe * AdjThrStateElement->peCorrectionFactor) / 100;
if (grantedPeCorr < noRedPe && noRedPe > peData.offset) { if (grantedPeCorr < noRedPe && noRedPe > peData.offset) {
/* calc threshold necessary for desired pe */ /* calc threshold necessary for desired pe */
adaptThresholdsToPe(psyOutChannel, adaptThresholdsToPe(psyOutChannel,
@@ -1192,8 +1192,8 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
/* calculate relative distribution */ /* calculate relative distribution */
for (ch=0; ch<nChannels; ch++) { for (ch=0; ch<nChannels; ch++) {
Word16 peOffsDiff = peData.pe - peData.offset; Word16 peOffsDiff = peData.pe - peData.offset;
chBitDistribution[ch] = 200; chBitDistribution[ch] = 200;
if (peOffsDiff > 0) { if (peOffsDiff > 0) {
Word32 temp = 1000 - (nChannels * 200); Word32 temp = 1000 - (nChannels * 200);
chBitDistribution[ch] = chBitDistribution[ch] + chBitDistribution[ch] = chBitDistribution[ch] +
@@ -1202,10 +1202,10 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
} }
/* store pe */ /* store pe */
qcOE->pe = noRedPe; qcOE->pe = noRedPe;
/* update last pe */ /* update last pe */
AdjThrStateElement->peLast = grantedPe; AdjThrStateElement->peLast = grantedPe;
} }
/******************************************************************************** /********************************************************************************
@@ -1217,7 +1217,7 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
void AdjThrUpdate(ATS_ELEMENT *AdjThrStateElement, void AdjThrUpdate(ATS_ELEMENT *AdjThrStateElement,
const Word16 dynBitsUsed) const Word16 dynBitsUsed)
{ {
AdjThrStateElement->dynBitsLast = dynBitsUsed; AdjThrStateElement->dynBitsLast = dynBitsUsed;
} }

View File

@@ -22,34 +22,34 @@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.section .text .section .text
.global AutoCorrelation .global AutoCorrelation
AutoCorrelation: AutoCorrelation:
stmdb sp!, {r4 - r11, lr} stmdb sp!, {r4 - r11, lr}
sub r13, r13, #20 sub r13, r13, #20
mov r5, r0 mov r5, r0
mov r7, r1 mov r7, r1
mov r9, r3 mov r9, r3
mov r2, r2, lsl #16 mov r2, r2, lsl #16
mov r0, #0 mov r0, #0
mov r4, r2, asr #16 mov r4, r2, asr #16
mov r8, #0 mov r8, #0
cmp r4, #0 cmp r4, #0
ble L136 ble L136
cmp r4, #8
mov r2, #0
blt L133
sub r12, r4, #8 cmp r4, #8
L132: mov r2, #0
ldr r6, [r5, r2] blt L133
sub r12, r4, #8
L132:
ldr r6, [r5, r2]
add r2, r2, #4 add r2, r2, #4
smulbb r3, r6, r6 smulbb r3, r6, r6
ldr r1, [r5, r2] ldr r1, [r5, r2]
smultt r10, r6, r6 smultt r10, r6, r6
mov r3, r3, asr #9 mov r3, r3, asr #9
smulbb r6, r1, r1 smulbb r6, r1, r1
@@ -72,95 +72,95 @@ L132:
add r8, r8, #6 add r8, r8, #6
qadd r0, r0, r6 qadd r0, r0, r6
cmp r8, r12 cmp r8, r12
blt L132 blt L132
L133: L133:
ldrsh r6, [r5, r2] ldrsh r6, [r5, r2]
mul r10, r6, r6 mul r10, r6, r6
add r2, r2, #2 add r2, r2, #2
mov r1, r10, asr #9 mov r1, r10, asr #9
qadd r0, r0, r1 qadd r0, r0, r1
L134: L134:
add r8, r8, #1 add r8, r8, #1
cmp r8, r4 cmp r8, r4
blt L133 blt L133
L135: L135:
L136: L136:
str r0, [r7, #0] str r0, [r7, #0]
cmp r0, #0 cmp r0, #0
beq L1320 beq L1320
L137: L137:
mov r2, r9, lsl #16 mov r2, r9, lsl #16
mov r8, #1 mov r8, #1
mov r2, r2, asr #16 mov r2, r2, asr #16
cmp r2, #1 cmp r2, #1
ble L1319 ble L1319
L138: L138:
L139: L139:
sub r4, r4, #1 sub r4, r4, #1
mov r14, #0 mov r14, #0
mov r3, #0 mov r3, #0
cmp r4, #0 cmp r4, #0
ble L1317 ble L1317
L1310: L1310:
cmp r4, #6 cmp r4, #6
addlt r6, r5, r8, lsl #1 addlt r6, r5, r8, lsl #1
blt L1314 blt L1314
L1311: L1311:
add r6, r5, r8, lsl #1 add r6, r5, r8, lsl #1
sub r12, r4, #6 sub r12, r4, #6
str r8, [r13, #8] str r8, [r13, #8]
str r7, [r13, #4] str r7, [r13, #4]
L1312: L1312:
mov r1, r3, lsl #1 mov r1, r3, lsl #1
ldrsh r7, [r6, r1] ldrsh r7, [r6, r1]
ldrsh r10, [r5, r1] ldrsh r10, [r5, r1]
add r8, r1, r6 add r8, r1, r6
add r9, r5, r1 add r9, r5, r1
mul r7, r10, r7 mul r7, r10, r7
ldrsh r1, [r8, #2] ldrsh r1, [r8, #2]
ldrsh r10, [r8, #4] ldrsh r10, [r8, #4]
add r7, r14, r7, asr #9 add r7, r14, r7, asr #9
ldrsh r0, [r9, #2] ldrsh r0, [r9, #2]
ldrsh r11, [r9, #4] ldrsh r11, [r9, #4]
mul r1, r0, r1 mul r1, r0, r1
ldrsh r14, [r8, #6] ldrsh r14, [r8, #6]
mul r10, r11, r10 mul r10, r11, r10
add r7, r7, r1, asr #9 add r7, r7, r1, asr #9
ldrsh r8, [r8, #8] ldrsh r8, [r8, #8]
add r3, r3, #5 add r3, r3, #5
ldrsh r11, [r9, #6] ldrsh r11, [r9, #6]
ldrsh r1, [r9, #8] ldrsh r1, [r9, #8]
mul r14, r11, r14 mul r14, r11, r14
add r7, r7, r10, asr #9 add r7, r7, r10, asr #9
mul r1, r1, r8 mul r1, r1, r8
add r14, r7, r14, asr #9 add r14, r7, r14, asr #9
cmp r3, r12 cmp r3, r12
add r14, r14, r1, asr #9 add r14, r14, r1, asr #9
ble L1312 ble L1312
L1313: L1313:
ldr r8, [r13, #8] ldr r8, [r13, #8]
ldr r7, [r13, #4] ldr r7, [r13, #4]
L1314: L1314:
L1315: L1315:
mov r12, r3, lsl #1 mov r12, r3, lsl #1
ldrsh r9, [r6, r12] ldrsh r9, [r6, r12]
ldrsh r12, [r5, r12] ldrsh r12, [r5, r12]
add r3, r3, #1 add r3, r3, #1
cmp r3, r4 cmp r3, r4
mul r12, r12, r9 mul r12, r12, r9
add r14, r14, r12, asr #9 add r14, r14, r12, asr #9
blt L1315 blt L1315
L1316: L1316:
L1317: L1317:
str r14, [r7, +r8, lsl #2] str r14, [r7, +r8, lsl #2]
add r8, r8, #1 add r8, r8, #1
cmp r8, r2 cmp r8, r2
blt L139 blt L139
L1319: L1319:
L1320: L1320:
add r13, r13, #20 add r13, r13, #20
ldmia sp!, {r4 - r11, pc} ldmia sp!, {r4 - r11, pc}
@ENDP @ |AutoCorrelation| @ENDP @ |AutoCorrelation|

View File

@@ -22,91 +22,91 @@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.section .text .section .text
.global CalcWindowEnergy .global CalcWindowEnergy
CalcWindowEnergy: CalcWindowEnergy:
stmdb sp!, {r4 - r11, lr} stmdb sp!, {r4 - r11, lr}
sub r13, r13, #20 sub r13, r13, #20
mov r3, r3, lsl #16 mov r3, r3, lsl #16
ldr r10, [r0, #168] @ states0 = blockSwitchingControl->iirStates[0]; ldr r10, [r0, #168] @ states0 = blockSwitchingControl->iirStates[0];
mov r3, r3, asr #16 mov r3, r3, asr #16
ldr r11, [r0, #172] @ states1 = blockSwitchingControl->iirStates[1]; ldr r11, [r0, #172] @ states1 = blockSwitchingControl->iirStates[1];
mov r2, r2, lsl #16 mov r2, r2, lsl #16
ldr r12, hiPassCoeff @ Coeff0 = hiPassCoeff[0]; ldr r12, hiPassCoeff @ Coeff0 = hiPassCoeff[0];
mov r2, r2, asr #16 mov r2, r2, asr #16
ldr r14, hiPassCoeff + 4 @ Coeff1 = hiPassCoeff[1]; ldr r14, hiPassCoeff + 4 @ Coeff1 = hiPassCoeff[1];
mov r8, #0 @ w=0 mov r8, #0 @ w=0
mov r5, #0 @ wOffset = 0; mov r5, #0 @ wOffset = 0;
BLOCK_BEGIN: BLOCK_BEGIN:
mov r6, #0 @ accuUE = 0; mov r6, #0 @ accuUE = 0;
mov r7, #0 @ accuFE = 0; mov r7, #0 @ accuFE = 0;
mov r4, #0 @ i=0 mov r4, #0 @ i=0
str r8, [r13, #4] str r8, [r13, #4]
str r0, [r13, #8] str r0, [r13, #8]
str r3, [r13, #12] str r3, [r13, #12]
ENERGY_BEG: ENERGY_BEG:
mov r9, r5, lsl #1 mov r9, r5, lsl #1
ldrsh r9, [r1, r9] @ tempUnfiltered = timeSignal[tidx]; ldrsh r9, [r1, r9] @ tempUnfiltered = timeSignal[tidx];
add r5, r5, r2 @ tidx = tidx + chIncrement; add r5, r5, r2 @ tidx = tidx + chIncrement;
smulwb r3, r14, r9 @ accu1 = L_mpy_ls(Coeff1, tempUnfiltered); smulwb r3, r14, r9 @ accu1 = L_mpy_ls(Coeff1, tempUnfiltered);
smull r0, r8, r12, r11 @ accu2 = fixmul( Coeff0, states1 ); smull r0, r8, r12, r11 @ accu2 = fixmul( Coeff0, states1 );
mov r3, r3, lsl #1 mov r3, r3, lsl #1
mov r8, r8, lsl #1 mov r8, r8, lsl #1
sub r0, r3, r10 @ accu3 = accu1 - states0; sub r0, r3, r10 @ accu3 = accu1 - states0;
sub r8, r0, r8 @ out = accu3 - accu2; sub r8, r0, r8 @ out = accu3 - accu2;
mov r10, r3 @ states0 = accu1; mov r10, r3 @ states0 = accu1;
mov r11, r8 @ states1 = out; mov r11, r8 @ states1 = out;
mul r3, r9, r9 mul r3, r9, r9
mov r8, r8, asr #16 mov r8, r8, asr #16
add r4, r4, #1 add r4, r4, #1
add r6, r6, r3, asr #7 add r6, r6, r3, asr #7
mul r9, r8, r8 mul r9, r8, r8
ldr r3, [r13, #12] ldr r3, [r13, #12]
add r7, r7, r9, asr #7 add r7, r7, r9, asr #7
cmp r4, r3 cmp r4, r3
blt ENERGY_BEG blt ENERGY_BEG
ldr r0, [r13, #8] ldr r0, [r13, #8]
ldr r8, [r13, #4] ldr r8, [r13, #4]
ENERGY_END: ENERGY_END:
add r4, r0, r8, lsl #2 add r4, r0, r8, lsl #2
str r6, [r4, #72] str r6, [r4, #72]
add r8, r8, #1 add r8, r8, #1
str r7, [r4, #136] str r7, [r4, #136]
cmp r8, #8 cmp r8, #8
blt BLOCK_BEGIN blt BLOCK_BEGIN
BLOCK_END: BLOCK_END:
str r10, [r0, #168] str r10, [r0, #168]
str r11, [r0, #172] str r11, [r0, #172]
mov r0, #1 mov r0, #1
add r13, r13, #20 add r13, r13, #20
ldmia sp!, {r4 - r11, pc} ldmia sp!, {r4 - r11, pc}
hiPassCoeff: hiPassCoeff:
.word 0xbec8b439 .word 0xbec8b439
.word 0x609d4952 .word 0x609d4952
@ENDP @ENDP
.end .end

View File

@@ -26,46 +26,46 @@
PreMDCT: PreMDCT:
stmdb sp!, {r4 - r11, lr} stmdb sp!, {r4 - r11, lr}
add r9, r0, r1, lsl #2 add r9, r0, r1, lsl #2
sub r3, r9, #8 sub r3, r9, #8
movs r1, r1, asr #2 movs r1, r1, asr #2
beq PreMDCT_END beq PreMDCT_END
PreMDCT_LOOP: PreMDCT_LOOP:
ldr r8, [r2], #4 ldr r8, [r2], #4
ldr r9, [r2], #4 ldr r9, [r2], #4
ldrd r4, [r0] ldrd r4, [r0]
ldrd r6, [r3] ldrd r6, [r3]
smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa) smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa)
smull r10, r12, r7, r8 @ MULHIGH(ti1, cosa) smull r10, r12, r7, r8 @ MULHIGH(ti1, cosa)
smull r14, r8, r7, r9 @ MULHIGH(ti1, sina) smull r14, r8, r7, r9 @ MULHIGH(ti1, sina)
smull r7, r10, r4, r9 @ MULHIGH(tr1, sina) smull r7, r10, r4, r9 @ MULHIGH(tr1, sina)
add r11, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@ add r11, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
sub r7, r12, r10 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina) sub r7, r12, r10 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)
ldr r8, [r2], #4 ldr r8, [r2], #4
ldr r9, [r2], #4 ldr r9, [r2], #4
smull r14, r4, r6, r8 @ MULHIGH(tr2, cosa) smull r14, r4, r6, r8 @ MULHIGH(tr2, cosa)
smull r10, r12, r5, r8 @ MULHIGH(ti2, cosa) smull r10, r12, r5, r8 @ MULHIGH(ti2, cosa)
smull r14, r8, r5, r9 @ MULHIGH(ti2, sina) smull r14, r8, r5, r9 @ MULHIGH(ti2, sina)
smull r5, r10, r6, r9 @ MULHIGH(tr2, sina) smull r5, r10, r6, r9 @ MULHIGH(tr2, sina)
add r8, r8, r4 add r8, r8, r4
sub r9, r12, r10 sub r9, r12, r10
mov r6, r11
strd r6, [r0] mov r6, r11
strd r6, [r0]
strd r8, [r3] strd r8, [r3]
subs r1, r1, #1 subs r1, r1, #1
sub r3, r3, #8 sub r3, r3, #8
add r0, r0, #8 add r0, r0, #8
@@ -74,52 +74,52 @@ PreMDCT_LOOP:
PreMDCT_END: PreMDCT_END:
ldmia sp!, {r4 - r11, pc} ldmia sp!, {r4 - r11, pc}
@ENDP @ |PreMDCT| @ENDP @ |PreMDCT|
.section .text .section .text
.global PostMDCT .global PostMDCT
PostMDCT: PostMDCT:
stmdb sp!, {r4 - r11, lr} stmdb sp!, {r4 - r11, lr}
add r9, r0, r1, lsl #2 add r9, r0, r1, lsl #2
sub r3, r9, #8 sub r3, r9, #8
movs r1, r1, asr #2 movs r1, r1, asr #2
beq PostMDCT_END beq PostMDCT_END
PostMDCT_LOOP: PostMDCT_LOOP:
ldr r8, [r2], #4 ldr r8, [r2], #4
ldr r9, [r2], #4 ldr r9, [r2], #4
ldrd r4, [r0] ldrd r4, [r0]
ldrd r6, [r3] ldrd r6, [r3]
smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa) smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa)
smull r10, r12, r5, r8 @ MULHIGH(ti1, cosa) smull r10, r12, r5, r8 @ MULHIGH(ti1, cosa)
smull r14, r8, r5, r9 @ MULHIGH(ti1, sina) smull r14, r8, r5, r9 @ MULHIGH(ti1, sina)
smull r5, r10, r4, r9 @ MULHIGH(tr1, sina) smull r5, r10, r4, r9 @ MULHIGH(tr1, sina)
add r4, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@ add r4, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
sub r11, r10, r12 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)@ sub r11, r10, r12 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)@
ldr r8, [r2], #4 @ ldr r8, [r2], #4 @
ldr r9, [r2], #4 ldr r9, [r2], #4
smull r14, r5, r6, r8 @ MULHIGH(tr2, cosa) smull r14, r5, r6, r8 @ MULHIGH(tr2, cosa)
smull r10, r12, r7, r8 @ MULHIGH(ti2, cosa) smull r10, r12, r7, r8 @ MULHIGH(ti2, cosa)
smull r14, r8, r7, r9 @ MULHIGH(ti2, sina) smull r14, r8, r7, r9 @ MULHIGH(ti2, sina)
smull r7, r10, r6, r9 @ MULHIGH(tr2, sina) smull r7, r10, r6, r9 @ MULHIGH(tr2, sina)
add r6, r8, r5 @ MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2)@ add r6, r8, r5 @ MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2)@
sub r5, r10, r12 @ MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2)@ sub r5, r10, r12 @ MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2)@
mov r7, r11 mov r7, r11
strd r4, [r0] strd r4, [r0]
strd r6, [r3] strd r6, [r3]
subs r1, r1, #1 subs r1, r1, #1
sub r3, r3, #8 sub r3, r3, #8
add r0, r0, #8 add r0, r0, #8

View File

@@ -26,46 +26,46 @@
Radix4First: Radix4First:
stmdb sp!, {r4 - r11, lr} stmdb sp!, {r4 - r11, lr}
movs r10, r1 movs r10, r1
mov r11, r0 mov r11, r0
beq Radix4First_END beq Radix4First_END
Radix4First_LOOP: Radix4First_LOOP:
ldrd r0, [r11] ldrd r0, [r11]
ldrd r2, [r11, #8] ldrd r2, [r11, #8]
ldrd r4, [r11, #16] ldrd r4, [r11, #16]
ldrd r6, [r11, #24] ldrd r6, [r11, #24]
add r8, r0, r2 add r8, r0, r2
add r9, r1, r3 add r9, r1, r3
sub r0, r0, r2 sub r0, r0, r2
sub r1, r1, r3 sub r1, r1, r3
add r2, r4, r6 add r2, r4, r6
add r3, r5, r7 add r3, r5, r7
sub r4, r4, r6 sub r4, r4, r6
sub r5, r5, r7 sub r5, r5, r7
add r6, r8, r2 add r6, r8, r2
add r7, r9, r3 add r7, r9, r3
sub r8, r8, r2 sub r8, r8, r2
sub r9, r9, r3 sub r9, r9, r3
add r2, r0, r5 add r2, r0, r5
sub r3, r1, r4 sub r3, r1, r4
sub r0, r0, r5 sub r0, r0, r5
add r1, r1, r4 add r1, r1, r4
strd r6, [r11] strd r6, [r11]
strd r2, [r11, #8] strd r2, [r11, #8]
strd r8, [r11, #16] strd r8, [r11, #16]
strd r0, [r11, #24] strd r0, [r11, #24]
subs r10, r10, #1 subs r10, r10, #1
add r11, r11, #32 add r11, r11, #32
bne Radix4First_LOOP bne Radix4First_LOOP
@@ -73,180 +73,180 @@ Radix4First_LOOP:
Radix4First_END: Radix4First_END:
ldmia sp!, {r4 - r11, pc} ldmia sp!, {r4 - r11, pc}
@ENDP @ |Radix4First| @ENDP @ |Radix4First|
.section .text .section .text
.global Radix8First .global Radix8First
Radix8First: Radix8First:
stmdb sp!, {r4 - r11, lr} stmdb sp!, {r4 - r11, lr}
sub sp, sp, #0x24 sub sp, sp, #0x24
mov r12, r1 mov r12, r1
mov r14, r0 mov r14, r0
cmp r12, #0 cmp r12, #0
beq Radix8First_END beq Radix8First_END
Radix8First_LOOP: Radix8First_LOOP:
ldrd r0, [r14] ldrd r0, [r14]
ldrd r2, [r14, #8] ldrd r2, [r14, #8]
ldrd r4, [r14, #16] ldrd r4, [r14, #16]
ldrd r6, [r14, #24] ldrd r6, [r14, #24]
add r8, r0, r2 @ r0 = buf[0] + buf[2]@ add r8, r0, r2 @ r0 = buf[0] + buf[2]@
add r9, r1, r3 @ i0 = buf[1] + buf[3]@ add r9, r1, r3 @ i0 = buf[1] + buf[3]@
sub r0, r0, r2 @ r1 = buf[0] - buf[2]@ sub r0, r0, r2 @ r1 = buf[0] - buf[2]@
sub r1, r1, r3 @ i1 = buf[1] - buf[3]@ sub r1, r1, r3 @ i1 = buf[1] - buf[3]@
add r2, r4, r6 @ r2 = buf[4] + buf[6]@ add r2, r4, r6 @ r2 = buf[4] + buf[6]@
add r3, r5, r7 @ i2 = buf[5] + buf[7]@ add r3, r5, r7 @ i2 = buf[5] + buf[7]@
sub r4, r4, r6 @ r3 = buf[4] - buf[6]@ sub r4, r4, r6 @ r3 = buf[4] - buf[6]@
sub r5, r5, r7 @ i3 = buf[5] - buf[7]@ sub r5, r5, r7 @ i3 = buf[5] - buf[7]@
add r6, r8, r2 @ r4 = (r0 + r2) >> 1@ add r6, r8, r2 @ r4 = (r0 + r2) >> 1@
add r7, r9, r3 @ i4 = (i0 + i2) >> 1@ add r7, r9, r3 @ i4 = (i0 + i2) >> 1@
sub r8, r8, r2 @ r5 = (r0 - r2) >> 1@ sub r8, r8, r2 @ r5 = (r0 - r2) >> 1@
sub r9, r9, r3 @ i5 = (i0 - i2) >> 1@ sub r9, r9, r3 @ i5 = (i0 - i2) >> 1@
sub r2, r0, r5 @ r6 = (r1 - i3) >> 1@ sub r2, r0, r5 @ r6 = (r1 - i3) >> 1@
add r3, r1, r4 @ i6 = (i1 + r3) >> 1@ add r3, r1, r4 @ i6 = (i1 + r3) >> 1@
add r0, r0, r5 @ r7 = (r1 + i3) >> 1@ add r0, r0, r5 @ r7 = (r1 + i3) >> 1@
sub r1, r1, r4 @ i7 = (i1 - r3) >> 1@ sub r1, r1, r4 @ i7 = (i1 - r3) >> 1@
mov r6, r6, asr #1 @ mov r6, r6, asr #1 @
mov r7, r7, asr #1 @ mov r7, r7, asr #1 @
mov r8, r8, asr #1 mov r8, r8, asr #1
mov r9, r9, asr #1 mov r9, r9, asr #1
mov r2, r2, asr #1 mov r2, r2, asr #1
mov r3, r3, asr #1 mov r3, r3, asr #1
mov r0, r0, asr #1 mov r0, r0, asr #1
mov r1, r1, asr #1 mov r1, r1, asr #1
str r6, [sp] str r6, [sp]
str r7, [sp, #4] str r7, [sp, #4]
str r8, [sp, #8] str r8, [sp, #8]
str r9, [sp, #12] str r9, [sp, #12]
str r2, [sp, #16] str r2, [sp, #16]
str r3, [sp, #20] str r3, [sp, #20]
str r0, [sp, #24] str r0, [sp, #24]
str r1, [sp, #28] str r1, [sp, #28]
ldrd r2, [r14, #32] ldrd r2, [r14, #32]
ldrd r4, [r14, #40] ldrd r4, [r14, #40]
ldrd r6, [r14, #48] ldrd r6, [r14, #48]
ldrd r8, [r14, #56] ldrd r8, [r14, #56]
add r0, r2, r4 @ r0 = buf[ 8] + buf[10]@ add r0, r2, r4 @ r0 = buf[ 8] + buf[10]@
add r1, r3, r5 @ i0 = buf[ 9] + buf[11]@ add r1, r3, r5 @ i0 = buf[ 9] + buf[11]@
sub r2, r2, r4 @ r1 = buf[ 8] - buf[10]@ sub r2, r2, r4 @ r1 = buf[ 8] - buf[10]@
sub r3, r3, r5 @ i1 = buf[ 9] - buf[11]@ sub r3, r3, r5 @ i1 = buf[ 9] - buf[11]@
add r4, r6, r8 @ r2 = buf[12] + buf[14]@ add r4, r6, r8 @ r2 = buf[12] + buf[14]@
add r5, r7, r9 @ i2 = buf[13] + buf[15]@ add r5, r7, r9 @ i2 = buf[13] + buf[15]@
sub r6, r6, r8 @ r3 = buf[12] - buf[14]@ sub r6, r6, r8 @ r3 = buf[12] - buf[14]@
sub r7, r7, r9 @ i3 = buf[13] - buf[15]@ sub r7, r7, r9 @ i3 = buf[13] - buf[15]@
add r8, r0, r4 @ t0 = (r0 + r2) add r8, r0, r4 @ t0 = (r0 + r2)
add r9, r1, r5 @ t1 = (i0 + i2) add r9, r1, r5 @ t1 = (i0 + i2)
sub r0, r0, r4 @ t2 = (r0 - r2) sub r0, r0, r4 @ t2 = (r0 - r2)
sub r1, r1, r5 @ t3 = (i0 - i2) sub r1, r1, r5 @ t3 = (i0 - i2)
mov r8, r8, asr #1 mov r8, r8, asr #1
ldr r4, [sp] ldr r4, [sp]
mov r9, r9, asr #1 mov r9, r9, asr #1
ldr r5, [sp, #4] ldr r5, [sp, #4]
mov r0, r0, asr #1 mov r0, r0, asr #1
mov r1, r1, asr #1 mov r1, r1, asr #1
add r10, r4, r8 @ buf[ 0] = r4 + t0@ add r10, r4, r8 @ buf[ 0] = r4 + t0@
add r11, r5, r9 @ buf[ 1] = i4 + t1@ add r11, r5, r9 @ buf[ 1] = i4 + t1@
sub r4, r4, r8 @ buf[ 8] = r4 - t0@ sub r4, r4, r8 @ buf[ 8] = r4 - t0@
sub r5, r5, r9 @ buf[ 9] = i4 - t1@ sub r5, r5, r9 @ buf[ 9] = i4 - t1@
strd r10, [r14] strd r10, [r14]
strd r4, [r14, #32] strd r4, [r14, #32]
ldr r10, [sp, #8] ldr r10, [sp, #8]
ldr r11, [sp, #12] ldr r11, [sp, #12]
add r4, r10, r1 @ buf[ 4] = r5 + t3@ add r4, r10, r1 @ buf[ 4] = r5 + t3@
sub r5, r11, r0 @ buf[ 5] = i5 - t2@ sub r5, r11, r0 @ buf[ 5] = i5 - t2@
sub r10, r10, r1 @ buf[12] = r5 - t3@ sub r10, r10, r1 @ buf[12] = r5 - t3@
add r11, r11, r0 @ buf[13] = i5 + t2@ add r11, r11, r0 @ buf[13] = i5 + t2@
strd r4, [r14, #16] strd r4, [r14, #16]
strd r10, [r14, #48] strd r10, [r14, #48]
sub r0, r2, r7 @ r0 = r1 - i3@ sub r0, r2, r7 @ r0 = r1 - i3@
add r1, r3, r6 @ i0 = i1 + r3@ add r1, r3, r6 @ i0 = i1 + r3@
ldr r11, DATATab ldr r11, DATATab
add r2, r2, r7 @ r2 = r1 + i3@ add r2, r2, r7 @ r2 = r1 + i3@
sub r3, r3, r6 @ i2 = i1 - r3@ sub r3, r3, r6 @ i2 = i1 - r3@
sub r4, r0, r1 @ r0 - i0 sub r4, r0, r1 @ r0 - i0
add r5, r0, r1 @ r0 + i0 add r5, r0, r1 @ r0 + i0
sub r0, r2, r3 @ r2 - i2 sub r0, r2, r3 @ r2 - i2
add r1, r2, r3 @ r2 + i2 add r1, r2, r3 @ r2 + i2
smull r8, r6, r4, r11 smull r8, r6, r4, r11
smull r9, r7, r5, r11 smull r9, r7, r5, r11
ldr r2, [sp, #16] ldr r2, [sp, #16]
ldr r3, [sp, #20] ldr r3, [sp, #20]
smull r8, r4, r0, r11 smull r8, r4, r0, r11
smull r9, r5, r1, r11 smull r9, r5, r1, r11
ldr r10, [sp, #24] ldr r10, [sp, #24]
ldr r11, [sp, #28] ldr r11, [sp, #28]
sub r8, r2, r6 sub r8, r2, r6
sub r9, r3, r7 sub r9, r3, r7
add r2, r2, r6 add r2, r2, r6
add r3, r3, r7 add r3, r3, r7
add r6, r10, r5 add r6, r10, r5
sub r7, r11, r4 sub r7, r11, r4
sub r0, r10, r5 sub r0, r10, r5
add r1, r11, r4 add r1, r11, r4
strd r6, [r14, #8] strd r6, [r14, #8]
strd r8, [r14, #24] strd r8, [r14, #24]
strd r0, [r14, #40] strd r0, [r14, #40]
strd r2, [r14, #56] strd r2, [r14, #56]
subs r12, r12, #1 subs r12, r12, #1
add r14, r14, #64 add r14, r14, #64
bne Radix8First_LOOP bne Radix8First_LOOP
Radix8First_END: Radix8First_END:
add sp, sp, #0x24 add sp, sp, #0x24
ldmia sp!, {r4 - r11, pc} ldmia sp!, {r4 - r11, pc}
DATATab: DATATab:
.word 0x5a82799a .word 0x5a82799a
@ENDP @ |Radix8First| @ENDP @ |Radix8First|
.end .end

View File

@@ -25,145 +25,145 @@
Radix4FFT: Radix4FFT:
stmdb sp!, {r4 - r11, lr} stmdb sp!, {r4 - r11, lr}
sub sp, sp, #32 sub sp, sp, #32
mov r1, r1, asr #2 mov r1, r1, asr #2
cmp r1, #0 cmp r1, #0
beq Radix4FFT_END beq Radix4FFT_END
Radix4FFT_LOOP1: Radix4FFT_LOOP1:
mov r14, r0 @ xptr = buf@ mov r14, r0 @ xptr = buf@
mov r10, r1 @ i = num@ mov r10, r1 @ i = num@
mov r9, r2, lsl #3 @ step = 2*bgn@ mov r9, r2, lsl #3 @ step = 2*bgn@
cmp r10, #0 cmp r10, #0
str r0, [sp] str r0, [sp]
str r1, [sp, #4] str r1, [sp, #4]
str r2, [sp, #8] str r2, [sp, #8]
str r3, [sp, #12] str r3, [sp, #12]
beq Radix4FFT_LOOP1_END beq Radix4FFT_LOOP1_END
Radix4FFT_LOOP2: Radix4FFT_LOOP2:
mov r12, r3 @ csptr = twidTab@ mov r12, r3 @ csptr = twidTab@
mov r11, r2 @ j = bgn mov r11, r2 @ j = bgn
cmp r11, #0 cmp r11, #0
str r10, [sp, #16] str r10, [sp, #16]
beq Radix4FFT_LOOP2_END beq Radix4FFT_LOOP2_END
Radix4FFT_LOOP3: Radix4FFT_LOOP3:
str r11, [sp, #20] str r11, [sp, #20]
ldrd r0, [r14, #0] @ r0 = xptr[0]@ r1 = xptr[1]@ ldrd r0, [r14, #0] @ r0 = xptr[0]@ r1 = xptr[1]@
add r14, r14, r9 @ xptr += step@ add r14, r14, r9 @ xptr += step@
ldrd r10, [r14, #0] @ r2 = xptr[0]@ r3 = xptr[1]@ ldrd r10, [r14, #0] @ r2 = xptr[0]@ r3 = xptr[1]@
ldr r8, [r12], #4 @ cosxsinx = csptr[0]@ ldr r8, [r12], #4 @ cosxsinx = csptr[0]@
smulwt r4, r10, r8 @ L_mpy_wx(cosx, t0) smulwt r4, r10, r8 @ L_mpy_wx(cosx, t0)
smulwt r3, r11, r8 @ L_mpy_wx(cosx, t1) smulwt r3, r11, r8 @ L_mpy_wx(cosx, t1)
smlawb r2, r11, r8, r4 @ r2 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@ smlawb r2, r11, r8, r4 @ r2 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
smulwb r5, r10, r8 @ L_mpy_wx(sinx, t0) smulwb r5, r10, r8 @ L_mpy_wx(sinx, t0)
mov r10, r0, asr #2 @ t0 = r0 >> 2@ mov r10, r0, asr #2 @ t0 = r0 >> 2@
mov r11, r1, asr #2 @ t1 = r1 >> 2@ mov r11, r1, asr #2 @ t1 = r1 >> 2@
sub r3, r3, r5 @ r3 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@ sub r3, r3, r5 @ r3 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
add r14, r14, r9 @ xptr += step@ add r14, r14, r9 @ xptr += step@
sub r0, r10, r2 @ r0 = t0 - r2@ sub r0, r10, r2 @ r0 = t0 - r2@
sub r1, r11, r3 @ r1 = t1 - r3@ sub r1, r11, r3 @ r1 = t1 - r3@
add r2, r10, r2 @ r2 = t0 + r2@ add r2, r10, r2 @ r2 = t0 + r2@
add r3, r11, r3 @ r3 = t1 + r3@ add r3, r11, r3 @ r3 = t1 + r3@
str r2, [sp, #24] str r2, [sp, #24]
str r3, [sp, #28] str r3, [sp, #28]
ldrd r10, [r14, #0] @ r4 = xptr[0]@ r5 = xptr[1]@ ldrd r10, [r14, #0] @ r4 = xptr[0]@ r5 = xptr[1]@
ldr r8, [r12], #4 @ cosxsinx = csptr[1]@ ldr r8, [r12], #4 @ cosxsinx = csptr[1]@
smulwt r6, r10, r8 @ L_mpy_wx(cosx, t0) smulwt r6, r10, r8 @ L_mpy_wx(cosx, t0)
smulwt r5, r11, r8 @ L_mpy_wx(cosx, t1) smulwt r5, r11, r8 @ L_mpy_wx(cosx, t1)
smlawb r4, r11, r8, r6 @ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@ smlawb r4, r11, r8, r6 @ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
smulwb r7, r10, r8 @ L_mpy_wx(sinx, t0) smulwb r7, r10, r8 @ L_mpy_wx(sinx, t0)
add r14, r14, r9 @ xptr += step@ add r14, r14, r9 @ xptr += step@
sub r5, r5, r7 @ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@ sub r5, r5, r7 @ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
ldrd r10, [r14] @ r6 = xptr[0]@ r7 = xptr[1]@ ldrd r10, [r14] @ r6 = xptr[0]@ r7 = xptr[1]@
ldr r8, [r12], #4 @ cosxsinx = csptr[1]@ ldr r8, [r12], #4 @ cosxsinx = csptr[1]@
smulwt r2, r10, r8 @ L_mpy_wx(cosx, t0) smulwt r2, r10, r8 @ L_mpy_wx(cosx, t0)
smulwt r7, r11, r8 @ L_mpy_wx(cosx, t1) smulwt r7, r11, r8 @ L_mpy_wx(cosx, t1)
smlawb r6, r11, r8, r2 @ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@ smlawb r6, r11, r8, r2 @ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
smulwb r3, r10, r8 @ L_mpy_wx(sinx, t0) smulwb r3, r10, r8 @ L_mpy_wx(sinx, t0)
mov r10, r4 @ t0 = r4@
mov r11, r5 @ t1 = r5@
sub r7, r7, r3 @ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
add r4, r10, r6 @ r4 = t0 + r6@ mov r10, r4 @ t0 = r4@
mov r11, r5 @ t1 = r5@
sub r7, r7, r3 @ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
add r4, r10, r6 @ r4 = t0 + r6@
sub r5, r7, r11 @ r5 = r7 - t1@ sub r5, r7, r11 @ r5 = r7 - t1@
sub r6, r10, r6 @ r6 = t0 - r6@ sub r6, r10, r6 @ r6 = t0 - r6@
add r7, r7, r11 @ r7 = r7 + t1@ add r7, r7, r11 @ r7 = r7 + t1@
ldr r2, [sp, #24] ldr r2, [sp, #24]
ldr r3, [sp, #28] ldr r3, [sp, #28]
add r10, r0, r5 @ xptr[0] = r0 + r5@ add r10, r0, r5 @ xptr[0] = r0 + r5@
add r11, r1, r6 @ xptr[0] = r1 + r6 add r11, r1, r6 @ xptr[0] = r1 + r6
strd r10, [r14] strd r10, [r14]
sub r14, r14, r9 @ xptr -= step@ sub r14, r14, r9 @ xptr -= step@
sub r10, r2, r4 @ xptr[0] = r2 - r4@ sub r10, r2, r4 @ xptr[0] = r2 - r4@
sub r11, r3, r7 @ xptr[1] = r3 - r7@ sub r11, r3, r7 @ xptr[1] = r3 - r7@
strd r10, [r14] strd r10, [r14]
sub r14, r14, r9 @ xptr -= step@ sub r14, r14, r9 @ xptr -= step@
sub r10, r0, r5 @ xptr[0] = r0 - r5@ sub r10, r0, r5 @ xptr[0] = r0 - r5@
sub r11, r1, r6 @ xptr[0] = r1 - r6 sub r11, r1, r6 @ xptr[0] = r1 - r6
strd r10, [r14] strd r10, [r14]
sub r14, r14, r9 @ xptr -= step@ sub r14, r14, r9 @ xptr -= step@
add r10, r2, r4 @ xptr[0] = r2 - r4@ add r10, r2, r4 @ xptr[0] = r2 - r4@
add r11, r3, r7 @ xptr[1] = r3 - r7@ add r11, r3, r7 @ xptr[1] = r3 - r7@
strd r10, [r14] strd r10, [r14]
add r14, r14, #8 @ xptr += 2@ add r14, r14, #8 @ xptr += 2@
ldr r11, [sp, #20] ldr r11, [sp, #20]
subs r11, r11, #1 subs r11, r11, #1
bne Radix4FFT_LOOP3 bne Radix4FFT_LOOP3
Radix4FFT_LOOP2_END: Radix4FFT_LOOP2_END:
ldr r10, [sp, #16] ldr r10, [sp, #16]
ldr r3, [sp, #12] ldr r3, [sp, #12]
ldr r2, [sp, #8] ldr r2, [sp, #8]
rsb r8, r9, r9, lsl #2 rsb r8, r9, r9, lsl #2
sub r10, r10, #1 sub r10, r10, #1
add r14, r14, r8 add r14, r14, r8
cmp r10, #0 cmp r10, #0
bhi Radix4FFT_LOOP2 bhi Radix4FFT_LOOP2
Radix4FFT_LOOP1_END: Radix4FFT_LOOP1_END:
ldr r0, [sp] ldr r0, [sp]
ldr r1, [sp, #4] ldr r1, [sp, #4]
add r3, r3, r8, asr #1 add r3, r3, r8, asr #1
mov r2, r2, lsl #2 mov r2, r2, lsl #2
movs r1, r1, asr #2 movs r1, r1, asr #2
bne Radix4FFT_LOOP1 bne Radix4FFT_LOOP1
Radix4FFT_END: Radix4FFT_END:
add sp, sp, #32 add sp, sp, #32
ldmia sp!, {r4 - r11, pc} ldmia sp!, {r4 - r11, pc}
@ENDP @ |Radix4FFT| @ENDP @ |Radix4FFT|
.end .end

View File

@@ -26,31 +26,31 @@
.global CalcBandEnergy .global CalcBandEnergy
CalcBandEnergy: CalcBandEnergy:
stmdb sp!, {r4 - r11, lr} stmdb sp!, {r4 - r11, lr}
mov r2, r2, lsl #16 mov r2, r2, lsl #16
ldr r12, [r13, #36] ldr r12, [r13, #36]
mov r9, #0 mov r9, #0
mov r5, r2, asr #16 mov r5, r2, asr #16
mov r4, #0 mov r4, #0
cmp r5, #0 cmp r5, #0
ble L212 ble L212
L22: L22:
mov r2, r4, lsl #1 mov r2, r4, lsl #1
ldrsh r10, [r1, r2] ldrsh r10, [r1, r2]
add r11, r1, r2 add r11, r1, r2
ldrsh r2, [r11, #2] ldrsh r2, [r11, #2]
mov r14, #0 mov r14, #0
cmp r10, r2 cmp r10, r2
bge L28 bge L28
L23: L23:
ldr r11, [r0, +r10, lsl #2] ldr r11, [r0, +r10, lsl #2]
add r10, r10, #1 add r10, r10, #1
ldr r6, [r0, +r10, lsl #2] ldr r6, [r0, +r10, lsl #2]
smull r11, r7, r11, r11 smull r11, r7, r11, r11
add r10, r10, #1 add r10, r10, #1
smull r6, r8, r6, r6 smull r6, r8, r6, r6
ldr r11, [r0, +r10, lsl #2] ldr r11, [r0, +r10, lsl #2]
qadd r14, r14, r7 qadd r14, r14, r7
@@ -59,71 +59,71 @@ L23:
ldr r6, [r0, +r10, lsl #2] ldr r6, [r0, +r10, lsl #2]
qadd r14, r14, r8 qadd r14, r14, r8
smull r6, r8, r6, r6 smull r6, r8, r6, r6
add r10, r10, #1 add r10, r10, #1
qadd r14, r14, r7 qadd r14, r14, r7
cmp r10, r2 cmp r10, r2
qadd r14, r14, r8 qadd r14, r14, r8
blt L23 blt L23
L28: L28:
qadd r14, r14, r14 qadd r14, r14, r14
str r14, [r3, +r4, lsl #2] str r14, [r3, +r4, lsl #2]
add r4, r4, #1 add r4, r4, #1
qadd r9, r9, r14 qadd r9, r9, r14
cmp r4, r5 cmp r4, r5
blt L22 blt L22
L212: L212:
str r9, [r12, #0] str r9, [r12, #0]
ldmia sp!, {r4 - r11, pc} ldmia sp!, {r4 - r11, pc}
@ENDP ; |CalcBandEnergy| @ENDP ; |CalcBandEnergy|
.global CalcBandEnergyMS .global CalcBandEnergyMS
CalcBandEnergyMS: CalcBandEnergyMS:
stmdb sp!, {r4 - r11, lr} stmdb sp!, {r4 - r11, lr}
sub r13, r13, #24 sub r13, r13, #24
mov r12, #0 mov r12, #0
mov r3, r3, lsl #16 mov r3, r3, lsl #16
mov r14, #0 mov r14, #0
mov r3, r3, asr #16 mov r3, r3, asr #16
cmp r3, #0 cmp r3, #0
mov r4, #0 mov r4, #0
ble L315 ble L315
L32: L32:
mov r5, r4, lsl #1 mov r5, r4, lsl #1
mov r6, #0 mov r6, #0
ldrsh r10, [r2, r5] ldrsh r10, [r2, r5]
add r5, r2, r5 add r5, r2, r5
mov r7, #0 mov r7, #0
ldrsh r11, [r5, #2] ldrsh r11, [r5, #2]
cmp r10, r11 cmp r10, r11
bge L39 bge L39
str r3, [r13, #4] str r3, [r13, #4]
str r4, [r13, #8] str r4, [r13, #8]
str r12, [r13, #12] str r12, [r13, #12]
str r14, [r13, #16] str r14, [r13, #16]
L33: L33:
ldr r8, [r0, +r10, lsl #2] ldr r8, [r0, +r10, lsl #2]
ldr r9, [r1, +r10, lsl #2] ldr r9, [r1, +r10, lsl #2]
mov r8, r8, asr #1 mov r8, r8, asr #1
add r10, r10, #1 add r10, r10, #1
mov r9, r9, asr #1 mov r9, r9, asr #1
ldr r12, [r0, +r10, lsl #2] ldr r12, [r0, +r10, lsl #2]
add r5, r8, r9 add r5, r8, r9
ldr r14, [r1, +r10, lsl #2] ldr r14, [r1, +r10, lsl #2]
sub r8, r8, r9 sub r8, r8, r9
smull r5, r3, r5, r5 smull r5, r3, r5, r5
mov r12, r12, asr #1 mov r12, r12, asr #1
smull r8, r4, r8, r8 smull r8, r4, r8, r8
mov r14, r14, asr #1 mov r14, r14, asr #1
qadd r6, r6, r3 qadd r6, r6, r3
@@ -131,27 +131,27 @@ L33:
qadd r7, r7, r4 qadd r7, r7, r4
sub r8, r12, r14 sub r8, r12, r14
smull r5, r3, r5, r5 smull r5, r3, r5, r5
add r10, r10, #1 add r10, r10, #1
smull r8, r4, r8, r8 smull r8, r4, r8, r8
qadd r6, r6, r3 qadd r6, r6, r3
qadd r7, r7, r4 qadd r7, r7, r4
ldr r8, [r0, +r10, lsl #2] ldr r8, [r0, +r10, lsl #2]
ldr r9, [r1, +r10, lsl #2] ldr r9, [r1, +r10, lsl #2]
mov r8, r8, asr #1 mov r8, r8, asr #1
add r10, r10, #1 add r10, r10, #1
mov r9, r9, asr #1 mov r9, r9, asr #1
ldr r12, [r0, +r10, lsl #2] ldr r12, [r0, +r10, lsl #2]
add r5, r8, r9 add r5, r8, r9
ldr r14, [r1, +r10, lsl #2] ldr r14, [r1, +r10, lsl #2]
sub r8, r8, r9 sub r8, r8, r9
smull r5, r3, r5, r5 smull r5, r3, r5, r5
mov r12, r12, asr #1 mov r12, r12, asr #1
smull r8, r4, r8, r8 smull r8, r4, r8, r8
mov r14, r14, asr #1 mov r14, r14, asr #1
qadd r6, r6, r3 qadd r6, r6, r3
@@ -159,37 +159,37 @@ L33:
qadd r7, r7, r4 qadd r7, r7, r4
sub r8, r12, r14 sub r8, r12, r14
smull r5, r3, r5, r5 smull r5, r3, r5, r5
add r10, r10, #1 add r10, r10, #1
smull r8, r4, r8, r8 smull r8, r4, r8, r8
qadd r6, r6, r3 qadd r6, r6, r3
qadd r7, r7, r4 qadd r7, r7, r4
cmp r10, r11 cmp r10, r11
blt L33 blt L33
ldr r3, [r13, #4] ldr r3, [r13, #4]
ldr r4, [r13, #8] ldr r4, [r13, #8]
ldr r12, [r13, #12] ldr r12, [r13, #12]
ldr r14, [r13, #16] ldr r14, [r13, #16]
L39: L39:
qadd r6, r6, r6 qadd r6, r6, r6
qadd r7, r7, r7 qadd r7, r7, r7
ldr r8, [r13, #60] ldr r8, [r13, #60]
ldr r9, [r13, #68] ldr r9, [r13, #68]
qadd r12, r12, r6 qadd r12, r12, r6
qadd r14, r14, r7 qadd r14, r14, r7
str r6, [r8, +r4, lsl #2] str r6, [r8, +r4, lsl #2]
str r7, [r9, +r4, lsl #2] str r7, [r9, +r4, lsl #2]
add r4, r4, #1 add r4, r4, #1
cmp r4, r3 cmp r4, r3
blt L32 blt L32
L315: L315:
ldr r8, [r13, #64] ldr r8, [r13, #64]

View File

@@ -26,53 +26,53 @@
PreMDCT: PreMDCT:
stmdb sp!, {r4 - r11, lr} stmdb sp!, {r4 - r11, lr}
add r9, r0, r1, lsl #2 add r9, r0, r1, lsl #2
sub r3, r9, #32 sub r3, r9, #32
movs r1, r1, asr #2 movs r1, r1, asr #2
beq PreMDCT_END beq PreMDCT_END
PreMDCT_LOOP: PreMDCT_LOOP:
VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@ VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@
VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@ VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@
VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(buf0 + 0)@ ti2 = *(buf0 + 1)@ VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(buf0 + 0)@ ti2 = *(buf0 + 1)@
VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@ VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@
VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@ VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@
VREV64.32 Q8, Q7 VREV64.32 Q8, Q7
VREV64.32 Q9, Q6 VREV64.32 Q9, Q6
VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1) VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1)
VQDMULH.S32 Q11, Q1, Q8 @ MULHIGH(sina, ti1) VQDMULH.S32 Q11, Q1, Q8 @ MULHIGH(sina, ti1)
VQDMULH.S32 Q12, Q0, Q8 @ MULHIGH(cosa, ti1) VQDMULH.S32 Q12, Q0, Q8 @ MULHIGH(cosa, ti1)
VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1) VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1)
VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@ VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
VSUB.S32 Q1, Q12, Q13 @ *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1)@ VSUB.S32 Q1, Q12, Q13 @ *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1)@
VST2.I32 {d0, d1, d2, d3}, [r0]! VST2.I32 {d0, d1, d2, d3}, [r0]!
sub r3, r3, #32 sub r3, r3, #32
VQDMULH.S32 Q10, Q2, Q9 @ MULHIGH(cosb, tr2) VQDMULH.S32 Q10, Q2, Q9 @ MULHIGH(cosb, tr2)
VQDMULH.S32 Q11, Q3, Q5 @ MULHIGH(sinb, ti2) VQDMULH.S32 Q11, Q3, Q5 @ MULHIGH(sinb, ti2)
VQDMULH.S32 Q12, Q2, Q5 @ MULHIGH(cosb, ti2) VQDMULH.S32 Q12, Q2, Q5 @ MULHIGH(cosb, ti2)
VQDMULH.S32 Q13, Q3, Q9 @ MULHIGH(sinb, tr2) VQDMULH.S32 Q13, Q3, Q9 @ MULHIGH(sinb, tr2)
VADD.S32 Q0, Q10, Q11 @ MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@ VADD.S32 Q0, Q10, Q11 @ MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@
VSUB.S32 Q1, Q12, Q13 @ MULHIGH(cosa, ti2) - MULHIGH(sina, tr2)@ VSUB.S32 Q1, Q12, Q13 @ MULHIGH(cosa, ti2) - MULHIGH(sina, tr2)@
VREV64.32 Q3, Q1 VREV64.32 Q3, Q1
VREV64.32 Q2, Q0 VREV64.32 Q2, Q0
VST2.I32 {d5, d7}, [r3]! VST2.I32 {d5, d7}, [r3]!
VST2.I32 {d4, d6}, [r3]! VST2.I32 {d4, d6}, [r3]!
subs r1, r1, #4 subs r1, r1, #4
sub r3, r3, #64 sub r3, r3, #64
bne PreMDCT_LOOP bne PreMDCT_LOOP
PreMDCT_END: PreMDCT_END:
ldmia sp!, {r4 - r11, pc} ldmia sp!, {r4 - r11, pc}
@ENDP @ |PreMDCT| @ENDP @ |PreMDCT|
@@ -82,50 +82,50 @@ PreMDCT_END:
PostMDCT: PostMDCT:
stmdb sp!, {r4 - r11, lr} stmdb sp!, {r4 - r11, lr}
add r9, r0, r1, lsl #2 add r9, r0, r1, lsl #2
sub r3, r9, #32 sub r3, r9, #32
movs r1, r1, asr #2 movs r1, r1, asr #2
beq PostMDCT_END beq PostMDCT_END
PostMDCT_LOOP: PostMDCT_LOOP:
VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@ VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@
VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@ VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@
VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(zbuf1 + 0)@ ti1 = *(zbuf1 + 1)@ VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(zbuf1 + 0)@ ti1 = *(zbuf1 + 1)@
VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@ VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@
VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@ VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@
VREV64.32 Q8, Q6
VREV64.32 Q9, Q7
VREV64.32 Q8, Q6
VREV64.32 Q9, Q7
VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1) VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1)
VQDMULH.S32 Q11, Q1, Q5 @ MULHIGH(sina, ti1) VQDMULH.S32 Q11, Q1, Q5 @ MULHIGH(sina, ti1)
VQDMULH.S32 Q12, Q0, Q5 @ MULHIGH(cosa, ti1) VQDMULH.S32 Q12, Q0, Q5 @ MULHIGH(cosa, ti1)
VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1) VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1)
VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@ VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
VSUB.S32 Q5, Q13, Q12 @ *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1)@ VSUB.S32 Q5, Q13, Q12 @ *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1)@
VQDMULH.S32 Q10, Q2, Q8 @ MULHIGH(cosb, tr2) VQDMULH.S32 Q10, Q2, Q8 @ MULHIGH(cosb, tr2)
VQDMULH.S32 Q11, Q3, Q9 @ MULHIGH(sinb, ti2) VQDMULH.S32 Q11, Q3, Q9 @ MULHIGH(sinb, ti2)
VQDMULH.S32 Q12, Q2, Q9 @ MULHIGH(cosb, ti2) VQDMULH.S32 Q12, Q2, Q9 @ MULHIGH(cosb, ti2)
VQDMULH.S32 Q13, Q3, Q8 @ MULHIGH(sinb, tr2) VQDMULH.S32 Q13, Q3, Q8 @ MULHIGH(sinb, tr2)
VADD.S32 Q4, Q10, Q11 @ *buf1-- = MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@ VADD.S32 Q4, Q10, Q11 @ *buf1-- = MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@
VSUB.S32 Q1, Q13, Q12 @ *buf0++ = MULHIGH(sina, tr2) - MULHIGH(cosa, ti2)@ VSUB.S32 Q1, Q13, Q12 @ *buf0++ = MULHIGH(sina, tr2) - MULHIGH(cosa, ti2)@
VREV64.32 Q2, Q4 VREV64.32 Q2, Q4
VREV64.32 Q3, Q5 VREV64.32 Q3, Q5
sub r3, r3, #32 sub r3, r3, #32
VST2.I32 {d0, d1, d2, d3}, [r0]! VST2.I32 {d0, d1, d2, d3}, [r0]!
VST2.I32 {d5, d7}, [r3]! VST2.I32 {d5, d7}, [r3]!
VST2.I32 {d4, d6}, [r3]! VST2.I32 {d4, d6}, [r3]!
subs r1, r1, #4 subs r1, r1, #4
sub r3, r3, #64 sub r3, r3, #64
bne PostMDCT_LOOP bne PostMDCT_LOOP
PostMDCT_END: PostMDCT_END:

View File

@@ -29,86 +29,86 @@ Radix8First:
ldr r3, SQRT1_2 ldr r3, SQRT1_2
cmp r1, #0 cmp r1, #0
VDUP.I32 Q15, r3 VDUP.I32 Q15, r3
beq Radix8First_END beq Radix8First_END
Radix8First_LOOP: Radix8First_LOOP:
VLD1.I32 {d0, d1, d2, d3}, [r0]! VLD1.I32 {d0, d1, d2, d3}, [r0]!
VLD1.I32 {d8, d9, d10, d11}, [r0]! VLD1.I32 {d8, d9, d10, d11}, [r0]!
VADD.S32 d4, d0, d1 @ r0 = buf[0] + buf[2]@i0 = buf[1] + buf[3]@ VADD.S32 d4, d0, d1 @ r0 = buf[0] + buf[2]@i0 = buf[1] + buf[3]@
VSUB.S32 d5, d0, d1 @ r1 = buf[0] - buf[2]@i1 = buf[1] - buf[3]@ VSUB.S32 d5, d0, d1 @ r1 = buf[0] - buf[2]@i1 = buf[1] - buf[3]@
VSUB.S32 d7, d2, d3 @ r2 = buf[4] - buf[6]@i2 = buf[5] - buf[7]@ VSUB.S32 d7, d2, d3 @ r2 = buf[4] - buf[6]@i2 = buf[5] - buf[7]@
VADD.S32 d6, d2, d3 @ r3 = buf[4] + buf[6]@i3 = buf[5] + buf[7]@ VADD.S32 d6, d2, d3 @ r3 = buf[4] + buf[6]@i3 = buf[5] + buf[7]@
VREV64.I32 d7, d7 VREV64.I32 d7, d7
VADD.S32 Q0, Q2, Q3 @ r4 = (r0 + r2)@i4 = (i0 + i2)@i6 = (i1 + r3)@r7 = (r1 + i3) VADD.S32 Q0, Q2, Q3 @ r4 = (r0 + r2)@i4 = (i0 + i2)@i6 = (i1 + r3)@r7 = (r1 + i3)
VSUB.S32 Q1, Q2, Q3 @ r5 = (r0 - r2)@i5 = (i0 - i2)@r6 = (r1 - i3)@i7 = (i1 - r3)@ VSUB.S32 Q1, Q2, Q3 @ r5 = (r0 - r2)@i5 = (i0 - i2)@r6 = (r1 - i3)@i7 = (i1 - r3)@
VREV64.I32 d3, d3 VREV64.I32 d3, d3
VADD.S32 d4, d8, d9 @ r0 = buf[ 8] + buf[10]@i0 = buf[ 9] + buf[11]@ VADD.S32 d4, d8, d9 @ r0 = buf[ 8] + buf[10]@i0 = buf[ 9] + buf[11]@
VSUB.S32 d7, d10, d11 @ r1 = buf[12] - buf[14]@i1 = buf[13] - buf[15]@ VSUB.S32 d7, d10, d11 @ r1 = buf[12] - buf[14]@i1 = buf[13] - buf[15]@
VADD.S32 d6, d10, d11 @ r2 = buf[12] + buf[14]@i2 = buf[13] + buf[15]@ VADD.S32 d6, d10, d11 @ r2 = buf[12] + buf[14]@i2 = buf[13] + buf[15]@
VREV64.I32 d7, d7 VREV64.I32 d7, d7
VSUB.S32 d5, d8, d9 @ r3 = buf[ 8] - buf[10]@i3 = buf[ 9] - buf[11]@ VSUB.S32 d5, d8, d9 @ r3 = buf[ 8] - buf[10]@i3 = buf[ 9] - buf[11]@
VTRN.32 d1, d3 VTRN.32 d1, d3
VADD.S32 Q4, Q2, Q3 @ t0 = (r0 + r2) >> 1@t1 = (i0 + i2) >> 1@i0 = i1 + r3@r2 = r1 + i3@ VADD.S32 Q4, Q2, Q3 @ t0 = (r0 + r2) >> 1@t1 = (i0 + i2) >> 1@i0 = i1 + r3@r2 = r1 + i3@
VSUB.S32 Q5, Q2, Q3 @ t2 = (r0 - r2) >> 1@t3 = (i0 - i2) >> 1@r0 = r1 - i3@i2 = i1 - r3@ VSUB.S32 Q5, Q2, Q3 @ t2 = (r0 - r2) >> 1@t3 = (i0 - i2) >> 1@r0 = r1 - i3@i2 = i1 - r3@
VREV64.I32 d3, d3 VREV64.I32 d3, d3
VSHR.S32 d8, d8, #1 VSHR.S32 d8, d8, #1
VSHR.S32 Q0, Q0, #1 VSHR.S32 Q0, Q0, #1
VREV64.I32 d10, d10 VREV64.I32 d10, d10
VTRN.32 d11, d9 VTRN.32 d11, d9
VSHR.S32 Q1, Q1, #1 VSHR.S32 Q1, Q1, #1
VSHR.S32 d10, d10, #1 VSHR.S32 d10, d10, #1
VREV64.I32 d9, d9 VREV64.I32 d9, d9
sub r0, r0, #0x40 sub r0, r0, #0x40
VADD.S32 d12, d0, d8 VADD.S32 d12, d0, d8
VSUB.S32 d16, d0, d8 VSUB.S32 d16, d0, d8
VADD.S32 d14, d2, d10 VADD.S32 d14, d2, d10
VSUB.S32 d18, d2, d10 VSUB.S32 d18, d2, d10
VSUB.S32 d4, d11, d9 VSUB.S32 d4, d11, d9
VADD.S32 d5, d11, d9 VADD.S32 d5, d11, d9
VREV64.I32 d18, d18 VREV64.I32 d18, d18
VQDMULH.S32 Q3, Q2, Q15 VQDMULH.S32 Q3, Q2, Q15
VTRN.32 d14, d18 VTRN.32 d14, d18
VTRN.32 d6, d7 VTRN.32 d6, d7
VREV64.I32 d18, d18 VREV64.I32 d18, d18
VSUB.S32 d15, d3, d6 VSUB.S32 d15, d3, d6
VREV64.I32 d7, d7 VREV64.I32 d7, d7
VADD.S32 d19, d3, d6 VADD.S32 d19, d3, d6
VADD.S32 d13, d1, d7 VADD.S32 d13, d1, d7
VSUB.S32 d17, d1, d7 VSUB.S32 d17, d1, d7
VREV64.I32 d17, d17 VREV64.I32 d17, d17
VTRN.32 d13, d17 VTRN.32 d13, d17
VREV64.I32 d17, d17 VREV64.I32 d17, d17
subs r1, r1, #1 subs r1, r1, #1
VST1.I32 {d12, d13, d14, d15}, [r0]! VST1.I32 {d12, d13, d14, d15}, [r0]!
VST1.I32 {d16, d17, d18, d19}, [r0]! VST1.I32 {d16, d17, d18, d19}, [r0]!
bne Radix8First_LOOP bne Radix8First_LOOP
Radix8First_END: Radix8First_END:
ldmia sp!, {r4 - r11, pc} ldmia sp!, {r4 - r11, pc}
SQRT1_2: SQRT1_2:
.word 0x2d413ccd .word 0x2d413ccd
@ENDP @ |Radix8First| @ENDP @ |Radix8First|
.section .text .section .text
.global Radix4First .global Radix4First
@@ -117,28 +117,28 @@ Radix4First:
cmp r1, #0 cmp r1, #0
beq Radix4First_END beq Radix4First_END
Radix4First_LOOP: Radix4First_LOOP:
VLD1.I32 {d0, d1, d2, d3}, [r0] VLD1.I32 {d0, d1, d2, d3}, [r0]
VADD.S32 d4, d0, d1 @ r0 = buf[0] + buf[2]@ r1 = buf[1] + buf[3]@ VADD.S32 d4, d0, d1 @ r0 = buf[0] + buf[2]@ r1 = buf[1] + buf[3]@
VSUB.S32 d5, d0, d1 @ r2 = buf[0] - buf[2]@ r3 = buf[1] - buf[3]@ VSUB.S32 d5, d0, d1 @ r2 = buf[0] - buf[2]@ r3 = buf[1] - buf[3]@
VSUB.S32 d7, d2, d3 @ r4 = buf[4] + buf[6]@ r5 = buf[5] + buf[7]@ VSUB.S32 d7, d2, d3 @ r4 = buf[4] + buf[6]@ r5 = buf[5] + buf[7]@
VADD.S32 d6, d2, d3 @ r6 = buf[4] - buf[6]@ r7 = buf[5] - buf[7]@ VADD.S32 d6, d2, d3 @ r6 = buf[4] - buf[6]@ r7 = buf[5] - buf[7]@
VREV64.I32 d7, d7 @ VREV64.I32 d7, d7 @
VADD.S32 Q4, Q2, Q3 VADD.S32 Q4, Q2, Q3
VSUB.S32 Q5, Q2, Q3 VSUB.S32 Q5, Q2, Q3
VREV64.I32 d11, d11 VREV64.I32 d11, d11
VTRN.32 d9, d11 VTRN.32 d9, d11
subs r1, r1, #1 subs r1, r1, #1
VREV64.I32 d11, d11 VREV64.I32 d11, d11
VST1.I32 {d8, d9, d10, d11}, [r0]! VST1.I32 {d8, d9, d10, d11}, [r0]!
bne Radix4First_LOOP bne Radix4First_LOOP
Radix4First_END: Radix4First_END:
ldmia sp!, {r4 - r11, pc} ldmia sp!, {r4 - r11, pc}

View File

@@ -28,116 +28,116 @@ Radix4FFT:
stmdb sp!, {r4 - r11, lr} stmdb sp!, {r4 - r11, lr}
mov r1, r1, asr #2 mov r1, r1, asr #2
cmp r1, #0 cmp r1, #0
beq Radix4FFT_END beq Radix4FFT_END
Radix4FFT_LOOP1: Radix4FFT_LOOP1:
mov r5, r2, lsl #1 mov r5, r2, lsl #1
mov r8, r0 mov r8, r0
mov r7, r1 mov r7, r1
mov r5, r5, lsl #2 mov r5, r5, lsl #2
cmp r1, #0 cmp r1, #0
rsbeq r12, r5, r5, lsl #2 rsbeq r12, r5, r5, lsl #2
beq Radix4FFT_LOOP1_END beq Radix4FFT_LOOP1_END
rsb r12, r5, r5, lsl #2 rsb r12, r5, r5, lsl #2
Radix4FFT_LOOP2: Radix4FFT_LOOP2:
mov r6, r3 mov r6, r3
mov r4, r2 mov r4, r2
cmp r2, #0 cmp r2, #0
beq Radix4FFT_LOOP2_END beq Radix4FFT_LOOP2_END
Radix4FFT_LOOP3: Radix4FFT_LOOP3:
@r0 = xptr[0]@ @r0 = xptr[0]@
@r1 = xptr[1]@ @r1 = xptr[1]@
VLD2.I32 {D0, D1, D2, D3}, [r8] VLD2.I32 {D0, D1, D2, D3}, [r8]
VLD2.I32 {D28, D29, D30, D31}, [r6]! @ cosx = csptr[0]@ sinx = csptr[1]@ VLD2.I32 {D28, D29, D30, D31}, [r6]! @ cosx = csptr[0]@ sinx = csptr[1]@
add r8, r8, r5 @ xptr += step@ add r8, r8, r5 @ xptr += step@
VLD2.I32 {D4, D5, D6,D7}, [r8] @ r2 = xptr[0]@ r3 = xptr[1]@ VLD2.I32 {D4, D5, D6,D7}, [r8] @ r2 = xptr[0]@ r3 = xptr[1]@
VQDMULH.S32 Q10, Q2, Q14 @ MULHIGH(cosx, t0) VQDMULH.S32 Q10, Q2, Q14 @ MULHIGH(cosx, t0)
VQDMULH.S32 Q11, Q3, Q15 @ MULHIGH(sinx, t1) VQDMULH.S32 Q11, Q3, Q15 @ MULHIGH(sinx, t1)
VQDMULH.S32 Q12, Q3, Q14 @ MULHIGH(cosx, t1) VQDMULH.S32 Q12, Q3, Q14 @ MULHIGH(cosx, t1)
VQDMULH.S32 Q13, Q2, Q15 @ MULHIGH(sinx, t0) VQDMULH.S32 Q13, Q2, Q15 @ MULHIGH(sinx, t0)
VADD.S32 Q2, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1) VADD.S32 Q2, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
VSUB.S32 Q3, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0) VSUB.S32 Q3, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
add r8, r8, r5 @ xptr += step@ add r8, r8, r5 @ xptr += step@
VSHR.S32 Q10, Q0, #2 @ t0 = r0 >> 2@ VSHR.S32 Q10, Q0, #2 @ t0 = r0 >> 2@
VSHR.S32 Q11, Q1, #2 @ t1 = r1 >> 2@ VSHR.S32 Q11, Q1, #2 @ t1 = r1 >> 2@
VSUB.S32 Q0, Q10, Q2 @ r0 = t0 - r2@ VSUB.S32 Q0, Q10, Q2 @ r0 = t0 - r2@
VSUB.S32 Q1, Q11, Q3 @ r1 = t1 - r3@ VSUB.S32 Q1, Q11, Q3 @ r1 = t1 - r3@
VADD.S32 Q2, Q10, Q2 @ r2 = t0 + r2@ VADD.S32 Q2, Q10, Q2 @ r2 = t0 + r2@
VADD.S32 Q3, Q11, Q3 @ r3 = t1 + r3@ VADD.S32 Q3, Q11, Q3 @ r3 = t1 + r3@
VLD2.I32 {D8, D9, D10, D11}, [r8] VLD2.I32 {D8, D9, D10, D11}, [r8]
VLD2.I32 {D28, D29, D30, D31}, [r6]! VLD2.I32 {D28, D29, D30, D31}, [r6]!
add r8, r8, r5 add r8, r8, r5
VQDMULH.S32 Q10, Q4, Q14 @ MULHIGH(cosx, t0) VQDMULH.S32 Q10, Q4, Q14 @ MULHIGH(cosx, t0)
VQDMULH.S32 Q11, Q5, Q15 @ MULHIGH(sinx, t1) VQDMULH.S32 Q11, Q5, Q15 @ MULHIGH(sinx, t1)
VQDMULH.S32 Q12, Q5, Q14 @ MULHIGH(cosx, t1) VQDMULH.S32 Q12, Q5, Q14 @ MULHIGH(cosx, t1)
VQDMULH.S32 Q13, Q4, Q15 @ MULHIGH(sinx, t0) VQDMULH.S32 Q13, Q4, Q15 @ MULHIGH(sinx, t0)
VADD.S32 Q8, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1) VADD.S32 Q8, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
VSUB.S32 Q9, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0) VSUB.S32 Q9, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
VLD2.I32 {D12, D13, D14, D15}, [r8] VLD2.I32 {D12, D13, D14, D15}, [r8]
VLD2.I32 {D28, D29, D30, D31}, [r6]! VLD2.I32 {D28, D29, D30, D31}, [r6]!
VQDMULH.S32 Q10, Q6, Q14 @ MULHIGH(cosx, t0) VQDMULH.S32 Q10, Q6, Q14 @ MULHIGH(cosx, t0)
VQDMULH.S32 Q11, Q7, Q15 @ MULHIGH(sinx, t1) VQDMULH.S32 Q11, Q7, Q15 @ MULHIGH(sinx, t1)
VQDMULH.S32 Q12, Q7, Q14 @ MULHIGH(cosx, t1) VQDMULH.S32 Q12, Q7, Q14 @ MULHIGH(cosx, t1)
VQDMULH.S32 Q13, Q6, Q15 @ MULHIGH(sinx, t0) VQDMULH.S32 Q13, Q6, Q15 @ MULHIGH(sinx, t0)
VADD.S32 Q6, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1) VADD.S32 Q6, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
VSUB.S32 Q7, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0) VSUB.S32 Q7, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
VADD.S32 Q4, Q8, Q6 @ r4 = t0 + r6@ VADD.S32 Q4, Q8, Q6 @ r4 = t0 + r6@
VSUB.S32 Q5, Q7, Q9 @ r5 = r7 - t1@ VSUB.S32 Q5, Q7, Q9 @ r5 = r7 - t1@
VSUB.S32 Q6, Q8, Q6 @ r6 = t0 - r6@ VSUB.S32 Q6, Q8, Q6 @ r6 = t0 - r6@
VADD.S32 Q7, Q7, Q9 @ r7 = r7 + t1@ VADD.S32 Q7, Q7, Q9 @ r7 = r7 + t1@
VADD.S32 Q8, Q0, Q5 @ xptr[0] = r0 + r5@ VADD.S32 Q8, Q0, Q5 @ xptr[0] = r0 + r5@
VADD.S32 Q9, Q1, Q6 @ xptr[1] = r1 + r6@ VADD.S32 Q9, Q1, Q6 @ xptr[1] = r1 + r6@
VST2.I32 {D16, D17, D18, D19}, [r8] VST2.I32 {D16, D17, D18, D19}, [r8]
VSUB.S32 Q10, Q2, Q4 @ xptr[0] = r2 - r4@ VSUB.S32 Q10, Q2, Q4 @ xptr[0] = r2 - r4@
sub r8, r8, r5 @ xptr -= step@ sub r8, r8, r5 @ xptr -= step@
VSUB.S32 Q11, Q3, Q7 @ xptr[1] = r3 - r7@ VSUB.S32 Q11, Q3, Q7 @ xptr[1] = r3 - r7@
VST2.I32 {D20, D21, D22, D23}, [r8] VST2.I32 {D20, D21, D22, D23}, [r8]
VSUB.S32 Q8, Q0, Q5 @ xptr[0] = r0 - r5@ VSUB.S32 Q8, Q0, Q5 @ xptr[0] = r0 - r5@
sub r8, r8, r5 @ xptr -= step@ sub r8, r8, r5 @ xptr -= step@
VSUB.S32 Q9, Q1, Q6 @ xptr[1] = r1 - r6@ VSUB.S32 Q9, Q1, Q6 @ xptr[1] = r1 - r6@
VST2.I32 {D16, D17, D18, D19}, [r8] VST2.I32 {D16, D17, D18, D19}, [r8]
VADD.S32 Q10, Q2, Q4 @ xptr[0] = r2 + r4@ VADD.S32 Q10, Q2, Q4 @ xptr[0] = r2 + r4@
sub r8, r8, r5 @ xptr -= step@ sub r8, r8, r5 @ xptr -= step@
VADD.S32 Q11, Q3, Q7 @ xptr[1] = r3 + r7@ VADD.S32 Q11, Q3, Q7 @ xptr[1] = r3 + r7@
VST2.I32 {D20, D21, D22, D23}, [r8]! VST2.I32 {D20, D21, D22, D23}, [r8]!
subs r4, r4, #4 subs r4, r4, #4
bne Radix4FFT_LOOP3 bne Radix4FFT_LOOP3
Radix4FFT_LOOP2_END: Radix4FFT_LOOP2_END:
add r8, r8, r12 add r8, r8, r12
sub r7, r7, #1 sub r7, r7, #1
cmp r7, #0 cmp r7, #0
bhi Radix4FFT_LOOP2 bhi Radix4FFT_LOOP2
Radix4FFT_LOOP1_END: Radix4FFT_LOOP1_END:
add r3, r12, r3 add r3, r12, r3
mov r2, r2, lsl #2 mov r2, r2, lsl #2
movs r1, r1, asr #2 movs r1, r1, asr #2
bne Radix4FFT_LOOP1 bne Radix4FFT_LOOP1
Radix4FFT_END: Radix4FFT_END:
ldmia sp!, {r4 - r11, pc} ldmia sp!, {r4 - r11, pc}
@ENDP @ |Radix4FFT| @ENDP @ |Radix4FFT|
.end .end

View File

@@ -37,18 +37,18 @@ void CalcBandEnergy(const Word32 *mdctSpectrum,
Word32 *bandEnergySum) Word32 *bandEnergySum)
{ {
Word32 i, j; Word32 i, j;
Word32 accuSum = 0; Word32 accuSum = 0;
for (i=0; i<numBands; i++) { for (i=0; i<numBands; i++) {
Word32 accu = 0; Word32 accu = 0;
for (j=bandOffset[i]; j<bandOffset[i+1]; j++) for (j=bandOffset[i]; j<bandOffset[i+1]; j++)
accu = L_add(accu, MULHIGH(mdctSpectrum[j], mdctSpectrum[j])); accu = L_add(accu, MULHIGH(mdctSpectrum[j], mdctSpectrum[j]));
accu = L_add(accu, accu); accu = L_add(accu, accu);
accuSum = L_add(accuSum, accu); accuSum = L_add(accuSum, accu);
bandEnergy[i] = accu; bandEnergy[i] = accu;
} }
*bandEnergySum = accuSum; *bandEnergySum = accuSum;
} }
/******************************************************************************** /********************************************************************************
@@ -68,15 +68,15 @@ void CalcBandEnergyMS(const Word32 *mdctSpectrumLeft,
{ {
Word32 i, j; Word32 i, j;
Word32 accuMidSum = 0; Word32 accuMidSum = 0;
Word32 accuSideSum = 0; Word32 accuSideSum = 0;
for(i=0; i<numBands; i++) { for(i=0; i<numBands; i++) {
Word32 accuMid = 0; Word32 accuMid = 0;
Word32 accuSide = 0; Word32 accuSide = 0;
for (j=bandOffset[i]; j<bandOffset[i+1]; j++) { for (j=bandOffset[i]; j<bandOffset[i+1]; j++) {
Word32 specm, specs; Word32 specm, specs;
Word32 l, r; Word32 l, r;
l = mdctSpectrumLeft[j] >> 1; l = mdctSpectrumLeft[j] >> 1;
@@ -86,17 +86,17 @@ void CalcBandEnergyMS(const Word32 *mdctSpectrumLeft,
accuMid = L_add(accuMid, MULHIGH(specm, specm)); accuMid = L_add(accuMid, MULHIGH(specm, specm));
accuSide = L_add(accuSide, MULHIGH(specs, specs)); accuSide = L_add(accuSide, MULHIGH(specs, specs));
} }
accuMid = L_add(accuMid, accuMid); accuMid = L_add(accuMid, accuMid);
accuSide = L_add(accuSide, accuSide); accuSide = L_add(accuSide, accuSide);
bandEnergyMid[i] = accuMid; bandEnergyMid[i] = accuMid;
accuMidSum = L_add(accuMidSum, accuMid); accuMidSum = L_add(accuMidSum, accuMid);
bandEnergySide[i] = accuSide; bandEnergySide[i] = accuSide;
accuSideSum = L_add(accuSideSum, accuSide); accuSideSum = L_add(accuSideSum, accuSide);
} }
*bandEnergyMidSum = accuMidSum; *bandEnergyMidSum = accuMidSum;
*bandEnergySideSum = accuSideSum; *bandEnergySideSum = accuSideSum;
} }
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@@ -32,15 +32,15 @@ static void updateBitBufWordPtr(HANDLE_BIT_BUF hBitBuf,
UWord8 **pBitBufWord, UWord8 **pBitBufWord,
Word16 cnt) Word16 cnt)
{ {
*pBitBufWord += cnt; *pBitBufWord += cnt;
if(*pBitBufWord > hBitBuf->pBitBufEnd) { if(*pBitBufWord > hBitBuf->pBitBufEnd) {
*pBitBufWord -= (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1); *pBitBufWord -= (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1);
} }
if(*pBitBufWord < hBitBuf->pBitBufBase) { if(*pBitBufWord < hBitBuf->pBitBufBase) {
*pBitBufWord += (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1); *pBitBufWord += (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1);
} }
} }
@@ -57,18 +57,18 @@ HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf,
{ {
assert(bitBufSize*8 <= 32768); assert(bitBufSize*8 <= 32768);
hBitBuf->pBitBufBase = pBitBufBase; hBitBuf->pBitBufBase = pBitBufBase;
hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1; hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
hBitBuf->pWriteNext = pBitBufBase; hBitBuf->pWriteNext = pBitBufBase;
hBitBuf->cache = 0; hBitBuf->cache = 0;
hBitBuf->wBitPos = 0; hBitBuf->wBitPos = 0;
hBitBuf->cntBits = 0; hBitBuf->cntBits = 0;
hBitBuf->size = (bitBufSize << 3); hBitBuf->size = (bitBufSize << 3);
hBitBuf->isValid = 1; hBitBuf->isValid = 1;
return hBitBuf; return hBitBuf;
} }
@@ -82,8 +82,8 @@ HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf,
void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf) void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf)
{ {
if(*hBitBuf) if(*hBitBuf)
(*hBitBuf)->isValid = 0; (*hBitBuf)->isValid = 0;
*hBitBuf = NULL; *hBitBuf = NULL;
} }
/***************************************************************************** /*****************************************************************************
@@ -96,15 +96,15 @@ void ResetBitBuf(HANDLE_BIT_BUF hBitBuf,
UWord8 *pBitBufBase, UWord8 *pBitBufBase,
Word16 bitBufSize) Word16 bitBufSize)
{ {
hBitBuf->pBitBufBase = pBitBufBase; hBitBuf->pBitBufBase = pBitBufBase;
hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1; hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
hBitBuf->pWriteNext = pBitBufBase;
hBitBuf->wBitPos = 0; hBitBuf->pWriteNext = pBitBufBase;
hBitBuf->cntBits = 0;
hBitBuf->wBitPos = 0;
hBitBuf->cntBits = 0;
hBitBuf->cache = 0; hBitBuf->cache = 0;
} }
@@ -117,7 +117,7 @@ void ResetBitBuf(HANDLE_BIT_BUF hBitBuf,
void CopyBitBuf(HANDLE_BIT_BUF hBitBufSrc, void CopyBitBuf(HANDLE_BIT_BUF hBitBufSrc,
HANDLE_BIT_BUF hBitBufDst) HANDLE_BIT_BUF hBitBufDst)
{ {
*hBitBufDst = *hBitBufSrc; *hBitBufDst = *hBitBufSrc;
} }
/***************************************************************************** /*****************************************************************************
@@ -148,25 +148,25 @@ Word16 WriteBits(HANDLE_BIT_BUF hBitBuf,
if(noBitsToWrite == 0) if(noBitsToWrite == 0)
return noBitsToWrite; return noBitsToWrite;
hBitBuf->cntBits += noBitsToWrite; hBitBuf->cntBits += noBitsToWrite;
wBitPos = hBitBuf->wBitPos; wBitPos = hBitBuf->wBitPos;
wBitPos += noBitsToWrite; wBitPos += noBitsToWrite;
writeValue <<= 32 - wBitPos; writeValue <<= 32 - wBitPos;
writeValue |= hBitBuf->cache; writeValue |= hBitBuf->cache;
while (wBitPos >= 8) while (wBitPos >= 8)
{ {
UWord8 tmp; UWord8 tmp;
tmp = (UWord8)((writeValue >> 24) & 0xFF); tmp = (UWord8)((writeValue >> 24) & 0xFF);
*hBitBuf->pWriteNext++ = tmp; *hBitBuf->pWriteNext++ = tmp;
writeValue <<= 8; writeValue <<= 8;
wBitPos -= 8; wBitPos -= 8;
} }
hBitBuf->wBitPos = wBitPos; hBitBuf->wBitPos = wBitPos;
hBitBuf->cache = writeValue; hBitBuf->cache = writeValue;
return noBitsToWrite; return noBitsToWrite;
} }

View File

@@ -46,7 +46,7 @@ static Word32 encodeSpectralData(Word16 *sfbOffset,
Word16 i,sfb; Word16 i,sfb;
Word16 dbgVal; Word16 dbgVal;
SECTION_INFO* psectioninfo; SECTION_INFO* psectioninfo;
dbgVal = GetBitsAvail(hBitStream); dbgVal = GetBitsAvail(hBitStream);
for(i=0; i<sectionData->noOfSections; i++) { for(i=0; i<sectionData->noOfSections; i++) {
psectioninfo = &(sectionData->sectionInfo[i]); psectioninfo = &(sectionData->sectionInfo[i]);
@@ -100,7 +100,7 @@ static void encodeIcsInfo(Word16 blockType,
WriteBits(hBitStream,blockType,2); WriteBits(hBitStream,blockType,2);
WriteBits(hBitStream,windowShape,1); WriteBits(hBitStream,windowShape,1);
switch(blockType){ switch(blockType){
case LONG_WINDOW: case LONG_WINDOW:
case START_WINDOW: case START_WINDOW:
@@ -137,30 +137,30 @@ static Word32 encodeSectionData(SECTION_DATA *sectionData,
Word16 sectLen; Word16 sectLen;
Word16 i; Word16 i;
Word16 dbgVal=GetBitsAvail(hBitStream); Word16 dbgVal=GetBitsAvail(hBitStream);
switch(sectionData->blockType) switch(sectionData->blockType)
{ {
case LONG_WINDOW: case LONG_WINDOW:
case START_WINDOW: case START_WINDOW:
case STOP_WINDOW: case STOP_WINDOW:
sectEscapeVal = SECT_ESC_VAL_LONG; sectEscapeVal = SECT_ESC_VAL_LONG;
sectLenBits = SECT_BITS_LONG; sectLenBits = SECT_BITS_LONG;
break; break;
case SHORT_WINDOW: case SHORT_WINDOW:
sectEscapeVal = SECT_ESC_VAL_SHORT; sectEscapeVal = SECT_ESC_VAL_SHORT;
sectLenBits = SECT_BITS_SHORT; sectLenBits = SECT_BITS_SHORT;
break; break;
} }
for(i=0;i<sectionData->noOfSections;i++) { for(i=0;i<sectionData->noOfSections;i++) {
WriteBits(hBitStream,sectionData->sectionInfo[i].codeBook,4); WriteBits(hBitStream,sectionData->sectionInfo[i].codeBook,4);
sectLen = sectionData->sectionInfo[i].sfbCnt; sectLen = sectionData->sectionInfo[i].sfbCnt;
while(sectLen >= sectEscapeVal) { while(sectLen >= sectEscapeVal) {
WriteBits(hBitStream,sectEscapeVal,sectLenBits); WriteBits(hBitStream,sectEscapeVal,sectLenBits);
sectLen = sectLen - sectEscapeVal; sectLen = sectLen - sectEscapeVal;
} }
@@ -183,24 +183,24 @@ static Word32 encodeScaleFactorData(UWord16 *maxValueInSfb,
{ {
Word16 i,j,lastValScf,deltaScf; Word16 i,j,lastValScf,deltaScf;
Word16 dbgVal = GetBitsAvail(hBitStream); Word16 dbgVal = GetBitsAvail(hBitStream);
SECTION_INFO* psectioninfo; SECTION_INFO* psectioninfo;
lastValScf=scalefac[sectionData->firstScf]; lastValScf=scalefac[sectionData->firstScf];
for(i=0;i<sectionData->noOfSections;i++){ for(i=0;i<sectionData->noOfSections;i++){
psectioninfo = &(sectionData->sectionInfo[i]); psectioninfo = &(sectionData->sectionInfo[i]);
if (psectioninfo->codeBook != CODE_BOOK_ZERO_NO){ if (psectioninfo->codeBook != CODE_BOOK_ZERO_NO){
for (j=psectioninfo->sfbStart; for (j=psectioninfo->sfbStart;
j<psectioninfo->sfbStart+psectioninfo->sfbCnt; j++){ j<psectioninfo->sfbStart+psectioninfo->sfbCnt; j++){
if(maxValueInSfb[j] == 0) { if(maxValueInSfb[j] == 0) {
deltaScf = 0; deltaScf = 0;
} }
else { else {
deltaScf = lastValScf - scalefac[j]; deltaScf = lastValScf - scalefac[j];
lastValScf = scalefac[j]; lastValScf = scalefac[j];
} }
if(codeScalefactorDelta(deltaScf,hBitStream)){ if(codeScalefactorDelta(deltaScf,hBitStream)){
return(1); return(1);
} }
@@ -227,7 +227,7 @@ static void encodeMSInfo(Word16 sfbCnt,
{ {
Word16 sfb, sfbOff; Word16 sfb, sfbOff;
switch(msDigest) switch(msDigest)
{ {
case MS_NONE: case MS_NONE:
@@ -242,7 +242,7 @@ static void encodeMSInfo(Word16 sfbCnt,
WriteBits(hBitStream,SI_MS_MASK_SOME,2); WriteBits(hBitStream,SI_MS_MASK_SOME,2);
for(sfbOff = 0; sfbOff < sfbCnt; sfbOff+=grpSfb) { for(sfbOff = 0; sfbOff < sfbCnt; sfbOff+=grpSfb) {
for(sfb=0; sfb<maxSfb; sfb++) { for(sfb=0; sfb<maxSfb; sfb++) {
if(jsFlags[sfbOff+sfb] & MS_ON) { if(jsFlags[sfbOff+sfb] & MS_ON) {
WriteBits(hBitStream,1,1); WriteBits(hBitStream,1,1);
} }
@@ -272,7 +272,7 @@ static void encodeTnsData(TNS_INFO tnsInfo,
Word16 coefBits; Word16 coefBits;
Flag isShort; Flag isShort;
if (blockType==2) { if (blockType==2) {
isShort = 1; isShort = 1;
numOfWindows = TRANS_FAC; numOfWindows = TRANS_FAC;
@@ -282,52 +282,52 @@ static void encodeTnsData(TNS_INFO tnsInfo,
numOfWindows = 1; numOfWindows = 1;
} }
tnsPresent=0; tnsPresent=0;
for (i=0; i<numOfWindows; i++) { for (i=0; i<numOfWindows; i++) {
if (tnsInfo.tnsActive[i]) { if (tnsInfo.tnsActive[i]) {
tnsPresent=1; tnsPresent=1;
} }
} }
if (tnsPresent==0) { if (tnsPresent==0) {
WriteBits(hBitStream,0,1); WriteBits(hBitStream,0,1);
} }
else{ /* there is data to be written*/ else{ /* there is data to be written*/
WriteBits(hBitStream,1,1); /*data_present */ WriteBits(hBitStream,1,1); /*data_present */
for (i=0; i<numOfWindows; i++) { for (i=0; i<numOfWindows; i++) {
WriteBits(hBitStream,tnsInfo.tnsActive[i],(isShort?1:2)); WriteBits(hBitStream,tnsInfo.tnsActive[i],(isShort?1:2));
if (tnsInfo.tnsActive[i]) { if (tnsInfo.tnsActive[i]) {
WriteBits(hBitStream,((tnsInfo.coefRes[i] - 4)==0?1:0),1); WriteBits(hBitStream,((tnsInfo.coefRes[i] - 4)==0?1:0),1);
WriteBits(hBitStream,tnsInfo.length[i],(isShort?4:6)); WriteBits(hBitStream,tnsInfo.length[i],(isShort?4:6));
WriteBits(hBitStream,tnsInfo.order[i],(isShort?3:5)); WriteBits(hBitStream,tnsInfo.order[i],(isShort?3:5));
if (tnsInfo.order[i]){ if (tnsInfo.order[i]){
WriteBits(hBitStream, FILTER_DIRECTION, 1); WriteBits(hBitStream, FILTER_DIRECTION, 1);
if(tnsInfo.coefRes[i] == 4) { if(tnsInfo.coefRes[i] == 4) {
coefBits = 3; coefBits = 3;
for(k=0; k<tnsInfo.order[i]; k++) { for(k=0; k<tnsInfo.order[i]; k++) {
if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 3 || if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 3 ||
tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -4) { tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -4) {
coefBits = 4; coefBits = 4;
break; break;
} }
} }
} }
else { else {
coefBits = 2; coefBits = 2;
for(k=0; k<tnsInfo.order[i]; k++) { for(k=0; k<tnsInfo.order[i]; k++) {
if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 1 || if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 1 ||
tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -2) { tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -2) {
coefBits = 3; coefBits = 3;
break; break;
} }
} }
@@ -335,7 +335,7 @@ static void encodeTnsData(TNS_INFO tnsInfo,
WriteBits(hBitStream, tnsInfo.coefRes[i] - coefBits, 1); /*coef_compres*/ WriteBits(hBitStream, tnsInfo.coefRes[i] - coefBits, 1); /*coef_compres*/
for (k=0; k<tnsInfo.order[i]; k++ ) { for (k=0; k<tnsInfo.order[i]; k++ ) {
static const Word16 rmask[] = {0,1,3,7,15}; static const Word16 rmask[] = {0,1,3,7,15};
WriteBits(hBitStream,tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] & rmask[coefBits],coefBits); WriteBits(hBitStream,tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] & rmask[coefBits],coefBits);
} }
} }
@@ -397,7 +397,7 @@ writeIndividualChannelStream(Flag commonWindow,
encodeGlobalGain(globalGain, logNorm,scf[sectionData->firstScf], hBitStream); encodeGlobalGain(globalGain, logNorm,scf[sectionData->firstScf], hBitStream);
if(!commonWindow) { if(!commonWindow) {
encodeIcsInfo(sectionData->blockType, windowShape, groupingMask, sectionData, hBitStream); encodeIcsInfo(sectionData->blockType, windowShape, groupingMask, sectionData, hBitStream);
} }
@@ -536,7 +536,7 @@ static void writeFillElement( const UWord8 *ancBytes,
Write fill Element(s): Write fill Element(s):
amount of a fill element can be 7+X*8 Bits, X element of [0..270] amount of a fill element can be 7+X*8 Bits, X element of [0..270]
*/ */
while(totFillBits >= (3+4)) { while(totFillBits >= (3+4)) {
cnt = min(((totFillBits - (3+4)) >> 3), ((1<<4)-1)); cnt = min(((totFillBits - (3+4)) >> 3), ((1<<4)-1));
@@ -545,7 +545,7 @@ static void writeFillElement( const UWord8 *ancBytes,
totFillBits = totFillBits - (3+4); totFillBits = totFillBits - (3+4);
if ((cnt == (1<<4)-1)) { if ((cnt == (1<<4)-1)) {
esc_count = min( ((totFillBits >> 3) - ((1<<4)-1)), (1<<8)-1); esc_count = min( ((totFillBits >> 3) - ((1<<4)-1)), (1<<8)-1);
@@ -555,7 +555,7 @@ static void writeFillElement( const UWord8 *ancBytes,
} }
for(i=0;i<cnt;i++) { for(i=0;i<cnt;i++) {
if(ancBytes) if(ancBytes)
WriteBits(hBitStream, *ancBytes++,8); WriteBits(hBitStream, *ancBytes++,8);
else else
@@ -576,7 +576,7 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
ELEMENT_INFO elInfo, ELEMENT_INFO elInfo,
QC_OUT *qcOut, QC_OUT *qcOut,
PSY_OUT *psyOut, PSY_OUT *psyOut,
Word16 *globUsedBits, Word16 *globUsedBits,
const UWord8 *ancBytes, const UWord8 *ancBytes,
Word16 sampindex Word16 sampindex
) /* returns error code */ ) /* returns error code */
@@ -586,7 +586,7 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
Word16 frameBits=0; Word16 frameBits=0;
/* struct bitbuffer bsWriteCopy; */ /* struct bitbuffer bsWriteCopy; */
bitMarkUp = GetBitsAvail(hBitStream); bitMarkUp = GetBitsAvail(hBitStream);
if(qcOut->qcElement.adtsUsed) /* write adts header*/ if(qcOut->qcElement.adtsUsed) /* write adts header*/
{ {
WriteBits(hBitStream, 0xFFF, 12); /* 12 bit Syncword */ WriteBits(hBitStream, 0xFFF, 12); /* 12 bit Syncword */
@@ -601,23 +601,23 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
6 channels or less, else a channel 6 channels or less, else a channel
configuration should be written */ configuration should be written */
WriteBits(hBitStream, 0, 1); /* original/copy */ WriteBits(hBitStream, 0, 1); /* original/copy */
WriteBits(hBitStream, 0, 1); /* home */ WriteBits(hBitStream, 0, 1); /* home */
/* Variable ADTS header */ /* Variable ADTS header */
WriteBits(hBitStream, 0, 1); /* copyr. id. bit */ WriteBits(hBitStream, 0, 1); /* copyr. id. bit */
WriteBits(hBitStream, 0, 1); /* copyr. id. start */ WriteBits(hBitStream, 0, 1); /* copyr. id. start */
WriteBits(hBitStream, *globUsedBits >> 3, 13); WriteBits(hBitStream, *globUsedBits >> 3, 13);
WriteBits(hBitStream, 0x7FF, 11); /* buffer fullness (0x7FF for VBR) */ WriteBits(hBitStream, 0x7FF, 11); /* buffer fullness (0x7FF for VBR) */
WriteBits(hBitStream, 0, 2); /* raw data blocks (0+1=1) */ WriteBits(hBitStream, 0, 2); /* raw data blocks (0+1=1) */
} }
*globUsedBits=0; *globUsedBits=0;
{ {
Word16 *sfbOffset[2]; Word16 *sfbOffset[2];
TNS_INFO tnsInfo[2]; TNS_INFO tnsInfo[2];
elementUsedBits = 0; elementUsedBits = 0;
switch (elInfo.elType) { switch (elInfo.elType) {
@@ -636,7 +636,7 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
{ {
Word16 msDigest; Word16 msDigest;
Word16 *msFlags = psyOut->psyOutElement.toolsInfo.msMask; Word16 *msFlags = psyOut->psyOutElement.toolsInfo.msMask;
msDigest = psyOut->psyOutElement.toolsInfo.msDigest; msDigest = psyOut->psyOutElement.toolsInfo.msDigest;
sfbOffset[0] = sfbOffset[0] =
psyOut->psyOutChannel[elInfo.ChannelIndex[0]].sfbOffsets; psyOut->psyOutChannel[elInfo.ChannelIndex[0]].sfbOffsets;
sfbOffset[1] = sfbOffset[1] =
@@ -668,20 +668,20 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
} }
writeFillElement(NULL, writeFillElement(NULL,
qcOut->totFillBits, qcOut->totFillBits,
hBitStream); hBitStream);
WriteBits(hBitStream,ID_END,3); WriteBits(hBitStream,ID_END,3);
/* byte alignement */ /* byte alignement */
WriteBits(hBitStream,0, (8 - (hBitStream->cntBits & 7)) & 7); WriteBits(hBitStream,0, (8 - (hBitStream->cntBits & 7)) & 7);
*globUsedBits = *globUsedBits- bitMarkUp; *globUsedBits = *globUsedBits- bitMarkUp;
bitMarkUp = GetBitsAvail(hBitStream); bitMarkUp = GetBitsAvail(hBitStream);
*globUsedBits = *globUsedBits + bitMarkUp; *globUsedBits = *globUsedBits + bitMarkUp;
frameBits = frameBits + *globUsedBits; frameBits = frameBits + *globUsedBits;
if (frameBits != (qcOut->totStaticBitsUsed+qcOut->totDynBitsUsed + qcOut->totAncBitsUsed + if (frameBits != (qcOut->totStaticBitsUsed+qcOut->totDynBitsUsed + qcOut->totAncBitsUsed +
qcOut->totFillBits + qcOut->alignBits)) { qcOut->totFillBits + qcOut->alignBits)) {
return(-1); return(-1);

View File

@@ -52,7 +52,7 @@ CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
IIR high pass coeffs IIR high pass coeffs
*/ */
Word32 hiPassCoeff[BLOCK_SWITCHING_IIR_LEN] = { Word32 hiPassCoeff[BLOCK_SWITCHING_IIR_LEN] = {
0xbec8b439, 0x609d4952 /* -0.5095f, 0.7548f */ 0xbec8b439, 0x609d4952 /* -0.5095f, 0.7548f */
}; };
static const Word32 accWindowNrgFac = 0x26666666; /* factor for accumulating filtered window energies 0.3 */ static const Word32 accWindowNrgFac = 0x26666666; /* factor for accumulating filtered window energies 0.3 */
@@ -76,8 +76,8 @@ Word16 InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
const Word32 bitRate, const Word16 nChannels) const Word32 bitRate, const Word16 nChannels)
{ {
/* select attackRatio */ /* select attackRatio */
if ((sub(nChannels,1)==0 && L_sub(bitRate, 24000) > 0) || if ((sub(nChannels,1)==0 && L_sub(bitRate, 24000) > 0) ||
(sub(nChannels,1)>0 && bitRate > (nChannels * 16000))) { (sub(nChannels,1)>0 && bitRate > (nChannels * 16000))) {
blockSwitchingControl->invAttackRatio = invAttackRatioHighBr; blockSwitchingControl->invAttackRatio = invAttackRatioHighBr;
} }
@@ -116,7 +116,7 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
/* Reset grouping info */ /* Reset grouping info */
for (i=0; i<TRANS_FAC; i++) { for (i=0; i<TRANS_FAC; i++) {
blockSwitchingControl->groupLen[i] = 0; blockSwitchingControl->groupLen[i] = 0;
} }
@@ -125,21 +125,21 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
&blockSwitchingControl->attackIndex, &blockSwitchingControl->attackIndex,
BLOCK_SWITCH_WINDOWS); BLOCK_SWITCH_WINDOWS);
blockSwitchingControl->attackIndex = blockSwitchingControl->lastAttackIndex; blockSwitchingControl->attackIndex = blockSwitchingControl->lastAttackIndex;
/* Set grouping info */ /* Set grouping info */
blockSwitchingControl->noOfGroups = MAX_NO_OF_GROUPS; blockSwitchingControl->noOfGroups = MAX_NO_OF_GROUPS;
for (i=0; i<MAX_NO_OF_GROUPS; i++) { for (i=0; i<MAX_NO_OF_GROUPS; i++) {
blockSwitchingControl->groupLen[i] = suggestedGroupingTable[blockSwitchingControl->attackIndex][i]; blockSwitchingControl->groupLen[i] = suggestedGroupingTable[blockSwitchingControl->attackIndex][i];
} }
/* if the samplerate is less than 16000, it should be all the short block, avoid pre&post echo */ /* if the samplerate is less than 16000, it should be all the short block, avoid pre&post echo */
if(sampleRate >= 16000) { if(sampleRate >= 16000) {
/* Save current window energy as last window energy */ /* Save current window energy as last window energy */
for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) { for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) {
blockSwitchingControl->windowNrg[0][w] = blockSwitchingControl->windowNrg[1][w]; blockSwitchingControl->windowNrg[0][w] = blockSwitchingControl->windowNrg[1][w];
blockSwitchingControl->windowNrgF[0][w] = blockSwitchingControl->windowNrgF[1][w]; blockSwitchingControl->windowNrgF[0][w] = blockSwitchingControl->windowNrgF[1][w];
} }
@@ -147,10 +147,10 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
CalcWindowEnergy(blockSwitchingControl, timeSignal, chIncrement, BLOCK_SWITCH_WINDOW_LEN); CalcWindowEnergy(blockSwitchingControl, timeSignal, chIncrement, BLOCK_SWITCH_WINDOW_LEN);
/* reset attack */ /* reset attack */
blockSwitchingControl->attack = FALSE; blockSwitchingControl->attack = FALSE;
enMax = 0; enMax = 0;
enM1 = blockSwitchingControl->windowNrgF[0][BLOCK_SWITCH_WINDOWS-1]; enM1 = blockSwitchingControl->windowNrgF[0][BLOCK_SWITCH_WINDOWS-1];
for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) { for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) {
Word32 enM1_Tmp, accWindowNrg_Tmp, windowNrgF_Tmp; Word32 enM1_Tmp, accWindowNrg_Tmp, windowNrgF_Tmp;
@@ -172,15 +172,15 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
/* if the energy with the ratio is bigger than the average, and the attack and short block */ /* if the energy with the ratio is bigger than the average, and the attack and short block */
if ((fixmul(windowNrgF_Tmp, blockSwitchingControl->invAttackRatio) >> windowNrgF_Shf) > if ((fixmul(windowNrgF_Tmp, blockSwitchingControl->invAttackRatio) >> windowNrgF_Shf) >
blockSwitchingControl->accWindowNrg ) { blockSwitchingControl->accWindowNrg ) {
blockSwitchingControl->attack = TRUE; blockSwitchingControl->attack = TRUE;
blockSwitchingControl->lastAttackIndex = w; blockSwitchingControl->lastAttackIndex = w;
} }
enM1 = blockSwitchingControl->windowNrgF[1][w]; enM1 = blockSwitchingControl->windowNrgF[1][w];
enMax = max(enMax, enM1); enMax = max(enMax, enM1);
} }
if (enMax < minAttackNrg) { if (enMax < minAttackNrg) {
blockSwitchingControl->attack = FALSE; blockSwitchingControl->attack = FALSE;
} }
} }
else else
@@ -188,22 +188,22 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
blockSwitchingControl->attack = TRUE; blockSwitchingControl->attack = TRUE;
} }
/* Check if attack spreads over frame border */ /* Check if attack spreads over frame border */
if ((!blockSwitchingControl->attack) && (blockSwitchingControl->lastattack)) { if ((!blockSwitchingControl->attack) && (blockSwitchingControl->lastattack)) {
if (blockSwitchingControl->attackIndex == TRANS_FAC-1) { if (blockSwitchingControl->attackIndex == TRANS_FAC-1) {
blockSwitchingControl->attack = TRUE; blockSwitchingControl->attack = TRUE;
} }
blockSwitchingControl->lastattack = FALSE; blockSwitchingControl->lastattack = FALSE;
} }
else { else {
blockSwitchingControl->lastattack = blockSwitchingControl->attack; blockSwitchingControl->lastattack = blockSwitchingControl->attack;
} }
blockSwitchingControl->windowSequence = blockSwitchingControl->nextwindowSequence; blockSwitchingControl->windowSequence = blockSwitchingControl->nextwindowSequence;
if (blockSwitchingControl->attack) { if (blockSwitchingControl->attack) {
blockSwitchingControl->nextwindowSequence = SHORT_WINDOW; blockSwitchingControl->nextwindowSequence = SHORT_WINDOW;
} }
@@ -211,27 +211,27 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
blockSwitchingControl->nextwindowSequence = LONG_WINDOW; blockSwitchingControl->nextwindowSequence = LONG_WINDOW;
} }
/* update short block group */ /* update short block group */
if (blockSwitchingControl->nextwindowSequence == SHORT_WINDOW) { if (blockSwitchingControl->nextwindowSequence == SHORT_WINDOW) {
if (blockSwitchingControl->windowSequence== LONG_WINDOW) { if (blockSwitchingControl->windowSequence== LONG_WINDOW) {
blockSwitchingControl->windowSequence = START_WINDOW; blockSwitchingControl->windowSequence = START_WINDOW;
} }
if (blockSwitchingControl->windowSequence == STOP_WINDOW) { if (blockSwitchingControl->windowSequence == STOP_WINDOW) {
blockSwitchingControl->windowSequence = SHORT_WINDOW; blockSwitchingControl->windowSequence = SHORT_WINDOW;
blockSwitchingControl->noOfGroups = 3; blockSwitchingControl->noOfGroups = 3;
blockSwitchingControl->groupLen[0] = 3; blockSwitchingControl->groupLen[0] = 3;
blockSwitchingControl->groupLen[1] = 3; blockSwitchingControl->groupLen[1] = 3;
blockSwitchingControl->groupLen[2] = 2; blockSwitchingControl->groupLen[2] = 2;
} }
} }
/* update block type */ /* update block type */
if (blockSwitchingControl->nextwindowSequence == LONG_WINDOW) { if (blockSwitchingControl->nextwindowSequence == LONG_WINDOW) {
if (blockSwitchingControl->windowSequence == SHORT_WINDOW) { if (blockSwitchingControl->windowSequence == SHORT_WINDOW) {
blockSwitchingControl->nextwindowSequence = STOP_WINDOW; blockSwitchingControl->nextwindowSequence = STOP_WINDOW;
} }
} }
@@ -252,17 +252,17 @@ static Word32 SrchMaxWithIndex(const Word32 in[], Word16 *index, Word16 n)
Word32 i, idx; Word32 i, idx;
/* Search maximum value in array and return index and value */ /* Search maximum value in array and return index and value */
max = 0; max = 0;
idx = 0; idx = 0;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
if (in[i+1] > max) { if (in[i+1] > max) {
max = in[i+1]; max = in[i+1];
idx = i; idx = i;
} }
} }
*index = idx; *index = idx;
return(max); return(max);
} }
@@ -292,11 +292,11 @@ Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
states1 = blockSwitchingControl->iirStates[1]; states1 = blockSwitchingControl->iirStates[1];
Coeff0 = hiPassCoeff[0]; Coeff0 = hiPassCoeff[0];
Coeff1 = hiPassCoeff[1]; Coeff1 = hiPassCoeff[1];
tidx = 0; tidx = 0;
for (w=0; w < BLOCK_SWITCH_WINDOWS; w++) { for (w=0; w < BLOCK_SWITCH_WINDOWS; w++) {
accuUE = 0; accuUE = 0;
accuFE = 0; accuFE = 0;
for(i=0; i<windowLen; i++) { for(i=0; i<windowLen; i++) {
Word32 accu1, accu2, accu3; Word32 accu1, accu2, accu3;
@@ -309,16 +309,16 @@ Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
accu3 = accu1 - states0; accu3 = accu1 - states0;
out = accu3 - accu2; out = accu3 - accu2;
states0 = accu1; states0 = accu1;
states1 = out; states1 = out;
tempFiltered = extract_h(out); tempFiltered = extract_h(out);
accuUE += (tempUnfiltered * tempUnfiltered) >> ENERGY_SHIFT; accuUE += (tempUnfiltered * tempUnfiltered) >> ENERGY_SHIFT;
accuFE += (tempFiltered * tempFiltered) >> ENERGY_SHIFT; accuFE += (tempFiltered * tempFiltered) >> ENERGY_SHIFT;
} }
blockSwitchingControl->windowNrg[1][w] = accuUE; blockSwitchingControl->windowNrg[1][w] = accuUE;
blockSwitchingControl->windowNrgF[1][w] = accuFE; blockSwitchingControl->windowNrgF[1][w] = accuFE;
} }
@@ -346,8 +346,8 @@ static Word16 IIRFilter(const Word16 in, const Word32 coeff[], Word32 states[])
accu2 = fixmul( coeff[0], states[1] ); accu2 = fixmul( coeff[0], states[1] );
out = accu3 - accu2; out = accu3 - accu2;
states[0] = accu1; states[0] = accu1;
states[1] = out; states[1] = out;
return round16(out); return round16(out);
} }
@@ -374,54 +374,54 @@ Word16 SyncBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControlLeft,
const Word16 nChannels) const Word16 nChannels)
{ {
Word16 i; Word16 i;
Word16 patchType = LONG_WINDOW; Word16 patchType = LONG_WINDOW;
if (nChannels == 1) { /* Mono */ if (nChannels == 1) { /* Mono */
if (blockSwitchingControlLeft->windowSequence != SHORT_WINDOW) { if (blockSwitchingControlLeft->windowSequence != SHORT_WINDOW) {
blockSwitchingControlLeft->noOfGroups = 1; blockSwitchingControlLeft->noOfGroups = 1;
blockSwitchingControlLeft->groupLen[0] = 1; blockSwitchingControlLeft->groupLen[0] = 1;
for (i=1; i<TRANS_FAC; i++) { for (i=1; i<TRANS_FAC; i++) {
blockSwitchingControlLeft->groupLen[i] = 0; blockSwitchingControlLeft->groupLen[i] = 0;
} }
} }
} }
else { /* Stereo common Window */ else { /* Stereo common Window */
patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlLeft->windowSequence]; patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlLeft->windowSequence];
patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlRight->windowSequence]; patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlRight->windowSequence];
/* Set synchronized Blocktype */ /* Set synchronized Blocktype */
blockSwitchingControlLeft->windowSequence = patchType; blockSwitchingControlLeft->windowSequence = patchType;
blockSwitchingControlRight->windowSequence = patchType; blockSwitchingControlRight->windowSequence = patchType;
/* Synchronize grouping info */ /* Synchronize grouping info */
if(patchType != SHORT_WINDOW) { /* Long Blocks */ if(patchType != SHORT_WINDOW) { /* Long Blocks */
/* Set grouping info */ /* Set grouping info */
blockSwitchingControlLeft->noOfGroups = 1; blockSwitchingControlLeft->noOfGroups = 1;
blockSwitchingControlRight->noOfGroups = 1; blockSwitchingControlRight->noOfGroups = 1;
blockSwitchingControlLeft->groupLen[0] = 1; blockSwitchingControlLeft->groupLen[0] = 1;
blockSwitchingControlRight->groupLen[0] = 1; blockSwitchingControlRight->groupLen[0] = 1;
for (i=1; i<TRANS_FAC; i++) { for (i=1; i<TRANS_FAC; i++) {
blockSwitchingControlLeft->groupLen[i] = 0; blockSwitchingControlLeft->groupLen[i] = 0;
blockSwitchingControlRight->groupLen[i] = 0; blockSwitchingControlRight->groupLen[i] = 0;
} }
} }
else { else {
if (blockSwitchingControlLeft->maxWindowNrg > blockSwitchingControlRight->maxWindowNrg) { if (blockSwitchingControlLeft->maxWindowNrg > blockSwitchingControlRight->maxWindowNrg) {
/* Left Channel wins */ /* Left Channel wins */
blockSwitchingControlRight->noOfGroups = blockSwitchingControlLeft->noOfGroups; blockSwitchingControlRight->noOfGroups = blockSwitchingControlLeft->noOfGroups;
for (i=0; i<TRANS_FAC; i++) { for (i=0; i<TRANS_FAC; i++) {
blockSwitchingControlRight->groupLen[i] = blockSwitchingControlLeft->groupLen[i]; blockSwitchingControlRight->groupLen[i] = blockSwitchingControlLeft->groupLen[i];
} }
} }
else { else {
/* Right Channel wins */ /* Right Channel wins */
blockSwitchingControlLeft->noOfGroups = blockSwitchingControlRight->noOfGroups; blockSwitchingControlLeft->noOfGroups = blockSwitchingControlRight->noOfGroups;
for (i=0; i<TRANS_FAC; i++) { for (i=0; i<TRANS_FAC; i++) {
blockSwitchingControlLeft->groupLen[i] = blockSwitchingControlRight->groupLen[i]; blockSwitchingControlLeft->groupLen[i] = blockSwitchingControlRight->groupLen[i];
} }
} }
} }

View File

@@ -29,32 +29,32 @@ static const Word16 maxChannelBits = MAXBITS_COEF;
static Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType) static Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType)
{ {
Word16 error=0; Word16 error=0;
elInfo->elType=elType; elInfo->elType=elType;
switch(elInfo->elType) { switch(elInfo->elType) {
case ID_SCE: case ID_SCE:
elInfo->nChannelsInEl=1; elInfo->nChannelsInEl=1;
elInfo->ChannelIndex[0]=0; elInfo->ChannelIndex[0]=0;
elInfo->instanceTag=0; elInfo->instanceTag=0;
break; break;
case ID_CPE: case ID_CPE:
elInfo->nChannelsInEl=2; elInfo->nChannelsInEl=2;
elInfo->ChannelIndex[0]=0; elInfo->ChannelIndex[0]=0;
elInfo->ChannelIndex[1]=1; elInfo->ChannelIndex[1]=1;
elInfo->instanceTag=0; elInfo->instanceTag=0;
break; break;
default: default:
error=1; error=1;
} }
return error; return error;
@@ -64,11 +64,11 @@ static Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType)
Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo) Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo)
{ {
Word16 error; Word16 error;
error = 0; error = 0;
switch(nChannels) { switch(nChannels) {
case 1: case 1:
initElement(elInfo, ID_SCE); initElement(elInfo, ID_SCE);
break; break;
@@ -77,7 +77,7 @@ Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo)
break; break;
default: default:
error=4; error=4;
} }
return error; return error;
@@ -91,18 +91,18 @@ Word16 InitElementBits(ELEMENT_BITS *elementBits,
Word16 staticBitsTot) Word16 staticBitsTot)
{ {
Word16 error; Word16 error;
error = 0; error = 0;
switch(elInfo.nChannelsInEl) { switch(elInfo.nChannelsInEl) {
case 1: case 1:
elementBits->chBitrate = bitrateTot; elementBits->chBitrate = bitrateTot;
elementBits->averageBits = averageBitsTot - staticBitsTot; elementBits->averageBits = averageBitsTot - staticBitsTot;
elementBits->maxBits = maxChannelBits; elementBits->maxBits = maxChannelBits;
elementBits->maxBitResBits = maxChannelBits - averageBitsTot; elementBits->maxBitResBits = maxChannelBits - averageBitsTot;
elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7); elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
elementBits->bitResLevel = elementBits->maxBitResBits; elementBits->bitResLevel = elementBits->maxBitResBits;
elementBits->relativeBits = 0x4000; /* 1.0f/2 */ elementBits->relativeBits = 0x4000; /* 1.0f/2 */
break; break;
case 2: case 2:
@@ -111,13 +111,13 @@ Word16 InitElementBits(ELEMENT_BITS *elementBits,
elementBits->maxBits = maxChannelBits << 1; elementBits->maxBits = maxChannelBits << 1;
elementBits->maxBitResBits = (maxChannelBits << 1) - averageBitsTot; elementBits->maxBitResBits = (maxChannelBits << 1) - averageBitsTot;
elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7); elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
elementBits->bitResLevel = elementBits->maxBitResBits; elementBits->bitResLevel = elementBits->maxBitResBits;
elementBits->relativeBits = 0x4000; /* 1.0f/2 */ elementBits->relativeBits = 0x4000; /* 1.0f/2 */
break; break;
default: default:
error = 1; error = 1;
} }
return error; return error;
} }

View File

@@ -45,12 +45,12 @@ buildBitLookUp(const Word16 *quantSpectrum,
for (i=0; i<maxSfb; i++) { for (i=0; i<maxSfb; i++) {
Word16 sfbWidth, maxVal; Word16 sfbWidth, maxVal;
sectionInfo[i].sfbCnt = 1; sectionInfo[i].sfbCnt = 1;
sectionInfo[i].sfbStart = i; sectionInfo[i].sfbStart = i;
sectionInfo[i].sectionBits = INVALID_BITCOUNT; sectionInfo[i].sectionBits = INVALID_BITCOUNT;
sectionInfo[i].codeBook = -1; sectionInfo[i].codeBook = -1;
sfbWidth = sfbOffset[i + 1] - sfbOffset[i]; sfbWidth = sfbOffset[i + 1] - sfbOffset[i];
maxVal = sfbMax[i]; maxVal = sfbMax[i];
bitCount(quantSpectrum + sfbOffset[i], sfbWidth, maxVal, bitLookUp[i]); bitCount(quantSpectrum + sfbOffset[i], sfbWidth, maxVal, bitLookUp[i]);
} }
} }
@@ -66,13 +66,13 @@ static Word16
findBestBook(const Word16 *bc, Word16 *book) findBestBook(const Word16 *bc, Word16 *book)
{ {
Word32 minBits, j; Word32 minBits, j;
minBits = INVALID_BITCOUNT; minBits = INVALID_BITCOUNT;
for (j=0; j<=CODE_BOOK_ESC_NDX; j++) { for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
if (bc[j] < minBits) { if (bc[j] < minBits) {
minBits = bc[j]; minBits = bc[j];
*book = j; *book = j;
} }
} }
return extract_l(minBits); return extract_l(minBits);
@@ -82,12 +82,12 @@ static Word16
findMinMergeBits(const Word16 *bc1, const Word16 *bc2) findMinMergeBits(const Word16 *bc1, const Word16 *bc2)
{ {
Word32 minBits, j, sum; Word32 minBits, j, sum;
minBits = INVALID_BITCOUNT; minBits = INVALID_BITCOUNT;
for (j=0; j<=CODE_BOOK_ESC_NDX; j++) { for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
sum = bc1[j] + bc2[j]; sum = bc1[j] + bc2[j];
if (sum < minBits) { if (sum < minBits) {
minBits = sum; minBits = sum;
} }
} }
return extract_l(minBits); return extract_l(minBits);
@@ -109,13 +109,13 @@ findMaxMerge(const Word16 mergeGainLookUp[MAX_SFB_LONG],
const Word16 maxSfb, Word16 *maxNdx) const Word16 maxSfb, Word16 *maxNdx)
{ {
Word32 i, maxMergeGain; Word32 i, maxMergeGain;
maxMergeGain = 0; maxMergeGain = 0;
for (i=0; i+sectionInfo[i].sfbCnt < maxSfb; i += sectionInfo[i].sfbCnt) { for (i=0; i+sectionInfo[i].sfbCnt < maxSfb; i += sectionInfo[i].sfbCnt) {
if (mergeGainLookUp[i] > maxMergeGain) { if (mergeGainLookUp[i] > maxMergeGain) {
maxMergeGain = mergeGainLookUp[i]; maxMergeGain = mergeGainLookUp[i];
*maxNdx = i; *maxNdx = i;
} }
} }
return extract_l(maxMergeGain); return extract_l(maxMergeGain);
@@ -159,7 +159,7 @@ gmStage0(SECTION_INFO * sectionInfo,
for (i=0; i<maxSfb; i++) { for (i=0; i<maxSfb; i++) {
/* Side-Info bits will be calculated in Stage 1! */ /* Side-Info bits will be calculated in Stage 1! */
if (sectionInfo[i].sectionBits == INVALID_BITCOUNT) { if (sectionInfo[i].sectionBits == INVALID_BITCOUNT) {
sectionInfo[i].sectionBits = findBestBook(bitLookUp[i], &(sectionInfo[i].codeBook)); sectionInfo[i].sectionBits = findBestBook(bitLookUp[i], &(sectionInfo[i].codeBook));
} }
@@ -180,13 +180,13 @@ gmStage1(SECTION_INFO * sectionInfo,
SECTION_INFO * sectionInfo_s; SECTION_INFO * sectionInfo_s;
SECTION_INFO * sectionInfo_e; SECTION_INFO * sectionInfo_e;
Word32 mergeStart, mergeEnd; Word32 mergeStart, mergeEnd;
mergeStart = 0; mergeStart = 0;
do { do {
sectionInfo_s = sectionInfo + mergeStart; sectionInfo_s = sectionInfo + mergeStart;
for (mergeEnd=mergeStart+1; mergeEnd<maxSfb; mergeEnd++) { for (mergeEnd=mergeStart+1; mergeEnd<maxSfb; mergeEnd++) {
sectionInfo_e = sectionInfo + mergeEnd; sectionInfo_e = sectionInfo + mergeEnd;
if (sectionInfo_s->codeBook != sectionInfo_e->codeBook) if (sectionInfo_s->codeBook != sectionInfo_e->codeBook)
break; break;
sectionInfo_s->sfbCnt += 1; sectionInfo_s->sfbCnt += 1;
@@ -196,11 +196,11 @@ gmStage1(SECTION_INFO * sectionInfo,
} }
sectionInfo_s->sectionBits += sideInfoTab[sectionInfo_s->sfbCnt]; sectionInfo_s->sectionBits += sideInfoTab[sectionInfo_s->sfbCnt];
sectionInfo[mergeEnd - 1].sfbStart = sectionInfo_s->sfbStart; /* speed up prev search */ sectionInfo[mergeEnd - 1].sfbStart = sectionInfo_s->sfbStart; /* speed up prev search */
mergeStart = mergeEnd;
mergeStart = mergeEnd;
} while (mergeStart - maxSfb < 0); } while (mergeStart - maxSfb < 0);
} }
@@ -230,7 +230,7 @@ gmStage2(SECTION_INFO *sectionInfo,
maxMergeGain = findMaxMerge(mergeGainLookUp, sectionInfo, maxSfb, &maxNdx); maxMergeGain = findMaxMerge(mergeGainLookUp, sectionInfo, maxSfb, &maxNdx);
if (maxMergeGain <= 0) if (maxMergeGain <= 0)
break; break;
@@ -244,7 +244,7 @@ gmStage2(SECTION_INFO *sectionInfo,
mergeBitLookUp(bitLookUp[maxNdx], bitLookUp[maxNdxNext]); mergeBitLookUp(bitLookUp[maxNdx], bitLookUp[maxNdxNext]);
if (maxNdx != 0) { if (maxNdx != 0) {
maxNdxLast = sectionInfo[maxNdx - 1].sfbStart; maxNdxLast = sectionInfo[maxNdx - 1].sfbStart;
mergeGainLookUp[maxNdxLast] = CalcMergeGain(sectionInfo, mergeGainLookUp[maxNdxLast] = CalcMergeGain(sectionInfo,
@@ -255,9 +255,9 @@ gmStage2(SECTION_INFO *sectionInfo,
} }
maxNdxNext = maxNdx + sectionInfo[maxNdx].sfbCnt; maxNdxNext = maxNdx + sectionInfo[maxNdx].sfbCnt;
sectionInfo[maxNdxNext - 1].sfbStart = sectionInfo[maxNdx].sfbStart; sectionInfo[maxNdxNext - 1].sfbStart = sectionInfo[maxNdx].sfbStart;
if (maxNdxNext - maxSfb < 0) { if (maxNdxNext - maxSfb < 0) {
mergeGainLookUp[maxNdx] = CalcMergeGain(sectionInfo, mergeGainLookUp[maxNdx] = CalcMergeGain(sectionInfo,
bitLookUp, bitLookUp,
@@ -286,7 +286,7 @@ noiselessCounter(SECTION_DATA *sectionData,
/* /*
use appropriate side info table use appropriate side info table
*/ */
switch (blockType) switch (blockType)
{ {
case LONG_WINDOW: case LONG_WINDOW:
@@ -300,11 +300,11 @@ noiselessCounter(SECTION_DATA *sectionData,
} }
sectionData->noOfSections = 0; sectionData->noOfSections = 0;
sectionData->huffmanBits = 0; sectionData->huffmanBits = 0;
sectionData->sideInfoBits = 0; sectionData->sideInfoBits = 0;
if (sectionData->maxSfbPerGroup == 0) if (sectionData->maxSfbPerGroup == 0)
return; return;
@@ -353,7 +353,7 @@ noiselessCounter(SECTION_DATA *sectionData,
sectionData->huffmanBits = (sectionData->huffmanBits + sectionData->huffmanBits = (sectionData->huffmanBits +
(sectionInfo[i].sectionBits - sideInfoTab[sectionInfo[i].sfbCnt])); (sectionInfo[i].sectionBits - sideInfoTab[sectionInfo[i].sfbCnt]));
sectionData->sideInfoBits = (sectionData->sideInfoBits + sideInfoTab[sectionInfo[i].sfbCnt]); sectionData->sideInfoBits = (sectionData->sideInfoBits + sideInfoTab[sectionInfo[i].sfbCnt]);
sectionData->sectionInfo[sectionData->noOfSections] = sectionInfo[i]; sectionData->sectionInfo[sectionData->noOfSections] = sectionInfo[i];
sectionData->noOfSections = sectionData->noOfSections + 1; sectionData->noOfSections = sectionData->noOfSections + 1;
} }
} }
@@ -386,25 +386,25 @@ static void scfCount(const Word16 *scalefacGain,
Word32 lastValScf = 0; Word32 lastValScf = 0;
Word32 deltaScf = 0; Word32 deltaScf = 0;
Flag found = 0; Flag found = 0;
Word32 scfSkipCounter = 0; Word32 scfSkipCounter = 0;
sectionData->scalefacBits = 0;
sectionData->scalefacBits = 0;
if (scalefacGain == NULL) { if (scalefacGain == NULL) {
return; return;
} }
lastValScf = 0; lastValScf = 0;
sectionData->firstScf = 0; sectionData->firstScf = 0;
psectionInfo = sectionData->sectionInfo; psectionInfo = sectionData->sectionInfo;
for (i=0; i<sectionData->noOfSections; i++) { for (i=0; i<sectionData->noOfSections; i++) {
if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO) { if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO) {
sectionData->firstScf = psectionInfo->sfbStart; sectionData->firstScf = psectionInfo->sfbStart;
lastValScf = scalefacGain[sectionData->firstScf]; lastValScf = scalefacGain[sectionData->firstScf];
break; break;
} }
psectionInfo += 1; psectionInfo += 1;
@@ -412,38 +412,38 @@ static void scfCount(const Word16 *scalefacGain,
psectionInfo = sectionData->sectionInfo; psectionInfo = sectionData->sectionInfo;
for (i=0; i<sectionData->noOfSections; i++, psectionInfo += 1) { for (i=0; i<sectionData->noOfSections; i++, psectionInfo += 1) {
if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO
&& psectionInfo->codeBook != CODE_BOOK_PNS_NO) { && psectionInfo->codeBook != CODE_BOOK_PNS_NO) {
for (j = psectionInfo->sfbStart; for (j = psectionInfo->sfbStart;
j < (psectionInfo->sfbStart + psectionInfo->sfbCnt); j++) { j < (psectionInfo->sfbStart + psectionInfo->sfbCnt); j++) {
/* check if we can repeat the last value to save bits */ /* check if we can repeat the last value to save bits */
if (maxValueInSfb[j] == 0) { if (maxValueInSfb[j] == 0) {
found = 0; found = 0;
if (scfSkipCounter == 0) { if (scfSkipCounter == 0) {
/* end of section */ /* end of section */
if (j - ((psectionInfo->sfbStart + psectionInfo->sfbCnt) - 1) == 0) { if (j - ((psectionInfo->sfbStart + psectionInfo->sfbCnt) - 1) == 0) {
found = 0; found = 0;
} }
else { else {
for (k = j + 1; k < psectionInfo->sfbStart + psectionInfo->sfbCnt; k++) { for (k = j + 1; k < psectionInfo->sfbStart + psectionInfo->sfbCnt; k++) {
if (maxValueInSfb[k] != 0) { if (maxValueInSfb[k] != 0) {
int tmp = L_abs(scalefacGain[k] - lastValScf); int tmp = L_abs(scalefacGain[k] - lastValScf);
found = 1; found = 1;
if ( tmp < CODE_BOOK_SCF_LAV) { if ( tmp < CODE_BOOK_SCF_LAV) {
/* save bits */ /* save bits */
deltaScf = 0; deltaScf = 0;
} }
else { else {
/* do not save bits */ /* do not save bits */
deltaScf = lastValScf - scalefacGain[j]; deltaScf = lastValScf - scalefacGain[j];
lastValScf = scalefacGain[j]; lastValScf = scalefacGain[j];
scfSkipCounter = 0; scfSkipCounter = 0;
} }
break; break;
} }
@@ -451,26 +451,26 @@ static void scfCount(const Word16 *scalefacGain,
scfSkipCounter = scfSkipCounter + 1; scfSkipCounter = scfSkipCounter + 1;
} }
} }
psectionInfom = psectionInfo + 1; psectionInfom = psectionInfo + 1;
/* search for the next maxValueInSfb[] != 0 in all other sections */ /* search for the next maxValueInSfb[] != 0 in all other sections */
for (m = i + 1; (m < sectionData->noOfSections) && (found == 0); m++) { for (m = i + 1; (m < sectionData->noOfSections) && (found == 0); m++) {
if ((psectionInfom->codeBook != CODE_BOOK_ZERO_NO) && if ((psectionInfom->codeBook != CODE_BOOK_ZERO_NO) &&
(psectionInfom->codeBook != CODE_BOOK_PNS_NO)) { (psectionInfom->codeBook != CODE_BOOK_PNS_NO)) {
for (n = psectionInfom->sfbStart; for (n = psectionInfom->sfbStart;
n < (psectionInfom->sfbStart + psectionInfom->sfbCnt); n++) { n < (psectionInfom->sfbStart + psectionInfom->sfbCnt); n++) {
if (maxValueInSfb[n] != 0) { if (maxValueInSfb[n] != 0) {
found = 1; found = 1;
if ( (abs_s(scalefacGain[n] - lastValScf) < CODE_BOOK_SCF_LAV)) { if ( (abs_s(scalefacGain[n] - lastValScf) < CODE_BOOK_SCF_LAV)) {
deltaScf = 0; deltaScf = 0;
} }
else { else {
deltaScf = (lastValScf - scalefacGain[j]); deltaScf = (lastValScf - scalefacGain[j]);
lastValScf = scalefacGain[j]; lastValScf = scalefacGain[j];
scfSkipCounter = 0; scfSkipCounter = 0;
} }
break; break;
} }
@@ -481,20 +481,20 @@ static void scfCount(const Word16 *scalefacGain,
psectionInfom += 1; psectionInfom += 1;
} }
if (found == 0) { if (found == 0) {
deltaScf = 0; deltaScf = 0;
scfSkipCounter = 0; scfSkipCounter = 0;
} }
} }
else { else {
deltaScf = 0; deltaScf = 0;
scfSkipCounter = scfSkipCounter - 1; scfSkipCounter = scfSkipCounter - 1;
} }
} }
else { else {
deltaScf = lastValScf - scalefacGain[j]; deltaScf = lastValScf - scalefacGain[j];
lastValScf = scalefacGain[j]; lastValScf = scalefacGain[j];
} }
sectionData->scalefacBits += bitCountScalefactorDelta(deltaScf); sectionData->scalefacBits += bitCountScalefactorDelta(deltaScf);
} }
@@ -517,14 +517,14 @@ dynBitCount(const Word16 *quantSpectrum,
const Word16 *sfbOffset, const Word16 *sfbOffset,
SECTION_DATA *sectionData) SECTION_DATA *sectionData)
{ {
sectionData->blockType = blockType; sectionData->blockType = blockType;
sectionData->sfbCnt = sfbCnt; sectionData->sfbCnt = sfbCnt;
sectionData->sfbPerGroup = sfbPerGroup; sectionData->sfbPerGroup = sfbPerGroup;
if(sfbPerGroup) if(sfbPerGroup)
sectionData->noOfGroups = sfbCnt/sfbPerGroup; sectionData->noOfGroups = sfbCnt/sfbPerGroup;
else else
sectionData->noOfGroups = 0x7fff; sectionData->noOfGroups = 0x7fff;
sectionData->maxSfbPerGroup = maxSfbPerGroup; sectionData->maxSfbPerGroup = maxSfbPerGroup;
noiselessCounter(sectionData, noiselessCounter(sectionData,
sectionData->mergeGainLookUp, sectionData->mergeGainLookUp,
@@ -539,7 +539,7 @@ dynBitCount(const Word16 *quantSpectrum,
sectionData); sectionData);
return (sectionData->huffmanBits + sectionData->sideInfoBits + return (sectionData->huffmanBits + sectionData->sideInfoBits +
sectionData->scalefacBits); sectionData->scalefacBits);
} }

View File

@@ -57,29 +57,29 @@ groupShortData(Word32 *mdctSpectrum,
/* for short: regroup and */ /* for short: regroup and */
/* cumulate energies und thresholds group-wise . */ /* cumulate energies und thresholds group-wise . */
/* calculate sfbCnt */ /* calculate sfbCnt */
highestSfb = 0; highestSfb = 0;
for (wnd=0; wnd<TRANS_FAC; wnd++) { for (wnd=0; wnd<TRANS_FAC; wnd++) {
for (sfb=sfbCnt - 1; sfb>=highestSfb; sfb--) { for (sfb=sfbCnt - 1; sfb>=highestSfb; sfb--) {
for (line=(sfbOffset[sfb + 1] - 1); line>=sfbOffset[sfb]; line--) { for (line=(sfbOffset[sfb + 1] - 1); line>=sfbOffset[sfb]; line--) {
if (mdctSpectrum[wnd*FRAME_LEN_SHORT+line] != 0) break; if (mdctSpectrum[wnd*FRAME_LEN_SHORT+line] != 0) break;
} }
if (line >= sfbOffset[sfb]) break; if (line >= sfbOffset[sfb]) break;
} }
highestSfb = max(highestSfb, sfb); highestSfb = max(highestSfb, sfb);
} }
if (highestSfb < 0) { if (highestSfb < 0) {
highestSfb = 0; highestSfb = 0;
} }
*maxSfbPerGroup = highestSfb + 1; *maxSfbPerGroup = highestSfb + 1;
/* calculate sfbOffset */ /* calculate sfbOffset */
i = 0; i = 0;
offset = 0; offset = 0;
for (grp = 0; grp < noOfGroups; grp++) { for (grp = 0; grp < noOfGroups; grp++) {
for (sfb = 0; sfb < sfbCnt; sfb++) { for (sfb = 0; sfb < sfbCnt; sfb++) {
groupedSfbOffset[i] = offset + sfbOffset[sfb] * groupLen[grp]; groupedSfbOffset[i] = offset + sfbOffset[sfb] * groupLen[grp];
@@ -87,15 +87,15 @@ groupShortData(Word32 *mdctSpectrum,
} }
offset += groupLen[grp] * FRAME_LEN_SHORT; offset += groupLen[grp] * FRAME_LEN_SHORT;
} }
groupedSfbOffset[i] = FRAME_LEN_LONG; groupedSfbOffset[i] = FRAME_LEN_LONG;
i += 1; i += 1;
/* calculate minSnr */ /* calculate minSnr */
i = 0; i = 0;
offset = 0; offset = 0;
for (grp = 0; grp < noOfGroups; grp++) { for (grp = 0; grp < noOfGroups; grp++) {
for (sfb = 0; sfb < sfbCnt; sfb++) { for (sfb = 0; sfb < sfbCnt; sfb++) {
groupedSfbMinSnr[i] = sfbMinSnr[sfb]; groupedSfbMinSnr[i] = sfbMinSnr[sfb];
i += 1; i += 1;
} }
offset += groupLen[grp] * FRAME_LEN_SHORT; offset += groupLen[grp] * FRAME_LEN_SHORT;
@@ -103,74 +103,74 @@ groupShortData(Word32 *mdctSpectrum,
/* sum up sfbThresholds */ /* sum up sfbThresholds */
wnd = 0; wnd = 0;
i = 0; i = 0;
for (grp = 0; grp < noOfGroups; grp++) { for (grp = 0; grp < noOfGroups; grp++) {
for (sfb = 0; sfb < sfbCnt; sfb++) { for (sfb = 0; sfb < sfbCnt; sfb++) {
Word32 thresh = sfbThreshold->sfbShort[wnd][sfb]; Word32 thresh = sfbThreshold->sfbShort[wnd][sfb];
for (j=1; j<groupLen[grp]; j++) { for (j=1; j<groupLen[grp]; j++) {
thresh = L_add(thresh, sfbThreshold->sfbShort[wnd+j][sfb]); thresh = L_add(thresh, sfbThreshold->sfbShort[wnd+j][sfb]);
} }
sfbThreshold->sfbLong[i] = thresh; sfbThreshold->sfbLong[i] = thresh;
i += 1; i += 1;
} }
wnd += groupLen[grp]; wnd += groupLen[grp];
} }
/* sum up sfbEnergies left/right */ /* sum up sfbEnergies left/right */
wnd = 0; wnd = 0;
i = 0; i = 0;
for (grp = 0; grp < noOfGroups; grp++) { for (grp = 0; grp < noOfGroups; grp++) {
for (sfb = 0; sfb < sfbCnt; sfb++) { for (sfb = 0; sfb < sfbCnt; sfb++) {
Word32 energy = sfbEnergy->sfbShort[wnd][sfb]; Word32 energy = sfbEnergy->sfbShort[wnd][sfb];
for (j=1; j<groupLen[grp]; j++) { for (j=1; j<groupLen[grp]; j++) {
energy = L_add(energy, sfbEnergy->sfbShort[wnd+j][sfb]); energy = L_add(energy, sfbEnergy->sfbShort[wnd+j][sfb]);
} }
sfbEnergy->sfbLong[i] = energy; sfbEnergy->sfbLong[i] = energy;
i += 1; i += 1;
} }
wnd += groupLen[grp]; wnd += groupLen[grp];
} }
/* sum up sfbEnergies mid/side */ /* sum up sfbEnergies mid/side */
wnd = 0; wnd = 0;
i = 0; i = 0;
for (grp = 0; grp < noOfGroups; grp++) { for (grp = 0; grp < noOfGroups; grp++) {
for (sfb = 0; sfb < sfbCnt; sfb++) { for (sfb = 0; sfb < sfbCnt; sfb++) {
Word32 energy = sfbEnergyMS->sfbShort[wnd][sfb]; Word32 energy = sfbEnergyMS->sfbShort[wnd][sfb];
for (j=1; j<groupLen[grp]; j++) { for (j=1; j<groupLen[grp]; j++) {
energy = L_add(energy, sfbEnergyMS->sfbShort[wnd+j][sfb]); energy = L_add(energy, sfbEnergyMS->sfbShort[wnd+j][sfb]);
} }
sfbEnergyMS->sfbLong[i] = energy; sfbEnergyMS->sfbLong[i] = energy;
i += 1; i += 1;
} }
wnd += groupLen[grp]; wnd += groupLen[grp];
} }
/* sum up sfbSpreadedEnergies */ /* sum up sfbSpreadedEnergies */
wnd = 0; wnd = 0;
i = 0; i = 0;
for (grp = 0; grp < noOfGroups; grp++) { for (grp = 0; grp < noOfGroups; grp++) {
for (sfb = 0; sfb < sfbCnt; sfb++) { for (sfb = 0; sfb < sfbCnt; sfb++) {
Word32 energy = sfbSpreadedEnergy->sfbShort[wnd][sfb]; Word32 energy = sfbSpreadedEnergy->sfbShort[wnd][sfb];
for (j=1; j<groupLen[grp]; j++) { for (j=1; j<groupLen[grp]; j++) {
energy = L_add(energy, sfbSpreadedEnergy->sfbShort[wnd+j][sfb]); energy = L_add(energy, sfbSpreadedEnergy->sfbShort[wnd+j][sfb]);
} }
sfbSpreadedEnergy->sfbLong[i] = energy; sfbSpreadedEnergy->sfbLong[i] = energy;
i += 1; i += 1;
} }
wnd += groupLen[grp]; wnd += groupLen[grp];
} }
/* re-group spectrum */ /* re-group spectrum */
wnd = 0; wnd = 0;
i = 0; i = 0;
for (grp = 0; grp < noOfGroups; grp++) { for (grp = 0; grp < noOfGroups; grp++) {
for (sfb = 0; sfb < sfbCnt; sfb++) { for (sfb = 0; sfb < sfbCnt; sfb++) {
for (j = 0; j < groupLen[grp]; j++) { for (j = 0; j < groupLen[grp]; j++) {
Word16 lineOffset = FRAME_LEN_SHORT * (wnd + j); Word16 lineOffset = FRAME_LEN_SHORT * (wnd + j);
for (line = lineOffset + sfbOffset[sfb]; line < lineOffset + sfbOffset[sfb+1]; line++) { for (line = lineOffset + sfbOffset[sfb]; line < lineOffset + sfbOffset[sfb+1]; line++) {
tmpSpectrum[i] = mdctSpectrum[line]; tmpSpectrum[i] = mdctSpectrum[line];
i = i + 1; i = i + 1;
} }
} }
@@ -179,10 +179,10 @@ groupShortData(Word32 *mdctSpectrum,
} }
for(i=0;i<FRAME_LEN_LONG;i+=4) { for(i=0;i<FRAME_LEN_LONG;i+=4) {
mdctSpectrum[i] = tmpSpectrum[i]; mdctSpectrum[i] = tmpSpectrum[i];
mdctSpectrum[i+1] = tmpSpectrum[i+1]; mdctSpectrum[i+1] = tmpSpectrum[i+1];
mdctSpectrum[i+2] = tmpSpectrum[i+2]; mdctSpectrum[i+2] = tmpSpectrum[i+2];
mdctSpectrum[i+3] = tmpSpectrum[i+3]; mdctSpectrum[i+3] = tmpSpectrum[i+3];
} }
} }

View File

@@ -49,56 +49,56 @@ void BuildInterface(Word32 *groupedMdctSpectrum,
PSY_OUT_CHANNEL *psyOutCh) PSY_OUT_CHANNEL *psyOutCh)
{ {
Word32 j; Word32 j;
Word32 grp; Word32 grp;
Word32 mask; Word32 mask;
Word16 *tmpV; Word16 *tmpV;
/* /*
copy values to psyOut copy values to psyOut
*/ */
psyOutCh->maxSfbPerGroup = maxSfbPerGroup; psyOutCh->maxSfbPerGroup = maxSfbPerGroup;
psyOutCh->sfbCnt = groupedSfbCnt; psyOutCh->sfbCnt = groupedSfbCnt;
if(noOfGroups) if(noOfGroups)
psyOutCh->sfbPerGroup = groupedSfbCnt/ noOfGroups; psyOutCh->sfbPerGroup = groupedSfbCnt/ noOfGroups;
else else
psyOutCh->sfbPerGroup = 0x7fff; psyOutCh->sfbPerGroup = 0x7fff;
psyOutCh->windowSequence = windowSequence; psyOutCh->windowSequence = windowSequence;
psyOutCh->windowShape = windowShape; psyOutCh->windowShape = windowShape;
psyOutCh->mdctScale = mdctScale; psyOutCh->mdctScale = mdctScale;
psyOutCh->mdctSpectrum = groupedMdctSpectrum; psyOutCh->mdctSpectrum = groupedMdctSpectrum;
psyOutCh->sfbEnergy = groupedSfbEnergy->sfbLong; psyOutCh->sfbEnergy = groupedSfbEnergy->sfbLong;
psyOutCh->sfbThreshold = groupedSfbThreshold->sfbLong; psyOutCh->sfbThreshold = groupedSfbThreshold->sfbLong;
psyOutCh->sfbSpreadedEnergy = groupedSfbSpreadedEnergy->sfbLong; psyOutCh->sfbSpreadedEnergy = groupedSfbSpreadedEnergy->sfbLong;
tmpV = psyOutCh->sfbOffsets; tmpV = psyOutCh->sfbOffsets;
for(j=0; j<groupedSfbCnt + 1; j++) { for(j=0; j<groupedSfbCnt + 1; j++) {
*tmpV++ = groupedSfbOffset[j]; *tmpV++ = groupedSfbOffset[j];
} }
tmpV = psyOutCh->sfbMinSnr; tmpV = psyOutCh->sfbMinSnr;
for(j=0;j<groupedSfbCnt; j++) { for(j=0;j<groupedSfbCnt; j++) {
*tmpV++ = groupedSfbMinSnr[j]; *tmpV++ = groupedSfbMinSnr[j];
} }
/* generate grouping mask */ /* generate grouping mask */
mask = 0; mask = 0;
for (grp = 0; grp < noOfGroups; grp++) { for (grp = 0; grp < noOfGroups; grp++) {
mask = mask << 1; mask = mask << 1;
for (j=1; j<groupLen[grp]; j++) { for (j=1; j<groupLen[grp]; j++) {
mask = mask << 1; mask = mask << 1;
mask |= 1; mask |= 1;
} }
} }
psyOutCh->groupingMask = mask; psyOutCh->groupingMask = mask;
if (windowSequence != SHORT_WINDOW) { if (windowSequence != SHORT_WINDOW) {
psyOutCh->sfbEnSumLR = sfbEnergySumLR.sfbLong; psyOutCh->sfbEnSumLR = sfbEnergySumLR.sfbLong;
psyOutCh->sfbEnSumMS = sfbEnergySumMS.sfbLong; psyOutCh->sfbEnSumMS = sfbEnergySumMS.sfbLong;
} }
else { else {
Word32 i; Word32 i;
Word32 accuSumMS=0; Word32 accuSumMS=0;
Word32 accuSumLR=0; Word32 accuSumLR=0;
Word32 *pSumMS = sfbEnergySumMS.sfbShort; Word32 *pSumMS = sfbEnergySumMS.sfbShort;
Word32 *pSumLR = sfbEnergySumLR.sfbShort; Word32 *pSumLR = sfbEnergySumLR.sfbShort;
@@ -106,7 +106,7 @@ void BuildInterface(Word32 *groupedMdctSpectrum,
accuSumLR = L_add(accuSumLR, *pSumLR); pSumLR++; accuSumLR = L_add(accuSumLR, *pSumLR); pSumLR++;
accuSumMS = L_add(accuSumMS, *pSumMS); pSumMS++; accuSumMS = L_add(accuSumMS, *pSumMS); pSumMS++;
} }
psyOutCh->sfbEnSumMS = accuSumMS; psyOutCh->sfbEnSumMS = accuSumMS;
psyOutCh->sfbEnSumLR = accuSumLR; psyOutCh->sfbEnSumLR = accuSumLR;
} }
} }

View File

@@ -45,20 +45,20 @@ void prepareSfbPe(PE_DATA *peData,
const Word16 peOffset) const Word16 peOffset)
{ {
Word32 sfbGrp, sfb; Word32 sfbGrp, sfb;
Word32 ch; Word32 ch;
for(ch=0; ch<nChannels; ch++) { for(ch=0; ch<nChannels; ch++) {
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
PE_CHANNEL_DATA *peChanData=&peData->peChannelData[ch]; PE_CHANNEL_DATA *peChanData=&peData->peChannelData[ch];
for(sfbGrp=0;sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup){ for(sfbGrp=0;sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup){
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
peChanData->sfbNLines4[sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb]; peChanData->sfbNLines4[sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb];
sfbNRelevantLines[ch][sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb] >> 2; sfbNRelevantLines[ch][sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb] >> 2;
peChanData->sfbLdEnergy[sfbGrp+sfb] = logSfbEnergy[ch][sfbGrp+sfb]; peChanData->sfbLdEnergy[sfbGrp+sfb] = logSfbEnergy[ch][sfbGrp+sfb];
} }
} }
} }
peData->offset = peOffset; peData->offset = peOffset;
} }
@@ -78,23 +78,23 @@ void calcSfbPe(PE_DATA *peData,
Word32 ldThr, ldRatio; Word32 ldThr, ldRatio;
Word32 pe, constPart, nActiveLines; Word32 pe, constPart, nActiveLines;
peData->pe = peData->offset; peData->pe = peData->offset;
peData->constPart = 0; peData->constPart = 0;
peData->nActiveLines = 0; peData->nActiveLines = 0;
for(ch=0; ch<nChannels; ch++) { for(ch=0; ch<nChannels; ch++) {
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch]; PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
const Word32 *sfbEnergy = psyOutChan->sfbEnergy; const Word32 *sfbEnergy = psyOutChan->sfbEnergy;
const Word32 *sfbThreshold = psyOutChan->sfbThreshold; const Word32 *sfbThreshold = psyOutChan->sfbThreshold;
pe = 0; pe = 0;
constPart = 0; constPart = 0;
nActiveLines = 0; nActiveLines = 0;
for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) { for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
Word32 nrg = sfbEnergy[sfbGrp+sfb]; Word32 nrg = sfbEnergy[sfbGrp+sfb];
Word32 thres = sfbThreshold[sfbGrp+sfb]; Word32 thres = sfbThreshold[sfbGrp+sfb];
Word32 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb]; Word32 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb];
if (nrg > thres) { if (nrg > thres) {
@@ -102,8 +102,8 @@ void calcSfbPe(PE_DATA *peData,
ldRatio = sfbLDEn - ldThr; ldRatio = sfbLDEn - ldThr;
nLines4 = peChanData->sfbNLines4[sfbGrp+sfb]; nLines4 = peChanData->sfbNLines4[sfbGrp+sfb];
/* sfbPe = nl*log2(en/thr)*/ /* sfbPe = nl*log2(en/thr)*/
if (ldRatio >= C1_I) { if (ldRatio >= C1_I) {
peChanData->sfbPe[sfbGrp+sfb] = (nLines4*ldRatio + 8) >> 4; peChanData->sfbPe[sfbGrp+sfb] = (nLines4*ldRatio + 8) >> 4;
@@ -120,26 +120,26 @@ void calcSfbPe(PE_DATA *peData,
peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines4 >> 2; peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines4 >> 2;
} }
else { else {
peChanData->sfbPe[sfbGrp+sfb] = 0; peChanData->sfbPe[sfbGrp+sfb] = 0;
peChanData->sfbConstPart[sfbGrp+sfb] = 0; peChanData->sfbConstPart[sfbGrp+sfb] = 0;
peChanData->sfbNActiveLines[sfbGrp+sfb] = 0; peChanData->sfbNActiveLines[sfbGrp+sfb] = 0;
} }
pe = pe + peChanData->sfbPe[sfbGrp+sfb]; pe = pe + peChanData->sfbPe[sfbGrp+sfb];
constPart = constPart + peChanData->sfbConstPart[sfbGrp+sfb]; constPart = constPart + peChanData->sfbConstPart[sfbGrp+sfb];
nActiveLines = nActiveLines + peChanData->sfbNActiveLines[sfbGrp+sfb]; nActiveLines = nActiveLines + peChanData->sfbNActiveLines[sfbGrp+sfb];
} }
} }
peChanData->pe = saturate(pe);
peChanData->constPart = saturate(constPart);
peChanData->nActiveLines = saturate(nActiveLines);
peChanData->pe = saturate(pe);
peChanData->constPart = saturate(constPart);
peChanData->nActiveLines = saturate(nActiveLines);
pe += peData->pe; pe += peData->pe;
peData->pe = saturate(pe); peData->pe = saturate(pe);
constPart += peData->constPart; constPart += peData->constPart;
peData->constPart = saturate(constPart); peData->constPart = saturate(constPart);
nActiveLines += peData->nActiveLines; nActiveLines += peData->nActiveLines;
peData->nActiveLines = saturate(nActiveLines); peData->nActiveLines = saturate(nActiveLines);
} }
} }

View File

@@ -27,7 +27,7 @@
/***************************************************************************** /*****************************************************************************
* *
* function name: mem_malloc * function name: mem_malloc
* description: malloc the alignments memory * description: malloc the alignments memory
* returns: the point of the memory * returns: the point of the memory
* *
**********************************************************************************/ **********************************************************************************/

View File

@@ -30,7 +30,7 @@
* *
* function name: MsStereoProcessing * function name: MsStereoProcessing
* description: detect use ms stereo or not * description: detect use ms stereo or not
* if ((min(thrLn, thrRn)*min(thrLn, thrRn))/(enMn*enSn)) * if ((min(thrLn, thrRn)*min(thrLn, thrRn))/(enMn*enSn))
* >= ((thrLn *thrRn)/(enLn*enRn)) then ms stereo * >= ((thrLn *thrRn)/(enLn*enRn)) then ms stereo
* *
**********************************************************************************/ **********************************************************************************/
@@ -51,7 +51,7 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft,
const Word16 maxSfbPerGroup, const Word16 maxSfbPerGroup,
const Word16 *sfbOffset) { const Word16 *sfbOffset) {
Word32 temp; Word32 temp;
Word32 sfb,sfboffs, j; Word32 sfb,sfboffs, j;
Word32 msMaskTrueSomewhere = 0; Word32 msMaskTrueSomewhere = 0;
Word32 msMaskFalseSomewhere = 0; Word32 msMaskFalseSomewhere = 0;
@@ -64,12 +64,12 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft,
Word32 thrL, thrR, nrgL, nrgR; Word32 thrL, thrR, nrgL, nrgR;
Word32 idx, shift; Word32 idx, shift;
idx = sfb + sfboffs; idx = sfb + sfboffs;
thrL = sfbThresholdLeft[idx]; thrL = sfbThresholdLeft[idx];
thrR = sfbThresholdRight[idx]; thrR = sfbThresholdRight[idx];
nrgL = sfbEnergyLeft[idx]; nrgL = sfbEnergyLeft[idx];
nrgR = sfbEnergyRight[idx]; nrgR = sfbEnergyRight[idx];
minThreshold = min(thrL, thrR); minThreshold = min(thrL, thrR);
@@ -82,8 +82,8 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft,
pnlr = fixmul(nrgL, nrgR); pnlr = fixmul(nrgL, nrgR);
nrgL = sfbEnergyMid[idx]; nrgL = sfbEnergyMid[idx];
nrgR = sfbEnergySide[idx]; nrgR = sfbEnergySide[idx];
nrgL = max(nrgL,minThreshold) + 1; nrgL = max(nrgL,minThreshold) + 1;
shift = norm_l(nrgL); shift = norm_l(nrgL);
@@ -97,42 +97,42 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft,
temp = (pnlr + 1) / ((pnms >> 8) + 1); temp = (pnlr + 1) / ((pnms >> 8) + 1);
temp = pnms - pnlr; temp = pnms - pnlr;
if( temp > 0 ){ if( temp > 0 ){
msMask[idx] = 1; msMask[idx] = 1;
msMaskTrueSomewhere = 1; msMaskTrueSomewhere = 1;
for (j=sfbOffset[idx]; j<sfbOffset[idx+1]; j++) { for (j=sfbOffset[idx]; j<sfbOffset[idx+1]; j++) {
Word32 left, right; Word32 left, right;
left = (mdctSpectrumLeft[j] >> 1); left = (mdctSpectrumLeft[j] >> 1);
right = (mdctSpectrumRight[j] >> 1); right = (mdctSpectrumRight[j] >> 1);
mdctSpectrumLeft[j] = left + right; mdctSpectrumLeft[j] = left + right;
mdctSpectrumRight[j] = left - right; mdctSpectrumRight[j] = left - right;
} }
sfbThresholdLeft[idx] = minThreshold;
sfbThresholdRight[idx] = minThreshold;
sfbEnergyLeft[idx] = sfbEnergyMid[idx];
sfbEnergyRight[idx] = sfbEnergySide[idx];
sfbSpreadedEnRight[idx] = min(sfbSpreadedEnLeft[idx],sfbSpreadedEnRight[idx]) >> 1; sfbThresholdLeft[idx] = minThreshold;
sfbSpreadedEnLeft[idx] = sfbSpreadedEnRight[idx]; sfbThresholdRight[idx] = minThreshold;
sfbEnergyLeft[idx] = sfbEnergyMid[idx];
sfbEnergyRight[idx] = sfbEnergySide[idx];
sfbSpreadedEnRight[idx] = min(sfbSpreadedEnLeft[idx],sfbSpreadedEnRight[idx]) >> 1;
sfbSpreadedEnLeft[idx] = sfbSpreadedEnRight[idx];
} }
else { else {
msMask[idx] = 0; msMask[idx] = 0;
msMaskFalseSomewhere = 1; msMaskFalseSomewhere = 1;
} }
} }
if ( msMaskTrueSomewhere ) { if ( msMaskTrueSomewhere ) {
if(msMaskFalseSomewhere ) { if(msMaskFalseSomewhere ) {
*msDigest = SI_MS_MASK_SOME; *msDigest = SI_MS_MASK_SOME;
} else { } else {
*msDigest = SI_MS_MASK_ALL; *msDigest = SI_MS_MASK_ALL;
} }
} else { } else {
*msDigest = SI_MS_MASK_NONE; *msDigest = SI_MS_MASK_NONE;
} }
} }

View File

@@ -29,7 +29,7 @@
/***************************************************************************** /*****************************************************************************
* *
* function name:InitPreEchoControl * function name:InitPreEchoControl
* description: init pre echo control parameter * description: init pre echo control parameter
* *
*****************************************************************************/ *****************************************************************************/
@@ -40,13 +40,13 @@ void InitPreEchoControl(Word32 *pbThresholdNm1,
Word16 pb; Word16 pb;
for(pb=0; pb<numPb; pb++) { for(pb=0; pb<numPb; pb++) {
pbThresholdNm1[pb] = pbThresholdQuiet[pb]; pbThresholdNm1[pb] = pbThresholdQuiet[pb];
} }
} }
/***************************************************************************** /*****************************************************************************
* *
* function name:PreEchoControl * function name:PreEchoControl
* description: update shreshold to avoid pre echo * description: update shreshold to avoid pre echo
* thr(n) = max(rpmin*thrq(n), min(thrq(n), rpelev*thrq1(n))) * thr(n) = max(rpmin*thrq(n), min(thrq(n), rpelev*thrq1(n)))
* *
@@ -68,22 +68,22 @@ void PreEchoControl(Word32 *pbThresholdNm1,
(void)maxAllowedIncreaseFactor; (void)maxAllowedIncreaseFactor;
scaling = ((mdctScale - mdctScalenm1) << 1); scaling = ((mdctScale - mdctScalenm1) << 1);
if ( scaling > 0 ) { if ( scaling > 0 ) {
for(i = 0; i < numPb; i++) { for(i = 0; i < numPb; i++) {
tmpThreshold1 = pbThresholdNm1[i] >> (scaling-1); tmpThreshold1 = pbThresholdNm1[i] >> (scaling-1);
tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor); tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor);
/* copy thresholds to internal memory */ /* copy thresholds to internal memory */
pbThresholdNm1[i] = pbThreshold[i]; pbThresholdNm1[i] = pbThreshold[i];
if(pbThreshold[i] > tmpThreshold1) { if(pbThreshold[i] > tmpThreshold1) {
pbThreshold[i] = tmpThreshold1; pbThreshold[i] = tmpThreshold1;
} }
if(tmpThreshold2 > pbThreshold[i]) { if(tmpThreshold2 > pbThreshold[i]) {
pbThreshold[i] = tmpThreshold2; pbThreshold[i] = tmpThreshold2;
} }
} }
@@ -96,15 +96,15 @@ void PreEchoControl(Word32 *pbThresholdNm1,
tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor); tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor);
/* copy thresholds to internal memory */ /* copy thresholds to internal memory */
pbThresholdNm1[i] = pbThreshold[i]; pbThresholdNm1[i] = pbThreshold[i];
if(((pbThreshold[i] >> scaling) > tmpThreshold1)) { if(((pbThreshold[i] >> scaling) > tmpThreshold1)) {
pbThreshold[i] = tmpThreshold1 << scaling; pbThreshold[i] = tmpThreshold1 << scaling;
} }
if(tmpThreshold2 > pbThreshold[i]) { if(tmpThreshold2 > pbThreshold[i]) {
pbThreshold[i] = tmpThreshold2; pbThreshold[i] = tmpThreshold2;
} }
} }

View File

@@ -88,17 +88,17 @@ Word32 GetSRIndex(Word32 sampleRate)
* *
* function name: atan_1000 * function name: atan_1000
* description: calculates 1000*atan(x/1000) * description: calculates 1000*atan(x/1000)
* based on atan approx for x > 0 * based on atan approx for x > 0
* atan(x) = x/((float)1.0f+(float)0.280872f*x*x) if x < 1 * atan(x) = x/((float)1.0f+(float)0.280872f*x*x) if x < 1
* = pi/2 - x/((float)0.280872f +x*x) if x >= 1 * = pi/2 - x/((float)0.280872f +x*x) if x >= 1
* return: 1000*atan(x/1000) * return: 1000*atan(x/1000)
* *
**********************************************************************************/ **********************************************************************************/
static Word16 atan_1000(Word32 val) static Word16 atan_1000(Word32 val)
{ {
Word32 y; Word32 y;
if(L_sub(val, 1000) < 0) { if(L_sub(val, 1000) < 0) {
y = extract_l(((1000 * val) / (1000 + ((val * val) / ATAN_COEF1)))); y = extract_l(((1000 * val) / (1000 + ((val * val) / ATAN_COEF1))));
} }
@@ -126,9 +126,9 @@ static Word16 BarcLineValue(Word16 noOfLines, Word16 fftLine, Word32 samplingFre
/* center frequency of fft line */ /* center frequency of fft line */
center_freq = (fftLine * samplingFreq) / (noOfLines << 1); center_freq = (fftLine * samplingFreq) / (noOfLines << 1);
temp = atan_1000((center_freq << 2) / (3*10)); temp = atan_1000((center_freq << 2) / (3*10));
bvalFFTLine = bvalFFTLine =
(26600 * atan_1000((center_freq*76) / 100) + 7*temp*temp) / (2*1000*1000 / BARC_SCALE); (26600 * atan_1000((center_freq*76) / 100) + 7*temp*temp) / (2*1000*1000 / BARC_SCALE);
return saturate(bvalFFTLine); return saturate(bvalFFTLine);
} }
@@ -148,17 +148,17 @@ static void initThrQuiet(Word16 numPb,
for(i=0; i<numPb; i++) { for(i=0; i<numPb; i++) {
Word16 bv1, bv2; Word16 bv1, bv2;
if (i>0) if (i>0)
bv1 = (pbBarcVal[i] + pbBarcVal[i-1]) >> 1; bv1 = (pbBarcVal[i] + pbBarcVal[i-1]) >> 1;
else else
bv1 = pbBarcVal[i] >> 1; bv1 = pbBarcVal[i] >> 1;
if (i < (numPb - 1)) if (i < (numPb - 1))
bv2 = (pbBarcVal[i] + pbBarcVal[i+1]) >> 1; bv2 = (pbBarcVal[i] + pbBarcVal[i+1]) >> 1;
else { else {
bv2 = pbBarcVal[i]; bv2 = pbBarcVal[i];
} }
bv1 = min((bv1 / BARC_SCALE), max_bark); bv1 = min((bv1 / BARC_SCALE), max_bark);
@@ -166,9 +166,9 @@ static void initThrQuiet(Word16 numPb,
barcThrQuiet = min(BARC_THR_QUIET[bv1], BARC_THR_QUIET[bv2]); barcThrQuiet = min(BARC_THR_QUIET[bv1], BARC_THR_QUIET[bv2]);
/* /*
we calculate we calculate
pow(10.0f,(float)(barcThrQuiet - ABS_LEV)*0.1)*(float)ABS_LOW*(pbOffset[i+1] - pbOffset[i]); pow(10.0f,(float)(barcThrQuiet - ABS_LEV)*0.1)*(float)ABS_LOW*(pbOffset[i+1] - pbOffset[i]);
*/ */
@@ -196,47 +196,47 @@ static void initSpreading(Word16 numPb,
Word16 i; Word16 i;
Word16 maskLowSprEn, maskHighSprEn; Word16 maskLowSprEn, maskHighSprEn;
if (sub(blockType, SHORT_WINDOW) != 0) { if (sub(blockType, SHORT_WINDOW) != 0) {
maskLowSprEn = maskLowSprEnLong; maskLowSprEn = maskLowSprEnLong;
if (bitrate > 22000) if (bitrate > 22000)
maskHighSprEn = maskHighSprEnLong; maskHighSprEn = maskHighSprEnLong;
else else
maskHighSprEn = maskHighSprEnLongLowBr; maskHighSprEn = maskHighSprEnLongLowBr;
} }
else { else {
maskLowSprEn = maskLowSprEnShort; maskLowSprEn = maskLowSprEnShort;
maskHighSprEn = maskHighSprEnShort; maskHighSprEn = maskHighSprEnShort;
} }
for(i=0; i<numPb; i++) { for(i=0; i<numPb; i++) {
if (i > 0) { if (i > 0) {
Word32 dbVal; Word32 dbVal;
Word16 dbark = pbBarcValue[i] - pbBarcValue[i-1]; Word16 dbark = pbBarcValue[i] - pbBarcValue[i-1];
/* /*
we calulate pow(10.0f, -0.1*dbVal/BARC_SCALE) we calulate pow(10.0f, -0.1*dbVal/BARC_SCALE)
*/ */
dbVal = (maskHigh * dbark); dbVal = (maskHigh * dbark);
pbMaskHiFactor[i] = round16(pow2_xy(L_negate(dbVal), (Word32)LOG2_1000)); /* 0.301 log10(2) */ pbMaskHiFactor[i] = round16(pow2_xy(L_negate(dbVal), (Word32)LOG2_1000)); /* 0.301 log10(2) */
dbVal = (maskLow * dbark); dbVal = (maskLow * dbark);
pbMaskLoFactor[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000)); pbMaskLoFactor[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
dbVal = (maskHighSprEn * dbark); dbVal = (maskHighSprEn * dbark);
pbMaskHiFactorSprEn[i] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000)); pbMaskHiFactorSprEn[i] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
dbVal = (maskLowSprEn * dbark); dbVal = (maskLowSprEn * dbark);
pbMaskLoFactorSprEn[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000)); pbMaskLoFactorSprEn[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
} }
else { else {
pbMaskHiFactor[i] = 0; pbMaskHiFactor[i] = 0;
pbMaskLoFactor[numPb-1] = 0; pbMaskLoFactor[numPb-1] = 0;
pbMaskHiFactorSprEn[i] = 0; pbMaskHiFactorSprEn[i] = 0;
pbMaskLoFactorSprEn[numPb-1] = 0; pbMaskLoFactorSprEn[numPb-1] = 0;
} }
} }
@@ -258,12 +258,12 @@ static void initBarcValues(Word16 numPb,
Word16 i; Word16 i;
Word16 pbBval0, pbBval1; Word16 pbBval0, pbBval1;
pbBval0 = 0; pbBval0 = 0;
for(i=0; i<numPb; i++){ for(i=0; i<numPb; i++){
pbBval1 = BarcLineValue(numLines, pbOffset[i+1], samplingFrequency); pbBval1 = BarcLineValue(numLines, pbOffset[i+1], samplingFrequency);
pbBval[i] = (pbBval0 + pbBval1) >> 1; pbBval[i] = (pbBval0 + pbBval1) >> 1;
pbBval0 = pbBval1; pbBval0 = pbBval1;
} }
} }
@@ -295,38 +295,38 @@ static void initMinSnr(const Word32 bitrate,
pePerWindow = bits2pe(extract_l((bitrate * numLines) / samplerate)); pePerWindow = bits2pe(extract_l((bitrate * numLines) / samplerate));
pbVal0 = 0; pbVal0 = 0;
for (sfb=0; sfb<sfbActive; sfb++) { for (sfb=0; sfb<sfbActive; sfb++) {
pbVal1 = (pbBarcVal[sfb] << 1) - pbVal0; pbVal1 = (pbBarcVal[sfb] << 1) - pbVal0;
barcWidth = pbVal1 - pbVal0; barcWidth = pbVal1 - pbVal0;
pbVal0 = pbVal1; pbVal0 = pbVal1;
/* allow at least 2.4% of pe for each active barc */ /* allow at least 2.4% of pe for each active barc */
pePart = ((pePerWindow * 24) * (max_bark * barcWidth)) / pePart = ((pePerWindow * 24) * (max_bark * barcWidth)) /
(pbBarcVal[sfbActive-1] * (sfbOffset[sfb+1] - sfbOffset[sfb])); (pbBarcVal[sfbActive-1] * (sfbOffset[sfb+1] - sfbOffset[sfb]));
pePart = min(pePart, 8400); pePart = min(pePart, 8400);
pePart = max(pePart, 1400); pePart = max(pePart, 1400);
/* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)*/ /* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)*/
/* we add an offset of 2^16 to the pow functions */ /* we add an offset of 2^16 to the pow functions */
/* 0xc000 = 1.5*(1 << 15)*/ /* 0xc000 = 1.5*(1 << 15)*/
snr = pow2_xy((pePart - 16*1000),1000) - 0x0000c000; snr = pow2_xy((pePart - 16*1000),1000) - 0x0000c000;
if(snr > 0x00008000) if(snr > 0x00008000)
{ {
shift = norm_l(snr); shift = norm_l(snr);
snr = Div_32(0x00008000 << shift, snr << shift); snr = Div_32(0x00008000 << shift, snr << shift);
} }
else else
{ {
snr = 0x7fffffff; snr = 0x7fffffff;
} }
/* upper limit is -1 dB */ /* upper limit is -1 dB */
snr = min(snr, c_maxsnr); snr = min(snr, c_maxsnr);
/* lower limit is -25 dB */ /* lower limit is -25 dB */
@@ -354,7 +354,7 @@ Word16 InitPsyConfigurationLong(Word32 bitrate,
/* /*
init sfb table init sfb table
*/ */
samplerateindex = GetSRIndex(samplerate); samplerateindex = GetSRIndex(samplerate);
psyConf->sfbCnt = sfBandTotalLong[samplerateindex]; psyConf->sfbCnt = sfBandTotalLong[samplerateindex];
psyConf->sfbOffset = sfBandTabLong + sfBandTabLongOffset[samplerateindex]; psyConf->sfbOffset = sfBandTabLong + sfBandTabLongOffset[samplerateindex];
psyConf->sampRateIdx = samplerateindex; psyConf->sampRateIdx = samplerateindex;
@@ -391,19 +391,19 @@ Word16 InitPsyConfigurationLong(Word32 bitrate,
/* /*
init ratio init ratio
*/ */
psyConf->ratio = c_ratio; psyConf->ratio = c_ratio;
psyConf->maxAllowedIncreaseFactor = 2; psyConf->maxAllowedIncreaseFactor = 2;
psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor; /* 0.01 *(1 << 15)*/ psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor; /* 0.01 *(1 << 15)*/
psyConf->clipEnergy = c_maxClipEnergyLong; psyConf->clipEnergy = c_maxClipEnergyLong;
psyConf->lowpassLine = extract_l((bandwidth<<1) * FRAME_LEN_LONG / samplerate); psyConf->lowpassLine = extract_l((bandwidth<<1) * FRAME_LEN_LONG / samplerate);
for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) { for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) {
if (sub(psyConf->sfbOffset[sfb], psyConf->lowpassLine) >= 0) if (sub(psyConf->sfbOffset[sfb], psyConf->lowpassLine) >= 0)
break; break;
} }
psyConf->sfbActive = sfb; psyConf->sfbActive = sfb;
/* /*
calculate minSnr calculate minSnr
@@ -429,7 +429,7 @@ Word16 InitPsyConfigurationLong(Word32 bitrate,
Word16 InitPsyConfigurationShort(Word32 bitrate, Word16 InitPsyConfigurationShort(Word32 bitrate,
Word32 samplerate, Word32 samplerate,
Word16 bandwidth, Word16 bandwidth,
PSY_CONFIGURATION_SHORT *psyConf) PSY_CONFIGURATION_SHORT *psyConf)
{ {
Word32 samplerateindex; Word32 samplerateindex;
Word16 sfbBarcVal[MAX_SFB_SHORT]; Word16 sfbBarcVal[MAX_SFB_SHORT];
@@ -437,7 +437,7 @@ Word16 InitPsyConfigurationShort(Word32 bitrate,
/* /*
init sfb table init sfb table
*/ */
samplerateindex = GetSRIndex(samplerate); samplerateindex = GetSRIndex(samplerate);
psyConf->sfbCnt = sfBandTotalShort[samplerateindex]; psyConf->sfbCnt = sfBandTotalShort[samplerateindex];
psyConf->sfbOffset = sfBandTabShort + sfBandTabShortOffset[samplerateindex]; psyConf->sfbOffset = sfBandTabShort + sfBandTabShortOffset[samplerateindex];
psyConf->sampRateIdx = samplerateindex; psyConf->sampRateIdx = samplerateindex;
@@ -473,21 +473,21 @@ Word16 InitPsyConfigurationShort(Word32 bitrate,
/* /*
init ratio init ratio
*/ */
psyConf->ratio = c_ratio; psyConf->ratio = c_ratio;
psyConf->maxAllowedIncreaseFactor = 2; psyConf->maxAllowedIncreaseFactor = 2;
psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor; psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor;
psyConf->clipEnergy = c_maxClipEnergyShort; psyConf->clipEnergy = c_maxClipEnergyShort;
psyConf->lowpassLine = extract_l(((bandwidth << 1) * FRAME_LEN_SHORT) / samplerate); psyConf->lowpassLine = extract_l(((bandwidth << 1) * FRAME_LEN_SHORT) / samplerate);
for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) { for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) {
if (psyConf->sfbOffset[sfb] >= psyConf->lowpassLine) if (psyConf->sfbOffset[sfb] >= psyConf->lowpassLine)
break; break;
} }
psyConf->sfbActive = sfb; psyConf->sfbActive = sfb;
/* /*
calculate minSnr calculate minSnr

View File

@@ -81,7 +81,7 @@ Word16 PsyNew(PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP)
Word32 *mdctSpectrum; Word32 *mdctSpectrum;
Word32 *scratchTNS; Word32 *scratchTNS;
Word16 *mdctDelayBuffer; Word16 *mdctDelayBuffer;
mdctSpectrum = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC); mdctSpectrum = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC);
if(NULL == mdctSpectrum) if(NULL == mdctSpectrum)
return 1; return 1;
@@ -99,7 +99,7 @@ Word16 PsyNew(PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP)
} }
for (i=0; i<nChan; i++){ for (i=0; i<nChan; i++){
hPsy->psyData[i].mdctDelayBuffer = mdctDelayBuffer + i*BLOCK_SWITCHING_OFFSET; hPsy->psyData[i].mdctDelayBuffer = mdctDelayBuffer + i*BLOCK_SWITCHING_OFFSET;
hPsy->psyData[i].mdctSpectrum = mdctSpectrum + i*FRAME_LEN_LONG; hPsy->psyData[i].mdctSpectrum = mdctSpectrum + i*FRAME_LEN_LONG;
} }
@@ -124,12 +124,12 @@ Word16 PsyDelete(PSY_KERNEL *hPsy, VO_MEM_OPERATOR *pMemOP)
{ {
if(hPsy->psyData[0].mdctDelayBuffer) if(hPsy->psyData[0].mdctDelayBuffer)
mem_free(pMemOP, hPsy->psyData[0].mdctDelayBuffer, VO_INDEX_ENC_AAC); mem_free(pMemOP, hPsy->psyData[0].mdctDelayBuffer, VO_INDEX_ENC_AAC);
if(hPsy->psyData[0].mdctSpectrum) if(hPsy->psyData[0].mdctSpectrum)
mem_free(pMemOP, hPsy->psyData[0].mdctSpectrum, VO_INDEX_ENC_AAC); mem_free(pMemOP, hPsy->psyData[0].mdctSpectrum, VO_INDEX_ENC_AAC);
for (nch=0; nch<MAX_CHANNELS; nch++){ for (nch=0; nch<MAX_CHANNELS; nch++){
hPsy->psyData[nch].mdctDelayBuffer = NULL; hPsy->psyData[nch].mdctDelayBuffer = NULL;
hPsy->psyData[nch].mdctSpectrum = NULL; hPsy->psyData[nch].mdctSpectrum = NULL;
} }
@@ -216,14 +216,14 @@ Word16 psyMainInit(PSY_KERNEL *hPsy,
if (!err) if (!err)
for(ch=0;ch < channels;ch++){ for(ch=0;ch < channels;ch++){
InitBlockSwitching(&hPsy->psyData[ch].blockSwitchingControl, InitBlockSwitching(&hPsy->psyData[ch].blockSwitchingControl,
bitRate, channels); bitRate, channels);
InitPreEchoControl(hPsy->psyData[ch].sfbThresholdnm1, InitPreEchoControl(hPsy->psyData[ch].sfbThresholdnm1,
hPsy->psyConfLong.sfbCnt, hPsy->psyConfLong.sfbCnt,
hPsy->psyConfLong.sfbThresholdQuiet); hPsy->psyConfLong.sfbThresholdQuiet);
hPsy->psyData[ch].mdctScalenm1 = 0; hPsy->psyData[ch].mdctScalenm1 = 0;
} }
return(err); return(err);
@@ -241,7 +241,7 @@ Word16 psyMainInit(PSY_KERNEL *hPsy,
Word16 psyMain(Word16 nChannels, Word16 psyMain(Word16 nChannels,
ELEMENT_INFO *elemInfo, ELEMENT_INFO *elemInfo,
Word16 *timeSignal, Word16 *timeSignal,
PSY_DATA psyData[MAX_CHANNELS], PSY_DATA psyData[MAX_CHANNELS],
TNS_DATA tnsData[MAX_CHANNELS], TNS_DATA tnsData[MAX_CHANNELS],
PSY_CONFIGURATION_LONG *hPsyConfLong, PSY_CONFIGURATION_LONG *hPsyConfLong,
@@ -260,8 +260,8 @@ Word16 psyMain(Word16 nChannels,
Word16 channels; Word16 channels;
Word16 maxScale; Word16 maxScale;
channels = elemInfo->nChannelsInEl; channels = elemInfo->nChannelsInEl;
maxScale = 0; maxScale = 0;
/* block switching */ /* block switching */
for(ch = 0; ch < channels; ch++) { for(ch = 0; ch < channels; ch++) {
@@ -291,7 +291,7 @@ Word16 psyMain(Word16 nChannels,
/* common scaling for all channels */ /* common scaling for all channels */
for (ch=0; ch<channels; ch++) { for (ch=0; ch<channels; ch++) {
Word16 scaleDiff = maxScale - mdctScalingArray[ch]; Word16 scaleDiff = maxScale - mdctScalingArray[ch];
if (scaleDiff > 0) { if (scaleDiff > 0) {
Word32 *Spectrum = psyData[ch].mdctSpectrum; Word32 *Spectrum = psyData[ch].mdctSpectrum;
for(line=0; line<FRAME_LEN_LONG; line++) { for(line=0; line<FRAME_LEN_LONG; line++) {
@@ -299,11 +299,11 @@ Word16 psyMain(Word16 nChannels,
Spectrum++; Spectrum++;
} }
} }
psyData[ch].mdctScale = maxScale; psyData[ch].mdctScale = maxScale;
} }
for (ch=0; ch<channels; ch++) { for (ch=0; ch<channels; ch++) {
if(psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW) { if(psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW) {
/* update long block parameter */ /* update long block parameter */
advancePsychLong(&psyData[ch], advancePsychLong(&psyData[ch],
@@ -317,7 +317,7 @@ Word16 psyMain(Word16 nChannels,
/* determine maxSfb */ /* determine maxSfb */
for (sfb=hPsyConfLong->sfbCnt-1; sfb>=0; sfb--) { for (sfb=hPsyConfLong->sfbCnt-1; sfb>=0; sfb--) {
for (line=hPsyConfLong->sfbOffset[sfb+1] - 1; line>=hPsyConfLong->sfbOffset[sfb]; line--) { for (line=hPsyConfLong->sfbOffset[sfb+1] - 1; line>=hPsyConfLong->sfbOffset[sfb]; line--) {
if (psyData[ch].mdctSpectrum[line] != 0) break; if (psyData[ch].mdctSpectrum[line] != 0) break;
} }
if (line >= hPsyConfLong->sfbOffset[sfb]) break; if (line >= hPsyConfLong->sfbOffset[sfb]) break;
@@ -326,7 +326,7 @@ Word16 psyMain(Word16 nChannels,
/* Calc bandwise energies for mid and side channel /* Calc bandwise energies for mid and side channel
Do it only if 2 channels exist */ Do it only if 2 channels exist */
if (ch == 1) if (ch == 1)
advancePsychLongMS(psyData, hPsyConfLong); advancePsychLongMS(psyData, hPsyConfLong);
} }
@@ -341,7 +341,7 @@ Word16 psyMain(Word16 nChannels,
/* Calc bandwise energies for mid and side channel /* Calc bandwise energies for mid and side channel
Do it only if 2 channels exist */ Do it only if 2 channels exist */
if (ch == 1) if (ch == 1)
advancePsychShortMS (psyData, hPsyConfShort); advancePsychShortMS (psyData, hPsyConfShort);
} }
@@ -349,7 +349,7 @@ Word16 psyMain(Word16 nChannels,
/* group short data */ /* group short data */
for(ch=0; ch<channels; ch++) { for(ch=0; ch<channels; ch++) {
if (psyData[ch].blockSwitchingControl.windowSequence == SHORT_WINDOW) { if (psyData[ch].blockSwitchingControl.windowSequence == SHORT_WINDOW) {
groupShortData(psyData[ch].mdctSpectrum, groupShortData(psyData[ch].mdctSpectrum,
pScratchTns, pScratchTns,
@@ -374,10 +374,10 @@ Word16 psyMain(Word16 nChannels,
stereo Processing stereo Processing
*/ */
if (channels == 2) { if (channels == 2) {
psyOutElement->toolsInfo.msDigest = MS_NONE; psyOutElement->toolsInfo.msDigest = MS_NONE;
maxSfbPerGroup[0] = maxSfbPerGroup[1] = max(maxSfbPerGroup[0], maxSfbPerGroup[1]); maxSfbPerGroup[0] = maxSfbPerGroup[1] = max(maxSfbPerGroup[0], maxSfbPerGroup[1]);
if (psyData[0].blockSwitchingControl.windowSequence != SHORT_WINDOW) if (psyData[0].blockSwitchingControl.windowSequence != SHORT_WINDOW)
MsStereoProcessing(psyData[0].sfbEnergy.sfbLong, MsStereoProcessing(psyData[0].sfbEnergy.sfbLong,
psyData[1].sfbEnergy.sfbLong, psyData[1].sfbEnergy.sfbLong,
@@ -420,7 +420,7 @@ Word16 psyMain(Word16 nChannels,
build output build output
*/ */
for(ch=0;ch<channels;ch++) { for(ch=0;ch<channels;ch++) {
if (psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW) if (psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW)
BuildInterface(psyData[ch].mdctSpectrum, BuildInterface(psyData[ch].mdctSpectrum,
psyData[ch].mdctScale, psyData[ch].mdctScale,
@@ -483,7 +483,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
/* low pass */ /* low pass */
data0 = psyData->mdctSpectrum + hPsyConfLong->lowpassLine; data0 = psyData->mdctSpectrum + hPsyConfLong->lowpassLine;
for(i=hPsyConfLong->lowpassLine; i<FRAME_LEN_LONG; i++) { for(i=hPsyConfLong->lowpassLine; i<FRAME_LEN_LONG; i++) {
*data0++ = 0; *data0++ = 0;
} }
/* Calc sfb-bandwise mdct-energies for left and right channel */ /* Calc sfb-bandwise mdct-energies for left and right channel */
@@ -505,7 +505,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
psyData->blockSwitchingControl.windowSequence, psyData->blockSwitchingControl.windowSequence,
psyData->sfbEnergy.sfbLong); psyData->sfbEnergy.sfbLong);
/* TnsSync */ /* TnsSync */
if (ch == 1) { if (ch == 1) {
TnsSync(tnsData, TnsSync(tnsData,
tnsData2, tnsData2,
@@ -514,7 +514,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
psyData->blockSwitchingControl.windowSequence); psyData->blockSwitchingControl.windowSequence);
} }
/* Tns Encoder */ /* Tns Encoder */
TnsEncode(&psyOutChannel->tnsInfo, TnsEncode(&psyOutChannel->tnsInfo,
tnsData, tnsData,
hPsyConfLong->sfbCnt, hPsyConfLong->sfbCnt,
@@ -532,15 +532,15 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
*data1++ = min(tdata, clipEnergy); *data1++ = min(tdata, clipEnergy);
} }
/* Calc sfb-bandwise mdct-energies for left and right channel again */ /* Calc sfb-bandwise mdct-energies for left and right channel again */
if (tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive!=0) { if (tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive!=0) {
Word16 tnsStartBand = hPsyConfLong->tnsConf.tnsStartBand; Word16 tnsStartBand = hPsyConfLong->tnsConf.tnsStartBand;
CalcBandEnergy( psyData->mdctSpectrum, CalcBandEnergy( psyData->mdctSpectrum,
hPsyConfLong->sfbOffset+tnsStartBand, hPsyConfLong->sfbOffset+tnsStartBand,
hPsyConfLong->sfbActive - tnsStartBand, hPsyConfLong->sfbActive - tnsStartBand,
psyData->sfbEnergy.sfbLong+tnsStartBand, psyData->sfbEnergy.sfbLong+tnsStartBand,
&psyData->sfbEnergySum.sfbLong); &psyData->sfbEnergySum.sfbLong);
data0 = psyData->sfbEnergy.sfbLong; data0 = psyData->sfbEnergy.sfbLong;
tdata = psyData->sfbEnergySum.sfbLong; tdata = psyData->sfbEnergySum.sfbLong;
for (i=0; i<tnsStartBand; i++) for (i=0; i<tnsStartBand; i++)
@@ -565,13 +565,13 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
data0++; data1++; data0++; data1++;
} }
/* preecho control */ /* preecho control */
if (psyData->blockSwitchingControl.windowSequence == STOP_WINDOW) { if (psyData->blockSwitchingControl.windowSequence == STOP_WINDOW) {
data0 = psyData->sfbThresholdnm1; data0 = psyData->sfbThresholdnm1;
for (i=hPsyConfLong->sfbCnt; i; i--) { for (i=hPsyConfLong->sfbCnt; i; i--) {
*data0++ = MAX_32; *data0++ = MAX_32;
} }
psyData->mdctScalenm1 = 0; psyData->mdctScalenm1 = 0;
} }
PreEchoControl( psyData->sfbThresholdnm1, PreEchoControl( psyData->sfbThresholdnm1,
@@ -581,15 +581,15 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
psyData->sfbThreshold.sfbLong, psyData->sfbThreshold.sfbLong,
psyData->mdctScale, psyData->mdctScale,
psyData->mdctScalenm1); psyData->mdctScalenm1);
psyData->mdctScalenm1 = psyData->mdctScale; psyData->mdctScalenm1 = psyData->mdctScale;
if (psyData->blockSwitchingControl.windowSequence== START_WINDOW) { if (psyData->blockSwitchingControl.windowSequence== START_WINDOW) {
data0 = psyData->sfbThresholdnm1; data0 = psyData->sfbThresholdnm1;
for (i=hPsyConfLong->sfbCnt; i; i--) { for (i=hPsyConfLong->sfbCnt; i; i--) {
*data0++ = MAX_32; *data0++ = MAX_32;
} }
psyData->mdctScalenm1 = 0; psyData->mdctScalenm1 = 0;
} }
/* apply tns mult table on cb thresholds */ /* apply tns mult table on cb thresholds */
@@ -603,13 +603,13 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
data0 = psyData->sfbSpreadedEnergy.sfbLong; data0 = psyData->sfbSpreadedEnergy.sfbLong;
data1 = psyData->sfbEnergy.sfbLong; data1 = psyData->sfbEnergy.sfbLong;
for (i=hPsyConfLong->sfbCnt; i; i--) { for (i=hPsyConfLong->sfbCnt; i; i--) {
//psyData->sfbSpreadedEnergy.sfbLong[i] = psyData->sfbEnergy.sfbLong[i]; //psyData->sfbSpreadedEnergy.sfbLong[i] = psyData->sfbEnergy.sfbLong[i];
*data0++ = *data1++; *data0++ = *data1++;
} }
/* spreading energy */ /* spreading energy */
SpreadingMax(hPsyConfLong->sfbCnt, SpreadingMax(hPsyConfLong->sfbCnt,
hPsyConfLong->sfbMaskLowFactorSprEn, hPsyConfLong->sfbMaskLowFactorSprEn,
hPsyConfLong->sfbMaskHighFactorSprEn, hPsyConfLong->sfbMaskHighFactorSprEn,
psyData->sfbSpreadedEnergy.sfbLong); psyData->sfbSpreadedEnergy.sfbLong);
@@ -619,7 +619,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
/***************************************************************************** /*****************************************************************************
* *
* function name: advancePsychLongMS * function name: advancePsychLongMS
* description: update mdct-energies for left add or minus right channel * description: update mdct-energies for left add or minus right channel
* for long block * for long block
* *
*****************************************************************************/ *****************************************************************************/
@@ -657,7 +657,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
Word32 w; Word32 w;
Word32 normEnergyShift = (psyData->mdctScale + 1) << 1; /* in reference code, mdct spectrum must be multipied with 2, so +1 */ Word32 normEnergyShift = (psyData->mdctScale + 1) << 1; /* in reference code, mdct spectrum must be multipied with 2, so +1 */
Word32 clipEnergy = hPsyConfShort->clipEnergy >> normEnergyShift; Word32 clipEnergy = hPsyConfShort->clipEnergy >> normEnergyShift;
Word32 wOffset = 0; Word32 wOffset = 0;
Word32 *data0, *data1; Word32 *data0, *data1;
for(w = 0; w < TRANS_FAC; w++) { for(w = 0; w < TRANS_FAC; w++) {
@@ -666,7 +666,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
/* low pass */ /* low pass */
data0 = psyData->mdctSpectrum + wOffset + hPsyConfShort->lowpassLine; data0 = psyData->mdctSpectrum + wOffset + hPsyConfShort->lowpassLine;
for(i=hPsyConfShort->lowpassLine; i<FRAME_LEN_SHORT; i++){ for(i=hPsyConfShort->lowpassLine; i<FRAME_LEN_SHORT; i++){
*data0++ = 0; *data0++ = 0;
} }
/* Calc sfb-bandwise mdct-energies for left and right channel */ /* Calc sfb-bandwise mdct-energies for left and right channel */
@@ -713,9 +713,9 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
*data0++ = min(tdata, clipEnergy); *data0++ = min(tdata, clipEnergy);
} }
/* Calc sfb-bandwise mdct-energies for left and right channel again */ /* Calc sfb-bandwise mdct-energies for left and right channel again */
if (tnsData->dataRaw.tnsShort.subBlockInfo[w].tnsActive != 0) { if (tnsData->dataRaw.tnsShort.subBlockInfo[w].tnsActive != 0) {
Word16 tnsStartBand = hPsyConfShort->tnsConf.tnsStartBand; Word16 tnsStartBand = hPsyConfShort->tnsConf.tnsStartBand;
CalcBandEnergy( psyData->mdctSpectrum+wOffset, CalcBandEnergy( psyData->mdctSpectrum+wOffset,
hPsyConfShort->sfbOffset+tnsStartBand, hPsyConfShort->sfbOffset+tnsStartBand,
(hPsyConfShort->sfbActive - tnsStartBand), (hPsyConfShort->sfbActive - tnsStartBand),
@@ -748,7 +748,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
} }
/* preecho */ /* preecho */
PreEchoControl( psyData->sfbThresholdnm1, PreEchoControl( psyData->sfbThresholdnm1,
hPsyConfShort->sfbCnt, hPsyConfShort->sfbCnt,
hPsyConfShort->maxAllowedIncreaseFactor, hPsyConfShort->maxAllowedIncreaseFactor,
@@ -770,14 +770,14 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
*data0++ = *data1++; *data0++ = *data1++;
} }
SpreadingMax(hPsyConfShort->sfbCnt, SpreadingMax(hPsyConfShort->sfbCnt,
hPsyConfShort->sfbMaskLowFactorSprEn, hPsyConfShort->sfbMaskLowFactorSprEn,
hPsyConfShort->sfbMaskHighFactorSprEn, hPsyConfShort->sfbMaskHighFactorSprEn,
psyData->sfbSpreadedEnergy.sfbShort[w]); psyData->sfbSpreadedEnergy.sfbShort[w]);
wOffset += FRAME_LEN_SHORT; wOffset += FRAME_LEN_SHORT;
} /* for TRANS_FAC */ } /* for TRANS_FAC */
psyData->mdctScalenm1 = psyData->mdctScale; psyData->mdctScalenm1 = psyData->mdctScale;
return 0; return 0;
} }
@@ -785,7 +785,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
/***************************************************************************** /*****************************************************************************
* *
* function name: advancePsychShortMS * function name: advancePsychShortMS
* description: update mdct-energies for left add or minus right channel * description: update mdct-energies for left add or minus right channel
* for short block * for short block
* *
*****************************************************************************/ *****************************************************************************/
@@ -793,7 +793,7 @@ static Word16 advancePsychShortMS (PSY_DATA psyData[MAX_CHANNELS],
const PSY_CONFIGURATION_SHORT *hPsyConfShort) const PSY_CONFIGURATION_SHORT *hPsyConfShort)
{ {
Word32 w, wOffset; Word32 w, wOffset;
wOffset = 0; wOffset = 0;
for(w=0; w<TRANS_FAC; w++) { for(w=0; w<TRANS_FAC; w++) {
CalcBandEnergyMS(psyData[0].mdctSpectrum+wOffset, CalcBandEnergyMS(psyData[0].mdctSpectrum+wOffset,
psyData[1].mdctSpectrum+wOffset, psyData[1].mdctSpectrum+wOffset,

View File

@@ -68,12 +68,12 @@ static Word16 calcFrameLen(Word32 bitRate,
result = (FRAME_LEN_LONG >> 3) * bitRate; result = (FRAME_LEN_LONG >> 3) * bitRate;
quot = result / sampleRate; quot = result / sampleRate;
if (mode == FRAME_LEN_BYTES_MODULO) { if (mode == FRAME_LEN_BYTES_MODULO) {
result -= quot * sampleRate; result -= quot * sampleRate;
} }
else { /* FRAME_LEN_BYTES_INT */ else { /* FRAME_LEN_BYTES_INT */
result = quot; result = quot;
} }
return result; return result;
@@ -83,7 +83,7 @@ static Word16 calcFrameLen(Word32 bitRate,
* *
* function name:framePadding * function name:framePadding
* description: Calculates if padding is needed for actual frame * description: Calculates if padding is needed for actual frame
* returns: paddingOn or not * returns: paddingOn or not
* *
*****************************************************************************/ *****************************************************************************/
static Word16 framePadding(Word32 bitRate, static Word16 framePadding(Word32 bitRate,
@@ -93,16 +93,16 @@ static Word16 framePadding(Word32 bitRate,
Word16 paddingOn; Word16 paddingOn;
Word16 difference; Word16 difference;
paddingOn = 0; paddingOn = 0;
difference = calcFrameLen( bitRate, difference = calcFrameLen( bitRate,
sampleRate, sampleRate,
FRAME_LEN_BYTES_MODULO ); FRAME_LEN_BYTES_MODULO );
*paddingRest = *paddingRest - difference; *paddingRest = *paddingRest - difference;
if (*paddingRest <= 0 ) { if (*paddingRest <= 0 ) {
paddingOn = 1; paddingOn = 1;
*paddingRest = *paddingRest + sampleRate; *paddingRest = *paddingRest + sampleRate;
} }
@@ -123,12 +123,12 @@ Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP)
Word32 i; Word32 i;
Word16 *quantSpec; Word16 *quantSpec;
Word16 *scf; Word16 *scf;
UWord16 *maxValueInSfb; UWord16 *maxValueInSfb;
quantSpec = (Word16 *)mem_malloc(pMemOP, nChannels * FRAME_LEN_LONG * sizeof(Word16), 32, VO_INDEX_ENC_AAC); quantSpec = (Word16 *)mem_malloc(pMemOP, nChannels * FRAME_LEN_LONG * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
if(NULL == quantSpec) if(NULL == quantSpec)
return 1; return 1;
scf = (Word16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(Word16), 32, VO_INDEX_ENC_AAC); scf = (Word16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
if(NULL == scf) if(NULL == scf)
{ {
return 1; return 1;
@@ -141,12 +141,12 @@ Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP)
for (i=0; i<nChannels; i++) { for (i=0; i<nChannels; i++) {
hQC->qcChannel[i].quantSpec = quantSpec + i*FRAME_LEN_LONG; hQC->qcChannel[i].quantSpec = quantSpec + i*FRAME_LEN_LONG;
hQC->qcChannel[i].maxValueInSfb = maxValueInSfb + i*MAX_GROUPED_SFB; hQC->qcChannel[i].maxValueInSfb = maxValueInSfb + i*MAX_GROUPED_SFB;
hQC->qcChannel[i].scf = scf + i*MAX_GROUPED_SFB; hQC->qcChannel[i].scf = scf + i*MAX_GROUPED_SFB;
} }
return 0; return 0;
} }
@@ -165,21 +165,21 @@ void QCOutDelete(QC_OUT* hQC, VO_MEM_OPERATOR *pMemOP)
{ {
if(hQC->qcChannel[0].quantSpec); if(hQC->qcChannel[0].quantSpec);
mem_free(pMemOP, hQC->qcChannel[0].quantSpec, VO_INDEX_ENC_AAC); mem_free(pMemOP, hQC->qcChannel[0].quantSpec, VO_INDEX_ENC_AAC);
if(hQC->qcChannel[0].maxValueInSfb) if(hQC->qcChannel[0].maxValueInSfb)
mem_free(pMemOP, hQC->qcChannel[0].maxValueInSfb, VO_INDEX_ENC_AAC); mem_free(pMemOP, hQC->qcChannel[0].maxValueInSfb, VO_INDEX_ENC_AAC);
if(hQC->qcChannel[0].scf) if(hQC->qcChannel[0].scf)
mem_free(pMemOP, hQC->qcChannel[0].scf, VO_INDEX_ENC_AAC); mem_free(pMemOP, hQC->qcChannel[0].scf, VO_INDEX_ENC_AAC);
for (i=0; i<MAX_CHANNELS; i++) { for (i=0; i<MAX_CHANNELS; i++) {
hQC->qcChannel[i].quantSpec = NULL; hQC->qcChannel[i].quantSpec = NULL;
hQC->qcChannel[i].maxValueInSfb = NULL; hQC->qcChannel[i].maxValueInSfb = NULL;
hQC->qcChannel[i].scf = NULL; hQC->qcChannel[i].scf = NULL;
} }
} }
} }
/********************************************************************************* /*********************************************************************************
@@ -204,8 +204,8 @@ Word16 QCNew(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
**********************************************************************************/ **********************************************************************************/
void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP) void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
{ {
/* /*
nothing to do nothing to do
*/ */
hQC=NULL; hQC=NULL;
@@ -221,15 +221,15 @@ void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
Word16 QCInit(QC_STATE *hQC, Word16 QCInit(QC_STATE *hQC,
struct QC_INIT *init) struct QC_INIT *init)
{ {
hQC->nChannels = init->elInfo->nChannelsInEl; hQC->nChannels = init->elInfo->nChannelsInEl;
hQC->maxBitsTot = init->maxBits; hQC->maxBitsTot = init->maxBits;
hQC->bitResTot = sub(init->bitRes, init->averageBits); hQC->bitResTot = sub(init->bitRes, init->averageBits);
hQC->averageBitsTot = init->averageBits; hQC->averageBitsTot = init->averageBits;
hQC->maxBitFac = init->maxBitFac; hQC->maxBitFac = init->maxBitFac;
hQC->padding.paddingRest = init->padding.paddingRest; hQC->padding.paddingRest = init->padding.paddingRest;
hQC->globStatBits = 3; /* for ID_END */ hQC->globStatBits = 3; /* for ID_END */
/* channel elements init */ /* channel elements init */
InitElementBits(&hQC->elementBits, InitElementBits(&hQC->elementBits,
@@ -248,13 +248,13 @@ Word16 QCInit(QC_STATE *hQC,
/********************************************************************************* /*********************************************************************************
* *
* function name: QCMain * function name: QCMain
* description: quantization and coding the spectrum * description: quantization and coding the spectrum
* returns: 0 if success * returns: 0 if success
* *
**********************************************************************************/ **********************************************************************************/
Word16 QCMain(QC_STATE* hQC, Word16 QCMain(QC_STATE* hQC,
ELEMENT_BITS* elBits, ELEMENT_BITS* elBits,
ATS_ELEMENT* adjThrStateElement, ATS_ELEMENT* adjThrStateElement,
PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* may be modified in-place */ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* may be modified in-place */
@@ -262,34 +262,34 @@ Word16 QCMain(QC_STATE* hQC,
QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS], /* out */ QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS], /* out */
QC_OUT_ELEMENT* qcOutElement, QC_OUT_ELEMENT* qcOutElement,
Word16 nChannels, Word16 nChannels,
Word16 ancillaryDataBytes) Word16 ancillaryDataBytes)
{ {
Word16 maxChDynBits[MAX_CHANNELS]; Word16 maxChDynBits[MAX_CHANNELS];
Word16 chBitDistribution[MAX_CHANNELS]; Word16 chBitDistribution[MAX_CHANNELS];
Word32 ch; Word32 ch;
if (elBits->bitResLevel < 0) { if (elBits->bitResLevel < 0) {
return -1; return -1;
} }
if (elBits->bitResLevel > elBits->maxBitResBits) { if (elBits->bitResLevel > elBits->maxBitResBits) {
return -1; return -1;
} }
qcOutElement->staticBitsUsed = countStaticBitdemand(psyOutChannel, qcOutElement->staticBitsUsed = countStaticBitdemand(psyOutChannel,
psyOutElement, psyOutElement,
nChannels, nChannels,
qcOutElement->adtsUsed); qcOutElement->adtsUsed);
if (ancillaryDataBytes) { if (ancillaryDataBytes) {
qcOutElement->ancBitsUsed = 7 + (ancillaryDataBytes << 3); qcOutElement->ancBitsUsed = 7 + (ancillaryDataBytes << 3);
if (ancillaryDataBytes >= 15) if (ancillaryDataBytes >= 15)
qcOutElement->ancBitsUsed = qcOutElement->ancBitsUsed + 8; qcOutElement->ancBitsUsed = qcOutElement->ancBitsUsed + 8;
} }
else { else {
qcOutElement->ancBitsUsed = 0; qcOutElement->ancBitsUsed = 0;
} }
CalcFormFactor(hQC->logSfbFormFactor, hQC->sfbNRelevantLines, hQC->logSfbEnergy, psyOutChannel, nChannels); CalcFormFactor(hQC->logSfbFormFactor, hQC->sfbNRelevantLines, hQC->logSfbEnergy, psyOutChannel, nChannels);
@@ -301,7 +301,7 @@ Word16 QCMain(QC_STATE* hQC,
psyOutElement, psyOutElement,
chBitDistribution, chBitDistribution,
hQC->logSfbEnergy, hQC->logSfbEnergy,
hQC->sfbNRelevantLines, hQC->sfbNRelevantLines,
qcOutElement, qcOutElement,
elBits, elBits,
nChannels, nChannels,
@@ -323,14 +323,14 @@ Word16 QCMain(QC_STATE* hQC,
maxChDynBits[ch] = extract_l(chBitDistribution[ch] * maxDynBits / 1000); maxChDynBits[ch] = extract_l(chBitDistribution[ch] * maxDynBits / 1000);
} }
qcOutElement->dynBitsUsed = 0; qcOutElement->dynBitsUsed = 0;
for (ch = 0; ch < nChannels; ch++) { for (ch = 0; ch < nChannels; ch++) {
Word32 chDynBits; Word32 chDynBits;
Flag constraintsFulfilled; Flag constraintsFulfilled;
Word32 iter; Word32 iter;
iter = 0; iter = 0;
do { do {
constraintsFulfilled = 1; constraintsFulfilled = 1;
QuantizeSpectrum(psyOutChannel[ch].sfbCnt, QuantizeSpectrum(psyOutChannel[ch].sfbCnt,
psyOutChannel[ch].maxSfbPerGroup, psyOutChannel[ch].maxSfbPerGroup,
@@ -340,14 +340,14 @@ Word16 QCMain(QC_STATE* hQC,
qcOutChannel[ch].globalGain, qcOutChannel[ch].globalGain,
qcOutChannel[ch].scf, qcOutChannel[ch].scf,
qcOutChannel[ch].quantSpec); qcOutChannel[ch].quantSpec);
if (calcMaxValueInSfb(psyOutChannel[ch].sfbCnt, if (calcMaxValueInSfb(psyOutChannel[ch].sfbCnt,
psyOutChannel[ch].maxSfbPerGroup, psyOutChannel[ch].maxSfbPerGroup,
psyOutChannel[ch].sfbPerGroup, psyOutChannel[ch].sfbPerGroup,
psyOutChannel[ch].sfbOffsets, psyOutChannel[ch].sfbOffsets,
qcOutChannel[ch].quantSpec, qcOutChannel[ch].quantSpec,
qcOutChannel[ch].maxValueInSfb) > MAX_QUANT) { qcOutChannel[ch].maxValueInSfb) > MAX_QUANT) {
constraintsFulfilled = 0; constraintsFulfilled = 0;
} }
chDynBits = dynBitCount(qcOutChannel[ch].quantSpec, chDynBits = dynBitCount(qcOutChannel[ch].quantSpec,
@@ -359,24 +359,24 @@ Word16 QCMain(QC_STATE* hQC,
psyOutChannel[ch].sfbPerGroup, psyOutChannel[ch].sfbPerGroup,
psyOutChannel[ch].sfbOffsets, psyOutChannel[ch].sfbOffsets,
&qcOutChannel[ch].sectionData); &qcOutChannel[ch].sectionData);
if (chDynBits >= maxChDynBits[ch]) { if (chDynBits >= maxChDynBits[ch]) {
constraintsFulfilled = 0; constraintsFulfilled = 0;
} }
if (!constraintsFulfilled) { if (!constraintsFulfilled) {
qcOutChannel[ch].globalGain = qcOutChannel[ch].globalGain + 1; qcOutChannel[ch].globalGain = qcOutChannel[ch].globalGain + 1;
} }
iter = iter + 1; iter = iter + 1;
} while(!constraintsFulfilled); } while(!constraintsFulfilled);
qcOutElement->dynBitsUsed = qcOutElement->dynBitsUsed + chDynBits; qcOutElement->dynBitsUsed = qcOutElement->dynBitsUsed + chDynBits;
qcOutChannel[ch].mdctScale = psyOutChannel[ch].mdctScale; qcOutChannel[ch].mdctScale = psyOutChannel[ch].mdctScale;
qcOutChannel[ch].groupingMask = psyOutChannel[ch].groupingMask; qcOutChannel[ch].groupingMask = psyOutChannel[ch].groupingMask;
qcOutChannel[ch].windowShape = psyOutChannel[ch].windowShape; qcOutChannel[ch].windowShape = psyOutChannel[ch].windowShape;
} }
/* save dynBitsUsed for correction of bits2pe relation */ /* save dynBitsUsed for correction of bits2pe relation */
@@ -411,13 +411,13 @@ static Word16 calcMaxValueInSfb(Word16 sfbCnt,
Word16 sfbOffs, sfb; Word16 sfbOffs, sfb;
Word16 maxValueAll; Word16 maxValueAll;
maxValueAll = 0; maxValueAll = 0;
for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) { for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) {
for (sfb = 0; sfb < maxSfbPerGroup; sfb++) { for (sfb = 0; sfb < maxSfbPerGroup; sfb++) {
Word16 line; Word16 line;
Word16 maxThisSfb; Word16 maxThisSfb;
maxThisSfb = 0; maxThisSfb = 0;
for (line = sfbOffset[sfbOffs+sfb]; line < sfbOffset[sfbOffs+sfb+1]; line++) { for (line = sfbOffset[sfbOffs+sfb]; line < sfbOffset[sfbOffs+sfb+1]; line++) {
Word16 absVal; Word16 absVal;
@@ -425,7 +425,7 @@ static Word16 calcMaxValueInSfb(Word16 sfbCnt,
maxThisSfb = max(maxThisSfb, absVal); maxThisSfb = max(maxThisSfb, absVal);
} }
maxValue[sfbOffs+sfb] = maxThisSfb; maxValue[sfbOffs+sfb] = maxThisSfb;
maxValueAll = max(maxValueAll, maxThisSfb); maxValueAll = max(maxValueAll, maxThisSfb);
} }
} }
@@ -441,15 +441,15 @@ static Word16 calcMaxValueInSfb(Word16 sfbCnt,
**********************************************************************************/ **********************************************************************************/
void updateBitres(QC_STATE* qcKernel, void updateBitres(QC_STATE* qcKernel,
QC_OUT* qcOut) QC_OUT* qcOut)
{ {
ELEMENT_BITS *elBits; ELEMENT_BITS *elBits;
qcKernel->bitResTot = 0; qcKernel->bitResTot = 0;
elBits = &qcKernel->elementBits; elBits = &qcKernel->elementBits;
if (elBits->averageBits > 0) { if (elBits->averageBits > 0) {
/* constant bitrate */ /* constant bitrate */
Word16 bitsUsed; Word16 bitsUsed;
@@ -460,8 +460,8 @@ void updateBitres(QC_STATE* qcKernel,
} }
else { else {
/* variable bitrate */ /* variable bitrate */
elBits->bitResLevel = elBits->maxBits; elBits->bitResLevel = elBits->maxBits;
qcKernel->bitResTot = qcKernel->maxBitsTot; qcKernel->bitResTot = qcKernel->maxBitsTot;
} }
} }
@@ -476,55 +476,55 @@ Word16 FinalizeBitConsumption(QC_STATE *qcKernel,
{ {
Word32 nFullFillElem; Word32 nFullFillElem;
Word32 totFillBits; Word32 totFillBits;
Word16 diffBits; Word16 diffBits;
Word16 bitsUsed; Word16 bitsUsed;
totFillBits = 0; totFillBits = 0;
qcOut->totStaticBitsUsed = qcKernel->globStatBits; qcOut->totStaticBitsUsed = qcKernel->globStatBits;
qcOut->totStaticBitsUsed += qcOut->qcElement.staticBitsUsed; qcOut->totStaticBitsUsed += qcOut->qcElement.staticBitsUsed;
qcOut->totDynBitsUsed = qcOut->qcElement.dynBitsUsed; qcOut->totDynBitsUsed = qcOut->qcElement.dynBitsUsed;
qcOut->totAncBitsUsed = qcOut->qcElement.ancBitsUsed; qcOut->totAncBitsUsed = qcOut->qcElement.ancBitsUsed;
qcOut->totFillBits = qcOut->qcElement.fillBits; qcOut->totFillBits = qcOut->qcElement.fillBits;
if (qcOut->qcElement.fillBits) { if (qcOut->qcElement.fillBits) {
totFillBits += qcOut->qcElement.fillBits; totFillBits += qcOut->qcElement.fillBits;
} }
nFullFillElem = (max((qcOut->totFillBits - 1), 0) / maxFillElemBits) * maxFillElemBits; nFullFillElem = (max((qcOut->totFillBits - 1), 0) / maxFillElemBits) * maxFillElemBits;
qcOut->totFillBits = qcOut->totFillBits - nFullFillElem; qcOut->totFillBits = qcOut->totFillBits - nFullFillElem;
/* check fill elements */ /* check fill elements */
if (qcOut->totFillBits > 0) { if (qcOut->totFillBits > 0) {
/* minimum Fillelement contains 7 (TAG + byte cnt) bits */ /* minimum Fillelement contains 7 (TAG + byte cnt) bits */
qcOut->totFillBits = max(7, qcOut->totFillBits); qcOut->totFillBits = max(7, qcOut->totFillBits);
/* fill element size equals n*8 + 7 */ /* fill element size equals n*8 + 7 */
qcOut->totFillBits = qcOut->totFillBits + ((8 - ((qcOut->totFillBits - 7) & 0x0007)) & 0x0007); qcOut->totFillBits = qcOut->totFillBits + ((8 - ((qcOut->totFillBits - 7) & 0x0007)) & 0x0007);
} }
qcOut->totFillBits = qcOut->totFillBits + nFullFillElem; qcOut->totFillBits = qcOut->totFillBits + nFullFillElem;
/* now distribute extra fillbits and alignbits over channel elements */ /* now distribute extra fillbits and alignbits over channel elements */
qcOut->alignBits = 7 - ((qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed + qcOut->alignBits = 7 - ((qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed +
qcOut->totAncBitsUsed + qcOut->totFillBits - 1) & 0x0007); qcOut->totAncBitsUsed + qcOut->totFillBits - 1) & 0x0007);
if ( (qcOut->alignBits + qcOut->totFillBits - totFillBits == 8) && if ( (qcOut->alignBits + qcOut->totFillBits - totFillBits == 8) &&
(qcOut->totFillBits > 8)) (qcOut->totFillBits > 8))
qcOut->totFillBits = qcOut->totFillBits - 8; qcOut->totFillBits = qcOut->totFillBits - 8;
diffBits = qcOut->alignBits + qcOut->totFillBits - totFillBits; diffBits = qcOut->alignBits + qcOut->totFillBits - totFillBits;
if(diffBits>=0) { if(diffBits>=0) {
qcOut->qcElement.fillBits += diffBits; qcOut->qcElement.fillBits += diffBits;
} }
bitsUsed = qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed + qcOut->totAncBitsUsed; bitsUsed = qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed + qcOut->totAncBitsUsed;
bitsUsed = bitsUsed + qcOut->totFillBits + qcOut->alignBits; bitsUsed = bitsUsed + qcOut->totFillBits + qcOut->alignBits;
if (bitsUsed > qcKernel->maxBitsTot) { if (bitsUsed > qcKernel->maxBitsTot) {
return -1; return -1;
} }
@@ -564,9 +564,9 @@ Word16 AdjustBitrate(QC_STATE *hQC,
codeBitsLast = hQC->averageBitsTot - hQC->globStatBits; codeBitsLast = hQC->averageBitsTot - hQC->globStatBits;
codeBits = frameLen - hQC->globStatBits; codeBits = frameLen - hQC->globStatBits;
/* calculate bits for every channel element */ /* calculate bits for every channel element */
if (codeBits != codeBitsLast) { if (codeBits != codeBitsLast) {
Word16 totalBits = 0; Word16 totalBits = 0;
hQC->elementBits.averageBits = (hQC->elementBits.relativeBits * codeBits) >> 16; /* relativeBits was scaled down by 2 */ hQC->elementBits.averageBits = (hQC->elementBits.relativeBits * codeBits) >> 16; /* relativeBits was scaled down by 2 */
totalBits += hQC->elementBits.averageBits; totalBits += hQC->elementBits.averageBits;
@@ -574,7 +574,7 @@ Word16 AdjustBitrate(QC_STATE *hQC,
hQC->elementBits.averageBits = hQC->elementBits.averageBits + (codeBits - totalBits); hQC->elementBits.averageBits = hQC->elementBits.averageBits + (codeBits - totalBits);
} }
hQC->averageBitsTot = frameLen; hQC->averageBitsTot = frameLen;
return 0; return 0;
} }

View File

@@ -34,32 +34,32 @@ static const Word32 XROUND = 0x33e425af; /* final rounding constant (-0.0946f+ 0
/***************************************************************************** /*****************************************************************************
* *
* function name:pow34 * function name:pow34
* description: calculate $x^{\frac{3}{4}}, for 0.5 < x < 1.0$. * description: calculate $x^{\frac{3}{4}}, for 0.5 < x < 1.0$.
* *
*****************************************************************************/ *****************************************************************************/
__inline Word32 pow34(Word32 x) __inline Word32 pow34(Word32 x)
{ {
/* index table using MANT_DIGITS bits, but mask out the sign bit and the MSB /* index table using MANT_DIGITS bits, but mask out the sign bit and the MSB
which is always one */ which is always one */
return mTab_3_4[(x >> (INT_BITS-2-MANT_DIGITS)) & (MANT_SIZE-1)]; return mTab_3_4[(x >> (INT_BITS-2-MANT_DIGITS)) & (MANT_SIZE-1)];
} }
/***************************************************************************** /*****************************************************************************
* *
* function name:quantizeSingleLine * function name:quantizeSingleLine
* description: quantizes spectrum * description: quantizes spectrum
* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain) * quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain)
* *
*****************************************************************************/ *****************************************************************************/
static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum) static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
{ {
Word32 e, minusFinalExp, finalShift; Word32 e, minusFinalExp, finalShift;
Word32 x; Word32 x;
Word16 qua = 0; Word16 qua = 0;
if (absSpectrum) { if (absSpectrum) {
e = norm_l(absSpectrum); e = norm_l(absSpectrum);
x = pow34(absSpectrum << e); x = pow34(absSpectrum << e);
@@ -71,7 +71,7 @@ static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
/* separate the exponent into a shift, and a multiply */ /* separate the exponent into a shift, and a multiply */
finalShift = minusFinalExp >> 4; finalShift = minusFinalExp >> 4;
if (finalShift < INT_BITS) { if (finalShift < INT_BITS) {
x = L_mpy_wx(x, pow2tominusNover16[minusFinalExp & 15]); x = L_mpy_wx(x, pow2tominusNover16[minusFinalExp & 15]);
@@ -84,7 +84,7 @@ static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
x >>= finalShift; x >>= finalShift;
else else
x <<= (-finalShift); x <<= (-finalShift);
qua = saturate(x); qua = saturate(x);
} }
} }
@@ -94,10 +94,10 @@ static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
/***************************************************************************** /*****************************************************************************
* *
* function name:quantizeLines * function name:quantizeLines
* description: quantizes spectrum lines * description: quantizes spectrum lines
* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain) * quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain)
* input: global gain, number of lines to process, spectral data * input: global gain, number of lines to process, spectral data
* output: quantized spectrum * output: quantized spectrum
* *
*****************************************************************************/ *****************************************************************************/
@@ -116,15 +116,15 @@ static void quantizeLines(const Word16 gain,
pquat = quantBorders[m]; pquat = quantBorders[m];
g += 16; g += 16;
if(g >= 0) if(g >= 0)
{ {
for (line=0; line<noOfLines; line++) { for (line=0; line<noOfLines; line++) {
Word32 qua; Word32 qua;
qua = 0; qua = 0;
mdctSpeL = mdctSpectrum[line]; mdctSpeL = mdctSpectrum[line];
if (mdctSpeL) { if (mdctSpeL) {
Word32 sa; Word32 sa;
Word32 saShft; Word32 saShft;
@@ -134,27 +134,27 @@ static void quantizeLines(const Word16 gain,
saShft = sa >> g; saShft = sa >> g;
if (saShft > pquat[0]) { if (saShft > pquat[0]) {
if (saShft < pquat[1]) { if (saShft < pquat[1]) {
qua = mdctSpeL>0 ? 1 : -1; qua = mdctSpeL>0 ? 1 : -1;
} }
else { else {
if (saShft < pquat[2]) { if (saShft < pquat[2]) {
qua = mdctSpeL>0 ? 2 : -2; qua = mdctSpeL>0 ? 2 : -2;
} }
else { else {
if (saShft < pquat[3]) { if (saShft < pquat[3]) {
qua = mdctSpeL>0 ? 3 : -3; qua = mdctSpeL>0 ? 3 : -3;
} }
else { else {
qua = quantizeSingleLine(gain, sa); qua = quantizeSingleLine(gain, sa);
/* adjust the sign. Since 0 < qua < 1, this cannot overflow. */ /* adjust the sign. Since 0 < qua < 1, this cannot overflow. */
if (mdctSpeL < 0) if (mdctSpeL < 0)
qua = -qua; qua = -qua;
} }
@@ -162,17 +162,17 @@ static void quantizeLines(const Word16 gain,
} }
} }
} }
quaSpectrum[line] = qua ; quaSpectrum[line] = qua ;
} }
} }
else else
{ {
for (line=0; line<noOfLines; line++) { for (line=0; line<noOfLines; line++) {
Word32 qua; Word32 qua;
qua = 0; qua = 0;
mdctSpeL = mdctSpectrum[line]; mdctSpeL = mdctSpectrum[line];
if (mdctSpeL) { if (mdctSpeL) {
Word32 sa; Word32 sa;
Word32 saShft; Word32 saShft;
@@ -181,27 +181,27 @@ static void quantizeLines(const Word16 gain,
saShft = sa << g; saShft = sa << g;
if (saShft > pquat[0]) { if (saShft > pquat[0]) {
if (saShft < pquat[1]) { if (saShft < pquat[1]) {
qua = mdctSpeL>0 ? 1 : -1; qua = mdctSpeL>0 ? 1 : -1;
} }
else { else {
if (saShft < pquat[2]) { if (saShft < pquat[2]) {
qua = mdctSpeL>0 ? 2 : -2; qua = mdctSpeL>0 ? 2 : -2;
} }
else { else {
if (saShft < pquat[3]) { if (saShft < pquat[3]) {
qua = mdctSpeL>0 ? 3 : -3; qua = mdctSpeL>0 ? 3 : -3;
} }
else { else {
qua = quantizeSingleLine(gain, sa); qua = quantizeSingleLine(gain, sa);
/* adjust the sign. Since 0 < qua < 1, this cannot overflow. */ /* adjust the sign. Since 0 < qua < 1, this cannot overflow. */
if (mdctSpeL < 0) if (mdctSpeL < 0)
qua = -qua; qua = -qua;
} }
@@ -209,8 +209,8 @@ static void quantizeLines(const Word16 gain,
} }
} }
} }
quaSpectrum[line] = qua ; quaSpectrum[line] = qua ;
} }
} }
} }
@@ -218,10 +218,10 @@ static void quantizeLines(const Word16 gain,
/***************************************************************************** /*****************************************************************************
* *
* function name:iquantizeLines * function name:iquantizeLines
* description: iquantizes spectrum lines without sign * description: iquantizes spectrum lines without sign
* mdctSpectrum = iquaSpectrum^4/3 *2^(0.25*gain) * mdctSpectrum = iquaSpectrum^4/3 *2^(0.25*gain)
* input: global gain, number of lines to process,quantized spectrum * input: global gain, number of lines to process,quantized spectrum
* output: spectral data * output: spectral data
* *
*****************************************************************************/ *****************************************************************************/
@@ -234,11 +234,11 @@ static void iquantizeLines(const Word16 gain,
Word32 iquantizershift; Word32 iquantizershift;
Word32 line; Word32 line;
iquantizermod = gain & 3; iquantizermod = gain & 3;
iquantizershift = gain >> 2; iquantizershift = gain >> 2;
for (line=0; line<noOfLines; line++) { for (line=0; line<noOfLines; line++) {
if( quantSpectrum[line] != 0 ) { if( quantSpectrum[line] != 0 ) {
Word32 accu; Word32 accu;
Word32 ex; Word32 ex;
@@ -252,19 +252,19 @@ static void iquantizeLines(const Word16 gain,
accu = accu << ex; accu = accu << ex;
specExp = INT_BITS-1 - ex; specExp = INT_BITS-1 - ex;
tabIndex = (accu >> (INT_BITS-2-MANT_DIGITS)) & (~MANT_SIZE); tabIndex = (accu >> (INT_BITS-2-MANT_DIGITS)) & (~MANT_SIZE);
/* calculate "mantissa" ^4/3 */ /* calculate "mantissa" ^4/3 */
s = mTab_4_3[tabIndex]; s = mTab_4_3[tabIndex];
/* get approperiate exponent multiplier for specExp^3/4 combined with scfMod */ /* get approperiate exponent multiplier for specExp^3/4 combined with scfMod */
t = specExpMantTableComb_enc[iquantizermod][specExp]; t = specExpMantTableComb_enc[iquantizermod][specExp];
/* multiply "mantissa" ^4/3 with exponent multiplier */ /* multiply "mantissa" ^4/3 with exponent multiplier */
accu = MULHIGH(s, t); accu = MULHIGH(s, t);
/* get approperiate exponent shifter */ /* get approperiate exponent shifter */
specExp = specExpTableComb_enc[iquantizermod][specExp]; specExp = specExpTableComb_enc[iquantizermod][specExp];
specExp += iquantizershift + 1; specExp += iquantizershift + 1;
if(specExp >= 0) if(specExp >= 0)
@@ -273,7 +273,7 @@ static void iquantizeLines(const Word16 gain,
mdctSpectrum[line] = accu >> (-specExp); mdctSpectrum[line] = accu >> (-specExp);
} }
else { else {
mdctSpectrum[line] = 0; mdctSpectrum[line] = 0;
} }
} }
} }
@@ -301,7 +301,7 @@ void QuantizeSpectrum(Word16 sfbCnt,
for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) { for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) {
Word32 sfbNext ; Word32 sfbNext ;
for (sfb = 0; sfb < maxSfbPerGroup; sfb = sfbNext) { for (sfb = 0; sfb < maxSfbPerGroup; sfb = sfbNext) {
Word16 scalefactor = scalefactors[sfbOffs+sfb]; Word16 scalefactor = scalefactors[sfbOffs+sfb];
/* coalesce sfbs with the same scalefactor */ /* coalesce sfbs with the same scalefactor */
for (sfbNext = sfb+1; for (sfbNext = sfb+1;
sfbNext < maxSfbPerGroup && scalefactor == scalefactors[sfbOffs+sfbNext]; sfbNext < maxSfbPerGroup && scalefactor == scalefactors[sfbOffs+sfbNext];
@@ -318,7 +318,7 @@ void QuantizeSpectrum(Word16 sfbCnt,
/***************************************************************************** /*****************************************************************************
* *
* function name:calcSfbDist * function name:calcSfbDist
* description: quantizes and requantizes lines to calculate distortion * description: quantizes and requantizes lines to calculate distortion
* input: number of lines to be quantized, ... * input: number of lines to be quantized, ...
* output: distortion * output: distortion
@@ -338,14 +338,14 @@ Word32 calcSfbDist(const Word32 *spec,
pquat = quantBorders[m]; pquat = quantBorders[m];
repquat = quantRecon[m]; repquat = quantRecon[m];
dist = 0; dist = 0;
g += 16; g += 16;
if(g2 < 0 && g >= 0) if(g2 < 0 && g >= 0)
{ {
g2 = -g2; g2 = -g2;
for(line=0; line<sfbWidth; line++) { for(line=0; line<sfbWidth; line++) {
if (spec[line]) { if (spec[line]) {
Word32 diff; Word32 diff;
Word32 distSingle; Word32 distSingle;
Word32 sa; Word32 sa;
@@ -359,19 +359,19 @@ Word32 calcSfbDist(const Word32 *spec,
distSingle = (saShft * saShft) >> g2; distSingle = (saShft * saShft) >> g2;
} }
else { else {
if (saShft < pquat[1]) { if (saShft < pquat[1]) {
diff = saShft - repquat[0]; diff = saShft - repquat[0];
distSingle = (diff * diff) >> g2; distSingle = (diff * diff) >> g2;
} }
else { else {
if (saShft < pquat[2]) { if (saShft < pquat[2]) {
diff = saShft - repquat[1]; diff = saShft - repquat[1];
distSingle = (diff * diff) >> g2; distSingle = (diff * diff) >> g2;
} }
else { else {
if (saShft < pquat[3]) { if (saShft < pquat[3]) {
diff = saShft - repquat[2]; diff = saShft - repquat[2];
distSingle = (diff * diff) >> g2; distSingle = (diff * diff) >> g2;
@@ -387,15 +387,15 @@ Word32 calcSfbDist(const Word32 *spec,
} }
} }
} }
dist = L_add(dist, distSingle); dist = L_add(dist, distSingle);
} }
} }
} }
else else
{ {
for(line=0; line<sfbWidth; line++) { for(line=0; line<sfbWidth; line++) {
if (spec[line]) { if (spec[line]) {
Word32 diff; Word32 diff;
Word32 distSingle; Word32 distSingle;
Word32 sa; Word32 sa;
@@ -408,19 +408,19 @@ Word32 calcSfbDist(const Word32 *spec,
distSingle = L_shl((saShft * saShft), g2); distSingle = L_shl((saShft * saShft), g2);
} }
else { else {
if (saShft < pquat[1]) { if (saShft < pquat[1]) {
diff = saShft - repquat[0]; diff = saShft - repquat[0];
distSingle = L_shl((diff * diff), g2); distSingle = L_shl((diff * diff), g2);
} }
else { else {
if (saShft < pquat[2]) { if (saShft < pquat[2]) {
diff = saShft - repquat[1]; diff = saShft - repquat[1];
distSingle = L_shl((diff * diff), g2); distSingle = L_shl((diff * diff), g2);
} }
else { else {
if (saShft < pquat[3]) { if (saShft < pquat[3]) {
diff = saShft - repquat[2]; diff = saShft - repquat[2];
distSingle = L_shl((diff * diff), g2); distSingle = L_shl((diff * diff), g2);
@@ -438,7 +438,7 @@ Word32 calcSfbDist(const Word32 *spec,
} }
dist = L_add(dist, distSingle); dist = L_add(dist, distSingle);
} }
} }
} }
return dist; return dist;

View File

@@ -30,17 +30,17 @@
static const Word16 MAX_SCF_DELTA = 60; static const Word16 MAX_SCF_DELTA = 60;
/*! /*!
constants reference in comments constants reference in comments
C0 = 6.75f; C0 = 6.75f;
C1 = -69.33295f; -16/3*log(MAX_QUANT+0.5-logCon)/log(2) C1 = -69.33295f; -16/3*log(MAX_QUANT+0.5-logCon)/log(2)
C2 = 4.0f; C2 = 4.0f;
C3 = 2.66666666f; C3 = 2.66666666f;
PE_C1 = 3.0f; log(8.0)/log(2) PE_C1 = 3.0f; log(8.0)/log(2)
PE_C2 = 1.3219281f; log(2.5)/log(2) PE_C2 = 1.3219281f; log(2.5)/log(2)
PE_C3 = 0.5593573f; 1-C2/C1 PE_C3 = 0.5593573f; 1-C2/C1
*/ */
#define FF_SQRT_BITS 7 #define FF_SQRT_BITS 7
@@ -55,15 +55,15 @@ constants reference in comments
/********************************************************************************* /*********************************************************************************
* *
* function name: formfac_sqrt * function name: formfac_sqrt
* description: calculates sqrt(x)/256 * description: calculates sqrt(x)/256
* *
**********************************************************************************/ **********************************************************************************/
__inline Word32 formfac_sqrt(Word32 x) __inline Word32 formfac_sqrt(Word32 x)
{ {
Word32 y; Word32 y;
Word32 preshift, postshift; Word32 preshift, postshift;
if (x==0) return 0; if (x==0) return 0;
preshift = norm_l(x) - (INT_BITS-1-FF_SQRT_BITS); preshift = norm_l(x) - (INT_BITS-1-FF_SQRT_BITS);
postshift = preshift >> 1; postshift = preshift >> 1;
@@ -74,12 +74,12 @@ __inline Word32 formfac_sqrt(Word32 x)
else else
y = x >> (-preshift); y = x >> (-preshift);
y = formfac_sqrttable[y-32]; y = formfac_sqrttable[y-32];
if(postshift >= 0) if(postshift >= 0)
y = y >> postshift; y = y >> postshift;
else else
y = y << (-postshift); y = y << (-postshift);
return y; return y;
} }
@@ -100,19 +100,19 @@ CalcFormFactorChannel(Word16 *logSfbFormFactor,
Word32 sfbw, sfbw1; Word32 sfbw, sfbw1;
Word32 i, j; Word32 i, j;
Word32 sfbOffs, sfb, shift; Word32 sfbOffs, sfb, shift;
sfbw = sfbw1 = 0; sfbw = sfbw1 = 0;
for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup){ for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup){
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
i = sfbOffs+sfb; i = sfbOffs+sfb;
if (psyOutChan->sfbEnergy[i] > psyOutChan->sfbThreshold[i]) { if (psyOutChan->sfbEnergy[i] > psyOutChan->sfbThreshold[i]) {
Word32 accu, avgFormFactor,iSfbWidth; Word32 accu, avgFormFactor,iSfbWidth;
Word32 *mdctSpec; Word32 *mdctSpec;
sfbw = psyOutChan->sfbOffsets[i+1] - psyOutChan->sfbOffsets[i]; sfbw = psyOutChan->sfbOffsets[i+1] - psyOutChan->sfbOffsets[i];
iSfbWidth = invSBF[(sfbw >> 2) - 1]; iSfbWidth = invSBF[(sfbw >> 2) - 1];
mdctSpec = psyOutChan->mdctSpectrum + psyOutChan->sfbOffsets[i]; mdctSpec = psyOutChan->mdctSpectrum + psyOutChan->sfbOffsets[i];
accu = 0; accu = 0;
/* calc sum of sqrt(spec) */ /* calc sum of sqrt(spec) */
for (j=sfbw; j; j--) { for (j=sfbw; j; j--) {
accu += formfac_sqrt(L_abs(*mdctSpec)); mdctSpec++; accu += formfac_sqrt(L_abs(*mdctSpec)); mdctSpec++;
@@ -129,7 +129,7 @@ CalcFormFactorChannel(Word16 *logSfbFormFactor,
} }
else { else {
/* set number of lines to zero */ /* set number of lines to zero */
sfbNRelevantLines[i] = 0; sfbNRelevantLines[i] = 0;
} }
} }
} }
@@ -141,68 +141,68 @@ CalcFormFactorChannel(Word16 *logSfbFormFactor,
* description: find better scalefactor with analysis by synthesis * description: find better scalefactor with analysis by synthesis
* *
**********************************************************************************/ **********************************************************************************/
static Word16 improveScf(Word32 *spec, static Word16 improveScf(Word32 *spec,
Word16 sfbWidth, Word16 sfbWidth,
Word32 thresh, Word32 thresh,
Word16 scf, Word16 scf,
Word16 minScf, Word16 minScf,
Word32 *dist, Word32 *dist,
Word16 *minScfCalculated) Word16 *minScfCalculated)
{ {
Word32 cnt; Word32 cnt;
Word32 sfbDist; Word32 sfbDist;
Word32 scfBest; Word32 scfBest;
Word32 thresh125 = L_add(thresh, (thresh >> 2)); Word32 thresh125 = L_add(thresh, (thresh >> 2));
scfBest = scf; scfBest = scf;
/* calc real distortion */ /* calc real distortion */
sfbDist = calcSfbDist(spec, sfbWidth, scf); sfbDist = calcSfbDist(spec, sfbWidth, scf);
*minScfCalculated = scf; *minScfCalculated = scf;
if(!sfbDist) if(!sfbDist)
return scfBest; return scfBest;
if (sfbDist > thresh125) { if (sfbDist > thresh125) {
Word32 scfEstimated; Word32 scfEstimated;
Word32 sfbDistBest; Word32 sfbDistBest;
scfEstimated = scf; scfEstimated = scf;
sfbDistBest = sfbDist; sfbDistBest = sfbDist;
cnt = 0; cnt = 0;
while (sfbDist > thresh125 && (cnt < 3)) { while (sfbDist > thresh125 && (cnt < 3)) {
scf = scf + 1; scf = scf + 1;
sfbDist = calcSfbDist(spec, sfbWidth, scf); sfbDist = calcSfbDist(spec, sfbWidth, scf);
if (sfbDist < sfbDistBest) { if (sfbDist < sfbDistBest) {
scfBest = scf; scfBest = scf;
sfbDistBest = sfbDist; sfbDistBest = sfbDist;
} }
cnt = cnt + 1; cnt = cnt + 1;
} }
cnt = 0; cnt = 0;
scf = scfEstimated; scf = scfEstimated;
sfbDist = sfbDistBest; sfbDist = sfbDistBest;
while ((sfbDist > thresh125) && (cnt < 1) && (scf > minScf)) { while ((sfbDist > thresh125) && (cnt < 1) && (scf > minScf)) {
scf = scf - 1; scf = scf - 1;
sfbDist = calcSfbDist(spec, sfbWidth, scf); sfbDist = calcSfbDist(spec, sfbWidth, scf);
if (sfbDist < sfbDistBest) { if (sfbDist < sfbDistBest) {
scfBest = scf; scfBest = scf;
sfbDistBest = sfbDist; sfbDistBest = sfbDist;
} }
*minScfCalculated = scf; *minScfCalculated = scf;
cnt = cnt + 1; cnt = cnt + 1;
} }
*dist = sfbDistBest; *dist = sfbDistBest;
} }
else { else {
Word32 sfbDistBest; Word32 sfbDistBest;
Word32 sfbDistAllowed; Word32 sfbDistAllowed;
Word32 thresh08 = fixmul(COEF08_31, thresh); Word32 thresh08 = fixmul(COEF08_31, thresh);
sfbDistBest = sfbDist; sfbDistBest = sfbDist;
if (sfbDist < thresh08) if (sfbDist < thresh08)
sfbDistAllowed = sfbDist; sfbDistAllowed = sfbDist;
else else
@@ -210,16 +210,16 @@ static Word16 improveScf(Word32 *spec,
for (cnt=0; cnt<3; cnt++) { for (cnt=0; cnt<3; cnt++) {
scf = scf + 1; scf = scf + 1;
sfbDist = calcSfbDist(spec, sfbWidth, scf); sfbDist = calcSfbDist(spec, sfbWidth, scf);
if (fixmul(COEF08_31,sfbDist) < sfbDistAllowed) { if (fixmul(COEF08_31,sfbDist) < sfbDistAllowed) {
*minScfCalculated = scfBest + 1; *minScfCalculated = scfBest + 1;
scfBest = scf; scfBest = scf;
sfbDistBest = sfbDist; sfbDistBest = sfbDist;
} }
} }
*dist = sfbDistBest; *dist = sfbDistBest;
} }
/* return best scalefactor */ /* return best scalefactor */
return scfBest; return scfBest;
} }
@@ -233,10 +233,10 @@ static Word16 improveScf(Word32 *spec,
static Word16 countSingleScfBits(Word16 scf, Word16 scfLeft, Word16 scfRight) static Word16 countSingleScfBits(Word16 scf, Word16 scfLeft, Word16 scfRight)
{ {
Word16 scfBits; Word16 scfBits;
scfBits = bitCountScalefactorDelta(scfLeft - scf) + scfBits = bitCountScalefactorDelta(scfLeft - scf) +
bitCountScalefactorDelta(scf - scfRight); bitCountScalefactorDelta(scf - scfRight);
return scfBits; return scfBits;
} }
@@ -245,7 +245,7 @@ static Word16 countSingleScfBits(Word16 scf, Word16 scfLeft, Word16 scfRight)
* function name: calcSingleSpecPe * function name: calcSingleSpecPe
* description: ldRatio = log2(en(n)) - 0,375*scfGain(n) * description: ldRatio = log2(en(n)) - 0,375*scfGain(n)
* nbits = 0.7*nLines*ldRation for ldRation >= c1 * nbits = 0.7*nLines*ldRation for ldRation >= c1
* nbits = 0.7*nLines*(c2 + c3*ldRatio) for ldRation < c1 * nbits = 0.7*nLines*(c2 + c3*ldRatio) for ldRation < c1
* *
**********************************************************************************/ **********************************************************************************/
static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines) static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines)
@@ -253,18 +253,18 @@ static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines)
Word32 specPe; Word32 specPe;
Word32 ldRatio; Word32 ldRatio;
Word32 scf3; Word32 scf3;
ldRatio = sfbConstPePart << 3; /* (sfbConstPePart -0.375*scf)*8 */ ldRatio = sfbConstPePart << 3; /* (sfbConstPePart -0.375*scf)*8 */
scf3 = scf + scf + scf; scf3 = scf + scf + scf;
ldRatio = ldRatio - scf3; ldRatio = ldRatio - scf3;
if (ldRatio < PE_C1_8) { if (ldRatio < PE_C1_8) {
/* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/ /* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
ldRatio = (ldRatio + PE_C2_16) >> 1; ldRatio = (ldRatio + PE_C2_16) >> 1;
} }
specPe = nLines * ldRatio; specPe = nLines * ldRatio;
specPe = (specPe * PE_SCALE) >> 14; specPe = (specPe * PE_SCALE) >> 14;
return saturate(specPe); return saturate(specPe);
} }
@@ -275,53 +275,53 @@ static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines)
* description: count different scf bits used * description: count different scf bits used
* *
**********************************************************************************/ **********************************************************************************/
static Word16 countScfBitsDiff(Word16 *scfOld, Word16 *scfNew, static Word16 countScfBitsDiff(Word16 *scfOld, Word16 *scfNew,
Word16 sfbCnt, Word16 startSfb, Word16 stopSfb) Word16 sfbCnt, Word16 startSfb, Word16 stopSfb)
{ {
Word32 scfBitsDiff; Word32 scfBitsDiff;
Word32 sfb, sfbLast; Word32 sfb, sfbLast;
Word32 sfbPrev, sfbNext; Word32 sfbPrev, sfbNext;
scfBitsDiff = 0; scfBitsDiff = 0;
sfb = 0; sfb = 0;
/* search for first relevant sfb */ /* search for first relevant sfb */
sfbLast = startSfb; sfbLast = startSfb;
while (sfbLast < stopSfb && scfOld[sfbLast] == VOAAC_SHRT_MIN) { while (sfbLast < stopSfb && scfOld[sfbLast] == VOAAC_SHRT_MIN) {
sfbLast = sfbLast + 1; sfbLast = sfbLast + 1;
} }
/* search for previous relevant sfb and count diff */ /* search for previous relevant sfb and count diff */
sfbPrev = startSfb - 1; sfbPrev = startSfb - 1;
while ((sfbPrev>=0) && scfOld[sfbPrev] == VOAAC_SHRT_MIN) { while ((sfbPrev>=0) && scfOld[sfbPrev] == VOAAC_SHRT_MIN) {
sfbPrev = sfbPrev - 1; sfbPrev = sfbPrev - 1;
} }
if (sfbPrev>=0) { if (sfbPrev>=0) {
scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbPrev] - scfNew[sfbLast]) - scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbPrev] - scfNew[sfbLast]) -
bitCountScalefactorDelta(scfOld[sfbPrev] - scfOld[sfbLast]); bitCountScalefactorDelta(scfOld[sfbPrev] - scfOld[sfbLast]);
} }
/* now loop through all sfbs and count diffs of relevant sfbs */ /* now loop through all sfbs and count diffs of relevant sfbs */
for (sfb=sfbLast+1; sfb<stopSfb; sfb++) { for (sfb=sfbLast+1; sfb<stopSfb; sfb++) {
if (scfOld[sfb] != VOAAC_SHRT_MIN) { if (scfOld[sfb] != VOAAC_SHRT_MIN) {
scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfb]) - scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfb]) -
bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfb]); bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfb]);
sfbLast = sfb; sfbLast = sfb;
} }
} }
/* search for next relevant sfb and count diff */ /* search for next relevant sfb and count diff */
sfbNext = stopSfb; sfbNext = stopSfb;
while (sfbNext < sfbCnt && scfOld[sfbNext] == VOAAC_SHRT_MIN) { while (sfbNext < sfbCnt && scfOld[sfbNext] == VOAAC_SHRT_MIN) {
sfbNext = sfbNext + 1; sfbNext = sfbNext + 1;
} }
if (sfbNext < sfbCnt) if (sfbNext < sfbCnt)
scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfbNext]) - scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfbNext]) -
bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfbNext]); bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfbNext]);
return saturate(scfBitsDiff); return saturate(scfBitsDiff);
} }
@@ -331,52 +331,52 @@ static Word16 calcSpecPeDiff(Word16 *scfOld,
Word16 *logSfbEnergy, Word16 *logSfbEnergy,
Word16 *logSfbFormFactor, Word16 *logSfbFormFactor,
Word16 *sfbNRelevantLines, Word16 *sfbNRelevantLines,
Word16 startSfb, Word16 startSfb,
Word16 stopSfb) Word16 stopSfb)
{ {
Word32 specPeDiff; Word32 specPeDiff;
Word32 sfb; Word32 sfb;
specPeDiff = 0; specPeDiff = 0;
/* loop through all sfbs and count pe difference */ /* loop through all sfbs and count pe difference */
for (sfb=startSfb; sfb<stopSfb; sfb++) { for (sfb=startSfb; sfb<stopSfb; sfb++) {
if (scfOld[sfb] != VOAAC_SHRT_MIN) { if (scfOld[sfb] != VOAAC_SHRT_MIN) {
Word32 ldRatioOld, ldRatioNew; Word32 ldRatioOld, ldRatioNew;
Word32 scf3; Word32 scf3;
if (sfbConstPePart[sfb] == MIN_16) { if (sfbConstPePart[sfb] == MIN_16) {
sfbConstPePart[sfb] = ((logSfbEnergy[sfb] - sfbConstPePart[sfb] = ((logSfbEnergy[sfb] -
logSfbFormFactor[sfb]) + 11-8*4+3) >> 2; logSfbFormFactor[sfb]) + 11-8*4+3) >> 2;
} }
ldRatioOld = sfbConstPePart[sfb] << 3; ldRatioOld = sfbConstPePart[sfb] << 3;
scf3 = scfOld[sfb] + scfOld[sfb] + scfOld[sfb]; scf3 = scfOld[sfb] + scfOld[sfb] + scfOld[sfb];
ldRatioOld = ldRatioOld - scf3; ldRatioOld = ldRatioOld - scf3;
ldRatioNew = sfbConstPePart[sfb] << 3; ldRatioNew = sfbConstPePart[sfb] << 3;
scf3 = scfNew[sfb] + scfNew[sfb] + scfNew[sfb]; scf3 = scfNew[sfb] + scfNew[sfb] + scfNew[sfb];
ldRatioNew = ldRatioNew - scf3; ldRatioNew = ldRatioNew - scf3;
if (ldRatioOld < PE_C1_8) { if (ldRatioOld < PE_C1_8) {
/* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/ /* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
ldRatioOld = (ldRatioOld + PE_C2_16) >> 1; ldRatioOld = (ldRatioOld + PE_C2_16) >> 1;
} }
if (ldRatioNew < PE_C1_8) { if (ldRatioNew < PE_C1_8) {
/* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/ /* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
ldRatioNew = (ldRatioNew + PE_C2_16) >> 1; ldRatioNew = (ldRatioNew + PE_C2_16) >> 1;
} }
specPeDiff += sfbNRelevantLines[sfb] * (ldRatioNew - ldRatioOld); specPeDiff += sfbNRelevantLines[sfb] * (ldRatioNew - ldRatioOld);
} }
} }
specPeDiff = (specPeDiff * PE_SCALE) >> 14; specPeDiff = (specPeDiff * PE_SCALE) >> 14;
return saturate(specPeDiff); return saturate(specPeDiff);
} }
@@ -390,9 +390,9 @@ static Word16 calcSpecPeDiff(Word16 *scfOld,
* *
**********************************************************************************/ **********************************************************************************/
static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan, static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
Word16 *scf, Word16 *scf,
Word16 *minScf, Word16 *minScf,
Word32 *sfbDist, Word32 *sfbDist,
Word16 *sfbConstPePart, Word16 *sfbConstPePart,
Word16 *logSfbEnergy, Word16 *logSfbEnergy,
Word16 *logSfbFormFactor, Word16 *logSfbFormFactor,
@@ -411,94 +411,94 @@ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
Word16 *prevScfNext = psyOutChan->prevScfNext; Word16 *prevScfNext = psyOutChan->prevScfNext;
Word16 *deltaPeLast = psyOutChan->deltaPeLast; Word16 *deltaPeLast = psyOutChan->deltaPeLast;
Flag updateMinScfCalculated; Flag updateMinScfCalculated;
success = 0; success = 0;
deltaPe = 0; deltaPe = 0;
for(j=0;j<psyOutChan->sfbCnt;j++){ for(j=0;j<psyOutChan->sfbCnt;j++){
prevScfLast[j] = MAX_16; prevScfLast[j] = MAX_16;
prevScfNext[j] = MAX_16; prevScfNext[j] = MAX_16;
deltaPeLast[j] = MAX_16; deltaPeLast[j] = MAX_16;
} }
sfbLast = -1; sfbLast = -1;
sfbAct = -1; sfbAct = -1;
sfbNext = -1; sfbNext = -1;
scfLast = 0; scfLast = 0;
scfNext = 0; scfNext = 0;
scfMin = MAX_16; scfMin = MAX_16;
do { do {
/* search for new relevant sfb */ /* search for new relevant sfb */
sfbNext = sfbNext + 1; sfbNext = sfbNext + 1;
while (sfbNext < psyOutChan->sfbCnt && scf[sfbNext] == MIN_16) { while (sfbNext < psyOutChan->sfbCnt && scf[sfbNext] == MIN_16) {
sfbNext = sfbNext + 1; sfbNext = sfbNext + 1;
} }
if ((sfbLast>=0) && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) { if ((sfbLast>=0) && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) {
/* relevant scfs to the left and to the right */ /* relevant scfs to the left and to the right */
scfAct = scf[sfbAct]; scfAct = scf[sfbAct];
scfLast = scf + sfbLast; scfLast = scf + sfbLast;
scfNext = scf + sfbNext; scfNext = scf + sfbNext;
scfMin = min(*scfLast, *scfNext); scfMin = min(*scfLast, *scfNext);
} }
else { else {
if (sfbLast == -1 && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) { if (sfbLast == -1 && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) {
/* first relevant scf */ /* first relevant scf */
scfAct = scf[sfbAct]; scfAct = scf[sfbAct];
scfLast = &scfAct; scfLast = &scfAct;
scfNext = scf + sfbNext; scfNext = scf + sfbNext;
scfMin = *scfNext; scfMin = *scfNext;
} }
else { else {
if ((sfbLast>=0) && (sfbAct>=0) && sfbNext == psyOutChan->sfbCnt) { if ((sfbLast>=0) && (sfbAct>=0) && sfbNext == psyOutChan->sfbCnt) {
/* last relevant scf */ /* last relevant scf */
scfAct = scf[sfbAct]; scfAct = scf[sfbAct];
scfLast = scf + sfbLast; scfLast = scf + sfbLast;
scfNext = &scfAct; scfNext = &scfAct;
scfMin = *scfLast; scfMin = *scfLast;
} }
} }
} }
if (sfbAct>=0) if (sfbAct>=0)
scfMin = max(scfMin, minScf[sfbAct]); scfMin = max(scfMin, minScf[sfbAct]);
if ((sfbAct >= 0) && if ((sfbAct >= 0) &&
(sfbLast>=0 || sfbNext < psyOutChan->sfbCnt) && (sfbLast>=0 || sfbNext < psyOutChan->sfbCnt) &&
scfAct > scfMin && scfAct > scfMin &&
(*scfLast != prevScfLast[sfbAct] || (*scfLast != prevScfLast[sfbAct] ||
*scfNext != prevScfNext[sfbAct] || *scfNext != prevScfNext[sfbAct] ||
deltaPe < deltaPeLast[sfbAct])) { deltaPe < deltaPeLast[sfbAct])) {
success = 0; success = 0;
/* estimate required bits for actual scf */ /* estimate required bits for actual scf */
if (sfbConstPePart[sfbAct] == MIN_16) { if (sfbConstPePart[sfbAct] == MIN_16) {
sfbConstPePart[sfbAct] = logSfbEnergy[sfbAct] - sfbConstPePart[sfbAct] = logSfbEnergy[sfbAct] -
logSfbFormFactor[sfbAct] + 11-8*4; /* 4*log2(6.75) - 32 */ logSfbFormFactor[sfbAct] + 11-8*4; /* 4*log2(6.75) - 32 */
if (sfbConstPePart[sfbAct] < 0) if (sfbConstPePart[sfbAct] < 0)
sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] + 3; sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] + 3;
sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] >> 2; sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] >> 2;
} }
sfbPeOld = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) + sfbPeOld = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) +
countSingleScfBits(scfAct, *scfLast, *scfNext); countSingleScfBits(scfAct, *scfLast, *scfNext);
deltaPeNew = deltaPe; deltaPeNew = deltaPe;
updateMinScfCalculated = 1; updateMinScfCalculated = 1;
do { do {
scfAct = scfAct - 1; scfAct = scfAct - 1;
/* check only if the same check was not done before */ /* check only if the same check was not done before */
if (scfAct < minScfCalculated[sfbAct]) { if (scfAct < minScfCalculated[sfbAct]) {
sfbPeNew = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) + sfbPeNew = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) +
countSingleScfBits(scfAct, *scfLast, *scfNext); countSingleScfBits(scfAct, *scfLast, *scfNext);
/* use new scf if no increase in pe and /* use new scf if no increase in pe and
quantization error is smaller */ quantization error is smaller */
deltaPeTmp = deltaPe + sfbPeNew - sfbPeOld; deltaPeTmp = deltaPe + sfbPeNew - sfbPeOld;
if (deltaPeTmp < 10) { if (deltaPeTmp < 10) {
sfbDistNew = calcSfbDist(psyOutChan->mdctSpectrum+ sfbDistNew = calcSfbDist(psyOutChan->mdctSpectrum+
psyOutChan->sfbOffsets[sfbAct], psyOutChan->sfbOffsets[sfbAct],
@@ -506,46 +506,46 @@ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
scfAct); scfAct);
if (sfbDistNew < sfbDist[sfbAct]) { if (sfbDistNew < sfbDist[sfbAct]) {
/* success, replace scf by new one */ /* success, replace scf by new one */
scf[sfbAct] = scfAct; scf[sfbAct] = scfAct;
sfbDist[sfbAct] = sfbDistNew; sfbDist[sfbAct] = sfbDistNew;
deltaPeNew = deltaPeTmp; deltaPeNew = deltaPeTmp;
success = 1; success = 1;
} }
/* mark as already checked */ /* mark as already checked */
if (updateMinScfCalculated) { if (updateMinScfCalculated) {
minScfCalculated[sfbAct] = scfAct; minScfCalculated[sfbAct] = scfAct;
} }
} }
else { else {
updateMinScfCalculated = 0; updateMinScfCalculated = 0;
} }
} }
} while (scfAct > scfMin); } while (scfAct > scfMin);
deltaPe = deltaPeNew; deltaPe = deltaPeNew;
/* save parameters to avoid multiple computations of the same sfb */ /* save parameters to avoid multiple computations of the same sfb */
prevScfLast[sfbAct] = *scfLast; prevScfLast[sfbAct] = *scfLast;
prevScfNext[sfbAct] = *scfNext; prevScfNext[sfbAct] = *scfNext;
deltaPeLast[sfbAct] = deltaPe; deltaPeLast[sfbAct] = deltaPe;
} }
if (success && restartOnSuccess) { if (success && restartOnSuccess) {
/* start again at first sfb */ /* start again at first sfb */
sfbLast = -1; sfbLast = -1;
sfbAct = -1; sfbAct = -1;
sfbNext = -1; sfbNext = -1;
scfLast = 0; scfLast = 0;
scfNext = 0; scfNext = 0;
scfMin = MAX_16; scfMin = MAX_16;
success = 0; success = 0;
} }
else { else {
/* shift sfbs for next band */ /* shift sfbs for next band */
sfbLast = sfbAct; sfbLast = sfbAct;
sfbAct = sfbNext; sfbAct = sfbNext;
} }
} while (sfbNext < psyOutChan->sfbCnt); } while (sfbNext < psyOutChan->sfbCnt);
} }
@@ -557,9 +557,9 @@ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
* *
**********************************************************************************/ **********************************************************************************/
static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan, static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan,
Word16 *scf, Word16 *scf,
Word16 *minScf, Word16 *minScf,
Word32 *sfbDist, Word32 *sfbDist,
Word16 *sfbConstPePart, Word16 *sfbConstPePart,
Word16 *logSfbEnergy, Word16 *logSfbEnergy,
Word16 *logSfbFormFactor, Word16 *logSfbFormFactor,
@@ -574,95 +574,95 @@ static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan,
Word32 *sfbDistNew = psyOutChan->sfbDistNew; Word32 *sfbDistNew = psyOutChan->sfbDistNew;
Word16 *scfTmp = psyOutChan->prevScfLast; Word16 *scfTmp = psyOutChan->prevScfLast;
deltaPe = 0; deltaPe = 0;
sfbCnt = psyOutChan->sfbCnt; sfbCnt = psyOutChan->sfbCnt;
/* calc min and max scalfactors */ /* calc min and max scalfactors */
scfMin = MAX_16; scfMin = MAX_16;
scfMax = MIN_16; scfMax = MIN_16;
for (sfb=0; sfb<sfbCnt; sfb++) { for (sfb=0; sfb<sfbCnt; sfb++) {
if (scf[sfb] != MIN_16) { if (scf[sfb] != MIN_16) {
scfMin = min(scfMin, scf[sfb]); scfMin = min(scfMin, scf[sfb]);
scfMax = max(scfMax, scf[sfb]); scfMax = max(scfMax, scf[sfb]);
} }
} }
if (scfMax != MIN_16) { if (scfMax != MIN_16) {
scfAct = scfMax; scfAct = scfMax;
do { do {
scfAct = scfAct - 1; scfAct = scfAct - 1;
for (sfb=0; sfb<sfbCnt; sfb++) { for (sfb=0; sfb<sfbCnt; sfb++) {
scfTmp[sfb] = scf[sfb]; scfTmp[sfb] = scf[sfb];
} }
stopSfb = 0; stopSfb = 0;
do { do {
sfb = stopSfb; sfb = stopSfb;
while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] <= scfAct)) { while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] <= scfAct)) {
sfb = sfb + 1; sfb = sfb + 1;
} }
startSfb = sfb; startSfb = sfb;
sfb = sfb + 1; sfb = sfb + 1;
while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] > scfAct)) { while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] > scfAct)) {
sfb = sfb + 1; sfb = sfb + 1;
} }
stopSfb = sfb; stopSfb = sfb;
possibleRegionFound = 0; possibleRegionFound = 0;
if (startSfb < sfbCnt) { if (startSfb < sfbCnt) {
possibleRegionFound = 1; possibleRegionFound = 1;
for (sfb=startSfb; sfb<stopSfb; sfb++) { for (sfb=startSfb; sfb<stopSfb; sfb++) {
if (scf[sfb]!=MIN_16) { if (scf[sfb]!=MIN_16) {
if (scfAct < minScf[sfb]) { if (scfAct < minScf[sfb]) {
possibleRegionFound = 0; possibleRegionFound = 0;
break; break;
} }
} }
} }
} }
if (possibleRegionFound) { /* region found */ if (possibleRegionFound) { /* region found */
/* replace scfs in region by scfAct */ /* replace scfs in region by scfAct */
for (sfb=startSfb; sfb<stopSfb; sfb++) { for (sfb=startSfb; sfb<stopSfb; sfb++) {
if (scfTmp[sfb]!=MIN_16) if (scfTmp[sfb]!=MIN_16)
scfTmp[sfb] = scfAct; scfTmp[sfb] = scfAct;
} }
/* estimate change in bit demand for new scfs */ /* estimate change in bit demand for new scfs */
deltaScfBits = countScfBitsDiff(scf,scfTmp,sfbCnt,startSfb,stopSfb); deltaScfBits = countScfBitsDiff(scf,scfTmp,sfbCnt,startSfb,stopSfb);
deltaSpecPe = calcSpecPeDiff(scf, scfTmp, sfbConstPePart, deltaSpecPe = calcSpecPeDiff(scf, scfTmp, sfbConstPePart,
logSfbEnergy, logSfbFormFactor, sfbNRelevantLines, logSfbEnergy, logSfbFormFactor, sfbNRelevantLines,
startSfb, stopSfb); startSfb, stopSfb);
deltaPeNew = deltaPe + deltaScfBits + deltaSpecPe; deltaPeNew = deltaPe + deltaScfBits + deltaSpecPe;
if (deltaPeNew < 10) { if (deltaPeNew < 10) {
Word32 distOldSum, distNewSum; Word32 distOldSum, distNewSum;
/* quantize and calc sum of new distortion */ /* quantize and calc sum of new distortion */
distOldSum = 0; distOldSum = 0;
distNewSum = 0; distNewSum = 0;
for (sfb=startSfb; sfb<stopSfb; sfb++) { for (sfb=startSfb; sfb<stopSfb; sfb++) {
if (scfTmp[sfb] != MIN_16) { if (scfTmp[sfb] != MIN_16) {
distOldSum = L_add(distOldSum, sfbDist[sfb]); distOldSum = L_add(distOldSum, sfbDist[sfb]);
sfbDistNew[sfb] = calcSfbDist(psyOutChan->mdctSpectrum + sfbDistNew[sfb] = calcSfbDist(psyOutChan->mdctSpectrum +
psyOutChan->sfbOffsets[sfb], psyOutChan->sfbOffsets[sfb],
(psyOutChan->sfbOffsets[sfb+1] - psyOutChan->sfbOffsets[sfb]), (psyOutChan->sfbOffsets[sfb+1] - psyOutChan->sfbOffsets[sfb]),
scfAct); scfAct);
if (sfbDistNew[sfb] > psyOutChan->sfbThreshold[sfb]) { if (sfbDistNew[sfb] > psyOutChan->sfbThreshold[sfb]) {
distNewSum = distOldSum << 1; distNewSum = distOldSum << 1;
break; break;
@@ -670,20 +670,20 @@ static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan,
distNewSum = L_add(distNewSum, sfbDistNew[sfb]); distNewSum = L_add(distNewSum, sfbDistNew[sfb]);
} }
} }
if (distNewSum < distOldSum) { if (distNewSum < distOldSum) {
deltaPe = deltaPeNew; deltaPe = deltaPeNew;
for (sfb=startSfb; sfb<stopSfb; sfb++) { for (sfb=startSfb; sfb<stopSfb; sfb++) {
if (scf[sfb]!=MIN_16) { if (scf[sfb]!=MIN_16) {
scf[sfb] = scfAct; scf[sfb] = scfAct;
sfbDist[sfb] = sfbDistNew[sfb]; sfbDist[sfb] = sfbDistNew[sfb];
} }
} }
} }
} }
} }
} while (stopSfb <= sfbCnt); } while (stopSfb <= sfbCnt);
} while (scfAct > scfMin); } while (scfAct > scfMin);
} }
} }
@@ -710,125 +710,125 @@ EstimateScaleFactorsChannel(PSY_OUT_CHANNEL *psyOutChan,
Word32 *sfbDist = psyOutChan->sfbDist; Word32 *sfbDist = psyOutChan->sfbDist;
Word16 *minSfMaxQuant = psyOutChan->minSfMaxQuant; Word16 *minSfMaxQuant = psyOutChan->minSfMaxQuant;
Word16 *minScfCalculated = psyOutChan->minScfCalculated; Word16 *minScfCalculated = psyOutChan->minScfCalculated;
for (i=0; i<psyOutChan->sfbCnt; i++) { for (i=0; i<psyOutChan->sfbCnt; i++) {
Word32 sbfwith, sbfStart; Word32 sbfwith, sbfStart;
Word32 *mdctSpec; Word32 *mdctSpec;
thresh = psyOutChan->sfbThreshold[i]; thresh = psyOutChan->sfbThreshold[i];
energy = psyOutChan->sfbEnergy[i]; energy = psyOutChan->sfbEnergy[i];
sbfStart = psyOutChan->sfbOffsets[i]; sbfStart = psyOutChan->sfbOffsets[i];
sbfwith = psyOutChan->sfbOffsets[i+1] - sbfStart; sbfwith = psyOutChan->sfbOffsets[i+1] - sbfStart;
mdctSpec = psyOutChan->mdctSpectrum+sbfStart; mdctSpec = psyOutChan->mdctSpectrum+sbfStart;
maxSpec = 0; maxSpec = 0;
/* maximum of spectrum */ /* maximum of spectrum */
for (j=sbfwith; j; j-- ) { for (j=sbfwith; j; j-- ) {
Word32 absSpec = L_abs(*mdctSpec); mdctSpec++; Word32 absSpec = L_abs(*mdctSpec); mdctSpec++;
maxSpec |= absSpec; maxSpec |= absSpec;
} }
/* scfs without energy or with thresh>energy are marked with MIN_16 */ /* scfs without energy or with thresh>energy are marked with MIN_16 */
scf[i] = MIN_16; scf[i] = MIN_16;
minSfMaxQuant[i] = MIN_16; minSfMaxQuant[i] = MIN_16;
if ((maxSpec > 0) && (energy > thresh)) { if ((maxSpec > 0) && (energy > thresh)) {
energyPart = logSfbFormFactor[i]; energyPart = logSfbFormFactor[i];
thresholdPart = iLog4(thresh); thresholdPart = iLog4(thresh);
/* -20 = 4*log2(6.75) - 32 */ /* -20 = 4*log2(6.75) - 32 */
scfInt = ((thresholdPart - energyPart - 20) * SCALE_ESTIMATE_COEF) >> 15; scfInt = ((thresholdPart - energyPart - 20) * SCALE_ESTIMATE_COEF) >> 15;
minSfMaxQuant[i] = iLog4(maxSpec) - 68; /* 68 -16/3*log(MAX_QUANT+0.5-logCon)/log(2) + 1 */ minSfMaxQuant[i] = iLog4(maxSpec) - 68; /* 68 -16/3*log(MAX_QUANT+0.5-logCon)/log(2) + 1 */
if (minSfMaxQuant[i] > scfInt) { if (minSfMaxQuant[i] > scfInt) {
scfInt = minSfMaxQuant[i]; scfInt = minSfMaxQuant[i];
} }
/* find better scalefactor with analysis by synthesis */ /* find better scalefactor with analysis by synthesis */
scfInt = improveScf(psyOutChan->mdctSpectrum+sbfStart, scfInt = improveScf(psyOutChan->mdctSpectrum+sbfStart,
sbfwith, sbfwith,
thresh, scfInt, minSfMaxQuant[i], thresh, scfInt, minSfMaxQuant[i],
&sfbDist[i], &minScfCalculated[i]); &sfbDist[i], &minScfCalculated[i]);
scf[i] = scfInt; scf[i] = scfInt;
} }
} }
/* scalefactor differece reduction */ /* scalefactor differece reduction */
{ {
Word16 sfbConstPePart[MAX_GROUPED_SFB]; Word16 sfbConstPePart[MAX_GROUPED_SFB];
for(i=0;i<psyOutChan->sfbCnt;i++) { for(i=0;i<psyOutChan->sfbCnt;i++) {
sfbConstPePart[i] = MIN_16; sfbConstPePart[i] = MIN_16;
} }
assimilateSingleScf(psyOutChan, scf, assimilateSingleScf(psyOutChan, scf,
minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy, minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy,
logSfbFormFactor, sfbNRelevantLines, minScfCalculated, 1); logSfbFormFactor, sfbNRelevantLines, minScfCalculated, 1);
assimilateMultipleScf(psyOutChan, scf, assimilateMultipleScf(psyOutChan, scf,
minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy, minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy,
logSfbFormFactor, sfbNRelevantLines); logSfbFormFactor, sfbNRelevantLines);
} }
/* get max scalefac for global gain */ /* get max scalefac for global gain */
maxScf = MIN_16; maxScf = MIN_16;
minScf = MAX_16; minScf = MAX_16;
for (i=0; i<psyOutChan->sfbCnt; i++) { for (i=0; i<psyOutChan->sfbCnt; i++) {
if (maxScf < scf[i]) { if (maxScf < scf[i]) {
maxScf = scf[i]; maxScf = scf[i];
} }
if ((scf[i] != MIN_16) && (minScf > scf[i])) { if ((scf[i] != MIN_16) && (minScf > scf[i])) {
minScf = scf[i]; minScf = scf[i];
} }
} }
/* limit scf delta */ /* limit scf delta */
maxAllowedScf = minScf + MAX_SCF_DELTA; maxAllowedScf = minScf + MAX_SCF_DELTA;
for(i=0; i<psyOutChan->sfbCnt; i++) { for(i=0; i<psyOutChan->sfbCnt; i++) {
if ((scf[i] != MIN_16) && (maxAllowedScf < scf[i])) { if ((scf[i] != MIN_16) && (maxAllowedScf < scf[i])) {
scf[i] = maxAllowedScf; scf[i] = maxAllowedScf;
} }
} }
/* new maxScf if any scf has been limited */ /* new maxScf if any scf has been limited */
if (maxAllowedScf < maxScf) { if (maxAllowedScf < maxScf) {
maxScf = maxAllowedScf; maxScf = maxAllowedScf;
} }
/* calc loop scalefactors */ /* calc loop scalefactors */
if (maxScf > MIN_16) { if (maxScf > MIN_16) {
*globalGain = maxScf; *globalGain = maxScf;
lastSf = 0; lastSf = 0;
for(i=0; i<psyOutChan->sfbCnt; i++) { for(i=0; i<psyOutChan->sfbCnt; i++) {
if (scf[i] == MIN_16) { if (scf[i] == MIN_16) {
scf[i] = lastSf; scf[i] = lastSf;
/* set band explicitely to zero */ /* set band explicitely to zero */
for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) { for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) {
psyOutChan->mdctSpectrum[j] = 0; psyOutChan->mdctSpectrum[j] = 0;
} }
} }
else { else {
scf[i] = maxScf - scf[i]; scf[i] = maxScf - scf[i];
lastSf = scf[i]; lastSf = scf[i];
} }
} }
} }
else{ else{
*globalGain = 0; *globalGain = 0;
/* set spectrum explicitely to zero */ /* set spectrum explicitely to zero */
for(i=0; i<psyOutChan->sfbCnt; i++) { for(i=0; i<psyOutChan->sfbCnt; i++) {
scf[i] = 0; scf[i] = 0;
for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) { for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) {
psyOutChan->mdctSpectrum[j] = 0; psyOutChan->mdctSpectrum[j] = 0;
} }
} }
} }
@@ -848,7 +848,7 @@ CalcFormFactor(Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB],
const Word16 nChannels) const Word16 nChannels)
{ {
Word16 j; Word16 j;
for (j=0; j<nChannels; j++) { for (j=0; j<nChannels; j++) {
CalcFormFactorChannel(logSfbFormFactor[j], sfbNRelevantLines[j], logSfbEnergy[j], &psyOutChannel[j]); CalcFormFactorChannel(logSfbFormFactor[j], sfbNRelevantLines[j], logSfbEnergy[j], &psyOutChannel[j]);
} }
@@ -869,7 +869,7 @@ EstimateScaleFactors(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
const Word16 nChannels) const Word16 nChannels)
{ {
Word16 j; Word16 j;
for (j=0; j<nChannels; j++) { for (j=0; j<nChannels; j++) {
EstimateScaleFactorsChannel(&psyOutChannel[j], EstimateScaleFactorsChannel(&psyOutChannel[j],
qcOutChannel[j].scf, qcOutChannel[j].scf,

View File

@@ -52,9 +52,9 @@ static Word16 countMsMaskBits(Word16 sfbCnt,
struct TOOLSINFO *toolsInfo) struct TOOLSINFO *toolsInfo)
{ {
Word16 msBits, sfbOff, sfb; Word16 msBits, sfbOff, sfb;
msBits = 0; msBits = 0;
switch(toolsInfo->msDigest) { switch(toolsInfo->msDigest) {
case MS_NONE: case MS_NONE:
case MS_ALL: case MS_ALL:
@@ -85,34 +85,34 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType)
Word32 coefBits; Word32 coefBits;
Word16 *ptcoef; Word16 *ptcoef;
count = 0; count = 0;
if (blockType == 2) if (blockType == 2)
numOfWindows = 8; numOfWindows = 8;
else else
numOfWindows = 1; numOfWindows = 1;
tnsPresent = 0; tnsPresent = 0;
for (i=0; i<numOfWindows; i++) { for (i=0; i<numOfWindows; i++) {
if (tnsInfo->tnsActive[i]!=0) { if (tnsInfo->tnsActive[i]!=0) {
tnsPresent = 1; tnsPresent = 1;
} }
} }
if (tnsPresent) { if (tnsPresent) {
/* there is data to be written*/ /* there is data to be written*/
/*count += 1; */ /*count += 1; */
for (i=0; i<numOfWindows; i++) { for (i=0; i<numOfWindows; i++) {
if (blockType == 2) if (blockType == 2)
count += 1; count += 1;
else else
count += 2; count += 2;
if (tnsInfo->tnsActive[i]) { if (tnsInfo->tnsActive[i]) {
count += 1; count += 1;
if (blockType == 2) { if (blockType == 2) {
count += 4; count += 4;
count += 3; count += 3;
@@ -121,29 +121,29 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType)
count += 6; count += 6;
count += 5; count += 5;
} }
if (tnsInfo->order[i]) { if (tnsInfo->order[i]) {
count += 1; /*direction*/ count += 1; /*direction*/
count += 1; /*coef_compression */ count += 1; /*coef_compression */
if (tnsInfo->coefRes[i] == 4) { if (tnsInfo->coefRes[i] == 4) {
ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT; ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;
coefBits = 3; coefBits = 3;
for(k=0; k<tnsInfo->order[i]; k++) { for(k=0; k<tnsInfo->order[i]; k++) {
if ((ptcoef[k] > 3) || (ptcoef[k] < -4)) { if ((ptcoef[k] > 3) || (ptcoef[k] < -4)) {
coefBits = 4; coefBits = 4;
break; break;
} }
} }
} }
else { else {
coefBits = 2; coefBits = 2;
ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT; ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;
for(k=0; k<tnsInfo->order[i]; k++) { for(k=0; k<tnsInfo->order[i]; k++) {
if ((ptcoef[k] > 1) || (ptcoef[k] < -2)) { if ((ptcoef[k] > 1) || (ptcoef[k] < -2)) {
coefBits = 3; coefBits = 3;
break; break;
} }
} }
@@ -155,14 +155,14 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType)
} }
} }
} }
return count; return count;
} }
/********************************************************************************** /**********************************************************************************
* *
* function name: countTnsBits * function name: countTnsBits
* description: count tns bit demand * description: count tns bit demand
* *
**********************************************************************************/ **********************************************************************************/
static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType) static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType)
@@ -173,29 +173,29 @@ static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType)
/********************************************************************************* /*********************************************************************************
* *
* function name: countStaticBitdemand * function name: countStaticBitdemand
* description: count static bit demand include tns * description: count static bit demand include tns
* *
**********************************************************************************/ **********************************************************************************/
Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
PSY_OUT_ELEMENT *psyOutElement, PSY_OUT_ELEMENT *psyOutElement,
Word16 channels, Word16 channels,
Word16 adtsUsed) Word16 adtsUsed)
{ {
Word32 statBits; Word32 statBits;
Word32 ch; Word32 ch;
statBits = 0; statBits = 0;
/* if adts used, add 56 bits */ /* if adts used, add 56 bits */
if(adtsUsed) statBits += 56; if(adtsUsed) statBits += 56;
switch (channels) { switch (channels) {
case 1: case 1:
statBits += SI_ID_BITS+SI_SCE_BITS+SI_ICS_BITS; statBits += SI_ID_BITS+SI_SCE_BITS+SI_ICS_BITS;
statBits += countTnsBits(&(psyOutChannel[0].tnsInfo), statBits += countTnsBits(&(psyOutChannel[0].tnsInfo),
psyOutChannel[0].windowSequence); psyOutChannel[0].windowSequence);
switch(psyOutChannel[0].windowSequence){ switch(psyOutChannel[0].windowSequence){
case LONG_WINDOW: case LONG_WINDOW:
case START_WINDOW: case START_WINDOW:
@@ -215,7 +215,7 @@ Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
psyOutChannel[0].sfbPerGroup, psyOutChannel[0].sfbPerGroup,
psyOutChannel[0].maxSfbPerGroup, psyOutChannel[0].maxSfbPerGroup,
&psyOutElement->toolsInfo); &psyOutElement->toolsInfo);
switch (psyOutChannel[0].windowSequence) { switch (psyOutChannel[0].windowSequence) {
case LONG_WINDOW: case LONG_WINDOW:
case START_WINDOW: case START_WINDOW:

View File

@@ -100,20 +100,20 @@ static Word16 FreqToBandWithRounding(Word32 freq, /*!< frequen
/* assert(freq >= 0); */ /* assert(freq >= 0); */
shift = norm_l(fs); shift = norm_l(fs);
lineNumber = (extract_l(fixmul((bandStartOffset[numOfBands] << 2),Div_32(freq << shift,fs << shift))) + 1) >> 1; lineNumber = (extract_l(fixmul((bandStartOffset[numOfBands] << 2),Div_32(freq << shift,fs << shift))) + 1) >> 1;
/* freq > fs/2 */ /* freq > fs/2 */
temp = lineNumber - bandStartOffset[numOfBands] ; temp = lineNumber - bandStartOffset[numOfBands] ;
if (temp >= 0) if (temp >= 0)
return numOfBands; return numOfBands;
/* find band the line number lies in */ /* find band the line number lies in */
for (band=0; band<numOfBands; band++) { for (band=0; band<numOfBands; band++) {
temp = bandStartOffset[band + 1] - lineNumber; temp = bandStartOffset[band + 1] - lineNumber;
if (temp > 0) break; if (temp > 0) break;
} }
temp = (lineNumber - bandStartOffset[band]); temp = (lineNumber - bandStartOffset[band]);
temp = (temp - (bandStartOffset[band + 1] - lineNumber)); temp = (temp - (bandStartOffset[band + 1] - lineNumber));
if ( temp > 0 ) if ( temp > 0 )
{ {
band = band + 1; band = band + 1;
@@ -139,25 +139,25 @@ Word16 InitTnsConfigurationLong(Word32 bitRate, /*!< bitrate */
{ {
Word32 bitratePerChannel; Word32 bitratePerChannel;
tC->maxOrder = TNS_MAX_ORDER; tC->maxOrder = TNS_MAX_ORDER;
tC->tnsStartFreq = 1275; tC->tnsStartFreq = 1275;
tC->coefRes = 4; tC->coefRes = 4;
/* to avoid integer division */ /* to avoid integer division */
if ( sub(channels,2) == 0 ) { if ( sub(channels,2) == 0 ) {
bitratePerChannel = bitRate >> 1; bitratePerChannel = bitRate >> 1;
} }
else { else {
bitratePerChannel = bitRate; bitratePerChannel = bitRate;
} }
tC->tnsMaxSfb = tnsMaxBandsLongMainLow[pC->sampRateIdx]; tC->tnsMaxSfb = tnsMaxBandsLongMainLow[pC->sampRateIdx];
tC->tnsActive = active; tC->tnsActive = active;
/* now calc band and line borders */ /* now calc band and line borders */
tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb); tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb);
tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand]; tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand];
tC->tnsStartBand = FreqToBandWithRounding(tC->tnsStartFreq, sampleRate, tC->tnsStartBand = FreqToBandWithRounding(tC->tnsStartFreq, sampleRate,
pC->sfbCnt, (const Word16*)pC->sfbOffset); pC->sfbCnt, (const Word16*)pC->sfbOffset);
@@ -173,18 +173,18 @@ Word16 InitTnsConfigurationLong(Word32 bitRate, /*!< bitrate */
(const Word16*)pC->sfbOffset); (const Word16*)pC->sfbOffset);
tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand]; tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand];
tC->lpcStopBand = tnsMaxBandsLongMainLow[pC->sampRateIdx]; tC->lpcStopBand = tnsMaxBandsLongMainLow[pC->sampRateIdx];
tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive); tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive);
tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand]; tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand];
tC->lpcStartBand = tnsMinBandNumberLong[pC->sampRateIdx]; tC->lpcStartBand = tnsMinBandNumberLong[pC->sampRateIdx];
tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand]; tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
tC->threshold = TNS_GAIN_THRESH; tC->threshold = TNS_GAIN_THRESH;
return(0); return(0);
@@ -207,23 +207,23 @@ Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */
Word32 bitratePerChannel; Word32 bitratePerChannel;
tC->maxOrder = TNS_MAX_ORDER_SHORT; tC->maxOrder = TNS_MAX_ORDER_SHORT;
tC->tnsStartFreq = 2750; tC->tnsStartFreq = 2750;
tC->coefRes = 3; tC->coefRes = 3;
/* to avoid integer division */ /* to avoid integer division */
if ( sub(channels,2) == 0 ) { if ( sub(channels,2) == 0 ) {
bitratePerChannel = L_shr(bitRate,1); bitratePerChannel = L_shr(bitRate,1);
} }
else { else {
bitratePerChannel = bitRate; bitratePerChannel = bitRate;
} }
tC->tnsMaxSfb = tnsMaxBandsShortMainLow[pC->sampRateIdx]; tC->tnsMaxSfb = tnsMaxBandsShortMainLow[pC->sampRateIdx];
tC->tnsActive = active; tC->tnsActive = active;
/* now calc band and line borders */ /* now calc band and line borders */
tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb); tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb);
tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand]; tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand];
tC->tnsStartBand=FreqToBandWithRounding(tC->tnsStartFreq, sampleRate, tC->tnsStartBand=FreqToBandWithRounding(tC->tnsStartFreq, sampleRate,
pC->sfbCnt, (const Word16*)pC->sfbOffset); pC->sfbCnt, (const Word16*)pC->sfbOffset);
@@ -239,19 +239,19 @@ Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */
(const Word16*)pC->sfbOffset); (const Word16*)pC->sfbOffset);
tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand]; tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand];
tC->lpcStopBand = tnsMaxBandsShortMainLow[pC->sampRateIdx]; tC->lpcStopBand = tnsMaxBandsShortMainLow[pC->sampRateIdx];
tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive); tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive);
tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand]; tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand];
tC->lpcStartBand = tnsMinBandNumberShort[pC->sampRateIdx]; tC->lpcStartBand = tnsMinBandNumberShort[pC->sampRateIdx];
tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand]; tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
tC->threshold = TNS_GAIN_THRESH; tC->threshold = TNS_GAIN_THRESH;
return(0); return(0);
} }
@@ -259,7 +259,7 @@ Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */
/** /**
* *
* function name: TnsDetect * function name: TnsDetect
* description: Calculate TNS filter and decide on TNS usage * description: Calculate TNS filter and decide on TNS usage
* returns: 0 if success * returns: 0 if success
* *
*/ */
@@ -278,7 +278,7 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
Word32* pWork32 = &pScratchTns[subBlockNumber >> 8]; Word32* pWork32 = &pScratchTns[subBlockNumber >> 8];
Word16* pWeightedSpectrum = (Word16 *)&pScratchTns[subBlockNumber >> 8]; Word16* pWeightedSpectrum = (Word16 *)&pScratchTns[subBlockNumber >> 8];
if (tC.tnsActive) { if (tC.tnsActive) {
CalcWeightedSpectrum(spectrum, CalcWeightedSpectrum(spectrum,
pWeightedSpectrum, pWeightedSpectrum,
@@ -290,7 +290,7 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
tC.lpcStopBand, tC.lpcStopBand,
pWork32); pWork32);
temp = blockType - SHORT_WINDOW; temp = blockType - SHORT_WINDOW;
if ( temp != 0 ) { if ( temp != 0 ) {
predictionGain = CalcTnsFilter( &pWeightedSpectrum[tC.lpcStartLine], predictionGain = CalcTnsFilter( &pWeightedSpectrum[tC.lpcStartLine],
tC.acfWindow, tC.acfWindow,
@@ -299,15 +299,15 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
tnsData->dataRaw.tnsLong.subBlockInfo.parcor); tnsData->dataRaw.tnsLong.subBlockInfo.parcor);
temp = predictionGain - tC.threshold; temp = predictionGain - tC.threshold;
if ( temp > 0 ) { if ( temp > 0 ) {
tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 1; tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 1;
} }
else { else {
tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0; tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0;
} }
tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = predictionGain; tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = predictionGain;
} }
else{ else{
@@ -317,28 +317,28 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
tC.maxOrder, tC.maxOrder,
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].parcor); tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].parcor);
temp = predictionGain - tC.threshold; temp = predictionGain - tC.threshold;
if ( temp > 0 ) { if ( temp > 0 ) {
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 1; tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 1;
} }
else { else {
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0; tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0;
} }
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = predictionGain; tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = predictionGain;
} }
} }
else{ else{
temp = blockType - SHORT_WINDOW; temp = blockType - SHORT_WINDOW;
if ( temp != 0 ) { if ( temp != 0 ) {
tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0; tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0;
tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = 0; tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = 0;
} }
else { else {
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0; tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0;
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = 0; tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = 0;
} }
} }
@@ -362,21 +362,21 @@ void TnsSync(TNS_DATA *tnsDataDest,
const TNS_SUBBLOCK_INFO *sbInfoSrc; const TNS_SUBBLOCK_INFO *sbInfoSrc;
Word32 i, temp; Word32 i, temp;
temp = blockType - SHORT_WINDOW; temp = blockType - SHORT_WINDOW;
if ( temp != 0 ) { if ( temp != 0 ) {
sbInfoDest = &tnsDataDest->dataRaw.tnsLong.subBlockInfo; sbInfoDest = &tnsDataDest->dataRaw.tnsLong.subBlockInfo;
sbInfoSrc = &tnsDataSrc->dataRaw.tnsLong.subBlockInfo; sbInfoSrc = &tnsDataSrc->dataRaw.tnsLong.subBlockInfo;
} }
else { else {
sbInfoDest = &tnsDataDest->dataRaw.tnsShort.subBlockInfo[subBlockNumber]; sbInfoDest = &tnsDataDest->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
sbInfoSrc = &tnsDataSrc->dataRaw.tnsShort.subBlockInfo[subBlockNumber]; sbInfoSrc = &tnsDataSrc->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
} }
if (100*abs_s(sbInfoDest->predictionGain - sbInfoSrc->predictionGain) < if (100*abs_s(sbInfoDest->predictionGain - sbInfoSrc->predictionGain) <
(3 * sbInfoDest->predictionGain)) { (3 * sbInfoDest->predictionGain)) {
sbInfoDest->tnsActive = sbInfoSrc->tnsActive; sbInfoDest->tnsActive = sbInfoSrc->tnsActive;
for ( i=0; i< tC.maxOrder; i++) { for ( i=0; i< tC.maxOrder; i++) {
sbInfoDest->parcor[i] = sbInfoSrc->parcor[i]; sbInfoDest->parcor[i] = sbInfoSrc->parcor[i];
} }
} }
} }
@@ -402,11 +402,11 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */
Word32 temp; Word32 temp;
TNS_SUBBLOCK_INFO *psubBlockInfo; TNS_SUBBLOCK_INFO *psubBlockInfo;
temp_s = blockType - SHORT_WINDOW; temp_s = blockType - SHORT_WINDOW;
if ( temp_s != 0) { if ( temp_s != 0) {
psubBlockInfo = &tnsData->dataRaw.tnsLong.subBlockInfo; psubBlockInfo = &tnsData->dataRaw.tnsLong.subBlockInfo;
if (psubBlockInfo->tnsActive == 0) { if (psubBlockInfo->tnsActive == 0) {
tnsInfo->tnsActive[subBlockNumber] = 0; tnsInfo->tnsActive[subBlockNumber] = 0;
return(0); return(0);
} }
else { else {
@@ -422,22 +422,22 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */
tC.coefRes); tC.coefRes);
for (i=tC.maxOrder - 1; i>=0; i--) { for (i=tC.maxOrder - 1; i>=0; i--) {
temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH; temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH;
if ( temp > 0 ) if ( temp > 0 )
break; break;
temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH; temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
if ( temp < 0 ) if ( temp < 0 )
break; break;
} }
tnsInfo->order[subBlockNumber] = i + 1; tnsInfo->order[subBlockNumber] = i + 1;
tnsInfo->tnsActive[subBlockNumber] = 1; tnsInfo->tnsActive[subBlockNumber] = 1;
for (i=subBlockNumber+1; i<TRANS_FAC; i++) { for (i=subBlockNumber+1; i<TRANS_FAC; i++) {
tnsInfo->tnsActive[i] = 0; tnsInfo->tnsActive[i] = 0;
} }
tnsInfo->coefRes[subBlockNumber] = tC.coefRes; tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand; tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]), AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]),
@@ -448,10 +448,10 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */
} }
} /* if (blockType!=SHORT_WINDOW) */ } /* if (blockType!=SHORT_WINDOW) */
else /*short block*/ { else /*short block*/ {
psubBlockInfo = &tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber]; psubBlockInfo = &tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
if (psubBlockInfo->tnsActive == 0) { if (psubBlockInfo->tnsActive == 0) {
tnsInfo->tnsActive[subBlockNumber] = 0; tnsInfo->tnsActive[subBlockNumber] = 0;
return(0); return(0);
} }
else { else {
@@ -466,19 +466,19 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */
tC.maxOrder, tC.maxOrder,
tC.coefRes); tC.coefRes);
for (i=(tC.maxOrder - 1); i>=0; i--) { for (i=(tC.maxOrder - 1); i>=0; i--) {
temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH; temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH;
if ( temp > 0 ) if ( temp > 0 )
break; break;
temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH; temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
if ( temp < 0 ) if ( temp < 0 )
break; break;
} }
tnsInfo->order[subBlockNumber] = i + 1; tnsInfo->order[subBlockNumber] = i + 1;
tnsInfo->tnsActive[subBlockNumber] = 1; tnsInfo->tnsActive[subBlockNumber] = 1;
tnsInfo->coefRes[subBlockNumber] = tC.coefRes; tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand; tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]), (tC.tnsStopLine - tC.tnsStartLine), AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]), (tC.tnsStopLine - tC.tnsStartLine),
@@ -507,14 +507,14 @@ static Word32 m_pow2_cordic(Word32 x, Word16 scale)
{ {
Word32 k; Word32 k;
Word32 accu_y = 0x40000000; Word32 accu_y = 0x40000000;
accu_y = L_shr(accu_y,scale); accu_y = L_shr(accu_y,scale);
for(k=1; k<INT_BITS; k++) { for(k=1; k<INT_BITS; k++) {
const Word32 z = m_log2_table[k]; const Word32 z = m_log2_table[k];
while(L_sub(x,z) >= 0) { while(L_sub(x,z) >= 0) {
x = L_sub(x, z); x = L_sub(x, z);
accu_y = L_add(accu_y, (accu_y >> k)); accu_y = L_add(accu_y, (accu_y >> k));
} }
@@ -548,43 +548,43 @@ static void CalcWeightedSpectrum(const Word32 spectrum[], /*!< input sp
Word32 maxWS; Word32 maxWS;
Word32 tnsSfbMean[MAX_SFB]; /* length [lpcStopBand-lpcStartBand] should be sufficient here */ Word32 tnsSfbMean[MAX_SFB]; /* length [lpcStopBand-lpcStartBand] should be sufficient here */
maxWS = 0; maxWS = 0;
/* calc 1.0*2^-INT_BITS/2/sqrt(en) */ /* calc 1.0*2^-INT_BITS/2/sqrt(en) */
for( sfb = lpcStartBand; sfb < lpcStopBand; sfb++) { for( sfb = lpcStartBand; sfb < lpcStopBand; sfb++) {
tmp2 = sfbEnergy[sfb] - 2; tmp2 = sfbEnergy[sfb] - 2;
if( tmp2 > 0) { if( tmp2 > 0) {
tmp = rsqrt(sfbEnergy[sfb], INT_BITS); tmp = rsqrt(sfbEnergy[sfb], INT_BITS);
if(tmp > INT_BITS_SCAL) if(tmp > INT_BITS_SCAL)
{ {
shift = norm_l(tmp); shift = norm_l(tmp);
tmp = Div_32( INT_BITS_SCAL << shift, tmp << shift ); tmp = Div_32( INT_BITS_SCAL << shift, tmp << shift );
} }
else else
{ {
tmp = 0x7fffffff; tmp = 0x7fffffff;
} }
} }
else { else {
tmp = 0x7fffffff; tmp = 0x7fffffff;
} }
tnsSfbMean[sfb] = tmp; tnsSfbMean[sfb] = tmp;
} }
/* spread normalized values from sfbs to lines */ /* spread normalized values from sfbs to lines */
sfb = lpcStartBand; sfb = lpcStartBand;
tmp = tnsSfbMean[sfb]; tmp = tnsSfbMean[sfb];
for ( i=lpcStartLine; i<lpcStopLine; i++){ for ( i=lpcStartLine; i<lpcStopLine; i++){
tmp_s = sfbOffset[sfb + 1] - i; tmp_s = sfbOffset[sfb + 1] - i;
if ( tmp_s == 0 ) { if ( tmp_s == 0 ) {
sfb = sfb + 1; sfb = sfb + 1;
tmp2_s = sfb + 1 - lpcStopBand; tmp2_s = sfb + 1 - lpcStopBand;
if (tmp2_s <= 0) { if (tmp2_s <= 0) {
tmp = tnsSfbMean[sfb]; tmp = tnsSfbMean[sfb];
} }
} }
pWork32[i] = tmp; pWork32[i] = tmp;
} }
/*filter down*/ /*filter down*/
for (i=(lpcStopLine - 2); i>=lpcStartLine; i--){ for (i=(lpcStopLine - 2); i>=lpcStartLine; i--){
@@ -597,8 +597,8 @@ static void CalcWeightedSpectrum(const Word32 spectrum[], /*!< input sp
/* weight and normalize */ /* weight and normalize */
for (i=lpcStartLine; i<lpcStopLine; i++){ for (i=lpcStartLine; i<lpcStopLine; i++){
pWork32[i] = MULHIGH(pWork32[i], spectrum[i]); pWork32[i] = MULHIGH(pWork32[i], spectrum[i]);
maxWS |= L_abs(pWork32[i]); maxWS |= L_abs(pWork32[i]);
} }
maxShift = norm_l(maxWS); maxShift = norm_l(maxWS);
@@ -646,7 +646,7 @@ static Word16 CalcTnsFilter(const Word16 *signal,
assert(tnsOrder <= TNS_MAX_ORDER); /* remove asserts later? (btg) */ assert(tnsOrder <= TNS_MAX_ORDER); /* remove asserts later? (btg) */
for(i=0;i<tnsOrder;i++) { for(i=0;i<tnsOrder;i++) {
parcor[i] = 0; parcor[i] = 0;
} }
AutoCorrelation(signal, parcorWorkBuffer, numOfLines, tnsOrderPlus1); AutoCorrelation(signal, parcorWorkBuffer, numOfLines, tnsOrderPlus1);
@@ -678,15 +678,15 @@ void AutoCorrelation(const Word16 input[],
Word32 accu; Word32 accu;
Word32 scf; Word32 scf;
scf = 10 - 1; scf = 10 - 1;
isamples = samples; isamples = samples;
/* calc first corrCoef: R[0] = sum { t[i] * t[i] } ; i = 0..N-1 */ /* calc first corrCoef: R[0] = sum { t[i] * t[i] } ; i = 0..N-1 */
accu = 0; accu = 0;
for(j=0; j<isamples; j++) { for(j=0; j<isamples; j++) {
accu = L_add(accu, ((input[j] * input[j]) >> scf)); accu = L_add(accu, ((input[j] * input[j]) >> scf));
} }
corr[0] = accu; corr[0] = accu;
/* early termination if all corr coeffs are likely going to be zero */ /* early termination if all corr coeffs are likely going to be zero */
if(corr[0] == 0) return ; if(corr[0] == 0) return ;
@@ -694,13 +694,13 @@ void AutoCorrelation(const Word16 input[],
/* calc all other corrCoef: R[j] = sum { t[i] * t[i+j] } ; i = 0..(N-j-1), j=1..p */ /* calc all other corrCoef: R[j] = sum { t[i] * t[i+j] } ; i = 0..(N-j-1), j=1..p */
for(i=1; i<corrCoeff; i++) { for(i=1; i<corrCoeff; i++) {
isamples = isamples - 1; isamples = isamples - 1;
accu = 0; accu = 0;
for(j=0; j<isamples; j++) { for(j=0; j<isamples; j++) {
accu = L_add(accu, ((input[j] * input[j+i]) >> scf)); accu = L_add(accu, ((input[j] * input[j+i]) >> scf));
} }
corr[i] = accu; corr[i] = accu;
} }
} }
#endif #endif
/***************************************************************************** /*****************************************************************************
@@ -720,20 +720,20 @@ static Word16 AutoToParcor(Word32 workBuffer[], Word32 reflCoeff[], Word16 numOf
Word32 predictionGain = 0; Word32 predictionGain = 0;
Word32 num, denom; Word32 num, denom;
Word32 temp, workBuffer0; Word32 temp, workBuffer0;
num = workBuffer[0];
temp = workBuffer[numOfCoeff]; num = workBuffer[0];
temp = workBuffer[numOfCoeff];
for(i=0; i<numOfCoeff-1; i++) { for(i=0; i<numOfCoeff-1; i++) {
workBuffer[i + numOfCoeff] = workBuffer[i + 1]; workBuffer[i + numOfCoeff] = workBuffer[i + 1];
} }
workBuffer[i + numOfCoeff] = temp; workBuffer[i + numOfCoeff] = temp;
for(i=0; i<numOfCoeff; i++) { for(i=0; i<numOfCoeff; i++) {
Word32 refc; Word32 refc;
if (workBuffer[0] < L_abs(workBuffer[i + numOfCoeff])) { if (workBuffer[0] < L_abs(workBuffer[i + numOfCoeff])) {
return 0 ; return 0 ;
} }
@@ -742,21 +742,21 @@ static Word16 AutoToParcor(Word32 workBuffer[], Word32 reflCoeff[], Word16 numOf
/* calculate refc = -workBuffer[numOfCoeff+i] / workBuffer[0]; -1 <= refc < 1 */ /* calculate refc = -workBuffer[numOfCoeff+i] / workBuffer[0]; -1 <= refc < 1 */
refc = L_negate(fixmul(workBuffer[numOfCoeff + i], workBuffer0)); refc = L_negate(fixmul(workBuffer[numOfCoeff + i], workBuffer0));
reflCoeff[i] = refc; reflCoeff[i] = refc;
pWorkBuffer = &(workBuffer[numOfCoeff]); pWorkBuffer = &(workBuffer[numOfCoeff]);
for(j=i; j<numOfCoeff; j++) { for(j=i; j<numOfCoeff; j++) {
Word32 accu1, accu2; Word32 accu1, accu2;
accu1 = L_add(pWorkBuffer[j], fixmul(refc, workBuffer[j - i])); accu1 = L_add(pWorkBuffer[j], fixmul(refc, workBuffer[j - i]));
accu2 = L_add(workBuffer[j - i], fixmul(refc, pWorkBuffer[j])); accu2 = L_add(workBuffer[j - i], fixmul(refc, pWorkBuffer[j]));
pWorkBuffer[j] = accu1; pWorkBuffer[j] = accu1;
workBuffer[j - i] = accu2; workBuffer[j - i] = accu2;
} }
} }
denom = MULHIGH(workBuffer[0], NORM_COEF); denom = MULHIGH(workBuffer[0], NORM_COEF);
if (denom != 0) { if (denom != 0) {
Word32 temp; Word32 temp;
shift = norm_l(denom); shift = norm_l(denom);
@@ -774,11 +774,11 @@ static Word16 Search3(Word32 parcor)
Word32 index = 0; Word32 index = 0;
Word32 i; Word32 i;
Word32 temp; Word32 temp;
for (i=0;i<8;i++) { for (i=0;i<8;i++) {
temp = L_sub( parcor, tnsCoeff3Borders[i]); temp = L_sub( parcor, tnsCoeff3Borders[i]);
if (temp > 0) if (temp > 0)
index=i; index=i;
} }
return extract_l(index - 4); return extract_l(index - 4);
} }
@@ -788,12 +788,12 @@ static Word16 Search4(Word32 parcor)
Word32 index = 0; Word32 index = 0;
Word32 i; Word32 i;
Word32 temp; Word32 temp;
for (i=0;i<16;i++) { for (i=0;i<16;i++) {
temp = L_sub(parcor, tnsCoeff4Borders[i]); temp = L_sub(parcor, tnsCoeff4Borders[i]);
if (temp > 0) if (temp > 0)
index=i; index=i;
} }
return extract_l(index - 8); return extract_l(index - 8);
} }
@@ -814,12 +814,12 @@ static void Parcor2Index(const Word32 parcor[], /*!< parcor coefficients */
Word32 temp; Word32 temp;
for(i=0; i<order; i++) { for(i=0; i<order; i++) {
temp = bitsPerCoeff - 3; temp = bitsPerCoeff - 3;
if (temp == 0) { if (temp == 0) {
index[i] = Search3(parcor[i]); index[i] = Search3(parcor[i]);
} }
else { else {
index[i] = Search4(parcor[i]); index[i] = Search4(parcor[i]);
} }
} }
} }
@@ -839,12 +839,12 @@ static void Index2Parcor(const Word16 index[], /*!< quantized values */
Word32 temp; Word32 temp;
for (i=0; i<order; i++) { for (i=0; i<order; i++) {
temp = bitsPerCoeff - 4; temp = bitsPerCoeff - 4;
if ( temp == 0 ) { if ( temp == 0 ) {
parcor[i] = tnsCoeff4[index[i] + 8]; parcor[i] = tnsCoeff4[index[i] + 8];
} }
else { else {
parcor[i] = tnsCoeff3[index[i] + 4]; parcor[i] = tnsCoeff3[index[i] + 4];
} }
} }
} }
@@ -865,20 +865,20 @@ static Word32 FIRLattice(Word16 order, /*!< filter order */
Word32 accu,tmp,tmpSave; Word32 accu,tmp,tmpSave;
x = x >> 1; x = x >> 1;
tmpSave = x; tmpSave = x;
for (i=0; i<(order - 1); i++) { for (i=0; i<(order - 1); i++) {
tmp = L_add(fixmul(coef_par[i], x), state_par[i]); tmp = L_add(fixmul(coef_par[i], x), state_par[i]);
x = L_add(fixmul(coef_par[i], state_par[i]), x); x = L_add(fixmul(coef_par[i], state_par[i]), x);
state_par[i] = tmpSave; state_par[i] = tmpSave;
tmpSave = tmp; tmpSave = tmp;
} }
/* last stage: only need half operations */ /* last stage: only need half operations */
accu = fixmul(state_par[order - 1], coef_par[(order - 1)]); accu = fixmul(state_par[order - 1], coef_par[(order - 1)]);
state_par[(order - 1)] = tmpSave; state_par[(order - 1)] = tmpSave;
x = L_add(accu, x); x = L_add(accu, x);
x = L_add(x, x); x = L_add(x, x);
@@ -903,11 +903,11 @@ static void AnalysisFilterLattice(const Word32 signal[], /*!< input spectrum *
Word32 j; Word32 j;
for ( j=0; j<TNS_MAX_ORDER; j++ ) { for ( j=0; j<TNS_MAX_ORDER; j++ ) {
state_par[j] = 0; state_par[j] = 0;
} }
for(j=0; j<numOfLines; j++) { for(j=0; j<numOfLines; j++) {
output[j] = FIRLattice(order,signal[j],state_par,parCoeff); output[j] = FIRLattice(order,signal[j],state_par,parCoeff);
} }
} }
@@ -922,11 +922,11 @@ void ApplyTnsMultTableToRatios(Word16 startCb,
TNS_SUBBLOCK_INFO subInfo, /*!< TNS subblock info */ TNS_SUBBLOCK_INFO subInfo, /*!< TNS subblock info */
Word32 *thresholds) /*!< thresholds (modified) */ Word32 *thresholds) /*!< thresholds (modified) */
{ {
Word32 i; Word32 i;
if (subInfo.tnsActive) { if (subInfo.tnsActive) {
for(i=startCb; i<stopCb; i++) { for(i=startCb; i<stopCb; i++) {
/* thresholds[i] * 0.25 */ /* thresholds[i] * 0.25 */
thresholds[i] = (thresholds[i] >> 2); thresholds[i] = (thresholds[i] >> 2);
} }
} }
} }

View File

@@ -31,7 +31,7 @@
#define swap2(p0,p1) \ #define swap2(p0,p1) \
t = p0; t1 = *(&(p0)+1); \ t = p0; t1 = *(&(p0)+1); \
p0 = p1; *(&(p0)+1) = *(&(p1)+1); \ p0 = p1; *(&(p0)+1) = *(&(p1)+1); \
p1 = t; *(&(p1)+1) = t1 p1 = t; *(&(p1)+1) = t1
/********************************************************************************* /*********************************************************************************
* *
@@ -47,18 +47,18 @@ static void Shuffle(int *buf, int num, const unsigned char* bitTab)
part0 = buf; part0 = buf;
part1 = buf + num; part1 = buf + num;
while ((i = *bitTab++) != 0) { while ((i = *bitTab++) != 0) {
j = *bitTab++; j = *bitTab++;
swap2(part0[4*i+0], part0[4*j+0]); swap2(part0[4*i+0], part0[4*j+0]);
swap2(part0[4*i+2], part1[4*j+0]); swap2(part0[4*i+2], part1[4*j+0]);
swap2(part1[4*i+0], part0[4*j+2]); swap2(part1[4*i+0], part0[4*j+2]);
swap2(part1[4*i+2], part1[4*j+2]); swap2(part1[4*i+2], part1[4*j+2]);
} }
do { do {
swap2(part0[4*i+2], part1[4*i+0]); swap2(part0[4*i+2], part1[4*i+0]);
} while ((i = *bitTab++) != 0); } while ((i = *bitTab++) != 0);
} }
@@ -74,8 +74,8 @@ static void Radix4First(int *buf, int num)
{ {
int r0, r1, r2, r3; int r0, r1, r2, r3;
int r4, r5, r6, r7; int r4, r5, r6, r7;
for (; num != 0; num--) for (; num != 0; num--)
{ {
r0 = buf[0] + buf[2]; r0 = buf[0] + buf[2];
r1 = buf[1] + buf[3]; r1 = buf[1] + buf[3];
@@ -113,7 +113,7 @@ static void Radix8First(int *buf, int num)
int i4, i5, i6, i7; int i4, i5, i6, i7;
int t0, t1, t2, t3; int t0, t1, t2, t3;
for ( ; num != 0; num--) for ( ; num != 0; num--)
{ {
r0 = buf[0] + buf[2]; r0 = buf[0] + buf[2];
i0 = buf[1] + buf[3]; i0 = buf[1] + buf[3];
@@ -194,23 +194,23 @@ static void Radix4FFT(int *buf, int num, int bgn, int *twidTab)
int i, j, step; int i, j, step;
int *xptr, *csptr; int *xptr, *csptr;
for (num >>= 2; num != 0; num >>= 2) for (num >>= 2; num != 0; num >>= 2)
{ {
step = 2*bgn; step = 2*bgn;
xptr = buf; xptr = buf;
for (i = num; i != 0; i--) for (i = num; i != 0; i--)
{ {
csptr = twidTab; csptr = twidTab;
for (j = bgn; j != 0; j--) for (j = bgn; j != 0; j--)
{ {
r0 = xptr[0]; r0 = xptr[0];
r1 = xptr[1]; r1 = xptr[1];
xptr += step; xptr += step;
t0 = xptr[0]; t0 = xptr[0];
t1 = xptr[1]; t1 = xptr[1];
cosx = csptr[0]; cosx = csptr[0];
sinx = csptr[1]; sinx = csptr[1];
r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*br + sin*bi */ r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*br + sin*bi */
@@ -223,7 +223,7 @@ static void Radix4FFT(int *buf, int num, int bgn, int *twidTab)
r1 = t1 - r3; r1 = t1 - r3;
r2 = t0 + r2; r2 = t0 + r2;
r3 = t1 + r3; r3 = t1 + r3;
t0 = xptr[0]; t0 = xptr[0];
t1 = xptr[1]; t1 = xptr[1];
cosx = csptr[2]; cosx = csptr[2];
@@ -231,7 +231,7 @@ static void Radix4FFT(int *buf, int num, int bgn, int *twidTab)
r4 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*cr + sin*ci */ r4 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*cr + sin*ci */
r5 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*ci - sin*cr */ r5 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*ci - sin*cr */
xptr += step; xptr += step;
t0 = xptr[0]; t0 = xptr[0];
t1 = xptr[1]; t1 = xptr[1];
cosx = csptr[4]; cosx = csptr[4];
@@ -282,25 +282,25 @@ static void PreMDCT(int *buf0, int num, const int *csptr)
int tr1, ti1, tr2, ti2; int tr1, ti1, tr2, ti2;
int cosa, sina, cosb, sinb; int cosa, sina, cosb, sinb;
int *buf1; int *buf1;
buf1 = buf0 + num - 1; buf1 = buf0 + num - 1;
for(i = num >> 2; i != 0; i--) for(i = num >> 2; i != 0; i--)
{ {
cosa = *csptr++; cosa = *csptr++;
sina = *csptr++; sina = *csptr++;
cosb = *csptr++; cosb = *csptr++;
sinb = *csptr++; sinb = *csptr++;
tr1 = *(buf0 + 0); tr1 = *(buf0 + 0);
ti2 = *(buf0 + 1); ti2 = *(buf0 + 1);
tr2 = *(buf1 - 1); tr2 = *(buf1 - 1);
ti1 = *(buf1 + 0); ti1 = *(buf1 + 0);
*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1); *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
*buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1); *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1);
*buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2); *buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2);
*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2); *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
} }
} }
@@ -319,12 +319,12 @@ static void PostMDCT(int *buf0, int num, const int *csptr)
int *buf1; int *buf1;
buf1 = buf0 + num - 1; buf1 = buf0 + num - 1;
for(i = num >> 2; i != 0; i--) for(i = num >> 2; i != 0; i--)
{ {
cosa = *csptr++; cosa = *csptr++;
sina = *csptr++; sina = *csptr++;
cosb = *csptr++; cosb = *csptr++;
sinb = *csptr++; sinb = *csptr++;
tr1 = *(buf0 + 0); tr1 = *(buf0 + 0);
@@ -333,10 +333,10 @@ static void PostMDCT(int *buf0, int num, const int *csptr)
tr2 = *(buf1 - 1); tr2 = *(buf1 - 1);
*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1); *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
*buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1); *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1);
*buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2); *buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2);
*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2); *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
} }
} }
#endif #endif
@@ -353,17 +353,17 @@ void Mdct_Long(int *buf)
PreMDCT(buf, 1024, cossintab + 128); PreMDCT(buf, 1024, cossintab + 128);
Shuffle(buf, 512, bitrevTab + 17); Shuffle(buf, 512, bitrevTab + 17);
Radix8First(buf, 512 >> 3); Radix8First(buf, 512 >> 3);
Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512); Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512);
PostMDCT(buf, 1024, cossintab + 128); PostMDCT(buf, 1024, cossintab + 128);
} }
/********************************************************************************** /**********************************************************************************
* *
* function name: Mdct_Short * function name: Mdct_Short
* description: the short block mdct * description: the short block mdct
* *
**********************************************************************************/ **********************************************************************************/
void Mdct_Short(int *buf) void Mdct_Short(int *buf)
@@ -371,10 +371,10 @@ void Mdct_Short(int *buf)
PreMDCT(buf, 128, cossintab); PreMDCT(buf, 128, cossintab);
Shuffle(buf, 64, bitrevTab); Shuffle(buf, 64, bitrevTab);
Radix4First(buf, 64 >> 2); Radix4First(buf, 64 >> 2);
Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64); Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64);
PostMDCT(buf, 128, cossintab); PostMDCT(buf, 128, cossintab);
} }
@@ -382,7 +382,7 @@ void Mdct_Short(int *buf)
* *
* function name: shiftMdctDelayBuffer * function name: shiftMdctDelayBuffer
* description: the mdct delay buffer has a size of 1600, * description: the mdct delay buffer has a size of 1600,
* so the calculation of LONG,STOP must be spilt in two * so the calculation of LONG,STOP must be spilt in two
* passes with 1024 samples and a mid shift, * passes with 1024 samples and a mid shift,
* the SHORT transforms can be completed in the delay buffer, * the SHORT transforms can be completed in the delay buffer,
* and afterwards a shift * and afterwards a shift
@@ -409,7 +409,7 @@ static void shiftMdctDelayBuffer(Word16 *mdctDelayBuffer, /*! start of mdct dela
dsBuf = timeSignal; dsBuf = timeSignal;
for(i=0; i<FRAME_LEN_LONG; i+=8) for(i=0; i<FRAME_LEN_LONG; i+=8)
{ {
*srBuf++ = *dsBuf; dsBuf += chIncrement; *srBuf++ = *dsBuf; dsBuf += chIncrement;
*srBuf++ = *dsBuf; dsBuf += chIncrement; *srBuf++ = *dsBuf; dsBuf += chIncrement;
*srBuf++ = *dsBuf; dsBuf += chIncrement; *srBuf++ = *dsBuf; dsBuf += chIncrement;
@@ -470,10 +470,10 @@ void Transform_Real(Word16 *mdctDelayBuffer,
Word32 delayBufferSf,timeSignalSf,minSf; Word32 delayBufferSf,timeSignalSf,minSf;
Word32 headRoom=0; Word32 headRoom=0;
switch(blockType){ switch(blockType){
case LONG_WINDOW: case LONG_WINDOW:
/* /*
we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + 448 new timeSignal samples we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + 448 new timeSignal samples
@@ -483,15 +483,15 @@ void Transform_Real(Word16 *mdctDelayBuffer,
timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement); timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement);
minSf = min(delayBufferSf,timeSignalSf); minSf = min(delayBufferSf,timeSignalSf);
minSf = min(minSf,14); minSf = min(minSf,14);
dctIn0 = mdctDelayBuffer; dctIn0 = mdctDelayBuffer;
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
outData0 = realOut + FRAME_LEN_LONG/2; outData0 = realOut + FRAME_LEN_LONG/2;
/* add windows and pre add for mdct to last buffer*/ /* add windows and pre add for mdct to last buffer*/
winPtr = (int *)LongWindowKBD; winPtr = (int *)LongWindowKBD;
for(i=0;i<FRAME_LEN_LONG/2;i++){ for(i=0;i<FRAME_LEN_LONG/2;i++){
timeSignalSample = (*dctIn0++) << minSf; timeSignalSample = (*dctIn0++) << minSf;
ws1 = timeSignalSample * (*winPtr >> 16); ws1 = timeSignalSample * (*winPtr >> 16);
timeSignalSample = (*dctIn1--) << minSf; timeSignalSample = (*dctIn1--) << minSf;
ws2 = timeSignalSample * (*winPtr & 0xffff); ws2 = timeSignalSample * (*winPtr & 0xffff);
@@ -499,30 +499,30 @@ void Transform_Real(Word16 *mdctDelayBuffer,
/* shift 2 to avoid overflow next */ /* shift 2 to avoid overflow next */
*outData0++ = (ws1 >> 2) - (ws2 >> 2); *outData0++ = (ws1 >> 2) - (ws2 >> 2);
} }
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
/* add windows and pre add for mdct to new buffer*/ /* add windows and pre add for mdct to new buffer*/
dctIn0 = mdctDelayBuffer; dctIn0 = mdctDelayBuffer;
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
outData0 = realOut + FRAME_LEN_LONG/2 - 1; outData0 = realOut + FRAME_LEN_LONG/2 - 1;
winPtr = (int *)LongWindowKBD; winPtr = (int *)LongWindowKBD;
for(i=0;i<FRAME_LEN_LONG/2;i++){ for(i=0;i<FRAME_LEN_LONG/2;i++){
timeSignalSample = (*dctIn0++) << minSf; timeSignalSample = (*dctIn0++) << minSf;
ws1 = timeSignalSample * (*winPtr & 0xffff); ws1 = timeSignalSample * (*winPtr & 0xffff);
timeSignalSample = (*dctIn1--) << minSf; timeSignalSample = (*dctIn1--) << minSf;
ws2 = timeSignalSample * (*winPtr >> 16); ws2 = timeSignalSample * (*winPtr >> 16);
winPtr++; winPtr++;
/* shift 2 to avoid overflow next */ /* shift 2 to avoid overflow next */
*outData0-- = -((ws1 >> 2) + (ws2 >> 2)); *outData0-- = -((ws1 >> 2) + (ws2 >> 2));
} }
Mdct_Long(realOut); Mdct_Long(realOut);
/* update scale factor */ /* update scale factor */
minSf = 14 - minSf; minSf = 14 - minSf;
*mdctScale=minSf; *mdctScale=minSf;
break; break;
case START_WINDOW: case START_WINDOW:
/* /*
we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no timeSignal samples we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no timeSignal samples
@@ -533,7 +533,7 @@ void Transform_Real(Word16 *mdctDelayBuffer,
dctIn0 = mdctDelayBuffer; dctIn0 = mdctDelayBuffer;
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
outData0 = realOut + FRAME_LEN_LONG/2; outData0 = realOut + FRAME_LEN_LONG/2;
winPtr = (int *)LongWindowKBD; winPtr = (int *)LongWindowKBD;
/* add windows and pre add for mdct to last buffer*/ /* add windows and pre add for mdct to last buffer*/
@@ -545,18 +545,18 @@ void Transform_Real(Word16 *mdctDelayBuffer,
winPtr ++; winPtr ++;
*outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
} }
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
outData0 = realOut + FRAME_LEN_LONG/2 - 1; outData0 = realOut + FRAME_LEN_LONG/2 - 1;
for(i=0;i<LS_TRANS;i++){ for(i=0;i<LS_TRANS;i++){
*outData0-- = -mdctDelayBuffer[i] << (15 - 2 + minSf); *outData0-- = -mdctDelayBuffer[i] << (15 - 2 + minSf);
} }
/* add windows and pre add for mdct to new buffer*/ /* add windows and pre add for mdct to new buffer*/
dctIn0 = mdctDelayBuffer + LS_TRANS; dctIn0 = mdctDelayBuffer + LS_TRANS;
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS;
outData0 = realOut + FRAME_LEN_LONG/2 - 1 -LS_TRANS; outData0 = realOut + FRAME_LEN_LONG/2 - 1 -LS_TRANS;
winPtr = (int *)ShortWindowSine; winPtr = (int *)ShortWindowSine;
for(i=0;i<FRAME_LEN_SHORT/2;i++){ for(i=0;i<FRAME_LEN_SHORT/2;i++){
timeSignalSample= (*dctIn0++) << minSf; timeSignalSample= (*dctIn0++) << minSf;
@@ -572,7 +572,7 @@ void Transform_Real(Word16 *mdctDelayBuffer,
minSf = 14 - minSf; minSf = 14 - minSf;
*mdctScale= minSf; *mdctScale= minSf;
break; break;
case STOP_WINDOW: case STOP_WINDOW:
/* /*
we access BLOCK_SWITCHING_OFFSET-LS_TRANS (1600-448 ) delay buffer samples + 448 new timeSignal samples we access BLOCK_SWITCHING_OFFSET-LS_TRANS (1600-448 ) delay buffer samples + 448 new timeSignal samples
@@ -580,19 +580,19 @@ void Transform_Real(Word16 *mdctDelayBuffer,
*/ */
delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+LS_TRANS,BLOCK_SWITCHING_OFFSET-LS_TRANS,1); delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+LS_TRANS,BLOCK_SWITCHING_OFFSET-LS_TRANS,1);
timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement); timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement);
minSf = min(delayBufferSf,timeSignalSf); minSf = min(delayBufferSf,timeSignalSf);
minSf = min(minSf,13); minSf = min(minSf,13);
outData0 = realOut + FRAME_LEN_LONG/2; outData0 = realOut + FRAME_LEN_LONG/2;
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
for(i=0;i<LS_TRANS;i++){ for(i=0;i<LS_TRANS;i++){
*outData0++ = -(*dctIn1--) << (15 - 2 + minSf); *outData0++ = -(*dctIn1--) << (15 - 2 + minSf);
} }
/* add windows and pre add for mdct to last buffer*/ /* add windows and pre add for mdct to last buffer*/
dctIn0 = mdctDelayBuffer + LS_TRANS; dctIn0 = mdctDelayBuffer + LS_TRANS;
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS;
outData0 = realOut + FRAME_LEN_LONG/2 + LS_TRANS; outData0 = realOut + FRAME_LEN_LONG/2 + LS_TRANS;
winPtr = (int *)ShortWindowSine; winPtr = (int *)ShortWindowSine;
for(i=0;i<FRAME_LEN_SHORT/2;i++){ for(i=0;i<FRAME_LEN_SHORT/2;i++){
timeSignalSample = (*dctIn0++) << minSf; timeSignalSample = (*dctIn0++) << minSf;
@@ -602,13 +602,13 @@ void Transform_Real(Word16 *mdctDelayBuffer,
winPtr++; winPtr++;
*outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
} }
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
/* add windows and pre add for mdct to new buffer*/ /* add windows and pre add for mdct to new buffer*/
dctIn0 = mdctDelayBuffer; dctIn0 = mdctDelayBuffer;
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1; dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
outData0 = realOut + FRAME_LEN_LONG/2 - 1; outData0 = realOut + FRAME_LEN_LONG/2 - 1;
winPtr = (int *)LongWindowKBD; winPtr = (int *)LongWindowKBD;
for(i=0;i<FRAME_LEN_LONG/2;i++){ for(i=0;i<FRAME_LEN_LONG/2;i++){
timeSignalSample= (*dctIn0++) << minSf; timeSignalSample= (*dctIn0++) << minSf;
@@ -618,26 +618,26 @@ void Transform_Real(Word16 *mdctDelayBuffer,
*outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */ *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */
winPtr++; winPtr++;
} }
Mdct_Long(realOut); Mdct_Long(realOut);
minSf = 14 - minSf; minSf = 14 - minSf;
*mdctScale= minSf; /* update scale factor */ *mdctScale= minSf; /* update scale factor */
break; break;
case SHORT_WINDOW: case SHORT_WINDOW:
/* /*
we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no new timeSignal samples we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no new timeSignal samples
and get the biggest scale factor for next calculate more precise and get the biggest scale factor for next calculate more precise
*/ */
minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+TRANSFORM_OFFSET_SHORT,9*FRAME_LEN_SHORT,1); minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+TRANSFORM_OFFSET_SHORT,9*FRAME_LEN_SHORT,1);
minSf = min(minSf,10); minSf = min(minSf,10);
for(w=0;w<TRANS_FAC;w++){ for(w=0;w<TRANS_FAC;w++){
dctIn0 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT; dctIn0 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT;
dctIn1 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT + FRAME_LEN_SHORT-1; dctIn1 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT + FRAME_LEN_SHORT-1;
outData0 = realOut + FRAME_LEN_SHORT/2; outData0 = realOut + FRAME_LEN_SHORT/2;
outData1 = realOut + FRAME_LEN_SHORT/2 - 1; outData1 = realOut + FRAME_LEN_SHORT/2 - 1;
winPtr = (int *)ShortWindowSine; winPtr = (int *)ShortWindowSine;
for(i=0;i<FRAME_LEN_SHORT/2;i++){ for(i=0;i<FRAME_LEN_SHORT/2;i++){
@@ -646,7 +646,7 @@ void Transform_Real(Word16 *mdctDelayBuffer,
timeSignalSample= *dctIn1 << minSf; timeSignalSample= *dctIn1 << minSf;
ws2 = timeSignalSample * (*winPtr & 0xffff); ws2 = timeSignalSample * (*winPtr & 0xffff);
*outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
timeSignalSample= *(dctIn0 + FRAME_LEN_SHORT) << minSf; timeSignalSample= *(dctIn0 + FRAME_LEN_SHORT) << minSf;
ws1 = timeSignalSample * (*winPtr & 0xffff); ws1 = timeSignalSample * (*winPtr & 0xffff);
timeSignalSample= *(dctIn1 + FRAME_LEN_SHORT) << minSf; timeSignalSample= *(dctIn1 + FRAME_LEN_SHORT) << minSf;
@@ -661,10 +661,10 @@ void Transform_Real(Word16 *mdctDelayBuffer,
Mdct_Short(realOut); Mdct_Short(realOut);
realOut += FRAME_LEN_SHORT; realOut += FRAME_LEN_SHORT;
} }
minSf = 11 - minSf; minSf = 11 - minSf;
*mdctScale = minSf; /* update scale factor */ *mdctScale = minSf; /* update scale factor */
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
break; break;
} }

View File

@@ -3,7 +3,7 @@ include $(CLEAR_VARS)
include frameworks/base/media/libstagefright/codecs/common/Config.mk include frameworks/base/media/libstagefright/codecs/common/Config.mk
LOCAL_PRELINK_MODULE := false LOCAL_PRELINK_MODULE := false
LOCAL_SRC_FILES := \ LOCAL_SRC_FILES := \
AMRWBEncoder.cpp \ AMRWBEncoder.cpp \
src/autocorr.c \ src/autocorr.c \
@@ -91,7 +91,7 @@ LOCAL_MODULE := libstagefright_amrwbenc
LOCAL_ARM_MODE := arm LOCAL_ARM_MODE := arm
LOCAL_STATIC_LIBRARIES := LOCAL_STATIC_LIBRARIES :=
LOCAL_SHARED_LIBRARIES := LOCAL_SHARED_LIBRARIES :=

View File

@@ -70,10 +70,10 @@ int GetNextBuf(FILE* inFile,unsigned char* dst,int size)
typedef int (VO_API * VOGETAUDIOENCAPI) (VO_AUDIO_CODECAPI * pEncHandle); typedef int (VO_API * VOGETAUDIOENCAPI) (VO_AUDIO_CODECAPI * pEncHandle);
int encode( int encode(
int mode, int mode,
short allow_dtx, short allow_dtx,
VOAMRWBFRAMETYPE frameType, VOAMRWBFRAMETYPE frameType,
const char* srcfile, const char* srcfile,
const char* dstfile const char* dstfile
) )
{ {
@@ -136,7 +136,7 @@ int encode(
return -1; return -1;
} }
pfunc = dlsym(handle, "voGetAMRWBEncAPI"); pfunc = dlsym(handle, "voGetAMRWBEncAPI");
if(pfunc == 0) if(pfunc == 0)
{ {
printf("open function error......"); printf("open function error......");
@@ -159,7 +159,7 @@ int encode(
printf("get APIs error......"); printf("get APIs error......");
goto safe_exit; goto safe_exit;
} }
#endif #endif
//####################################### Init Encoding Section ######################################### //####################################### Init Encoding Section #########################################
ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData); ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData);
@@ -214,7 +214,7 @@ int encode(
if(framenum == 1) if(framenum == 1)
{ {
fwrite(OutputBuf, 1, outData.Length + size1, fdst); fwrite(OutputBuf, 1, outData.Length + size1, fdst);
fflush(fdst); fflush(fdst);
} }
else else
{ {
@@ -323,7 +323,7 @@ int main(int argc, char **argv) // for gcc compiler;
case '1': frameType = VOAMRWB_ITU; case '1': frameType = VOAMRWB_ITU;
break; break;
case '2': frameType = VOAMRWB_RFC3267 ; case '2': frameType = VOAMRWB_RFC3267 ;
break; break;
default: default:
usage(); usage();
printf ("Invalid parameter '%s'.\n", argv [arg]); printf ("Invalid parameter '%s'.\n", argv [arg]);
@@ -338,11 +338,11 @@ int main(int argc, char **argv) // for gcc compiler;
} else { } else {
switch (filename) { switch (filename) {
case 0: case 0:
inFileName = argv[arg]; inFileName = argv[arg];
break; break;
case 1: case 1:
outFileName = argv[arg]; outFileName = argv[arg];
break; break;
default: default:
usage (); usage ();

View File

@@ -2,15 +2,15 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_SRC_FILES := AMRWB_E_SAMPLE.c LOCAL_SRC_FILES := AMRWB_E_SAMPLE.c
LOCAL_SRC_FILES += \ LOCAL_SRC_FILES += \
../../../Common/cmnMemory.c ../../../Common/cmnMemory.c
LOCAL_MODULE := TestvoAMRWBEnc LOCAL_MODULE := TestvoAMRWBEnc
LOCAL_ARM_MODE := arm LOCAL_ARM_MODE := arm
LOCAL_STATIC_LIBRARIES := LOCAL_STATIC_LIBRARIES :=
LOCAL_SHARED_LIBRARIES := libvoAMRWBEnc LOCAL_SHARED_LIBRARIES := libvoAMRWBEnc
@@ -20,7 +20,7 @@ LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/../../../Include \ $(LOCAL_PATH)/../../../Include \
LOCAL_CFLAGS := $(VO_CFLAGS) LOCAL_CFLAGS := $(VO_CFLAGS)
include $(BUILD_EXECUTABLE) include $(BUILD_EXECUTABLE)

View File

@@ -25,8 +25,8 @@ VOMT:= exe
# module macros # module macros
# please append the additional macro definitions here for your module if necessary. # please append the additional macro definitions here for your module if necessary.
# e.g. -DVISUALON, macro VISUALON defined for your module # e.g. -DVISUALON, macro VISUALON defined for your module
VOMM:= #ARMV5E VOMM:= #ARMV5E
@@ -36,7 +36,7 @@ VOTARGET:= voAMRWBEnc_Test
# please modify here to be sure to see the g1.mk # please modify here to be sure to see the g1.mk
include ../../../../Tools/eclair.mk include ../../../../Tools/eclair.mk
# dependent libraries. # dependent libraries.
VODEPLIBS:=-ldl VODEPLIBS:=-ldl
@@ -52,5 +52,5 @@ VORELDIR:=../
# please modify here to be sure to see the doit.mk # please modify here to be sure to see the doit.mk
include ../../../../Tools/doit.mk include ../../../../Tools/doit.mk

View File

@@ -15,10 +15,10 @@
# */ # */
# please list all objects needed by your target here # please list all objects needed by your target here
OBJS:=AMRWB_E_SAMPLE.o cmnMemory.o OBJS:=AMRWB_E_SAMPLE.o cmnMemory.o
# please list all directories that all source files relative with your module(.h .c .cpp) locate # please list all directories that all source files relative with your module(.h .c .cpp) locate
VOSRCDIR:=../ \ VOSRCDIR:=../ \
../../../../Common \ ../../../../Common \
../../../../Include ../../../../Include

View File

@@ -25,7 +25,7 @@ VOMT:= lib
# module macros # module macros
# please append the additional macro definitions here for your module if necessary. # please append the additional macro definitions here for your module if necessary.
ifeq ($(VOTT), v5) ifeq ($(VOTT), v5)
VOMM:=-DARM -DASM_OPT VOMM:=-DARM -DASM_OPT
endif endif
@@ -35,7 +35,7 @@ VOTARGET:= libvoAMRWBEncv5
# please modify here to be sure to see the g1.mk # please modify here to be sure to see the g1.mk
include ../../../../../Tools/eclair.mk include ../../../../../Tools/eclair.mk
# dependent libraries. # dependent libraries.
VODEPLIBS:=-ldl -lstdc++ -lcutils VODEPLIBS:=-ldl -lstdc++ -lcutils
@@ -49,5 +49,5 @@ include ../ms.mk
VORELDIR:=../../../../../../Release VORELDIR:=../../../../../../Release
# please modify here to be sure to see the doit.mk # please modify here to be sure to see the doit.mk
include ../../../../../Tools/doit.mk include ../../../../../Tools/doit.mk

View File

@@ -25,7 +25,7 @@ VOMT:= lib
# module macros # module macros
# please append the additional macro definitions here for your module if necessary. # please append the additional macro definitions here for your module if necessary.
ifeq ($(VOTT), v7) ifeq ($(VOTT), v7)
VOMM:=-DARM -DARMV7 -DASM_OPT VOMM:=-DARM -DARMV7 -DASM_OPT
endif endif
@@ -35,7 +35,7 @@ VOTARGET:= libvoAMRWBEncv7
# please modify here to be sure to see the g1.mk # please modify here to be sure to see the g1.mk
include ../../../../../Tools/eclair.mk include ../../../../../Tools/eclair.mk
# dependent libraries. # dependent libraries.
VODEPLIBS:=-ldl -lstdc++ -lcutils VODEPLIBS:=-ldl -lstdc++ -lcutils
@@ -49,5 +49,5 @@ include ../ms.mk
VORELDIR:=../../../../../../Release VORELDIR:=../../../../../../Release
# please modify here to be sure to see the doit.mk # please modify here to be sure to see the doit.mk
include ../../../../../Tools/doit.mk include ../../../../../Tools/doit.mk

View File

@@ -15,7 +15,7 @@
# */ # */
# Just acting as Father Makefile of Modules # Just acting as Father Makefile of Modules
# please keep the name 'makefile' unchanged # please keep the name 'makefile' unchanged
# Module Subdirs # Module Subdirs
VOMSD:=$(dir $(shell find . -name 'Makefile')) VOMSD:=$(dir $(shell find . -name 'Makefile'))

View File

@@ -13,10 +13,10 @@
# ** See the License for the specific language governing permissions and # ** See the License for the specific language governing permissions and
# ** limitations under the License. # ** limitations under the License.
# */ # */
# please list all directories that all source files relative with your module(.h .c .cpp) locate # please list all directories that all source files relative with your module(.h .c .cpp) locate
VOSRCDIR:=../../../inc \ VOSRCDIR:=../../../inc \
../../../src \ ../../../src \
../../../../../Include ../../../../../Include
# please list all objects needed by your target here # please list all objects needed by your target here
OBJS:= autocorr.o az_isp.o bits.o c2t64fx.o c4t64fx.o convolve.o cor_h_x.o decim54.o \ OBJS:= autocorr.o az_isp.o bits.o c2t64fx.o c4t64fx.o convolve.o cor_h_x.o decim54.o \
@@ -25,7 +25,7 @@ OBJS:= autocorr.o az_isp.o bits.o c2t64fx.o c4t64fx.o convolve.o cor_h_x.o decim
oper_32b.o p_med_ol.o pit_shrp.o pitch_f4.o pred_lt4.o preemph.o q_gain2.o q_pulse.o \ oper_32b.o p_med_ol.o pit_shrp.o pitch_f4.o pred_lt4.o preemph.o q_gain2.o q_pulse.o \
qisf_ns.o qpisf_2s.o random.o residu.o scale.o stream.o syn_filt.o updt_tar.o util.o \ qisf_ns.o qpisf_2s.o random.o residu.o scale.o stream.o syn_filt.o updt_tar.o util.o \
voAMRWBEnc.o voicefac.o wb_vad.o weight_a.o voAMRWBEnc.o voicefac.o wb_vad.o weight_a.o
ifeq ($(VOTT), v5) ifeq ($(VOTT), v5)
OBJS += cor_h_vec_opt.o Deemph_32_opt.o Dot_p_opt.o Filt_6k_7k_opt.o residu_asm_opt.o \ OBJS += cor_h_vec_opt.o Deemph_32_opt.o Dot_p_opt.o Filt_6k_7k_opt.o residu_asm_opt.o \

View File

@@ -33,7 +33,7 @@
#define static_vo static __inline__ #define static_vo static __inline__
#else #else
#define static_vo static __inline #define static_vo static __inline
#endif #endif
#define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff))) #define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff)))
@@ -87,7 +87,7 @@ static_vo Word32 L_shr (Word32 L_var1, Word16 var2); /* Long shift right
static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2); /* Long shift right with round, 3 */ static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2); /* Long shift right with round, 3 */
static_vo Word16 norm_s (Word16 var1); /* Short norm, 15 */ static_vo Word16 norm_s (Word16 var1); /* Short norm, 15 */
static_vo Word16 div_s (Word16 var1, Word16 var2); /* Short division, 18 */ static_vo Word16 div_s (Word16 var1, Word16 var2); /* Short division, 18 */
static_vo Word16 norm_l (Word32 L_var1); /* Long norm, 30 */ static_vo Word16 norm_l (Word32 L_var1); /* Long norm, 30 */
/*___________________________________________________________________________ /*___________________________________________________________________________
| | | |
@@ -1030,8 +1030,8 @@ static_vo Word16 div_s (Word16 var1, Word16 var2)
L_num <<= 1; L_num <<= 1;
if (L_num >= L_denom) if (L_num >= L_denom)
{ {
L_num -= L_denom; L_num -= L_denom;
var_out += 1; var_out += 1;
} }
} }
} }

View File

@@ -33,89 +33,89 @@
static const Word16 dfh_M7k[PRMN_7k] = static const Word16 dfh_M7k[PRMN_7k] =
{ {
3168, 29954, 29213, 16121, 3168, 29954, 29213, 16121,
64, 13440, 30624, 16430, 64, 13440, 30624, 16430,
19008 19008
}; };
static const Word16 dfh_M9k[PRMN_9k] = static const Word16 dfh_M9k[PRMN_9k] =
{ {
3168, 31665, 9943, 9123, 3168, 31665, 9943, 9123,
15599, 4358, 20248, 2048, 15599, 4358, 20248, 2048,
17040, 27787, 16816, 13888 17040, 27787, 16816, 13888
}; };
static const Word16 dfh_M12k[PRMN_12k] = static const Word16 dfh_M12k[PRMN_12k] =
{ {
3168, 31665, 9943, 9128, 3168, 31665, 9943, 9128,
3647, 8129, 30930, 27926, 3647, 8129, 30930, 27926,
18880, 12319, 496, 1042, 18880, 12319, 496, 1042,
4061, 20446, 25629, 28069, 4061, 20446, 25629, 28069,
13948 13948
}; };
static const Word16 dfh_M14k[PRMN_14k] = static const Word16 dfh_M14k[PRMN_14k] =
{ {
3168, 31665, 9943, 9131, 3168, 31665, 9943, 9131,
24815, 655, 26616, 26764, 24815, 655, 26616, 26764,
7238, 19136, 6144, 88, 7238, 19136, 6144, 88,
4158, 25733, 30567, 30494, 4158, 25733, 30567, 30494,
221, 20321, 17823 221, 20321, 17823
}; };
static const Word16 dfh_M16k[PRMN_16k] = static const Word16 dfh_M16k[PRMN_16k] =
{ {
3168, 31665, 9943, 9131, 3168, 31665, 9943, 9131,
24815, 700, 3824, 7271, 24815, 700, 3824, 7271,
26400, 9528, 6594, 26112, 26400, 9528, 6594, 26112,
108, 2068, 12867, 16317, 108, 2068, 12867, 16317,
23035, 24632, 7528, 1752, 23035, 24632, 7528, 1752,
6759, 24576 6759, 24576
}; };
static const Word16 dfh_M18k[PRMN_18k] = static const Word16 dfh_M18k[PRMN_18k] =
{ {
3168, 31665, 9943, 9135, 3168, 31665, 9943, 9135,
14787, 14423, 30477, 24927, 14787, 14423, 30477, 24927,
25345, 30154, 916, 5728, 25345, 30154, 916, 5728,
18978, 2048, 528, 16449, 18978, 2048, 528, 16449,
2436, 3581, 23527, 29479, 2436, 3581, 23527, 29479,
8237, 16810, 27091, 19052, 8237, 16810, 27091, 19052,
0 0
}; };
static const Word16 dfh_M20k[PRMN_20k] = static const Word16 dfh_M20k[PRMN_20k] =
{ {
3168, 31665, 9943, 9129, 3168, 31665, 9943, 9129,
8637, 31807, 24646, 736, 8637, 31807, 24646, 736,
28643, 2977, 2566, 25564, 28643, 2977, 2566, 25564,
12930, 13960, 2048, 834, 12930, 13960, 2048, 834,
3270, 4100, 26920, 16237, 3270, 4100, 26920, 16237,
31227, 17667, 15059, 20589, 31227, 17667, 15059, 20589,
30249, 29123, 0 30249, 29123, 0
}; };
static const Word16 dfh_M23k[PRMN_23k] = static const Word16 dfh_M23k[PRMN_23k] =
{ {
3168, 31665, 9943, 9132, 3168, 31665, 9943, 9132,
16748, 3202, 28179, 16317, 16748, 3202, 28179, 16317,
30590, 15857, 19960, 8818, 30590, 15857, 19960, 8818,
21711, 21538, 4260, 16690, 21711, 21538, 4260, 16690,
20224, 3666, 4194, 9497, 20224, 3666, 4194, 9497,
16320, 15388, 5755, 31551, 16320, 15388, 5755, 31551,
14080, 3574, 15932, 50, 14080, 3574, 15932, 50,
23392, 26053, 31216 23392, 26053, 31216
}; };
static const Word16 dfh_M24k[PRMN_24k] = static const Word16 dfh_M24k[PRMN_24k] =
{ {
3168, 31665, 9943, 9134, 3168, 31665, 9943, 9134,
24776, 5857, 18475, 28535, 24776, 5857, 18475, 28535,
29662, 14321, 16725, 4396, 29662, 14321, 16725, 4396,
29353, 10003, 17068, 20504, 29353, 10003, 17068, 20504,
720, 0, 8465, 12581, 720, 0, 8465, 12581,
28863, 24774, 9709, 26043, 28863, 24774, 9709, 26043,
7941, 27649, 13965, 15236, 7941, 27649, 13965, 15236,
18026, 22047, 16681, 3968 18026, 22047, 16681, 3968
}; };

View File

@@ -42,7 +42,7 @@ const static Word16 table[129] = {
/* slope in Q11 used to compute y = acos(x) */ /* slope in Q11 used to compute y = acos(x) */
const static Word16 slope[128] = { const static Word16 slope[128] = {
-26214, -9039, -5243, -3799, -2979, -2405, -2064, -1771, -26214, -9039, -5243, -3799, -2979, -2405, -2064, -1771,
-1579, -1409, -1279, -1170, -1079, -1004, -933, -880, -1579, -1409, -1279, -1170, -1079, -1004, -933, -880,
-827, -783, -743, -708, -676, -647, -621, -599, -827, -783, -743, -708, -676, -647, -621, -599,

View File

@@ -25,20 +25,20 @@
*/ */
#ifndef __LOG2_H__ #ifndef __LOG2_H__
#define __LOG2_H__ #define __LOG2_H__
/* /*
******************************************************************************** ********************************************************************************
* INCLUDE FILES * INCLUDE FILES
******************************************************************************** ********************************************************************************
*/ */
#include "typedef.h" #include "typedef.h"
/* /*
******************************************************************************** ********************************************************************************
* DEFINITION OF DATA TYPES * DEFINITION OF DATA TYPES
******************************************************************************** ********************************************************************************
*/ */
/* /*
******************************************************************************** ********************************************************************************
* DECLARATION OF PROTOTYPES * DECLARATION OF PROTOTYPES

View File

@@ -98,7 +98,7 @@ static Word16 sort_1265[253] = {
244, 61, 111, 164, 214, 65, 115, 168, 218, 70, 244, 61, 111, 164, 214, 65, 115, 168, 218, 70,
120, 173, 223, 74, 124, 177, 227, 79, 129, 182, 120, 173, 223, 74, 124, 177, 227, 79, 129, 182,
232, 83, 133, 186, 236, 88, 138, 191, 241, 92, 232, 83, 133, 186, 236, 88, 138, 191, 241, 92,
142, 195, 245 142, 195, 245
}; };
static Word16 sort_1425[285] = { static Word16 sort_1425[285] = {
@@ -205,7 +205,7 @@ static Word16 sort_1825[365] = {
257, 243, 229, 356, 159, 119, 67, 187, 173, 145, 257, 243, 229, 356, 159, 119, 67, 187, 173, 145,
240, 77, 304, 332, 314, 342, 109, 254, 81, 278, 240, 77, 304, 332, 314, 342, 109, 254, 81, 278,
105, 91, 346, 318, 183, 250, 197, 328, 95, 155, 105, 91, 346, 318, 183, 250, 197, 328, 95, 155,
169, 268, 226, 236, 264 169, 268, 226, 236, 264
}; };
static Word16 sort_1985[397] = { static Word16 sort_1985[397] = {
@@ -248,7 +248,7 @@ static Word16 sort_1985[397] = {
128, 118, 303, 104, 379, 182, 114, 375, 200, 96, 128, 118, 303, 104, 379, 182, 114, 375, 200, 96,
293, 172, 214, 365, 279, 86, 289, 351, 347, 357, 293, 172, 214, 365, 279, 86, 289, 351, 347, 357,
261, 186, 176, 271, 90, 100, 147, 322, 275, 361, 261, 186, 176, 271, 90, 100, 147, 322, 275, 361,
71, 332, 61, 265, 157, 246, 236 71, 332, 61, 265, 157, 246, 236
}; };
static Word16 sort_2305[461] = { static Word16 sort_2305[461] = {
@@ -349,7 +349,7 @@ static Word16 sort_2385[477] = {
132, 453, 336, 425, 325, 347, 126, 104, 137, 458, 132, 453, 336, 425, 325, 347, 126, 104, 137, 458,
352, 243, 447, 115, 341, 210, 330, 221, 232, 436, 352, 243, 447, 115, 341, 210, 330, 221, 232, 436,
465, 319, 359, 111, 454, 228, 217, 122, 443, 348, 465, 319, 359, 111, 454, 228, 217, 122, 443, 348,
239, 250, 133, 144, 432, 337, 326 239, 250, 133, 144, 432, 337, 326
}; };
static Word16 sort_SID[35] = { static Word16 sort_SID[35] = {

View File

@@ -26,7 +26,7 @@ Contains: VOME API Buffer Operator Implement Header
#define __STREAM_H__ #define __STREAM_H__
#include "voMem.h" #include "voMem.h"
#define Frame_Maxsize 1024 * 2 //Work Buffer 10K #define Frame_Maxsize 1024 * 2 //Work Buffer 10K
#define Frame_MaxByte 640 //AMR_WB Encoder one frame 320 samples = 640 Bytes #define Frame_MaxByte 640 //AMR_WB Encoder one frame 320 samples = 640 Bytes
#define MIN(a,b) ((a) < (b)? (a) : (b)) #define MIN(a,b) ((a) < (b)? (a) : (b))
@@ -35,7 +35,7 @@ typedef struct{
unsigned char *frame_ptr; unsigned char *frame_ptr;
unsigned char *frame_ptr_bk; unsigned char *frame_ptr_bk;
int set_len; int set_len;
int framebuffer_len; int framebuffer_len;
int frame_storelen; int frame_storelen;
int used_len; int used_len;
}FrameStream; }FrameStream;

View File

@@ -31,7 +31,7 @@
/* /*
* this is the original code from the ETSI file typedef.h * this is the original code from the ETSI file typedef.h
*/ */
#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__) #if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__)
typedef signed char Word8; typedef signed char Word8;
typedef short Word16; typedef short Word16;

View File

@@ -45,7 +45,7 @@
* OSF only defined if the current platform is an Alpha * OSF only defined if the current platform is an Alpha
* PC only defined if the current platform is a PC * PC only defined if the current platform is a PC
* SUN only defined if the current platform is a Sun * SUN only defined if the current platform is a Sun
* *
* LSBFIRST is defined if the byte order on this platform is * LSBFIRST is defined if the byte order on this platform is
* "least significant byte first" -> defined on DEC Alpha * "least significant byte first" -> defined on DEC Alpha
* and PC, undefined on Sun * and PC, undefined on Sun
@@ -68,7 +68,7 @@
/* /*
******************************************************************************** ********************************************************************************
* DEFINITION OF CONSTANTS * DEFINITION OF CONSTANTS
******************************************************************************** ********************************************************************************
*/ */
/* /*
@@ -197,7 +197,7 @@ typedef int Bool;
#define Syn_filt_32 voAWB_Syn_filt_32 #define Syn_filt_32 voAWB_Syn_filt_32
#define Isf_isp voAWB_Isf_isp #define Isf_isp voAWB_Isf_isp
#define Levinson voAWB_Levinson #define Levinson voAWB_Levinson
#define median5 voAWB_median5 #define median5 voAWB_median5
#define Pred_lt4 voAWB_Pred_lt4 #define Pred_lt4 voAWB_Pred_lt4
#define Reorder_isf voAWB_Reorder_isf #define Reorder_isf voAWB_Reorder_isf
#define Dpisf_2s_36b voAWB_Dpisf_2s_36b #define Dpisf_2s_36b voAWB_Dpisf_2s_36b

View File

@@ -30,10 +30,10 @@
.section .text .section .text
.global Deemph_32_asm .global Deemph_32_asm
Deemph_32_asm: Deemph_32_asm:
STMFD r13!, {r4 - r12, r14} STMFD r13!, {r4 - r12, r14}
MOV r4, #2 @i=0 MOV r4, #2 @i=0
LDRSH r6, [r0], #2 @load x_hi[0] LDRSH r6, [r0], #2 @load x_hi[0]
LDRSH r7, [r1], #2 @load x_lo[0] LDRSH r7, [r1], #2 @load x_lo[0]
@@ -47,9 +47,9 @@ Deemph_32_asm:
ADD r12, r10, r7, LSL #4 @L_tmp += x_lo[0] << 4 ADD r12, r10, r7, LSL #4 @L_tmp += x_lo[0] << 4
MOV r10, r12, LSL #3 @L_tmp <<= 3 MOV r10, r12, LSL #3 @L_tmp <<= 3
MUL r9, r5, r8 MUL r9, r5, r8
LDRSH r6, [r0], #2 @load x_hi[1] LDRSH r6, [r0], #2 @load x_hi[1]
QDADD r10, r10, r9 QDADD r10, r10, r9
LDRSH r7, [r1], #2 @load x_lo[1] LDRSH r7, [r1], #2 @load x_lo[1]
MOV r12, r10, LSL #1 @L_tmp = L_mac(L_tmp, *mem, fac) MOV r12, r10, LSL #1 @L_tmp = L_mac(L_tmp, *mem, fac)
QADD r10, r12, r11 QADD r10, r12, r11
MOV r14, r10, ASR #16 @y[0] = round(L_tmp) MOV r14, r10, ASR #16 @y[0] = round(L_tmp)
@@ -94,9 +94,9 @@ LOOP:
BLT LOOP BLT LOOP
STR r14, [r3] STR r14, [r3]
STRH r14, [r2] STRH r14, [r2]
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
@ENDP @ENDP
.END .END

View File

@@ -31,7 +31,7 @@
Dot_product12_asm: Dot_product12_asm:
STMFD r13!, {r4 - r12, r14} STMFD r13!, {r4 - r12, r14}
MOV r4, #0 @ L_sum = 0 MOV r4, #0 @ L_sum = 0
MOV r5, #0 @ i = 0 MOV r5, #0 @ i = 0
@@ -41,13 +41,13 @@ LOOP:
LDR r8, [r0], #4 LDR r8, [r0], #4
SMLABB r4, r6, r7, r4 SMLABB r4, r6, r7, r4
LDR r9, [r1], #4 LDR r9, [r1], #4
SMLATT r4, r6, r7, r4 SMLATT r4, r6, r7, r4
LDR r6, [r0], #4 LDR r6, [r0], #4
SMLABB r4, r8, r9, r4 SMLABB r4, r8, r9, r4
LDR r7, [r1], #4 LDR r7, [r1], #4
SMLATT r4, r8, r9, r4 SMLATT r4, r8, r9, r4
LDR r8, [r0], #4 LDR r8, [r0], #4
SMLABB r4, r6, r7, r4 SMLABB r4, r6, r7, r4
@@ -58,7 +58,7 @@ LOOP:
CMP r5, r2 CMP r5, r2
SMLATT r4, r8, r9, r4 SMLATT r4, r8, r9, r4
BLT LOOP BLT LOOP
MOV r12, r4, LSL #1 MOV r12, r4, LSL #1
ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1 ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1
MOV r4, r12 MOV r4, r12
@@ -69,12 +69,12 @@ LOOP:
SUB r10, r10, #1 @ sft = norm_l(L_sum) SUB r10, r10, #1 @ sft = norm_l(L_sum)
MOV r0, r12, LSL r10 @ L_sum = L_sum << sft MOV r0, r12, LSL r10 @ L_sum = L_sum << sft
RSB r11, r10, #30 @ *exp = 30 - sft RSB r11, r10, #30 @ *exp = 30 - sft
STRH r11, [r3] STRH r11, [r3]
Dot_product12_end: Dot_product12_end:
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
@ENDFUNC @ENDFUNC
.END .END

View File

@@ -23,7 +23,7 @@
@****************************************************************** @******************************************************************
@ r0 --- signal[] @ r0 --- signal[]
@ r1 --- lg @ r1 --- lg
@ r2 --- mem[] @ r2 --- mem[]
.section .text .section .text
.global Filt_6k_7k_asm .global Filt_6k_7k_asm
@@ -32,7 +32,7 @@
Filt_6k_7k_asm: Filt_6k_7k_asm:
STMFD r13!, {r4 - r12, r14} STMFD r13!, {r4 - r12, r14}
SUB r13, r13, #240 @ x[L_SUBFR16k + (L_FIR - 1)] SUB r13, r13, #240 @ x[L_SUBFR16k + (L_FIR - 1)]
MOV r8, r0 @ copy signal[] address MOV r8, r0 @ copy signal[] address
MOV r4, r1 @ copy lg address MOV r4, r1 @ copy lg address
@@ -43,9 +43,9 @@ Filt_6k_7k_asm:
MOV r2, #30 @ L_FIR - 1 MOV r2, #30 @ L_FIR - 1
BL voAWB_Copy @ memcpy(x, mem, (L_FIR - 1)<<1) BL voAWB_Copy @ memcpy(x, mem, (L_FIR - 1)<<1)
LDR r10, Lable1 @ get fir_7k address LDR r10, Lable1 @ get fir_7k address
MOV r14, #0 MOV r14, #0
MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content
ADD r6, r13, #60 @ get x[L_FIR - 1] address ADD r6, r13, #60 @ get x[L_FIR - 1] address
MOV r7, r3 @ get signal[i] MOV r7, r3 @ get signal[i]
@@ -76,14 +76,14 @@ LOOP1:
STRH r12, [r6], #2 STRH r12, [r6], #2
ADD r14, r14, #8 ADD r14, r14, #8
CMP r14, #80 CMP r14, #80
BLT LOOP1 BLT LOOP1
STR r5, [sp, #-4] @ PUSH r5 to stack STR r5, [sp, #-4] @ PUSH r5 to stack
@ not use registers: r4, r10, r12, r14, r5 @ not use registers: r4, r10, r12, r14, r5
MOV r4, r13 MOV r4, r13
MOV r5, #0 @ i = 0 MOV r5, #0 @ i = 0
LOOP2: LOOP2:
LDR r0, [r10] LDR r0, [r10]
@@ -111,13 +111,13 @@ LOOP2:
LDRSH r8, [r4, #10] @ load x[i+5] LDRSH r8, [r4, #10] @ load x[i+5]
LDRSH r9, [r4, #50] @ load x[i+25] LDRSH r9, [r4, #50] @ load x[i+25]
SMLABT r14, r1, r0, r14 @ (x[i+3] + x[i+27]) * fir_7k[3] SMLABT r14, r1, r0, r14 @ (x[i+3] + x[i+27]) * fir_7k[3]
ADD r8, r8, r9 @ x[i+5] + x[i+25] ADD r8, r8, r9 @ x[i+5] + x[i+25]
LDR r0, [r10, #8] LDR r0, [r10, #8]
LDRSH r1, [r4, #12] @ x[i+6] LDRSH r1, [r4, #12] @ x[i+6]
LDRSH r2, [r4, #48] @ x[i+24] LDRSH r2, [r4, #48] @ x[i+24]
SMLABB r14, r6, r0, r14 @ (x[i+4] + x[i+26]) * fir_7k[4] SMLABB r14, r6, r0, r14 @ (x[i+4] + x[i+26]) * fir_7k[4]
LDRSH r6, [r4, #14] @ x[i+7] LDRSH r6, [r4, #14] @ x[i+7]
LDRSH r7, [r4, #46] @ x[i+23] LDRSH r7, [r4, #46] @ x[i+23]
SMLABT r14, r8, r0, r14 @ (x[i+5] + x[i+25]) * fir_7k[5] SMLABT r14, r8, r0, r14 @ (x[i+5] + x[i+25]) * fir_7k[5]
LDR r0, [r10, #12] LDR r0, [r10, #12]
@@ -125,8 +125,8 @@ LOOP2:
ADD r6, r6, r7 @ (x[i+7] + x[i+23]) ADD r6, r6, r7 @ (x[i+7] + x[i+23])
SMLABB r14, r1, r0, r14 @ (x[i+6] + x[i+24]) * fir_7k[6] SMLABB r14, r1, r0, r14 @ (x[i+6] + x[i+24]) * fir_7k[6]
LDRSH r8, [r4, #16] @ x[i+8] LDRSH r8, [r4, #16] @ x[i+8]
LDRSH r9, [r4, #44] @ x[i+22] LDRSH r9, [r4, #44] @ x[i+22]
SMLABT r14, r6, r0, r14 @ (x[i+7] + x[i+23]) * fir_7k[7] SMLABT r14, r6, r0, r14 @ (x[i+7] + x[i+23]) * fir_7k[7]
LDR r0, [r10, #16] LDR r0, [r10, #16]
LDRSH r1, [r4, #18] @ x[i+9] LDRSH r1, [r4, #18] @ x[i+9]
LDRSH r2, [r4, #42] @ x[i+21] LDRSH r2, [r4, #42] @ x[i+21]
@@ -144,7 +144,7 @@ LOOP2:
LDRSH r2, [r4, #36] @ x[i+18] LDRSH r2, [r4, #36] @ x[i+18]
SMLABB r14, r6, r0, r14 @ (x[i+10] + x[i+20]) * fir_7k[10] SMLABB r14, r6, r0, r14 @ (x[i+10] + x[i+20]) * fir_7k[10]
LDRSH r6, [r4, #26] @ x[i+13] LDRSH r6, [r4, #26] @ x[i+13]
ADD r8, r8, r9 @ (x[i+11] + x[i+19]) ADD r8, r8, r9 @ (x[i+11] + x[i+19])
LDRSH r7, [r4, #34] @ x[i+17] LDRSH r7, [r4, #34] @ x[i+17]
SMLABT r14, r8, r0, r14 @ (x[i+11] + x[i+19]) * fir_7k[11] SMLABT r14, r8, r0, r14 @ (x[i+11] + x[i+19]) * fir_7k[11]
LDR r0, [r10, #24] LDR r0, [r10, #24]
@@ -152,31 +152,31 @@ LOOP2:
LDRSH r8, [r4, #28] @ x[i+14] LDRSH r8, [r4, #28] @ x[i+14]
SMLABB r14, r1, r0, r14 @ (x[i+12] + x[i+18]) * fir_7k[12] SMLABB r14, r1, r0, r14 @ (x[i+12] + x[i+18]) * fir_7k[12]
ADD r6, r6, r7 @ (x[i+13] + x[i+17]) ADD r6, r6, r7 @ (x[i+13] + x[i+17])
LDRSH r9, [r4, #32] @ x[i+16] LDRSH r9, [r4, #32] @ x[i+16]
SMLABT r14, r6, r0, r14 @ (x[i+13] + x[i+17]) * fir_7k[13] SMLABT r14, r6, r0, r14 @ (x[i+13] + x[i+17]) * fir_7k[13]
LDR r0, [r10, #28] LDR r0, [r10, #28]
ADD r8, r8, r9 @ (x[i+14] + x[i+16]) ADD r8, r8, r9 @ (x[i+14] + x[i+16])
LDRSH r1, [r4, #30] @ x[i+15] LDRSH r1, [r4, #30] @ x[i+15]
SMLABB r14, r8, r0, r14 @ (x[i+14] + x[i+16]) * fir_7k[14] SMLABB r14, r8, r0, r14 @ (x[i+14] + x[i+16]) * fir_7k[14]
SMLABT r14, r1, r0, r14 @ x[i+15] * fir_7k[15] SMLABT r14, r1, r0, r14 @ x[i+15] * fir_7k[15]
ADD r5, r5, #1 ADD r5, r5, #1
ADD r14, r14, #0x4000 ADD r14, r14, #0x4000
ADD r4, r4, #2 ADD r4, r4, #2
MOV r1, r14, ASR #15 MOV r1, r14, ASR #15
CMP r5, #80 CMP r5, #80
STRH r1, [r3], #2 @signal[i] = (L_tmp + 0x4000) >> 15 STRH r1, [r3], #2 @signal[i] = (L_tmp + 0x4000) >> 15
BLT LOOP2 BLT LOOP2
LDR r1, [sp, #-4] @mem address LDR r1, [sp, #-4] @mem address
ADD r0, r13, #160 @x + lg ADD r0, r13, #160 @x + lg
MOV r2, #30 MOV r2, #30
BL voAWB_Copy BL voAWB_Copy
Filt_6k_7k_end: Filt_6k_7k_end:
ADD r13, r13, #240 ADD r13, r13, #240
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
Lable1: Lable1:
.word fir_6k_7k .word fir_6k_7k
@ENDFUNC @ENDFUNC

View File

@@ -32,8 +32,8 @@
@ r6 --- corr_norm[] @ r6 --- corr_norm[]
.section .text .section .text
.global Norm_corr_asm .global Norm_corr_asm
.extern Convolve_asm .extern Convolve_asm
.extern Isqrt_n .extern Isqrt_n
@****************************** @******************************
@@ -47,17 +47,17 @@
.equ T_MIN , 212 .equ T_MIN , 212
.equ T_MAX , 216 .equ T_MAX , 216
.equ CORR_NORM , 220 .equ CORR_NORM , 220
Norm_corr_asm: Norm_corr_asm:
STMFD r13!, {r4 - r12, r14} STMFD r13!, {r4 - r12, r14}
SUB r13, r13, #voSTACK SUB r13, r13, #voSTACK
ADD r8, r13, #20 @get the excf[L_SUBFR] ADD r8, r13, #20 @get the excf[L_SUBFR]
LDR r4, [r13, #T_MIN] @get t_min LDR r4, [r13, #T_MIN] @get t_min
RSB r11, r4, #0 @k = -t_min RSB r11, r4, #0 @k = -t_min
ADD r5, r0, r11, LSL #1 @get the &exc[k] ADD r5, r0, r11, LSL #1 @get the &exc[k]
@transfer Convolve function @transfer Convolve function
STMFD sp!, {r0 - r3} STMFD sp!, {r0 - r3}
MOV r0, r5 MOV r0, r5
@@ -68,7 +68,7 @@ Norm_corr_asm:
@ r8 --- excf[] @ r8 --- excf[]
MOV r14, r1 @copy xn[] address MOV r14, r1 @copy xn[] address
MOV r5, #64 MOV r5, #64
MOV r6, #0 @L_tmp = 0 MOV r6, #0 @L_tmp = 0
MOV r7, #1 MOV r7, #1
@@ -93,21 +93,21 @@ LOOP1:
CLZ r7, r9 CLZ r7, r9
SUB r6, r7, #1 @exp = norm_l(L_tmp) SUB r6, r7, #1 @exp = norm_l(L_tmp)
RSB r7, r6, #32 @exp = 32 - exp RSB r7, r6, #32 @exp = 32 - exp
MOV r6, r7, ASR #1 MOV r6, r7, ASR #1
RSB r7, r6, #0 @scale = -(exp >> 1) RSB r7, r6, #0 @scale = -(exp >> 1)
@loop for every possible period @loop for every possible period
@for(t = t_min@ t <= t_max@ t++) @for(t = t_min@ t <= t_max@ t++)
@r7 --- scale r4 --- t_min r8 --- excf[] @r7 --- scale r4 --- t_min r8 --- excf[]
LOOPFOR: LOOPFOR:
MOV r5, #0 @L_tmp = 0 MOV r5, #0 @L_tmp = 0
MOV r6, #0 @L_tmp1 = 0 MOV r6, #0 @L_tmp1 = 0
MOV r9, #64 MOV r9, #64
MOV r12, r1 @copy of xn[] MOV r12, r1 @copy of xn[]
ADD r14, r13, #20 @copy of excf[] ADD r14, r13, #20 @copy of excf[]
MOV r8, #0x8000 MOV r8, #0x8000
LOOPi: LOOPi:
LDR r11, [r14], #4 @load excf[i], excf[i+1] LDR r11, [r14], #4 @load excf[i], excf[i+1]
LDR r10, [r12], #4 @load xn[i], xn[i+1] LDR r10, [r12], #4 @load xn[i], xn[i+1]
@@ -128,13 +128,13 @@ LOOPi:
MOV r10, #1 MOV r10, #1
ADD r5, r10, r5, LSL #1 @L_tmp = (L_tmp << 1) + 1 ADD r5, r10, r5, LSL #1 @L_tmp = (L_tmp << 1) + 1
ADD r6, r10, r6, LSL #1 @L_tmp1 = (L_tmp1 << 1) + 1 ADD r6, r10, r6, LSL #1 @L_tmp1 = (L_tmp1 << 1) + 1
CLZ r10, r5 CLZ r10, r5
CMP r5, #0 CMP r5, #0
RSBLT r11, r5, #0 RSBLT r11, r5, #0
CLZLT r10, r11 CLZLT r10, r11
SUB r10, r10, #1 @exp = norm_l(L_tmp) SUB r10, r10, #1 @exp = norm_l(L_tmp)
MOV r5, r5, LSL r10 @L_tmp = (L_tmp << exp) MOV r5, r5, LSL r10 @L_tmp = (L_tmp << exp)
RSB r10, r10, #30 @exp_corr = 30 - exp RSB r10, r10, #30 @exp_corr = 30 - exp
MOV r11, r5, ASR #16 @corr = extract_h(L_tmp) MOV r11, r5, ASR #16 @corr = extract_h(L_tmp)
@@ -150,7 +150,7 @@ LOOPi:
@Isqrt_n(&L_tmp, &exp_norm) @Isqrt_n(&L_tmp, &exp_norm)
MOV r14, r0 MOV r14, r0
MOV r12, r1 MOV r12, r1
STMFD sp!, {r0 - r4, r7 - r12, r14} STMFD sp!, {r0 - r4, r7 - r12, r14}
ADD r1, sp, #4 ADD r1, sp, #4
@@ -168,7 +168,7 @@ LOOPi:
MOV r6, r6, ASR #16 @norm = extract_h(L_tmp) MOV r6, r6, ASR #16 @norm = extract_h(L_tmp)
MUL r12, r6, r11 MUL r12, r6, r11
ADD r12, r12, r12 @L_tmp = vo_L_mult(corr, norm) ADD r12, r12, r12 @L_tmp = vo_L_mult(corr, norm)
ADD r6, r10, r5 ADD r6, r10, r5
ADD r6, r6, r7 @exp_corr + exp_norm + scale ADD r6, r6, r7 @exp_corr + exp_norm + scale
@@ -187,9 +187,9 @@ LOOPi:
CMP r4, r6 CMP r4, r6
BEQ Norm_corr_asm_end BEQ Norm_corr_asm_end
ADD r4, r4, #1 @ t_min ++ ADD r4, r4, #1 @ t_min ++
RSB r5, r4, #0 @ k RSB r5, r4, #0 @ k
MOV r6, #63 @ i = 63 MOV r6, #63 @ i = 63
@@ -216,16 +216,16 @@ LOOPK:
MUL r14, r11, r8 MUL r14, r11, r8
LDR r6, [r13, #T_MAX] @ get t_max LDR r6, [r13, #T_MAX] @ get t_max
MOV r8, r14, ASR #15 MOV r8, r14, ASR #15
STRH r8, [r10] STRH r8, [r10]
CMP r4, r6 CMP r4, r6
BLE LOOPFOR BLE LOOPFOR
Norm_corr_asm_end: Norm_corr_asm_end:
ADD r13, r13, #voSTACK ADD r13, r13, #voSTACK
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
.END .END

View File

@@ -38,7 +38,7 @@
Syn_filt_32_asm: Syn_filt_32_asm:
STMFD r13!, {r4 - r12, r14} STMFD r13!, {r4 - r12, r14}
LDR r4, [r13, #40] @ get sig_hi[] address LDR r4, [r13, #40] @ get sig_hi[] address
LDR r5, [r13, #44] @ get sig_lo[] address LDR r5, [r13, #44] @ get sig_lo[] address
@@ -55,7 +55,7 @@ Syn_filt_32_asm:
AND r8, r8, r14 AND r8, r8, r14
ORR r10, r6, r7, LSL #16 @ Aq[2] -- Aq[1] ORR r10, r6, r7, LSL #16 @ Aq[2] -- Aq[1]
ORR r11, r8, r9, LSL #16 @ Aq[4] -- Aq[3] ORR r11, r8, r9, LSL #16 @ Aq[4] -- Aq[3]
STR r10, [r13, #-4] STR r10, [r13, #-4]
STR r11, [r13, #-8] STR r11, [r13, #-8]
LDRSH r6, [r0, #10] @ load Aq[5] LDRSH r6, [r0, #10] @ load Aq[5]
@@ -73,12 +73,12 @@ Syn_filt_32_asm:
LDRSH r7, [r0, #20] @ load Aq[10] LDRSH r7, [r0, #20] @ load Aq[10]
LDRSH r8, [r0, #22] @ load Aq[11] LDRSH r8, [r0, #22] @ load Aq[11]
LDRSH r9, [r0, #24] @ load Aq[12] LDRSH r9, [r0, #24] @ load Aq[12]
AND r6, r6, r14 AND r6, r6, r14
AND r8, r8, r14 AND r8, r8, r14
ORR r10, r6, r7, LSL #16 @ Aq[10] -- Aq[9] ORR r10, r6, r7, LSL #16 @ Aq[10] -- Aq[9]
ORR r11, r8, r9, LSL #16 @ Aq[12] -- Aq[11] ORR r11, r8, r9, LSL #16 @ Aq[12] -- Aq[11]
STR r10, [r13, #-20] STR r10, [r13, #-20]
STR r11, [r13, #-24] STR r11, [r13, #-24]
LDRSH r6, [r0, #26] @ load Aq[13] LDRSH r6, [r0, #26] @ load Aq[13]
LDRSH r7, [r0, #28] @ load Aq[14] LDRSH r7, [r0, #28] @ load Aq[14]
@@ -90,14 +90,14 @@ Syn_filt_32_asm:
ORR r11, r8, r9, LSL #16 @ Aq[16] -- Aq[15] ORR r11, r8, r9, LSL #16 @ Aq[16] -- Aq[15]
STR r10, [r13, #-28] STR r10, [r13, #-28]
STR r11, [r13, #-32] STR r11, [r13, #-32]
MOV r8, #0 @ i = 0 MOV r8, #0 @ i = 0
LOOP: LOOP:
LDRSH r6, [r5, #-2] @ load sig_lo[i-1] LDRSH r6, [r5, #-2] @ load sig_lo[i-1]
LDRSH r7, [r5, #-4] @ load sig_lo[i-2] LDRSH r7, [r5, #-4] @ load sig_lo[i-2]
LDR r11, [r13, #-4] @ Aq[2] -- Aq[1] LDR r11, [r13, #-4] @ Aq[2] -- Aq[1]
LDRSH r9, [r5, #-6] @ load sig_lo[i-3] LDRSH r9, [r5, #-6] @ load sig_lo[i-3]
LDRSH r10, [r5, #-8] @ load sig_lo[i-4] LDRSH r10, [r5, #-8] @ load sig_lo[i-4]
@@ -135,12 +135,12 @@ LOOP:
LDRSH r10, [r5, #-32] @ load sig_lo[i-16] LDRSH r10, [r5, #-32] @ load sig_lo[i-16]
SMLABB r12, r6, r11, r12 @ sig_lo[i-13] * Aq[13] SMLABB r12, r6, r11, r12 @ sig_lo[i-13] * Aq[13]
SMLABT r12, r7, r11, r12 @ sig_lo[i-14] * Aq[14] SMLABT r12, r7, r11, r12 @ sig_lo[i-14] * Aq[14]
LDR r11, [r13, #-32] @ Aq[16] -- Aq[15] LDR r11, [r13, #-32] @ Aq[16] -- Aq[15]
LDRSH r6, [r2],#2 @ load exc[i] LDRSH r6, [r2],#2 @ load exc[i]
SMLABB r12, r9, r11, r12 @ sig_lo[i-15] * Aq[15] SMLABB r12, r9, r11, r12 @ sig_lo[i-15] * Aq[15]
SMLABT r12, r10, r11, r12 @ sig_lo[i-16] * Aq[16] SMLABT r12, r10, r11, r12 @ sig_lo[i-16] * Aq[16]
MUL r7, r6, r3 @ exc[i] * a0 MUL r7, r6, r3 @ exc[i] * a0
RSB r14, r12, #0 @ L_tmp RSB r14, r12, #0 @ L_tmp
MOV r14, r14, ASR #11 @ L_tmp >>= 11 MOV r14, r14, ASR #11 @ L_tmp >>= 11
ADD r14, r14, r7, LSL #1 @ L_tmp += (exc[i] * a0) << 1 ADD r14, r14, r7, LSL #1 @ L_tmp += (exc[i] * a0) << 1
@@ -149,7 +149,7 @@ LOOP:
LDRSH r6, [r4, #-2] @ load sig_hi[i-1] LDRSH r6, [r4, #-2] @ load sig_hi[i-1]
LDRSH r7, [r4, #-4] @ load sig_hi[i-2] LDRSH r7, [r4, #-4] @ load sig_hi[i-2]
LDR r11, [r13, #-4] @ Aq[2] -- Aq[1] LDR r11, [r13, #-4] @ Aq[2] -- Aq[1]
LDRSH r9, [r4, #-6] @ load sig_hi[i-3] LDRSH r9, [r4, #-6] @ load sig_hi[i-3]
LDRSH r10, [r4, #-8] @ load sig_hi[i-4] LDRSH r10, [r4, #-8] @ load sig_hi[i-4]
SMULBB r12, r6, r11 @ sig_hi[i-1] * Aq[1] SMULBB r12, r6, r11 @ sig_hi[i-1] * Aq[1]
@@ -198,14 +198,14 @@ LOOP:
LDRSH r10, [r4, #-32] @ load sig_hi[i-16] LDRSH r10, [r4, #-32] @ load sig_hi[i-16]
SMLABB r12, r6, r11, r12 @ sig_hi[i-13] * Aq[13] SMLABB r12, r6, r11, r12 @ sig_hi[i-13] * Aq[13]
SMLABT r12, r7, r11, r12 @ sig_hi[i-14] * Aq[14] SMLABT r12, r7, r11, r12 @ sig_hi[i-14] * Aq[14]
LDR r11, [r13, #-32] @ Aq[16] -- Aq[15] LDR r11, [r13, #-32] @ Aq[16] -- Aq[15]
SMLABB r12, r9, r11, r12 @ sig_hi[i-15] * Aq[15] SMLABB r12, r9, r11, r12 @ sig_hi[i-15] * Aq[15]
SMLABT r12, r10, r11, r12 @ sig_hi[i-16] * Aq[16] SMLABT r12, r10, r11, r12 @ sig_hi[i-16] * Aq[16]
ADD r6, r12, r12 @ r12 << 1 ADD r6, r12, r12 @ r12 << 1
SUB r14, r14, r6 SUB r14, r14, r6
MOV r14, r14, LSL #3 @ L_tmp <<=3 MOV r14, r14, LSL #3 @ L_tmp <<=3
MOV r7, r14, ASR #16 @ L_tmp >> 16 MOV r7, r14, ASR #16 @ L_tmp >> 16
MOV r14, r14, ASR #4 @ L_tmp >>=4 MOV r14, r14, ASR #4 @ L_tmp >>=4
@@ -213,14 +213,14 @@ LOOP:
SUB r9, r14, r7, LSL #12 @ sig_lo[i] = L_tmp - (sig_hi[i] << 12) SUB r9, r14, r7, LSL #12 @ sig_lo[i] = L_tmp - (sig_hi[i] << 12)
ADD r8, r8, #1 ADD r8, r8, #1
STRH r9, [r5], #2 STRH r9, [r5], #2
CMP r8, #64 CMP r8, #64
BLT LOOP BLT LOOP
Syn_filt_32_end: Syn_filt_32_end:
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
@ENDFUNC @ENDFUNC
.END .END

View File

@@ -27,24 +27,24 @@
@ r3 --- L @ r3 --- L
.section .text .section .text
.global Convolve_asm .global Convolve_asm
Convolve_asm: Convolve_asm:
STMFD r13!, {r4 - r12, r14} STMFD r13!, {r4 - r12, r14}
MOV r3, #0 @ n MOV r3, #0 @ n
MOV r11, #0x8000 MOV r11, #0x8000
LOOP: LOOP:
ADD r4, r1, r3, LSL #1 @ tmpH address ADD r4, r1, r3, LSL #1 @ tmpH address
ADD r5, r3, #1 @ i = n + 1 ADD r5, r3, #1 @ i = n + 1
MOV r6, r0 @ tmpX = x MOV r6, r0 @ tmpX = x
LDRSH r9, [r6], #2 @ *tmpX++ LDRSH r9, [r6], #2 @ *tmpX++
LDRSH r10, [r4], #-2 @ *tmpH-- LDRSH r10, [r4], #-2 @ *tmpH--
SUB r5, r5, #1 SUB r5, r5, #1
MUL r8, r9, r10 MUL r8, r9, r10
LOOP1: LOOP1:
CMP r5, #0 CMP r5, #0
BLE L1 BLE L1
LDRSH r9, [r6], #2 @ *tmpX++ LDRSH r9, [r6], #2 @ *tmpX++
@@ -58,12 +58,12 @@ LOOP1:
LDRSH r12, [r6], #2 @ *tmpX++ LDRSH r12, [r6], #2 @ *tmpX++
LDRSH r14, [r4], #-2 @ *tmpH-- LDRSH r14, [r4], #-2 @ *tmpH--
MLA r8, r9, r10, r8 MLA r8, r9, r10, r8
SUBS r5, r5, #4 SUBS r5, r5, #4
MLA r8, r12, r14, r8 MLA r8, r12, r14, r8
B LOOP1
L1: B LOOP1
L1:
ADD r5, r11, r8, LSL #1 ADD r5, r11, r8, LSL #1
MOV r5, r5, LSR #16 @extract_h(s) MOV r5, r5, LSR #16 @extract_h(s)
@@ -75,14 +75,14 @@ L1:
ADD r5, r3, #1 ADD r5, r3, #1
MOV r6, r0 MOV r6, r0
LDRSH r9, [r6], #2 @ *tmpX++ LDRSH r9, [r6], #2 @ *tmpX++
LDRSH r10, [r4], #-2 LDRSH r10, [r4], #-2
LDRSH r12, [r6], #2 LDRSH r12, [r6], #2
LDRSH r14, [r4], #-2 LDRSH r14, [r4], #-2
MUL r8, r9, r10 MUL r8, r9, r10
SUB r5, r5, #2 SUB r5, r5, #2
MLA r8, r12, r14, r8 MLA r8, r12, r14, r8
LOOP2: LOOP2:
CMP r5, #0 CMP r5, #0
BLE L2 BLE L2
@@ -97,14 +97,14 @@ LOOP2:
LDRSH r12, [r6], #2 @ *tmpX++ LDRSH r12, [r6], #2 @ *tmpX++
LDRSH r14, [r4], #-2 @ *tmpH-- LDRSH r14, [r4], #-2 @ *tmpH--
MLA r8, r9, r10, r8 MLA r8, r9, r10, r8
SUBS r5, r5, #4 SUBS r5, r5, #4
MLA r8, r12, r14, r8 MLA r8, r12, r14, r8
B LOOP2 B LOOP2
L2: L2:
ADD r8, r11, r8, LSL #1 ADD r8, r11, r8, LSL #1
MOV r8, r8, LSR #16 @extract_h(s) MOV r8, r8, LSR #16 @extract_h(s)
ADD r3, r3, #1 ADD r3, r3, #1
STRH r8, [r2], #2 @y[n] STRH r8, [r2], #2 @y[n]
ADD r4, r1, r3, LSL #1 ADD r4, r1, r3, LSL #1
@@ -117,7 +117,7 @@ L2:
MUL r8, r9, r10 MUL r8, r9, r10
LDRSH r9, [r6], #2 LDRSH r9, [r6], #2
LDRSH r10, [r4], #-2 LDRSH r10, [r4], #-2
MLA r8, r12, r14, r8 MLA r8, r12, r14, r8
SUB r5, r5, #3 SUB r5, r5, #3
MLA r8, r9, r10, r8 MLA r8, r9, r10, r8
@@ -135,9 +135,9 @@ LOOP3:
LDRSH r12, [r6], #2 @ *tmpX++ LDRSH r12, [r6], #2 @ *tmpX++
LDRSH r14, [r4], #-2 @ *tmpH-- LDRSH r14, [r4], #-2 @ *tmpH--
MLA r8, r9, r10, r8 MLA r8, r9, r10, r8
SUBS r5, r5, #4 SUBS r5, r5, #4
MLA r8, r12, r14, r8 MLA r8, r12, r14, r8
B LOOP3 B LOOP3
L3: L3:
ADD r8, r11, r8, LSL #1 ADD r8, r11, r8, LSL #1
@@ -150,7 +150,7 @@ L3:
MOV r6, r0 MOV r6, r0
MOV r8, #0 MOV r8, #0
LOOP4: LOOP4:
CMP r5, #0 CMP r5, #0
BLE L4 BLE L4
LDRSH r9, [r6], #2 @ *tmpX++ LDRSH r9, [r6], #2 @ *tmpX++
@@ -164,22 +164,22 @@ LOOP4:
LDRSH r12, [r6], #2 @ *tmpX++ LDRSH r12, [r6], #2 @ *tmpX++
LDRSH r14, [r4], #-2 @ *tmpH-- LDRSH r14, [r4], #-2 @ *tmpH--
MLA r8, r9, r10, r8 MLA r8, r9, r10, r8
SUBS r5, r5, #4 SUBS r5, r5, #4
MLA r8, r12, r14, r8 MLA r8, r12, r14, r8
B LOOP4 B LOOP4
L4: L4:
ADD r5, r11, r8, LSL #1 ADD r5, r11, r8, LSL #1
MOV r5, r5, LSR #16 @extract_h(s) MOV r5, r5, LSR #16 @extract_h(s)
ADD r3, r3, #1 ADD r3, r3, #1
STRH r5, [r2], #2 @y[n] STRH r5, [r2], #2 @y[n]
CMP r3, #64 CMP r3, #64
BLT LOOP BLT LOOP
Convolve_asm_end: Convolve_asm_end:
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
@ENDFUNC @ENDFUNC
.END .END

View File

@@ -51,12 +51,12 @@ LOOPi:
RSB r11, r2, #62 @j=62-pos RSB r11, r2, #62 @j=62-pos
LOOPj1: LOOPj1:
LDRSH r12, [r10], #2 LDRSH r12, [r10], #2
LDRSH r8, [r9], #2 LDRSH r8, [r9], #2
LDRSH r14, [r9] LDRSH r14, [r9]
SUBS r11, r11, #1 SUBS r11, r11, #1
MLA r5, r12, r8, r5 MLA r5, r12, r8, r5
MLA r6, r12, r14, r6 MLA r6, r12, r14, r6
BGE LOOPj1 BGE LOOPj1
LDRSH r12, [r10], #2 @*p1++ LDRSH r12, [r10], #2 @*p1++
@@ -64,7 +64,7 @@ LOOPj1:
MLA r5, r12, r14, r5 MLA r5, r12, r14, r5
MOV r14, #0x8000 MOV r14, #0x8000
MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2)
ADD r10, r6, r14 ADD r10, r6, r14
ADD r9, r5, r14 ADD r9, r5, r14
MOV r5, r9, ASR #16 MOV r5, r9, ASR #16
MOV r6, r10, ASR #16 MOV r6, r10, ASR #16
@@ -76,7 +76,7 @@ LOOPj1:
MUL r14, r6, r11 MUL r14, r6, r11
MOV r5, r12, ASR #15 MOV r5, r12, ASR #15
MOV r6, r14, ASR #15 MOV r6, r14, ASR #15
LDR r9, [r13, #44] LDR r9, [r13, #44]
LDR r12, [r13, #48] LDR r12, [r13, #48]
LDRSH r10, [r7], #2 @*p0++ LDRSH r10, [r7], #2 @*p0++
LDRSH r11, [r8] @*p3++ LDRSH r11, [r8] @*p3++
@@ -88,7 +88,7 @@ LOOPj1:
STRH r6, [r12] STRH r6, [r12]
ADD r2, r2, #4 ADD r2, r2, #4
MOV r5, #0 @L_sum1 = 0 MOV r5, #0 @L_sum1 = 0
MOV r6, #0 @L_sum2 = 0 MOV r6, #0 @L_sum2 = 0
ADD r9, r1, r2, LSL #1 @p2 = &vec[pos] ADD r9, r1, r2, LSL #1 @p2 = &vec[pos]
@@ -97,12 +97,12 @@ LOOPj1:
ADD r4, r4, #1 @i++ ADD r4, r4, #1 @i++
LOOPj2: LOOPj2:
LDRSH r12, [r10], #2 LDRSH r12, [r10], #2
LDRSH r8, [r9], #2 LDRSH r8, [r9], #2
LDRSH r14, [r9] LDRSH r14, [r9]
SUBS r11, r11, #1 SUBS r11, r11, #1
MLA r5, r12, r8, r5 MLA r5, r12, r8, r5
MLA r6, r12, r14, r6 MLA r6, r12, r14, r6
BGE LOOPj2 BGE LOOPj2
LDRSH r12, [r10], #2 @*p1++ LDRSH r12, [r10], #2 @*p1++
@@ -110,7 +110,7 @@ LOOPj2:
MLA r5, r12, r14, r5 MLA r5, r12, r14, r5
MOV r14, #0x8000 MOV r14, #0x8000
MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2)
ADD r10, r6, r14 ADD r10, r6, r14
ADD r9, r5, r14 ADD r9, r5, r14
MOV r5, r9, ASR #16 MOV r5, r9, ASR #16
@@ -123,7 +123,7 @@ LOOPj2:
MUL r14, r6, r11 MUL r14, r6, r11
MOV r5, r12, ASR #15 MOV r5, r12, ASR #15
MOV r6, r14, ASR #15 MOV r6, r14, ASR #15
LDR r9, [r13, #44] LDR r9, [r13, #44]
LDR r12, [r13, #48] LDR r12, [r13, #48]
LDRSH r10, [r7], #2 @*p0++ LDRSH r10, [r7], #2 @*p0++
LDRSH r11, [r8] @*p3++ LDRSH r11, [r8] @*p3++
@@ -136,16 +136,16 @@ LOOPj2:
ADD r4, r4, #1 @i+1 ADD r4, r4, #1 @i+1
ADD r2, r2, #4 @pos += STEP ADD r2, r2, #4 @pos += STEP
CMP r4, #16 CMP r4, #16
BLT LOOPi BLT LOOPi
the_end: the_end:
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
@ENDFUNC @ENDFUNC
.END .END

View File

@@ -35,7 +35,7 @@
pred_lt4_asm: pred_lt4_asm:
STMFD r13!, {r4 - r12, r14} STMFD r13!, {r4 - r12, r14}
RSB r4, r1, #0 @-T0 RSB r4, r1, #0 @-T0
RSB r2, r2, #0 @frac = -frac RSB r2, r2, #0 @frac = -frac
ADD r5, r0, r4, LSL #1 @x = exc - T0 ADD r5, r0, r4, LSL #1 @x = exc - T0
@@ -45,7 +45,7 @@ pred_lt4_asm:
SUB r5, r5, #30 @x -= 15 SUB r5, r5, #30 @x -= 15
RSB r4, r2, #3 @k = 3 - frac RSB r4, r2, #3 @k = 3 - frac
LDR r6, Table LDR r6, Table
MOV r8, r4, LSL #6 MOV r8, r4, LSL #6
@MOV r7, #0 @j = 0 @MOV r7, #0 @j = 0
ADD r8, r6, r8 @ptr2 = &(inter4_2[k][0]) ADD r8, r6, r8 @ptr2 = &(inter4_2[k][0])
@@ -63,7 +63,7 @@ THREE_LOOP:
LDRSH r6, [r1], #2 @x[1] LDRSH r6, [r1], #2 @x[1]
LDRSH r9, [r1], #2 @x[2] LDRSH r9, [r1], #2 @x[2]
SMULBB r10, r4, r3 @x[0] * h[0] SMULBB r10, r4, r3 @x[0] * h[0]
SMULBB r11, r6, r3 @x[1] * h[0] SMULBB r11, r6, r3 @x[1] * h[0]
SMULBB r12, r9, r3 @x[2] * h[0] SMULBB r12, r9, r3 @x[2] * h[0]
@@ -285,7 +285,7 @@ Last2LOOP:
SMLABB r10, r9, r3, r10 @x[2] * h[2] SMLABB r10, r9, r3, r10 @x[2] * h[2]
SMLABB r11, r4, r3, r11 @x[3] * h[2] SMLABB r11, r4, r3, r11 @x[3] * h[2]
SMLABT r10, r4, r3, r10 @x[3] * h[3] SMLABT r10, r4, r3, r10 @x[3] * h[3]
SMLABT r11, r6, r3, r11 @x[4] * h[3] SMLABT r11, r6, r3, r11 @x[4] * h[3]
@@ -435,7 +435,7 @@ Last2LOOP:
MOV r11, r11, LSL #1 MOV r11, r11, LSL #1
QADD r10, r10, r10 QADD r10, r10, r10
QADD r11, r11, r11 QADD r11, r11, r11
QADD r10, r10, r5 QADD r10, r10, r5
QADD r11, r11, r5 QADD r11, r11, r5

View File

@@ -34,12 +34,12 @@ Residu_opt:
LDRH r5, [r0], #2 LDRH r5, [r0], #2
LDRH r6, [r0], #2 LDRH r6, [r0], #2
ORR r5, r6, r5, LSL #16 @r5 --- a0, a1 ORR r5, r6, r5, LSL #16 @r5 --- a0, a1
LDRH r6, [r0], #2 LDRH r6, [r0], #2
LDRH r7, [r0], #2 LDRH r7, [r0], #2
ORR r6, r7, r6, LSL #16 @r6 --- a2, a3 ORR r6, r7, r6, LSL #16 @r6 --- a2, a3
LDRH r7, [r0], #2 LDRH r7, [r0], #2
LDRH r8, [r0], #2 LDRH r8, [r0], #2
ORR r7, r8, r7, LSL #16 @r7 --- a4, a5 ORR r7, r8, r7, LSL #16 @r7 --- a4, a5
@@ -59,13 +59,13 @@ Residu_opt:
LDRH r11, [r0], #2 LDRH r11, [r0], #2
LDRH r12, [r0], #2 LDRH r12, [r0], #2
ORR r11, r12, r11, LSL #16 @r11 --- a12, a13 ORR r11, r12, r11, LSL #16 @r11 --- a12, a13
LDRH r12, [r0], #2 LDRH r12, [r0], #2
LDRH r4, [r0], #2 LDRH r4, [r0], #2
ORR r12, r4, r12, LSL #16 @r12 --- a14, a15 ORR r12, r4, r12, LSL #16 @r12 --- a14, a15
STMFD r13!, {r8 - r12} @store r8-r12
STMFD r13!, {r8 - r12} @store r8-r12
LDRH r4, [r0], #2 @load a16 LDRH r4, [r0], #2 @load a16
MOV r14, r3, ASR #2 @one loop get 4 outputs MOV r14, r3, ASR #2 @one loop get 4 outputs
ADD r1, r1, #4 ADD r1, r1, #4
@@ -78,7 +78,7 @@ residu_loop:
LDR r2, [r1], #-4 @r2 --- x[1], x[0] LDR r2, [r1], #-4 @r2 --- x[1], x[0]
SMULTB r3, r5, r2 @i1(0) --- r3 = x[0] * a0 SMULTB r3, r5, r2 @i1(0) --- r3 = x[0] * a0
SMULTT r4, r5, r2 @i2(0) --- r4 = x[1] * a0 SMULTT r4, r5, r2 @i2(0) --- r4 = x[1] * a0
SMULTB r11, r5, r10 @i3(0) --- r11 = x[2] * a0 SMULTB r11, r5, r10 @i3(0) --- r11 = x[2] * a0
SMULTT r12, r5, r10 @i4(0) --- r12 = x[3] * a0 SMULTT r12, r5, r10 @i4(0) --- r12 = x[3] * a0
@@ -88,20 +88,20 @@ residu_loop:
SMLATB r11, r6, r2, r11 @i3(2) --- r11 += x[0] * a2 SMLATB r11, r6, r2, r11 @i3(2) --- r11 += x[0] * a2
SMLATT r12, r6, r2, r12 @i4(2) --- r12 += x[1] * a2 SMLATT r12, r6, r2, r12 @i4(2) --- r12 += x[1] * a2
SMLABB r12, r6, r2, r12 @i4(3) --- r12 += x[0] * a3 SMLABB r12, r6, r2, r12 @i4(3) --- r12 += x[0] * a3
LDR r2, [r1], #-4 @r2 ---- x[-1], x[-2] LDR r2, [r1], #-4 @r2 ---- x[-1], x[-2]
SMLABT r3, r5, r2, r3 @i1(1) --- r3 += x[-1] * a1 SMLABT r3, r5, r2, r3 @i1(1) --- r3 += x[-1] * a1
SMLATT r4, r6, r2, r4 @i2(2) --- r4 += x[-1] * a2 SMLATT r4, r6, r2, r4 @i2(2) --- r4 += x[-1] * a2
SMLABT r11, r6, r2, r11 @i3(3) --- r11 += x[-1] * a3 SMLABT r11, r6, r2, r11 @i3(3) --- r11 += x[-1] * a3
SMLATT r12, r7, r2, r12 @i4(4) --- r12 += x[-1] * a4 SMLATT r12, r7, r2, r12 @i4(4) --- r12 += x[-1] * a4
SMLATB r3, r6, r2, r3 @i1(2) --- r3 += x[-2] * a2 SMLATB r3, r6, r2, r3 @i1(2) --- r3 += x[-2] * a2
SMLABB r4, r6, r2, r4 @ i2 (3) SMLABB r4, r6, r2, r4 @ i2 (3)
SMLATB r11,r7, r2, r11 @ i3 (4) SMLATB r11,r7, r2, r11 @ i3 (4)
SMLABB r12,r7, r2, r12 @ i4 (5) SMLABB r12,r7, r2, r12 @ i4 (5)
LDR r2,[r1],#-4 LDR r2,[r1],#-4
SMLABT r3, r6, r2, r3 @ i1 (3) SMLABT r3, r6, r2, r3 @ i1 (3)
SMLATT r4, r7, r2, r4 @ i2 (4) SMLATT r4, r7, r2, r4 @ i2 (4)
@@ -111,7 +111,7 @@ residu_loop:
SMLABB r4, r7, r2, r4 @ i2 (5) SMLABB r4, r7, r2, r4 @ i2 (5)
SMLATB r11,r8, r2, r11 @ i3 (6) SMLATB r11,r8, r2, r11 @ i3 (6)
SMLABB r12,r8, r2, r12 @ i4 (7) SMLABB r12,r8, r2, r12 @ i4 (7)
LDR r2,[r1],#-4 LDR r2,[r1],#-4
SMLABT r3, r7, r2, r3 @ i1 (5) SMLABT r3, r7, r2, r3 @ i1 (5)
SMLATT r4, r8, r2, r4 @ i2 (6) SMLATT r4, r8, r2, r4 @ i2 (6)
@@ -122,7 +122,7 @@ residu_loop:
SMLATB r11,r9, r2, r11 @ i3 (8) SMLATB r11,r9, r2, r11 @ i3 (8)
SMLABB r12,r9, r2, r12 @ i4 (9) SMLABB r12,r9, r2, r12 @ i4 (9)
LDR r10, [r13, #8] @ [ a10 | a11] LDR r10, [r13, #8] @ [ a10 | a11]
LDR r2,[r1],#-4 LDR r2,[r1],#-4
SMLABT r3, r8, r2, r3 @ i1 (7) SMLABT r3, r8, r2, r3 @ i1 (7)
SMLATT r4, r9, r2, r4 @ i2 (8) SMLATT r4, r9, r2, r4 @ i2 (8)
@@ -133,7 +133,7 @@ residu_loop:
SMLATB r11,r10, r2, r11 @ i3 (10) SMLATB r11,r10, r2, r11 @ i3 (10)
SMLABB r12,r10, r2, r12 @ i4 (11) SMLABB r12,r10, r2, r12 @ i4 (11)
LDR r8, [r13, #12] @ [ a12 | a13 ] LDR r8, [r13, #12] @ [ a12 | a13 ]
LDR r2,[r1],#-4 LDR r2,[r1],#-4
SMLABT r3, r9, r2, r3 @ i1 (9) SMLABT r3, r9, r2, r3 @ i1 (9)
SMLATT r4, r10, r2, r4 @ i2 (10) SMLATT r4, r10, r2, r4 @ i2 (10)
@@ -144,7 +144,7 @@ residu_loop:
SMLATB r11,r8, r2, r11 @ i3 (12) SMLATB r11,r8, r2, r11 @ i3 (12)
SMLABB r12,r8, r2, r12 @ i4 (13) SMLABB r12,r8, r2, r12 @ i4 (13)
LDR r9, [r13, #16] @ [ a14 | a15 ] LDR r9, [r13, #16] @ [ a14 | a15 ]
LDR r2,[r1],#-4 LDR r2,[r1],#-4
SMLABT r3, r10, r2, r3 @ i1 (11) SMLABT r3, r10, r2, r3 @ i1 (11)
SMLATT r4, r8, r2, r4 @ i2 (12) SMLATT r4, r8, r2, r4 @ i2 (12)
@@ -154,7 +154,7 @@ residu_loop:
SMLABB r4, r8, r2, r4 @ i2 (13) SMLABB r4, r8, r2, r4 @ i2 (13)
SMLATB r11,r9, r2, r11 @ i3 (14) SMLATB r11,r9, r2, r11 @ i3 (14)
SMLABB r12,r9, r2, r12 @ i4 (15) SMLABB r12,r9, r2, r12 @ i4 (15)
LDR r2,[r1],#-4 LDR r2,[r1],#-4
SMLABT r3, r8, r2, r3 @ i1 (13) SMLABT r3, r8, r2, r3 @ i1 (13)
@@ -165,64 +165,64 @@ residu_loop:
SMLABB r4, r9, r2, r4 @ i2 (15) SMLABB r4, r9, r2, r4 @ i2 (15)
SMLABB r11,r14, r2, r11 @ i3 (16) SMLABB r11,r14, r2, r11 @ i3 (16)
LDR r8, [r13] @ [ a6 | a7 ] LDR r8, [r13] @ [ a6 | a7 ]
LDR r2,[r1],#44 @ Change LDR r2,[r1],#44 @ Change
SMLABT r3, r9, r2, r3 SMLABT r3, r9, r2, r3
SMLABB r3, r14, r2, r3 SMLABB r3, r14, r2, r3
SMLABT r4, r14, r2, r4 SMLABT r4, r14, r2, r4
LDR r9, [r13, #4] @ [ a8 | a9 ] LDR r9, [r13, #4] @ [ a8 | a9 ]
QADD r3,r3,r3
QADD r4,r4,r4 QADD r3,r3,r3
QADD r11,r11,r11 QADD r4,r4,r4
QADD r12,r12,r12 QADD r11,r11,r11
QADD r12,r12,r12
QADD r3,r3,r3
QADD r4,r4,r4 QADD r3,r3,r3
QADD r11,r11,r11 QADD r4,r4,r4
QADD r12,r12,r12 QADD r11,r11,r11
QADD r12,r12,r12
QADD r3,r3,r3
QADD r4,r4,r4 QADD r3,r3,r3
QADD r11,r11,r11 QADD r4,r4,r4
QADD r12,r12,r12 QADD r11,r11,r11
QADD r12,r12,r12
QADD r3,r3,r3
QADD r4,r4,r4 QADD r3,r3,r3
QADD r11,r11,r11 QADD r4,r4,r4
QADD r12,r12,r12 QADD r11,r11,r11
QADD r12,r12,r12
MOV r2,#32768
MOV r2,#32768
QDADD r3,r2,r3
QDADD r4,r2,r4 QDADD r3,r2,r3
QDADD r11,r2,r11 QDADD r4,r2,r4
QDADD r12,r2,r12 QDADD r11,r2,r11
QDADD r12,r2,r12
MOV r3,r3,asr #16 MOV r3,r3,asr #16
MOV r4,r4,asr #16 MOV r4,r4,asr #16
MOV r11,r11,asr #16 MOV r11,r11,asr #16
MOV r12,r12,asr #16 MOV r12,r12,asr #16
STRH r3,[r0],#2 STRH r3,[r0],#2
STRH r4,[r0],#2 STRH r4,[r0],#2
STRH r11,[r0],#2 STRH r11,[r0],#2
STRH r12,[r0],#2 STRH r12,[r0],#2
MOV r2,r14,asr #16 MOV r2,r14,asr #16
SUB r14, r14, #0x10000 SUB r14, r14, #0x10000
SUBS r2,r2,#1 SUBS r2,r2,#1
BNE residu_loop BNE residu_loop
end: end:
LDMFD r13!, {r8 -r12} LDMFD r13!, {r8 -r12}
LDMFD r13!, {r4 -r12,pc} LDMFD r13!, {r4 -r12,pc}
@ENDFUNC @ENDFUNC
.END .END

View File

@@ -38,7 +38,7 @@ Scale_sig_opt:
MOV r8, #0x7fffffff MOV r8, #0x7fffffff
MOV r9, #0x8000 MOV r9, #0x8000
BLE LOOP2 BLE LOOP2
LOOP1: LOOP1:
LDRSH r5, [r4] @load x[i] LDRSH r5, [r4] @load x[i]
@@ -65,11 +65,11 @@ LOOP2:
The_end: The_end:
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
@ENDFUNC @ENDFUNC
.END .END

View File

@@ -33,18 +33,18 @@
Syn_filt_asm: Syn_filt_asm:
STMFD r13!, {r4 - r12, r14} STMFD r13!, {r4 - r12, r14}
SUB r13, r13, #700 @ y_buf[L_FRAME16k + M16k] SUB r13, r13, #700 @ y_buf[L_FRAME16k + M16k]
MOV r4, r3 @ copy mem[] address MOV r4, r3 @ copy mem[] address
MOV r5, r13 @ copy yy = y_buf address MOV r5, r13 @ copy yy = y_buf address
@ for(i = 0@ i < m@ i++) @ for(i = 0@ i < m@ i++)
@{ @{
@ *yy++ = mem[i]@ @ *yy++ = mem[i]@
@} @}
LDRH r6, [r4], #2 LDRH r6, [r4], #2
LDRH r7, [r4], #2 LDRH r7, [r4], #2
LDRH r8, [r4], #2 LDRH r8, [r4], #2
LDRH r9, [r4], #2 LDRH r9, [r4], #2
@@ -62,7 +62,7 @@ Syn_filt_asm:
STRH r12, [r5], #2 STRH r12, [r5], #2
STRH r14, [r5], #2 STRH r14, [r5], #2
LDRH r6, [r4], #2 LDRH r6, [r4], #2
LDRH r7, [r4], #2 LDRH r7, [r4], #2
LDRH r8, [r4], #2 LDRH r8, [r4], #2
LDRH r9, [r4], #2 LDRH r9, [r4], #2
@@ -92,45 +92,45 @@ Syn_filt_asm:
LDRSH r9, [r0, #6] @ load a[3] LDRSH r9, [r0, #6] @ load a[3]
LDRSH r11,[r0, #8] @ load a[4] LDRSH r11,[r0, #8] @ load a[4]
AND r6, r6, r14 AND r6, r6, r14
AND r9, r9, r14 AND r9, r9, r14
ORR r10, r6, r7, LSL #16 @ -a[2] -- -a[1] ORR r10, r6, r7, LSL #16 @ -a[2] -- -a[1]
ORR r12, r9, r11, LSL #16 @ -a[4] -- -a[3] ORR r12, r9, r11, LSL #16 @ -a[4] -- -a[3]
STR r10, [r13, #-4] STR r10, [r13, #-4]
STR r12, [r13, #-8] STR r12, [r13, #-8]
LDRSH r6, [r0, #10] @ load a[5] LDRSH r6, [r0, #10] @ load a[5]
LDRSH r7, [r0, #12] @ load a[6] LDRSH r7, [r0, #12] @ load a[6]
LDRSH r9, [r0, #14] @ load a[7] LDRSH r9, [r0, #14] @ load a[7]
LDRSH r11,[r0, #16] @ load a[8] LDRSH r11,[r0, #16] @ load a[8]
AND r6, r6, r14 AND r6, r6, r14
AND r9, r9, r14 AND r9, r9, r14
ORR r10, r6, r7, LSL #16 @ -a[6] -- -a[5] ORR r10, r6, r7, LSL #16 @ -a[6] -- -a[5]
ORR r12, r9, r11, LSL #16 @ -a[8] -- -a[7] ORR r12, r9, r11, LSL #16 @ -a[8] -- -a[7]
STR r10, [r13, #-12] STR r10, [r13, #-12]
STR r12, [r13, #-16] STR r12, [r13, #-16]
LDRSH r6, [r0, #18] @ load a[9] LDRSH r6, [r0, #18] @ load a[9]
LDRSH r7, [r0, #20] @ load a[10] LDRSH r7, [r0, #20] @ load a[10]
LDRSH r9, [r0, #22] @ load a[11] LDRSH r9, [r0, #22] @ load a[11]
LDRSH r11,[r0, #24] @ load a[12] LDRSH r11,[r0, #24] @ load a[12]
AND r6, r6, r14 AND r6, r6, r14
AND r9, r9, r14 AND r9, r9, r14
ORR r10, r6, r7, LSL #16 @ -a[10] -- -a[9] ORR r10, r6, r7, LSL #16 @ -a[10] -- -a[9]
ORR r12, r9, r11, LSL #16 @ -a[12] -- -a[11] ORR r12, r9, r11, LSL #16 @ -a[12] -- -a[11]
STR r10, [r13, #-20] STR r10, [r13, #-20]
STR r12, [r13, #-24] STR r12, [r13, #-24]
LDRSH r6, [r0, #26] @ load a[13] LDRSH r6, [r0, #26] @ load a[13]
LDRSH r7, [r0, #28] @ load a[14] LDRSH r7, [r0, #28] @ load a[14]
LDRSH r9, [r0, #30] @ load a[15] LDRSH r9, [r0, #30] @ load a[15]
LDRSH r11,[r0, #32] @ load a[16] LDRSH r11,[r0, #32] @ load a[16]
AND r6, r6, r14 AND r6, r6, r14
AND r9, r9, r14 AND r9, r9, r14
ORR r10, r6, r7, LSL #16 @ -a[14] -- -a[13] ORR r10, r6, r7, LSL #16 @ -a[14] -- -a[13]
ORR r12, r9, r11, LSL #16 @ -a[16] -- -a[15] ORR r12, r9, r11, LSL #16 @ -a[16] -- -a[15]
STR r10, [r13, #-28] STR r10, [r13, #-28]
STR r12, [r13, #-32] STR r12, [r13, #-32]
ADD r4, r13, #32 ADD r4, r13, #32
LOOP: LOOP:
LDRSH r6, [r1], #2 @ load x[i] LDRSH r6, [r1], #2 @ load x[i]
@@ -155,8 +155,8 @@ LOOP:
SMLABB r14, r6, r7, r14 @ -a[3] * (*(temp_p -3)) SMLABB r14, r6, r7, r14 @ -a[3] * (*(temp_p -3))
LDRSH r9, [r10, #-10] @ *(temp_p - 5) LDRSH r9, [r10, #-10] @ *(temp_p - 5)
SMLABT r14, r11, r7, r14 @ -a[4] * (*(temp_p -4)) SMLABT r14, r11, r7, r14 @ -a[4] * (*(temp_p -4))
LDR r7, [r13, #-12] @ -a[6] -a[5] LDR r7, [r13, #-12] @ -a[6] -a[5]
LDRSH r12, [r10, #-12] @ *(temp_p - 6) LDRSH r12, [r10, #-12] @ *(temp_p - 6)
@@ -169,13 +169,13 @@ LOOP:
LDR r7, [r13, #-16] @ -a[8] -a[7] LDR r7, [r13, #-16] @ -a[8] -a[7]
LDRSH r11, [r10, #-16] @ *(temp_p - 8) LDRSH r11, [r10, #-16] @ *(temp_p - 8)
SMLABB r14, r6, r7, r14 @ -a[7] * (*(temp_p -7)) SMLABB r14, r6, r7, r14 @ -a[7] * (*(temp_p -7))
LDRSH r9, [r10, #-18] @ *(temp_p - 9) LDRSH r9, [r10, #-18] @ *(temp_p - 9)
SMLABT r14, r11, r7, r14 @ -a[8] * (*(temp_p -8)) SMLABT r14, r11, r7, r14 @ -a[8] * (*(temp_p -8))
LDR r7, [r13, #-20] @ -a[10] -a[9] LDR r7, [r13, #-20] @ -a[10] -a[9]
LDRSH r12, [r10, #-20] @ *(temp_p - 10) LDRSH r12, [r10, #-20] @ *(temp_p - 10)
@@ -192,11 +192,11 @@ LOOP:
LDRSH r9, [r10, #-26] @ *(temp_p - 13) LDRSH r9, [r10, #-26] @ *(temp_p - 13)
SMLABT r14, r11, r7, r14 @ -a[12] * (*(temp_p -12)) SMLABT r14, r11, r7, r14 @ -a[12] * (*(temp_p -12))
LDR r7, [r13, #-28] @ -a[14] -a[13] LDR r7, [r13, #-28] @ -a[14] -a[13]
LDRSH r12, [r10, #-28] @ *(temp_p - 14) LDRSH r12, [r10, #-28] @ *(temp_p - 14)
SMLABB r14, r9, r7, r14 @ -a[13] * (*(temp_p -13)) SMLABB r14, r9, r7, r14 @ -a[13] * (*(temp_p -13))
LDRSH r6, [r10, #-30] @ *(temp_p - 15) LDRSH r6, [r10, #-30] @ *(temp_p - 15)
@@ -211,28 +211,28 @@ LOOP:
SMLABT r14, r11, r7, r14 @ -a[16] * (*(temp_p -16)) SMLABT r14, r11, r7, r14 @ -a[16] * (*(temp_p -16))
RSB r14, r14, r0 RSB r14, r14, r0
MOV r7, r14, LSL #4 @ L_tmp <<=4 MOV r7, r14, LSL #4 @ L_tmp <<=4
ADD r8, r8, #1 ADD r8, r8, #1
ADD r14, r7, #0x8000 ADD r14, r7, #0x8000
MOV r7, r14, ASR #16 @ (L_tmp + 0x8000) >> 16 MOV r7, r14, ASR #16 @ (L_tmp + 0x8000) >> 16
CMP r8, #80 CMP r8, #80
STRH r7, [r10] @ yy[i] STRH r7, [r10] @ yy[i]
STRH r7, [r2], #2 @ y[i] STRH r7, [r2], #2 @ y[i]
BLT LOOP BLT LOOP
@ update mem[] @ update mem[]
ADD r5, r13, #160 @ yy[64] address ADD r5, r13, #160 @ yy[64] address
MOV r1, r3 MOV r1, r3
MOV r0, r5 MOV r0, r5
MOV r2, #16 MOV r2, #16
BL voAWB_Copy BL voAWB_Copy
Syn_filt_asm_end: Syn_filt_asm_end:
ADD r13, r13, #700 ADD r13, r13, #700
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
@ENDFUNC @ENDFUNC
.END .END

View File

@@ -30,10 +30,10 @@
.section .text .section .text
.global Deemph_32_asm .global Deemph_32_asm
Deemph_32_asm: Deemph_32_asm:
STMFD r13!, {r4 - r12, r14} STMFD r13!, {r4 - r12, r14}
MOV r4, #2 @i=0 MOV r4, #2 @i=0
LDRSH r6, [r0], #2 @load x_hi[0] LDRSH r6, [r0], #2 @load x_hi[0]
LDRSH r7, [r1], #2 @load x_lo[0] LDRSH r7, [r1], #2 @load x_lo[0]
@@ -47,9 +47,9 @@ Deemph_32_asm:
ADD r12, r10, r7, LSL #4 @L_tmp += x_lo[0] << 4 ADD r12, r10, r7, LSL #4 @L_tmp += x_lo[0] << 4
MOV r10, r12, LSL #3 @L_tmp <<= 3 MOV r10, r12, LSL #3 @L_tmp <<= 3
MUL r9, r5, r8 MUL r9, r5, r8
LDRSH r6, [r0], #2 @load x_hi[1] LDRSH r6, [r0], #2 @load x_hi[1]
QDADD r10, r10, r9 QDADD r10, r10, r9
LDRSH r7, [r1], #2 @load x_lo[1] LDRSH r7, [r1], #2 @load x_lo[1]
MOV r12, r10, LSL #1 @L_tmp = L_mac(L_tmp, *mem, fac) MOV r12, r10, LSL #1 @L_tmp = L_mac(L_tmp, *mem, fac)
QADD r10, r12, r11 QADD r10, r12, r11
MOV r14, r10, ASR #16 @y[0] = round(L_tmp) MOV r14, r10, ASR #16 @y[0] = round(L_tmp)
@@ -94,9 +94,9 @@ LOOP:
BLT LOOP BLT LOOP
STR r14, [r3] STR r14, [r3]
STRH r14, [r2] STRH r14, [r2]
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
.END .END

View File

@@ -45,14 +45,14 @@ Dot_product12_asm:
VLD1.S16 {Q12, Q13}, [r1]! @load 16 Word16 y[] VLD1.S16 {Q12, Q13}, [r1]! @load 16 Word16 y[]
VMULL.S16 Q15, D16, D0 VMULL.S16 Q15, D16, D0
VMLAL.S16 Q15, D17, D1 VMLAL.S16 Q15, D17, D1
VMLAL.S16 Q15, D18, D2 VMLAL.S16 Q15, D18, D2
VMLAL.S16 Q15, D19, D3 VMLAL.S16 Q15, D19, D3
VLD1.S16 {Q0, Q1}, [r1]! @load 16 Word16 y[] VLD1.S16 {Q0, Q1}, [r1]! @load 16 Word16 y[]
VMLAL.S16 Q15, D20, D4 VMLAL.S16 Q15, D20, D4
VMLAL.S16 Q15, D21, D5 VMLAL.S16 Q15, D21, D5
VMLAL.S16 Q15, D22, D6 VMLAL.S16 Q15, D22, D6
VMLAL.S16 Q15, D23, D7 VMLAL.S16 Q15, D23, D7
VMLAL.S16 Q15, D24, D8 VMLAL.S16 Q15, D24, D8
VMLAL.S16 Q15, D25, D9 VMLAL.S16 Q15, D25, D9
VMLAL.S16 Q15, D26, D10 VMLAL.S16 Q15, D26, D10
@@ -64,9 +64,9 @@ Dot_product12_asm:
CMP r2, #64 CMP r2, #64
BEQ Lable1 BEQ Lable1
VLD1.S16 {Q0, Q1}, [r0]! @load 16 Word16 x[] VLD1.S16 {Q0, Q1}, [r0]! @load 16 Word16 x[]
VLD1.S16 {Q2, Q3}, [r1]! VLD1.S16 {Q2, Q3}, [r1]!
VMLAL.S16 Q15, D4, D0 VMLAL.S16 Q15, D4, D0
VMLAL.S16 Q15, D5, D1 VMLAL.S16 Q15, D5, D1
VMLAL.S16 Q15, D6, D2 VMLAL.S16 Q15, D6, D2
VMLAL.S16 Q15, D7, D3 VMLAL.S16 Q15, D7, D3
@@ -102,11 +102,11 @@ LOOP_EQ:
VMLAL.S16 Q15, D2, D2 VMLAL.S16 Q15, D2, D2
VMLAL.S16 Q15, D3, D3 VMLAL.S16 Q15, D3, D3
Lable1: Lable1:
VQADD.S32 D30, D30, D31 VQADD.S32 D30, D30, D31
VPADD.S32 D30, D30, D30 VPADD.S32 D30, D30, D30
VMOV.S32 r12, D30[0] VMOV.S32 r12, D30[0]
ADD r12, r12, r12 ADD r12, r12, r12
ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1 ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1
@@ -117,11 +117,11 @@ Lable1:
SUB r10, r10, #1 @ sft = norm_l(L_sum) SUB r10, r10, #1 @ sft = norm_l(L_sum)
MOV r0, r12, LSL r10 @ L_sum = L_sum << sft MOV r0, r12, LSL r10 @ L_sum = L_sum << sft
RSB r11, r10, #30 @ *exp = 30 - sft RSB r11, r10, #30 @ *exp = 30 - sft
STRH r11, [r3] STRH r11, [r3]
Dot_product12_end: Dot_product12_end:
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
.END .END

View File

@@ -13,7 +13,7 @@
@ ** See the License for the specific language governing permissions and @ ** See the License for the specific language governing permissions and
@ ** limitations under the License. @ ** limitations under the License.
@ */ @ */
@ @
@**********************************************************************/ @**********************************************************************/
@void Filt_6k_7k( @void Filt_6k_7k(
@ Word16 signal[], /* input: signal */ @ Word16 signal[], /* input: signal */
@@ -23,7 +23,7 @@
@*********************************************************************** @***********************************************************************
@ r0 --- signal[] @ r0 --- signal[]
@ r1 --- lg @ r1 --- lg
@ r2 --- mem[] @ r2 --- mem[]
.section .text .section .text
.global Filt_6k_7k_asm .global Filt_6k_7k_asm
@@ -31,7 +31,7 @@
Filt_6k_7k_asm: Filt_6k_7k_asm:
STMFD r13!, {r0 - r12, r14} STMFD r13!, {r0 - r12, r14}
SUB r13, r13, #240 @ x[L_SUBFR16k + (L_FIR - 1)] SUB r13, r13, #240 @ x[L_SUBFR16k + (L_FIR - 1)]
MOV r8, r0 @ copy signal[] address MOV r8, r0 @ copy signal[] address
MOV r5, r2 @ copy mem[] address MOV r5, r2 @ copy mem[] address
@@ -49,7 +49,7 @@ Filt_6k_7k_asm:
LDR r10, Lable1 @ get fir_7k address LDR r10, Lable1 @ get fir_7k address
MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content
ADD r6, r13, #60 @ get x[L_FIR - 1] address ADD r6, r13, #60 @ get x[L_FIR - 1] address
MOV r7, r3 @ get signal[i] MOV r7, r3 @ get signal[i]
@@ -81,9 +81,9 @@ Filt_6k_7k_asm:
MOV r12, r5 MOV r12, r5
@STR r5, [sp, #-4] @ PUSH r5 to stack @STR r5, [sp, #-4] @ PUSH r5 to stack
@ not use registers: r4, r10, r12, r14, r5 @ not use registers: r4, r10, r12, r14, r5
MOV r4, r13 MOV r4, r13
MOV r5, #0 @ i = 0 MOV r5, #0 @ i = 0
@ r4 --- x[i], r10 ---- fir_6k_7k @ r4 --- x[i], r10 ---- fir_6k_7k
VLD1.S16 {Q0, Q1}, [r10]! @fir_6k_7k[0] ~ fir_6k_7k[15] VLD1.S16 {Q0, Q1}, [r10]! @fir_6k_7k[0] ~ fir_6k_7k[15]
VLD1.S16 {Q2, Q3}, [r10]! @fir_6k_7k[16] ~ fir_6k_7k[31] VLD1.S16 {Q2, Q3}, [r10]! @fir_6k_7k[16] ~ fir_6k_7k[31]
@@ -91,20 +91,20 @@ Filt_6k_7k_asm:
VLD1.S16 {Q4, Q5}, [r4]! @x[0] ~ x[15] VLD1.S16 {Q4, Q5}, [r4]! @x[0] ~ x[15]
VLD1.S16 {Q6, Q7}, [r4]! @x[16] ~ X[31] VLD1.S16 {Q6, Q7}, [r4]! @x[16] ~ X[31]
VLD1.S16 {Q8}, [r4]! VLD1.S16 {Q8}, [r4]!
VMOV.S16 Q15, #0 VMOV.S16 Q15, #0
LOOP_6K7K: LOOP_6K7K:
VMULL.S16 Q9,D8,D0[0] VMULL.S16 Q9,D8,D0[0]
VMULL.S16 Q10,D9,D1[0] VMULL.S16 Q10,D9,D1[0]
VMULL.S16 Q11,D9,D0[0] VMULL.S16 Q11,D9,D0[0]
VMULL.S16 Q12,D10,D1[0] VMULL.S16 Q12,D10,D1[0]
VEXT.8 Q4,Q4,Q5,#2 VEXT.8 Q4,Q4,Q5,#2
VMLAL.S16 Q9,D10,D2[0] VMLAL.S16 Q9,D10,D2[0]
VMLAL.S16 Q10,D11,D3[0] VMLAL.S16 Q10,D11,D3[0]
VMLAL.S16 Q11,D11,D2[0] VMLAL.S16 Q11,D11,D2[0]
VMLAL.S16 Q12,D12,D3[0] VMLAL.S16 Q12,D12,D3[0]
VEXT.8 Q5,Q5,Q6,#2 VEXT.8 Q5,Q5,Q6,#2
VMLAL.S16 Q9,D12,D4[0] VMLAL.S16 Q9,D12,D4[0]
VMLAL.S16 Q10,D13,D5[0] VMLAL.S16 Q10,D13,D5[0]
@@ -115,18 +115,18 @@ LOOP_6K7K:
VMLAL.S16 Q10,D15,D7[0] VMLAL.S16 Q10,D15,D7[0]
VMLAL.S16 Q11,D15,D6[0] VMLAL.S16 Q11,D15,D6[0]
VMLAL.S16 Q12,D16,D7[0] VMLAL.S16 Q12,D16,D7[0]
VEXT.8 Q7,Q7,Q8,#2 VEXT.8 Q7,Q7,Q8,#2
VMLAL.S16 Q9,D8,D0[1] VMLAL.S16 Q9,D8,D0[1]
VMLAL.S16 Q10,D9,D1[1] VMLAL.S16 Q10,D9,D1[1]
VEXT.8 Q8,Q8,Q15,#2 VEXT.8 Q8,Q8,Q15,#2
VMLAL.S16 Q11,D9,D0[1] VMLAL.S16 Q11,D9,D0[1]
VMLAL.S16 Q12,D10,D1[1] VMLAL.S16 Q12,D10,D1[1]
VEXT.8 Q4,Q4,Q5,#2 VEXT.8 Q4,Q4,Q5,#2
VMLAL.S16 Q9,D10,D2[1] VMLAL.S16 Q9,D10,D2[1]
VMLAL.S16 Q10,D11,D3[1] VMLAL.S16 Q10,D11,D3[1]
VMLAL.S16 Q11,D11,D2[1] VMLAL.S16 Q11,D11,D2[1]
VMLAL.S16 Q12,D12,D3[1] VMLAL.S16 Q12,D12,D3[1]
VEXT.8 Q5,Q5,Q6,#2 VEXT.8 Q5,Q5,Q6,#2
VMLAL.S16 Q9,D12,D4[1] VMLAL.S16 Q9,D12,D4[1]
VMLAL.S16 Q10,D13,D5[1] VMLAL.S16 Q10,D13,D5[1]
@@ -137,18 +137,18 @@ LOOP_6K7K:
VMLAL.S16 Q10,D15,D7[1] VMLAL.S16 Q10,D15,D7[1]
VMLAL.S16 Q11,D15,D6[1] VMLAL.S16 Q11,D15,D6[1]
VMLAL.S16 Q12,D16,D7[1] VMLAL.S16 Q12,D16,D7[1]
VEXT.8 Q7,Q7,Q8,#2 VEXT.8 Q7,Q7,Q8,#2
VMLAL.S16 Q9,D8,D0[2] VMLAL.S16 Q9,D8,D0[2]
VMLAL.S16 Q10,D9,D1[2] VMLAL.S16 Q10,D9,D1[2]
VEXT.8 Q8,Q8,Q15,#2 VEXT.8 Q8,Q8,Q15,#2
VMLAL.S16 Q11,D9,D0[2] VMLAL.S16 Q11,D9,D0[2]
VMLAL.S16 Q12,D10,D1[2] VMLAL.S16 Q12,D10,D1[2]
VEXT.8 Q4,Q4,Q5,#2 VEXT.8 Q4,Q4,Q5,#2
VMLAL.S16 Q9,D10,D2[2] VMLAL.S16 Q9,D10,D2[2]
VMLAL.S16 Q10,D11,D3[2] VMLAL.S16 Q10,D11,D3[2]
VMLAL.S16 Q11,D11,D2[2] VMLAL.S16 Q11,D11,D2[2]
VMLAL.S16 Q12,D12,D3[2] VMLAL.S16 Q12,D12,D3[2]
VEXT.8 Q5,Q5,Q6,#2 VEXT.8 Q5,Q5,Q6,#2
VMLAL.S16 Q9,D12,D4[2] VMLAL.S16 Q9,D12,D4[2]
VMLAL.S16 Q10,D13,D5[2] VMLAL.S16 Q10,D13,D5[2]
@@ -159,18 +159,18 @@ LOOP_6K7K:
VMLAL.S16 Q10,D15,D7[2] VMLAL.S16 Q10,D15,D7[2]
VMLAL.S16 Q11,D15,D6[2] VMLAL.S16 Q11,D15,D6[2]
VMLAL.S16 Q12,D16,D7[2] VMLAL.S16 Q12,D16,D7[2]
VEXT.8 Q7,Q7,Q8,#2 VEXT.8 Q7,Q7,Q8,#2
VMLAL.S16 Q9,D8,D0[3] VMLAL.S16 Q9,D8,D0[3]
VMLAL.S16 Q10,D9,D1[3] VMLAL.S16 Q10,D9,D1[3]
VEXT.8 Q8,Q8,Q15,#2 VEXT.8 Q8,Q8,Q15,#2
VMLAL.S16 Q11,D9,D0[3] VMLAL.S16 Q11,D9,D0[3]
VMLAL.S16 Q12,D10,D1[3] VMLAL.S16 Q12,D10,D1[3]
VEXT.8 Q4,Q4,Q5,#2 VEXT.8 Q4,Q4,Q5,#2
VMLAL.S16 Q9,D10,D2[3] VMLAL.S16 Q9,D10,D2[3]
VMLAL.S16 Q10,D11,D3[3] VMLAL.S16 Q10,D11,D3[3]
VMLAL.S16 Q11,D11,D2[3] VMLAL.S16 Q11,D11,D2[3]
VMLAL.S16 Q12,D12,D3[3] VMLAL.S16 Q12,D12,D3[3]
VEXT.8 Q5,Q5,Q6,#2 VEXT.8 Q5,Q5,Q6,#2
VMLAL.S16 Q9,D12,D4[3] VMLAL.S16 Q9,D12,D4[3]
VMLAL.S16 Q10,D13,D5[3] VMLAL.S16 Q10,D13,D5[3]
@@ -181,10 +181,10 @@ LOOP_6K7K:
VMLAL.S16 Q10,D15,D7[3] VMLAL.S16 Q10,D15,D7[3]
VMLAL.S16 Q11,D15,D6[3] VMLAL.S16 Q11,D15,D6[3]
VMLAL.S16 Q12,D16,D7[3] VMLAL.S16 Q12,D16,D7[3]
VEXT.8 Q7,Q7,Q8,#2 VEXT.8 Q7,Q7,Q8,#2
VMOV.S16 D8,D9 VMOV.S16 D8,D9
VEXT.8 Q8,Q8,Q15,#2 VEXT.8 Q8,Q8,Q15,#2
VMOV.S16 D9,D10 VMOV.S16 D9,D10
VADD.S32 Q9,Q9,Q10 VADD.S32 Q9,Q9,Q10
VMOV.S16 D10,D11 VMOV.S16 D10,D11
@@ -214,12 +214,12 @@ LOOP_6K7K:
VST1.S16 {D4, D5, D6}, [r1]! VST1.S16 {D4, D5, D6}, [r1]!
VST1.S16 D7[0], [r1]! VST1.S16 D7[0], [r1]!
VST1.S16 D7[1], [r1]! VST1.S16 D7[1], [r1]!
Filt_6k_7k_end: Filt_6k_7k_end:
ADD r13, r13, #240 ADD r13, r13, #240
LDMFD r13!, {r0 - r12, r15} LDMFD r13!, {r0 - r12, r15}
Lable1: Lable1:
.word fir_6k_7k .word fir_6k_7k
@ENDFUNC @ENDFUNC

View File

@@ -33,7 +33,7 @@
.section .text .section .text
.global Norm_corr_asm .global Norm_corr_asm
.extern Convolve_asm .extern Convolve_asm
.extern Isqrt_n .extern Isqrt_n
@****************************** @******************************
@@ -47,17 +47,17 @@
.equ T_MIN , 212 .equ T_MIN , 212
.equ T_MAX , 216 .equ T_MAX , 216
.equ CORR_NORM , 220 .equ CORR_NORM , 220
Norm_corr_asm: Norm_corr_asm:
STMFD r13!, {r4 - r12, r14} STMFD r13!, {r4 - r12, r14}
SUB r13, r13, #voSTACK SUB r13, r13, #voSTACK
ADD r8, r13, #20 @get the excf[L_SUBFR] ADD r8, r13, #20 @get the excf[L_SUBFR]
LDR r4, [r13, #T_MIN] @get t_min LDR r4, [r13, #T_MIN] @get t_min
RSB r11, r4, #0 @k = -t_min RSB r11, r4, #0 @k = -t_min
ADD r5, r0, r11, LSL #1 @get the &exc[k] ADD r5, r0, r11, LSL #1 @get the &exc[k]
@transfer Convolve function @transfer Convolve function
STMFD sp!, {r0 - r3} STMFD sp!, {r0 - r3}
MOV r0, r5 MOV r0, r5
@@ -68,7 +68,7 @@ Norm_corr_asm:
@ r8 --- excf[] @ r8 --- excf[]
MOV r14, r1 @copy xn[] address MOV r14, r1 @copy xn[] address
MOV r7, #1 MOV r7, #1
VLD1.S16 {Q0, Q1}, [r14]! VLD1.S16 {Q0, Q1}, [r14]!
VLD1.S16 {Q2, Q3}, [r14]! VLD1.S16 {Q2, Q3}, [r14]!
@@ -95,34 +95,34 @@ Norm_corr_asm:
VQADD.S32 D20, D20, D21 VQADD.S32 D20, D20, D21
VMOV.S32 r9, D20[0] VMOV.S32 r9, D20[0]
VMOV.S32 r10, D20[1] VMOV.S32 r10, D20[1]
QADD r6, r9, r10 QADD r6, r9, r10
QADD r6, r6, r6 QADD r6, r6, r6
QADD r9, r6, r7 @L_tmp = (L_tmp << 1) + 1; QADD r9, r6, r7 @L_tmp = (L_tmp << 1) + 1;
CLZ r7, r9 CLZ r7, r9
SUB r6, r7, #1 @exp = norm_l(L_tmp) SUB r6, r7, #1 @exp = norm_l(L_tmp)
RSB r7, r6, #32 @exp = 32 - exp RSB r7, r6, #32 @exp = 32 - exp
MOV r6, r7, ASR #1 MOV r6, r7, ASR #1
RSB r7, r6, #0 @scale = -(exp >> 1) RSB r7, r6, #0 @scale = -(exp >> 1)
@loop for every possible period @loop for every possible period
@for(t = t_min@ t <= t_max@ t++) @for(t = t_min@ t <= t_max@ t++)
@r7 --- scale r4 --- t_min r8 --- excf[] @r7 --- scale r4 --- t_min r8 --- excf[]
LOOPFOR: LOOPFOR:
ADD r14, r13, #20 @copy of excf[] ADD r14, r13, #20 @copy of excf[]
MOV r12, r1 @copy of xn[] MOV r12, r1 @copy of xn[]
MOV r8, #0x8000 MOV r8, #0x8000
VLD1.S16 {Q0, Q1}, [r14]! @ load 16 excf[] VLD1.S16 {Q0, Q1}, [r14]! @ load 16 excf[]
VLD1.S16 {Q2, Q3}, [r14]! @ load 16 excf[] VLD1.S16 {Q2, Q3}, [r14]! @ load 16 excf[]
VLD1.S16 {Q4, Q5}, [r12]! @ load 16 x[] VLD1.S16 {Q4, Q5}, [r12]! @ load 16 x[]
VLD1.S16 {Q6, Q7}, [r12]! @ load 16 x[] VLD1.S16 {Q6, Q7}, [r12]! @ load 16 x[]
VMULL.S16 Q10, D0, D0 @L_tmp1 += excf[] * excf[] VMULL.S16 Q10, D0, D0 @L_tmp1 += excf[] * excf[]
VMULL.S16 Q11, D0, D8 @L_tmp += x[] * excf[] VMULL.S16 Q11, D0, D8 @L_tmp += x[] * excf[]
VMLAL.S16 Q10, D1, D1 VMLAL.S16 Q10, D1, D1
VMLAL.S16 Q11, D1, D9 VMLAL.S16 Q11, D1, D9
VMLAL.S16 Q10, D2, D2 VMLAL.S16 Q10, D2, D2
VMLAL.S16 Q11, D2, D10 VMLAL.S16 Q11, D2, D10
VMLAL.S16 Q10, D3, D3 VMLAL.S16 Q10, D3, D3
VMLAL.S16 Q11, D3, D11 VMLAL.S16 Q11, D3, D11
VMLAL.S16 Q10, D4, D4 VMLAL.S16 Q10, D4, D4
@@ -143,7 +143,7 @@ LOOPFOR:
VMLAL.S16 Q10, D1, D1 VMLAL.S16 Q10, D1, D1
VMLAL.S16 Q11, D1, D9 VMLAL.S16 Q11, D1, D9
VMLAL.S16 Q10, D2, D2 VMLAL.S16 Q10, D2, D2
VMLAL.S16 Q11, D2, D10 VMLAL.S16 Q11, D2, D10
VMLAL.S16 Q10, D3, D3 VMLAL.S16 Q10, D3, D3
VMLAL.S16 Q11, D3, D11 VMLAL.S16 Q11, D3, D11
VMLAL.S16 Q10, D4, D4 VMLAL.S16 Q10, D4, D4
@@ -162,19 +162,19 @@ LOOPFOR:
VPADD.S32 D22, D22, D22 @D22[0] --- L_tmp << 1 VPADD.S32 D22, D22, D22 @D22[0] --- L_tmp << 1
VMOV.S32 r6, D20[0] VMOV.S32 r6, D20[0]
VMOV.S32 r5, D22[0] VMOV.S32 r5, D22[0]
@r5 --- L_tmp, r6 --- L_tmp1 @r5 --- L_tmp, r6 --- L_tmp1
MOV r10, #1 MOV r10, #1
ADD r5, r10, r5, LSL #1 @L_tmp = (L_tmp << 1) + 1 ADD r5, r10, r5, LSL #1 @L_tmp = (L_tmp << 1) + 1
ADD r6, r10, r6, LSL #1 @L_tmp1 = (L_tmp1 << 1) + 1 ADD r6, r10, r6, LSL #1 @L_tmp1 = (L_tmp1 << 1) + 1
CLZ r10, r5 CLZ r10, r5
CMP r5, #0 CMP r5, #0
RSBLT r11, r5, #0 RSBLT r11, r5, #0
CLZLT r10, r11 CLZLT r10, r11
SUB r10, r10, #1 @exp = norm_l(L_tmp) SUB r10, r10, #1 @exp = norm_l(L_tmp)
MOV r5, r5, LSL r10 @L_tmp = (L_tmp << exp) MOV r5, r5, LSL r10 @L_tmp = (L_tmp << exp)
RSB r10, r10, #30 @exp_corr = 30 - exp RSB r10, r10, #30 @exp_corr = 30 - exp
MOV r11, r5, ASR #16 @corr = extract_h(L_tmp) MOV r11, r5, ASR #16 @corr = extract_h(L_tmp)
@@ -190,7 +190,7 @@ LOOPFOR:
@Isqrt_n(&L_tmp, &exp_norm) @Isqrt_n(&L_tmp, &exp_norm)
MOV r14, r0 MOV r14, r0
MOV r12, r1 MOV r12, r1
STMFD sp!, {r0 - r4, r7 - r12, r14} STMFD sp!, {r0 - r4, r7 - r12, r14}
ADD r1, sp, #4 ADD r1, sp, #4
@@ -208,7 +208,7 @@ LOOPFOR:
MOV r6, r6, ASR #16 @norm = extract_h(L_tmp) MOV r6, r6, ASR #16 @norm = extract_h(L_tmp)
MUL r12, r6, r11 MUL r12, r6, r11
ADD r12, r12, r12 @L_tmp = vo_L_mult(corr, norm) ADD r12, r12, r12 @L_tmp = vo_L_mult(corr, norm)
ADD r6, r10, r5 ADD r6, r10, r5
ADD r6, r6, r7 @exp_corr + exp_norm + scale ADD r6, r6, r7 @exp_corr + exp_norm + scale
@@ -227,8 +227,8 @@ LOOPFOR:
CMP r4, r6 CMP r4, r6
BEQ Norm_corr_asm_end BEQ Norm_corr_asm_end
ADD r4, r4, #1 @ t_min ++ ADD r4, r4, #1 @ t_min ++
RSB r5, r4, #0 @ k RSB r5, r4, #0 @ k
MOV r6, #63 @ i = 63 MOV r6, #63 @ i = 63
@@ -255,16 +255,16 @@ LOOPK:
MUL r14, r11, r8 MUL r14, r11, r8
LDR r6, [r13, #T_MAX] @ get t_max LDR r6, [r13, #T_MAX] @ get t_max
MOV r8, r14, ASR #15 MOV r8, r14, ASR #15
STRH r8, [r10] STRH r8, [r10]
CMP r4, r6 CMP r4, r6
BLE LOOPFOR BLE LOOPFOR
Norm_corr_asm_end: Norm_corr_asm_end:
ADD r13, r13, #voSTACK ADD r13, r13, #voSTACK
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
.END .END

View File

@@ -33,12 +33,12 @@
@ sig_lo[] --- r5 @ sig_lo[] --- r5
@ lg --- r6 @ lg --- r6
.section .text .section .text
.global Syn_filt_32_asm .global Syn_filt_32_asm
Syn_filt_32_asm: Syn_filt_32_asm:
STMFD r13!, {r4 - r12, r14} STMFD r13!, {r4 - r12, r14}
LDR r4, [r13, #40] @ get sig_hi[] address LDR r4, [r13, #40] @ get sig_hi[] address
LDR r5, [r13, #44] @ get sig_lo[] address LDR r5, [r13, #44] @ get sig_lo[] address
@@ -49,8 +49,8 @@ Syn_filt_32_asm:
SUB r10, r4, #32 @ sig_hi[-16] address SUB r10, r4, #32 @ sig_hi[-16] address
SUB r11, r5, #32 @ sig_lo[-16] address SUB r11, r5, #32 @ sig_lo[-16] address
VLD1.S16 {D0, D1, D2, D3}, [r0]! @a[1] ~ a[16] VLD1.S16 {D0, D1, D2, D3}, [r0]! @a[1] ~ a[16]
MOV r8, #0 @ i = 0 MOV r8, #0 @ i = 0
VLD1.S16 {D4, D5, D6, D7}, [r10]! @ sig_hi[-16] ~ sig_hi[-1] VLD1.S16 {D4, D5, D6, D7}, [r10]! @ sig_hi[-16] ~ sig_hi[-1]
@@ -58,9 +58,9 @@ Syn_filt_32_asm:
VREV64.16 D1, D1 VREV64.16 D1, D1
VLD1.S16 {D8, D9, D10, D11}, [r11]! @ sig_lo[-16] ~ sig_lo[-1] VLD1.S16 {D8, D9, D10, D11}, [r11]! @ sig_lo[-16] ~ sig_lo[-1]
VREV64.16 D2, D2 VREV64.16 D2, D2
VREV64.16 D3, D3 VREV64.16 D3, D3
VDUP.S32 Q15, r8 VDUP.S32 Q15, r8
SYN_LOOP: SYN_LOOP:
LDRSH r6, [r2], #2 @exc[i] LDRSH r6, [r2], #2 @exc[i]
@@ -73,12 +73,12 @@ SYN_LOOP:
VEXT.8 D9, D9, D10, #2 VEXT.8 D9, D9, D10, #2
VEXT.8 D10, D10, D11, #2 VEXT.8 D10, D10, D11, #2
VPADD.S32 D28, D20, D21 VPADD.S32 D28, D20, D21
MUL r12, r6, r3 @exc[i] * a0 MUL r12, r6, r3 @exc[i] * a0
VPADD.S32 D29, D28, D28 VPADD.S32 D29, D28, D28
VDUP.S32 Q10, D29[0] @result1 VDUP.S32 Q10, D29[0] @result1
VMULL.S16 Q11, D4, D3 VMULL.S16 Q11, D4, D3
VMLAL.S16 Q11, D5, D2 VMLAL.S16 Q11, D5, D2
VSUB.S32 Q10, Q15, Q10 VSUB.S32 Q10, Q15, Q10
@@ -101,7 +101,7 @@ SYN_LOOP:
VSHR.S32 Q10, Q10, #11 @result1 >>= 11 VSHR.S32 Q10, Q10, #11 @result1 >>= 11
VSHL.S32 Q11, Q11, #1 @result2 <<= 1 VSHL.S32 Q11, Q11, #1 @result2 <<= 1
VDUP.S32 Q12, r14 VDUP.S32 Q12, r14
VADD.S32 Q12, Q12, Q10 @L_tmp = L_tmp - (result1 >>= 11) - (result2 <<= 1) VADD.S32 Q12, Q12, Q10 @L_tmp = L_tmp - (result1 >>= 11) - (result2 <<= 1)
VSUB.S32 Q12, Q12, Q11 VSUB.S32 Q12, Q12, Q11
@@ -122,12 +122,12 @@ SYN_LOOP:
STRH r12, [r5], #2 @stroe sig_lo[i] STRH r12, [r5], #2 @stroe sig_lo[i]
CMP r8, #64 CMP r8, #64
BLT SYN_LOOP BLT SYN_LOOP
Syn_filt_32_end: Syn_filt_32_end:
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
@ENDFUNC @ENDFUNC
.END .END

View File

@@ -20,22 +20,22 @@
@* Word16 y[], /* (o) : output vector */ @* Word16 y[], /* (o) : output vector */
@* Word16 L /* (i) : vector size */ @* Word16 L /* (i) : vector size */
@*) @*)
@ @
@ r0 --- x[] @ r0 --- x[]
@ r1 --- h[] @ r1 --- h[]
@ r2 --- y[] @ r2 --- y[]
@ r3 --- L @ r3 --- L
.section .text .section .text
.global Convolve_asm .global Convolve_asm
Convolve_asm: Convolve_asm:
STMFD r13!, {r4 - r12, r14} STMFD r13!, {r4 - r12, r14}
MOV r3, #0 MOV r3, #0
MOV r11, #0x8000 MOV r11, #0x8000
LOOP: LOOP:
@MOV r8, #0 @ s = 0 @MOV r8, #0 @ s = 0
ADD r4, r1, r3, LSL #1 @ tmpH address ADD r4, r1, r3, LSL #1 @ tmpH address
ADD r5, r3, #1 @ i = n + 1 ADD r5, r3, #1 @ i = n + 1
@@ -43,21 +43,21 @@ LOOP:
LDRSH r9, [r6], #2 @ *tmpX++ LDRSH r9, [r6], #2 @ *tmpX++
LDRSH r10, [r4] @ *tmpH-- LDRSH r10, [r4] @ *tmpH--
SUB r5, r5, #1 SUB r5, r5, #1
VMOV.S32 Q10, #0 VMOV.S32 Q10, #0
MUL r8, r9, r10 MUL r8, r9, r10
LOOP1: LOOP1:
CMP r5, #0 CMP r5, #0
BLE L1 BLE L1
SUB r4, r4, #8 SUB r4, r4, #8
MOV r9, r4 MOV r9, r4
VLD1.S16 D0, [r6]! VLD1.S16 D0, [r6]!
VLD1.S16 D1, [r9]! VLD1.S16 D1, [r9]!
VREV64.16 D1, D1 VREV64.16 D1, D1
SUBS r5, r5, #4 SUBS r5, r5, #4
VMLAL.S16 Q10, D0, D1 VMLAL.S16 Q10, D0, D1
B LOOP1 B LOOP1
L1: L1:
VADD.S32 D20, D20, D21 VADD.S32 D20, D20, D21
VPADD.S32 D20, D20, D20 VPADD.S32 D20, D20, D20
VMOV.S32 r5, D20[0] VMOV.S32 r5, D20[0]
@@ -73,25 +73,25 @@ L1:
ADD r5, r3, #1 ADD r5, r3, #1
MOV r6, r0 MOV r6, r0
LDRSH r9, [r6], #2 @ *tmpX++ LDRSH r9, [r6], #2 @ *tmpX++
LDRSH r10, [r4], #-2 LDRSH r10, [r4], #-2
LDRSH r12, [r6], #2 LDRSH r12, [r6], #2
LDRSH r14, [r4] LDRSH r14, [r4]
MUL r8, r9, r10 MUL r8, r9, r10
SUB r5, r5, #2 SUB r5, r5, #2
MLA r8, r12, r14, r8 MLA r8, r12, r14, r8
VMOV.S32 Q10, #0 VMOV.S32 Q10, #0
LOOP2: LOOP2:
CMP r5, #0 CMP r5, #0
BLE L2 BLE L2
SUB r4, r4, #8 SUB r4, r4, #8
MOV r9, r4 MOV r9, r4
VLD1.S16 D0, [r6]! VLD1.S16 D0, [r6]!
VLD1.S16 D1, [r9]! VLD1.S16 D1, [r9]!
SUBS r5, r5, #4 SUBS r5, r5, #4
VREV64.16 D1, D1 VREV64.16 D1, D1
VMLAL.S16 Q10, D0, D1 VMLAL.S16 Q10, D0, D1
B LOOP2 B LOOP2
L2: L2:
VADD.S32 D20, D20, D21 VADD.S32 D20, D20, D21
@@ -100,7 +100,7 @@ L2:
ADD r8, r8, r5 ADD r8, r8, r5
ADD r8, r11, r8, LSL #1 ADD r8, r11, r8, LSL #1
MOV r8, r8, LSR #16 @extract_h(s) MOV r8, r8, LSR #16 @extract_h(s)
ADD r3, r3, #1 ADD r3, r3, #1
STRH r8, [r2], #2 @y[n] STRH r8, [r2], #2 @y[n]
@@ -115,7 +115,7 @@ L2:
MUL r8, r9, r10 MUL r8, r9, r10
LDRSH r9, [r6], #2 LDRSH r9, [r6], #2
LDRSH r10, [r4] LDRSH r10, [r4]
MLA r8, r12, r14, r8 MLA r8, r12, r14, r8
SUB r5, r5, #3 SUB r5, r5, #3
MLA r8, r9, r10, r8 MLA r8, r9, r10, r8
@@ -125,12 +125,12 @@ LOOP3:
BLE L3 BLE L3
SUB r4, r4, #8 SUB r4, r4, #8
MOV r9, r4 MOV r9, r4
VLD1.S16 D0, [r6]! VLD1.S16 D0, [r6]!
VLD1.S16 D1, [r9]! VLD1.S16 D1, [r9]!
VREV64.16 D1, D1 VREV64.16 D1, D1
SUBS r5, r5, #4 SUBS r5, r5, #4
VMLAL.S16 Q10, D0, D1 VMLAL.S16 Q10, D0, D1
B LOOP3 B LOOP3
L3: L3:
VADD.S32 D20, D20, D21 VADD.S32 D20, D20, D21
@@ -146,18 +146,18 @@ L3:
ADD r4, r1, r5, LSL #1 @ tmpH address ADD r4, r1, r5, LSL #1 @ tmpH address
MOV r6, r0 MOV r6, r0
VMOV.S32 Q10, #0 VMOV.S32 Q10, #0
LOOP4: LOOP4:
CMP r5, #0 CMP r5, #0
BLE L4 BLE L4
SUB r4, r4, #8 SUB r4, r4, #8
MOV r9, r4 MOV r9, r4
VLD1.S16 D0, [r6]! VLD1.S16 D0, [r6]!
VLD1.S16 D1, [r9]! VLD1.S16 D1, [r9]!
VREV64.16 D1, D1 VREV64.16 D1, D1
SUBS r5, r5, #4 SUBS r5, r5, #4
VMLAL.S16 Q10, D0, D1 VMLAL.S16 Q10, D0, D1
B LOOP4 B LOOP4
L4: L4:
VADD.S32 D20, D20, D21 VADD.S32 D20, D20, D21
VPADD.S32 D20, D20, D20 VPADD.S32 D20, D20, D20
VMOV.S32 r5, D20[0] VMOV.S32 r5, D20[0]
@@ -165,14 +165,14 @@ L4:
MOV r5, r5, LSR #16 @extract_h(s) MOV r5, r5, LSR #16 @extract_h(s)
ADD r3, r3, #1 ADD r3, r3, #1
STRH r5, [r2], #2 @y[n] STRH r5, [r2], #2 @y[n]
CMP r3, #64 CMP r3, #64
BLT LOOP BLT LOOP
Convolve_asm_end: Convolve_asm_end:
LDMFD r13!, {r4 - r12, r15} LDMFD r13!, {r4 - r12, r15}
@ENDFUNC @ENDFUNC
.END .END

Some files were not shown because too many files have changed in this diff Show More