Merge "stagefright aacenc/amrwbenc: Remove trailing whitespace"
This commit is contained in:
@@ -59,7 +59,7 @@ LOCAL_MODULE := libstagefright_aacenc
|
||||
|
||||
LOCAL_ARM_MODE := arm
|
||||
|
||||
LOCAL_STATIC_LIBRARIES :=
|
||||
LOCAL_STATIC_LIBRARIES :=
|
||||
|
||||
LOCAL_SHARED_LIBRARIES :=
|
||||
|
||||
|
||||
@@ -29,11 +29,11 @@
|
||||
#include "cmnMemory.h"
|
||||
|
||||
#define VO_AAC_E_OUTPUT 1
|
||||
#define READ_SIZE (1024*8)
|
||||
#define READ_SIZE (1024*8)
|
||||
unsigned char outBuf[1024*8];
|
||||
unsigned char inBuf[READ_SIZE];
|
||||
|
||||
const char* HelpString =
|
||||
const char* HelpString =
|
||||
"VisualOn AAC encoder Usage:\n"
|
||||
"voAACEncTest -if <inputfile.pcm> -of <outputfile.aac> -sr <samplerate> -ch <channel> -br <bitrate> -adts <adts> \n"
|
||||
"-if input file name \n"
|
||||
@@ -49,7 +49,7 @@ static int parsecmdline(int argc, char **argv,char **input_filename, char **ou
|
||||
{
|
||||
// notice that:
|
||||
// bitRate/nChannels > 8000
|
||||
// bitRate/nChannels < 160000
|
||||
// bitRate/nChannels < 160000
|
||||
// bitRate/nChannels < sampleRate*6
|
||||
param->adtsUsed = 1;
|
||||
param->bitRate = 0;
|
||||
@@ -69,7 +69,7 @@ static int parsecmdline(int argc, char **argv,char **input_filename, char **ou
|
||||
{
|
||||
argv++;
|
||||
argc--;
|
||||
*input_filename = *argv;
|
||||
*input_filename = *argv;
|
||||
}
|
||||
else if (!strcmp(*argv, "-of"))
|
||||
{
|
||||
@@ -173,7 +173,7 @@ int main(int argc, char **argv)
|
||||
/* open output file */
|
||||
if(isOutput)
|
||||
{
|
||||
outfile = fopen(outfileName, "wb");
|
||||
outfile = fopen(outfileName, "wb");
|
||||
if (!outfile) {
|
||||
printf("Open output file fail...");
|
||||
return -1;
|
||||
@@ -195,7 +195,7 @@ int main(int argc, char **argv)
|
||||
return -1;
|
||||
}
|
||||
// Get API;
|
||||
pfunc = dlsym(handle, "voGetAACEncAPI");
|
||||
pfunc = dlsym(handle, "voGetAACEncAPI");
|
||||
if(pfunc == 0)
|
||||
{
|
||||
printf("open function error......");
|
||||
@@ -215,13 +215,13 @@ int main(int argc, char **argv)
|
||||
return -1;
|
||||
}
|
||||
|
||||
returnCode = AudioAPI.SetParam(hCodec, VO_PID_AAC_ENCPARAM, &aacpara);
|
||||
|
||||
returnCode = AudioAPI.SetParam(hCodec, VO_PID_AAC_ENCPARAM, &aacpara);
|
||||
|
||||
inData.Buffer = inBuf;
|
||||
bytesLeft = ReadFile2Buf(infile,inData.Buffer,READ_SIZE);
|
||||
|
||||
//####################################### Encoding Section #########################################
|
||||
|
||||
|
||||
do {
|
||||
|
||||
inData.Length = bytesLeft;
|
||||
@@ -229,9 +229,9 @@ int main(int argc, char **argv)
|
||||
outData.Length = 1024*8;
|
||||
|
||||
t1 = clock();
|
||||
|
||||
|
||||
returnCode = AudioAPI.SetInputData(hCodec,&inData);
|
||||
|
||||
|
||||
do {
|
||||
outData.Buffer = outBuf;
|
||||
outData.Length = 1024*8;
|
||||
|
||||
@@ -2,15 +2,15 @@ LOCAL_PATH := $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_SRC_FILES := AAC_E_SAMPLES.c
|
||||
|
||||
|
||||
LOCAL_SRC_FILES += \
|
||||
../../../Common/cmnMemory.c
|
||||
../../../Common/cmnMemory.c
|
||||
|
||||
LOCAL_MODULE := TestvoAACEnc
|
||||
|
||||
LOCAL_ARM_MODE := arm
|
||||
|
||||
LOCAL_STATIC_LIBRARIES :=
|
||||
LOCAL_STATIC_LIBRARIES :=
|
||||
|
||||
LOCAL_SHARED_LIBRARIES := libvoAACEnc
|
||||
|
||||
@@ -20,5 +20,5 @@ LOCAL_C_INCLUDES := \
|
||||
$(LOCAL_PATH)/../../../Include \
|
||||
|
||||
LOCAL_CFLAGS := $(VO_CFLAGS)
|
||||
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
||||
|
||||
@@ -25,8 +25,8 @@ VOMT:= exe
|
||||
|
||||
|
||||
# module macros
|
||||
# please append the additional macro definitions here for your module if necessary.
|
||||
# e.g. -DVISUALON, macro VISUALON defined for your module
|
||||
# please append the additional macro definitions here for your module if necessary.
|
||||
# e.g. -DVISUALON, macro VISUALON defined for your module
|
||||
VOMM:= #ARMV5E
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ VOTARGET:= voAACEncTestv7
|
||||
|
||||
|
||||
# please modify here to be sure to see the g1.mk
|
||||
include ../../../../Tools/eclair.mk
|
||||
include ../../../../Tools/eclair.mk
|
||||
|
||||
# dependent libraries.
|
||||
VODEPLIBS:=-ldl
|
||||
@@ -51,5 +51,5 @@ VORELDIR:=../../../../../Release/
|
||||
|
||||
|
||||
# please modify here to be sure to see the doit.mk
|
||||
include ../../../../Tools/doit.mk
|
||||
include ../../../../Tools/doit.mk
|
||||
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
|
||||
# please list all objects needed by your target here
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -28,10 +28,10 @@ ifeq ($(VOMT), exe)
|
||||
TARGET=$(VOTARGET)
|
||||
endif
|
||||
|
||||
CFLAGS=$(VOCFLAGS) $(addprefix -I, $(VOSRCDIR))
|
||||
CPPFLAGS=$(VOCPPFLAGS) $(addprefix -I, $(VOSRCDIR))
|
||||
CFLAGS=$(VOCFLAGS) $(addprefix -I, $(VOSRCDIR))
|
||||
CPPFLAGS=$(VOCPPFLAGS) $(addprefix -I, $(VOSRCDIR))
|
||||
ifneq ($(VOTT), pc)
|
||||
ASFLAGS=$(VOASFLAGS) $(addprefix -I, $(VOSRCDIR))
|
||||
ASFLAGS=$(VOASFLAGS) $(addprefix -I, $(VOSRCDIR))
|
||||
endif
|
||||
|
||||
LDFLAGS:=$(VOLDFLAGS)
|
||||
@@ -90,7 +90,7 @@ ifneq ($(VODBG), yes)
|
||||
endif
|
||||
|
||||
$(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)
|
||||
$(STRIP) $@
|
||||
endif
|
||||
|
||||
@@ -14,10 +14,10 @@
|
||||
# ** limitations under the License.
|
||||
# */
|
||||
|
||||
# special macro definitions for building
|
||||
VOPREDEF=-DLINUX -D_LINUX
|
||||
# special macro definitions for building
|
||||
VOPREDEF=-DLINUX -D_LINUX
|
||||
|
||||
VOPRJ ?=
|
||||
VOPRJ ?=
|
||||
VONJ ?= eclair
|
||||
VOTT ?= v6
|
||||
# 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/libm/arm \
|
||||
-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
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
# 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
|
||||
|
||||
@@ -113,7 +113,7 @@ VOASFLAGS:=-march=armv5te -mfpu=vfp
|
||||
endif
|
||||
|
||||
ifeq ($(VOTT), v6)
|
||||
#VOCFLAGS:=-march=armv6 -mtune=arm1136jf-s
|
||||
#VOCFLAGS:=-march=armv6 -mtune=arm1136jf-s
|
||||
#VOASFLAGS:=-march=armv6
|
||||
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
|
||||
@@ -133,7 +133,7 @@ endif
|
||||
#global compiling options for ARM target
|
||||
ifneq ($(VOTT), pc)
|
||||
VOASFLAGS+=--strip-local-absolute -R
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(VODBG), yes)
|
||||
@@ -167,6 +167,6 @@ ifeq ($(VODBG), yes)
|
||||
#VOLDFLAGS:=
|
||||
endif
|
||||
|
||||
# where to place object files
|
||||
# where to place object files
|
||||
OBJDIR=obj
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ __inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
|
||||
#else
|
||||
Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
|
||||
#endif
|
||||
|
||||
|
||||
/* Long sub, 2 */
|
||||
#if (L_SUB_IS_INLINE)
|
||||
__inline Word32 L_sub(Word32 L_var1, Word32 L_var2);
|
||||
@@ -119,7 +119,7 @@ __inline Word16 add (Word16 var1, Word16 var2);
|
||||
#else
|
||||
Word16 add (Word16 var1, Word16 var2);
|
||||
#endif
|
||||
|
||||
|
||||
/* Short sub, 1 */
|
||||
#if (SUB_IS_INLINE)
|
||||
__inline Word16 sub(Word16 var1, Word16 var2);
|
||||
@@ -227,48 +227,48 @@ Word32 L_shr_r (Word32 L_var1, Word16 var2);
|
||||
#if ARMV4_INASM
|
||||
__inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2)
|
||||
{
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"MOV %[result], %[L_var1], ASR %[var2] \n"
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"MOV %[result], %[L_var1], ASR %[var2] \n"
|
||||
:[result]"=r"(result)
|
||||
:[L_var1]"r"(L_var1), [var2]"r"(var2)
|
||||
);
|
||||
return result;
|
||||
);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
__inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2)
|
||||
{
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"MOV r2, %[L_var1] \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"
|
||||
"EORNE %[result],r3,r2,ASR#31\n"
|
||||
:[result]"+r"(result)
|
||||
:[L_var1]"r"(L_var1), [var2]"r"(var2)
|
||||
:"r2", "r3"
|
||||
);
|
||||
return result;
|
||||
);
|
||||
return result;
|
||||
}
|
||||
|
||||
__inline Word32 ASM_shr(Word32 L_var1, Word16 var2)
|
||||
{
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"CMP %[var2], #15\n"
|
||||
"MOVGE %[var2], #15\n"
|
||||
"MOV %[result], %[L_var1], ASR %[var2]\n"
|
||||
:[result]"=r"(result)
|
||||
:[L_var1]"r"(L_var1), [var2]"r"(var2)
|
||||
);
|
||||
return result;
|
||||
}
|
||||
:[L_var1]"r"(L_var1), [var2]"r"(var2)
|
||||
);
|
||||
return result;
|
||||
}
|
||||
|
||||
__inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
|
||||
{
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"CMP %[var2], #16\n"
|
||||
"MOVGE %[var2], #16\n"
|
||||
"MOV %[result], %[L_var1], ASL %[var2]\n"
|
||||
@@ -280,9 +280,9 @@ __inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
|
||||
:[result]"+r"(result)
|
||||
:[L_var1]"r"(L_var1), [var2]"r"(var2)
|
||||
:"r2", "r3"
|
||||
);
|
||||
return result;
|
||||
}
|
||||
);
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*___________________________________________________________________________
|
||||
@@ -300,17 +300,17 @@ __inline Word16 saturate(Word32 L_var1)
|
||||
"MOV r3, #1\n"
|
||||
"MOV r2,%[L_var1],ASR#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"
|
||||
:[result]"+r"(result)
|
||||
:[L_var1]"r"(L_var1)
|
||||
:"r2", "r3"
|
||||
:"r2", "r3"
|
||||
);
|
||||
|
||||
return result;
|
||||
#else
|
||||
Word16 var_out;
|
||||
|
||||
|
||||
//var_out = (L_var1 > (Word32)0X00007fffL) ? (MAX_16) : ((L_var1 < (Word32)0xffff8000L) ? (MIN_16) : ((Word16)L_var1));
|
||||
|
||||
if (L_var1 > 0X00007fffL)
|
||||
@@ -419,13 +419,13 @@ __inline Word16 shr (Word16 var1, Word16 var2)
|
||||
__inline Word32 L_mult(Word16 var1, Word16 var2)
|
||||
{
|
||||
#if ARMV5TE_L_MULT
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"SMULBB %[result], %[var1], %[var2] \n"
|
||||
"QADD %[result], %[result], %[result] \n"
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"SMULBB %[result], %[var1], %[var2] \n"
|
||||
"QADD %[result], %[result], %[result] \n"
|
||||
:[result]"+r"(result)
|
||||
:[var1]"r"(var1), [var2]"r"(var2)
|
||||
);
|
||||
);
|
||||
return result;
|
||||
#else
|
||||
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)
|
||||
{
|
||||
#if ARMV5TE_L_MSU
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"SMULBB %[result], %[var1], %[var2] \n"
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"SMULBB %[result], %[var1], %[var2] \n"
|
||||
"QADD %[result], %[result], %[result] \n"
|
||||
"QSUB %[result], %[L_var3], %[result]\n"
|
||||
:[result]"+r"(result)
|
||||
:[L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
|
||||
);
|
||||
);
|
||||
return result;
|
||||
#else
|
||||
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)
|
||||
{
|
||||
#if ARMV5TE_L_SUB
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"QSUB %[result], %[L_var1], %[L_var2]\n"
|
||||
:[result]"+r"(result)
|
||||
:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
|
||||
);
|
||||
);
|
||||
return result;
|
||||
#else
|
||||
Word32 L_var_out;
|
||||
@@ -588,9 +588,9 @@ __inline Word32 L_shr (Word32 L_var1, Word16 var2)
|
||||
__inline Word16 add (Word16 var1, Word16 var2)
|
||||
{
|
||||
#if ARMV5TE_ADD
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"ADD %[result], %[var1], %[var2] \n"
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"ADD %[result], %[var1], %[var2] \n"
|
||||
"MOV r3, #0x1\n"
|
||||
"MOV r2, %[result], ASR #15\n"
|
||||
"RSB r3, r3, r3, LSL, #15\n"
|
||||
@@ -599,7 +599,7 @@ __inline Word16 add (Word16 var1, Word16 var2)
|
||||
:[result]"+r"(result)
|
||||
:[var1]"r"(var1), [var2]"r"(var2)
|
||||
:"r2", "r3"
|
||||
);
|
||||
);
|
||||
return result;
|
||||
#else
|
||||
Word16 var_out;
|
||||
@@ -618,18 +618,18 @@ __inline Word16 add (Word16 var1, Word16 var2)
|
||||
__inline Word16 sub(Word16 var1, Word16 var2)
|
||||
{
|
||||
#if ARMV5TE_SUB
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"MOV r3, #1\n"
|
||||
"SUB %[result], %[var1], %[var2] \n"
|
||||
"SUB %[result], %[var1], %[var2] \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"
|
||||
"EORNE %[result], r3, %[result], ASR #31 \n"
|
||||
:[result]"+r"(result)
|
||||
:[var1]"r"(var1), [var2]"r"(var2)
|
||||
:"r2", "r3"
|
||||
);
|
||||
);
|
||||
return result;
|
||||
#else
|
||||
Word16 var_out;
|
||||
@@ -637,7 +637,7 @@ __inline Word16 sub(Word16 var1, Word16 var2)
|
||||
|
||||
L_diff = (Word32) var1 - var2;
|
||||
var_out = saturate(L_diff);
|
||||
|
||||
|
||||
return (var_out);
|
||||
#endif
|
||||
}
|
||||
@@ -657,16 +657,16 @@ __inline Word16 div_s (Word16 var1, Word16 var2)
|
||||
{
|
||||
var_out = 0;
|
||||
L_num = (Word32) var1;
|
||||
|
||||
|
||||
L_denom = (Word32) var2;
|
||||
|
||||
|
||||
//return (L_num<<15)/var2;
|
||||
|
||||
for (iteration = 0; iteration < 15; iteration++)
|
||||
{
|
||||
var_out <<= 1;
|
||||
L_num <<= 1;
|
||||
|
||||
|
||||
if (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)
|
||||
{
|
||||
#if ARMV5TE_MULT
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"SMULBB r2, %[var1], %[var2] \n"
|
||||
"MOV r3, #1\n"
|
||||
"MOV %[result], r2, ASR #15\n"
|
||||
@@ -695,7 +695,7 @@ __inline Word16 mult (Word16 var1, Word16 var2)
|
||||
:[result]"+r"(result)
|
||||
:[var1]"r"(var1), [var2]"r"(var2)
|
||||
:"r2", "r3"
|
||||
);
|
||||
);
|
||||
return result;
|
||||
#else
|
||||
Word16 var_out;
|
||||
@@ -718,8 +718,8 @@ __inline Word16 mult (Word16 var1, Word16 var2)
|
||||
__inline Word16 norm_s (Word16 var1)
|
||||
{
|
||||
#if ARMV5TE_NORM_S
|
||||
Word16 result;
|
||||
asm volatile(
|
||||
Word16 result;
|
||||
asm volatile(
|
||||
"MOV r2,%[var1] \n"
|
||||
"CMP r2, #0\n"
|
||||
"RSBLT %[var1], %[var1], #0 \n"
|
||||
@@ -727,11 +727,11 @@ __inline Word16 norm_s (Word16 var1)
|
||||
"SUBNE %[result], %[result], #17\n"
|
||||
"MOVEQ %[result], #0\n"
|
||||
"CMP r2, #-1\n"
|
||||
"MOVEQ %[result], #15\n"
|
||||
"MOVEQ %[result], #15\n"
|
||||
:[result]"+r"(result)
|
||||
:[var1]"r"(var1)
|
||||
:"r2"
|
||||
);
|
||||
);
|
||||
return result;
|
||||
#else
|
||||
Word16 var_out;
|
||||
@@ -768,15 +768,15 @@ __inline Word16 norm_s (Word16 var1)
|
||||
__inline Word16 norm_l (Word32 L_var1)
|
||||
{
|
||||
#if ARMV5TE_NORM_L
|
||||
Word16 result;
|
||||
asm volatile(
|
||||
Word16 result;
|
||||
asm volatile(
|
||||
"CMP %[L_var1], #0\n"
|
||||
"CLZNE %[result], %[L_var1]\n"
|
||||
"SUBNE %[result], %[result], #1\n"
|
||||
"SUBNE %[result], %[result], #1\n"
|
||||
"MOVEQ %[result], #0\n"
|
||||
:[result]"+r"(result)
|
||||
:[L_var1]"r"(L_var1)
|
||||
);
|
||||
);
|
||||
return result;
|
||||
#else
|
||||
//Word16 var_out;
|
||||
@@ -805,84 +805,84 @@ __inline Word16 norm_l (Word32 L_var1)
|
||||
//}
|
||||
//return (var_out);
|
||||
Word16 a16;
|
||||
Word16 r = 0 ;
|
||||
Word16 r = 0 ;
|
||||
|
||||
|
||||
|
||||
if ( L_var1 < 0 ) {
|
||||
L_var1 = ~L_var1;
|
||||
L_var1 = ~L_var1;
|
||||
}
|
||||
|
||||
if (0 == (L_var1 & 0x7fff8000)) {
|
||||
a16 = extract_l(L_var1);
|
||||
r += 16;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x7f80)) {
|
||||
r += 8;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0078)) {
|
||||
r += 4;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0006)) {
|
||||
r += 2;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0001)) {
|
||||
r += 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0004)) {
|
||||
r += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0060)) {
|
||||
r += 2;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0010)) {
|
||||
r += 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0040)) {
|
||||
r += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
if (0 == (a16 & 0x7800)) {
|
||||
r += 4;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0600)) {
|
||||
r += 2;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0100)) {
|
||||
r += 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0400)) {
|
||||
r += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (0 == (a16 & 0x6000)) {
|
||||
r += 2;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x1000)) {
|
||||
r += 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (0 == (a16 & 0x4000)) {
|
||||
r += 1;
|
||||
}
|
||||
@@ -892,38 +892,38 @@ __inline Word16 norm_l (Word32 L_var1)
|
||||
}
|
||||
else {
|
||||
a16 = extract_h(L_var1);
|
||||
|
||||
|
||||
if (0 == (a16 & 0x7f80)) {
|
||||
r += 8;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0078)) {
|
||||
r += 4 ;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0006)) {
|
||||
r += 2;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0001)) {
|
||||
r += 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0004)) {
|
||||
r += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0060)) {
|
||||
r += 2;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0010)) {
|
||||
r += 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0040)) {
|
||||
r += 1;
|
||||
}
|
||||
@@ -931,35 +931,35 @@ __inline Word16 norm_l (Word32 L_var1)
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (0 == (a16 & 0x7800)) {
|
||||
r += 4;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0600)) {
|
||||
r += 2;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0100)) {
|
||||
r += 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (0 == (a16 & 0x0400)) {
|
||||
r += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (0 == (a16 & 0x6000)) {
|
||||
r += 2;
|
||||
|
||||
|
||||
if (0 == (a16 & 0x1000)) {
|
||||
r += 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (0 == (a16 & 0x4000)) {
|
||||
return 1;
|
||||
}
|
||||
@@ -967,7 +967,7 @@ __inline Word16 norm_l (Word32 L_var1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return r ;
|
||||
#endif
|
||||
}
|
||||
@@ -978,17 +978,17 @@ __inline Word16 norm_l (Word32 L_var1)
|
||||
__inline Word16 round16(Word32 L_var1)
|
||||
{
|
||||
#if ARMV5TE_ROUND
|
||||
Word16 result;
|
||||
asm volatile(
|
||||
Word16 result;
|
||||
asm volatile(
|
||||
"MOV r1,#0x00008000\n"
|
||||
"QADD %[result], %[L_var1], r1\n"
|
||||
"MOV %[result], %[result], ASR #16 \n"
|
||||
"MOV %[result], %[result], ASR #16 \n"
|
||||
:[result]"+r"(result)
|
||||
:[L_var1]"r"(L_var1)
|
||||
:"r1"
|
||||
);
|
||||
);
|
||||
return result;
|
||||
#else
|
||||
#else
|
||||
Word16 var_out;
|
||||
Word32 L_rounded;
|
||||
|
||||
@@ -1004,14 +1004,14 @@ __inline Word16 round16(Word32 L_var1)
|
||||
__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
|
||||
{
|
||||
#if ARMV5TE_L_MAC
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"SMULBB %[result], %[var1], %[var2]\n"
|
||||
"QADD %[result], %[result], %[result]\n"
|
||||
"QADD %[result], %[result], %[L_var3]\n"
|
||||
:[result]"+r"(result)
|
||||
: [L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
|
||||
);
|
||||
);
|
||||
return result;
|
||||
#else
|
||||
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)
|
||||
{
|
||||
#if ARMV5TE_L_ADD
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"QADD %[result], %[L_var1], %[L_var2]\n"
|
||||
:[result]"+r"(result)
|
||||
:[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
|
||||
);
|
||||
);
|
||||
return result;
|
||||
#else
|
||||
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);
|
||||
var_out = (Word16)((L_var3 + 0x8000L) >> 16);
|
||||
|
||||
|
||||
return (var_out);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
/*******************************************************************************
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
return (L_var_out);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
File: oper_32b.c
|
||||
|
||||
Content: This file contains operations in double precision.
|
||||
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
#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))
|
||||
|
||||
\return ilog4 value
|
||||
|
||||
|
||||
*/
|
||||
Word16 iLog4(Word32 value)
|
||||
{
|
||||
@@ -225,7 +225,7 @@ Word16 iLog4(Word32 value)
|
||||
iLog4 = (-(iLog4 << 2) - norm_s(tmp16)) - 1;
|
||||
}
|
||||
else {
|
||||
iLog4 = -128; /* -(INT_BITS*4); */
|
||||
iLog4 = -128; /* -(INT_BITS*4); */
|
||||
}
|
||||
|
||||
return iLog4;
|
||||
@@ -268,79 +268,79 @@ Word32 rsqrt(Word32 value, /*!< Operand to square root (0.0 ... 1) */
|
||||
}
|
||||
|
||||
static const Word32 pow2Table[POW2_TABLE_SIZE] = {
|
||||
0x7fffffff, 0x7fa765ad, 0x7f4f08ae, 0x7ef6e8da,
|
||||
0x7e9f0606, 0x7e476009, 0x7deff6b6, 0x7d98c9e6,
|
||||
0x7d41d96e, 0x7ceb2523, 0x7c94acde, 0x7c3e7073,
|
||||
0x7be86fb9, 0x7b92aa88, 0x7b3d20b6, 0x7ae7d21a,
|
||||
0x7a92be8b, 0x7a3de5df, 0x79e947ef, 0x7994e492,
|
||||
0x7940bb9e, 0x78ecccec, 0x78991854, 0x78459dac,
|
||||
0x77f25cce, 0x779f5591, 0x774c87cc, 0x76f9f359,
|
||||
0x76a7980f, 0x765575c8, 0x76038c5b, 0x75b1dba2,
|
||||
0x75606374, 0x750f23ab, 0x74be1c20, 0x746d4cac,
|
||||
0x741cb528, 0x73cc556d, 0x737c2d55, 0x732c3cba,
|
||||
0x72dc8374, 0x728d015d, 0x723db650, 0x71eea226,
|
||||
0x719fc4b9, 0x71511de4, 0x7102ad80, 0x70b47368,
|
||||
0x70666f76, 0x7018a185, 0x6fcb096f, 0x6f7da710,
|
||||
0x6f307a41, 0x6ee382de, 0x6e96c0c3, 0x6e4a33c9,
|
||||
0x6dfddbcc, 0x6db1b8a8, 0x6d65ca38, 0x6d1a1057,
|
||||
0x6cce8ae1, 0x6c8339b2, 0x6c381ca6, 0x6bed3398,
|
||||
0x6ba27e66, 0x6b57fce9, 0x6b0daeff, 0x6ac39485,
|
||||
0x6a79ad56, 0x6a2ff94f, 0x69e6784d, 0x699d2a2c,
|
||||
0x69540ec9, 0x690b2601, 0x68c26fb1, 0x6879ebb6,
|
||||
0x683199ed, 0x67e97a34, 0x67a18c68, 0x6759d065,
|
||||
0x6712460b, 0x66caed35, 0x6683c5c3, 0x663ccf92,
|
||||
0x65f60a80, 0x65af766a, 0x6569132f, 0x6522e0ad,
|
||||
0x64dcdec3, 0x64970d4f, 0x64516c2e, 0x640bfb41,
|
||||
0x63c6ba64, 0x6381a978, 0x633cc85b, 0x62f816eb,
|
||||
0x62b39509, 0x626f4292, 0x622b1f66, 0x61e72b65,
|
||||
0x61a3666d, 0x615fd05f, 0x611c6919, 0x60d9307b,
|
||||
0x60962665, 0x60534ab7, 0x60109d51, 0x5fce1e12,
|
||||
0x5f8bccdb, 0x5f49a98c, 0x5f07b405, 0x5ec5ec26,
|
||||
0x5e8451d0, 0x5e42e4e3, 0x5e01a540, 0x5dc092c7,
|
||||
0x5d7fad59, 0x5d3ef4d7, 0x5cfe6923, 0x5cbe0a1c,
|
||||
0x5c7dd7a4, 0x5c3dd19c, 0x5bfdf7e5, 0x5bbe4a61,
|
||||
0x5b7ec8f2, 0x5b3f7377, 0x5b0049d4, 0x5ac14bea,
|
||||
0x5a82799a, 0x5a43d2c6, 0x5a055751, 0x59c7071c,
|
||||
0x5988e209, 0x594ae7fb, 0x590d18d3, 0x58cf7474,
|
||||
0x5891fac1, 0x5854ab9b, 0x581786e6, 0x57da8c83,
|
||||
0x579dbc57, 0x57611642, 0x57249a29, 0x56e847ef,
|
||||
0x56ac1f75, 0x567020a0, 0x56344b52, 0x55f89f70,
|
||||
0x55bd1cdb, 0x5581c378, 0x55469329, 0x550b8bd4,
|
||||
0x54d0ad5b, 0x5495f7a1, 0x545b6a8b, 0x542105fd,
|
||||
0x53e6c9db, 0x53acb607, 0x5372ca68, 0x533906e0,
|
||||
0x52ff6b55, 0x52c5f7aa, 0x528cabc3, 0x52538786,
|
||||
0x521a8ad7, 0x51e1b59a, 0x51a907b4, 0x5170810b,
|
||||
0x51382182, 0x50ffe8fe, 0x50c7d765, 0x508fec9c,
|
||||
0x50582888, 0x50208b0e, 0x4fe91413, 0x4fb1c37c,
|
||||
0x4f7a9930, 0x4f439514, 0x4f0cb70c, 0x4ed5ff00,
|
||||
0x4e9f6cd4, 0x4e69006e, 0x4e32b9b4, 0x4dfc988c,
|
||||
0x4dc69cdd, 0x4d90c68b, 0x4d5b157e, 0x4d25899c,
|
||||
0x4cf022ca, 0x4cbae0ef, 0x4c85c3f1, 0x4c50cbb8,
|
||||
0x4c1bf829, 0x4be7492b, 0x4bb2bea5, 0x4b7e587d,
|
||||
0x4b4a169c, 0x4b15f8e6, 0x4ae1ff43, 0x4aae299b,
|
||||
0x4a7a77d5, 0x4a46e9d6, 0x4a137f88, 0x49e038d0,
|
||||
0x49ad1598, 0x497a15c4, 0x4947393f, 0x49147fee,
|
||||
0x48e1e9ba, 0x48af768a, 0x487d2646, 0x484af8d6,
|
||||
0x4818ee22, 0x47e70611, 0x47b5408c, 0x47839d7b,
|
||||
0x47521cc6, 0x4720be55, 0x46ef8210, 0x46be67e0,
|
||||
0x468d6fae, 0x465c9961, 0x462be4e2, 0x45fb521a,
|
||||
0x45cae0f2, 0x459a9152, 0x456a6323, 0x453a564d,
|
||||
0x450a6abb, 0x44daa054, 0x44aaf702, 0x447b6ead,
|
||||
0x444c0740, 0x441cc0a3, 0x43ed9ac0, 0x43be9580,
|
||||
0x438fb0cb, 0x4360ec8d, 0x433248ae, 0x4303c517,
|
||||
0x42d561b4, 0x42a71e6c, 0x4278fb2b, 0x424af7da,
|
||||
0x421d1462, 0x41ef50ae, 0x41c1aca8, 0x41942839,
|
||||
0x4166c34c, 0x41397dcc, 0x410c57a2, 0x40df50b8,
|
||||
0x40b268fa, 0x4085a051, 0x4058f6a8, 0x402c6be9
|
||||
0x7fffffff, 0x7fa765ad, 0x7f4f08ae, 0x7ef6e8da,
|
||||
0x7e9f0606, 0x7e476009, 0x7deff6b6, 0x7d98c9e6,
|
||||
0x7d41d96e, 0x7ceb2523, 0x7c94acde, 0x7c3e7073,
|
||||
0x7be86fb9, 0x7b92aa88, 0x7b3d20b6, 0x7ae7d21a,
|
||||
0x7a92be8b, 0x7a3de5df, 0x79e947ef, 0x7994e492,
|
||||
0x7940bb9e, 0x78ecccec, 0x78991854, 0x78459dac,
|
||||
0x77f25cce, 0x779f5591, 0x774c87cc, 0x76f9f359,
|
||||
0x76a7980f, 0x765575c8, 0x76038c5b, 0x75b1dba2,
|
||||
0x75606374, 0x750f23ab, 0x74be1c20, 0x746d4cac,
|
||||
0x741cb528, 0x73cc556d, 0x737c2d55, 0x732c3cba,
|
||||
0x72dc8374, 0x728d015d, 0x723db650, 0x71eea226,
|
||||
0x719fc4b9, 0x71511de4, 0x7102ad80, 0x70b47368,
|
||||
0x70666f76, 0x7018a185, 0x6fcb096f, 0x6f7da710,
|
||||
0x6f307a41, 0x6ee382de, 0x6e96c0c3, 0x6e4a33c9,
|
||||
0x6dfddbcc, 0x6db1b8a8, 0x6d65ca38, 0x6d1a1057,
|
||||
0x6cce8ae1, 0x6c8339b2, 0x6c381ca6, 0x6bed3398,
|
||||
0x6ba27e66, 0x6b57fce9, 0x6b0daeff, 0x6ac39485,
|
||||
0x6a79ad56, 0x6a2ff94f, 0x69e6784d, 0x699d2a2c,
|
||||
0x69540ec9, 0x690b2601, 0x68c26fb1, 0x6879ebb6,
|
||||
0x683199ed, 0x67e97a34, 0x67a18c68, 0x6759d065,
|
||||
0x6712460b, 0x66caed35, 0x6683c5c3, 0x663ccf92,
|
||||
0x65f60a80, 0x65af766a, 0x6569132f, 0x6522e0ad,
|
||||
0x64dcdec3, 0x64970d4f, 0x64516c2e, 0x640bfb41,
|
||||
0x63c6ba64, 0x6381a978, 0x633cc85b, 0x62f816eb,
|
||||
0x62b39509, 0x626f4292, 0x622b1f66, 0x61e72b65,
|
||||
0x61a3666d, 0x615fd05f, 0x611c6919, 0x60d9307b,
|
||||
0x60962665, 0x60534ab7, 0x60109d51, 0x5fce1e12,
|
||||
0x5f8bccdb, 0x5f49a98c, 0x5f07b405, 0x5ec5ec26,
|
||||
0x5e8451d0, 0x5e42e4e3, 0x5e01a540, 0x5dc092c7,
|
||||
0x5d7fad59, 0x5d3ef4d7, 0x5cfe6923, 0x5cbe0a1c,
|
||||
0x5c7dd7a4, 0x5c3dd19c, 0x5bfdf7e5, 0x5bbe4a61,
|
||||
0x5b7ec8f2, 0x5b3f7377, 0x5b0049d4, 0x5ac14bea,
|
||||
0x5a82799a, 0x5a43d2c6, 0x5a055751, 0x59c7071c,
|
||||
0x5988e209, 0x594ae7fb, 0x590d18d3, 0x58cf7474,
|
||||
0x5891fac1, 0x5854ab9b, 0x581786e6, 0x57da8c83,
|
||||
0x579dbc57, 0x57611642, 0x57249a29, 0x56e847ef,
|
||||
0x56ac1f75, 0x567020a0, 0x56344b52, 0x55f89f70,
|
||||
0x55bd1cdb, 0x5581c378, 0x55469329, 0x550b8bd4,
|
||||
0x54d0ad5b, 0x5495f7a1, 0x545b6a8b, 0x542105fd,
|
||||
0x53e6c9db, 0x53acb607, 0x5372ca68, 0x533906e0,
|
||||
0x52ff6b55, 0x52c5f7aa, 0x528cabc3, 0x52538786,
|
||||
0x521a8ad7, 0x51e1b59a, 0x51a907b4, 0x5170810b,
|
||||
0x51382182, 0x50ffe8fe, 0x50c7d765, 0x508fec9c,
|
||||
0x50582888, 0x50208b0e, 0x4fe91413, 0x4fb1c37c,
|
||||
0x4f7a9930, 0x4f439514, 0x4f0cb70c, 0x4ed5ff00,
|
||||
0x4e9f6cd4, 0x4e69006e, 0x4e32b9b4, 0x4dfc988c,
|
||||
0x4dc69cdd, 0x4d90c68b, 0x4d5b157e, 0x4d25899c,
|
||||
0x4cf022ca, 0x4cbae0ef, 0x4c85c3f1, 0x4c50cbb8,
|
||||
0x4c1bf829, 0x4be7492b, 0x4bb2bea5, 0x4b7e587d,
|
||||
0x4b4a169c, 0x4b15f8e6, 0x4ae1ff43, 0x4aae299b,
|
||||
0x4a7a77d5, 0x4a46e9d6, 0x4a137f88, 0x49e038d0,
|
||||
0x49ad1598, 0x497a15c4, 0x4947393f, 0x49147fee,
|
||||
0x48e1e9ba, 0x48af768a, 0x487d2646, 0x484af8d6,
|
||||
0x4818ee22, 0x47e70611, 0x47b5408c, 0x47839d7b,
|
||||
0x47521cc6, 0x4720be55, 0x46ef8210, 0x46be67e0,
|
||||
0x468d6fae, 0x465c9961, 0x462be4e2, 0x45fb521a,
|
||||
0x45cae0f2, 0x459a9152, 0x456a6323, 0x453a564d,
|
||||
0x450a6abb, 0x44daa054, 0x44aaf702, 0x447b6ead,
|
||||
0x444c0740, 0x441cc0a3, 0x43ed9ac0, 0x43be9580,
|
||||
0x438fb0cb, 0x4360ec8d, 0x433248ae, 0x4303c517,
|
||||
0x42d561b4, 0x42a71e6c, 0x4278fb2b, 0x424af7da,
|
||||
0x421d1462, 0x41ef50ae, 0x41c1aca8, 0x41942839,
|
||||
0x4166c34c, 0x41397dcc, 0x410c57a2, 0x40df50b8,
|
||||
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
|
||||
|
||||
\return
|
||||
|
||||
\return
|
||||
*/
|
||||
Word32 pow2_xy(Word32 x, Word32 y)
|
||||
{
|
||||
@@ -355,7 +355,7 @@ Word32 pow2_xy(Word32 x, Word32 y)
|
||||
fPart = tmp2 - iPart*y;
|
||||
iPart = min(iPart,INT_BITS-1);
|
||||
|
||||
res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart;
|
||||
|
||||
res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart;
|
||||
|
||||
return(res);
|
||||
}
|
||||
@@ -51,21 +51,21 @@ __inline Word32 L_mpy_ls(Word32 L_var2, Word16 var1)
|
||||
swHigh1 = (Word16)(L_var2 >> 16);
|
||||
|
||||
l_var_out = (long)swLow1 * (long)var1 >> 15;
|
||||
|
||||
|
||||
l_var_out += swHigh1 * var1 << 1;
|
||||
|
||||
|
||||
return(l_var_out);
|
||||
}
|
||||
|
||||
__inline Word32 L_mpy_wx(Word32 L_var2, Word16 var1)
|
||||
{
|
||||
#if ARMV5TE_L_MPY_LS
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"SMULWB %[result], %[L_var2], %[var1] \n"
|
||||
Word32 result;
|
||||
asm volatile(
|
||||
"SMULWB %[result], %[L_var2], %[var1] \n"
|
||||
:[result]"+r"(result)
|
||||
:[L_var2]"r"(L_var2), [var1]"r"(var1)
|
||||
);
|
||||
);
|
||||
return result;
|
||||
#else
|
||||
unsigned short swLow1;
|
||||
@@ -75,9 +75,9 @@ __inline Word32 L_mpy_wx(Word32 L_var2, Word16 var1)
|
||||
swLow1 = (unsigned short)(L_var2);
|
||||
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;
|
||||
|
||||
|
||||
return(l_var_out);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
/*
|
||||
* this is the original code from the ETSI file typedef.h
|
||||
*/
|
||||
|
||||
|
||||
#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__)
|
||||
typedef signed char Word8;
|
||||
typedef short Word16;
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
#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_MAC 1
|
||||
#define ARMV5TE_L_MSU 1
|
||||
|
||||
|
||||
|
||||
|
||||
#define ARMV5TE_DIV_S 1
|
||||
#define ARMV5TE_ROUND 1
|
||||
#define ARMV5TE_MULT 1
|
||||
|
||||
|
||||
#define ARMV5TE_NORM_S 1
|
||||
#define ARMV5TE_NORM_L 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 L_MAC_IS_INLINE 1 //define L_mac 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 MULT_R_IS_INLINE 1 //define mult_r as inline function
|
||||
#define SHR_R_IS_INLINE 1 //define shr_r as inline function
|
||||
|
||||
@@ -25,9 +25,9 @@ VOMT:= lib
|
||||
|
||||
|
||||
# module macros
|
||||
# please append the additional macro definitions here for your module if necessary.
|
||||
# e.g. -DVISUALON, macro VISUALON defined for your module
|
||||
VOMM:= -DARMV5E -DARM_INASM -DARMV5_INASM
|
||||
# please append the additional macro definitions here for your module if necessary.
|
||||
# e.g. -DVISUALON, macro VISUALON defined for your module
|
||||
VOMM:= -DARMV5E -DARM_INASM -DARMV5_INASM
|
||||
|
||||
|
||||
|
||||
@@ -36,10 +36,10 @@ VOTARGET:=libvoAACEncv5
|
||||
|
||||
|
||||
# please modify here to be sure to see the g1.mk
|
||||
include ../../../../../Tools/eclair.mk
|
||||
include ../../../../../Tools/eclair.mk
|
||||
|
||||
# dependent libraries.
|
||||
VODEPLIBS:=#-ldl -lstdc++
|
||||
VODEPLIBS:=#-ldl -lstdc++
|
||||
|
||||
# module source
|
||||
# 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
|
||||
include ../../../../../Tools/doit.mk
|
||||
include ../../../../../Tools/doit.mk
|
||||
|
||||
|
||||
@@ -25,9 +25,9 @@ VOMT:= lib
|
||||
|
||||
|
||||
# module macros
|
||||
# please append the additional macro definitions here for your module if necessary.
|
||||
# e.g. -DVISUALON, macro VISUALON defined for your module
|
||||
VOMM:= -DARMV5E -DARMV7Neon -DARM_INASM -DARMV5_INASM
|
||||
# please append the additional macro definitions here for your module if necessary.
|
||||
# e.g. -DVISUALON, macro VISUALON defined for your module
|
||||
VOMM:= -DARMV5E -DARMV7Neon -DARM_INASM -DARMV5_INASM
|
||||
|
||||
|
||||
|
||||
@@ -36,10 +36,10 @@ VOTARGET:=libvoAACEncv7
|
||||
|
||||
|
||||
# please modify here to be sure to see the g1.mk
|
||||
include ../../../../../Tools/eclair.mk
|
||||
include ../../../../../Tools/eclair.mk
|
||||
|
||||
# dependent libraries.
|
||||
VODEPLIBS:=#-ldl -lstdc++
|
||||
VODEPLIBS:=#-ldl -lstdc++
|
||||
|
||||
# module source
|
||||
# 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
|
||||
include ../../../../../Tools/doit.mk
|
||||
include ../../../../../Tools/doit.mk
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
# Just acting as Father Makefile of Modules
|
||||
# please keep the name 'makefile' unchanged
|
||||
|
||||
|
||||
# Module Subdirs
|
||||
VOMSD:=$(dir $(shell find . -name 'Makefile'))
|
||||
|
||||
|
||||
@@ -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 \
|
||||
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
|
||||
|
||||
# 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 \
|
||||
../../../inc \
|
||||
../../../basic_op\
|
||||
../../../../../Include
|
||||
|
||||
../../../../../Include
|
||||
|
||||
ifeq ($(VOTT), v5)
|
||||
OBJS+= AutoCorrelation_v5.o band_nrg_v5.o CalcWindowEnergy_v5.o \
|
||||
PrePostMDCT_v5.o R4R8First_v5.o Radix4FFT_v5.o
|
||||
VOSRCDIR+= ../../../src/asm/ARMV5E/
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(VOTT), v7)
|
||||
OBJS+= AutoCorrelation_v5.o band_nrg_v5.o CalcWindowEnergy_v5.o \
|
||||
PrePostMDCT_v7.o R4R8First_v7.o Radix4FFT_v7.o
|
||||
VOSRCDIR+= ../../../src/asm/ARMV5E/
|
||||
VOSRCDIR+= ../../../src/asm/ARMV7/
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
/*******************************************************************************
|
||||
File: aac_rom.h
|
||||
|
||||
Content: constant tables
|
||||
Content: constant tables
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ typedef struct {
|
||||
|
||||
|
||||
typedef struct {
|
||||
|
||||
|
||||
AACENC_CONFIG config; /* Word16 size: 8 */
|
||||
|
||||
ELEMENT_INFO elInfo; /* Word16 size: 4 */
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
/*******************************************************************************
|
||||
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,
|
||||
Word16 *chBitDistribution,
|
||||
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,
|
||||
ELEMENT_BITS* elBits,
|
||||
const Word16 nChannels,
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
/*******************************************************************************
|
||||
File: adj_thr_data.h
|
||||
|
||||
Content: Threshold compensation parameter
|
||||
Content: Threshold compensation parameter
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#include "qc_data.h"
|
||||
#include "tns.h"
|
||||
#include "channel_map.h"
|
||||
#include "interface.h"
|
||||
#include "interface.h"
|
||||
|
||||
struct BITSTREAMENCODER_INIT
|
||||
{
|
||||
|
||||
@@ -55,11 +55,11 @@ typedef struct {
|
||||
Word16 windowShape;
|
||||
Word16 groupingMask;
|
||||
Word16 sfbOffsets[MAX_GROUPED_SFB+1];
|
||||
Word16 mdctScale;
|
||||
Word32 *sfbEnergy;
|
||||
Word16 mdctScale;
|
||||
Word32 *sfbEnergy;
|
||||
Word32 *sfbSpreadedEnergy;
|
||||
Word32 *sfbThreshold;
|
||||
Word32 *mdctSpectrum;
|
||||
Word32 *sfbThreshold;
|
||||
Word32 *mdctSpectrum;
|
||||
Word32 sfbEnSumLR;
|
||||
Word32 sfbEnSumMS;
|
||||
Word32 sfbDist[MAX_GROUPED_SFB];
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
#define __LINE_PE_H
|
||||
|
||||
|
||||
#include "psy_const.h"
|
||||
#include "interface.h"
|
||||
#include "psy_const.h"
|
||||
#include "interface.h"
|
||||
|
||||
|
||||
typedef struct {
|
||||
@@ -72,4 +72,4 @@ void calcSfbPe(PE_DATA *peData,
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -69,7 +69,7 @@ enum
|
||||
|
||||
#define BLOCK_SWITCHING_OFFSET (1*1024+3*128+64+128)
|
||||
#define BLOCK_SWITCHING_DATA_SIZE FRAME_LEN_LONG
|
||||
|
||||
|
||||
#define TRANSFORM_OFFSET_LONG 0
|
||||
#define TRANSFORM_OFFSET_SHORT 448
|
||||
|
||||
|
||||
@@ -54,9 +54,9 @@ Word16 psyMainInit( PSY_KERNEL *hPsy,
|
||||
Word16 bandwidth);
|
||||
|
||||
|
||||
Word16 psyMain(Word16 nChannels, /*!< total number of channels */
|
||||
Word16 psyMain(Word16 nChannels, /*!< total number of channels */
|
||||
ELEMENT_INFO *elemInfo,
|
||||
Word16 *timeSignal, /*!< interleaved time signal */
|
||||
Word16 *timeSignal, /*!< interleaved time signal */
|
||||
PSY_DATA psyData[MAX_CHANNELS],
|
||||
TNS_DATA tnsData[MAX_CHANNELS],
|
||||
PSY_CONFIGURATION_LONG* psyConfLong,
|
||||
|
||||
@@ -35,7 +35,7 @@ void QCOutDelete(QC_OUT *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);
|
||||
|
||||
void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP);
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
#define MAX_QUANT 8191
|
||||
|
||||
void QuantizeSpectrum(Word16 sfbCnt,
|
||||
void QuantizeSpectrum(Word16 sfbCnt,
|
||||
Word16 maxSfbPerGroup,
|
||||
Word16 sfbPerGroup,
|
||||
Word16 *sfbOffset, Word32 *mdctSpectrum,
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#ifndef __SF_ESTIM_H__
|
||||
#define __SF_ESTIM_H__
|
||||
/*
|
||||
Scale factor estimation
|
||||
Scale factor estimation
|
||||
*/
|
||||
#include "psy_const.h"
|
||||
#include "interface.h"
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
PSY_OUT_ELEMENT *psyOutElement,
|
||||
Word16 nChannels,
|
||||
Word16 nChannels,
|
||||
Word16 adtsUsed);
|
||||
|
||||
#endif /* __STAT_BITS_H */
|
||||
|
||||
@@ -44,7 +44,7 @@ typedef struct{
|
||||
}TNS_INFO_TAB;
|
||||
|
||||
|
||||
void GetTnsParam(TNS_CONFIG_TABULATED *tnsConfigTab,
|
||||
void GetTnsParam(TNS_CONFIG_TABULATED *tnsConfigTab,
|
||||
Word32 bitRate, Word16 channels, Word16 blockType);
|
||||
|
||||
void GetTnsMaxBands(Word32 samplingRate, Word16 blockType, Word16* tnsMaxSfb);
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#define __TRANSFORM_H__
|
||||
|
||||
#include "typedef.h"
|
||||
|
||||
|
||||
void Transform_Real(Word16 *mdctDelayBuffer,
|
||||
Word16 *timeSignal,
|
||||
Word16 chIncrement, /*! channel increment */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -48,7 +48,7 @@ VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_COD
|
||||
|
||||
interMem = 0;
|
||||
error = 0;
|
||||
|
||||
|
||||
/* init the memory operator */
|
||||
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);
|
||||
hAacEnc = NULL;
|
||||
}
|
||||
}
|
||||
*phCodec = NULL;
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
hAacEnc = (AAC_ENCODER *)hCodec;
|
||||
|
||||
|
||||
/* init input pcm buffer and length*/
|
||||
hAacEnc->inbuf = (short *)pInput->Buffer;
|
||||
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->enclen = hAacEnc->inlen;
|
||||
|
||||
|
||||
/* rebuild intra pcm buffer and length*/
|
||||
if(hAacEnc->intlen)
|
||||
{
|
||||
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->encbuf = hAacEnc->intbuf;
|
||||
@@ -192,7 +192,7 @@ VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput)
|
||||
hAacEnc->inbuf += length;
|
||||
hAacEnc->inlen -= length;
|
||||
}
|
||||
|
||||
|
||||
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*/
|
||||
if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen)
|
||||
{
|
||||
length = hAacEnc->enclen;
|
||||
length = hAacEnc->enclen;
|
||||
if(hAacEnc->intlen == 0)
|
||||
{
|
||||
hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf,
|
||||
hAacEnc->encbuf, length*sizeof(short));
|
||||
{
|
||||
hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf,
|
||||
hAacEnc->encbuf, length*sizeof(short));
|
||||
hAacEnc->uselength += length*sizeof(short);
|
||||
}
|
||||
else
|
||||
@@ -236,7 +236,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput,
|
||||
pOutput->Length = 0;
|
||||
if(pOutInfo)
|
||||
pOutInfo->InputUsed = hAacEnc->uselength;
|
||||
return VO_ERR_INPUT_BUFFER_SMALL;
|
||||
return VO_ERR_INPUT_BUFFER_SMALL;
|
||||
}
|
||||
|
||||
/* 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*/
|
||||
if(hAacEnc->intlen)
|
||||
{
|
||||
length = inbuflen - hAacEnc->intlen;
|
||||
length = inbuflen - hAacEnc->intlen;
|
||||
hAacEnc->encbuf = hAacEnc->inbuf;
|
||||
hAacEnc->enclen = hAacEnc->inlen;
|
||||
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->enclen = hAacEnc->enclen - inbuflen;
|
||||
hAacEnc->uselength += inbuflen*sizeof(short);
|
||||
}
|
||||
}
|
||||
|
||||
/* update the output aac information */
|
||||
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)
|
||||
{
|
||||
AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
|
||||
|
||||
|
||||
if(NULL != hAacEnc)
|
||||
{
|
||||
/* close the aac encoder */
|
||||
@@ -296,7 +296,7 @@ VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec)
|
||||
/* free the aac encoder handle*/
|
||||
mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC);
|
||||
hAacEnc = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
return VO_ERR_INVALID_ARG;
|
||||
|
||||
|
||||
switch(uParamID)
|
||||
{
|
||||
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;
|
||||
|
||||
tmp = 441;
|
||||
if(config.sampleRate%8000 == 0)
|
||||
if(config.sampleRate%8000 == 0)
|
||||
tmp =480;
|
||||
/* check the bitrate */
|
||||
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 = 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 */
|
||||
ret = AacEncOpen(hAacEnc, config);
|
||||
if(ret)
|
||||
if(ret)
|
||||
return VO_ERR_AUDIO_UNSFEATURE;
|
||||
break;
|
||||
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 */
|
||||
tmp = 441;
|
||||
if(config.sampleRate%8000 == 0)
|
||||
if(config.sampleRate%8000 == 0)
|
||||
tmp =480;
|
||||
|
||||
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];
|
||||
|
||||
|
||||
/* init aac encoder core */
|
||||
ret = AacEncOpen(hAacEnc, config);
|
||||
if(ret)
|
||||
if(ret)
|
||||
return VO_ERR_AUDIO_UNSFEATURE;
|
||||
break;
|
||||
default:
|
||||
@@ -483,7 +483,7 @@ VO_S32 VO_API voGetAACEncAPI(VO_AUDIO_CODECAPI * pDecHandle)
|
||||
{
|
||||
if(pDecHandle == NULL)
|
||||
return VO_ERR_INVALID_ARG;
|
||||
|
||||
|
||||
pDecHandle->Init = voAACEncInit;
|
||||
pDecHandle->SetInputData = voAACEncSetInputData;
|
||||
pDecHandle->GetOutputData = voAACEncGetOutputData;
|
||||
|
||||
@@ -43,8 +43,8 @@ void AacInitDefaultConfig(AACENC_CONFIG *config)
|
||||
config->adtsUsed = 1;
|
||||
config->nChannelsIn = 2;
|
||||
config->nChannelsOut = 2;
|
||||
config->bitRate = 128000;
|
||||
config->bandWidth = 0;
|
||||
config->bitRate = 128000;
|
||||
config->bandWidth = 0;
|
||||
}
|
||||
|
||||
/********************************************************************************
|
||||
@@ -63,11 +63,11 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder
|
||||
Word16 profile = 1;
|
||||
|
||||
ELEMENT_INFO *elInfo = NULL;
|
||||
|
||||
|
||||
if (hAacEnc==0) {
|
||||
error=1;
|
||||
error=1;
|
||||
}
|
||||
|
||||
|
||||
if (!error) {
|
||||
hAacEnc->config = config;
|
||||
}
|
||||
@@ -83,7 +83,7 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder
|
||||
|
||||
if (!error) {
|
||||
/* use or not tns tool for long and short block */
|
||||
Word16 tnsMask=3;
|
||||
Word16 tnsMask=3;
|
||||
|
||||
/* init encoder psychoacoustic */
|
||||
error = psyMainInit(&hAacEnc->psyKernel,
|
||||
@@ -107,10 +107,10 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder
|
||||
qcInit.elInfo = &hAacEnc->elInfo;
|
||||
|
||||
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.padding.paddingRest = config.sampleRate;
|
||||
qcInit.padding.paddingRest = config.sampleRate;
|
||||
|
||||
qcInit.meanPe = (Word16) ((10 * FRAME_LEN_LONG * hAacEnc->config.bandWidth) /
|
||||
(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.averageBits?qcInit.averageBits:1));
|
||||
|
||||
qcInit.bitrate = config.bitRate;
|
||||
qcInit.bitrate = config.bitRate;
|
||||
|
||||
error = QCInit(&hAacEnc->qcKernel, &qcInit);
|
||||
}
|
||||
|
||||
/* init bitstream encoder */
|
||||
if (!error) {
|
||||
hAacEnc->bseInit.nChannels = elInfo->nChannelsInEl;
|
||||
hAacEnc->bseInit.bitrate = config.bitRate;
|
||||
hAacEnc->bseInit.sampleRate = config.sampleRate;
|
||||
hAacEnc->bseInit.profile = profile;
|
||||
hAacEnc->bseInit.nChannels = elInfo->nChannelsInEl;
|
||||
hAacEnc->bseInit.bitrate = config.bitRate;
|
||||
hAacEnc->bseInit.sampleRate = config.sampleRate;
|
||||
hAacEnc->bseInit.profile = profile;
|
||||
}
|
||||
|
||||
return error;
|
||||
@@ -152,14 +152,14 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
|
||||
ELEMENT_INFO *elInfo = &aacEnc->elInfo;
|
||||
Word16 globUsedBits;
|
||||
Word16 ancDataBytes, ancDataBytesLeft;
|
||||
|
||||
ancDataBytes = ancDataBytesLeft = *numAncBytes;
|
||||
|
||||
ancDataBytes = ancDataBytesLeft = *numAncBytes;
|
||||
|
||||
/* init output aac data buffer and length */
|
||||
aacEnc->hBitStream = CreateBitBuffer(&aacEnc->bitStream, outBytes, *numOutBytes);
|
||||
|
||||
/* psychoacoustic process */
|
||||
psyMain(aacEnc->config.nChannelsOut,
|
||||
psyMain(aacEnc->config.nChannelsOut,
|
||||
elInfo,
|
||||
timeSignal,
|
||||
&aacEnc->psyKernel.psyData[elInfo->ChannelIndex[0]],
|
||||
@@ -175,9 +175,9 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
|
||||
AdjustBitrate(&aacEnc->qcKernel,
|
||||
aacEnc->config.bitRate,
|
||||
aacEnc->config.sampleRate);
|
||||
|
||||
|
||||
/* quantization and coding process */
|
||||
QCMain(&aacEnc->qcKernel,
|
||||
QCMain(&aacEnc->qcKernel,
|
||||
&aacEnc->qcKernel.elementBits,
|
||||
&aacEnc->qcKernel.adjThr.adjThrStateElem,
|
||||
&aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]],
|
||||
@@ -193,11 +193,11 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
|
||||
&aacEnc->qcOut);
|
||||
|
||||
/* write bitstream process */
|
||||
WriteBitstream(aacEnc->hBitStream,
|
||||
WriteBitstream(aacEnc->hBitStream,
|
||||
*elInfo,
|
||||
&aacEnc->qcOut,
|
||||
&aacEnc->psyOut,
|
||||
&globUsedBits,
|
||||
&globUsedBits,
|
||||
ancBytes,
|
||||
aacEnc->psyKernel.sampleRateIdx);
|
||||
|
||||
@@ -219,7 +219,7 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
|
||||
**********************************************************************************/
|
||||
void AacEncClose (AAC_ENCODER* hAacEnc, VO_MEM_OPERATOR *pMemOP)
|
||||
{
|
||||
if (hAacEnc) {
|
||||
if (hAacEnc) {
|
||||
QCDelete(&hAacEnc->qcKernel, pMemOP);
|
||||
|
||||
QCOutDelete(&hAacEnc->qcOut, pMemOP);
|
||||
|
||||
@@ -71,7 +71,7 @@ static void calcThreshExp(Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB],
|
||||
Word32 *pthrExp, *psfbThre;
|
||||
for (ch=0; ch<nChannels; 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]);
|
||||
psfbThre = psyOutChan->sfbThreshold + sfbGrp;
|
||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||
@@ -96,21 +96,21 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
Word32 nSfb, avgEn;
|
||||
Word16 log_avgEn = 0;
|
||||
Word32 startRatio_x_avgEn = 0;
|
||||
|
||||
|
||||
|
||||
for (ch=0; ch<nChannels; ch++) {
|
||||
PSY_OUT_CHANNEL* psyOutChan = &psyOutChannel[ch];
|
||||
|
||||
/* calc average energy per scalefactor band */
|
||||
avgEn = 0;
|
||||
nSfb = 0;
|
||||
avgEn = 0;
|
||||
nSfb = 0;
|
||||
for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) {
|
||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||
avgEn = L_add(avgEn, psyOutChan->sfbEnergy[sfbOffs+sfb]);
|
||||
nSfb = nSfb + 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (nSfb > 0) {
|
||||
avgEn = avgEn / nSfb;
|
||||
|
||||
@@ -118,7 +118,7 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
startRatio_x_avgEn = fixmul(msaParam->startRatio, avgEn);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* reduce minSnr requirement by minSnr^minSnrRed dependent on avgEn/sfbEn */
|
||||
for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) {
|
||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||
@@ -126,22 +126,22 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
Word16 dbRatio, minSnrRed;
|
||||
Word32 snrRed;
|
||||
Word16 newMinSnr;
|
||||
|
||||
|
||||
dbRatio = log_avgEn - logSfbEnergy[ch][sfbOffs+sfb];
|
||||
dbRatio = dbRatio + (dbRatio << 1);
|
||||
|
||||
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
|
||||
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)
|
||||
*/
|
||||
|
||||
|
||||
newMinSnr = round16(pow2_xy(snrRed,80*4));
|
||||
|
||||
|
||||
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++) {
|
||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||
|
||||
|
||||
if (psyOutChan->windowSequence != SHORT_WINDOW) {
|
||||
for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
|
||||
psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp;
|
||||
@@ -194,7 +194,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
||||
if (ahParam->modifyMinSnr) {
|
||||
for(ch=0; ch<nChannels; ch++) {
|
||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||
|
||||
|
||||
if (psyOutChan->windowSequence != SHORT_WINDOW)
|
||||
threshold = HOLE_THR_LONG;
|
||||
else
|
||||
@@ -204,39 +204,39 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
||||
Word16 *psfbMinSnr = psyOutChan->sfbMinSnr + sfbGrp;
|
||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||
Word32 sfbEn, sfbEnm1, sfbEnp1, avgEn;
|
||||
|
||||
|
||||
if (sfb > 0)
|
||||
sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp+sfb-1];
|
||||
else
|
||||
sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp];
|
||||
|
||||
|
||||
if (sfb < (psyOutChan->maxSfbPerGroup-1))
|
||||
sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb+1];
|
||||
else
|
||||
sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb];
|
||||
avgEn = (sfbEnm1 + sfbEnp1) >> 1;
|
||||
sfbEn = psyOutChan->sfbEnergy[sfbGrp+sfb];
|
||||
|
||||
sfbEn = psyOutChan->sfbEnergy[sfbGrp+sfb];
|
||||
|
||||
if (sfbEn > avgEn && avgEn > 0) {
|
||||
Word32 tmpMinSnr;
|
||||
shift = norm_l(sfbEn);
|
||||
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);
|
||||
*psfbMinSnr = min(*psfbMinSnr, tmpMinSnr);
|
||||
}
|
||||
/* valley ? */
|
||||
|
||||
|
||||
if ((sfbEn < (avgEn >> 1)) && (sfbEn > 0)) {
|
||||
Word32 tmpMinSnr;
|
||||
Word32 minSnrEn = L_mpy_wx(avgEn, *psfbMinSnr);
|
||||
|
||||
Word32 minSnrEn = L_mpy_wx(avgEn, *psfbMinSnr);
|
||||
|
||||
if(minSnrEn < sfbEn) {
|
||||
shift = norm_l(sfbEn);
|
||||
tmpMinSnr = Div_32( minSnrEn << shift, sfbEn<<shift);
|
||||
}
|
||||
else {
|
||||
tmpMinSnr = MAX_16;
|
||||
tmpMinSnr = MAX_16;
|
||||
}
|
||||
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
|
||||
side channels */
|
||||
|
||||
|
||||
if (nChannels == 2) {
|
||||
PSY_OUT_CHANNEL *psyOutChanM = &psyOutChannel[0];
|
||||
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 sfbEnS = psyOutChanS->sfbEnergy[sfb];
|
||||
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) {
|
||||
psyOutChanM->sfbMinSnr[sfb] = MAX_16;
|
||||
psyOutChanM->sfbMinSnr[sfb] = MAX_16;
|
||||
}
|
||||
else {
|
||||
shift = norm_l(sfbEnM);
|
||||
psyOutChanM->sfbMinSnr[sfb] = min(max(psyOutChanM->sfbMinSnr[sfb],
|
||||
shift = norm_l(sfbEnM);
|
||||
psyOutChanM->sfbMinSnr[sfb] = min(max(psyOutChanM->sfbMinSnr[sfb],
|
||||
round16(Div_32(maxThr<<shift, sfbEnM << shift))), minSnrLimit);
|
||||
}
|
||||
|
||||
|
||||
if(maxThr >= sfbEnS) {
|
||||
psyOutChanS->sfbMinSnr[sfb] = MAX_16;
|
||||
}
|
||||
else {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (sfbEnM > psyOutChanM->sfbSpreadedEnergy[sfb])
|
||||
psyOutChanS->sfbSpreadedEnergy[sfb] = L_mpy_ls(sfbEnS, MS_THRSPREAD_COEF);
|
||||
|
||||
|
||||
if (sfbEnS > psyOutChanS->sfbSpreadedEnergy[sfb])
|
||||
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){
|
||||
Word16 *pahFlag = ahFlag[ch] + sfbGrp;
|
||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||
|
||||
|
||||
if ((psyOutChan->sfbSpreadedEnergy[sfbGrp+sfb] > psyOutChan->sfbEnergy[sfbGrp+sfb]) ||
|
||||
(psyOutChan->sfbEnergy[sfbGrp+sfb] <= psyOutChan->sfbThreshold[sfbGrp+sfb]) ||
|
||||
(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++) {
|
||||
*pahFlag++ = NO_AH;
|
||||
*pahFlag++ = NO_AH;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -331,15 +331,15 @@ static void calcPeNoAH(Word16 *pe,
|
||||
Word16 ch, sfb, sfbGrp;
|
||||
int ipe, iconstPart, inActiveLines;
|
||||
|
||||
ipe = 0;
|
||||
iconstPart = 0;
|
||||
inActiveLines = 0;
|
||||
ipe = 0;
|
||||
iconstPart = 0;
|
||||
inActiveLines = 0;
|
||||
for(ch=0; ch<nChannels; ch++) {
|
||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||
PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
|
||||
for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
|
||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||
|
||||
|
||||
if (ahFlag[ch][sfbGrp+sfb] < AH_ACTIVE) {
|
||||
ipe = ipe + peChanData->sfbPe[sfbGrp+sfb];
|
||||
iconstPart = iconstPart + peChanData->sfbConstPart[sfbGrp+sfb];
|
||||
@@ -349,9 +349,9 @@ static void calcPeNoAH(Word16 *pe,
|
||||
}
|
||||
}
|
||||
|
||||
*pe = saturate(ipe);
|
||||
*constPart = saturate(iconstPart);
|
||||
*nActiveLines = saturate(inActiveLines);
|
||||
*pe = saturate(ipe);
|
||||
*constPart = saturate(iconstPart);
|
||||
*nActiveLines = saturate(inActiveLines);
|
||||
}
|
||||
|
||||
/********************************************************************************
|
||||
@@ -367,16 +367,16 @@ static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
const Word32 redVal)
|
||||
{
|
||||
Word32 sfbThrReduced;
|
||||
Word32 *psfbEn, *psfbThr;
|
||||
Word32 *psfbEn, *psfbThr;
|
||||
Word16 ch, sfb, sfbGrp;
|
||||
|
||||
for(ch=0; ch<nChannels; ch++) {
|
||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||
for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
|
||||
psfbEn = psyOutChan->sfbEnergy + sfbGrp;
|
||||
psfbEn = psyOutChan->sfbEnergy + sfbGrp;
|
||||
psfbThr = psyOutChan->sfbThreshold + sfbGrp;
|
||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||
|
||||
|
||||
if (*psfbEn > *psfbThr) {
|
||||
/* threshold reduction formula */
|
||||
Word32 tmp = thrExp[ch][sfbGrp+sfb] + redVal;
|
||||
@@ -384,11 +384,11 @@ static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
sfbThrReduced = fixmul(tmp, tmp);
|
||||
/* avoid holes */
|
||||
tmp = L_mpy_ls(*psfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]);
|
||||
|
||||
if ((sfbThrReduced > tmp) &&
|
||||
|
||||
if ((sfbThrReduced > tmp) &&
|
||||
(ahFlag[ch][sfbGrp+sfb] != NO_AH)){
|
||||
sfbThrReduced = max(tmp, *psfbThr);
|
||||
ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE;
|
||||
ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE;
|
||||
}
|
||||
*psfbThr = sfbThrReduced;
|
||||
}
|
||||
@@ -426,7 +426,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
Word32 sfbThrReduced;
|
||||
|
||||
/* for each sfb calc relative factors for pe changes */
|
||||
normFactor = 1;
|
||||
normFactor = 1;
|
||||
for(ch=0; ch<nChannels; ch++) {
|
||||
psyOutChan = &psyOutChannel[ch];
|
||||
peChanData = &peData->peChannelData[ch];
|
||||
@@ -436,22 +436,22 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
pahFlag = ahFlag[ch] + sfbGrp;
|
||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||
Word32 redThrExp = thrExp[ch][sfbGrp+sfb] + redVal;
|
||||
|
||||
|
||||
if (((*pahFlag < AH_ACTIVE) || (deltaPe > 0)) && (redThrExp > 0) ) {
|
||||
|
||||
|
||||
*psfbPeFactors = (*psfbNActiveLines) * (0x7fffffff / redThrExp);
|
||||
normFactor = L_add(normFactor, *psfbPeFactors);
|
||||
}
|
||||
else {
|
||||
*psfbPeFactors = 0;
|
||||
*psfbPeFactors = 0;
|
||||
}
|
||||
psfbPeFactors++;
|
||||
psfbPeFactors++;
|
||||
pahFlag++; psfbNActiveLines++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* calculate new thresholds */
|
||||
for(ch=0; ch<nChannels; ch++) {
|
||||
psyOutChan = &psyOutChannel[ch];
|
||||
@@ -464,7 +464,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
/* pe difference for this sfb */
|
||||
deltaSfbPe = *psfbPeFactors * deltaPe;
|
||||
|
||||
/* thr3(n) = thr2(n)*2^deltaSfbPe/b(n) */
|
||||
/* thr3(n) = thr2(n)*2^deltaSfbPe/b(n) */
|
||||
if (*psfbNActiveLines > 0) {
|
||||
/* new threshold */
|
||||
Word32 thrFactor;
|
||||
@@ -476,7 +476,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
reduce threshold
|
||||
*/
|
||||
thrFactor = pow2_xy(L_negate(deltaSfbPe), (normFactor* (*psfbNActiveLines)));
|
||||
|
||||
|
||||
sfbThrReduced = L_mpy_ls(sfbThr, round16(thrFactor));
|
||||
}
|
||||
else {
|
||||
@@ -484,28 +484,28 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
increase threshold
|
||||
*/
|
||||
thrFactor = pow2_xy(deltaSfbPe, (normFactor * (*psfbNActiveLines)));
|
||||
|
||||
|
||||
|
||||
|
||||
if(thrFactor > sfbThr) {
|
||||
shift = norm_l(thrFactor);
|
||||
sfbThrReduced = Div_32( sfbThr << shift, thrFactor<<shift );
|
||||
}
|
||||
else {
|
||||
sfbThrReduced = MAX_32;
|
||||
sfbThrReduced = MAX_32;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* avoid hole */
|
||||
sfbEn = L_mpy_ls(sfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]);
|
||||
|
||||
|
||||
if ((sfbThrReduced > sfbEn) &&
|
||||
(*pahFlag == AH_INACTIVE)) {
|
||||
sfbThrReduced = max(sfbEn, sfbThr);
|
||||
*pahFlag = AH_ACTIVE;
|
||||
*pahFlag = AH_ACTIVE;
|
||||
}
|
||||
|
||||
psyOutChan->sfbThreshold[sfbGrp+sfb] = sfbThrReduced;
|
||||
psyOutChan->sfbThreshold[sfbGrp+sfb] = sfbThrReduced;
|
||||
}
|
||||
|
||||
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
|
||||
*
|
||||
**********************************************************************************/
|
||||
static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
PE_DATA *peData,
|
||||
static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
PE_DATA *peData,
|
||||
Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
||||
const Word16 nChannels,
|
||||
const Word16 desiredPe)
|
||||
@@ -531,9 +531,9 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
Word16 deltaPe;
|
||||
|
||||
/* start at highest freq down to 0 */
|
||||
sfbSubWin = psyOutChannel[0].maxSfbPerGroup;
|
||||
sfbSubWin = psyOutChannel[0].maxSfbPerGroup;
|
||||
while (peData->pe > desiredPe && sfbSubWin > 0) {
|
||||
|
||||
|
||||
sfbSubWin = sfbSubWin - 1;
|
||||
/* loop over all subwindows */
|
||||
for (sfb=sfbSubWin; sfb<psyOutChannel[0].sfbCnt;
|
||||
@@ -541,10 +541,10 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
/* loop over all channels */
|
||||
PE_CHANNEL_DATA* peChan = peData->peChannelData;
|
||||
PSY_OUT_CHANNEL* psyOutCh = psyOutChannel;
|
||||
for (ch=0; ch<nChannels; ch++) {
|
||||
for (ch=0; ch<nChannels; ch++) {
|
||||
if (ahFlag[ch][sfb] != NO_AH &&
|
||||
psyOutCh->sfbMinSnr[sfb] < minSnrLimit) {
|
||||
psyOutCh->sfbMinSnr[sfb] = minSnrLimit;
|
||||
psyOutCh->sfbMinSnr[sfb] = minSnrLimit;
|
||||
psyOutCh->sfbThreshold[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) -
|
||||
peChan->sfbPe[sfb];
|
||||
peData->pe = peData->pe + deltaPe;
|
||||
peChan->pe = peChan->pe + deltaPe;
|
||||
peChan->pe = peChan->pe + deltaPe;
|
||||
}
|
||||
peChan += 1; psyOutCh += 1;
|
||||
}
|
||||
/* stop if enough has been saved */
|
||||
|
||||
|
||||
if (peData->pe <= desiredPe)
|
||||
break;
|
||||
}
|
||||
@@ -567,13 +567,13 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
/********************************************************************************
|
||||
*
|
||||
* 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
|
||||
*
|
||||
**********************************************************************************/
|
||||
static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
PSY_OUT_ELEMENT *psyOutElement,
|
||||
PE_DATA *peData,
|
||||
PE_DATA *peData,
|
||||
Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
|
||||
const AH_PARAM *ahParam,
|
||||
const Word16 nChannels,
|
||||
@@ -582,46 +582,46 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
Word16 ch, sfb;
|
||||
Word16 actPe, shift;
|
||||
|
||||
actPe = peData->pe;
|
||||
actPe = peData->pe;
|
||||
|
||||
/* for MS allow hole in the channel with less energy */
|
||||
|
||||
|
||||
if (nChannels==2 &&
|
||||
psyOutChannel[0].windowSequence==psyOutChannel[1].windowSequence) {
|
||||
PSY_OUT_CHANNEL *psyOutChanL = &psyOutChannel[0];
|
||||
PSY_OUT_CHANNEL *psyOutChanR = &psyOutChannel[1];
|
||||
for (sfb=0; sfb<psyOutChanL->sfbCnt; sfb++) {
|
||||
Word32 minEn;
|
||||
|
||||
|
||||
if (psyOutElement->toolsInfo.msMask[sfb]) {
|
||||
/* allow hole in side channel ? */
|
||||
minEn = L_mpy_ls(psyOutChanL->sfbEnergy[sfb], (minSnrLimit * psyOutChanL->sfbMinSnr[sfb]) >> 16);
|
||||
|
||||
|
||||
if (ahFlag[1][sfb] != NO_AH &&
|
||||
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]);
|
||||
actPe = actPe - peData->peChannelData[1].sfbPe[sfb];
|
||||
}
|
||||
/* allow hole in mid channel ? */
|
||||
else {
|
||||
minEn = L_mpy_ls(psyOutChanR->sfbEnergy[sfb], (minSnrLimit * psyOutChanR->sfbMinSnr[sfb]) >> 16);
|
||||
|
||||
|
||||
if (ahFlag[0][sfb]!= NO_AH &&
|
||||
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]);
|
||||
actPe = actPe - peData->peChannelData[0].sfbPe[sfb];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (actPe < desiredPe)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* subsequently erase bands */
|
||||
/* subsequently erase bands */
|
||||
if (actPe > desiredPe) {
|
||||
Word16 startSfb[2];
|
||||
Word32 avgEn, minEn;
|
||||
@@ -634,20 +634,20 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
|
||||
/* do not go below startSfb */
|
||||
for (ch=0; ch<nChannels; ch++) {
|
||||
|
||||
|
||||
if (psyOutChannel[ch].windowSequence != SHORT_WINDOW)
|
||||
startSfb[ch] = ahParam->startSfbL;
|
||||
else
|
||||
startSfb[ch] = ahParam->startSfbS;
|
||||
}
|
||||
|
||||
avgEn = 0;
|
||||
minEn = MAX_32;
|
||||
ahCnt = 0;
|
||||
avgEn = 0;
|
||||
minEn = MAX_32;
|
||||
ahCnt = 0;
|
||||
for (ch=0; ch<nChannels; ch++) {
|
||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||
for (sfb=startSfb[ch]; sfb<psyOutChan->sfbCnt; sfb++) {
|
||||
|
||||
|
||||
if ((ahFlag[ch][sfb] != NO_AH) &&
|
||||
(psyOutChan->sfbEnergy[sfb] > psyOutChan->sfbThreshold[sfb])) {
|
||||
minEn = min(minEn, psyOutChan->sfbEnergy[sfb]);
|
||||
@@ -656,7 +656,7 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(ahCnt) {
|
||||
Word32 iahCnt;
|
||||
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 */
|
||||
maxSfb = psyOutChannel[0].sfbCnt - 1;
|
||||
minSfb = startSfb[0];
|
||||
|
||||
minSfb = startSfb[0];
|
||||
|
||||
if (nChannels == 2) {
|
||||
maxSfb = max(maxSfb, (psyOutChannel[1].sfbCnt - 1));
|
||||
minSfb = min(minSfb, startSfb[1]);
|
||||
}
|
||||
|
||||
sfb = maxSfb;
|
||||
enIdx = 0;
|
||||
done = 0;
|
||||
sfb = maxSfb;
|
||||
enIdx = 0;
|
||||
done = 0;
|
||||
while (!done) {
|
||||
|
||||
|
||||
for (ch=0; ch<nChannels; ch++) {
|
||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||
|
||||
|
||||
if (sfb>=startSfb[ch] && sfb<psyOutChan->sfbCnt) {
|
||||
/* sfb energy below border ? */
|
||||
|
||||
|
||||
if (ahFlag[ch][sfb] != NO_AH && psyOutChan->sfbEnergy[sfb] < en[enIdx]){
|
||||
/* allow hole */
|
||||
ahFlag[ch][sfb] = NO_AH;
|
||||
ahFlag[ch][sfb] = NO_AH;
|
||||
psyOutChan->sfbThreshold[sfb] = L_add(psyOutChan->sfbEnergy[sfb], psyOutChan->sfbEnergy[sfb]);
|
||||
actPe = actPe - peData->peChannelData[ch].sfbPe[sfb];
|
||||
}
|
||||
|
||||
|
||||
if (actPe < desiredPe) {
|
||||
done = 1;
|
||||
done = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
sfb = sfb - 1;
|
||||
|
||||
|
||||
if (sfb < minSfb) {
|
||||
/* restart with next energy border */
|
||||
sfb = maxSfb;
|
||||
sfb = maxSfb;
|
||||
enIdx = enIdx + 1;
|
||||
|
||||
|
||||
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);
|
||||
|
||||
noRedPe = peData->pe;
|
||||
constPart = peData->constPart;
|
||||
nActiveLines = peData->nActiveLines;
|
||||
noRedPe = peData->pe;
|
||||
constPart = peData->constPart;
|
||||
nActiveLines = peData->nActiveLines;
|
||||
|
||||
/* first guess of reduction value t^0.25 = 2^((a-pen)/4*b) */
|
||||
avgThrExp = pow2_xy((constPart - noRedPe), (nActiveLines << 2));
|
||||
|
||||
|
||||
/* r1 = 2^((a-per)/4*b) - t^0.25 */
|
||||
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 */
|
||||
calcSfbPe(peData, psyOutChannel, nChannels);
|
||||
redPe = peData->pe;
|
||||
redPe = peData->pe;
|
||||
|
||||
iter = 0;
|
||||
iter = 0;
|
||||
do {
|
||||
/* pe for bands where avoid hole is inactive */
|
||||
calcPeNoAH(&redPeNoAH, &constPartNoAH, &nActiveLinesNoAH,
|
||||
peData, peData->ahFlag, psyOutChannel, nChannels);
|
||||
|
||||
desiredPeNoAH = desiredPe -(redPe - redPeNoAH);
|
||||
|
||||
|
||||
if (desiredPeNoAH < 0) {
|
||||
desiredPeNoAH = 0;
|
||||
desiredPeNoAH = 0;
|
||||
}
|
||||
|
||||
/* second guess */
|
||||
|
||||
|
||||
if (nActiveLinesNoAH > 0) {
|
||||
|
||||
|
||||
avgThrExp = pow2_xy((constPartNoAH - redPeNoAH), (nActiveLinesNoAH << 2));
|
||||
|
||||
|
||||
redVal = (redVal + pow2_xy((constPartNoAH - desiredPeNoAH), (nActiveLinesNoAH << 2))) - avgThrExp;
|
||||
|
||||
|
||||
/* reduce thresholds */
|
||||
reduceThresholds(psyOutChannel, peData->ahFlag, peData->thrExp, nChannels, redVal);
|
||||
}
|
||||
|
||||
calcSfbPe(peData, psyOutChannel, nChannels);
|
||||
redPe = peData->pe;
|
||||
redPe = peData->pe;
|
||||
|
||||
iter = iter+1;
|
||||
|
||||
|
||||
} while ((20 * abs_s(redPe - desiredPe) > desiredPe) && (iter < 2));
|
||||
|
||||
|
||||
|
||||
if ((100 * redPe < 115 * desiredPe)) {
|
||||
correctThresh(psyOutChannel, peData->ahFlag, peData, peData->thrExp, redVal,
|
||||
nChannels, desiredPe - redPe);
|
||||
@@ -863,7 +863,7 @@ static Word16 calcBitSpend(Word16 fillLevel,
|
||||
if(clipHigh-clipLow)
|
||||
bitspend = (minBitSpend + ((maxBitSpend - minBitSpend)*(fillLevel - clipLow) /
|
||||
(clipHigh-clipLow)));
|
||||
|
||||
|
||||
return (bitspend);
|
||||
}
|
||||
|
||||
@@ -884,19 +884,19 @@ static void adjustPeMinMax(const Word16 currPe,
|
||||
Word16 minFacHi, maxFacHi, minFacLo, maxFacLo;
|
||||
Word16 diff;
|
||||
Word16 minDiff = extract_l(currPe / 6);
|
||||
minFacHi = 30;
|
||||
maxFacHi = 100;
|
||||
minFacLo = 14;
|
||||
maxFacLo = 7;
|
||||
minFacHi = 30;
|
||||
maxFacHi = 100;
|
||||
minFacLo = 14;
|
||||
maxFacLo = 7;
|
||||
|
||||
diff = currPe - *peMax ;
|
||||
|
||||
|
||||
if (diff > 0) {
|
||||
*peMin = *peMin + ((diff * minFacHi) / 100);
|
||||
*peMax = *peMax + ((diff * maxFacHi) / 100);
|
||||
} else {
|
||||
diff = *peMin - currPe;
|
||||
|
||||
|
||||
if (diff > 0) {
|
||||
*peMin = *peMin - ((diff * minFacLo) / 100);
|
||||
*peMax = *peMax - ((diff * maxFacLo) / 100);
|
||||
@@ -906,7 +906,7 @@ static void adjustPeMinMax(const Word16 currPe,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if ((*peMax - *peMin) < minDiff) {
|
||||
Word16 partLo, partHi;
|
||||
|
||||
@@ -969,7 +969,7 @@ static Word16 bitresCalcBitFac( const Word16 bitresBits,
|
||||
(adjThrChan->peMax - adjThrChan->peMin));
|
||||
else
|
||||
bitresFac = 0x7fff;
|
||||
|
||||
|
||||
bitresFac = min(bitresFac,
|
||||
(100-30 + extract_l((100 * bitresBits) / avgBits)));
|
||||
|
||||
@@ -995,23 +995,23 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr,
|
||||
|
||||
/* common for all elements: */
|
||||
/* parameters for bitres control */
|
||||
hAdjThr->bresParamLong.clipSaveLow = 20;
|
||||
hAdjThr->bresParamLong.clipSaveHigh = 95;
|
||||
hAdjThr->bresParamLong.minBitSave = -5;
|
||||
hAdjThr->bresParamLong.maxBitSave = 30;
|
||||
hAdjThr->bresParamLong.clipSpendLow = 20;
|
||||
hAdjThr->bresParamLong.clipSpendHigh = 95;
|
||||
hAdjThr->bresParamLong.minBitSpend = -10;
|
||||
hAdjThr->bresParamLong.maxBitSpend = 40;
|
||||
hAdjThr->bresParamLong.clipSaveLow = 20;
|
||||
hAdjThr->bresParamLong.clipSaveHigh = 95;
|
||||
hAdjThr->bresParamLong.minBitSave = -5;
|
||||
hAdjThr->bresParamLong.maxBitSave = 30;
|
||||
hAdjThr->bresParamLong.clipSpendLow = 20;
|
||||
hAdjThr->bresParamLong.clipSpendHigh = 95;
|
||||
hAdjThr->bresParamLong.minBitSpend = -10;
|
||||
hAdjThr->bresParamLong.maxBitSpend = 40;
|
||||
|
||||
hAdjThr->bresParamShort.clipSaveLow = 20;
|
||||
hAdjThr->bresParamShort.clipSaveHigh = 75;
|
||||
hAdjThr->bresParamShort.minBitSave = 0;
|
||||
hAdjThr->bresParamShort.maxBitSave = 20;
|
||||
hAdjThr->bresParamShort.clipSpendLow = 20;
|
||||
hAdjThr->bresParamShort.clipSpendHigh = 75;
|
||||
hAdjThr->bresParamShort.minBitSpend = -5;
|
||||
hAdjThr->bresParamShort.maxBitSpend = 50;
|
||||
hAdjThr->bresParamShort.clipSaveLow = 20;
|
||||
hAdjThr->bresParamShort.clipSaveHigh = 75;
|
||||
hAdjThr->bresParamShort.minBitSave = 0;
|
||||
hAdjThr->bresParamShort.maxBitSave = 20;
|
||||
hAdjThr->bresParamShort.clipSpendLow = 20;
|
||||
hAdjThr->bresParamShort.clipSpendHigh = 75;
|
||||
hAdjThr->bresParamShort.minBitSpend = -5;
|
||||
hAdjThr->bresParamShort.maxBitSpend = 50;
|
||||
|
||||
/* specific for each element: */
|
||||
|
||||
@@ -1020,7 +1020,7 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr,
|
||||
atsElem->peMax = extract_l(((120*meanPe) / 100));
|
||||
|
||||
/* additional pe offset to correct pe2bits for low bitrates */
|
||||
atsElem->peOffset = 0;
|
||||
atsElem->peOffset = 0;
|
||||
if (chBitrate < 32000) {
|
||||
atsElem->peOffset = max(50, (100 - extract_l((100 * chBitrate) / 32000)));
|
||||
}
|
||||
@@ -1039,24 +1039,24 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr,
|
||||
|
||||
/* minSnr adaptation */
|
||||
/* 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 */
|
||||
msaParam->startRatio = 0x0ccccccd; /* 10 */
|
||||
msaParam->startRatio = 0x0ccccccd; /* 10 */
|
||||
/* maximum minSnr reduction to minSnr^maxRed is reached for
|
||||
avgEn/sfbEn >= maxRatio */
|
||||
msaParam->maxRatio = 0x0020c49c; /* 1000 */
|
||||
msaParam->maxRatio = 0x0020c49c; /* 1000 */
|
||||
/* helper variables to interpolate minSnr reduction for
|
||||
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 */
|
||||
atsElem->peLast = 0;
|
||||
atsElem->dynBitsLast = 0;
|
||||
atsElem->peCorrectionFactor = 100; /* 1.0 */
|
||||
atsElem->peLast = 0;
|
||||
atsElem->dynBitsLast = 0;
|
||||
atsElem->peCorrectionFactor = 100; /* 1.0 */
|
||||
|
||||
}
|
||||
|
||||
@@ -1069,20 +1069,20 @@ void AdjThrInit(ADJ_THR_STATE *hAdjThr,
|
||||
*****************************************************************************/
|
||||
static void calcPeCorrection(Word16 *correctionFac,
|
||||
const Word16 peAct,
|
||||
const Word16 peLast,
|
||||
const Word16 bitsLast)
|
||||
const Word16 peLast,
|
||||
const Word16 bitsLast)
|
||||
{
|
||||
Word32 peAct100 = 100 * peAct;
|
||||
Word32 peLast100 = 100 * peLast;
|
||||
Word16 peBitsLast = bits2pe(bitsLast);
|
||||
|
||||
|
||||
if ((bitsLast > 0) &&
|
||||
(peAct100 < (150 * peLast)) && (peAct100 > (70 * peLast)) &&
|
||||
((120 * peBitsLast) > peLast100 ) && (( 65 * peBitsLast) < peLast100))
|
||||
{
|
||||
Word16 newFac = (100 * peLast) / peBitsLast;
|
||||
/* dead zone */
|
||||
|
||||
|
||||
if (newFac < 100) {
|
||||
newFac = min(((110 * newFac) / 100), 100);
|
||||
newFac = max(newFac, 85);
|
||||
@@ -1091,13 +1091,13 @@ static void calcPeCorrection(Word16 *correctionFac,
|
||||
newFac = max(((90 * newFac) / 100), 100);
|
||||
newFac = min(newFac, 115);
|
||||
}
|
||||
|
||||
|
||||
if ((newFac > 100 && *correctionFac < 100) ||
|
||||
(newFac < 100 && *correctionFac > 100)) {
|
||||
*correctionFac = 100;
|
||||
*correctionFac = 100;
|
||||
}
|
||||
/* faster adaptation towards 1.0, slower in the other direction */
|
||||
|
||||
|
||||
if ((*correctionFac < 100 && newFac < *correctionFac) ||
|
||||
(*correctionFac > 100 && newFac > *correctionFac))
|
||||
*correctionFac = (85 * *correctionFac + 15 * newFac) / 100;
|
||||
@@ -1107,7 +1107,7 @@ static void calcPeCorrection(Word16 *correctionFac,
|
||||
*correctionFac = max(*correctionFac, 85);
|
||||
}
|
||||
else {
|
||||
*correctionFac = 100;
|
||||
*correctionFac = 100;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1123,40 +1123,40 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
|
||||
PSY_OUT_ELEMENT *psyOutElement,
|
||||
Word16 *chBitDistribution,
|
||||
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,
|
||||
ELEMENT_BITS *elBits,
|
||||
const Word16 nChannels,
|
||||
const Word16 maxBitFac)
|
||||
{
|
||||
PE_DATA peData;
|
||||
PE_DATA peData;
|
||||
Word16 noRedPe, grantedPe, grantedPeCorr;
|
||||
Word16 curWindowSequence;
|
||||
Word16 bitFactor;
|
||||
Word16 avgBits = (elBits->averageBits - (qcOE->staticBitsUsed + qcOE->ancBitsUsed));
|
||||
Word16 bitresBits = elBits->bitResLevel;
|
||||
Word16 bitresBits = elBits->bitResLevel;
|
||||
Word16 maxBitresBits = elBits->maxBits;
|
||||
Word16 sideInfoBits = (qcOE->staticBitsUsed + qcOE->ancBitsUsed);
|
||||
Word16 ch;
|
||||
|
||||
|
||||
prepareSfbPe(&peData, psyOutChannel, logSfbEnergy, sfbNRelevantLines, nChannels, AdjThrStateElement->peOffset);
|
||||
|
||||
|
||||
/* pe without reduction */
|
||||
calcSfbPe(&peData, psyOutChannel, nChannels);
|
||||
noRedPe = peData.pe;
|
||||
noRedPe = peData.pe;
|
||||
|
||||
|
||||
curWindowSequence = LONG_WINDOW;
|
||||
|
||||
curWindowSequence = LONG_WINDOW;
|
||||
|
||||
if (nChannels == 2) {
|
||||
|
||||
|
||||
if ((psyOutChannel[0].windowSequence == SHORT_WINDOW) ||
|
||||
(psyOutChannel[1].windowSequence == SHORT_WINDOW)) {
|
||||
curWindowSequence = SHORT_WINDOW;
|
||||
curWindowSequence = SHORT_WINDOW;
|
||||
}
|
||||
}
|
||||
else {
|
||||
curWindowSequence = psyOutChannel[0].windowSequence;
|
||||
curWindowSequence = psyOutChannel[0].windowSequence;
|
||||
}
|
||||
|
||||
|
||||
@@ -1170,13 +1170,13 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
|
||||
grantedPe = ((bitFactor * bits2pe(avgBits)) / 100);
|
||||
|
||||
/* correction of pe value */
|
||||
calcPeCorrection(&(AdjThrStateElement->peCorrectionFactor),
|
||||
calcPeCorrection(&(AdjThrStateElement->peCorrectionFactor),
|
||||
min(grantedPe, noRedPe),
|
||||
AdjThrStateElement->peLast,
|
||||
AdjThrStateElement->peLast,
|
||||
AdjThrStateElement->dynBitsLast);
|
||||
grantedPeCorr = (grantedPe * AdjThrStateElement->peCorrectionFactor) / 100;
|
||||
|
||||
|
||||
|
||||
if (grantedPeCorr < noRedPe && noRedPe > peData.offset) {
|
||||
/* calc threshold necessary for desired pe */
|
||||
adaptThresholdsToPe(psyOutChannel,
|
||||
@@ -1192,8 +1192,8 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
|
||||
/* calculate relative distribution */
|
||||
for (ch=0; ch<nChannels; ch++) {
|
||||
Word16 peOffsDiff = peData.pe - peData.offset;
|
||||
chBitDistribution[ch] = 200;
|
||||
|
||||
chBitDistribution[ch] = 200;
|
||||
|
||||
if (peOffsDiff > 0) {
|
||||
Word32 temp = 1000 - (nChannels * 200);
|
||||
chBitDistribution[ch] = chBitDistribution[ch] +
|
||||
@@ -1202,10 +1202,10 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
|
||||
}
|
||||
|
||||
/* store pe */
|
||||
qcOE->pe = noRedPe;
|
||||
qcOE->pe = noRedPe;
|
||||
|
||||
/* update last pe */
|
||||
AdjThrStateElement->peLast = grantedPe;
|
||||
AdjThrStateElement->peLast = grantedPe;
|
||||
}
|
||||
|
||||
/********************************************************************************
|
||||
@@ -1217,7 +1217,7 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState,
|
||||
void AdjThrUpdate(ATS_ELEMENT *AdjThrStateElement,
|
||||
const Word16 dynBitsUsed)
|
||||
{
|
||||
AdjThrStateElement->dynBitsLast = dynBitsUsed;
|
||||
AdjThrStateElement->dynBitsLast = dynBitsUsed;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -22,34 +22,34 @@
|
||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
|
||||
.section .text
|
||||
.section .text
|
||||
.global AutoCorrelation
|
||||
|
||||
AutoCorrelation:
|
||||
stmdb sp!, {r4 - r11, lr}
|
||||
|
||||
sub r13, r13, #20
|
||||
sub r13, r13, #20
|
||||
|
||||
mov r5, r0
|
||||
mov r7, r1
|
||||
mov r9, r3
|
||||
mov r2, r2, lsl #16
|
||||
mov r0, #0
|
||||
mov r4, r2, asr #16
|
||||
mov r8, #0
|
||||
cmp r4, #0
|
||||
ble L136
|
||||
|
||||
cmp r4, #8
|
||||
mov r2, #0
|
||||
blt L133
|
||||
mov r5, r0
|
||||
mov r7, r1
|
||||
mov r9, r3
|
||||
mov r2, r2, lsl #16
|
||||
mov r0, #0
|
||||
mov r4, r2, asr #16
|
||||
mov r8, #0
|
||||
cmp r4, #0
|
||||
ble L136
|
||||
|
||||
sub r12, r4, #8
|
||||
L132:
|
||||
ldr r6, [r5, r2]
|
||||
cmp r4, #8
|
||||
mov r2, #0
|
||||
blt L133
|
||||
|
||||
sub r12, r4, #8
|
||||
L132:
|
||||
ldr r6, [r5, r2]
|
||||
add r2, r2, #4
|
||||
smulbb r3, r6, r6
|
||||
ldr r1, [r5, r2]
|
||||
ldr r1, [r5, r2]
|
||||
smultt r10, r6, r6
|
||||
mov r3, r3, asr #9
|
||||
smulbb r6, r1, r1
|
||||
@@ -72,95 +72,95 @@ L132:
|
||||
add r8, r8, #6
|
||||
|
||||
qadd r0, r0, r6
|
||||
cmp r8, r12
|
||||
blt L132
|
||||
L133:
|
||||
ldrsh r6, [r5, r2]
|
||||
mul r10, r6, r6
|
||||
add r2, r2, #2
|
||||
mov r1, r10, asr #9
|
||||
cmp r8, r12
|
||||
blt L132
|
||||
L133:
|
||||
ldrsh r6, [r5, r2]
|
||||
mul r10, r6, r6
|
||||
add r2, r2, #2
|
||||
mov r1, r10, asr #9
|
||||
qadd r0, r0, r1
|
||||
L134:
|
||||
add r8, r8, #1
|
||||
cmp r8, r4
|
||||
blt L133
|
||||
L135:
|
||||
L136:
|
||||
str r0, [r7, #0]
|
||||
cmp r0, #0
|
||||
beq L1320
|
||||
L137:
|
||||
mov r2, r9, lsl #16
|
||||
mov r8, #1
|
||||
mov r2, r2, asr #16
|
||||
cmp r2, #1
|
||||
ble L1319
|
||||
L138:
|
||||
L139:
|
||||
sub r4, r4, #1
|
||||
mov r14, #0
|
||||
mov r3, #0
|
||||
cmp r4, #0
|
||||
ble L1317
|
||||
L1310:
|
||||
cmp r4, #6
|
||||
addlt r6, r5, r8, lsl #1
|
||||
blt L1314
|
||||
L1311:
|
||||
add r6, r5, r8, lsl #1
|
||||
sub r12, r4, #6
|
||||
str r8, [r13, #8]
|
||||
str r7, [r13, #4]
|
||||
L1312:
|
||||
mov r1, r3, lsl #1
|
||||
ldrsh r7, [r6, r1]
|
||||
ldrsh r10, [r5, r1]
|
||||
add r8, r1, r6
|
||||
add r9, r5, r1
|
||||
L134:
|
||||
add r8, r8, #1
|
||||
cmp r8, r4
|
||||
blt L133
|
||||
L135:
|
||||
L136:
|
||||
str r0, [r7, #0]
|
||||
cmp r0, #0
|
||||
beq L1320
|
||||
L137:
|
||||
mov r2, r9, lsl #16
|
||||
mov r8, #1
|
||||
mov r2, r2, asr #16
|
||||
cmp r2, #1
|
||||
ble L1319
|
||||
L138:
|
||||
L139:
|
||||
sub r4, r4, #1
|
||||
mov r14, #0
|
||||
mov r3, #0
|
||||
cmp r4, #0
|
||||
ble L1317
|
||||
L1310:
|
||||
cmp r4, #6
|
||||
addlt r6, r5, r8, lsl #1
|
||||
blt L1314
|
||||
L1311:
|
||||
add r6, r5, r8, lsl #1
|
||||
sub r12, r4, #6
|
||||
str r8, [r13, #8]
|
||||
str r7, [r13, #4]
|
||||
L1312:
|
||||
mov r1, r3, lsl #1
|
||||
ldrsh r7, [r6, r1]
|
||||
ldrsh r10, [r5, r1]
|
||||
add r8, r1, r6
|
||||
add r9, r5, r1
|
||||
mul r7, r10, r7
|
||||
ldrsh r1, [r8, #2]
|
||||
ldrsh r10, [r8, #4]
|
||||
add r7, r14, r7, asr #9
|
||||
ldrsh r0, [r9, #2]
|
||||
ldrsh r11, [r9, #4]
|
||||
mul r1, r0, r1
|
||||
ldrsh r14, [r8, #6]
|
||||
mul r10, r11, r10
|
||||
add r7, r7, r1, asr #9
|
||||
ldrsh r8, [r8, #8]
|
||||
ldrsh r1, [r8, #2]
|
||||
ldrsh r10, [r8, #4]
|
||||
add r7, r14, r7, asr #9
|
||||
ldrsh r0, [r9, #2]
|
||||
ldrsh r11, [r9, #4]
|
||||
mul r1, r0, r1
|
||||
ldrsh r14, [r8, #6]
|
||||
mul r10, r11, r10
|
||||
add r7, r7, r1, asr #9
|
||||
ldrsh r8, [r8, #8]
|
||||
add r3, r3, #5
|
||||
ldrsh r11, [r9, #6]
|
||||
ldrsh r1, [r9, #8]
|
||||
mul r14, r11, r14
|
||||
add r7, r7, r10, asr #9
|
||||
mul r1, r1, r8
|
||||
add r14, r7, r14, asr #9
|
||||
cmp r3, r12
|
||||
add r14, r14, r1, asr #9
|
||||
ble L1312
|
||||
L1313:
|
||||
ldr r8, [r13, #8]
|
||||
ldr r7, [r13, #4]
|
||||
L1314:
|
||||
L1315:
|
||||
mov r12, r3, lsl #1
|
||||
ldrsh r9, [r6, r12]
|
||||
ldrsh r12, [r5, r12]
|
||||
add r3, r3, #1
|
||||
cmp r3, r4
|
||||
mul r12, r12, r9
|
||||
add r14, r14, r12, asr #9
|
||||
blt L1315
|
||||
L1316:
|
||||
L1317:
|
||||
str r14, [r7, +r8, lsl #2]
|
||||
add r8, r8, #1
|
||||
cmp r8, r2
|
||||
blt L139
|
||||
|
||||
ldrsh r11, [r9, #6]
|
||||
ldrsh r1, [r9, #8]
|
||||
mul r14, r11, r14
|
||||
add r7, r7, r10, asr #9
|
||||
mul r1, r1, r8
|
||||
add r14, r7, r14, asr #9
|
||||
cmp r3, r12
|
||||
add r14, r14, r1, asr #9
|
||||
ble L1312
|
||||
L1313:
|
||||
ldr r8, [r13, #8]
|
||||
ldr r7, [r13, #4]
|
||||
L1314:
|
||||
L1315:
|
||||
mov r12, r3, lsl #1
|
||||
ldrsh r9, [r6, r12]
|
||||
ldrsh r12, [r5, r12]
|
||||
add r3, r3, #1
|
||||
cmp r3, r4
|
||||
mul r12, r12, r9
|
||||
add r14, r14, r12, asr #9
|
||||
blt L1315
|
||||
L1316:
|
||||
L1317:
|
||||
str r14, [r7, +r8, lsl #2]
|
||||
add r8, r8, #1
|
||||
cmp r8, r2
|
||||
blt L139
|
||||
|
||||
L1319:
|
||||
L1320:
|
||||
add r13, r13, #20
|
||||
add r13, r13, #20
|
||||
ldmia sp!, {r4 - r11, pc}
|
||||
|
||||
@ENDP @ |AutoCorrelation|
|
||||
|
||||
@@ -22,91 +22,91 @@
|
||||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||
|
||||
.section .text
|
||||
|
||||
|
||||
.global CalcWindowEnergy
|
||||
|
||||
CalcWindowEnergy:
|
||||
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];
|
||||
mov r3, r3, asr #16
|
||||
mov r3, r3, asr #16
|
||||
ldr r11, [r0, #172] @ states1 = blockSwitchingControl->iirStates[1];
|
||||
|
||||
mov r2, r2, lsl #16
|
||||
ldr r12, hiPassCoeff @ Coeff0 = hiPassCoeff[0];
|
||||
ldr r12, hiPassCoeff @ Coeff0 = hiPassCoeff[0];
|
||||
mov r2, r2, asr #16
|
||||
ldr r14, hiPassCoeff + 4 @ Coeff1 = hiPassCoeff[1];
|
||||
|
||||
|
||||
mov r8, #0 @ w=0
|
||||
mov r5, #0 @ wOffset = 0;
|
||||
|
||||
|
||||
BLOCK_BEGIN:
|
||||
mov r6, #0 @ accuUE = 0;
|
||||
mov r7, #0 @ accuFE = 0;
|
||||
mov r6, #0 @ accuUE = 0;
|
||||
mov r7, #0 @ accuFE = 0;
|
||||
mov r4, #0 @ i=0
|
||||
|
||||
str r8, [r13, #4]
|
||||
str r0, [r13, #8]
|
||||
|
||||
str r8, [r13, #4]
|
||||
str r0, [r13, #8]
|
||||
str r3, [r13, #12]
|
||||
|
||||
ENERGY_BEG:
|
||||
mov r9, r5, lsl #1
|
||||
|
||||
ENERGY_BEG:
|
||||
mov r9, r5, lsl #1
|
||||
ldrsh r9, [r1, r9] @ tempUnfiltered = timeSignal[tidx];
|
||||
|
||||
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 );
|
||||
|
||||
|
||||
mov r3, r3, 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;
|
||||
|
||||
mov r10, r3 @ states0 = accu1;
|
||||
mov r11, r8 @ states1 = out;
|
||||
|
||||
mul r3, r9, r9
|
||||
mov r11, r8 @ states1 = out;
|
||||
|
||||
mul r3, r9, r9
|
||||
mov r8, r8, asr #16
|
||||
|
||||
|
||||
add r4, r4, #1
|
||||
add r6, r6, r3, asr #7
|
||||
|
||||
mul r9, r8, r8
|
||||
mul r9, r8, r8
|
||||
ldr r3, [r13, #12]
|
||||
|
||||
add r7, r7, r9, asr #7
|
||||
|
||||
cmp r4, r3
|
||||
blt ENERGY_BEG
|
||||
|
||||
|
||||
cmp r4, r3
|
||||
blt ENERGY_BEG
|
||||
|
||||
ldr r0, [r13, #8]
|
||||
ldr r8, [r13, #4]
|
||||
|
||||
|
||||
ENERGY_END:
|
||||
add r4, r0, r8, lsl #2
|
||||
|
||||
str r6, [r4, #72]
|
||||
add r8, r8, #1
|
||||
str r7, [r4, #136]
|
||||
str r6, [r4, #72]
|
||||
add r8, r8, #1
|
||||
str r7, [r4, #136]
|
||||
|
||||
cmp r8, #8
|
||||
blt BLOCK_BEGIN
|
||||
blt BLOCK_BEGIN
|
||||
|
||||
BLOCK_END:
|
||||
str r10, [r0, #168]
|
||||
str r11, [r0, #172]
|
||||
mov r0, #1
|
||||
|
||||
add r13, r13, #20
|
||||
ldmia sp!, {r4 - r11, pc}
|
||||
str r10, [r0, #168]
|
||||
str r11, [r0, #172]
|
||||
mov r0, #1
|
||||
|
||||
add r13, r13, #20
|
||||
ldmia sp!, {r4 - r11, pc}
|
||||
|
||||
hiPassCoeff:
|
||||
.word 0xbec8b439
|
||||
.word 0x609d4952
|
||||
|
||||
|
||||
@ENDP
|
||||
.end
|
||||
|
||||
@@ -26,46 +26,46 @@
|
||||
|
||||
PreMDCT:
|
||||
stmdb sp!, {r4 - r11, lr}
|
||||
|
||||
|
||||
add r9, r0, r1, lsl #2
|
||||
sub r3, r9, #8
|
||||
|
||||
movs r1, r1, asr #2
|
||||
beq PreMDCT_END
|
||||
|
||||
|
||||
PreMDCT_LOOP:
|
||||
ldr r8, [r2], #4
|
||||
ldr r9, [r2], #4
|
||||
|
||||
|
||||
ldrd r4, [r0]
|
||||
ldrd r6, [r3]
|
||||
|
||||
|
||||
smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa)
|
||||
smull r10, r12, r7, r8 @ MULHIGH(ti1, cosa)
|
||||
|
||||
|
||||
smull r14, r8, r7, r9 @ MULHIGH(ti1, sina)
|
||||
smull r7, r10, r4, r9 @ MULHIGH(tr1, sina)
|
||||
|
||||
add r11, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
||||
smull r7, r10, r4, r9 @ MULHIGH(tr1, sina)
|
||||
|
||||
add r11, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
||||
sub r7, r12, r10 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)
|
||||
|
||||
|
||||
ldr r8, [r2], #4
|
||||
ldr r9, [r2], #4
|
||||
|
||||
|
||||
smull r14, r4, r6, r8 @ MULHIGH(tr2, cosa)
|
||||
smull r10, r12, r5, r8 @ MULHIGH(ti2, cosa)
|
||||
|
||||
|
||||
smull r14, r8, r5, r9 @ MULHIGH(ti2, sina)
|
||||
smull r5, r10, r6, r9 @ MULHIGH(tr2, sina)
|
||||
|
||||
|
||||
add r8, r8, r4
|
||||
sub r9, r12, r10
|
||||
|
||||
mov r6, r11
|
||||
|
||||
strd r6, [r0]
|
||||
mov r6, r11
|
||||
|
||||
strd r6, [r0]
|
||||
strd r8, [r3]
|
||||
|
||||
|
||||
subs r1, r1, #1
|
||||
sub r3, r3, #8
|
||||
add r0, r0, #8
|
||||
@@ -74,52 +74,52 @@ PreMDCT_LOOP:
|
||||
PreMDCT_END:
|
||||
ldmia sp!, {r4 - r11, pc}
|
||||
@ENDP @ |PreMDCT|
|
||||
|
||||
|
||||
.section .text
|
||||
.global PostMDCT
|
||||
|
||||
PostMDCT:
|
||||
stmdb sp!, {r4 - r11, lr}
|
||||
|
||||
|
||||
add r9, r0, r1, lsl #2
|
||||
sub r3, r9, #8
|
||||
|
||||
movs r1, r1, asr #2
|
||||
beq PostMDCT_END
|
||||
|
||||
|
||||
PostMDCT_LOOP:
|
||||
ldr r8, [r2], #4
|
||||
ldr r8, [r2], #4
|
||||
ldr r9, [r2], #4
|
||||
|
||||
|
||||
ldrd r4, [r0]
|
||||
ldrd r6, [r3]
|
||||
|
||||
|
||||
smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa)
|
||||
smull r10, r12, r5, r8 @ MULHIGH(ti1, cosa)
|
||||
|
||||
|
||||
smull r14, r8, r5, r9 @ MULHIGH(ti1, sina)
|
||||
smull r5, r10, r4, r9 @ MULHIGH(tr1, sina)
|
||||
|
||||
add r4, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
||||
smull r5, r10, r4, r9 @ MULHIGH(tr1, sina)
|
||||
|
||||
add r4, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
||||
sub r11, r10, r12 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)@
|
||||
|
||||
|
||||
ldr r8, [r2], #4 @
|
||||
ldr r9, [r2], #4
|
||||
|
||||
|
||||
smull r14, r5, r6, r8 @ MULHIGH(tr2, cosa)
|
||||
smull r10, r12, r7, r8 @ MULHIGH(ti2, cosa)
|
||||
|
||||
|
||||
smull r14, r8, r7, r9 @ MULHIGH(ti2, sina)
|
||||
smull r7, r10, r6, r9 @ MULHIGH(tr2, sina)
|
||||
|
||||
|
||||
add r6, r8, r5 @ MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2)@
|
||||
sub r5, r10, r12 @ MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2)@
|
||||
|
||||
mov r7, r11
|
||||
|
||||
mov r7, r11
|
||||
|
||||
strd r4, [r0]
|
||||
strd r6, [r3]
|
||||
|
||||
|
||||
subs r1, r1, #1
|
||||
sub r3, r3, #8
|
||||
add r0, r0, #8
|
||||
|
||||
@@ -26,46 +26,46 @@
|
||||
|
||||
Radix4First:
|
||||
stmdb sp!, {r4 - r11, lr}
|
||||
|
||||
|
||||
movs r10, r1
|
||||
mov r11, r0
|
||||
beq Radix4First_END
|
||||
|
||||
|
||||
Radix4First_LOOP:
|
||||
ldrd r0, [r11]
|
||||
ldrd r2, [r11, #8]
|
||||
ldrd r4, [r11, #16]
|
||||
ldrd r6, [r11, #24]
|
||||
|
||||
|
||||
add r8, r0, r2
|
||||
add r9, r1, r3
|
||||
|
||||
|
||||
sub r0, r0, r2
|
||||
sub r1, r1, r3
|
||||
|
||||
|
||||
add r2, r4, r6
|
||||
add r3, r5, r7
|
||||
|
||||
|
||||
sub r4, r4, r6
|
||||
sub r5, r5, r7
|
||||
|
||||
|
||||
add r6, r8, r2
|
||||
add r7, r9, r3
|
||||
|
||||
|
||||
sub r8, r8, r2
|
||||
sub r9, r9, r3
|
||||
|
||||
|
||||
add r2, r0, r5
|
||||
sub r3, r1, r4
|
||||
|
||||
|
||||
sub r0, r0, r5
|
||||
add r1, r1, r4
|
||||
|
||||
|
||||
strd r6, [r11]
|
||||
strd r2, [r11, #8]
|
||||
strd r8, [r11, #16]
|
||||
strd r0, [r11, #24]
|
||||
|
||||
|
||||
subs r10, r10, #1
|
||||
add r11, r11, #32
|
||||
bne Radix4First_LOOP
|
||||
@@ -73,180 +73,180 @@ Radix4First_LOOP:
|
||||
Radix4First_END:
|
||||
ldmia sp!, {r4 - r11, pc}
|
||||
@ENDP @ |Radix4First|
|
||||
|
||||
|
||||
.section .text
|
||||
.global Radix8First
|
||||
|
||||
Radix8First:
|
||||
stmdb sp!, {r4 - r11, lr}
|
||||
sub sp, sp, #0x24
|
||||
|
||||
|
||||
mov r12, r1
|
||||
mov r14, r0
|
||||
cmp r12, #0
|
||||
beq Radix8First_END
|
||||
|
||||
|
||||
Radix8First_LOOP:
|
||||
ldrd r0, [r14]
|
||||
ldrd r0, [r14]
|
||||
ldrd r2, [r14, #8]
|
||||
ldrd r4, [r14, #16]
|
||||
ldrd r6, [r14, #24]
|
||||
|
||||
|
||||
add r8, r0, r2 @ r0 = buf[0] + buf[2]@
|
||||
add r9, r1, r3 @ i0 = buf[1] + buf[3]@
|
||||
|
||||
|
||||
sub r0, r0, r2 @ r1 = buf[0] - buf[2]@
|
||||
sub r1, r1, r3 @ i1 = buf[1] - buf[3]@
|
||||
|
||||
|
||||
add r2, r4, r6 @ r2 = buf[4] + buf[6]@
|
||||
add r3, r5, r7 @ i2 = buf[5] + buf[7]@
|
||||
|
||||
|
||||
sub r4, r4, r6 @ r3 = buf[4] - buf[6]@
|
||||
sub r5, r5, r7 @ i3 = buf[5] - buf[7]@
|
||||
|
||||
|
||||
add r6, r8, r2 @ r4 = (r0 + r2) >> 1@
|
||||
add r7, r9, r3 @ i4 = (i0 + i2) >> 1@
|
||||
|
||||
|
||||
sub r8, r8, r2 @ r5 = (r0 - r2) >> 1@
|
||||
sub r9, r9, r3 @ i5 = (i0 - i2) >> 1@
|
||||
|
||||
|
||||
sub r2, r0, r5 @ r6 = (r1 - i3) >> 1@
|
||||
add r3, r1, r4 @ i6 = (i1 + r3) >> 1@
|
||||
|
||||
|
||||
add r0, r0, r5 @ r7 = (r1 + i3) >> 1@
|
||||
sub r1, r1, r4 @ i7 = (i1 - r3) >> 1@
|
||||
|
||||
|
||||
mov r6, r6, asr #1 @
|
||||
mov r7, r7, asr #1 @
|
||||
|
||||
|
||||
mov r8, r8, asr #1
|
||||
mov r9, r9, asr #1
|
||||
|
||||
|
||||
mov r2, r2, asr #1
|
||||
mov r3, r3, asr #1
|
||||
|
||||
|
||||
mov r0, r0, asr #1
|
||||
mov r1, r1, asr #1
|
||||
|
||||
mov r1, r1, asr #1
|
||||
|
||||
str r6, [sp]
|
||||
str r7, [sp, #4]
|
||||
|
||||
|
||||
str r8, [sp, #8]
|
||||
str r9, [sp, #12]
|
||||
|
||||
|
||||
str r2, [sp, #16]
|
||||
str r3, [sp, #20]
|
||||
|
||||
str r3, [sp, #20]
|
||||
|
||||
str r0, [sp, #24]
|
||||
str r1, [sp, #28]
|
||||
|
||||
ldrd r2, [r14, #32]
|
||||
str r1, [sp, #28]
|
||||
|
||||
ldrd r2, [r14, #32]
|
||||
ldrd r4, [r14, #40]
|
||||
ldrd r6, [r14, #48]
|
||||
ldrd r8, [r14, #56]
|
||||
|
||||
|
||||
add r0, r2, r4 @ r0 = buf[ 8] + buf[10]@
|
||||
add r1, r3, r5 @ i0 = buf[ 9] + buf[11]@
|
||||
|
||||
|
||||
sub r2, r2, r4 @ r1 = buf[ 8] - buf[10]@
|
||||
sub r3, r3, r5 @ i1 = buf[ 9] - buf[11]@
|
||||
|
||||
|
||||
add r4, r6, r8 @ r2 = buf[12] + buf[14]@
|
||||
add r5, r7, r9 @ i2 = buf[13] + buf[15]@
|
||||
|
||||
|
||||
sub r6, r6, r8 @ r3 = buf[12] - buf[14]@
|
||||
sub r7, r7, r9 @ i3 = buf[13] - buf[15]@
|
||||
|
||||
|
||||
add r8, r0, r4 @ t0 = (r0 + r2)
|
||||
add r9, r1, r5 @ t1 = (i0 + i2)
|
||||
|
||||
|
||||
sub r0, r0, r4 @ t2 = (r0 - r2)
|
||||
sub r1, r1, r5 @ t3 = (i0 - i2)
|
||||
|
||||
|
||||
mov r8, r8, asr #1
|
||||
ldr r4, [sp]
|
||||
|
||||
|
||||
mov r9, r9, asr #1
|
||||
ldr r5, [sp, #4]
|
||||
|
||||
mov r0, r0, asr #1
|
||||
|
||||
mov r0, r0, asr #1
|
||||
mov r1, r1, asr #1
|
||||
|
||||
|
||||
add r10, r4, r8 @ buf[ 0] = r4 + t0@
|
||||
add r11, r5, r9 @ buf[ 1] = i4 + t1@
|
||||
|
||||
|
||||
sub r4, r4, r8 @ buf[ 8] = r4 - t0@
|
||||
sub r5, r5, r9 @ buf[ 9] = i4 - t1@
|
||||
|
||||
|
||||
strd r10, [r14]
|
||||
strd r4, [r14, #32]
|
||||
|
||||
|
||||
ldr r10, [sp, #8]
|
||||
ldr r11, [sp, #12]
|
||||
|
||||
|
||||
add r4, r10, r1 @ buf[ 4] = r5 + t3@
|
||||
sub r5, r11, r0 @ buf[ 5] = i5 - t2@
|
||||
|
||||
|
||||
sub r10, r10, r1 @ buf[12] = r5 - t3@
|
||||
add r11, r11, r0 @ buf[13] = i5 + t2@
|
||||
|
||||
|
||||
strd r4, [r14, #16]
|
||||
strd r10, [r14, #48]
|
||||
|
||||
|
||||
sub r0, r2, r7 @ r0 = r1 - i3@
|
||||
add r1, r3, r6 @ i0 = i1 + r3@
|
||||
|
||||
|
||||
ldr r11, DATATab
|
||||
|
||||
|
||||
add r2, r2, r7 @ r2 = r1 + i3@
|
||||
sub r3, r3, r6 @ i2 = i1 - r3@
|
||||
|
||||
|
||||
sub r4, r0, r1 @ r0 - i0
|
||||
add r5, r0, r1 @ r0 + i0
|
||||
|
||||
|
||||
sub r0, r2, r3 @ r2 - i2
|
||||
add r1, r2, r3 @ r2 + i2
|
||||
|
||||
smull r8, r6, r4, r11
|
||||
smull r9, r7, r5, r11
|
||||
|
||||
|
||||
smull r8, r6, r4, r11
|
||||
smull r9, r7, r5, r11
|
||||
|
||||
ldr r2, [sp, #16]
|
||||
ldr r3, [sp, #20]
|
||||
|
||||
smull r8, r4, r0, r11
|
||||
smull r9, r5, r1, r11
|
||||
|
||||
|
||||
smull r8, r4, r0, r11
|
||||
smull r9, r5, r1, r11
|
||||
|
||||
ldr r10, [sp, #24]
|
||||
ldr r11, [sp, #28]
|
||||
|
||||
|
||||
sub r8, r2, r6
|
||||
sub r9, r3, r7
|
||||
|
||||
|
||||
add r2, r2, r6
|
||||
add r3, r3, r7
|
||||
|
||||
|
||||
add r6, r10, r5
|
||||
sub r7, r11, r4
|
||||
|
||||
|
||||
sub r0, r10, r5
|
||||
add r1, r11, r4
|
||||
|
||||
|
||||
strd r6, [r14, #8]
|
||||
strd r8, [r14, #24]
|
||||
strd r0, [r14, #40]
|
||||
strd r2, [r14, #56]
|
||||
|
||||
|
||||
subs r12, r12, #1
|
||||
add r14, r14, #64
|
||||
|
||||
|
||||
bne Radix8First_LOOP
|
||||
|
||||
|
||||
Radix8First_END:
|
||||
add sp, sp, #0x24
|
||||
ldmia sp!, {r4 - r11, pc}
|
||||
|
||||
|
||||
DATATab:
|
||||
.word 0x5a82799a
|
||||
|
||||
|
||||
@ENDP @ |Radix8First|
|
||||
.end
|
||||
@@ -25,145 +25,145 @@
|
||||
|
||||
Radix4FFT:
|
||||
stmdb sp!, {r4 - r11, lr}
|
||||
sub sp, sp, #32
|
||||
sub sp, sp, #32
|
||||
|
||||
mov r1, r1, asr #2
|
||||
cmp r1, #0
|
||||
beq Radix4FFT_END
|
||||
|
||||
Radix4FFT_LOOP1:
|
||||
mov r14, r0 @ xptr = buf@
|
||||
cmp r1, #0
|
||||
beq Radix4FFT_END
|
||||
|
||||
Radix4FFT_LOOP1:
|
||||
mov r14, r0 @ xptr = buf@
|
||||
mov r10, r1 @ i = num@
|
||||
mov r9, r2, lsl #3 @ step = 2*bgn@
|
||||
cmp r10, #0
|
||||
str r0, [sp]
|
||||
str r1, [sp, #4]
|
||||
cmp r10, #0
|
||||
str r0, [sp]
|
||||
str r1, [sp, #4]
|
||||
str r2, [sp, #8]
|
||||
str r3, [sp, #12]
|
||||
beq Radix4FFT_LOOP1_END
|
||||
|
||||
Radix4FFT_LOOP2:
|
||||
str r3, [sp, #12]
|
||||
beq Radix4FFT_LOOP1_END
|
||||
|
||||
Radix4FFT_LOOP2:
|
||||
mov r12, r3 @ csptr = twidTab@
|
||||
mov r11, r2 @ j = bgn
|
||||
cmp r11, #0
|
||||
cmp r11, #0
|
||||
str r10, [sp, #16]
|
||||
beq Radix4FFT_LOOP2_END
|
||||
|
||||
Radix4FFT_LOOP3:
|
||||
str r11, [sp, #20]
|
||||
|
||||
beq Radix4FFT_LOOP2_END
|
||||
|
||||
Radix4FFT_LOOP3:
|
||||
str r11, [sp, #20]
|
||||
|
||||
ldrd r0, [r14, #0] @ r0 = xptr[0]@ r1 = xptr[1]@
|
||||
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]@
|
||||
|
||||
|
||||
smulwt r4, r10, r8 @ L_mpy_wx(cosx, t0)
|
||||
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)@
|
||||
smulwb r5, r10, r8 @ L_mpy_wx(sinx, t0)
|
||||
|
||||
|
||||
mov r10, r0, asr #2 @ t0 = r0 >> 2@
|
||||
mov r11, r1, asr #2 @ t1 = r1 >> 2@
|
||||
|
||||
|
||||
sub r3, r3, r5 @ r3 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
|
||||
add r14, r14, r9 @ xptr += step@
|
||||
|
||||
|
||||
sub r0, r10, r2 @ r0 = t0 - r2@
|
||||
sub r1, r11, r3 @ r1 = t1 - r3@
|
||||
|
||||
|
||||
add r2, r10, r2 @ r2 = t0 + r2@
|
||||
add r3, r11, r3 @ r3 = t1 + r3@
|
||||
|
||||
|
||||
str r2, [sp, #24]
|
||||
str r3, [sp, #28]
|
||||
|
||||
|
||||
ldrd r10, [r14, #0] @ r4 = xptr[0]@ r5 = xptr[1]@
|
||||
ldr r8, [r12], #4 @ cosxsinx = csptr[1]@
|
||||
|
||||
|
||||
smulwt r6, r10, r8 @ L_mpy_wx(cosx, t0)
|
||||
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)@
|
||||
smulwb r7, r10, r8 @ L_mpy_wx(sinx, t0)
|
||||
|
||||
|
||||
add r14, r14, r9 @ xptr += step@
|
||||
sub r5, r5, r7 @ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
|
||||
|
||||
|
||||
ldrd r10, [r14] @ r6 = xptr[0]@ r7 = xptr[1]@
|
||||
ldr r8, [r12], #4 @ cosxsinx = csptr[1]@
|
||||
|
||||
|
||||
smulwt r2, r10, r8 @ L_mpy_wx(cosx, t0)
|
||||
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)@
|
||||
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 r6, r10, r6 @ r6 = t0 - r6@
|
||||
add r7, r7, r11 @ r7 = r7 + t1@
|
||||
|
||||
|
||||
ldr r2, [sp, #24]
|
||||
ldr r3, [sp, #28]
|
||||
|
||||
|
||||
add r10, r0, r5 @ xptr[0] = r0 + r5@
|
||||
add r11, r1, r6 @ xptr[0] = r1 + r6
|
||||
|
||||
strd r10, [r14]
|
||||
|
||||
strd r10, [r14]
|
||||
sub r14, r14, r9 @ xptr -= step@
|
||||
|
||||
|
||||
sub r10, r2, r4 @ xptr[0] = r2 - r4@
|
||||
sub r11, r3, r7 @ xptr[1] = r3 - r7@
|
||||
|
||||
strd r10, [r14]
|
||||
|
||||
strd r10, [r14]
|
||||
sub r14, r14, r9 @ xptr -= step@
|
||||
|
||||
|
||||
sub r10, r0, r5 @ xptr[0] = r0 - r5@
|
||||
sub r11, r1, r6 @ xptr[0] = r1 - r6
|
||||
|
||||
strd r10, [r14]
|
||||
|
||||
strd r10, [r14]
|
||||
sub r14, r14, r9 @ xptr -= step@
|
||||
|
||||
|
||||
add r10, r2, r4 @ xptr[0] = r2 - r4@
|
||||
add r11, r3, r7 @ xptr[1] = r3 - r7@
|
||||
|
||||
strd r10, [r14]
|
||||
|
||||
strd r10, [r14]
|
||||
add r14, r14, #8 @ xptr += 2@
|
||||
|
||||
|
||||
ldr r11, [sp, #20]
|
||||
subs r11, r11, #1
|
||||
bne Radix4FFT_LOOP3
|
||||
|
||||
Radix4FFT_LOOP2_END:
|
||||
bne Radix4FFT_LOOP3
|
||||
|
||||
Radix4FFT_LOOP2_END:
|
||||
ldr r10, [sp, #16]
|
||||
ldr r3, [sp, #12]
|
||||
ldr r2, [sp, #8]
|
||||
rsb r8, r9, r9, lsl #2
|
||||
rsb r8, r9, r9, lsl #2
|
||||
sub r10, r10, #1
|
||||
add r14, r14, r8
|
||||
cmp r10, #0
|
||||
bhi Radix4FFT_LOOP2
|
||||
|
||||
Radix4FFT_LOOP1_END:
|
||||
ldr r0, [sp]
|
||||
add r14, r14, r8
|
||||
cmp r10, #0
|
||||
bhi Radix4FFT_LOOP2
|
||||
|
||||
Radix4FFT_LOOP1_END:
|
||||
ldr r0, [sp]
|
||||
ldr r1, [sp, #4]
|
||||
add r3, r3, r8, asr #1
|
||||
mov r2, r2, lsl #2
|
||||
movs r1, r1, asr #2
|
||||
bne Radix4FFT_LOOP1
|
||||
|
||||
Radix4FFT_END:
|
||||
add sp, sp, #32
|
||||
mov r2, r2, lsl #2
|
||||
movs r1, r1, asr #2
|
||||
bne Radix4FFT_LOOP1
|
||||
|
||||
Radix4FFT_END:
|
||||
add sp, sp, #32
|
||||
ldmia sp!, {r4 - r11, pc}
|
||||
|
||||
|
||||
@ENDP @ |Radix4FFT|
|
||||
.end
|
||||
@@ -26,31 +26,31 @@
|
||||
.global CalcBandEnergy
|
||||
|
||||
CalcBandEnergy:
|
||||
stmdb sp!, {r4 - r11, lr}
|
||||
|
||||
mov r2, r2, lsl #16
|
||||
stmdb sp!, {r4 - r11, lr}
|
||||
|
||||
mov r2, r2, lsl #16
|
||||
ldr r12, [r13, #36]
|
||||
mov r9, #0
|
||||
mov r5, r2, asr #16
|
||||
mov r4, #0
|
||||
cmp r5, #0
|
||||
ble L212
|
||||
mov r5, r2, asr #16
|
||||
mov r4, #0
|
||||
cmp r5, #0
|
||||
ble L212
|
||||
|
||||
L22:
|
||||
mov r2, r4, lsl #1
|
||||
ldrsh r10, [r1, r2]
|
||||
add r11, r1, r2
|
||||
ldrsh r2, [r11, #2]
|
||||
mov r14, #0
|
||||
cmp r10, r2
|
||||
bge L28
|
||||
|
||||
mov r2, r4, lsl #1
|
||||
ldrsh r10, [r1, r2]
|
||||
add r11, r1, r2
|
||||
ldrsh r2, [r11, #2]
|
||||
mov r14, #0
|
||||
cmp r10, r2
|
||||
bge L28
|
||||
|
||||
L23:
|
||||
ldr r11, [r0, +r10, lsl #2]
|
||||
add r10, r10, #1
|
||||
ldr r6, [r0, +r10, lsl #2]
|
||||
ldr r11, [r0, +r10, lsl #2]
|
||||
add r10, r10, #1
|
||||
ldr r6, [r0, +r10, lsl #2]
|
||||
smull r11, r7, r11, r11
|
||||
add r10, r10, #1
|
||||
add r10, r10, #1
|
||||
smull r6, r8, r6, r6
|
||||
ldr r11, [r0, +r10, lsl #2]
|
||||
qadd r14, r14, r7
|
||||
@@ -59,71 +59,71 @@ L23:
|
||||
ldr r6, [r0, +r10, lsl #2]
|
||||
qadd r14, r14, r8
|
||||
smull r6, r8, r6, r6
|
||||
add r10, r10, #1
|
||||
add r10, r10, #1
|
||||
qadd r14, r14, r7
|
||||
cmp r10, r2
|
||||
qadd r14, r14, r8
|
||||
blt L23
|
||||
blt L23
|
||||
|
||||
L28:
|
||||
L28:
|
||||
qadd r14, r14, r14
|
||||
str r14, [r3, +r4, lsl #2]
|
||||
add r4, r4, #1
|
||||
add r4, r4, #1
|
||||
qadd r9, r9, r14
|
||||
cmp r4, r5
|
||||
cmp r4, r5
|
||||
|
||||
blt L22
|
||||
blt L22
|
||||
|
||||
L212:
|
||||
str r9, [r12, #0]
|
||||
L212:
|
||||
str r9, [r12, #0]
|
||||
ldmia sp!, {r4 - r11, pc}
|
||||
|
||||
|
||||
@ENDP ; |CalcBandEnergy|
|
||||
|
||||
|
||||
.global CalcBandEnergyMS
|
||||
|
||||
CalcBandEnergyMS:
|
||||
stmdb sp!, {r4 - r11, lr}
|
||||
sub r13, r13, #24
|
||||
|
||||
mov r12, #0
|
||||
mov r3, r3, lsl #16
|
||||
mov r14, #0
|
||||
mov r3, r3, asr #16
|
||||
cmp r3, #0
|
||||
mov r4, #0
|
||||
ble L315
|
||||
|
||||
L32:
|
||||
|
||||
mov r12, #0
|
||||
mov r3, r3, lsl #16
|
||||
mov r14, #0
|
||||
mov r3, r3, asr #16
|
||||
cmp r3, #0
|
||||
mov r4, #0
|
||||
ble L315
|
||||
|
||||
L32:
|
||||
mov r5, r4, lsl #1
|
||||
mov r6, #0
|
||||
ldrsh r10, [r2, r5]
|
||||
add r5, r2, r5
|
||||
mov r7, #0
|
||||
ldrsh r11, [r5, #2]
|
||||
cmp r10, r11
|
||||
bge L39
|
||||
ldrsh r11, [r5, #2]
|
||||
cmp r10, r11
|
||||
bge L39
|
||||
|
||||
str r3, [r13, #4]
|
||||
str r4, [r13, #8]
|
||||
str r12, [r13, #12]
|
||||
str r14, [r13, #16]
|
||||
|
||||
L33:
|
||||
ldr r8, [r0, +r10, lsl #2]
|
||||
L33:
|
||||
ldr r8, [r0, +r10, lsl #2]
|
||||
ldr r9, [r1, +r10, lsl #2]
|
||||
mov r8, r8, asr #1
|
||||
add r10, r10, #1
|
||||
mov r9, r9, asr #1
|
||||
|
||||
ldr r12, [r0, +r10, lsl #2]
|
||||
add r5, r8, r9
|
||||
ldr r12, [r0, +r10, lsl #2]
|
||||
add r5, r8, r9
|
||||
ldr r14, [r1, +r10, lsl #2]
|
||||
sub r8, r8, r9
|
||||
|
||||
smull r5, r3, r5, r5
|
||||
smull r5, r3, r5, r5
|
||||
mov r12, r12, asr #1
|
||||
smull r8, r4, r8, r8
|
||||
smull r8, r4, r8, r8
|
||||
mov r14, r14, asr #1
|
||||
|
||||
qadd r6, r6, r3
|
||||
@@ -131,27 +131,27 @@ L33:
|
||||
qadd r7, r7, r4
|
||||
sub r8, r12, r14
|
||||
|
||||
smull r5, r3, r5, r5
|
||||
smull r5, r3, r5, r5
|
||||
add r10, r10, #1
|
||||
smull r8, r4, r8, r8
|
||||
|
||||
smull r8, r4, r8, r8
|
||||
|
||||
qadd r6, r6, r3
|
||||
qadd r7, r7, r4
|
||||
|
||||
ldr r8, [r0, +r10, lsl #2]
|
||||
ldr r8, [r0, +r10, lsl #2]
|
||||
ldr r9, [r1, +r10, lsl #2]
|
||||
mov r8, r8, asr #1
|
||||
add r10, r10, #1
|
||||
mov r9, r9, asr #1
|
||||
|
||||
ldr r12, [r0, +r10, lsl #2]
|
||||
add r5, r8, r9
|
||||
ldr r12, [r0, +r10, lsl #2]
|
||||
add r5, r8, r9
|
||||
ldr r14, [r1, +r10, lsl #2]
|
||||
sub r8, r8, r9
|
||||
|
||||
smull r5, r3, r5, r5
|
||||
smull r5, r3, r5, r5
|
||||
mov r12, r12, asr #1
|
||||
smull r8, r4, r8, r8
|
||||
smull r8, r4, r8, r8
|
||||
mov r14, r14, asr #1
|
||||
|
||||
qadd r6, r6, r3
|
||||
@@ -159,37 +159,37 @@ L33:
|
||||
qadd r7, r7, r4
|
||||
sub r8, r12, r14
|
||||
|
||||
smull r5, r3, r5, r5
|
||||
smull r5, r3, r5, r5
|
||||
add r10, r10, #1
|
||||
smull r8, r4, r8, r8
|
||||
|
||||
smull r8, r4, r8, r8
|
||||
|
||||
qadd r6, r6, r3
|
||||
qadd r7, r7, r4
|
||||
|
||||
cmp r10, r11
|
||||
|
||||
|
||||
blt L33
|
||||
|
||||
ldr r3, [r13, #4]
|
||||
ldr r4, [r13, #8]
|
||||
ldr r4, [r13, #8]
|
||||
ldr r12, [r13, #12]
|
||||
ldr r14, [r13, #16]
|
||||
L39:
|
||||
L39:
|
||||
qadd r6, r6, r6
|
||||
qadd r7, r7, r7
|
||||
|
||||
qadd r7, r7, r7
|
||||
|
||||
ldr r8, [r13, #60]
|
||||
ldr r9, [r13, #68]
|
||||
|
||||
qadd r12, r12, r6
|
||||
qadd r14, r14, r7
|
||||
|
||||
str r6, [r8, +r4, lsl #2]
|
||||
str r7, [r9, +r4, lsl #2]
|
||||
|
||||
|
||||
str r6, [r8, +r4, lsl #2]
|
||||
str r7, [r9, +r4, lsl #2]
|
||||
|
||||
add r4, r4, #1
|
||||
cmp r4, r3
|
||||
blt L32
|
||||
blt L32
|
||||
|
||||
L315:
|
||||
ldr r8, [r13, #64]
|
||||
|
||||
@@ -26,53 +26,53 @@
|
||||
|
||||
PreMDCT:
|
||||
stmdb sp!, {r4 - r11, lr}
|
||||
|
||||
|
||||
add r9, r0, r1, lsl #2
|
||||
sub r3, r9, #32
|
||||
|
||||
movs r1, r1, asr #2
|
||||
beq PreMDCT_END
|
||||
|
||||
beq PreMDCT_END
|
||||
|
||||
PreMDCT_LOOP:
|
||||
VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *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 {d13, d15}, [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
|
||||
|
||||
|
||||
|
||||
VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1)
|
||||
VQDMULH.S32 Q11, Q1, Q8 @ MULHIGH(sina, ti1)
|
||||
VQDMULH.S32 Q12, Q0, Q8 @ MULHIGH(cosa, ti1)
|
||||
VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1)
|
||||
|
||||
|
||||
VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
||||
VSUB.S32 Q1, Q12, Q13 @ *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1)@
|
||||
|
||||
|
||||
VST2.I32 {d0, d1, d2, d3}, [r0]!
|
||||
sub r3, r3, #32
|
||||
|
||||
|
||||
VQDMULH.S32 Q10, Q2, Q9 @ MULHIGH(cosb, tr2)
|
||||
VQDMULH.S32 Q11, Q3, Q5 @ MULHIGH(sinb, ti2)
|
||||
VQDMULH.S32 Q12, Q2, Q5 @ MULHIGH(cosb, ti2)
|
||||
VQDMULH.S32 Q13, Q3, Q9 @ MULHIGH(sinb, tr2)
|
||||
|
||||
|
||||
VADD.S32 Q0, Q10, Q11 @ MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@
|
||||
VSUB.S32 Q1, Q12, Q13 @ MULHIGH(cosa, ti2) - MULHIGH(sina, tr2)@
|
||||
|
||||
|
||||
VREV64.32 Q3, Q1
|
||||
VREV64.32 Q2, Q0
|
||||
|
||||
VST2.I32 {d5, d7}, [r3]!
|
||||
VST2.I32 {d4, d6}, [r3]!
|
||||
|
||||
|
||||
VST2.I32 {d5, d7}, [r3]!
|
||||
VST2.I32 {d4, d6}, [r3]!
|
||||
|
||||
subs r1, r1, #4
|
||||
sub r3, r3, #64
|
||||
sub r3, r3, #64
|
||||
bne PreMDCT_LOOP
|
||||
|
||||
|
||||
PreMDCT_END:
|
||||
ldmia sp!, {r4 - r11, pc}
|
||||
@ENDP @ |PreMDCT|
|
||||
@@ -82,50 +82,50 @@ PreMDCT_END:
|
||||
|
||||
PostMDCT:
|
||||
stmdb sp!, {r4 - r11, lr}
|
||||
|
||||
|
||||
add r9, r0, r1, lsl #2
|
||||
sub r3, r9, #32
|
||||
|
||||
movs r1, r1, asr #2
|
||||
beq PostMDCT_END
|
||||
|
||||
|
||||
PostMDCT_LOOP:
|
||||
VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *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 {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 Q11, Q1, Q5 @ MULHIGH(sina, ti1)
|
||||
VQDMULH.S32 Q12, Q0, Q5 @ MULHIGH(cosa, ti1)
|
||||
VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1)
|
||||
|
||||
|
||||
VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
|
||||
VSUB.S32 Q5, Q13, Q12 @ *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1)@
|
||||
|
||||
|
||||
VQDMULH.S32 Q10, Q2, Q8 @ MULHIGH(cosb, tr2)
|
||||
VQDMULH.S32 Q11, Q3, Q9 @ MULHIGH(sinb, ti2)
|
||||
VQDMULH.S32 Q12, Q2, Q9 @ MULHIGH(cosb, ti2)
|
||||
VQDMULH.S32 Q13, Q3, Q8 @ MULHIGH(sinb, tr2)
|
||||
|
||||
|
||||
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 Q3, Q5
|
||||
|
||||
sub r3, r3, #32
|
||||
VREV64.32 Q3, Q5
|
||||
|
||||
sub r3, r3, #32
|
||||
VST2.I32 {d0, d1, d2, d3}, [r0]!
|
||||
|
||||
VST2.I32 {d5, d7}, [r3]!
|
||||
VST2.I32 {d4, d6}, [r3]!
|
||||
|
||||
|
||||
VST2.I32 {d5, d7}, [r3]!
|
||||
VST2.I32 {d4, d6}, [r3]!
|
||||
|
||||
subs r1, r1, #4
|
||||
sub r3, r3, #64
|
||||
sub r3, r3, #64
|
||||
bne PostMDCT_LOOP
|
||||
|
||||
PostMDCT_END:
|
||||
|
||||
@@ -29,86 +29,86 @@ Radix8First:
|
||||
|
||||
ldr r3, SQRT1_2
|
||||
cmp r1, #0
|
||||
|
||||
VDUP.I32 Q15, r3
|
||||
|
||||
VDUP.I32 Q15, r3
|
||||
beq Radix8First_END
|
||||
|
||||
|
||||
Radix8First_LOOP:
|
||||
VLD1.I32 {d0, d1, d2, d3}, [r0]!
|
||||
VLD1.I32 {d8, d9, d10, d11}, [r0]!
|
||||
|
||||
|
||||
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 d7, d2, d3 @ r2 = buf[4] - buf[6]@i2 = buf[5] - buf[7]@
|
||||
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]@
|
||||
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)
|
||||
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]@
|
||||
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]@
|
||||
VREV64.I32 d7, d7
|
||||
VREV64.I32 d7, d7
|
||||
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@
|
||||
VSUB.S32 Q5, Q2, Q3 @ t2 = (r0 - r2) >> 1@t3 = (i0 - i2) >> 1@r0 = r1 - i3@i2 = i1 - r3@
|
||||
|
||||
|
||||
VREV64.I32 d3, d3
|
||||
|
||||
VSHR.S32 d8, d8, #1
|
||||
|
||||
VSHR.S32 d8, d8, #1
|
||||
VSHR.S32 Q0, Q0, #1
|
||||
VREV64.I32 d10, d10
|
||||
VTRN.32 d11, d9
|
||||
VSHR.S32 Q1, Q1, #1
|
||||
VSHR.S32 d10, d10, #1
|
||||
VREV64.I32 d9, d9
|
||||
|
||||
|
||||
sub r0, r0, #0x40
|
||||
|
||||
|
||||
VADD.S32 d12, d0, d8
|
||||
VSUB.S32 d16, d0, d8
|
||||
VSUB.S32 d16, d0, d8
|
||||
VADD.S32 d14, d2, d10
|
||||
VSUB.S32 d18, d2, d10
|
||||
|
||||
|
||||
VSUB.S32 d4, d11, d9
|
||||
VADD.S32 d5, d11, d9
|
||||
|
||||
|
||||
VREV64.I32 d18, d18
|
||||
|
||||
|
||||
VQDMULH.S32 Q3, Q2, Q15
|
||||
VTRN.32 d14, d18
|
||||
VTRN.32 d6, d7
|
||||
VREV64.I32 d18, d18
|
||||
|
||||
VREV64.I32 d18, d18
|
||||
|
||||
VSUB.S32 d15, d3, d6
|
||||
VREV64.I32 d7, d7
|
||||
VADD.S32 d19, d3, d6
|
||||
VADD.S32 d13, d1, d7
|
||||
VSUB.S32 d17, d1, d7
|
||||
|
||||
|
||||
VREV64.I32 d17, d17
|
||||
VTRN.32 d13, d17
|
||||
VREV64.I32 d17, d17
|
||||
|
||||
subs r1, r1, #1
|
||||
|
||||
|
||||
subs r1, r1, #1
|
||||
|
||||
VST1.I32 {d12, d13, d14, d15}, [r0]!
|
||||
VST1.I32 {d16, d17, d18, d19}, [r0]!
|
||||
VST1.I32 {d16, d17, d18, d19}, [r0]!
|
||||
bne Radix8First_LOOP
|
||||
|
||||
|
||||
Radix8First_END:
|
||||
ldmia sp!, {r4 - r11, pc}
|
||||
ldmia sp!, {r4 - r11, pc}
|
||||
SQRT1_2:
|
||||
.word 0x2d413ccd
|
||||
|
||||
|
||||
@ENDP @ |Radix8First|
|
||||
|
||||
|
||||
.section .text
|
||||
.global Radix4First
|
||||
|
||||
@@ -117,28 +117,28 @@ Radix4First:
|
||||
|
||||
cmp r1, #0
|
||||
beq Radix4First_END
|
||||
|
||||
|
||||
Radix4First_LOOP:
|
||||
VLD1.I32 {d0, d1, d2, d3}, [r0]
|
||||
|
||||
VADD.S32 d4, d0, d1 @ r0 = buf[0] + buf[2]@ r1 = buf[1] + buf[3]@
|
||||
VLD1.I32 {d0, d1, d2, d3}, [r0]
|
||||
|
||||
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 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]@
|
||||
|
||||
VREV64.I32 d7, d7 @
|
||||
|
||||
|
||||
VREV64.I32 d7, d7 @
|
||||
|
||||
VADD.S32 Q4, Q2, Q3
|
||||
VSUB.S32 Q5, Q2, Q3
|
||||
|
||||
|
||||
VREV64.I32 d11, d11
|
||||
VTRN.32 d9, d11
|
||||
subs r1, r1, #1
|
||||
subs r1, r1, #1
|
||||
VREV64.I32 d11, d11
|
||||
VST1.I32 {d8, d9, d10, d11}, [r0]!
|
||||
|
||||
bne Radix4First_LOOP
|
||||
|
||||
|
||||
Radix4First_END:
|
||||
ldmia sp!, {r4 - r11, pc}
|
||||
|
||||
|
||||
@@ -28,116 +28,116 @@ Radix4FFT:
|
||||
stmdb sp!, {r4 - r11, lr}
|
||||
|
||||
mov r1, r1, asr #2
|
||||
cmp r1, #0
|
||||
beq Radix4FFT_END
|
||||
|
||||
Radix4FFT_LOOP1:
|
||||
mov r5, r2, lsl #1
|
||||
mov r8, r0
|
||||
mov r7, r1
|
||||
mov r5, r5, lsl #2
|
||||
cmp r1, #0
|
||||
rsbeq r12, r5, r5, lsl #2
|
||||
beq Radix4FFT_LOOP1_END
|
||||
|
||||
rsb r12, r5, r5, lsl #2
|
||||
|
||||
Radix4FFT_LOOP2:
|
||||
mov r6, r3
|
||||
mov r4, r2
|
||||
cmp r2, #0
|
||||
beq Radix4FFT_LOOP2_END
|
||||
|
||||
Radix4FFT_LOOP3:
|
||||
cmp r1, #0
|
||||
beq Radix4FFT_END
|
||||
|
||||
Radix4FFT_LOOP1:
|
||||
mov r5, r2, lsl #1
|
||||
mov r8, r0
|
||||
mov r7, r1
|
||||
mov r5, r5, lsl #2
|
||||
cmp r1, #0
|
||||
rsbeq r12, r5, r5, lsl #2
|
||||
beq Radix4FFT_LOOP1_END
|
||||
|
||||
rsb r12, r5, r5, lsl #2
|
||||
|
||||
Radix4FFT_LOOP2:
|
||||
mov r6, r3
|
||||
mov r4, r2
|
||||
cmp r2, #0
|
||||
beq Radix4FFT_LOOP2_END
|
||||
|
||||
Radix4FFT_LOOP3:
|
||||
@r0 = xptr[0]@
|
||||
@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]@
|
||||
|
||||
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]@
|
||||
|
||||
|
||||
VQDMULH.S32 Q10, Q2, Q14 @ MULHIGH(cosx, t0)
|
||||
VQDMULH.S32 Q11, Q3, Q15 @ MULHIGH(sinx, t1)
|
||||
VQDMULH.S32 Q12, Q3, Q14 @ MULHIGH(cosx, t1)
|
||||
VQDMULH.S32 Q13, Q2, Q15 @ MULHIGH(sinx, t0)
|
||||
|
||||
|
||||
VADD.S32 Q2, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
|
||||
VSUB.S32 Q3, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
|
||||
|
||||
|
||||
add r8, r8, r5 @ xptr += step@
|
||||
VSHR.S32 Q10, Q0, #2 @ t0 = r0 >> 2@
|
||||
VSHR.S32 Q11, Q1, #2 @ t1 = r1 >> 2@
|
||||
|
||||
|
||||
VSUB.S32 Q0, Q10, Q2 @ r0 = t0 - r2@
|
||||
VSUB.S32 Q1, Q11, Q3 @ r1 = t1 - r3@
|
||||
VADD.S32 Q2, Q10, Q2 @ r2 = t0 + r2@
|
||||
VADD.S32 Q3, Q11, Q3 @ r3 = t1 + r3@
|
||||
|
||||
VLD2.I32 {D8, D9, D10, D11}, [r8]
|
||||
VLD2.I32 {D28, D29, D30, D31}, [r6]!
|
||||
|
||||
VLD2.I32 {D8, D9, D10, D11}, [r8]
|
||||
VLD2.I32 {D28, D29, D30, D31}, [r6]!
|
||||
add r8, r8, r5
|
||||
|
||||
VQDMULH.S32 Q10, Q4, Q14 @ MULHIGH(cosx, t0)
|
||||
VQDMULH.S32 Q11, Q5, Q15 @ MULHIGH(sinx, t1)
|
||||
VQDMULH.S32 Q12, Q5, Q14 @ MULHIGH(cosx, t1)
|
||||
VQDMULH.S32 Q13, Q4, Q15 @ MULHIGH(sinx, t0)
|
||||
|
||||
|
||||
VADD.S32 Q8, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
|
||||
VSUB.S32 Q9, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
|
||||
|
||||
VLD2.I32 {D12, D13, D14, D15}, [r8]
|
||||
VSUB.S32 Q9, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
|
||||
|
||||
VLD2.I32 {D12, D13, D14, D15}, [r8]
|
||||
VLD2.I32 {D28, D29, D30, D31}, [r6]!
|
||||
|
||||
|
||||
VQDMULH.S32 Q10, Q6, Q14 @ MULHIGH(cosx, t0)
|
||||
VQDMULH.S32 Q11, Q7, Q15 @ MULHIGH(sinx, t1)
|
||||
VQDMULH.S32 Q12, Q7, Q14 @ MULHIGH(cosx, t1)
|
||||
VQDMULH.S32 Q13, Q6, Q15 @ MULHIGH(sinx, t0)
|
||||
|
||||
|
||||
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@
|
||||
VSUB.S32 Q5, Q7, Q9 @ r5 = r7 - t1@
|
||||
VSUB.S32 Q6, Q8, Q6 @ r6 = t0 - r6@
|
||||
VADD.S32 Q7, Q7, Q9 @ r7 = r7 + t1@
|
||||
|
||||
|
||||
VADD.S32 Q8, Q0, Q5 @ xptr[0] = r0 + r5@
|
||||
VADD.S32 Q9, Q1, Q6 @ xptr[1] = r1 + r6@
|
||||
VST2.I32 {D16, D17, D18, D19}, [r8]
|
||||
|
||||
|
||||
VSUB.S32 Q10, Q2, Q4 @ xptr[0] = r2 - r4@
|
||||
sub r8, r8, r5 @ xptr -= step@
|
||||
VSUB.S32 Q11, Q3, Q7 @ xptr[1] = r3 - r7@
|
||||
VST2.I32 {D20, D21, D22, D23}, [r8]
|
||||
|
||||
|
||||
VSUB.S32 Q8, Q0, Q5 @ xptr[0] = r0 - r5@
|
||||
sub r8, r8, r5 @ xptr -= step@
|
||||
VSUB.S32 Q9, Q1, Q6 @ xptr[1] = r1 - r6@
|
||||
VST2.I32 {D16, D17, D18, D19}, [r8]
|
||||
|
||||
|
||||
VADD.S32 Q10, Q2, Q4 @ xptr[0] = r2 + r4@
|
||||
sub r8, r8, r5 @ xptr -= step@
|
||||
VADD.S32 Q11, Q3, Q7 @ xptr[1] = r3 + r7@
|
||||
VST2.I32 {D20, D21, D22, D23}, [r8]!
|
||||
|
||||
subs r4, r4, #4
|
||||
bne Radix4FFT_LOOP3
|
||||
|
||||
Radix4FFT_LOOP2_END:
|
||||
add r8, r8, r12
|
||||
sub r7, r7, #1
|
||||
|
||||
subs r4, r4, #4
|
||||
bne Radix4FFT_LOOP3
|
||||
|
||||
Radix4FFT_LOOP2_END:
|
||||
add r8, r8, r12
|
||||
sub r7, r7, #1
|
||||
cmp r7, #0
|
||||
bhi Radix4FFT_LOOP2
|
||||
|
||||
Radix4FFT_LOOP1_END:
|
||||
add r3, r12, r3
|
||||
mov r2, r2, lsl #2
|
||||
movs r1, r1, asr #2
|
||||
bne Radix4FFT_LOOP1
|
||||
|
||||
Radix4FFT_END:
|
||||
bhi Radix4FFT_LOOP2
|
||||
|
||||
Radix4FFT_LOOP1_END:
|
||||
add r3, r12, r3
|
||||
mov r2, r2, lsl #2
|
||||
movs r1, r1, asr #2
|
||||
bne Radix4FFT_LOOP1
|
||||
|
||||
Radix4FFT_END:
|
||||
ldmia sp!, {r4 - r11, pc}
|
||||
|
||||
|
||||
@ENDP @ |Radix4FFT|
|
||||
.end
|
||||
@@ -37,18 +37,18 @@ void CalcBandEnergy(const Word32 *mdctSpectrum,
|
||||
Word32 *bandEnergySum)
|
||||
{
|
||||
Word32 i, j;
|
||||
Word32 accuSum = 0;
|
||||
Word32 accuSum = 0;
|
||||
|
||||
for (i=0; i<numBands; i++) {
|
||||
Word32 accu = 0;
|
||||
Word32 accu = 0;
|
||||
for (j=bandOffset[i]; j<bandOffset[i+1]; j++)
|
||||
accu = L_add(accu, MULHIGH(mdctSpectrum[j], mdctSpectrum[j]));
|
||||
|
||||
accu = L_add(accu, 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 accuMidSum = 0;
|
||||
Word32 accuSideSum = 0;
|
||||
|
||||
Word32 accuMidSum = 0;
|
||||
Word32 accuSideSum = 0;
|
||||
|
||||
|
||||
for(i=0; i<numBands; i++) {
|
||||
Word32 accuMid = 0;
|
||||
Word32 accuSide = 0;
|
||||
Word32 accuSide = 0;
|
||||
for (j=bandOffset[i]; j<bandOffset[i+1]; j++) {
|
||||
Word32 specm, specs;
|
||||
Word32 specm, specs;
|
||||
Word32 l, r;
|
||||
|
||||
l = mdctSpectrumLeft[j] >> 1;
|
||||
@@ -86,17 +86,17 @@ void CalcBandEnergyMS(const Word32 *mdctSpectrumLeft,
|
||||
accuMid = L_add(accuMid, MULHIGH(specm, specm));
|
||||
accuSide = L_add(accuSide, MULHIGH(specs, specs));
|
||||
}
|
||||
|
||||
|
||||
accuMid = L_add(accuMid, accuMid);
|
||||
accuSide = L_add(accuSide, accuSide);
|
||||
bandEnergyMid[i] = accuMid;
|
||||
bandEnergyMid[i] = accuMid;
|
||||
accuMidSum = L_add(accuMidSum, accuMid);
|
||||
bandEnergySide[i] = accuSide;
|
||||
bandEnergySide[i] = accuSide;
|
||||
accuSideSum = L_add(accuSideSum, accuSide);
|
||||
|
||||
|
||||
}
|
||||
*bandEnergyMidSum = accuMidSum;
|
||||
*bandEnergySideSum = accuSideSum;
|
||||
*bandEnergyMidSum = accuMidSum;
|
||||
*bandEnergySideSum = accuSideSum;
|
||||
}
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -32,15 +32,15 @@ static void updateBitBufWordPtr(HANDLE_BIT_BUF hBitBuf,
|
||||
UWord8 **pBitBufWord,
|
||||
Word16 cnt)
|
||||
{
|
||||
*pBitBufWord += cnt;
|
||||
*pBitBufWord += cnt;
|
||||
|
||||
|
||||
|
||||
if(*pBitBufWord > hBitBuf->pBitBufEnd) {
|
||||
*pBitBufWord -= (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1);
|
||||
*pBitBufWord -= (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1);
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
|
||||
hBitBuf->pBitBufBase = pBitBufBase;
|
||||
hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
|
||||
hBitBuf->pBitBufBase = pBitBufBase;
|
||||
hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
|
||||
|
||||
hBitBuf->pWriteNext = pBitBufBase;
|
||||
hBitBuf->pWriteNext = pBitBufBase;
|
||||
|
||||
hBitBuf->cache = 0;
|
||||
|
||||
hBitBuf->wBitPos = 0;
|
||||
hBitBuf->cntBits = 0;
|
||||
|
||||
hBitBuf->size = (bitBufSize << 3);
|
||||
hBitBuf->isValid = 1;
|
||||
|
||||
hBitBuf->wBitPos = 0;
|
||||
hBitBuf->cntBits = 0;
|
||||
|
||||
hBitBuf->size = (bitBufSize << 3);
|
||||
hBitBuf->isValid = 1;
|
||||
|
||||
return hBitBuf;
|
||||
}
|
||||
@@ -82,8 +82,8 @@ HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf,
|
||||
void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf)
|
||||
{
|
||||
if(*hBitBuf)
|
||||
(*hBitBuf)->isValid = 0;
|
||||
*hBitBuf = NULL;
|
||||
(*hBitBuf)->isValid = 0;
|
||||
*hBitBuf = NULL;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -96,15 +96,15 @@ void ResetBitBuf(HANDLE_BIT_BUF hBitBuf,
|
||||
UWord8 *pBitBufBase,
|
||||
Word16 bitBufSize)
|
||||
{
|
||||
hBitBuf->pBitBufBase = pBitBufBase;
|
||||
hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
|
||||
hBitBuf->pBitBufBase = pBitBufBase;
|
||||
hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
|
||||
|
||||
|
||||
hBitBuf->pWriteNext = pBitBufBase;
|
||||
|
||||
hBitBuf->wBitPos = 0;
|
||||
hBitBuf->cntBits = 0;
|
||||
|
||||
hBitBuf->pWriteNext = pBitBufBase;
|
||||
|
||||
hBitBuf->wBitPos = 0;
|
||||
hBitBuf->cntBits = 0;
|
||||
|
||||
hBitBuf->cache = 0;
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ void ResetBitBuf(HANDLE_BIT_BUF hBitBuf,
|
||||
void CopyBitBuf(HANDLE_BIT_BUF hBitBufSrc,
|
||||
HANDLE_BIT_BUF hBitBufDst)
|
||||
{
|
||||
*hBitBufDst = *hBitBufSrc;
|
||||
*hBitBufDst = *hBitBufSrc;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -148,25 +148,25 @@ Word16 WriteBits(HANDLE_BIT_BUF hBitBuf,
|
||||
if(noBitsToWrite == 0)
|
||||
return noBitsToWrite;
|
||||
|
||||
hBitBuf->cntBits += noBitsToWrite;
|
||||
hBitBuf->cntBits += noBitsToWrite;
|
||||
|
||||
wBitPos = hBitBuf->wBitPos;
|
||||
wBitPos += noBitsToWrite;
|
||||
writeValue <<= 32 - wBitPos;
|
||||
writeValue <<= 32 - wBitPos;
|
||||
writeValue |= hBitBuf->cache;
|
||||
|
||||
while (wBitPos >= 8)
|
||||
|
||||
while (wBitPos >= 8)
|
||||
{
|
||||
UWord8 tmp;
|
||||
tmp = (UWord8)((writeValue >> 24) & 0xFF);
|
||||
|
||||
*hBitBuf->pWriteNext++ = tmp;
|
||||
|
||||
*hBitBuf->pWriteNext++ = tmp;
|
||||
writeValue <<= 8;
|
||||
wBitPos -= 8;
|
||||
}
|
||||
|
||||
|
||||
hBitBuf->wBitPos = wBitPos;
|
||||
hBitBuf->cache = writeValue;
|
||||
|
||||
|
||||
return noBitsToWrite;
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ static Word32 encodeSpectralData(Word16 *sfbOffset,
|
||||
Word16 i,sfb;
|
||||
Word16 dbgVal;
|
||||
SECTION_INFO* psectioninfo;
|
||||
dbgVal = GetBitsAvail(hBitStream);
|
||||
dbgVal = GetBitsAvail(hBitStream);
|
||||
|
||||
for(i=0; i<sectionData->noOfSections; i++) {
|
||||
psectioninfo = &(sectionData->sectionInfo[i]);
|
||||
@@ -100,7 +100,7 @@ static void encodeIcsInfo(Word16 blockType,
|
||||
WriteBits(hBitStream,blockType,2);
|
||||
WriteBits(hBitStream,windowShape,1);
|
||||
|
||||
|
||||
|
||||
switch(blockType){
|
||||
case LONG_WINDOW:
|
||||
case START_WINDOW:
|
||||
@@ -137,30 +137,30 @@ static Word32 encodeSectionData(SECTION_DATA *sectionData,
|
||||
Word16 sectLen;
|
||||
Word16 i;
|
||||
Word16 dbgVal=GetBitsAvail(hBitStream);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
switch(sectionData->blockType)
|
||||
{
|
||||
case LONG_WINDOW:
|
||||
case START_WINDOW:
|
||||
case STOP_WINDOW:
|
||||
sectEscapeVal = SECT_ESC_VAL_LONG;
|
||||
sectLenBits = SECT_BITS_LONG;
|
||||
sectEscapeVal = SECT_ESC_VAL_LONG;
|
||||
sectLenBits = SECT_BITS_LONG;
|
||||
break;
|
||||
|
||||
case SHORT_WINDOW:
|
||||
sectEscapeVal = SECT_ESC_VAL_SHORT;
|
||||
sectLenBits = SECT_BITS_SHORT;
|
||||
sectEscapeVal = SECT_ESC_VAL_SHORT;
|
||||
sectLenBits = SECT_BITS_SHORT;
|
||||
break;
|
||||
}
|
||||
|
||||
for(i=0;i<sectionData->noOfSections;i++) {
|
||||
WriteBits(hBitStream,sectionData->sectionInfo[i].codeBook,4);
|
||||
sectLen = sectionData->sectionInfo[i].sfbCnt;
|
||||
sectLen = sectionData->sectionInfo[i].sfbCnt;
|
||||
|
||||
while(sectLen >= sectEscapeVal) {
|
||||
|
||||
|
||||
WriteBits(hBitStream,sectEscapeVal,sectLenBits);
|
||||
sectLen = sectLen - sectEscapeVal;
|
||||
}
|
||||
@@ -183,24 +183,24 @@ static Word32 encodeScaleFactorData(UWord16 *maxValueInSfb,
|
||||
{
|
||||
Word16 i,j,lastValScf,deltaScf;
|
||||
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++){
|
||||
psectioninfo = &(sectionData->sectionInfo[i]);
|
||||
psectioninfo = &(sectionData->sectionInfo[i]);
|
||||
if (psectioninfo->codeBook != CODE_BOOK_ZERO_NO){
|
||||
for (j=psectioninfo->sfbStart;
|
||||
j<psectioninfo->sfbStart+psectioninfo->sfbCnt; j++){
|
||||
|
||||
|
||||
if(maxValueInSfb[j] == 0) {
|
||||
deltaScf = 0;
|
||||
deltaScf = 0;
|
||||
}
|
||||
else {
|
||||
deltaScf = lastValScf - scalefac[j];
|
||||
lastValScf = scalefac[j];
|
||||
lastValScf = scalefac[j];
|
||||
}
|
||||
|
||||
|
||||
if(codeScalefactorDelta(deltaScf,hBitStream)){
|
||||
return(1);
|
||||
}
|
||||
@@ -227,7 +227,7 @@ static void encodeMSInfo(Word16 sfbCnt,
|
||||
{
|
||||
Word16 sfb, sfbOff;
|
||||
|
||||
|
||||
|
||||
switch(msDigest)
|
||||
{
|
||||
case MS_NONE:
|
||||
@@ -242,7 +242,7 @@ static void encodeMSInfo(Word16 sfbCnt,
|
||||
WriteBits(hBitStream,SI_MS_MASK_SOME,2);
|
||||
for(sfbOff = 0; sfbOff < sfbCnt; sfbOff+=grpSfb) {
|
||||
for(sfb=0; sfb<maxSfb; sfb++) {
|
||||
|
||||
|
||||
if(jsFlags[sfbOff+sfb] & MS_ON) {
|
||||
WriteBits(hBitStream,1,1);
|
||||
}
|
||||
@@ -272,7 +272,7 @@ static void encodeTnsData(TNS_INFO tnsInfo,
|
||||
Word16 coefBits;
|
||||
Flag isShort;
|
||||
|
||||
|
||||
|
||||
if (blockType==2) {
|
||||
isShort = 1;
|
||||
numOfWindows = TRANS_FAC;
|
||||
@@ -282,52 +282,52 @@ static void encodeTnsData(TNS_INFO tnsInfo,
|
||||
numOfWindows = 1;
|
||||
}
|
||||
|
||||
tnsPresent=0;
|
||||
tnsPresent=0;
|
||||
for (i=0; i<numOfWindows; i++) {
|
||||
|
||||
|
||||
if (tnsInfo.tnsActive[i]) {
|
||||
tnsPresent=1;
|
||||
tnsPresent=1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (tnsPresent==0) {
|
||||
WriteBits(hBitStream,0,1);
|
||||
}
|
||||
else{ /* there is data to be written*/
|
||||
WriteBits(hBitStream,1,1); /*data_present */
|
||||
for (i=0; i<numOfWindows; i++) {
|
||||
|
||||
|
||||
WriteBits(hBitStream,tnsInfo.tnsActive[i],(isShort?1:2));
|
||||
|
||||
|
||||
if (tnsInfo.tnsActive[i]) {
|
||||
|
||||
|
||||
WriteBits(hBitStream,((tnsInfo.coefRes[i] - 4)==0?1:0),1);
|
||||
|
||||
|
||||
WriteBits(hBitStream,tnsInfo.length[i],(isShort?4:6));
|
||||
|
||||
|
||||
WriteBits(hBitStream,tnsInfo.order[i],(isShort?3:5));
|
||||
|
||||
|
||||
if (tnsInfo.order[i]){
|
||||
WriteBits(hBitStream, FILTER_DIRECTION, 1);
|
||||
|
||||
|
||||
if(tnsInfo.coefRes[i] == 4) {
|
||||
coefBits = 3;
|
||||
coefBits = 3;
|
||||
for(k=0; k<tnsInfo.order[i]; k++) {
|
||||
|
||||
|
||||
if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 3 ||
|
||||
tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -4) {
|
||||
coefBits = 4;
|
||||
coefBits = 4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
coefBits = 2;
|
||||
coefBits = 2;
|
||||
for(k=0; k<tnsInfo.order[i]; k++) {
|
||||
|
||||
|
||||
if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 1 ||
|
||||
tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -2) {
|
||||
coefBits = 3;
|
||||
coefBits = 3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -335,7 +335,7 @@ static void encodeTnsData(TNS_INFO tnsInfo,
|
||||
WriteBits(hBitStream, tnsInfo.coefRes[i] - coefBits, 1); /*coef_compres*/
|
||||
for (k=0; k<tnsInfo.order[i]; k++ ) {
|
||||
static const Word16 rmask[] = {0,1,3,7,15};
|
||||
|
||||
|
||||
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);
|
||||
|
||||
|
||||
|
||||
if(!commonWindow) {
|
||||
encodeIcsInfo(sectionData->blockType, windowShape, groupingMask, sectionData, hBitStream);
|
||||
}
|
||||
@@ -536,7 +536,7 @@ static void writeFillElement( const UWord8 *ancBytes,
|
||||
Write fill Element(s):
|
||||
amount of a fill element can be 7+X*8 Bits, X element of [0..270]
|
||||
*/
|
||||
|
||||
|
||||
while(totFillBits >= (3+4)) {
|
||||
cnt = min(((totFillBits - (3+4)) >> 3), ((1<<4)-1));
|
||||
|
||||
@@ -545,7 +545,7 @@ static void writeFillElement( const UWord8 *ancBytes,
|
||||
|
||||
totFillBits = totFillBits - (3+4);
|
||||
|
||||
|
||||
|
||||
if ((cnt == (1<<4)-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++) {
|
||||
|
||||
|
||||
if(ancBytes)
|
||||
WriteBits(hBitStream, *ancBytes++,8);
|
||||
else
|
||||
@@ -576,7 +576,7 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
|
||||
ELEMENT_INFO elInfo,
|
||||
QC_OUT *qcOut,
|
||||
PSY_OUT *psyOut,
|
||||
Word16 *globUsedBits,
|
||||
Word16 *globUsedBits,
|
||||
const UWord8 *ancBytes,
|
||||
Word16 sampindex
|
||||
) /* returns error code */
|
||||
@@ -586,7 +586,7 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
|
||||
Word16 frameBits=0;
|
||||
|
||||
/* struct bitbuffer bsWriteCopy; */
|
||||
bitMarkUp = GetBitsAvail(hBitStream);
|
||||
bitMarkUp = GetBitsAvail(hBitStream);
|
||||
if(qcOut->qcElement.adtsUsed) /* write adts header*/
|
||||
{
|
||||
WriteBits(hBitStream, 0xFFF, 12); /* 12 bit Syncword */
|
||||
@@ -601,23 +601,23 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
|
||||
6 channels or less, else a channel
|
||||
configuration should be written */
|
||||
WriteBits(hBitStream, 0, 1); /* original/copy */
|
||||
WriteBits(hBitStream, 0, 1); /* home */
|
||||
|
||||
WriteBits(hBitStream, 0, 1); /* home */
|
||||
|
||||
/* Variable ADTS header */
|
||||
WriteBits(hBitStream, 0, 1); /* copyr. id. bit */
|
||||
WriteBits(hBitStream, 0, 1); /* copyr. id. start */
|
||||
WriteBits(hBitStream, *globUsedBits >> 3, 13);
|
||||
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];
|
||||
TNS_INFO tnsInfo[2];
|
||||
elementUsedBits = 0;
|
||||
elementUsedBits = 0;
|
||||
|
||||
switch (elInfo.elType) {
|
||||
|
||||
@@ -636,7 +636,7 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
|
||||
{
|
||||
Word16 msDigest;
|
||||
Word16 *msFlags = psyOut->psyOutElement.toolsInfo.msMask;
|
||||
msDigest = psyOut->psyOutElement.toolsInfo.msDigest;
|
||||
msDigest = psyOut->psyOutElement.toolsInfo.msDigest;
|
||||
sfbOffset[0] =
|
||||
psyOut->psyOutChannel[elInfo.ChannelIndex[0]].sfbOffsets;
|
||||
sfbOffset[1] =
|
||||
@@ -668,20 +668,20 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
|
||||
}
|
||||
|
||||
writeFillElement(NULL,
|
||||
qcOut->totFillBits,
|
||||
qcOut->totFillBits,
|
||||
hBitStream);
|
||||
|
||||
WriteBits(hBitStream,ID_END,3);
|
||||
|
||||
/* byte alignement */
|
||||
WriteBits(hBitStream,0, (8 - (hBitStream->cntBits & 7)) & 7);
|
||||
|
||||
WriteBits(hBitStream,0, (8 - (hBitStream->cntBits & 7)) & 7);
|
||||
|
||||
*globUsedBits = *globUsedBits- bitMarkUp;
|
||||
bitMarkUp = GetBitsAvail(hBitStream);
|
||||
bitMarkUp = GetBitsAvail(hBitStream);
|
||||
*globUsedBits = *globUsedBits + bitMarkUp;
|
||||
frameBits = frameBits + *globUsedBits;
|
||||
|
||||
|
||||
|
||||
if (frameBits != (qcOut->totStaticBitsUsed+qcOut->totDynBitsUsed + qcOut->totAncBitsUsed +
|
||||
qcOut->totFillBits + qcOut->alignBits)) {
|
||||
return(-1);
|
||||
|
||||
@@ -52,7 +52,7 @@ CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
||||
IIR high pass coeffs
|
||||
*/
|
||||
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 */
|
||||
@@ -76,8 +76,8 @@ Word16 InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
||||
const Word32 bitRate, const Word16 nChannels)
|
||||
{
|
||||
/* 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))) {
|
||||
blockSwitchingControl->invAttackRatio = invAttackRatioHighBr;
|
||||
}
|
||||
@@ -116,7 +116,7 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
||||
|
||||
/* Reset grouping info */
|
||||
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,
|
||||
BLOCK_SWITCH_WINDOWS);
|
||||
|
||||
blockSwitchingControl->attackIndex = blockSwitchingControl->lastAttackIndex;
|
||||
blockSwitchingControl->attackIndex = blockSwitchingControl->lastAttackIndex;
|
||||
|
||||
/* Set grouping info */
|
||||
blockSwitchingControl->noOfGroups = MAX_NO_OF_GROUPS;
|
||||
blockSwitchingControl->noOfGroups = MAX_NO_OF_GROUPS;
|
||||
|
||||
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(sampleRate >= 16000) {
|
||||
/* Save current window energy as last window energy */
|
||||
for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) {
|
||||
blockSwitchingControl->windowNrg[0][w] = blockSwitchingControl->windowNrg[1][w];
|
||||
blockSwitchingControl->windowNrgF[0][w] = blockSwitchingControl->windowNrgF[1][w];
|
||||
blockSwitchingControl->windowNrg[0][w] = blockSwitchingControl->windowNrg[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);
|
||||
|
||||
/* reset attack */
|
||||
blockSwitchingControl->attack = FALSE;
|
||||
blockSwitchingControl->attack = FALSE;
|
||||
|
||||
enMax = 0;
|
||||
enM1 = blockSwitchingControl->windowNrgF[0][BLOCK_SWITCH_WINDOWS-1];
|
||||
enMax = 0;
|
||||
enM1 = blockSwitchingControl->windowNrgF[0][BLOCK_SWITCH_WINDOWS-1];
|
||||
|
||||
for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) {
|
||||
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 ((fixmul(windowNrgF_Tmp, blockSwitchingControl->invAttackRatio) >> windowNrgF_Shf) >
|
||||
blockSwitchingControl->accWindowNrg ) {
|
||||
blockSwitchingControl->attack = TRUE;
|
||||
blockSwitchingControl->lastAttackIndex = w;
|
||||
blockSwitchingControl->attack = TRUE;
|
||||
blockSwitchingControl->lastAttackIndex = w;
|
||||
}
|
||||
enM1 = blockSwitchingControl->windowNrgF[1][w];
|
||||
enM1 = blockSwitchingControl->windowNrgF[1][w];
|
||||
enMax = max(enMax, enM1);
|
||||
}
|
||||
|
||||
if (enMax < minAttackNrg) {
|
||||
blockSwitchingControl->attack = FALSE;
|
||||
blockSwitchingControl->attack = FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -188,22 +188,22 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
||||
blockSwitchingControl->attack = TRUE;
|
||||
}
|
||||
|
||||
/* Check if attack spreads over frame border */
|
||||
/* Check if attack spreads over frame border */
|
||||
if ((!blockSwitchingControl->attack) && (blockSwitchingControl->lastattack)) {
|
||||
|
||||
|
||||
if (blockSwitchingControl->attackIndex == TRANS_FAC-1) {
|
||||
blockSwitchingControl->attack = TRUE;
|
||||
blockSwitchingControl->attack = TRUE;
|
||||
}
|
||||
|
||||
blockSwitchingControl->lastattack = FALSE;
|
||||
blockSwitchingControl->lastattack = FALSE;
|
||||
}
|
||||
else {
|
||||
blockSwitchingControl->lastattack = blockSwitchingControl->attack;
|
||||
blockSwitchingControl->lastattack = blockSwitchingControl->attack;
|
||||
}
|
||||
|
||||
blockSwitchingControl->windowSequence = blockSwitchingControl->nextwindowSequence;
|
||||
blockSwitchingControl->windowSequence = blockSwitchingControl->nextwindowSequence;
|
||||
|
||||
|
||||
|
||||
if (blockSwitchingControl->attack) {
|
||||
blockSwitchingControl->nextwindowSequence = SHORT_WINDOW;
|
||||
}
|
||||
@@ -211,27 +211,27 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
||||
blockSwitchingControl->nextwindowSequence = LONG_WINDOW;
|
||||
}
|
||||
|
||||
/* update short block group */
|
||||
/* update short block group */
|
||||
if (blockSwitchingControl->nextwindowSequence == SHORT_WINDOW) {
|
||||
|
||||
|
||||
if (blockSwitchingControl->windowSequence== LONG_WINDOW) {
|
||||
blockSwitchingControl->windowSequence = START_WINDOW;
|
||||
blockSwitchingControl->windowSequence = START_WINDOW;
|
||||
}
|
||||
|
||||
|
||||
if (blockSwitchingControl->windowSequence == STOP_WINDOW) {
|
||||
blockSwitchingControl->windowSequence = SHORT_WINDOW;
|
||||
blockSwitchingControl->noOfGroups = 3;
|
||||
blockSwitchingControl->groupLen[0] = 3;
|
||||
blockSwitchingControl->groupLen[1] = 3;
|
||||
blockSwitchingControl->groupLen[2] = 2;
|
||||
blockSwitchingControl->windowSequence = SHORT_WINDOW;
|
||||
blockSwitchingControl->noOfGroups = 3;
|
||||
blockSwitchingControl->groupLen[0] = 3;
|
||||
blockSwitchingControl->groupLen[1] = 3;
|
||||
blockSwitchingControl->groupLen[2] = 2;
|
||||
}
|
||||
}
|
||||
|
||||
/* update block type */
|
||||
/* update block type */
|
||||
if (blockSwitchingControl->nextwindowSequence == LONG_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;
|
||||
|
||||
/* Search maximum value in array and return index and value */
|
||||
max = 0;
|
||||
idx = 0;
|
||||
max = 0;
|
||||
idx = 0;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
|
||||
|
||||
if (in[i+1] > max) {
|
||||
max = in[i+1];
|
||||
idx = i;
|
||||
max = in[i+1];
|
||||
idx = i;
|
||||
}
|
||||
}
|
||||
*index = idx;
|
||||
*index = idx;
|
||||
|
||||
return(max);
|
||||
}
|
||||
@@ -292,11 +292,11 @@ Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
||||
states1 = blockSwitchingControl->iirStates[1];
|
||||
Coeff0 = hiPassCoeff[0];
|
||||
Coeff1 = hiPassCoeff[1];
|
||||
tidx = 0;
|
||||
tidx = 0;
|
||||
for (w=0; w < BLOCK_SWITCH_WINDOWS; w++) {
|
||||
|
||||
accuUE = 0;
|
||||
accuFE = 0;
|
||||
accuUE = 0;
|
||||
accuFE = 0;
|
||||
|
||||
for(i=0; i<windowLen; i++) {
|
||||
Word32 accu1, accu2, accu3;
|
||||
@@ -309,16 +309,16 @@ Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
|
||||
accu3 = accu1 - states0;
|
||||
out = accu3 - accu2;
|
||||
|
||||
states0 = accu1;
|
||||
states1 = out;
|
||||
states0 = accu1;
|
||||
states1 = out;
|
||||
|
||||
tempFiltered = extract_h(out);
|
||||
tempFiltered = extract_h(out);
|
||||
accuUE += (tempUnfiltered * tempUnfiltered) >> ENERGY_SHIFT;
|
||||
accuFE += (tempFiltered * tempFiltered) >> ENERGY_SHIFT;
|
||||
}
|
||||
|
||||
blockSwitchingControl->windowNrg[1][w] = accuUE;
|
||||
blockSwitchingControl->windowNrgF[1][w] = accuFE;
|
||||
blockSwitchingControl->windowNrg[1][w] = accuUE;
|
||||
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] );
|
||||
out = accu3 - accu2;
|
||||
|
||||
states[0] = accu1;
|
||||
states[1] = out;
|
||||
states[0] = accu1;
|
||||
states[1] = out;
|
||||
|
||||
return round16(out);
|
||||
}
|
||||
@@ -374,54 +374,54 @@ Word16 SyncBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControlLeft,
|
||||
const Word16 nChannels)
|
||||
{
|
||||
Word16 i;
|
||||
Word16 patchType = LONG_WINDOW;
|
||||
Word16 patchType = LONG_WINDOW;
|
||||
|
||||
|
||||
|
||||
if (nChannels == 1) { /* Mono */
|
||||
if (blockSwitchingControlLeft->windowSequence != SHORT_WINDOW) {
|
||||
blockSwitchingControlLeft->noOfGroups = 1;
|
||||
blockSwitchingControlLeft->groupLen[0] = 1;
|
||||
blockSwitchingControlLeft->noOfGroups = 1;
|
||||
blockSwitchingControlLeft->groupLen[0] = 1;
|
||||
|
||||
for (i=1; i<TRANS_FAC; i++) {
|
||||
blockSwitchingControlLeft->groupLen[i] = 0;
|
||||
blockSwitchingControlLeft->groupLen[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else { /* Stereo common Window */
|
||||
patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlLeft->windowSequence];
|
||||
patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlRight->windowSequence];
|
||||
patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlLeft->windowSequence];
|
||||
patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlRight->windowSequence];
|
||||
|
||||
/* Set synchronized Blocktype */
|
||||
blockSwitchingControlLeft->windowSequence = patchType;
|
||||
blockSwitchingControlRight->windowSequence = patchType;
|
||||
blockSwitchingControlLeft->windowSequence = patchType;
|
||||
blockSwitchingControlRight->windowSequence = patchType;
|
||||
|
||||
/* Synchronize grouping info */
|
||||
/* Synchronize grouping info */
|
||||
if(patchType != SHORT_WINDOW) { /* Long Blocks */
|
||||
/* Set grouping info */
|
||||
blockSwitchingControlLeft->noOfGroups = 1;
|
||||
blockSwitchingControlRight->noOfGroups = 1;
|
||||
blockSwitchingControlLeft->groupLen[0] = 1;
|
||||
blockSwitchingControlRight->groupLen[0] = 1;
|
||||
blockSwitchingControlLeft->noOfGroups = 1;
|
||||
blockSwitchingControlRight->noOfGroups = 1;
|
||||
blockSwitchingControlLeft->groupLen[0] = 1;
|
||||
blockSwitchingControlRight->groupLen[0] = 1;
|
||||
|
||||
for (i=1; i<TRANS_FAC; i++) {
|
||||
blockSwitchingControlLeft->groupLen[i] = 0;
|
||||
blockSwitchingControlRight->groupLen[i] = 0;
|
||||
blockSwitchingControlLeft->groupLen[i] = 0;
|
||||
blockSwitchingControlRight->groupLen[i] = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (blockSwitchingControlLeft->maxWindowNrg > blockSwitchingControlRight->maxWindowNrg) {
|
||||
/* Left Channel wins */
|
||||
blockSwitchingControlRight->noOfGroups = blockSwitchingControlLeft->noOfGroups;
|
||||
blockSwitchingControlRight->noOfGroups = blockSwitchingControlLeft->noOfGroups;
|
||||
for (i=0; i<TRANS_FAC; i++) {
|
||||
blockSwitchingControlRight->groupLen[i] = blockSwitchingControlLeft->groupLen[i];
|
||||
blockSwitchingControlRight->groupLen[i] = blockSwitchingControlLeft->groupLen[i];
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Right Channel wins */
|
||||
blockSwitchingControlLeft->noOfGroups = blockSwitchingControlRight->noOfGroups;
|
||||
blockSwitchingControlLeft->noOfGroups = blockSwitchingControlRight->noOfGroups;
|
||||
for (i=0; i<TRANS_FAC; i++) {
|
||||
blockSwitchingControlLeft->groupLen[i] = blockSwitchingControlRight->groupLen[i];
|
||||
blockSwitchingControlLeft->groupLen[i] = blockSwitchingControlRight->groupLen[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,32 +29,32 @@ static const Word16 maxChannelBits = MAXBITS_COEF;
|
||||
|
||||
static Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType)
|
||||
{
|
||||
Word16 error=0;
|
||||
Word16 error=0;
|
||||
|
||||
elInfo->elType=elType;
|
||||
elInfo->elType=elType;
|
||||
|
||||
switch(elInfo->elType) {
|
||||
|
||||
case ID_SCE:
|
||||
elInfo->nChannelsInEl=1;
|
||||
elInfo->nChannelsInEl=1;
|
||||
|
||||
elInfo->ChannelIndex[0]=0;
|
||||
elInfo->ChannelIndex[0]=0;
|
||||
|
||||
elInfo->instanceTag=0;
|
||||
elInfo->instanceTag=0;
|
||||
break;
|
||||
|
||||
case ID_CPE:
|
||||
|
||||
elInfo->nChannelsInEl=2;
|
||||
elInfo->nChannelsInEl=2;
|
||||
|
||||
elInfo->ChannelIndex[0]=0;
|
||||
elInfo->ChannelIndex[1]=1;
|
||||
elInfo->ChannelIndex[0]=0;
|
||||
elInfo->ChannelIndex[1]=1;
|
||||
|
||||
elInfo->instanceTag=0;
|
||||
elInfo->instanceTag=0;
|
||||
break;
|
||||
|
||||
default:
|
||||
error=1;
|
||||
error=1;
|
||||
}
|
||||
|
||||
return error;
|
||||
@@ -64,11 +64,11 @@ static Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType)
|
||||
Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo)
|
||||
{
|
||||
Word16 error;
|
||||
error = 0;
|
||||
error = 0;
|
||||
|
||||
switch(nChannels) {
|
||||
|
||||
case 1:
|
||||
case 1:
|
||||
initElement(elInfo, ID_SCE);
|
||||
break;
|
||||
|
||||
@@ -77,7 +77,7 @@ Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo)
|
||||
break;
|
||||
|
||||
default:
|
||||
error=4;
|
||||
error=4;
|
||||
}
|
||||
|
||||
return error;
|
||||
@@ -91,18 +91,18 @@ Word16 InitElementBits(ELEMENT_BITS *elementBits,
|
||||
Word16 staticBitsTot)
|
||||
{
|
||||
Word16 error;
|
||||
error = 0;
|
||||
error = 0;
|
||||
|
||||
switch(elInfo.nChannelsInEl) {
|
||||
case 1:
|
||||
elementBits->chBitrate = bitrateTot;
|
||||
elementBits->chBitrate = bitrateTot;
|
||||
elementBits->averageBits = averageBitsTot - staticBitsTot;
|
||||
elementBits->maxBits = maxChannelBits;
|
||||
elementBits->maxBits = maxChannelBits;
|
||||
|
||||
elementBits->maxBitResBits = maxChannelBits - averageBitsTot;
|
||||
elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
|
||||
elementBits->bitResLevel = elementBits->maxBitResBits;
|
||||
elementBits->relativeBits = 0x4000; /* 1.0f/2 */
|
||||
elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
|
||||
elementBits->bitResLevel = elementBits->maxBitResBits;
|
||||
elementBits->relativeBits = 0x4000; /* 1.0f/2 */
|
||||
break;
|
||||
|
||||
case 2:
|
||||
@@ -111,13 +111,13 @@ Word16 InitElementBits(ELEMENT_BITS *elementBits,
|
||||
elementBits->maxBits = maxChannelBits << 1;
|
||||
|
||||
elementBits->maxBitResBits = (maxChannelBits << 1) - averageBitsTot;
|
||||
elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
|
||||
elementBits->bitResLevel = elementBits->maxBitResBits;
|
||||
elementBits->relativeBits = 0x4000; /* 1.0f/2 */
|
||||
elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
|
||||
elementBits->bitResLevel = elementBits->maxBitResBits;
|
||||
elementBits->relativeBits = 0x4000; /* 1.0f/2 */
|
||||
break;
|
||||
|
||||
default:
|
||||
error = 1;
|
||||
error = 1;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -45,12 +45,12 @@ buildBitLookUp(const Word16 *quantSpectrum,
|
||||
for (i=0; i<maxSfb; i++) {
|
||||
Word16 sfbWidth, maxVal;
|
||||
|
||||
sectionInfo[i].sfbCnt = 1;
|
||||
sectionInfo[i].sfbStart = i;
|
||||
sectionInfo[i].sectionBits = INVALID_BITCOUNT;
|
||||
sectionInfo[i].codeBook = -1;
|
||||
sfbWidth = sfbOffset[i + 1] - sfbOffset[i];
|
||||
maxVal = sfbMax[i];
|
||||
sectionInfo[i].sfbCnt = 1;
|
||||
sectionInfo[i].sfbStart = i;
|
||||
sectionInfo[i].sectionBits = INVALID_BITCOUNT;
|
||||
sectionInfo[i].codeBook = -1;
|
||||
sfbWidth = sfbOffset[i + 1] - sfbOffset[i];
|
||||
maxVal = sfbMax[i];
|
||||
bitCount(quantSpectrum + sfbOffset[i], sfbWidth, maxVal, bitLookUp[i]);
|
||||
}
|
||||
}
|
||||
@@ -66,13 +66,13 @@ static Word16
|
||||
findBestBook(const Word16 *bc, Word16 *book)
|
||||
{
|
||||
Word32 minBits, j;
|
||||
minBits = INVALID_BITCOUNT;
|
||||
minBits = INVALID_BITCOUNT;
|
||||
|
||||
for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
|
||||
|
||||
|
||||
if (bc[j] < minBits) {
|
||||
minBits = bc[j];
|
||||
*book = j;
|
||||
minBits = bc[j];
|
||||
*book = j;
|
||||
}
|
||||
}
|
||||
return extract_l(minBits);
|
||||
@@ -82,12 +82,12 @@ static Word16
|
||||
findMinMergeBits(const Word16 *bc1, const Word16 *bc2)
|
||||
{
|
||||
Word32 minBits, j, sum;
|
||||
minBits = INVALID_BITCOUNT;
|
||||
minBits = INVALID_BITCOUNT;
|
||||
|
||||
for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
|
||||
sum = bc1[j] + bc2[j];
|
||||
if (sum < minBits) {
|
||||
minBits = sum;
|
||||
minBits = sum;
|
||||
}
|
||||
}
|
||||
return extract_l(minBits);
|
||||
@@ -109,13 +109,13 @@ findMaxMerge(const Word16 mergeGainLookUp[MAX_SFB_LONG],
|
||||
const Word16 maxSfb, Word16 *maxNdx)
|
||||
{
|
||||
Word32 i, maxMergeGain;
|
||||
maxMergeGain = 0;
|
||||
maxMergeGain = 0;
|
||||
|
||||
for (i=0; i+sectionInfo[i].sfbCnt < maxSfb; i += sectionInfo[i].sfbCnt) {
|
||||
|
||||
|
||||
if (mergeGainLookUp[i] > maxMergeGain) {
|
||||
maxMergeGain = mergeGainLookUp[i];
|
||||
*maxNdx = i;
|
||||
maxMergeGain = mergeGainLookUp[i];
|
||||
*maxNdx = i;
|
||||
}
|
||||
}
|
||||
return extract_l(maxMergeGain);
|
||||
@@ -159,7 +159,7 @@ gmStage0(SECTION_INFO * sectionInfo,
|
||||
|
||||
for (i=0; i<maxSfb; i++) {
|
||||
/* Side-Info bits will be calculated in Stage 1! */
|
||||
|
||||
|
||||
if (sectionInfo[i].sectionBits == INVALID_BITCOUNT) {
|
||||
sectionInfo[i].sectionBits = findBestBook(bitLookUp[i], &(sectionInfo[i].codeBook));
|
||||
}
|
||||
@@ -180,13 +180,13 @@ gmStage1(SECTION_INFO * sectionInfo,
|
||||
SECTION_INFO * sectionInfo_s;
|
||||
SECTION_INFO * sectionInfo_e;
|
||||
Word32 mergeStart, mergeEnd;
|
||||
mergeStart = 0;
|
||||
mergeStart = 0;
|
||||
|
||||
do {
|
||||
|
||||
sectionInfo_s = sectionInfo + mergeStart;
|
||||
for (mergeEnd=mergeStart+1; mergeEnd<maxSfb; mergeEnd++) {
|
||||
sectionInfo_e = sectionInfo + mergeEnd;
|
||||
sectionInfo_e = sectionInfo + mergeEnd;
|
||||
if (sectionInfo_s->codeBook != sectionInfo_e->codeBook)
|
||||
break;
|
||||
sectionInfo_s->sfbCnt += 1;
|
||||
@@ -196,11 +196,11 @@ gmStage1(SECTION_INFO * sectionInfo,
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -230,7 +230,7 @@ gmStage2(SECTION_INFO *sectionInfo,
|
||||
|
||||
maxMergeGain = findMaxMerge(mergeGainLookUp, sectionInfo, maxSfb, &maxNdx);
|
||||
|
||||
|
||||
|
||||
if (maxMergeGain <= 0)
|
||||
break;
|
||||
|
||||
@@ -244,7 +244,7 @@ gmStage2(SECTION_INFO *sectionInfo,
|
||||
|
||||
mergeBitLookUp(bitLookUp[maxNdx], bitLookUp[maxNdxNext]);
|
||||
|
||||
|
||||
|
||||
if (maxNdx != 0) {
|
||||
maxNdxLast = sectionInfo[maxNdx - 1].sfbStart;
|
||||
mergeGainLookUp[maxNdxLast] = CalcMergeGain(sectionInfo,
|
||||
@@ -255,9 +255,9 @@ gmStage2(SECTION_INFO *sectionInfo,
|
||||
}
|
||||
maxNdxNext = maxNdx + sectionInfo[maxNdx].sfbCnt;
|
||||
|
||||
sectionInfo[maxNdxNext - 1].sfbStart = sectionInfo[maxNdx].sfbStart;
|
||||
sectionInfo[maxNdxNext - 1].sfbStart = sectionInfo[maxNdx].sfbStart;
|
||||
|
||||
|
||||
|
||||
if (maxNdxNext - maxSfb < 0) {
|
||||
mergeGainLookUp[maxNdx] = CalcMergeGain(sectionInfo,
|
||||
bitLookUp,
|
||||
@@ -286,7 +286,7 @@ noiselessCounter(SECTION_DATA *sectionData,
|
||||
|
||||
/*
|
||||
use appropriate side info table
|
||||
*/
|
||||
*/
|
||||
switch (blockType)
|
||||
{
|
||||
case LONG_WINDOW:
|
||||
@@ -300,11 +300,11 @@ noiselessCounter(SECTION_DATA *sectionData,
|
||||
}
|
||||
|
||||
|
||||
sectionData->noOfSections = 0;
|
||||
sectionData->huffmanBits = 0;
|
||||
sectionData->sideInfoBits = 0;
|
||||
sectionData->noOfSections = 0;
|
||||
sectionData->huffmanBits = 0;
|
||||
sectionData->sideInfoBits = 0;
|
||||
|
||||
|
||||
|
||||
if (sectionData->maxSfbPerGroup == 0)
|
||||
return;
|
||||
|
||||
@@ -353,7 +353,7 @@ noiselessCounter(SECTION_DATA *sectionData,
|
||||
sectionData->huffmanBits = (sectionData->huffmanBits +
|
||||
(sectionInfo[i].sectionBits - 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;
|
||||
}
|
||||
}
|
||||
@@ -386,25 +386,25 @@ static void scfCount(const Word16 *scalefacGain,
|
||||
Word32 lastValScf = 0;
|
||||
Word32 deltaScf = 0;
|
||||
Flag found = 0;
|
||||
Word32 scfSkipCounter = 0;
|
||||
|
||||
Word32 scfSkipCounter = 0;
|
||||
|
||||
|
||||
sectionData->scalefacBits = 0;
|
||||
|
||||
sectionData->scalefacBits = 0;
|
||||
|
||||
|
||||
if (scalefacGain == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
lastValScf = 0;
|
||||
sectionData->firstScf = 0;
|
||||
|
||||
lastValScf = 0;
|
||||
sectionData->firstScf = 0;
|
||||
|
||||
psectionInfo = sectionData->sectionInfo;
|
||||
for (i=0; i<sectionData->noOfSections; i++) {
|
||||
|
||||
|
||||
if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO) {
|
||||
sectionData->firstScf = psectionInfo->sfbStart;
|
||||
lastValScf = scalefacGain[sectionData->firstScf];
|
||||
sectionData->firstScf = psectionInfo->sfbStart;
|
||||
lastValScf = scalefacGain[sectionData->firstScf];
|
||||
break;
|
||||
}
|
||||
psectionInfo += 1;
|
||||
@@ -412,38 +412,38 @@ static void scfCount(const Word16 *scalefacGain,
|
||||
|
||||
psectionInfo = sectionData->sectionInfo;
|
||||
for (i=0; i<sectionData->noOfSections; i++, psectionInfo += 1) {
|
||||
|
||||
|
||||
if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO
|
||||
&& psectionInfo->codeBook != CODE_BOOK_PNS_NO) {
|
||||
for (j = psectionInfo->sfbStart;
|
||||
j < (psectionInfo->sfbStart + psectionInfo->sfbCnt); j++) {
|
||||
/* check if we can repeat the last value to save bits */
|
||||
|
||||
|
||||
if (maxValueInSfb[j] == 0) {
|
||||
found = 0;
|
||||
|
||||
found = 0;
|
||||
|
||||
if (scfSkipCounter == 0) {
|
||||
/* end of section */
|
||||
|
||||
|
||||
if (j - ((psectionInfo->sfbStart + psectionInfo->sfbCnt) - 1) == 0) {
|
||||
found = 0;
|
||||
found = 0;
|
||||
}
|
||||
else {
|
||||
for (k = j + 1; k < psectionInfo->sfbStart + psectionInfo->sfbCnt; k++) {
|
||||
|
||||
|
||||
if (maxValueInSfb[k] != 0) {
|
||||
int tmp = L_abs(scalefacGain[k] - lastValScf);
|
||||
found = 1;
|
||||
|
||||
found = 1;
|
||||
|
||||
if ( tmp < CODE_BOOK_SCF_LAV) {
|
||||
/* save bits */
|
||||
deltaScf = 0;
|
||||
deltaScf = 0;
|
||||
}
|
||||
else {
|
||||
/* do not save bits */
|
||||
deltaScf = lastValScf - scalefacGain[j];
|
||||
lastValScf = scalefacGain[j];
|
||||
scfSkipCounter = 0;
|
||||
lastValScf = scalefacGain[j];
|
||||
scfSkipCounter = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -451,26 +451,26 @@ static void scfCount(const Word16 *scalefacGain,
|
||||
scfSkipCounter = scfSkipCounter + 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
psectionInfom = psectionInfo + 1;
|
||||
/* search for the next maxValueInSfb[] != 0 in all other sections */
|
||||
for (m = i + 1; (m < sectionData->noOfSections) && (found == 0); m++) {
|
||||
|
||||
|
||||
if ((psectionInfom->codeBook != CODE_BOOK_ZERO_NO) &&
|
||||
(psectionInfom->codeBook != CODE_BOOK_PNS_NO)) {
|
||||
for (n = psectionInfom->sfbStart;
|
||||
n < (psectionInfom->sfbStart + psectionInfom->sfbCnt); n++) {
|
||||
|
||||
|
||||
if (maxValueInSfb[n] != 0) {
|
||||
found = 1;
|
||||
|
||||
found = 1;
|
||||
|
||||
if ( (abs_s(scalefacGain[n] - lastValScf) < CODE_BOOK_SCF_LAV)) {
|
||||
deltaScf = 0;
|
||||
deltaScf = 0;
|
||||
}
|
||||
else {
|
||||
deltaScf = (lastValScf - scalefacGain[j]);
|
||||
lastValScf = scalefacGain[j];
|
||||
scfSkipCounter = 0;
|
||||
lastValScf = scalefacGain[j];
|
||||
scfSkipCounter = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -481,20 +481,20 @@ static void scfCount(const Word16 *scalefacGain,
|
||||
|
||||
psectionInfom += 1;
|
||||
}
|
||||
|
||||
|
||||
if (found == 0) {
|
||||
deltaScf = 0;
|
||||
scfSkipCounter = 0;
|
||||
deltaScf = 0;
|
||||
scfSkipCounter = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
deltaScf = 0;
|
||||
deltaScf = 0;
|
||||
scfSkipCounter = scfSkipCounter - 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
deltaScf = lastValScf - scalefacGain[j];
|
||||
lastValScf = scalefacGain[j];
|
||||
lastValScf = scalefacGain[j];
|
||||
}
|
||||
sectionData->scalefacBits += bitCountScalefactorDelta(deltaScf);
|
||||
}
|
||||
@@ -517,14 +517,14 @@ dynBitCount(const Word16 *quantSpectrum,
|
||||
const Word16 *sfbOffset,
|
||||
SECTION_DATA *sectionData)
|
||||
{
|
||||
sectionData->blockType = blockType;
|
||||
sectionData->sfbCnt = sfbCnt;
|
||||
sectionData->sfbPerGroup = sfbPerGroup;
|
||||
sectionData->blockType = blockType;
|
||||
sectionData->sfbCnt = sfbCnt;
|
||||
sectionData->sfbPerGroup = sfbPerGroup;
|
||||
if(sfbPerGroup)
|
||||
sectionData->noOfGroups = sfbCnt/sfbPerGroup;
|
||||
sectionData->noOfGroups = sfbCnt/sfbPerGroup;
|
||||
else
|
||||
sectionData->noOfGroups = 0x7fff;
|
||||
sectionData->maxSfbPerGroup = maxSfbPerGroup;
|
||||
sectionData->maxSfbPerGroup = maxSfbPerGroup;
|
||||
|
||||
noiselessCounter(sectionData,
|
||||
sectionData->mergeGainLookUp,
|
||||
@@ -539,7 +539,7 @@ dynBitCount(const Word16 *quantSpectrum,
|
||||
sectionData);
|
||||
|
||||
|
||||
return (sectionData->huffmanBits + sectionData->sideInfoBits +
|
||||
return (sectionData->huffmanBits + sectionData->sideInfoBits +
|
||||
sectionData->scalefacBits);
|
||||
}
|
||||
|
||||
|
||||
@@ -57,29 +57,29 @@ groupShortData(Word32 *mdctSpectrum,
|
||||
|
||||
/* for short: regroup and */
|
||||
/* cumulate energies und thresholds group-wise . */
|
||||
|
||||
|
||||
/* calculate sfbCnt */
|
||||
highestSfb = 0;
|
||||
highestSfb = 0;
|
||||
for (wnd=0; wnd<TRANS_FAC; wnd++) {
|
||||
for (sfb=sfbCnt - 1; sfb>=highestSfb; sfb--) {
|
||||
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;
|
||||
}
|
||||
highestSfb = max(highestSfb, sfb);
|
||||
}
|
||||
|
||||
|
||||
if (highestSfb < 0) {
|
||||
highestSfb = 0;
|
||||
highestSfb = 0;
|
||||
}
|
||||
*maxSfbPerGroup = highestSfb + 1;
|
||||
|
||||
/* calculate sfbOffset */
|
||||
i = 0;
|
||||
offset = 0;
|
||||
i = 0;
|
||||
offset = 0;
|
||||
for (grp = 0; grp < noOfGroups; grp++) {
|
||||
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
||||
groupedSfbOffset[i] = offset + sfbOffset[sfb] * groupLen[grp];
|
||||
@@ -87,15 +87,15 @@ groupShortData(Word32 *mdctSpectrum,
|
||||
}
|
||||
offset += groupLen[grp] * FRAME_LEN_SHORT;
|
||||
}
|
||||
groupedSfbOffset[i] = FRAME_LEN_LONG;
|
||||
groupedSfbOffset[i] = FRAME_LEN_LONG;
|
||||
i += 1;
|
||||
|
||||
/* calculate minSnr */
|
||||
i = 0;
|
||||
offset = 0;
|
||||
i = 0;
|
||||
offset = 0;
|
||||
for (grp = 0; grp < noOfGroups; grp++) {
|
||||
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
||||
groupedSfbMinSnr[i] = sfbMinSnr[sfb];
|
||||
groupedSfbMinSnr[i] = sfbMinSnr[sfb];
|
||||
i += 1;
|
||||
}
|
||||
offset += groupLen[grp] * FRAME_LEN_SHORT;
|
||||
@@ -103,74 +103,74 @@ groupShortData(Word32 *mdctSpectrum,
|
||||
|
||||
|
||||
/* sum up sfbThresholds */
|
||||
wnd = 0;
|
||||
i = 0;
|
||||
wnd = 0;
|
||||
i = 0;
|
||||
for (grp = 0; grp < noOfGroups; grp++) {
|
||||
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++) {
|
||||
thresh = L_add(thresh, sfbThreshold->sfbShort[wnd+j][sfb]);
|
||||
}
|
||||
sfbThreshold->sfbLong[i] = thresh;
|
||||
sfbThreshold->sfbLong[i] = thresh;
|
||||
i += 1;
|
||||
}
|
||||
wnd += groupLen[grp];
|
||||
}
|
||||
|
||||
/* sum up sfbEnergies left/right */
|
||||
wnd = 0;
|
||||
i = 0;
|
||||
wnd = 0;
|
||||
i = 0;
|
||||
for (grp = 0; grp < noOfGroups; grp++) {
|
||||
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++) {
|
||||
energy = L_add(energy, sfbEnergy->sfbShort[wnd+j][sfb]);
|
||||
}
|
||||
sfbEnergy->sfbLong[i] = energy;
|
||||
sfbEnergy->sfbLong[i] = energy;
|
||||
i += 1;
|
||||
}
|
||||
wnd += groupLen[grp];
|
||||
}
|
||||
|
||||
/* sum up sfbEnergies mid/side */
|
||||
wnd = 0;
|
||||
i = 0;
|
||||
wnd = 0;
|
||||
i = 0;
|
||||
for (grp = 0; grp < noOfGroups; grp++) {
|
||||
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++) {
|
||||
energy = L_add(energy, sfbEnergyMS->sfbShort[wnd+j][sfb]);
|
||||
}
|
||||
sfbEnergyMS->sfbLong[i] = energy;
|
||||
sfbEnergyMS->sfbLong[i] = energy;
|
||||
i += 1;
|
||||
}
|
||||
wnd += groupLen[grp];
|
||||
}
|
||||
|
||||
/* sum up sfbSpreadedEnergies */
|
||||
wnd = 0;
|
||||
i = 0;
|
||||
wnd = 0;
|
||||
i = 0;
|
||||
for (grp = 0; grp < noOfGroups; grp++) {
|
||||
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++) {
|
||||
energy = L_add(energy, sfbSpreadedEnergy->sfbShort[wnd+j][sfb]);
|
||||
}
|
||||
sfbSpreadedEnergy->sfbLong[i] = energy;
|
||||
sfbSpreadedEnergy->sfbLong[i] = energy;
|
||||
i += 1;
|
||||
}
|
||||
wnd += groupLen[grp];
|
||||
}
|
||||
|
||||
/* re-group spectrum */
|
||||
wnd = 0;
|
||||
i = 0;
|
||||
wnd = 0;
|
||||
i = 0;
|
||||
for (grp = 0; grp < noOfGroups; grp++) {
|
||||
for (sfb = 0; sfb < sfbCnt; sfb++) {
|
||||
for (j = 0; j < groupLen[grp]; j++) {
|
||||
Word16 lineOffset = FRAME_LEN_SHORT * (wnd + j);
|
||||
for (line = lineOffset + sfbOffset[sfb]; line < lineOffset + sfbOffset[sfb+1]; line++) {
|
||||
tmpSpectrum[i] = mdctSpectrum[line];
|
||||
tmpSpectrum[i] = mdctSpectrum[line];
|
||||
i = i + 1;
|
||||
}
|
||||
}
|
||||
@@ -179,10 +179,10 @@ groupShortData(Word32 *mdctSpectrum,
|
||||
}
|
||||
|
||||
for(i=0;i<FRAME_LEN_LONG;i+=4) {
|
||||
mdctSpectrum[i] = tmpSpectrum[i];
|
||||
mdctSpectrum[i+1] = tmpSpectrum[i+1];
|
||||
mdctSpectrum[i+2] = tmpSpectrum[i+2];
|
||||
mdctSpectrum[i+3] = tmpSpectrum[i+3];
|
||||
mdctSpectrum[i] = tmpSpectrum[i];
|
||||
mdctSpectrum[i+1] = tmpSpectrum[i+1];
|
||||
mdctSpectrum[i+2] = tmpSpectrum[i+2];
|
||||
mdctSpectrum[i+3] = tmpSpectrum[i+3];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -49,56 +49,56 @@ void BuildInterface(Word32 *groupedMdctSpectrum,
|
||||
PSY_OUT_CHANNEL *psyOutCh)
|
||||
{
|
||||
Word32 j;
|
||||
Word32 grp;
|
||||
Word32 grp;
|
||||
Word32 mask;
|
||||
Word16 *tmpV;
|
||||
|
||||
/*
|
||||
copy values to psyOut
|
||||
*/
|
||||
psyOutCh->maxSfbPerGroup = maxSfbPerGroup;
|
||||
psyOutCh->sfbCnt = groupedSfbCnt;
|
||||
psyOutCh->maxSfbPerGroup = maxSfbPerGroup;
|
||||
psyOutCh->sfbCnt = groupedSfbCnt;
|
||||
if(noOfGroups)
|
||||
psyOutCh->sfbPerGroup = groupedSfbCnt/ noOfGroups;
|
||||
else
|
||||
psyOutCh->sfbPerGroup = 0x7fff;
|
||||
psyOutCh->windowSequence = windowSequence;
|
||||
psyOutCh->windowShape = windowShape;
|
||||
psyOutCh->mdctScale = mdctScale;
|
||||
psyOutCh->windowSequence = windowSequence;
|
||||
psyOutCh->windowShape = windowShape;
|
||||
psyOutCh->mdctScale = mdctScale;
|
||||
psyOutCh->mdctSpectrum = groupedMdctSpectrum;
|
||||
psyOutCh->sfbEnergy = groupedSfbEnergy->sfbLong;
|
||||
psyOutCh->sfbThreshold = groupedSfbThreshold->sfbLong;
|
||||
psyOutCh->sfbSpreadedEnergy = groupedSfbSpreadedEnergy->sfbLong;
|
||||
|
||||
|
||||
tmpV = psyOutCh->sfbOffsets;
|
||||
for(j=0; j<groupedSfbCnt + 1; j++) {
|
||||
*tmpV++ = groupedSfbOffset[j];
|
||||
}
|
||||
|
||||
|
||||
tmpV = psyOutCh->sfbMinSnr;
|
||||
for(j=0;j<groupedSfbCnt; j++) {
|
||||
*tmpV++ = groupedSfbMinSnr[j];
|
||||
}
|
||||
|
||||
|
||||
/* generate grouping mask */
|
||||
mask = 0;
|
||||
mask = 0;
|
||||
for (grp = 0; grp < noOfGroups; grp++) {
|
||||
mask = mask << 1;
|
||||
for (j=1; j<groupLen[grp]; j++) {
|
||||
mask = mask << 1;
|
||||
mask |= 1;
|
||||
mask |= 1;
|
||||
}
|
||||
}
|
||||
psyOutCh->groupingMask = mask;
|
||||
|
||||
psyOutCh->groupingMask = mask;
|
||||
|
||||
if (windowSequence != SHORT_WINDOW) {
|
||||
psyOutCh->sfbEnSumLR = sfbEnergySumLR.sfbLong;
|
||||
psyOutCh->sfbEnSumMS = sfbEnergySumMS.sfbLong;
|
||||
psyOutCh->sfbEnSumLR = sfbEnergySumLR.sfbLong;
|
||||
psyOutCh->sfbEnSumMS = sfbEnergySumMS.sfbLong;
|
||||
}
|
||||
else {
|
||||
Word32 i;
|
||||
Word32 accuSumMS=0;
|
||||
Word32 accuSumLR=0;
|
||||
Word32 accuSumLR=0;
|
||||
Word32 *pSumMS = sfbEnergySumMS.sfbShort;
|
||||
Word32 *pSumLR = sfbEnergySumLR.sfbShort;
|
||||
|
||||
@@ -106,7 +106,7 @@ void BuildInterface(Word32 *groupedMdctSpectrum,
|
||||
accuSumLR = L_add(accuSumLR, *pSumLR); pSumLR++;
|
||||
accuSumMS = L_add(accuSumMS, *pSumMS); pSumMS++;
|
||||
}
|
||||
psyOutCh->sfbEnSumMS = accuSumMS;
|
||||
psyOutCh->sfbEnSumLR = accuSumLR;
|
||||
psyOutCh->sfbEnSumMS = accuSumMS;
|
||||
psyOutCh->sfbEnSumLR = accuSumLR;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,20 +45,20 @@ void prepareSfbPe(PE_DATA *peData,
|
||||
const Word16 peOffset)
|
||||
{
|
||||
Word32 sfbGrp, sfb;
|
||||
Word32 ch;
|
||||
Word32 ch;
|
||||
|
||||
for(ch=0; ch<nChannels; ch++) {
|
||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||
PE_CHANNEL_DATA *peChanData=&peData->peChannelData[ch];
|
||||
for(sfbGrp=0;sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup){
|
||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||
peChanData->sfbNLines4[sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb];
|
||||
sfbNRelevantLines[ch][sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb] >> 2;
|
||||
peChanData->sfbLdEnergy[sfbGrp+sfb] = logSfbEnergy[ch][sfbGrp+sfb];
|
||||
peChanData->sfbNLines4[sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb];
|
||||
sfbNRelevantLines[ch][sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb] >> 2;
|
||||
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 pe, constPart, nActiveLines;
|
||||
|
||||
peData->pe = peData->offset;
|
||||
peData->constPart = 0;
|
||||
peData->nActiveLines = 0;
|
||||
peData->pe = peData->offset;
|
||||
peData->constPart = 0;
|
||||
peData->nActiveLines = 0;
|
||||
for(ch=0; ch<nChannels; ch++) {
|
||||
PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
|
||||
PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
|
||||
const Word32 *sfbEnergy = psyOutChan->sfbEnergy;
|
||||
const Word32 *sfbThreshold = psyOutChan->sfbThreshold;
|
||||
|
||||
pe = 0;
|
||||
constPart = 0;
|
||||
nActiveLines = 0;
|
||||
pe = 0;
|
||||
constPart = 0;
|
||||
nActiveLines = 0;
|
||||
|
||||
for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
|
||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||
Word32 nrg = sfbEnergy[sfbGrp+sfb];
|
||||
Word32 thres = sfbThreshold[sfbGrp+sfb];
|
||||
Word32 nrg = sfbEnergy[sfbGrp+sfb];
|
||||
Word32 thres = sfbThreshold[sfbGrp+sfb];
|
||||
Word32 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb];
|
||||
|
||||
if (nrg > thres) {
|
||||
@@ -102,8 +102,8 @@ void calcSfbPe(PE_DATA *peData,
|
||||
|
||||
ldRatio = sfbLDEn - ldThr;
|
||||
|
||||
nLines4 = peChanData->sfbNLines4[sfbGrp+sfb];
|
||||
|
||||
nLines4 = peChanData->sfbNLines4[sfbGrp+sfb];
|
||||
|
||||
/* sfbPe = nl*log2(en/thr)*/
|
||||
if (ldRatio >= C1_I) {
|
||||
peChanData->sfbPe[sfbGrp+sfb] = (nLines4*ldRatio + 8) >> 4;
|
||||
@@ -120,26 +120,26 @@ void calcSfbPe(PE_DATA *peData,
|
||||
peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines4 >> 2;
|
||||
}
|
||||
else {
|
||||
peChanData->sfbPe[sfbGrp+sfb] = 0;
|
||||
peChanData->sfbConstPart[sfbGrp+sfb] = 0;
|
||||
peChanData->sfbNActiveLines[sfbGrp+sfb] = 0;
|
||||
peChanData->sfbPe[sfbGrp+sfb] = 0;
|
||||
peChanData->sfbConstPart[sfbGrp+sfb] = 0;
|
||||
peChanData->sfbNActiveLines[sfbGrp+sfb] = 0;
|
||||
}
|
||||
pe = pe + peChanData->sfbPe[sfbGrp+sfb];
|
||||
constPart = constPart + peChanData->sfbConstPart[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;
|
||||
peData->pe = saturate(pe);
|
||||
peData->pe = saturate(pe);
|
||||
constPart += peData->constPart;
|
||||
peData->constPart = saturate(constPart);
|
||||
peData->constPart = saturate(constPart);
|
||||
nActiveLines += peData->nActiveLines;
|
||||
peData->nActiveLines = saturate(nActiveLines);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* function name: mem_malloc
|
||||
* description: malloc the alignments memory
|
||||
* description: malloc the alignments memory
|
||||
* returns: the point of the memory
|
||||
*
|
||||
**********************************************************************************/
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
*
|
||||
* function name: MsStereoProcessing
|
||||
* 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
|
||||
*
|
||||
**********************************************************************************/
|
||||
@@ -51,7 +51,7 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft,
|
||||
const Word16 maxSfbPerGroup,
|
||||
const Word16 *sfbOffset) {
|
||||
Word32 temp;
|
||||
Word32 sfb,sfboffs, j;
|
||||
Word32 sfb,sfboffs, j;
|
||||
Word32 msMaskTrueSomewhere = 0;
|
||||
Word32 msMaskFalseSomewhere = 0;
|
||||
|
||||
@@ -64,12 +64,12 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft,
|
||||
Word32 thrL, thrR, nrgL, nrgR;
|
||||
Word32 idx, shift;
|
||||
|
||||
idx = sfb + sfboffs;
|
||||
idx = sfb + sfboffs;
|
||||
|
||||
thrL = sfbThresholdLeft[idx];
|
||||
thrR = sfbThresholdRight[idx];
|
||||
nrgL = sfbEnergyLeft[idx];
|
||||
nrgR = sfbEnergyRight[idx];
|
||||
thrL = sfbThresholdLeft[idx];
|
||||
thrR = sfbThresholdRight[idx];
|
||||
nrgL = sfbEnergyLeft[idx];
|
||||
nrgR = sfbEnergyRight[idx];
|
||||
|
||||
minThreshold = min(thrL, thrR);
|
||||
|
||||
@@ -82,8 +82,8 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft,
|
||||
|
||||
pnlr = fixmul(nrgL, nrgR);
|
||||
|
||||
nrgL = sfbEnergyMid[idx];
|
||||
nrgR = sfbEnergySide[idx];
|
||||
nrgL = sfbEnergyMid[idx];
|
||||
nrgR = sfbEnergySide[idx];
|
||||
|
||||
nrgL = max(nrgL,minThreshold) + 1;
|
||||
shift = norm_l(nrgL);
|
||||
@@ -97,42 +97,42 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft,
|
||||
|
||||
temp = (pnlr + 1) / ((pnms >> 8) + 1);
|
||||
|
||||
temp = pnms - pnlr;
|
||||
temp = pnms - pnlr;
|
||||
if( temp > 0 ){
|
||||
|
||||
msMask[idx] = 1;
|
||||
msMaskTrueSomewhere = 1;
|
||||
msMask[idx] = 1;
|
||||
msMaskTrueSomewhere = 1;
|
||||
|
||||
for (j=sfbOffset[idx]; j<sfbOffset[idx+1]; j++) {
|
||||
Word32 left, right;
|
||||
left = (mdctSpectrumLeft[j] >> 1);
|
||||
right = (mdctSpectrumRight[j] >> 1);
|
||||
mdctSpectrumLeft[j] = left + right;
|
||||
mdctSpectrumRight[j] = left - right;
|
||||
mdctSpectrumLeft[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;
|
||||
sfbSpreadedEnLeft[idx] = sfbSpreadedEnRight[idx];
|
||||
|
||||
sfbThresholdLeft[idx] = minThreshold;
|
||||
sfbThresholdRight[idx] = minThreshold;
|
||||
sfbEnergyLeft[idx] = sfbEnergyMid[idx];
|
||||
sfbEnergyRight[idx] = sfbEnergySide[idx];
|
||||
|
||||
sfbSpreadedEnRight[idx] = min(sfbSpreadedEnLeft[idx],sfbSpreadedEnRight[idx]) >> 1;
|
||||
sfbSpreadedEnLeft[idx] = sfbSpreadedEnRight[idx];
|
||||
|
||||
}
|
||||
else {
|
||||
msMask[idx] = 0;
|
||||
msMaskFalseSomewhere = 1;
|
||||
msMask[idx] = 0;
|
||||
msMaskFalseSomewhere = 1;
|
||||
}
|
||||
}
|
||||
if ( msMaskTrueSomewhere ) {
|
||||
}
|
||||
if ( msMaskTrueSomewhere ) {
|
||||
if(msMaskFalseSomewhere ) {
|
||||
*msDigest = SI_MS_MASK_SOME;
|
||||
*msDigest = SI_MS_MASK_SOME;
|
||||
} else {
|
||||
*msDigest = SI_MS_MASK_ALL;
|
||||
*msDigest = SI_MS_MASK_ALL;
|
||||
}
|
||||
} else {
|
||||
*msDigest = SI_MS_MASK_NONE;
|
||||
*msDigest = SI_MS_MASK_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* function name:InitPreEchoControl
|
||||
* function name:InitPreEchoControl
|
||||
* description: init pre echo control parameter
|
||||
*
|
||||
*****************************************************************************/
|
||||
@@ -40,13 +40,13 @@ void InitPreEchoControl(Word32 *pbThresholdNm1,
|
||||
Word16 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
|
||||
* thr(n) = max(rpmin*thrq(n), min(thrq(n), rpelev*thrq1(n)))
|
||||
*
|
||||
@@ -68,22 +68,22 @@ void PreEchoControl(Word32 *pbThresholdNm1,
|
||||
(void)maxAllowedIncreaseFactor;
|
||||
|
||||
scaling = ((mdctScale - mdctScalenm1) << 1);
|
||||
|
||||
|
||||
if ( scaling > 0 ) {
|
||||
for(i = 0; i < numPb; i++) {
|
||||
tmpThreshold1 = pbThresholdNm1[i] >> (scaling-1);
|
||||
tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor);
|
||||
|
||||
/* copy thresholds to internal memory */
|
||||
pbThresholdNm1[i] = pbThreshold[i];
|
||||
pbThresholdNm1[i] = pbThreshold[i];
|
||||
|
||||
|
||||
|
||||
if(pbThreshold[i] > tmpThreshold1) {
|
||||
pbThreshold[i] = tmpThreshold1;
|
||||
pbThreshold[i] = tmpThreshold1;
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
|
||||
/* copy thresholds to internal memory */
|
||||
pbThresholdNm1[i] = pbThreshold[i];
|
||||
pbThresholdNm1[i] = pbThreshold[i];
|
||||
|
||||
|
||||
|
||||
if(((pbThreshold[i] >> scaling) > tmpThreshold1)) {
|
||||
pbThreshold[i] = tmpThreshold1 << scaling;
|
||||
}
|
||||
|
||||
|
||||
if(tmpThreshold2 > pbThreshold[i]) {
|
||||
pbThreshold[i] = tmpThreshold2;
|
||||
pbThreshold[i] = tmpThreshold2;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -88,17 +88,17 @@ Word32 GetSRIndex(Word32 sampleRate)
|
||||
*
|
||||
* function name: atan_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
|
||||
* = pi/2 - x/((float)0.280872f +x*x) if x >= 1
|
||||
* return: 1000*atan(x/1000)
|
||||
*
|
||||
**********************************************************************************/
|
||||
static Word16 atan_1000(Word32 val)
|
||||
static Word16 atan_1000(Word32 val)
|
||||
{
|
||||
Word32 y;
|
||||
|
||||
|
||||
|
||||
if(L_sub(val, 1000) < 0) {
|
||||
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_freq = (fftLine * samplingFreq) / (noOfLines << 1);
|
||||
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);
|
||||
|
||||
|
||||
return saturate(bvalFFTLine);
|
||||
}
|
||||
|
||||
@@ -148,17 +148,17 @@ static void initThrQuiet(Word16 numPb,
|
||||
for(i=0; i<numPb; i++) {
|
||||
Word16 bv1, bv2;
|
||||
|
||||
|
||||
|
||||
if (i>0)
|
||||
bv1 = (pbBarcVal[i] + pbBarcVal[i-1]) >> 1;
|
||||
else
|
||||
bv1 = pbBarcVal[i] >> 1;
|
||||
|
||||
|
||||
|
||||
if (i < (numPb - 1))
|
||||
bv2 = (pbBarcVal[i] + pbBarcVal[i+1]) >> 1;
|
||||
else {
|
||||
bv2 = pbBarcVal[i];
|
||||
bv2 = pbBarcVal[i];
|
||||
}
|
||||
|
||||
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]);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
we calculate
|
||||
we calculate
|
||||
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 maskLowSprEn, maskHighSprEn;
|
||||
|
||||
|
||||
|
||||
if (sub(blockType, SHORT_WINDOW) != 0) {
|
||||
maskLowSprEn = maskLowSprEnLong;
|
||||
|
||||
maskLowSprEn = maskLowSprEnLong;
|
||||
|
||||
if (bitrate > 22000)
|
||||
maskHighSprEn = maskHighSprEnLong;
|
||||
else
|
||||
maskHighSprEn = maskHighSprEnLongLowBr;
|
||||
}
|
||||
else {
|
||||
maskLowSprEn = maskLowSprEnShort;
|
||||
maskHighSprEn = maskHighSprEnShort;
|
||||
maskLowSprEn = maskLowSprEnShort;
|
||||
maskHighSprEn = maskHighSprEnShort;
|
||||
}
|
||||
|
||||
for(i=0; i<numPb; i++) {
|
||||
|
||||
|
||||
if (i > 0) {
|
||||
Word32 dbVal;
|
||||
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);
|
||||
pbMaskHiFactor[i] = round16(pow2_xy(L_negate(dbVal), (Word32)LOG2_1000)); /* 0.301 log10(2) */
|
||||
|
||||
|
||||
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);
|
||||
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);
|
||||
pbMaskLoFactorSprEn[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
|
||||
}
|
||||
else {
|
||||
pbMaskHiFactor[i] = 0;
|
||||
pbMaskLoFactor[numPb-1] = 0;
|
||||
pbMaskHiFactor[i] = 0;
|
||||
pbMaskLoFactor[numPb-1] = 0;
|
||||
|
||||
pbMaskHiFactorSprEn[i] = 0;
|
||||
pbMaskLoFactorSprEn[numPb-1] = 0;
|
||||
pbMaskHiFactorSprEn[i] = 0;
|
||||
pbMaskLoFactorSprEn[numPb-1] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -258,12 +258,12 @@ static void initBarcValues(Word16 numPb,
|
||||
Word16 i;
|
||||
Word16 pbBval0, pbBval1;
|
||||
|
||||
pbBval0 = 0;
|
||||
pbBval0 = 0;
|
||||
|
||||
for(i=0; i<numPb; i++){
|
||||
pbBval1 = BarcLineValue(numLines, pbOffset[i+1], samplingFrequency);
|
||||
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));
|
||||
|
||||
pbVal0 = 0;
|
||||
pbVal0 = 0;
|
||||
|
||||
for (sfb=0; sfb<sfbActive; sfb++) {
|
||||
|
||||
pbVal1 = (pbBarcVal[sfb] << 1) - pbVal0;
|
||||
barcWidth = pbVal1 - pbVal0;
|
||||
pbVal0 = pbVal1;
|
||||
pbVal0 = pbVal1;
|
||||
|
||||
/* allow at least 2.4% of pe for each active barc */
|
||||
pePart = ((pePerWindow * 24) * (max_bark * barcWidth)) /
|
||||
(pbBarcVal[sfbActive-1] * (sfbOffset[sfb+1] - sfbOffset[sfb]));
|
||||
|
||||
|
||||
pePart = min(pePart, 8400);
|
||||
|
||||
|
||||
pePart = min(pePart, 8400);
|
||||
pePart = max(pePart, 1400);
|
||||
|
||||
/* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)*/
|
||||
/* we add an offset of 2^16 to the pow functions */
|
||||
/* 0xc000 = 1.5*(1 << 15)*/
|
||||
|
||||
|
||||
snr = pow2_xy((pePart - 16*1000),1000) - 0x0000c000;
|
||||
|
||||
|
||||
if(snr > 0x00008000)
|
||||
{
|
||||
shift = norm_l(snr);
|
||||
snr = Div_32(0x00008000 << shift, snr << shift);
|
||||
snr = Div_32(0x00008000 << shift, snr << shift);
|
||||
}
|
||||
else
|
||||
{
|
||||
snr = 0x7fffffff;
|
||||
}
|
||||
|
||||
|
||||
/* upper limit is -1 dB */
|
||||
snr = min(snr, c_maxsnr);
|
||||
/* lower limit is -25 dB */
|
||||
@@ -354,7 +354,7 @@ Word16 InitPsyConfigurationLong(Word32 bitrate,
|
||||
/*
|
||||
init sfb table
|
||||
*/
|
||||
samplerateindex = GetSRIndex(samplerate);
|
||||
samplerateindex = GetSRIndex(samplerate);
|
||||
psyConf->sfbCnt = sfBandTotalLong[samplerateindex];
|
||||
psyConf->sfbOffset = sfBandTabLong + sfBandTabLongOffset[samplerateindex];
|
||||
psyConf->sampRateIdx = samplerateindex;
|
||||
@@ -391,19 +391,19 @@ Word16 InitPsyConfigurationLong(Word32 bitrate,
|
||||
/*
|
||||
init ratio
|
||||
*/
|
||||
psyConf->ratio = c_ratio;
|
||||
psyConf->ratio = c_ratio;
|
||||
|
||||
psyConf->maxAllowedIncreaseFactor = 2;
|
||||
psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor; /* 0.01 *(1 << 15)*/
|
||||
psyConf->maxAllowedIncreaseFactor = 2;
|
||||
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);
|
||||
|
||||
for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) {
|
||||
if (sub(psyConf->sfbOffset[sfb], psyConf->lowpassLine) >= 0)
|
||||
break;
|
||||
}
|
||||
psyConf->sfbActive = sfb;
|
||||
psyConf->sfbActive = sfb;
|
||||
|
||||
/*
|
||||
calculate minSnr
|
||||
@@ -429,7 +429,7 @@ Word16 InitPsyConfigurationLong(Word32 bitrate,
|
||||
Word16 InitPsyConfigurationShort(Word32 bitrate,
|
||||
Word32 samplerate,
|
||||
Word16 bandwidth,
|
||||
PSY_CONFIGURATION_SHORT *psyConf)
|
||||
PSY_CONFIGURATION_SHORT *psyConf)
|
||||
{
|
||||
Word32 samplerateindex;
|
||||
Word16 sfbBarcVal[MAX_SFB_SHORT];
|
||||
@@ -437,7 +437,7 @@ Word16 InitPsyConfigurationShort(Word32 bitrate,
|
||||
/*
|
||||
init sfb table
|
||||
*/
|
||||
samplerateindex = GetSRIndex(samplerate);
|
||||
samplerateindex = GetSRIndex(samplerate);
|
||||
psyConf->sfbCnt = sfBandTotalShort[samplerateindex];
|
||||
psyConf->sfbOffset = sfBandTabShort + sfBandTabShortOffset[samplerateindex];
|
||||
psyConf->sampRateIdx = samplerateindex;
|
||||
@@ -473,21 +473,21 @@ Word16 InitPsyConfigurationShort(Word32 bitrate,
|
||||
/*
|
||||
init ratio
|
||||
*/
|
||||
psyConf->ratio = c_ratio;
|
||||
psyConf->ratio = c_ratio;
|
||||
|
||||
psyConf->maxAllowedIncreaseFactor = 2;
|
||||
psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor;
|
||||
psyConf->maxAllowedIncreaseFactor = 2;
|
||||
psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor;
|
||||
|
||||
psyConf->clipEnergy = c_maxClipEnergyShort;
|
||||
psyConf->clipEnergy = c_maxClipEnergyShort;
|
||||
|
||||
psyConf->lowpassLine = extract_l(((bandwidth << 1) * FRAME_LEN_SHORT) / samplerate);
|
||||
|
||||
|
||||
for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) {
|
||||
|
||||
|
||||
if (psyConf->sfbOffset[sfb] >= psyConf->lowpassLine)
|
||||
break;
|
||||
}
|
||||
psyConf->sfbActive = sfb;
|
||||
psyConf->sfbActive = sfb;
|
||||
|
||||
/*
|
||||
calculate minSnr
|
||||
|
||||
@@ -81,7 +81,7 @@ Word16 PsyNew(PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP)
|
||||
Word32 *mdctSpectrum;
|
||||
Word32 *scratchTNS;
|
||||
Word16 *mdctDelayBuffer;
|
||||
|
||||
|
||||
mdctSpectrum = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC);
|
||||
if(NULL == mdctSpectrum)
|
||||
return 1;
|
||||
@@ -99,7 +99,7 @@ Word16 PsyNew(PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP)
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -124,12 +124,12 @@ Word16 PsyDelete(PSY_KERNEL *hPsy, VO_MEM_OPERATOR *pMemOP)
|
||||
{
|
||||
if(hPsy->psyData[0].mdctDelayBuffer)
|
||||
mem_free(pMemOP, hPsy->psyData[0].mdctDelayBuffer, VO_INDEX_ENC_AAC);
|
||||
|
||||
|
||||
if(hPsy->psyData[0].mdctSpectrum)
|
||||
mem_free(pMemOP, hPsy->psyData[0].mdctSpectrum, VO_INDEX_ENC_AAC);
|
||||
|
||||
for (nch=0; nch<MAX_CHANNELS; nch++){
|
||||
hPsy->psyData[nch].mdctDelayBuffer = NULL;
|
||||
hPsy->psyData[nch].mdctDelayBuffer = NULL;
|
||||
hPsy->psyData[nch].mdctSpectrum = NULL;
|
||||
}
|
||||
|
||||
@@ -216,14 +216,14 @@ Word16 psyMainInit(PSY_KERNEL *hPsy,
|
||||
|
||||
if (!err)
|
||||
for(ch=0;ch < channels;ch++){
|
||||
|
||||
|
||||
InitBlockSwitching(&hPsy->psyData[ch].blockSwitchingControl,
|
||||
bitRate, channels);
|
||||
|
||||
InitPreEchoControl(hPsy->psyData[ch].sfbThresholdnm1,
|
||||
hPsy->psyConfLong.sfbCnt,
|
||||
hPsy->psyConfLong.sfbThresholdQuiet);
|
||||
hPsy->psyData[ch].mdctScalenm1 = 0;
|
||||
hPsy->psyData[ch].mdctScalenm1 = 0;
|
||||
}
|
||||
|
||||
return(err);
|
||||
@@ -241,7 +241,7 @@ Word16 psyMainInit(PSY_KERNEL *hPsy,
|
||||
|
||||
Word16 psyMain(Word16 nChannels,
|
||||
ELEMENT_INFO *elemInfo,
|
||||
Word16 *timeSignal,
|
||||
Word16 *timeSignal,
|
||||
PSY_DATA psyData[MAX_CHANNELS],
|
||||
TNS_DATA tnsData[MAX_CHANNELS],
|
||||
PSY_CONFIGURATION_LONG *hPsyConfLong,
|
||||
@@ -260,8 +260,8 @@ Word16 psyMain(Word16 nChannels,
|
||||
Word16 channels;
|
||||
Word16 maxScale;
|
||||
|
||||
channels = elemInfo->nChannelsInEl;
|
||||
maxScale = 0;
|
||||
channels = elemInfo->nChannelsInEl;
|
||||
maxScale = 0;
|
||||
|
||||
/* block switching */
|
||||
for(ch = 0; ch < channels; ch++) {
|
||||
@@ -291,7 +291,7 @@ Word16 psyMain(Word16 nChannels,
|
||||
/* common scaling for all channels */
|
||||
for (ch=0; ch<channels; ch++) {
|
||||
Word16 scaleDiff = maxScale - mdctScalingArray[ch];
|
||||
|
||||
|
||||
if (scaleDiff > 0) {
|
||||
Word32 *Spectrum = psyData[ch].mdctSpectrum;
|
||||
for(line=0; line<FRAME_LEN_LONG; line++) {
|
||||
@@ -299,11 +299,11 @@ Word16 psyMain(Word16 nChannels,
|
||||
Spectrum++;
|
||||
}
|
||||
}
|
||||
psyData[ch].mdctScale = maxScale;
|
||||
psyData[ch].mdctScale = maxScale;
|
||||
}
|
||||
|
||||
for (ch=0; ch<channels; ch++) {
|
||||
|
||||
|
||||
if(psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW) {
|
||||
/* update long block parameter */
|
||||
advancePsychLong(&psyData[ch],
|
||||
@@ -317,7 +317,7 @@ Word16 psyMain(Word16 nChannels,
|
||||
/* determine maxSfb */
|
||||
for (sfb=hPsyConfLong->sfbCnt-1; sfb>=0; sfb--) {
|
||||
for (line=hPsyConfLong->sfbOffset[sfb+1] - 1; line>=hPsyConfLong->sfbOffset[sfb]; line--) {
|
||||
|
||||
|
||||
if (psyData[ch].mdctSpectrum[line] != 0) break;
|
||||
}
|
||||
if (line >= hPsyConfLong->sfbOffset[sfb]) break;
|
||||
@@ -326,7 +326,7 @@ Word16 psyMain(Word16 nChannels,
|
||||
|
||||
/* Calc bandwise energies for mid and side channel
|
||||
Do it only if 2 channels exist */
|
||||
|
||||
|
||||
if (ch == 1)
|
||||
advancePsychLongMS(psyData, hPsyConfLong);
|
||||
}
|
||||
@@ -341,7 +341,7 @@ Word16 psyMain(Word16 nChannels,
|
||||
|
||||
/* Calc bandwise energies for mid and side channel
|
||||
Do it only if 2 channels exist */
|
||||
|
||||
|
||||
if (ch == 1)
|
||||
advancePsychShortMS (psyData, hPsyConfShort);
|
||||
}
|
||||
@@ -349,7 +349,7 @@ Word16 psyMain(Word16 nChannels,
|
||||
|
||||
/* group short data */
|
||||
for(ch=0; ch<channels; ch++) {
|
||||
|
||||
|
||||
if (psyData[ch].blockSwitchingControl.windowSequence == SHORT_WINDOW) {
|
||||
groupShortData(psyData[ch].mdctSpectrum,
|
||||
pScratchTns,
|
||||
@@ -374,10 +374,10 @@ Word16 psyMain(Word16 nChannels,
|
||||
stereo Processing
|
||||
*/
|
||||
if (channels == 2) {
|
||||
psyOutElement->toolsInfo.msDigest = MS_NONE;
|
||||
psyOutElement->toolsInfo.msDigest = MS_NONE;
|
||||
maxSfbPerGroup[0] = maxSfbPerGroup[1] = max(maxSfbPerGroup[0], maxSfbPerGroup[1]);
|
||||
|
||||
|
||||
|
||||
if (psyData[0].blockSwitchingControl.windowSequence != SHORT_WINDOW)
|
||||
MsStereoProcessing(psyData[0].sfbEnergy.sfbLong,
|
||||
psyData[1].sfbEnergy.sfbLong,
|
||||
@@ -420,7 +420,7 @@ Word16 psyMain(Word16 nChannels,
|
||||
build output
|
||||
*/
|
||||
for(ch=0;ch<channels;ch++) {
|
||||
|
||||
|
||||
if (psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW)
|
||||
BuildInterface(psyData[ch].mdctSpectrum,
|
||||
psyData[ch].mdctScale,
|
||||
@@ -483,7 +483,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
||||
/* low pass */
|
||||
data0 = psyData->mdctSpectrum + hPsyConfLong->lowpassLine;
|
||||
for(i=hPsyConfLong->lowpassLine; i<FRAME_LEN_LONG; i++) {
|
||||
*data0++ = 0;
|
||||
*data0++ = 0;
|
||||
}
|
||||
|
||||
/* Calc sfb-bandwise mdct-energies for left and right channel */
|
||||
@@ -505,7 +505,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
||||
psyData->blockSwitchingControl.windowSequence,
|
||||
psyData->sfbEnergy.sfbLong);
|
||||
|
||||
/* TnsSync */
|
||||
/* TnsSync */
|
||||
if (ch == 1) {
|
||||
TnsSync(tnsData,
|
||||
tnsData2,
|
||||
@@ -514,7 +514,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
||||
psyData->blockSwitchingControl.windowSequence);
|
||||
}
|
||||
|
||||
/* Tns Encoder */
|
||||
/* Tns Encoder */
|
||||
TnsEncode(&psyOutChannel->tnsInfo,
|
||||
tnsData,
|
||||
hPsyConfLong->sfbCnt,
|
||||
@@ -532,15 +532,15 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
||||
*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) {
|
||||
Word16 tnsStartBand = hPsyConfLong->tnsConf.tnsStartBand;
|
||||
Word16 tnsStartBand = hPsyConfLong->tnsConf.tnsStartBand;
|
||||
CalcBandEnergy( psyData->mdctSpectrum,
|
||||
hPsyConfLong->sfbOffset+tnsStartBand,
|
||||
hPsyConfLong->sfbActive - tnsStartBand,
|
||||
psyData->sfbEnergy.sfbLong+tnsStartBand,
|
||||
&psyData->sfbEnergySum.sfbLong);
|
||||
|
||||
|
||||
data0 = psyData->sfbEnergy.sfbLong;
|
||||
tdata = psyData->sfbEnergySum.sfbLong;
|
||||
for (i=0; i<tnsStartBand; i++)
|
||||
@@ -565,13 +565,13 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
||||
data0++; data1++;
|
||||
}
|
||||
|
||||
/* preecho control */
|
||||
/* preecho control */
|
||||
if (psyData->blockSwitchingControl.windowSequence == STOP_WINDOW) {
|
||||
data0 = psyData->sfbThresholdnm1;
|
||||
for (i=hPsyConfLong->sfbCnt; i; i--) {
|
||||
*data0++ = MAX_32;
|
||||
*data0++ = MAX_32;
|
||||
}
|
||||
psyData->mdctScalenm1 = 0;
|
||||
psyData->mdctScalenm1 = 0;
|
||||
}
|
||||
|
||||
PreEchoControl( psyData->sfbThresholdnm1,
|
||||
@@ -581,15 +581,15 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
||||
psyData->sfbThreshold.sfbLong,
|
||||
psyData->mdctScale,
|
||||
psyData->mdctScalenm1);
|
||||
psyData->mdctScalenm1 = psyData->mdctScale;
|
||||
psyData->mdctScalenm1 = psyData->mdctScale;
|
||||
|
||||
|
||||
|
||||
if (psyData->blockSwitchingControl.windowSequence== START_WINDOW) {
|
||||
data0 = psyData->sfbThresholdnm1;
|
||||
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 */
|
||||
@@ -603,13 +603,13 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
||||
data0 = psyData->sfbSpreadedEnergy.sfbLong;
|
||||
data1 = psyData->sfbEnergy.sfbLong;
|
||||
for (i=hPsyConfLong->sfbCnt; i; i--) {
|
||||
//psyData->sfbSpreadedEnergy.sfbLong[i] = psyData->sfbEnergy.sfbLong[i];
|
||||
//psyData->sfbSpreadedEnergy.sfbLong[i] = psyData->sfbEnergy.sfbLong[i];
|
||||
*data0++ = *data1++;
|
||||
}
|
||||
|
||||
/* spreading energy */
|
||||
SpreadingMax(hPsyConfLong->sfbCnt,
|
||||
hPsyConfLong->sfbMaskLowFactorSprEn,
|
||||
hPsyConfLong->sfbMaskLowFactorSprEn,
|
||||
hPsyConfLong->sfbMaskHighFactorSprEn,
|
||||
psyData->sfbSpreadedEnergy.sfbLong);
|
||||
|
||||
@@ -619,7 +619,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData,
|
||||
/*****************************************************************************
|
||||
*
|
||||
* 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
|
||||
*
|
||||
*****************************************************************************/
|
||||
@@ -657,7 +657,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
|
||||
Word32 w;
|
||||
Word32 normEnergyShift = (psyData->mdctScale + 1) << 1; /* in reference code, mdct spectrum must be multipied with 2, so +1 */
|
||||
Word32 clipEnergy = hPsyConfShort->clipEnergy >> normEnergyShift;
|
||||
Word32 wOffset = 0;
|
||||
Word32 wOffset = 0;
|
||||
Word32 *data0, *data1;
|
||||
|
||||
for(w = 0; w < TRANS_FAC; w++) {
|
||||
@@ -666,7 +666,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
|
||||
/* low pass */
|
||||
data0 = psyData->mdctSpectrum + wOffset + hPsyConfShort->lowpassLine;
|
||||
for(i=hPsyConfShort->lowpassLine; i<FRAME_LEN_SHORT; i++){
|
||||
*data0++ = 0;
|
||||
*data0++ = 0;
|
||||
}
|
||||
|
||||
/* Calc sfb-bandwise mdct-energies for left and right channel */
|
||||
@@ -713,9 +713,9 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
|
||||
*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) {
|
||||
Word16 tnsStartBand = hPsyConfShort->tnsConf.tnsStartBand;
|
||||
Word16 tnsStartBand = hPsyConfShort->tnsConf.tnsStartBand;
|
||||
CalcBandEnergy( psyData->mdctSpectrum+wOffset,
|
||||
hPsyConfShort->sfbOffset+tnsStartBand,
|
||||
(hPsyConfShort->sfbActive - tnsStartBand),
|
||||
@@ -748,7 +748,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
|
||||
}
|
||||
|
||||
|
||||
/* preecho */
|
||||
/* preecho */
|
||||
PreEchoControl( psyData->sfbThresholdnm1,
|
||||
hPsyConfShort->sfbCnt,
|
||||
hPsyConfShort->maxAllowedIncreaseFactor,
|
||||
@@ -770,14 +770,14 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
|
||||
*data0++ = *data1++;
|
||||
}
|
||||
SpreadingMax(hPsyConfShort->sfbCnt,
|
||||
hPsyConfShort->sfbMaskLowFactorSprEn,
|
||||
hPsyConfShort->sfbMaskLowFactorSprEn,
|
||||
hPsyConfShort->sfbMaskHighFactorSprEn,
|
||||
psyData->sfbSpreadedEnergy.sfbShort[w]);
|
||||
|
||||
wOffset += FRAME_LEN_SHORT;
|
||||
} /* for TRANS_FAC */
|
||||
|
||||
psyData->mdctScalenm1 = psyData->mdctScale;
|
||||
psyData->mdctScalenm1 = psyData->mdctScale;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -785,7 +785,7 @@ static Word16 advancePsychShort(PSY_DATA* psyData,
|
||||
/*****************************************************************************
|
||||
*
|
||||
* 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
|
||||
*
|
||||
*****************************************************************************/
|
||||
@@ -793,7 +793,7 @@ static Word16 advancePsychShortMS (PSY_DATA psyData[MAX_CHANNELS],
|
||||
const PSY_CONFIGURATION_SHORT *hPsyConfShort)
|
||||
{
|
||||
Word32 w, wOffset;
|
||||
wOffset = 0;
|
||||
wOffset = 0;
|
||||
for(w=0; w<TRANS_FAC; w++) {
|
||||
CalcBandEnergyMS(psyData[0].mdctSpectrum+wOffset,
|
||||
psyData[1].mdctSpectrum+wOffset,
|
||||
|
||||
@@ -68,12 +68,12 @@ static Word16 calcFrameLen(Word32 bitRate,
|
||||
result = (FRAME_LEN_LONG >> 3) * bitRate;
|
||||
quot = result / sampleRate;
|
||||
|
||||
|
||||
|
||||
if (mode == FRAME_LEN_BYTES_MODULO) {
|
||||
result -= quot * sampleRate;
|
||||
}
|
||||
else { /* FRAME_LEN_BYTES_INT */
|
||||
result = quot;
|
||||
result = quot;
|
||||
}
|
||||
|
||||
return result;
|
||||
@@ -83,7 +83,7 @@ static Word16 calcFrameLen(Word32 bitRate,
|
||||
*
|
||||
* function name:framePadding
|
||||
* description: Calculates if padding is needed for actual frame
|
||||
* returns: paddingOn or not
|
||||
* returns: paddingOn or not
|
||||
*
|
||||
*****************************************************************************/
|
||||
static Word16 framePadding(Word32 bitRate,
|
||||
@@ -93,16 +93,16 @@ static Word16 framePadding(Word32 bitRate,
|
||||
Word16 paddingOn;
|
||||
Word16 difference;
|
||||
|
||||
paddingOn = 0;
|
||||
paddingOn = 0;
|
||||
|
||||
difference = calcFrameLen( bitRate,
|
||||
sampleRate,
|
||||
FRAME_LEN_BYTES_MODULO );
|
||||
*paddingRest = *paddingRest - difference;
|
||||
|
||||
|
||||
|
||||
if (*paddingRest <= 0 ) {
|
||||
paddingOn = 1;
|
||||
paddingOn = 1;
|
||||
*paddingRest = *paddingRest + sampleRate;
|
||||
}
|
||||
|
||||
@@ -123,12 +123,12 @@ Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP)
|
||||
Word32 i;
|
||||
Word16 *quantSpec;
|
||||
Word16 *scf;
|
||||
UWord16 *maxValueInSfb;
|
||||
|
||||
UWord16 *maxValueInSfb;
|
||||
|
||||
quantSpec = (Word16 *)mem_malloc(pMemOP, nChannels * FRAME_LEN_LONG * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
|
||||
if(NULL == quantSpec)
|
||||
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)
|
||||
{
|
||||
return 1;
|
||||
@@ -141,12 +141,12 @@ Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP)
|
||||
|
||||
for (i=0; i<nChannels; i++) {
|
||||
hQC->qcChannel[i].quantSpec = quantSpec + i*FRAME_LEN_LONG;
|
||||
|
||||
|
||||
hQC->qcChannel[i].maxValueInSfb = maxValueInSfb + i*MAX_GROUPED_SFB;
|
||||
|
||||
|
||||
hQC->qcChannel[i].scf = scf + i*MAX_GROUPED_SFB;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -165,21 +165,21 @@ void QCOutDelete(QC_OUT* hQC, VO_MEM_OPERATOR *pMemOP)
|
||||
{
|
||||
if(hQC->qcChannel[0].quantSpec);
|
||||
mem_free(pMemOP, hQC->qcChannel[0].quantSpec, VO_INDEX_ENC_AAC);
|
||||
|
||||
|
||||
if(hQC->qcChannel[0].maxValueInSfb)
|
||||
mem_free(pMemOP, hQC->qcChannel[0].maxValueInSfb, VO_INDEX_ENC_AAC);
|
||||
|
||||
|
||||
if(hQC->qcChannel[0].scf)
|
||||
mem_free(pMemOP, hQC->qcChannel[0].scf, VO_INDEX_ENC_AAC);
|
||||
|
||||
for (i=0; i<MAX_CHANNELS; i++) {
|
||||
hQC->qcChannel[i].quantSpec = NULL;
|
||||
|
||||
|
||||
hQC->qcChannel[i].maxValueInSfb = 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)
|
||||
{
|
||||
|
||||
/*
|
||||
|
||||
/*
|
||||
nothing to do
|
||||
*/
|
||||
hQC=NULL;
|
||||
@@ -221,15 +221,15 @@ void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
|
||||
Word16 QCInit(QC_STATE *hQC,
|
||||
struct QC_INIT *init)
|
||||
{
|
||||
hQC->nChannels = init->elInfo->nChannelsInEl;
|
||||
hQC->maxBitsTot = init->maxBits;
|
||||
hQC->nChannels = init->elInfo->nChannelsInEl;
|
||||
hQC->maxBitsTot = init->maxBits;
|
||||
hQC->bitResTot = sub(init->bitRes, init->averageBits);
|
||||
hQC->averageBitsTot = init->averageBits;
|
||||
hQC->maxBitFac = init->maxBitFac;
|
||||
hQC->averageBitsTot = init->averageBits;
|
||||
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 */
|
||||
InitElementBits(&hQC->elementBits,
|
||||
@@ -248,13 +248,13 @@ Word16 QCInit(QC_STATE *hQC,
|
||||
|
||||
|
||||
/*********************************************************************************
|
||||
*
|
||||
*
|
||||
* function name: QCMain
|
||||
* description: quantization and coding the spectrum
|
||||
* returns: 0 if success
|
||||
*
|
||||
**********************************************************************************/
|
||||
Word16 QCMain(QC_STATE* hQC,
|
||||
Word16 QCMain(QC_STATE* hQC,
|
||||
ELEMENT_BITS* elBits,
|
||||
ATS_ELEMENT* adjThrStateElement,
|
||||
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_ELEMENT* qcOutElement,
|
||||
Word16 nChannels,
|
||||
Word16 ancillaryDataBytes)
|
||||
Word16 ancillaryDataBytes)
|
||||
{
|
||||
Word16 maxChDynBits[MAX_CHANNELS];
|
||||
Word16 chBitDistribution[MAX_CHANNELS];
|
||||
Word16 chBitDistribution[MAX_CHANNELS];
|
||||
Word32 ch;
|
||||
|
||||
|
||||
if (elBits->bitResLevel < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
if (elBits->bitResLevel > elBits->maxBitResBits) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
qcOutElement->staticBitsUsed = countStaticBitdemand(psyOutChannel,
|
||||
psyOutElement,
|
||||
nChannels,
|
||||
nChannels,
|
||||
qcOutElement->adtsUsed);
|
||||
|
||||
|
||||
|
||||
if (ancillaryDataBytes) {
|
||||
qcOutElement->ancBitsUsed = 7 + (ancillaryDataBytes << 3);
|
||||
|
||||
|
||||
if (ancillaryDataBytes >= 15)
|
||||
qcOutElement->ancBitsUsed = qcOutElement->ancBitsUsed + 8;
|
||||
}
|
||||
else {
|
||||
qcOutElement->ancBitsUsed = 0;
|
||||
qcOutElement->ancBitsUsed = 0;
|
||||
}
|
||||
|
||||
CalcFormFactor(hQC->logSfbFormFactor, hQC->sfbNRelevantLines, hQC->logSfbEnergy, psyOutChannel, nChannels);
|
||||
@@ -301,7 +301,7 @@ Word16 QCMain(QC_STATE* hQC,
|
||||
psyOutElement,
|
||||
chBitDistribution,
|
||||
hQC->logSfbEnergy,
|
||||
hQC->sfbNRelevantLines,
|
||||
hQC->sfbNRelevantLines,
|
||||
qcOutElement,
|
||||
elBits,
|
||||
nChannels,
|
||||
@@ -323,14 +323,14 @@ Word16 QCMain(QC_STATE* hQC,
|
||||
maxChDynBits[ch] = extract_l(chBitDistribution[ch] * maxDynBits / 1000);
|
||||
}
|
||||
|
||||
qcOutElement->dynBitsUsed = 0;
|
||||
qcOutElement->dynBitsUsed = 0;
|
||||
for (ch = 0; ch < nChannels; ch++) {
|
||||
Word32 chDynBits;
|
||||
Flag constraintsFulfilled;
|
||||
Word32 iter;
|
||||
iter = 0;
|
||||
iter = 0;
|
||||
do {
|
||||
constraintsFulfilled = 1;
|
||||
constraintsFulfilled = 1;
|
||||
|
||||
QuantizeSpectrum(psyOutChannel[ch].sfbCnt,
|
||||
psyOutChannel[ch].maxSfbPerGroup,
|
||||
@@ -340,14 +340,14 @@ Word16 QCMain(QC_STATE* hQC,
|
||||
qcOutChannel[ch].globalGain,
|
||||
qcOutChannel[ch].scf,
|
||||
qcOutChannel[ch].quantSpec);
|
||||
|
||||
|
||||
if (calcMaxValueInSfb(psyOutChannel[ch].sfbCnt,
|
||||
psyOutChannel[ch].maxSfbPerGroup,
|
||||
psyOutChannel[ch].sfbPerGroup,
|
||||
psyOutChannel[ch].sfbOffsets,
|
||||
qcOutChannel[ch].quantSpec,
|
||||
qcOutChannel[ch].maxValueInSfb) > MAX_QUANT) {
|
||||
constraintsFulfilled = 0;
|
||||
constraintsFulfilled = 0;
|
||||
}
|
||||
|
||||
chDynBits = dynBitCount(qcOutChannel[ch].quantSpec,
|
||||
@@ -359,24 +359,24 @@ Word16 QCMain(QC_STATE* hQC,
|
||||
psyOutChannel[ch].sfbPerGroup,
|
||||
psyOutChannel[ch].sfbOffsets,
|
||||
&qcOutChannel[ch].sectionData);
|
||||
|
||||
|
||||
if (chDynBits >= maxChDynBits[ch]) {
|
||||
constraintsFulfilled = 0;
|
||||
constraintsFulfilled = 0;
|
||||
}
|
||||
|
||||
|
||||
if (!constraintsFulfilled) {
|
||||
qcOutChannel[ch].globalGain = qcOutChannel[ch].globalGain + 1;
|
||||
}
|
||||
|
||||
iter = iter + 1;
|
||||
|
||||
|
||||
} while(!constraintsFulfilled);
|
||||
|
||||
qcOutElement->dynBitsUsed = qcOutElement->dynBitsUsed + chDynBits;
|
||||
|
||||
qcOutChannel[ch].mdctScale = psyOutChannel[ch].mdctScale;
|
||||
qcOutChannel[ch].groupingMask = psyOutChannel[ch].groupingMask;
|
||||
qcOutChannel[ch].windowShape = psyOutChannel[ch].windowShape;
|
||||
qcOutChannel[ch].mdctScale = psyOutChannel[ch].mdctScale;
|
||||
qcOutChannel[ch].groupingMask = psyOutChannel[ch].groupingMask;
|
||||
qcOutChannel[ch].windowShape = psyOutChannel[ch].windowShape;
|
||||
}
|
||||
|
||||
/* save dynBitsUsed for correction of bits2pe relation */
|
||||
@@ -411,13 +411,13 @@ static Word16 calcMaxValueInSfb(Word16 sfbCnt,
|
||||
Word16 sfbOffs, sfb;
|
||||
Word16 maxValueAll;
|
||||
|
||||
maxValueAll = 0;
|
||||
maxValueAll = 0;
|
||||
|
||||
for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) {
|
||||
for (sfb = 0; sfb < maxSfbPerGroup; sfb++) {
|
||||
Word16 line;
|
||||
Word16 maxThisSfb;
|
||||
maxThisSfb = 0;
|
||||
maxThisSfb = 0;
|
||||
|
||||
for (line = sfbOffset[sfbOffs+sfb]; line < sfbOffset[sfbOffs+sfb+1]; line++) {
|
||||
Word16 absVal;
|
||||
@@ -425,7 +425,7 @@ static Word16 calcMaxValueInSfb(Word16 sfbCnt,
|
||||
maxThisSfb = max(maxThisSfb, absVal);
|
||||
}
|
||||
|
||||
maxValue[sfbOffs+sfb] = maxThisSfb;
|
||||
maxValue[sfbOffs+sfb] = maxThisSfb;
|
||||
maxValueAll = max(maxValueAll, maxThisSfb);
|
||||
}
|
||||
}
|
||||
@@ -441,15 +441,15 @@ static Word16 calcMaxValueInSfb(Word16 sfbCnt,
|
||||
**********************************************************************************/
|
||||
void updateBitres(QC_STATE* qcKernel,
|
||||
QC_OUT* qcOut)
|
||||
|
||||
|
||||
{
|
||||
ELEMENT_BITS *elBits;
|
||||
|
||||
qcKernel->bitResTot = 0;
|
||||
|
||||
qcKernel->bitResTot = 0;
|
||||
|
||||
elBits = &qcKernel->elementBits;
|
||||
|
||||
|
||||
|
||||
if (elBits->averageBits > 0) {
|
||||
/* constant bitrate */
|
||||
Word16 bitsUsed;
|
||||
@@ -460,8 +460,8 @@ void updateBitres(QC_STATE* qcKernel,
|
||||
}
|
||||
else {
|
||||
/* variable bitrate */
|
||||
elBits->bitResLevel = elBits->maxBits;
|
||||
qcKernel->bitResTot = qcKernel->maxBitsTot;
|
||||
elBits->bitResLevel = elBits->maxBits;
|
||||
qcKernel->bitResTot = qcKernel->maxBitsTot;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -476,55 +476,55 @@ Word16 FinalizeBitConsumption(QC_STATE *qcKernel,
|
||||
{
|
||||
Word32 nFullFillElem;
|
||||
Word32 totFillBits;
|
||||
Word16 diffBits;
|
||||
Word16 diffBits;
|
||||
Word16 bitsUsed;
|
||||
|
||||
totFillBits = 0;
|
||||
totFillBits = 0;
|
||||
|
||||
qcOut->totStaticBitsUsed = qcKernel->globStatBits;
|
||||
qcOut->totStaticBitsUsed = qcKernel->globStatBits;
|
||||
qcOut->totStaticBitsUsed += qcOut->qcElement.staticBitsUsed;
|
||||
qcOut->totDynBitsUsed = qcOut->qcElement.dynBitsUsed;
|
||||
qcOut->totAncBitsUsed = qcOut->qcElement.ancBitsUsed;
|
||||
qcOut->totFillBits = qcOut->qcElement.fillBits;
|
||||
|
||||
|
||||
if (qcOut->qcElement.fillBits) {
|
||||
totFillBits += qcOut->qcElement.fillBits;
|
||||
}
|
||||
|
||||
nFullFillElem = (max((qcOut->totFillBits - 1), 0) / maxFillElemBits) * maxFillElemBits;
|
||||
|
||||
|
||||
qcOut->totFillBits = qcOut->totFillBits - nFullFillElem;
|
||||
|
||||
/* check fill elements */
|
||||
|
||||
|
||||
if (qcOut->totFillBits > 0) {
|
||||
/* minimum Fillelement contains 7 (TAG + byte cnt) bits */
|
||||
qcOut->totFillBits = max(7, qcOut->totFillBits);
|
||||
/* 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;
|
||||
|
||||
/* now distribute extra fillbits and alignbits over channel elements */
|
||||
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) &&
|
||||
(qcOut->totFillBits > 8))
|
||||
qcOut->totFillBits = qcOut->totFillBits - 8;
|
||||
|
||||
|
||||
|
||||
diffBits = qcOut->alignBits + qcOut->totFillBits - totFillBits;
|
||||
|
||||
|
||||
if(diffBits>=0) {
|
||||
qcOut->qcElement.fillBits += diffBits;
|
||||
}
|
||||
|
||||
bitsUsed = qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed + qcOut->totAncBitsUsed;
|
||||
bitsUsed = bitsUsed + qcOut->totFillBits + qcOut->alignBits;
|
||||
|
||||
|
||||
if (bitsUsed > qcKernel->maxBitsTot) {
|
||||
return -1;
|
||||
}
|
||||
@@ -564,9 +564,9 @@ Word16 AdjustBitrate(QC_STATE *hQC,
|
||||
codeBitsLast = hQC->averageBitsTot - hQC->globStatBits;
|
||||
codeBits = frameLen - hQC->globStatBits;
|
||||
|
||||
/* calculate bits for every channel element */
|
||||
/* calculate bits for every channel element */
|
||||
if (codeBits != codeBitsLast) {
|
||||
Word16 totalBits = 0;
|
||||
Word16 totalBits = 0;
|
||||
|
||||
hQC->elementBits.averageBits = (hQC->elementBits.relativeBits * codeBits) >> 16; /* relativeBits was scaled down by 2 */
|
||||
totalBits += hQC->elementBits.averageBits;
|
||||
@@ -574,7 +574,7 @@ Word16 AdjustBitrate(QC_STATE *hQC,
|
||||
hQC->elementBits.averageBits = hQC->elementBits.averageBits + (codeBits - totalBits);
|
||||
}
|
||||
|
||||
hQC->averageBitsTot = frameLen;
|
||||
hQC->averageBitsTot = frameLen;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -34,32 +34,32 @@ static const Word32 XROUND = 0x33e425af; /* final rounding constant (-0.0946f+ 0
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* function name:pow34
|
||||
* description: calculate $x^{\frac{3}{4}}, for 0.5 < x < 1.0$.
|
||||
* function name:pow34
|
||||
* description: calculate $x^{\frac{3}{4}}, for 0.5 < x < 1.0$.
|
||||
*
|
||||
*****************************************************************************/
|
||||
__inline Word32 pow34(Word32 x)
|
||||
{
|
||||
/* 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)];
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* function name:quantizeSingleLine
|
||||
* description: quantizes spectrum
|
||||
* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain)
|
||||
* function name:quantizeSingleLine
|
||||
* description: quantizes spectrum
|
||||
* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain)
|
||||
*
|
||||
*****************************************************************************/
|
||||
static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
|
||||
{
|
||||
Word32 e, minusFinalExp, finalShift;
|
||||
Word32 x;
|
||||
Word16 qua = 0;
|
||||
Word16 qua = 0;
|
||||
|
||||
|
||||
|
||||
if (absSpectrum) {
|
||||
e = norm_l(absSpectrum);
|
||||
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 */
|
||||
finalShift = minusFinalExp >> 4;
|
||||
|
||||
|
||||
if (finalShift < INT_BITS) {
|
||||
x = L_mpy_wx(x, pow2tominusNover16[minusFinalExp & 15]);
|
||||
|
||||
@@ -84,7 +84,7 @@ static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
|
||||
x >>= finalShift;
|
||||
else
|
||||
x <<= (-finalShift);
|
||||
|
||||
|
||||
qua = saturate(x);
|
||||
}
|
||||
}
|
||||
@@ -94,10 +94,10 @@ static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* function name:quantizeLines
|
||||
* description: quantizes spectrum lines
|
||||
* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain)
|
||||
* input: global gain, number of lines to process, spectral data
|
||||
* function name:quantizeLines
|
||||
* description: quantizes spectrum lines
|
||||
* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain)
|
||||
* input: global gain, number of lines to process, spectral data
|
||||
* output: quantized spectrum
|
||||
*
|
||||
*****************************************************************************/
|
||||
@@ -116,15 +116,15 @@ static void quantizeLines(const Word16 gain,
|
||||
pquat = quantBorders[m];
|
||||
|
||||
g += 16;
|
||||
|
||||
|
||||
if(g >= 0)
|
||||
{
|
||||
for (line=0; line<noOfLines; line++) {
|
||||
Word32 qua;
|
||||
qua = 0;
|
||||
|
||||
qua = 0;
|
||||
|
||||
mdctSpeL = mdctSpectrum[line];
|
||||
|
||||
|
||||
if (mdctSpeL) {
|
||||
Word32 sa;
|
||||
Word32 saShft;
|
||||
@@ -134,27 +134,27 @@ static void quantizeLines(const Word16 gain,
|
||||
saShft = sa >> g;
|
||||
|
||||
if (saShft > pquat[0]) {
|
||||
|
||||
|
||||
if (saShft < pquat[1]) {
|
||||
|
||||
|
||||
qua = mdctSpeL>0 ? 1 : -1;
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (saShft < pquat[2]) {
|
||||
|
||||
|
||||
qua = mdctSpeL>0 ? 2 : -2;
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (saShft < pquat[3]) {
|
||||
|
||||
|
||||
qua = mdctSpeL>0 ? 3 : -3;
|
||||
}
|
||||
else {
|
||||
qua = quantizeSingleLine(gain, sa);
|
||||
/* adjust the sign. Since 0 < qua < 1, this cannot overflow. */
|
||||
|
||||
|
||||
if (mdctSpeL < 0)
|
||||
qua = -qua;
|
||||
}
|
||||
@@ -162,17 +162,17 @@ static void quantizeLines(const Word16 gain,
|
||||
}
|
||||
}
|
||||
}
|
||||
quaSpectrum[line] = qua ;
|
||||
quaSpectrum[line] = qua ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (line=0; line<noOfLines; line++) {
|
||||
Word32 qua;
|
||||
qua = 0;
|
||||
|
||||
qua = 0;
|
||||
|
||||
mdctSpeL = mdctSpectrum[line];
|
||||
|
||||
|
||||
if (mdctSpeL) {
|
||||
Word32 sa;
|
||||
Word32 saShft;
|
||||
@@ -181,27 +181,27 @@ static void quantizeLines(const Word16 gain,
|
||||
saShft = sa << g;
|
||||
|
||||
if (saShft > pquat[0]) {
|
||||
|
||||
|
||||
if (saShft < pquat[1]) {
|
||||
|
||||
|
||||
qua = mdctSpeL>0 ? 1 : -1;
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (saShft < pquat[2]) {
|
||||
|
||||
|
||||
qua = mdctSpeL>0 ? 2 : -2;
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (saShft < pquat[3]) {
|
||||
|
||||
|
||||
qua = mdctSpeL>0 ? 3 : -3;
|
||||
}
|
||||
else {
|
||||
qua = quantizeSingleLine(gain, sa);
|
||||
/* adjust the sign. Since 0 < qua < 1, this cannot overflow. */
|
||||
|
||||
|
||||
if (mdctSpeL < 0)
|
||||
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
|
||||
* mdctSpectrum = iquaSpectrum^4/3 *2^(0.25*gain)
|
||||
* input: global gain, number of lines to process,quantized spectrum
|
||||
* mdctSpectrum = iquaSpectrum^4/3 *2^(0.25*gain)
|
||||
* input: global gain, number of lines to process,quantized spectrum
|
||||
* output: spectral data
|
||||
*
|
||||
*****************************************************************************/
|
||||
@@ -234,11 +234,11 @@ static void iquantizeLines(const Word16 gain,
|
||||
Word32 iquantizershift;
|
||||
Word32 line;
|
||||
|
||||
iquantizermod = gain & 3;
|
||||
iquantizermod = gain & 3;
|
||||
iquantizershift = gain >> 2;
|
||||
|
||||
for (line=0; line<noOfLines; line++) {
|
||||
|
||||
|
||||
if( quantSpectrum[line] != 0 ) {
|
||||
Word32 accu;
|
||||
Word32 ex;
|
||||
@@ -252,19 +252,19 @@ static void iquantizeLines(const Word16 gain,
|
||||
accu = accu << 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 */
|
||||
s = mTab_4_3[tabIndex];
|
||||
s = mTab_4_3[tabIndex];
|
||||
|
||||
/* 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 */
|
||||
accu = MULHIGH(s, t);
|
||||
|
||||
/* get approperiate exponent shifter */
|
||||
specExp = specExpTableComb_enc[iquantizermod][specExp];
|
||||
specExp = specExpTableComb_enc[iquantizermod][specExp];
|
||||
|
||||
specExp += iquantizershift + 1;
|
||||
if(specExp >= 0)
|
||||
@@ -273,7 +273,7 @@ static void iquantizeLines(const Word16 gain,
|
||||
mdctSpectrum[line] = accu >> (-specExp);
|
||||
}
|
||||
else {
|
||||
mdctSpectrum[line] = 0;
|
||||
mdctSpectrum[line] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -301,7 +301,7 @@ void QuantizeSpectrum(Word16 sfbCnt,
|
||||
for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) {
|
||||
Word32 sfbNext ;
|
||||
for (sfb = 0; sfb < maxSfbPerGroup; sfb = sfbNext) {
|
||||
Word16 scalefactor = scalefactors[sfbOffs+sfb];
|
||||
Word16 scalefactor = scalefactors[sfbOffs+sfb];
|
||||
/* coalesce sfbs with the same scalefactor */
|
||||
for (sfbNext = sfb+1;
|
||||
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
|
||||
* input: number of lines to be quantized, ...
|
||||
* output: distortion
|
||||
@@ -338,14 +338,14 @@ Word32 calcSfbDist(const Word32 *spec,
|
||||
|
||||
pquat = quantBorders[m];
|
||||
repquat = quantRecon[m];
|
||||
|
||||
dist = 0;
|
||||
|
||||
dist = 0;
|
||||
g += 16;
|
||||
if(g2 < 0 && g >= 0)
|
||||
{
|
||||
{
|
||||
g2 = -g2;
|
||||
for(line=0; line<sfbWidth; line++) {
|
||||
if (spec[line]) {
|
||||
for(line=0; line<sfbWidth; line++) {
|
||||
if (spec[line]) {
|
||||
Word32 diff;
|
||||
Word32 distSingle;
|
||||
Word32 sa;
|
||||
@@ -359,19 +359,19 @@ Word32 calcSfbDist(const Word32 *spec,
|
||||
distSingle = (saShft * saShft) >> g2;
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (saShft < pquat[1]) {
|
||||
diff = saShft - repquat[0];
|
||||
distSingle = (diff * diff) >> g2;
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (saShft < pquat[2]) {
|
||||
diff = saShft - repquat[1];
|
||||
distSingle = (diff * diff) >> g2;
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (saShft < pquat[3]) {
|
||||
diff = saShft - repquat[2];
|
||||
distSingle = (diff * diff) >> g2;
|
||||
@@ -387,15 +387,15 @@ Word32 calcSfbDist(const Word32 *spec,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
dist = L_add(dist, distSingle);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for(line=0; line<sfbWidth; line++) {
|
||||
if (spec[line]) {
|
||||
for(line=0; line<sfbWidth; line++) {
|
||||
if (spec[line]) {
|
||||
Word32 diff;
|
||||
Word32 distSingle;
|
||||
Word32 sa;
|
||||
@@ -408,19 +408,19 @@ Word32 calcSfbDist(const Word32 *spec,
|
||||
distSingle = L_shl((saShft * saShft), g2);
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (saShft < pquat[1]) {
|
||||
diff = saShft - repquat[0];
|
||||
distSingle = L_shl((diff * diff), g2);
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (saShft < pquat[2]) {
|
||||
diff = saShft - repquat[1];
|
||||
distSingle = L_shl((diff * diff), g2);
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (saShft < pquat[3]) {
|
||||
diff = saShft - repquat[2];
|
||||
distSingle = L_shl((diff * diff), g2);
|
||||
@@ -438,7 +438,7 @@ Word32 calcSfbDist(const Word32 *spec,
|
||||
}
|
||||
dist = L_add(dist, distSingle);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return dist;
|
||||
|
||||
@@ -30,17 +30,17 @@
|
||||
static const Word16 MAX_SCF_DELTA = 60;
|
||||
|
||||
/*!
|
||||
constants reference in comments
|
||||
constants reference in comments
|
||||
|
||||
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;
|
||||
C3 = 2.66666666f;
|
||||
|
||||
PE_C1 = 3.0f; log(8.0)/log(2)
|
||||
PE_C2 = 1.3219281f; log(2.5)/log(2)
|
||||
PE_C3 = 0.5593573f; 1-C2/C1
|
||||
|
||||
|
||||
PE_C1 = 3.0f; log(8.0)/log(2)
|
||||
PE_C2 = 1.3219281f; log(2.5)/log(2)
|
||||
PE_C3 = 0.5593573f; 1-C2/C1
|
||||
|
||||
*/
|
||||
|
||||
#define FF_SQRT_BITS 7
|
||||
@@ -55,15 +55,15 @@ constants reference in comments
|
||||
/*********************************************************************************
|
||||
*
|
||||
* function name: formfac_sqrt
|
||||
* description: calculates sqrt(x)/256
|
||||
* description: calculates sqrt(x)/256
|
||||
*
|
||||
**********************************************************************************/
|
||||
__inline Word32 formfac_sqrt(Word32 x)
|
||||
{
|
||||
Word32 y;
|
||||
Word32 preshift, postshift;
|
||||
|
||||
|
||||
|
||||
|
||||
if (x==0) return 0;
|
||||
preshift = norm_l(x) - (INT_BITS-1-FF_SQRT_BITS);
|
||||
postshift = preshift >> 1;
|
||||
@@ -74,12 +74,12 @@ __inline Word32 formfac_sqrt(Word32 x)
|
||||
else
|
||||
y = x >> (-preshift);
|
||||
y = formfac_sqrttable[y-32];
|
||||
|
||||
|
||||
if(postshift >= 0)
|
||||
y = y >> postshift;
|
||||
else
|
||||
y = y << (-postshift);
|
||||
|
||||
|
||||
return y;
|
||||
}
|
||||
|
||||
@@ -100,19 +100,19 @@ CalcFormFactorChannel(Word16 *logSfbFormFactor,
|
||||
Word32 sfbw, sfbw1;
|
||||
Word32 i, j;
|
||||
Word32 sfbOffs, sfb, shift;
|
||||
|
||||
|
||||
sfbw = sfbw1 = 0;
|
||||
for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup){
|
||||
for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
|
||||
i = sfbOffs+sfb;
|
||||
|
||||
i = sfbOffs+sfb;
|
||||
|
||||
if (psyOutChan->sfbEnergy[i] > psyOutChan->sfbThreshold[i]) {
|
||||
Word32 accu, avgFormFactor,iSfbWidth;
|
||||
Word32 *mdctSpec;
|
||||
sfbw = psyOutChan->sfbOffsets[i+1] - psyOutChan->sfbOffsets[i];
|
||||
iSfbWidth = invSBF[(sfbw >> 2) - 1];
|
||||
mdctSpec = psyOutChan->mdctSpectrum + psyOutChan->sfbOffsets[i];
|
||||
accu = 0;
|
||||
accu = 0;
|
||||
/* calc sum of sqrt(spec) */
|
||||
for (j=sfbw; j; j--) {
|
||||
accu += formfac_sqrt(L_abs(*mdctSpec)); mdctSpec++;
|
||||
@@ -129,7 +129,7 @@ CalcFormFactorChannel(Word16 *logSfbFormFactor,
|
||||
}
|
||||
else {
|
||||
/* 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
|
||||
*
|
||||
**********************************************************************************/
|
||||
static Word16 improveScf(Word32 *spec,
|
||||
Word16 sfbWidth,
|
||||
Word32 thresh,
|
||||
static Word16 improveScf(Word32 *spec,
|
||||
Word16 sfbWidth,
|
||||
Word32 thresh,
|
||||
Word16 scf,
|
||||
Word16 minScf,
|
||||
Word32 *dist,
|
||||
Word32 *dist,
|
||||
Word16 *minScfCalculated)
|
||||
{
|
||||
Word32 cnt;
|
||||
Word32 sfbDist;
|
||||
Word32 scfBest;
|
||||
Word32 thresh125 = L_add(thresh, (thresh >> 2));
|
||||
|
||||
scfBest = scf;
|
||||
|
||||
|
||||
scfBest = scf;
|
||||
|
||||
/* calc real distortion */
|
||||
sfbDist = calcSfbDist(spec, sfbWidth, scf);
|
||||
*minScfCalculated = scf;
|
||||
*minScfCalculated = scf;
|
||||
if(!sfbDist)
|
||||
return scfBest;
|
||||
|
||||
|
||||
if (sfbDist > thresh125) {
|
||||
Word32 scfEstimated;
|
||||
Word32 sfbDistBest;
|
||||
scfEstimated = scf;
|
||||
sfbDistBest = sfbDist;
|
||||
|
||||
cnt = 0;
|
||||
scfEstimated = scf;
|
||||
sfbDistBest = sfbDist;
|
||||
|
||||
cnt = 0;
|
||||
while (sfbDist > thresh125 && (cnt < 3)) {
|
||||
|
||||
|
||||
scf = scf + 1;
|
||||
sfbDist = calcSfbDist(spec, sfbWidth, scf);
|
||||
|
||||
|
||||
if (sfbDist < sfbDistBest) {
|
||||
scfBest = scf;
|
||||
sfbDistBest = sfbDist;
|
||||
scfBest = scf;
|
||||
sfbDistBest = sfbDist;
|
||||
}
|
||||
cnt = cnt + 1;
|
||||
}
|
||||
cnt = 0;
|
||||
scf = scfEstimated;
|
||||
sfbDist = sfbDistBest;
|
||||
cnt = 0;
|
||||
scf = scfEstimated;
|
||||
sfbDist = sfbDistBest;
|
||||
while ((sfbDist > thresh125) && (cnt < 1) && (scf > minScf)) {
|
||||
|
||||
|
||||
scf = scf - 1;
|
||||
sfbDist = calcSfbDist(spec, sfbWidth, scf);
|
||||
|
||||
|
||||
if (sfbDist < sfbDistBest) {
|
||||
scfBest = scf;
|
||||
sfbDistBest = sfbDist;
|
||||
scfBest = scf;
|
||||
sfbDistBest = sfbDist;
|
||||
}
|
||||
*minScfCalculated = scf;
|
||||
*minScfCalculated = scf;
|
||||
cnt = cnt + 1;
|
||||
}
|
||||
*dist = sfbDistBest;
|
||||
*dist = sfbDistBest;
|
||||
}
|
||||
else {
|
||||
Word32 sfbDistBest;
|
||||
Word32 sfbDistBest;
|
||||
Word32 sfbDistAllowed;
|
||||
Word32 thresh08 = fixmul(COEF08_31, thresh);
|
||||
sfbDistBest = sfbDist;
|
||||
|
||||
sfbDistBest = sfbDist;
|
||||
|
||||
if (sfbDist < thresh08)
|
||||
sfbDistAllowed = sfbDist;
|
||||
else
|
||||
@@ -210,16 +210,16 @@ static Word16 improveScf(Word32 *spec,
|
||||
for (cnt=0; cnt<3; cnt++) {
|
||||
scf = scf + 1;
|
||||
sfbDist = calcSfbDist(spec, sfbWidth, scf);
|
||||
|
||||
|
||||
if (fixmul(COEF08_31,sfbDist) < sfbDistAllowed) {
|
||||
*minScfCalculated = scfBest + 1;
|
||||
scfBest = scf;
|
||||
sfbDistBest = sfbDist;
|
||||
scfBest = scf;
|
||||
sfbDistBest = sfbDist;
|
||||
}
|
||||
}
|
||||
*dist = sfbDistBest;
|
||||
*dist = sfbDistBest;
|
||||
}
|
||||
|
||||
|
||||
/* return best scalefactor */
|
||||
return scfBest;
|
||||
}
|
||||
@@ -233,10 +233,10 @@ static Word16 improveScf(Word32 *spec,
|
||||
static Word16 countSingleScfBits(Word16 scf, Word16 scfLeft, Word16 scfRight)
|
||||
{
|
||||
Word16 scfBits;
|
||||
|
||||
|
||||
scfBits = bitCountScalefactorDelta(scfLeft - scf) +
|
||||
bitCountScalefactorDelta(scf - scfRight);
|
||||
|
||||
|
||||
return scfBits;
|
||||
}
|
||||
|
||||
@@ -245,7 +245,7 @@ static Word16 countSingleScfBits(Word16 scf, Word16 scfLeft, Word16 scfRight)
|
||||
* function name: calcSingleSpecPe
|
||||
* description: ldRatio = log2(en(n)) - 0,375*scfGain(n)
|
||||
* 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)
|
||||
@@ -253,18 +253,18 @@ static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines)
|
||||
Word32 specPe;
|
||||
Word32 ldRatio;
|
||||
Word32 scf3;
|
||||
|
||||
|
||||
ldRatio = sfbConstPePart << 3; /* (sfbConstPePart -0.375*scf)*8 */
|
||||
scf3 = scf + scf + scf;
|
||||
ldRatio = ldRatio - scf3;
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
specPe = nLines * ldRatio;
|
||||
specPe = (specPe * PE_SCALE) >> 14;
|
||||
|
||||
|
||||
return saturate(specPe);
|
||||
}
|
||||
|
||||
@@ -275,53 +275,53 @@ static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines)
|
||||
* 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)
|
||||
{
|
||||
Word32 scfBitsDiff;
|
||||
Word32 sfb, sfbLast;
|
||||
Word32 sfbPrev, sfbNext;
|
||||
|
||||
scfBitsDiff = 0;
|
||||
sfb = 0;
|
||||
|
||||
|
||||
scfBitsDiff = 0;
|
||||
sfb = 0;
|
||||
|
||||
/* search for first relevant sfb */
|
||||
sfbLast = startSfb;
|
||||
sfbLast = startSfb;
|
||||
while (sfbLast < stopSfb && scfOld[sfbLast] == VOAAC_SHRT_MIN) {
|
||||
|
||||
|
||||
sfbLast = sfbLast + 1;
|
||||
}
|
||||
/* search for previous relevant sfb and count diff */
|
||||
sfbPrev = startSfb - 1;
|
||||
while ((sfbPrev>=0) && scfOld[sfbPrev] == VOAAC_SHRT_MIN) {
|
||||
|
||||
|
||||
sfbPrev = sfbPrev - 1;
|
||||
}
|
||||
|
||||
|
||||
if (sfbPrev>=0) {
|
||||
scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbPrev] - scfNew[sfbLast]) -
|
||||
bitCountScalefactorDelta(scfOld[sfbPrev] - scfOld[sfbLast]);
|
||||
}
|
||||
/* now loop through all sfbs and count diffs of relevant sfbs */
|
||||
for (sfb=sfbLast+1; sfb<stopSfb; sfb++) {
|
||||
|
||||
|
||||
if (scfOld[sfb] != VOAAC_SHRT_MIN) {
|
||||
scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfb]) -
|
||||
bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfb]);
|
||||
sfbLast = sfb;
|
||||
sfbLast = sfb;
|
||||
}
|
||||
}
|
||||
/* search for next relevant sfb and count diff */
|
||||
sfbNext = stopSfb;
|
||||
sfbNext = stopSfb;
|
||||
while (sfbNext < sfbCnt && scfOld[sfbNext] == VOAAC_SHRT_MIN) {
|
||||
|
||||
|
||||
sfbNext = sfbNext + 1;
|
||||
}
|
||||
|
||||
|
||||
if (sfbNext < sfbCnt)
|
||||
scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfbNext]) -
|
||||
bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfbNext]);
|
||||
|
||||
|
||||
return saturate(scfBitsDiff);
|
||||
}
|
||||
|
||||
@@ -331,52 +331,52 @@ static Word16 calcSpecPeDiff(Word16 *scfOld,
|
||||
Word16 *logSfbEnergy,
|
||||
Word16 *logSfbFormFactor,
|
||||
Word16 *sfbNRelevantLines,
|
||||
Word16 startSfb,
|
||||
Word16 startSfb,
|
||||
Word16 stopSfb)
|
||||
{
|
||||
Word32 specPeDiff;
|
||||
Word32 sfb;
|
||||
|
||||
specPeDiff = 0;
|
||||
|
||||
|
||||
specPeDiff = 0;
|
||||
|
||||
/* loop through all sfbs and count pe difference */
|
||||
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
||||
|
||||
|
||||
|
||||
|
||||
if (scfOld[sfb] != VOAAC_SHRT_MIN) {
|
||||
Word32 ldRatioOld, ldRatioNew;
|
||||
Word32 scf3;
|
||||
|
||||
|
||||
|
||||
|
||||
if (sfbConstPePart[sfb] == MIN_16) {
|
||||
sfbConstPePart[sfb] = ((logSfbEnergy[sfb] -
|
||||
logSfbFormFactor[sfb]) + 11-8*4+3) >> 2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
ldRatioOld = sfbConstPePart[sfb] << 3;
|
||||
scf3 = scfOld[sfb] + scfOld[sfb] + scfOld[sfb];
|
||||
ldRatioOld = ldRatioOld - scf3;
|
||||
ldRatioNew = sfbConstPePart[sfb] << 3;
|
||||
scf3 = scfNew[sfb] + scfNew[sfb] + scfNew[sfb];
|
||||
ldRatioNew = ldRatioNew - scf3;
|
||||
|
||||
|
||||
if (ldRatioOld < PE_C1_8) {
|
||||
/* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
|
||||
ldRatioOld = (ldRatioOld + PE_C2_16) >> 1;
|
||||
}
|
||||
|
||||
|
||||
if (ldRatioNew < PE_C1_8) {
|
||||
/* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
|
||||
ldRatioNew = (ldRatioNew + PE_C2_16) >> 1;
|
||||
}
|
||||
|
||||
|
||||
specPeDiff += sfbNRelevantLines[sfb] * (ldRatioNew - ldRatioOld);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
specPeDiff = (specPeDiff * PE_SCALE) >> 14;
|
||||
|
||||
|
||||
return saturate(specPeDiff);
|
||||
}
|
||||
|
||||
@@ -390,9 +390,9 @@ static Word16 calcSpecPeDiff(Word16 *scfOld,
|
||||
*
|
||||
**********************************************************************************/
|
||||
static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
|
||||
Word16 *scf,
|
||||
Word16 *scf,
|
||||
Word16 *minScf,
|
||||
Word32 *sfbDist,
|
||||
Word32 *sfbDist,
|
||||
Word16 *sfbConstPePart,
|
||||
Word16 *logSfbEnergy,
|
||||
Word16 *logSfbFormFactor,
|
||||
@@ -411,94 +411,94 @@ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
|
||||
Word16 *prevScfNext = psyOutChan->prevScfNext;
|
||||
Word16 *deltaPeLast = psyOutChan->deltaPeLast;
|
||||
Flag updateMinScfCalculated;
|
||||
|
||||
success = 0;
|
||||
deltaPe = 0;
|
||||
|
||||
|
||||
success = 0;
|
||||
deltaPe = 0;
|
||||
|
||||
for(j=0;j<psyOutChan->sfbCnt;j++){
|
||||
prevScfLast[j] = MAX_16;
|
||||
prevScfNext[j] = MAX_16;
|
||||
deltaPeLast[j] = MAX_16;
|
||||
prevScfLast[j] = MAX_16;
|
||||
prevScfNext[j] = MAX_16;
|
||||
deltaPeLast[j] = MAX_16;
|
||||
}
|
||||
|
||||
sfbLast = -1;
|
||||
sfbAct = -1;
|
||||
sfbNext = -1;
|
||||
|
||||
sfbLast = -1;
|
||||
sfbAct = -1;
|
||||
sfbNext = -1;
|
||||
scfLast = 0;
|
||||
scfNext = 0;
|
||||
scfMin = MAX_16;
|
||||
scfMin = MAX_16;
|
||||
do {
|
||||
/* search for new relevant sfb */
|
||||
sfbNext = sfbNext + 1;
|
||||
while (sfbNext < psyOutChan->sfbCnt && scf[sfbNext] == MIN_16) {
|
||||
|
||||
|
||||
sfbNext = sfbNext + 1;
|
||||
}
|
||||
|
||||
|
||||
if ((sfbLast>=0) && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) {
|
||||
/* relevant scfs to the left and to the right */
|
||||
scfAct = scf[sfbAct];
|
||||
scfAct = scf[sfbAct];
|
||||
scfLast = scf + sfbLast;
|
||||
scfNext = scf + sfbNext;
|
||||
scfMin = min(*scfLast, *scfNext);
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if (sfbLast == -1 && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) {
|
||||
/* first relevant scf */
|
||||
scfAct = scf[sfbAct];
|
||||
scfAct = scf[sfbAct];
|
||||
scfLast = &scfAct;
|
||||
scfNext = scf + sfbNext;
|
||||
scfMin = *scfNext;
|
||||
scfMin = *scfNext;
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
if ((sfbLast>=0) && (sfbAct>=0) && sfbNext == psyOutChan->sfbCnt) {
|
||||
/* last relevant scf */
|
||||
scfAct = scf[sfbAct];
|
||||
scfAct = scf[sfbAct];
|
||||
scfLast = scf + sfbLast;
|
||||
scfNext = &scfAct;
|
||||
scfMin = *scfLast;
|
||||
scfMin = *scfLast;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (sfbAct>=0)
|
||||
scfMin = max(scfMin, minScf[sfbAct]);
|
||||
|
||||
if ((sfbAct >= 0) &&
|
||||
(sfbLast>=0 || sfbNext < psyOutChan->sfbCnt) &&
|
||||
scfAct > scfMin &&
|
||||
(*scfLast != prevScfLast[sfbAct] ||
|
||||
*scfNext != prevScfNext[sfbAct] ||
|
||||
|
||||
if ((sfbAct >= 0) &&
|
||||
(sfbLast>=0 || sfbNext < psyOutChan->sfbCnt) &&
|
||||
scfAct > scfMin &&
|
||||
(*scfLast != prevScfLast[sfbAct] ||
|
||||
*scfNext != prevScfNext[sfbAct] ||
|
||||
deltaPe < deltaPeLast[sfbAct])) {
|
||||
success = 0;
|
||||
|
||||
/* estimate required bits for actual scf */
|
||||
success = 0;
|
||||
|
||||
/* estimate required bits for actual scf */
|
||||
if (sfbConstPePart[sfbAct] == MIN_16) {
|
||||
sfbConstPePart[sfbAct] = logSfbEnergy[sfbAct] -
|
||||
logSfbFormFactor[sfbAct] + 11-8*4; /* 4*log2(6.75) - 32 */
|
||||
|
||||
|
||||
if (sfbConstPePart[sfbAct] < 0)
|
||||
sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] + 3;
|
||||
sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] >> 2;
|
||||
}
|
||||
|
||||
|
||||
sfbPeOld = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) +
|
||||
countSingleScfBits(scfAct, *scfLast, *scfNext);
|
||||
deltaPeNew = deltaPe;
|
||||
updateMinScfCalculated = 1;
|
||||
deltaPeNew = deltaPe;
|
||||
updateMinScfCalculated = 1;
|
||||
do {
|
||||
scfAct = scfAct - 1;
|
||||
/* check only if the same check was not done before */
|
||||
|
||||
|
||||
if (scfAct < minScfCalculated[sfbAct]) {
|
||||
sfbPeNew = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) +
|
||||
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 */
|
||||
deltaPeTmp = deltaPe + sfbPeNew - sfbPeOld;
|
||||
|
||||
|
||||
if (deltaPeTmp < 10) {
|
||||
sfbDistNew = calcSfbDist(psyOutChan->mdctSpectrum+
|
||||
psyOutChan->sfbOffsets[sfbAct],
|
||||
@@ -506,46 +506,46 @@ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
|
||||
scfAct);
|
||||
if (sfbDistNew < sfbDist[sfbAct]) {
|
||||
/* success, replace scf by new one */
|
||||
scf[sfbAct] = scfAct;
|
||||
sfbDist[sfbAct] = sfbDistNew;
|
||||
deltaPeNew = deltaPeTmp;
|
||||
success = 1;
|
||||
scf[sfbAct] = scfAct;
|
||||
sfbDist[sfbAct] = sfbDistNew;
|
||||
deltaPeNew = deltaPeTmp;
|
||||
success = 1;
|
||||
}
|
||||
/* mark as already checked */
|
||||
|
||||
|
||||
if (updateMinScfCalculated) {
|
||||
minScfCalculated[sfbAct] = scfAct;
|
||||
minScfCalculated[sfbAct] = scfAct;
|
||||
}
|
||||
}
|
||||
else {
|
||||
updateMinScfCalculated = 0;
|
||||
updateMinScfCalculated = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} while (scfAct > scfMin);
|
||||
deltaPe = deltaPeNew;
|
||||
deltaPe = deltaPeNew;
|
||||
/* save parameters to avoid multiple computations of the same sfb */
|
||||
prevScfLast[sfbAct] = *scfLast;
|
||||
prevScfNext[sfbAct] = *scfNext;
|
||||
deltaPeLast[sfbAct] = deltaPe;
|
||||
prevScfLast[sfbAct] = *scfLast;
|
||||
prevScfNext[sfbAct] = *scfNext;
|
||||
deltaPeLast[sfbAct] = deltaPe;
|
||||
}
|
||||
|
||||
|
||||
if (success && restartOnSuccess) {
|
||||
/* start again at first sfb */
|
||||
sfbLast = -1;
|
||||
sfbAct = -1;
|
||||
sfbNext = -1;
|
||||
sfbLast = -1;
|
||||
sfbAct = -1;
|
||||
sfbNext = -1;
|
||||
scfLast = 0;
|
||||
scfNext = 0;
|
||||
scfMin = MAX_16;
|
||||
success = 0;
|
||||
scfMin = MAX_16;
|
||||
success = 0;
|
||||
}
|
||||
else {
|
||||
/* shift sfbs for next band */
|
||||
sfbLast = sfbAct;
|
||||
sfbAct = sfbNext;
|
||||
sfbLast = sfbAct;
|
||||
sfbAct = sfbNext;
|
||||
}
|
||||
|
||||
|
||||
} while (sfbNext < psyOutChan->sfbCnt);
|
||||
}
|
||||
|
||||
@@ -557,9 +557,9 @@ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
|
||||
*
|
||||
**********************************************************************************/
|
||||
static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan,
|
||||
Word16 *scf,
|
||||
Word16 *scf,
|
||||
Word16 *minScf,
|
||||
Word32 *sfbDist,
|
||||
Word32 *sfbDist,
|
||||
Word16 *sfbConstPePart,
|
||||
Word16 *logSfbEnergy,
|
||||
Word16 *logSfbFormFactor,
|
||||
@@ -574,95 +574,95 @@ static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan,
|
||||
Word32 *sfbDistNew = psyOutChan->sfbDistNew;
|
||||
Word16 *scfTmp = psyOutChan->prevScfLast;
|
||||
|
||||
deltaPe = 0;
|
||||
sfbCnt = psyOutChan->sfbCnt;
|
||||
|
||||
deltaPe = 0;
|
||||
sfbCnt = psyOutChan->sfbCnt;
|
||||
|
||||
/* calc min and max scalfactors */
|
||||
scfMin = MAX_16;
|
||||
scfMax = MIN_16;
|
||||
scfMin = MAX_16;
|
||||
scfMax = MIN_16;
|
||||
for (sfb=0; sfb<sfbCnt; sfb++) {
|
||||
|
||||
|
||||
if (scf[sfb] != MIN_16) {
|
||||
scfMin = min(scfMin, scf[sfb]);
|
||||
scfMax = max(scfMax, scf[sfb]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (scfMax != MIN_16) {
|
||||
|
||||
scfAct = scfMax;
|
||||
|
||||
|
||||
scfAct = scfMax;
|
||||
|
||||
do {
|
||||
scfAct = scfAct - 1;
|
||||
for (sfb=0; sfb<sfbCnt; sfb++) {
|
||||
scfTmp[sfb] = scf[sfb];
|
||||
scfTmp[sfb] = scf[sfb];
|
||||
}
|
||||
stopSfb = 0;
|
||||
stopSfb = 0;
|
||||
do {
|
||||
sfb = stopSfb;
|
||||
|
||||
sfb = stopSfb;
|
||||
|
||||
while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] <= scfAct)) {
|
||||
sfb = sfb + 1;
|
||||
}
|
||||
startSfb = sfb;
|
||||
startSfb = sfb;
|
||||
sfb = sfb + 1;
|
||||
|
||||
|
||||
while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] > scfAct)) {
|
||||
sfb = sfb + 1;
|
||||
}
|
||||
stopSfb = sfb;
|
||||
|
||||
possibleRegionFound = 0;
|
||||
|
||||
stopSfb = sfb;
|
||||
|
||||
possibleRegionFound = 0;
|
||||
|
||||
if (startSfb < sfbCnt) {
|
||||
possibleRegionFound = 1;
|
||||
possibleRegionFound = 1;
|
||||
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
||||
|
||||
|
||||
if (scf[sfb]!=MIN_16) {
|
||||
|
||||
|
||||
if (scfAct < minScf[sfb]) {
|
||||
possibleRegionFound = 0;
|
||||
possibleRegionFound = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if (possibleRegionFound) { /* region found */
|
||||
|
||||
|
||||
/* replace scfs in region by scfAct */
|
||||
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
||||
|
||||
|
||||
if (scfTmp[sfb]!=MIN_16)
|
||||
scfTmp[sfb] = scfAct;
|
||||
scfTmp[sfb] = scfAct;
|
||||
}
|
||||
|
||||
|
||||
/* estimate change in bit demand for new scfs */
|
||||
deltaScfBits = countScfBitsDiff(scf,scfTmp,sfbCnt,startSfb,stopSfb);
|
||||
deltaSpecPe = calcSpecPeDiff(scf, scfTmp, sfbConstPePart,
|
||||
logSfbEnergy, logSfbFormFactor, sfbNRelevantLines,
|
||||
logSfbEnergy, logSfbFormFactor, sfbNRelevantLines,
|
||||
startSfb, stopSfb);
|
||||
deltaPeNew = deltaPe + deltaScfBits + deltaSpecPe;
|
||||
|
||||
|
||||
|
||||
|
||||
if (deltaPeNew < 10) {
|
||||
Word32 distOldSum, distNewSum;
|
||||
|
||||
|
||||
/* quantize and calc sum of new distortion */
|
||||
distOldSum = 0;
|
||||
distNewSum = 0;
|
||||
distOldSum = 0;
|
||||
distNewSum = 0;
|
||||
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
||||
|
||||
|
||||
if (scfTmp[sfb] != MIN_16) {
|
||||
distOldSum = L_add(distOldSum, sfbDist[sfb]);
|
||||
|
||||
|
||||
sfbDistNew[sfb] = calcSfbDist(psyOutChan->mdctSpectrum +
|
||||
psyOutChan->sfbOffsets[sfb],
|
||||
psyOutChan->sfbOffsets[sfb],
|
||||
(psyOutChan->sfbOffsets[sfb+1] - psyOutChan->sfbOffsets[sfb]),
|
||||
scfAct);
|
||||
|
||||
|
||||
|
||||
|
||||
if (sfbDistNew[sfb] > psyOutChan->sfbThreshold[sfb]) {
|
||||
distNewSum = distOldSum << 1;
|
||||
break;
|
||||
@@ -670,20 +670,20 @@ static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan,
|
||||
distNewSum = L_add(distNewSum, sfbDistNew[sfb]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (distNewSum < distOldSum) {
|
||||
deltaPe = deltaPeNew;
|
||||
deltaPe = deltaPeNew;
|
||||
for (sfb=startSfb; sfb<stopSfb; sfb++) {
|
||||
|
||||
|
||||
if (scf[sfb]!=MIN_16) {
|
||||
scf[sfb] = scfAct;
|
||||
sfbDist[sfb] = sfbDistNew[sfb];
|
||||
scf[sfb] = scfAct;
|
||||
sfbDist[sfb] = sfbDistNew[sfb];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} while (stopSfb <= sfbCnt);
|
||||
}
|
||||
} while (stopSfb <= sfbCnt);
|
||||
} while (scfAct > scfMin);
|
||||
}
|
||||
}
|
||||
@@ -710,125 +710,125 @@ EstimateScaleFactorsChannel(PSY_OUT_CHANNEL *psyOutChan,
|
||||
Word32 *sfbDist = psyOutChan->sfbDist;
|
||||
Word16 *minSfMaxQuant = psyOutChan->minSfMaxQuant;
|
||||
Word16 *minScfCalculated = psyOutChan->minScfCalculated;
|
||||
|
||||
|
||||
|
||||
|
||||
for (i=0; i<psyOutChan->sfbCnt; i++) {
|
||||
Word32 sbfwith, sbfStart;
|
||||
Word32 *mdctSpec;
|
||||
thresh = psyOutChan->sfbThreshold[i];
|
||||
energy = psyOutChan->sfbEnergy[i];
|
||||
|
||||
thresh = psyOutChan->sfbThreshold[i];
|
||||
energy = psyOutChan->sfbEnergy[i];
|
||||
|
||||
sbfStart = psyOutChan->sfbOffsets[i];
|
||||
sbfwith = psyOutChan->sfbOffsets[i+1] - sbfStart;
|
||||
mdctSpec = psyOutChan->mdctSpectrum+sbfStart;
|
||||
|
||||
maxSpec = 0;
|
||||
|
||||
maxSpec = 0;
|
||||
/* maximum of spectrum */
|
||||
for (j=sbfwith; j; j-- ) {
|
||||
Word32 absSpec = L_abs(*mdctSpec); mdctSpec++;
|
||||
maxSpec |= absSpec;
|
||||
maxSpec |= absSpec;
|
||||
}
|
||||
|
||||
|
||||
/* scfs without energy or with thresh>energy are marked with MIN_16 */
|
||||
scf[i] = MIN_16;
|
||||
minSfMaxQuant[i] = MIN_16;
|
||||
|
||||
scf[i] = MIN_16;
|
||||
minSfMaxQuant[i] = MIN_16;
|
||||
|
||||
if ((maxSpec > 0) && (energy > thresh)) {
|
||||
|
||||
energyPart = logSfbFormFactor[i];
|
||||
thresholdPart = iLog4(thresh);
|
||||
|
||||
energyPart = logSfbFormFactor[i];
|
||||
thresholdPart = iLog4(thresh);
|
||||
/* -20 = 4*log2(6.75) - 32 */
|
||||
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 */
|
||||
|
||||
|
||||
|
||||
|
||||
if (minSfMaxQuant[i] > scfInt) {
|
||||
scfInt = minSfMaxQuant[i];
|
||||
scfInt = minSfMaxQuant[i];
|
||||
}
|
||||
|
||||
|
||||
/* find better scalefactor with analysis by synthesis */
|
||||
scfInt = improveScf(psyOutChan->mdctSpectrum+sbfStart,
|
||||
sbfwith,
|
||||
thresh, scfInt, minSfMaxQuant[i],
|
||||
thresh, scfInt, minSfMaxQuant[i],
|
||||
&sfbDist[i], &minScfCalculated[i]);
|
||||
|
||||
scf[i] = scfInt;
|
||||
|
||||
scf[i] = scfInt;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* scalefactor differece reduction */
|
||||
{
|
||||
Word16 sfbConstPePart[MAX_GROUPED_SFB];
|
||||
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,
|
||||
logSfbFormFactor, sfbNRelevantLines, minScfCalculated, 1);
|
||||
|
||||
assimilateMultipleScf(psyOutChan, scf,
|
||||
|
||||
assimilateMultipleScf(psyOutChan, scf,
|
||||
minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy,
|
||||
logSfbFormFactor, sfbNRelevantLines);
|
||||
}
|
||||
|
||||
/* get max scalefac for global gain */
|
||||
maxScf = MIN_16;
|
||||
minScf = MAX_16;
|
||||
maxScf = MIN_16;
|
||||
minScf = MAX_16;
|
||||
for (i=0; i<psyOutChan->sfbCnt; i++) {
|
||||
|
||||
|
||||
if (maxScf < scf[i]) {
|
||||
maxScf = scf[i];
|
||||
maxScf = scf[i];
|
||||
}
|
||||
|
||||
|
||||
if ((scf[i] != MIN_16) && (minScf > scf[i])) {
|
||||
minScf = scf[i];
|
||||
minScf = scf[i];
|
||||
}
|
||||
}
|
||||
/* limit scf delta */
|
||||
maxAllowedScf = minScf + MAX_SCF_DELTA;
|
||||
for(i=0; i<psyOutChan->sfbCnt; i++) {
|
||||
|
||||
|
||||
if ((scf[i] != MIN_16) && (maxAllowedScf < scf[i])) {
|
||||
scf[i] = maxAllowedScf;
|
||||
scf[i] = maxAllowedScf;
|
||||
}
|
||||
}
|
||||
/* new maxScf if any scf has been limited */
|
||||
|
||||
|
||||
if (maxAllowedScf < maxScf) {
|
||||
maxScf = maxAllowedScf;
|
||||
maxScf = maxAllowedScf;
|
||||
}
|
||||
|
||||
|
||||
/* calc loop scalefactors */
|
||||
|
||||
|
||||
if (maxScf > MIN_16) {
|
||||
*globalGain = maxScf;
|
||||
lastSf = 0;
|
||||
|
||||
*globalGain = maxScf;
|
||||
lastSf = 0;
|
||||
|
||||
for(i=0; i<psyOutChan->sfbCnt; i++) {
|
||||
|
||||
|
||||
if (scf[i] == MIN_16) {
|
||||
scf[i] = lastSf;
|
||||
scf[i] = lastSf;
|
||||
/* set band explicitely to zero */
|
||||
for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) {
|
||||
psyOutChan->mdctSpectrum[j] = 0;
|
||||
psyOutChan->mdctSpectrum[j] = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
scf[i] = maxScf - scf[i];
|
||||
lastSf = scf[i];
|
||||
lastSf = scf[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
*globalGain = 0;
|
||||
*globalGain = 0;
|
||||
/* set spectrum explicitely to zero */
|
||||
for(i=0; i<psyOutChan->sfbCnt; i++) {
|
||||
scf[i] = 0;
|
||||
scf[i] = 0;
|
||||
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)
|
||||
{
|
||||
Word16 j;
|
||||
|
||||
|
||||
for (j=0; j<nChannels; j++) {
|
||||
CalcFormFactorChannel(logSfbFormFactor[j], sfbNRelevantLines[j], logSfbEnergy[j], &psyOutChannel[j]);
|
||||
}
|
||||
@@ -869,7 +869,7 @@ EstimateScaleFactors(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
const Word16 nChannels)
|
||||
{
|
||||
Word16 j;
|
||||
|
||||
|
||||
for (j=0; j<nChannels; j++) {
|
||||
EstimateScaleFactorsChannel(&psyOutChannel[j],
|
||||
qcOutChannel[j].scf,
|
||||
|
||||
@@ -52,9 +52,9 @@ static Word16 countMsMaskBits(Word16 sfbCnt,
|
||||
struct TOOLSINFO *toolsInfo)
|
||||
{
|
||||
Word16 msBits, sfbOff, sfb;
|
||||
msBits = 0;
|
||||
msBits = 0;
|
||||
|
||||
|
||||
|
||||
switch(toolsInfo->msDigest) {
|
||||
case MS_NONE:
|
||||
case MS_ALL:
|
||||
@@ -85,34 +85,34 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType)
|
||||
Word32 coefBits;
|
||||
Word16 *ptcoef;
|
||||
|
||||
count = 0;
|
||||
|
||||
count = 0;
|
||||
|
||||
if (blockType == 2)
|
||||
numOfWindows = 8;
|
||||
else
|
||||
numOfWindows = 1;
|
||||
tnsPresent = 0;
|
||||
tnsPresent = 0;
|
||||
|
||||
for (i=0; i<numOfWindows; i++) {
|
||||
|
||||
|
||||
if (tnsInfo->tnsActive[i]!=0) {
|
||||
tnsPresent = 1;
|
||||
tnsPresent = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (tnsPresent) {
|
||||
/* there is data to be written*/
|
||||
/*count += 1; */
|
||||
for (i=0; i<numOfWindows; i++) {
|
||||
|
||||
|
||||
if (blockType == 2)
|
||||
count += 1;
|
||||
else
|
||||
count += 2;
|
||||
|
||||
|
||||
if (tnsInfo->tnsActive[i]) {
|
||||
count += 1;
|
||||
|
||||
|
||||
if (blockType == 2) {
|
||||
count += 4;
|
||||
count += 3;
|
||||
@@ -121,29 +121,29 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType)
|
||||
count += 6;
|
||||
count += 5;
|
||||
}
|
||||
|
||||
|
||||
if (tnsInfo->order[i]) {
|
||||
count += 1; /*direction*/
|
||||
count += 1; /*coef_compression */
|
||||
|
||||
count += 1; /*coef_compression */
|
||||
|
||||
if (tnsInfo->coefRes[i] == 4) {
|
||||
ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;
|
||||
coefBits = 3;
|
||||
coefBits = 3;
|
||||
for(k=0; k<tnsInfo->order[i]; k++) {
|
||||
|
||||
|
||||
if ((ptcoef[k] > 3) || (ptcoef[k] < -4)) {
|
||||
coefBits = 4;
|
||||
coefBits = 4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
coefBits = 2;
|
||||
coefBits = 2;
|
||||
ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;
|
||||
for(k=0; k<tnsInfo->order[i]; k++) {
|
||||
|
||||
|
||||
if ((ptcoef[k] > 1) || (ptcoef[k] < -2)) {
|
||||
coefBits = 3;
|
||||
coefBits = 3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -155,14 +155,14 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/**********************************************************************************
|
||||
*
|
||||
* function name: countTnsBits
|
||||
* description: count tns bit demand
|
||||
* description: count tns bit demand
|
||||
*
|
||||
**********************************************************************************/
|
||||
static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType)
|
||||
@@ -173,29 +173,29 @@ static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType)
|
||||
/*********************************************************************************
|
||||
*
|
||||
* 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],
|
||||
PSY_OUT_ELEMENT *psyOutElement,
|
||||
Word16 channels,
|
||||
Word16 channels,
|
||||
Word16 adtsUsed)
|
||||
{
|
||||
Word32 statBits;
|
||||
Word32 ch;
|
||||
|
||||
statBits = 0;
|
||||
|
||||
statBits = 0;
|
||||
|
||||
/* if adts used, add 56 bits */
|
||||
if(adtsUsed) statBits += 56;
|
||||
|
||||
|
||||
|
||||
switch (channels) {
|
||||
case 1:
|
||||
statBits += SI_ID_BITS+SI_SCE_BITS+SI_ICS_BITS;
|
||||
statBits += countTnsBits(&(psyOutChannel[0].tnsInfo),
|
||||
psyOutChannel[0].windowSequence);
|
||||
|
||||
|
||||
switch(psyOutChannel[0].windowSequence){
|
||||
case LONG_WINDOW:
|
||||
case START_WINDOW:
|
||||
@@ -215,7 +215,7 @@ Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
|
||||
psyOutChannel[0].sfbPerGroup,
|
||||
psyOutChannel[0].maxSfbPerGroup,
|
||||
&psyOutElement->toolsInfo);
|
||||
|
||||
|
||||
switch (psyOutChannel[0].windowSequence) {
|
||||
case LONG_WINDOW:
|
||||
case START_WINDOW:
|
||||
|
||||
@@ -100,20 +100,20 @@ static Word16 FreqToBandWithRounding(Word32 freq, /*!< frequen
|
||||
/* assert(freq >= 0); */
|
||||
shift = norm_l(fs);
|
||||
lineNumber = (extract_l(fixmul((bandStartOffset[numOfBands] << 2),Div_32(freq << shift,fs << shift))) + 1) >> 1;
|
||||
|
||||
|
||||
/* freq > fs/2 */
|
||||
temp = lineNumber - bandStartOffset[numOfBands] ;
|
||||
temp = lineNumber - bandStartOffset[numOfBands] ;
|
||||
if (temp >= 0)
|
||||
return numOfBands;
|
||||
|
||||
/* find band the line number lies in */
|
||||
for (band=0; band<numOfBands; band++) {
|
||||
temp = bandStartOffset[band + 1] - lineNumber;
|
||||
temp = bandStartOffset[band + 1] - lineNumber;
|
||||
if (temp > 0) break;
|
||||
}
|
||||
|
||||
temp = (lineNumber - bandStartOffset[band]);
|
||||
temp = (temp - (bandStartOffset[band + 1] - lineNumber));
|
||||
temp = (temp - (bandStartOffset[band + 1] - lineNumber));
|
||||
if ( temp > 0 )
|
||||
{
|
||||
band = band + 1;
|
||||
@@ -139,25 +139,25 @@ Word16 InitTnsConfigurationLong(Word32 bitRate, /*!< bitrate */
|
||||
{
|
||||
|
||||
Word32 bitratePerChannel;
|
||||
tC->maxOrder = TNS_MAX_ORDER;
|
||||
tC->maxOrder = TNS_MAX_ORDER;
|
||||
tC->tnsStartFreq = 1275;
|
||||
tC->coefRes = 4;
|
||||
|
||||
tC->coefRes = 4;
|
||||
|
||||
/* to avoid integer division */
|
||||
if ( sub(channels,2) == 0 ) {
|
||||
bitratePerChannel = bitRate >> 1;
|
||||
if ( sub(channels,2) == 0 ) {
|
||||
bitratePerChannel = bitRate >> 1;
|
||||
}
|
||||
else {
|
||||
bitratePerChannel = bitRate;
|
||||
bitratePerChannel = bitRate;
|
||||
}
|
||||
|
||||
tC->tnsMaxSfb = tnsMaxBandsLongMainLow[pC->sampRateIdx];
|
||||
|
||||
tC->tnsActive = active;
|
||||
tC->tnsActive = active;
|
||||
|
||||
/* now calc band and line borders */
|
||||
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,
|
||||
pC->sfbCnt, (const Word16*)pC->sfbOffset);
|
||||
@@ -173,18 +173,18 @@ Word16 InitTnsConfigurationLong(Word32 bitRate, /*!< bitrate */
|
||||
(const Word16*)pC->sfbOffset);
|
||||
|
||||
|
||||
tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand];
|
||||
tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand];
|
||||
|
||||
tC->lpcStopBand = tnsMaxBandsLongMainLow[pC->sampRateIdx];
|
||||
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->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
|
||||
tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
|
||||
|
||||
tC->threshold = TNS_GAIN_THRESH;
|
||||
tC->threshold = TNS_GAIN_THRESH;
|
||||
|
||||
|
||||
return(0);
|
||||
@@ -207,23 +207,23 @@ Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */
|
||||
Word32 bitratePerChannel;
|
||||
tC->maxOrder = TNS_MAX_ORDER_SHORT;
|
||||
tC->tnsStartFreq = 2750;
|
||||
tC->coefRes = 3;
|
||||
|
||||
tC->coefRes = 3;
|
||||
|
||||
/* to avoid integer division */
|
||||
if ( sub(channels,2) == 0 ) {
|
||||
bitratePerChannel = L_shr(bitRate,1);
|
||||
bitratePerChannel = L_shr(bitRate,1);
|
||||
}
|
||||
else {
|
||||
bitratePerChannel = bitRate;
|
||||
bitratePerChannel = bitRate;
|
||||
}
|
||||
|
||||
tC->tnsMaxSfb = tnsMaxBandsShortMainLow[pC->sampRateIdx];
|
||||
|
||||
tC->tnsActive = active;
|
||||
tC->tnsActive = active;
|
||||
|
||||
/* now calc band and line borders */
|
||||
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,
|
||||
pC->sfbCnt, (const Word16*)pC->sfbOffset);
|
||||
@@ -239,19 +239,19 @@ Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */
|
||||
(const Word16*)pC->sfbOffset);
|
||||
|
||||
|
||||
tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand];
|
||||
tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand];
|
||||
|
||||
tC->lpcStopBand = tnsMaxBandsShortMainLow[pC->sampRateIdx];
|
||||
|
||||
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->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
|
||||
tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
|
||||
|
||||
tC->threshold = TNS_GAIN_THRESH;
|
||||
tC->threshold = TNS_GAIN_THRESH;
|
||||
|
||||
return(0);
|
||||
}
|
||||
@@ -259,7 +259,7 @@ Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */
|
||||
/**
|
||||
*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
@@ -278,7 +278,7 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
|
||||
Word32* pWork32 = &pScratchTns[subBlockNumber >> 8];
|
||||
Word16* pWeightedSpectrum = (Word16 *)&pScratchTns[subBlockNumber >> 8];
|
||||
|
||||
|
||||
|
||||
if (tC.tnsActive) {
|
||||
CalcWeightedSpectrum(spectrum,
|
||||
pWeightedSpectrum,
|
||||
@@ -290,7 +290,7 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
|
||||
tC.lpcStopBand,
|
||||
pWork32);
|
||||
|
||||
temp = blockType - SHORT_WINDOW;
|
||||
temp = blockType - SHORT_WINDOW;
|
||||
if ( temp != 0 ) {
|
||||
predictionGain = CalcTnsFilter( &pWeightedSpectrum[tC.lpcStartLine],
|
||||
tC.acfWindow,
|
||||
@@ -299,15 +299,15 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
|
||||
tnsData->dataRaw.tnsLong.subBlockInfo.parcor);
|
||||
|
||||
|
||||
temp = predictionGain - tC.threshold;
|
||||
temp = predictionGain - tC.threshold;
|
||||
if ( temp > 0 ) {
|
||||
tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 1;
|
||||
tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 1;
|
||||
}
|
||||
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{
|
||||
|
||||
@@ -317,28 +317,28 @@ Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
|
||||
tC.maxOrder,
|
||||
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].parcor);
|
||||
|
||||
temp = predictionGain - tC.threshold;
|
||||
temp = predictionGain - tC.threshold;
|
||||
if ( temp > 0 ) {
|
||||
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 1;
|
||||
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 1;
|
||||
}
|
||||
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{
|
||||
|
||||
temp = blockType - SHORT_WINDOW;
|
||||
temp = blockType - SHORT_WINDOW;
|
||||
if ( temp != 0 ) {
|
||||
tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0;
|
||||
tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = 0;
|
||||
tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0;
|
||||
tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = 0;
|
||||
}
|
||||
else {
|
||||
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0;
|
||||
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = 0;
|
||||
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0;
|
||||
tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -362,21 +362,21 @@ void TnsSync(TNS_DATA *tnsDataDest,
|
||||
const TNS_SUBBLOCK_INFO *sbInfoSrc;
|
||||
Word32 i, temp;
|
||||
|
||||
temp = blockType - SHORT_WINDOW;
|
||||
temp = blockType - SHORT_WINDOW;
|
||||
if ( temp != 0 ) {
|
||||
sbInfoDest = &tnsDataDest->dataRaw.tnsLong.subBlockInfo;
|
||||
sbInfoSrc = &tnsDataSrc->dataRaw.tnsLong.subBlockInfo;
|
||||
sbInfoDest = &tnsDataDest->dataRaw.tnsLong.subBlockInfo;
|
||||
sbInfoSrc = &tnsDataSrc->dataRaw.tnsLong.subBlockInfo;
|
||||
}
|
||||
else {
|
||||
sbInfoDest = &tnsDataDest->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
|
||||
sbInfoSrc = &tnsDataSrc->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
|
||||
sbInfoDest = &tnsDataDest->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
|
||||
sbInfoSrc = &tnsDataSrc->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
|
||||
}
|
||||
|
||||
if (100*abs_s(sbInfoDest->predictionGain - sbInfoSrc->predictionGain) <
|
||||
(3 * sbInfoDest->predictionGain)) {
|
||||
sbInfoDest->tnsActive = sbInfoSrc->tnsActive;
|
||||
sbInfoDest->tnsActive = sbInfoSrc->tnsActive;
|
||||
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;
|
||||
TNS_SUBBLOCK_INFO *psubBlockInfo;
|
||||
|
||||
temp_s = blockType - SHORT_WINDOW;
|
||||
if ( temp_s != 0) {
|
||||
temp_s = blockType - SHORT_WINDOW;
|
||||
if ( temp_s != 0) {
|
||||
psubBlockInfo = &tnsData->dataRaw.tnsLong.subBlockInfo;
|
||||
if (psubBlockInfo->tnsActive == 0) {
|
||||
tnsInfo->tnsActive[subBlockNumber] = 0;
|
||||
tnsInfo->tnsActive[subBlockNumber] = 0;
|
||||
return(0);
|
||||
}
|
||||
else {
|
||||
@@ -422,22 +422,22 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */
|
||||
tC.coefRes);
|
||||
|
||||
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 )
|
||||
break;
|
||||
temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
|
||||
temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
|
||||
if ( temp < 0 )
|
||||
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++) {
|
||||
tnsInfo->tnsActive[i] = 0;
|
||||
tnsInfo->tnsActive[i] = 0;
|
||||
}
|
||||
tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
|
||||
tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
|
||||
tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
|
||||
tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
|
||||
|
||||
|
||||
AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]),
|
||||
@@ -448,10 +448,10 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */
|
||||
|
||||
}
|
||||
} /* if (blockType!=SHORT_WINDOW) */
|
||||
else /*short block*/ {
|
||||
else /*short block*/ {
|
||||
psubBlockInfo = &tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
|
||||
if (psubBlockInfo->tnsActive == 0) {
|
||||
tnsInfo->tnsActive[subBlockNumber] = 0;
|
||||
tnsInfo->tnsActive[subBlockNumber] = 0;
|
||||
return(0);
|
||||
}
|
||||
else {
|
||||
@@ -466,19 +466,19 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */
|
||||
tC.maxOrder,
|
||||
tC.coefRes);
|
||||
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 )
|
||||
break;
|
||||
|
||||
temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
|
||||
temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
|
||||
if ( temp < 0 )
|
||||
break;
|
||||
}
|
||||
tnsInfo->order[subBlockNumber] = i + 1;
|
||||
tnsInfo->order[subBlockNumber] = i + 1;
|
||||
|
||||
tnsInfo->tnsActive[subBlockNumber] = 1;
|
||||
tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
|
||||
tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
|
||||
tnsInfo->tnsActive[subBlockNumber] = 1;
|
||||
tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
|
||||
tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
|
||||
|
||||
|
||||
AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]), (tC.tnsStopLine - tC.tnsStartLine),
|
||||
@@ -507,14 +507,14 @@ static Word32 m_pow2_cordic(Word32 x, Word16 scale)
|
||||
{
|
||||
Word32 k;
|
||||
|
||||
Word32 accu_y = 0x40000000;
|
||||
Word32 accu_y = 0x40000000;
|
||||
accu_y = L_shr(accu_y,scale);
|
||||
|
||||
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) {
|
||||
|
||||
|
||||
x = L_sub(x, z);
|
||||
accu_y = L_add(accu_y, (accu_y >> k));
|
||||
}
|
||||
@@ -548,43 +548,43 @@ static void CalcWeightedSpectrum(const Word32 spectrum[], /*!< input sp
|
||||
Word32 maxWS;
|
||||
Word32 tnsSfbMean[MAX_SFB]; /* length [lpcStopBand-lpcStartBand] should be sufficient here */
|
||||
|
||||
maxWS = 0;
|
||||
|
||||
maxWS = 0;
|
||||
|
||||
/* calc 1.0*2^-INT_BITS/2/sqrt(en) */
|
||||
for( sfb = lpcStartBand; sfb < lpcStopBand; sfb++) {
|
||||
|
||||
tmp2 = sfbEnergy[sfb] - 2;
|
||||
tmp2 = sfbEnergy[sfb] - 2;
|
||||
if( tmp2 > 0) {
|
||||
tmp = rsqrt(sfbEnergy[sfb], INT_BITS);
|
||||
if(tmp > INT_BITS_SCAL)
|
||||
if(tmp > INT_BITS_SCAL)
|
||||
{
|
||||
shift = norm_l(tmp);
|
||||
tmp = Div_32( INT_BITS_SCAL << shift, tmp << shift );
|
||||
tmp = Div_32( INT_BITS_SCAL << shift, tmp << shift );
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp = 0x7fffffff;
|
||||
tmp = 0x7fffffff;
|
||||
}
|
||||
}
|
||||
else {
|
||||
tmp = 0x7fffffff;
|
||||
}
|
||||
tnsSfbMean[sfb] = tmp;
|
||||
tmp = 0x7fffffff;
|
||||
}
|
||||
tnsSfbMean[sfb] = tmp;
|
||||
}
|
||||
|
||||
/* spread normalized values from sfbs to lines */
|
||||
sfb = lpcStartBand;
|
||||
tmp = tnsSfbMean[sfb];
|
||||
sfb = lpcStartBand;
|
||||
tmp = tnsSfbMean[sfb];
|
||||
for ( i=lpcStartLine; i<lpcStopLine; i++){
|
||||
tmp_s = sfbOffset[sfb + 1] - i;
|
||||
tmp_s = sfbOffset[sfb + 1] - i;
|
||||
if ( tmp_s == 0 ) {
|
||||
sfb = sfb + 1;
|
||||
tmp2_s = sfb + 1 - lpcStopBand;
|
||||
tmp2_s = sfb + 1 - lpcStopBand;
|
||||
if (tmp2_s <= 0) {
|
||||
tmp = tnsSfbMean[sfb];
|
||||
tmp = tnsSfbMean[sfb];
|
||||
}
|
||||
}
|
||||
pWork32[i] = tmp;
|
||||
pWork32[i] = tmp;
|
||||
}
|
||||
/*filter down*/
|
||||
for (i=(lpcStopLine - 2); i>=lpcStartLine; i--){
|
||||
@@ -597,8 +597,8 @@ static void CalcWeightedSpectrum(const Word32 spectrum[], /*!< input sp
|
||||
|
||||
/* weight and normalize */
|
||||
for (i=lpcStartLine; i<lpcStopLine; i++){
|
||||
pWork32[i] = MULHIGH(pWork32[i], spectrum[i]);
|
||||
maxWS |= L_abs(pWork32[i]);
|
||||
pWork32[i] = MULHIGH(pWork32[i], spectrum[i]);
|
||||
maxWS |= L_abs(pWork32[i]);
|
||||
}
|
||||
maxShift = norm_l(maxWS);
|
||||
|
||||
@@ -646,7 +646,7 @@ static Word16 CalcTnsFilter(const Word16 *signal,
|
||||
assert(tnsOrder <= TNS_MAX_ORDER); /* remove asserts later? (btg) */
|
||||
|
||||
for(i=0;i<tnsOrder;i++) {
|
||||
parcor[i] = 0;
|
||||
parcor[i] = 0;
|
||||
}
|
||||
|
||||
AutoCorrelation(signal, parcorWorkBuffer, numOfLines, tnsOrderPlus1);
|
||||
@@ -678,15 +678,15 @@ void AutoCorrelation(const Word16 input[],
|
||||
Word32 accu;
|
||||
Word32 scf;
|
||||
|
||||
scf = 10 - 1;
|
||||
scf = 10 - 1;
|
||||
|
||||
isamples = samples;
|
||||
/* calc first corrCoef: R[0] = sum { t[i] * t[i] } ; i = 0..N-1 */
|
||||
accu = 0;
|
||||
accu = 0;
|
||||
for(j=0; j<isamples; j++) {
|
||||
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 */
|
||||
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 */
|
||||
for(i=1; i<corrCoeff; i++) {
|
||||
isamples = isamples - 1;
|
||||
accu = 0;
|
||||
accu = 0;
|
||||
for(j=0; j<isamples; j++) {
|
||||
accu = L_add(accu, ((input[j] * input[j+i]) >> scf));
|
||||
}
|
||||
corr[i] = accu;
|
||||
corr[i] = accu;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -720,20 +720,20 @@ static Word16 AutoToParcor(Word32 workBuffer[], Word32 reflCoeff[], Word16 numOf
|
||||
Word32 predictionGain = 0;
|
||||
Word32 num, denom;
|
||||
Word32 temp, workBuffer0;
|
||||
|
||||
|
||||
num = workBuffer[0];
|
||||
temp = workBuffer[numOfCoeff];
|
||||
|
||||
num = workBuffer[0];
|
||||
temp = workBuffer[numOfCoeff];
|
||||
|
||||
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++) {
|
||||
Word32 refc;
|
||||
|
||||
|
||||
|
||||
if (workBuffer[0] < L_abs(workBuffer[i + numOfCoeff])) {
|
||||
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 */
|
||||
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++) {
|
||||
Word32 accu1, accu2;
|
||||
accu1 = L_add(pWorkBuffer[j], fixmul(refc, workBuffer[j - i]));
|
||||
accu2 = L_add(workBuffer[j - i], fixmul(refc, pWorkBuffer[j]));
|
||||
pWorkBuffer[j] = accu1;
|
||||
workBuffer[j - i] = accu2;
|
||||
pWorkBuffer[j] = accu1;
|
||||
workBuffer[j - i] = accu2;
|
||||
}
|
||||
}
|
||||
|
||||
denom = MULHIGH(workBuffer[0], NORM_COEF);
|
||||
|
||||
|
||||
if (denom != 0) {
|
||||
Word32 temp;
|
||||
shift = norm_l(denom);
|
||||
@@ -774,11 +774,11 @@ static Word16 Search3(Word32 parcor)
|
||||
Word32 index = 0;
|
||||
Word32 i;
|
||||
Word32 temp;
|
||||
|
||||
|
||||
for (i=0;i<8;i++) {
|
||||
temp = L_sub( parcor, tnsCoeff3Borders[i]);
|
||||
temp = L_sub( parcor, tnsCoeff3Borders[i]);
|
||||
if (temp > 0)
|
||||
index=i;
|
||||
index=i;
|
||||
}
|
||||
return extract_l(index - 4);
|
||||
}
|
||||
@@ -788,12 +788,12 @@ static Word16 Search4(Word32 parcor)
|
||||
Word32 index = 0;
|
||||
Word32 i;
|
||||
Word32 temp;
|
||||
|
||||
|
||||
|
||||
for (i=0;i<16;i++) {
|
||||
temp = L_sub(parcor, tnsCoeff4Borders[i]);
|
||||
temp = L_sub(parcor, tnsCoeff4Borders[i]);
|
||||
if (temp > 0)
|
||||
index=i;
|
||||
index=i;
|
||||
}
|
||||
return extract_l(index - 8);
|
||||
}
|
||||
@@ -814,12 +814,12 @@ static void Parcor2Index(const Word32 parcor[], /*!< parcor coefficients */
|
||||
Word32 temp;
|
||||
|
||||
for(i=0; i<order; i++) {
|
||||
temp = bitsPerCoeff - 3;
|
||||
temp = bitsPerCoeff - 3;
|
||||
if (temp == 0) {
|
||||
index[i] = Search3(parcor[i]);
|
||||
}
|
||||
index[i] = Search3(parcor[i]);
|
||||
}
|
||||
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;
|
||||
|
||||
for (i=0; i<order; i++) {
|
||||
temp = bitsPerCoeff - 4;
|
||||
temp = bitsPerCoeff - 4;
|
||||
if ( temp == 0 ) {
|
||||
parcor[i] = tnsCoeff4[index[i] + 8];
|
||||
parcor[i] = tnsCoeff4[index[i] + 8];
|
||||
}
|
||||
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;
|
||||
|
||||
x = x >> 1;
|
||||
tmpSave = x;
|
||||
tmpSave = x;
|
||||
|
||||
for (i=0; i<(order - 1); i++) {
|
||||
|
||||
tmp = L_add(fixmul(coef_par[i], x), state_par[i]);
|
||||
x = L_add(fixmul(coef_par[i], state_par[i]), x);
|
||||
|
||||
state_par[i] = tmpSave;
|
||||
tmpSave = tmp;
|
||||
state_par[i] = tmpSave;
|
||||
tmpSave = tmp;
|
||||
}
|
||||
|
||||
/* last stage: only need half operations */
|
||||
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(x, x);
|
||||
@@ -903,11 +903,11 @@ static void AnalysisFilterLattice(const Word32 signal[], /*!< input spectrum *
|
||||
Word32 j;
|
||||
|
||||
for ( j=0; j<TNS_MAX_ORDER; j++ ) {
|
||||
state_par[j] = 0;
|
||||
state_par[j] = 0;
|
||||
}
|
||||
|
||||
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 */
|
||||
Word32 *thresholds) /*!< thresholds (modified) */
|
||||
{
|
||||
Word32 i;
|
||||
Word32 i;
|
||||
if (subInfo.tnsActive) {
|
||||
for(i=startCb; i<stopCb; i++) {
|
||||
/* thresholds[i] * 0.25 */
|
||||
thresholds[i] = (thresholds[i] >> 2);
|
||||
thresholds[i] = (thresholds[i] >> 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
#define swap2(p0,p1) \
|
||||
t = p0; t1 = *(&(p0)+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;
|
||||
part1 = buf + num;
|
||||
|
||||
|
||||
while ((i = *bitTab++) != 0) {
|
||||
j = *bitTab++;
|
||||
|
||||
swap2(part0[4*i+0], part0[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+2], part1[4*j+2]);
|
||||
swap2(part0[4*i+0], part0[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+2], part1[4*j+2]);
|
||||
}
|
||||
|
||||
do {
|
||||
swap2(part0[4*i+2], part1[4*i+0]);
|
||||
swap2(part0[4*i+2], part1[4*i+0]);
|
||||
} while ((i = *bitTab++) != 0);
|
||||
}
|
||||
|
||||
@@ -74,8 +74,8 @@ static void Radix4First(int *buf, int num)
|
||||
{
|
||||
int r0, r1, r2, r3;
|
||||
int r4, r5, r6, r7;
|
||||
|
||||
for (; num != 0; num--)
|
||||
|
||||
for (; num != 0; num--)
|
||||
{
|
||||
r0 = buf[0] + buf[2];
|
||||
r1 = buf[1] + buf[3];
|
||||
@@ -113,7 +113,7 @@ static void Radix8First(int *buf, int num)
|
||||
int i4, i5, i6, i7;
|
||||
int t0, t1, t2, t3;
|
||||
|
||||
for ( ; num != 0; num--)
|
||||
for ( ; num != 0; num--)
|
||||
{
|
||||
r0 = buf[0] + buf[2];
|
||||
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 *xptr, *csptr;
|
||||
|
||||
for (num >>= 2; num != 0; num >>= 2)
|
||||
for (num >>= 2; num != 0; num >>= 2)
|
||||
{
|
||||
step = 2*bgn;
|
||||
xptr = buf;
|
||||
|
||||
for (i = num; i != 0; i--)
|
||||
for (i = num; i != 0; i--)
|
||||
{
|
||||
csptr = twidTab;
|
||||
|
||||
for (j = bgn; j != 0; j--)
|
||||
for (j = bgn; j != 0; j--)
|
||||
{
|
||||
r0 = xptr[0];
|
||||
r1 = xptr[1];
|
||||
xptr += step;
|
||||
|
||||
|
||||
t0 = xptr[0];
|
||||
t1 = xptr[1];
|
||||
t1 = xptr[1];
|
||||
cosx = csptr[0];
|
||||
sinx = csptr[1];
|
||||
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;
|
||||
r2 = t0 + r2;
|
||||
r3 = t1 + r3;
|
||||
|
||||
|
||||
t0 = xptr[0];
|
||||
t1 = xptr[1];
|
||||
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 */
|
||||
r5 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*ci - sin*cr */
|
||||
xptr += step;
|
||||
|
||||
|
||||
t0 = xptr[0];
|
||||
t1 = xptr[1];
|
||||
cosx = csptr[4];
|
||||
@@ -282,25 +282,25 @@ static void PreMDCT(int *buf0, int num, const int *csptr)
|
||||
int tr1, ti1, tr2, ti2;
|
||||
int cosa, sina, cosb, sinb;
|
||||
int *buf1;
|
||||
|
||||
|
||||
buf1 = buf0 + num - 1;
|
||||
|
||||
for(i = num >> 2; i != 0; i--)
|
||||
{
|
||||
cosa = *csptr++;
|
||||
sina = *csptr++;
|
||||
cosb = *csptr++;
|
||||
sinb = *csptr++;
|
||||
cosa = *csptr++;
|
||||
sina = *csptr++;
|
||||
cosb = *csptr++;
|
||||
sinb = *csptr++;
|
||||
|
||||
tr1 = *(buf0 + 0);
|
||||
ti2 = *(buf0 + 1);
|
||||
tr2 = *(buf1 - 1);
|
||||
ti1 = *(buf1 + 0);
|
||||
|
||||
|
||||
*buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
|
||||
*buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1);
|
||||
|
||||
*buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2);
|
||||
*buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1);
|
||||
|
||||
*buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2);
|
||||
*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
|
||||
}
|
||||
}
|
||||
@@ -319,12 +319,12 @@ static void PostMDCT(int *buf0, int num, const int *csptr)
|
||||
int *buf1;
|
||||
|
||||
buf1 = buf0 + num - 1;
|
||||
|
||||
|
||||
for(i = num >> 2; i != 0; i--)
|
||||
{
|
||||
cosa = *csptr++;
|
||||
sina = *csptr++;
|
||||
cosb = *csptr++;
|
||||
cosa = *csptr++;
|
||||
sina = *csptr++;
|
||||
cosb = *csptr++;
|
||||
sinb = *csptr++;
|
||||
|
||||
tr1 = *(buf0 + 0);
|
||||
@@ -333,10 +333,10 @@ static void PostMDCT(int *buf0, int num, const int *csptr)
|
||||
tr2 = *(buf1 - 1);
|
||||
|
||||
*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);
|
||||
*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
|
||||
*buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -353,17 +353,17 @@ void Mdct_Long(int *buf)
|
||||
PreMDCT(buf, 1024, cossintab + 128);
|
||||
|
||||
Shuffle(buf, 512, bitrevTab + 17);
|
||||
Radix8First(buf, 512 >> 3);
|
||||
Radix8First(buf, 512 >> 3);
|
||||
Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512);
|
||||
|
||||
PostMDCT(buf, 1024, cossintab + 128);
|
||||
PostMDCT(buf, 1024, cossintab + 128);
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************************************
|
||||
*
|
||||
* function name: Mdct_Short
|
||||
* description: the short block mdct
|
||||
* description: the short block mdct
|
||||
*
|
||||
**********************************************************************************/
|
||||
void Mdct_Short(int *buf)
|
||||
@@ -371,10 +371,10 @@ void Mdct_Short(int *buf)
|
||||
PreMDCT(buf, 128, cossintab);
|
||||
|
||||
Shuffle(buf, 64, bitrevTab);
|
||||
Radix4First(buf, 64 >> 2);
|
||||
Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64);
|
||||
Radix4First(buf, 64 >> 2);
|
||||
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
|
||||
* 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,
|
||||
* the SHORT transforms can be completed in the delay buffer,
|
||||
* and afterwards a shift
|
||||
@@ -409,7 +409,7 @@ static void shiftMdctDelayBuffer(Word16 *mdctDelayBuffer, /*! start of mdct dela
|
||||
dsBuf = timeSignal;
|
||||
|
||||
for(i=0; i<FRAME_LEN_LONG; i+=8)
|
||||
{
|
||||
{
|
||||
*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 headRoom=0;
|
||||
|
||||
|
||||
switch(blockType){
|
||||
|
||||
|
||||
|
||||
|
||||
case LONG_WINDOW:
|
||||
/*
|
||||
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);
|
||||
minSf = min(delayBufferSf,timeSignalSf);
|
||||
minSf = min(minSf,14);
|
||||
|
||||
|
||||
dctIn0 = mdctDelayBuffer;
|
||||
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
||||
outData0 = realOut + FRAME_LEN_LONG/2;
|
||||
|
||||
|
||||
/* add windows and pre add for mdct to last buffer*/
|
||||
winPtr = (int *)LongWindowKBD;
|
||||
for(i=0;i<FRAME_LEN_LONG/2;i++){
|
||||
timeSignalSample = (*dctIn0++) << minSf;
|
||||
timeSignalSample = (*dctIn0++) << minSf;
|
||||
ws1 = timeSignalSample * (*winPtr >> 16);
|
||||
timeSignalSample = (*dctIn1--) << minSf;
|
||||
ws2 = timeSignalSample * (*winPtr & 0xffff);
|
||||
@@ -499,30 +499,30 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
||||
/* shift 2 to avoid overflow next */
|
||||
*outData0++ = (ws1 >> 2) - (ws2 >> 2);
|
||||
}
|
||||
|
||||
|
||||
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
|
||||
|
||||
|
||||
/* add windows and pre add for mdct to new buffer*/
|
||||
dctIn0 = mdctDelayBuffer;
|
||||
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
||||
outData0 = realOut + FRAME_LEN_LONG/2 - 1;
|
||||
outData0 = realOut + FRAME_LEN_LONG/2 - 1;
|
||||
winPtr = (int *)LongWindowKBD;
|
||||
for(i=0;i<FRAME_LEN_LONG/2;i++){
|
||||
for(i=0;i<FRAME_LEN_LONG/2;i++){
|
||||
timeSignalSample = (*dctIn0++) << minSf;
|
||||
ws1 = timeSignalSample * (*winPtr & 0xffff);
|
||||
timeSignalSample = (*dctIn1--) << minSf;
|
||||
ws2 = timeSignalSample * (*winPtr >> 16);
|
||||
winPtr++;
|
||||
/* shift 2 to avoid overflow next */
|
||||
*outData0-- = -((ws1 >> 2) + (ws2 >> 2));
|
||||
*outData0-- = -((ws1 >> 2) + (ws2 >> 2));
|
||||
}
|
||||
|
||||
Mdct_Long(realOut);
|
||||
/* update scale factor */
|
||||
minSf = 14 - minSf;
|
||||
*mdctScale=minSf;
|
||||
*mdctScale=minSf;
|
||||
break;
|
||||
|
||||
|
||||
case START_WINDOW:
|
||||
/*
|
||||
we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no timeSignal samples
|
||||
@@ -533,7 +533,7 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
||||
|
||||
dctIn0 = mdctDelayBuffer;
|
||||
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
||||
outData0 = realOut + FRAME_LEN_LONG/2;
|
||||
outData0 = realOut + FRAME_LEN_LONG/2;
|
||||
winPtr = (int *)LongWindowKBD;
|
||||
|
||||
/* add windows and pre add for mdct to last buffer*/
|
||||
@@ -545,18 +545,18 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
||||
winPtr ++;
|
||||
*outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
|
||||
}
|
||||
|
||||
|
||||
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++){
|
||||
*outData0-- = -mdctDelayBuffer[i] << (15 - 2 + minSf);
|
||||
*outData0-- = -mdctDelayBuffer[i] << (15 - 2 + minSf);
|
||||
}
|
||||
|
||||
|
||||
/* add windows and pre add for mdct to new buffer*/
|
||||
dctIn0 = mdctDelayBuffer + 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;
|
||||
for(i=0;i<FRAME_LEN_SHORT/2;i++){
|
||||
timeSignalSample= (*dctIn0++) << minSf;
|
||||
@@ -572,7 +572,7 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
||||
minSf = 14 - minSf;
|
||||
*mdctScale= minSf;
|
||||
break;
|
||||
|
||||
|
||||
case STOP_WINDOW:
|
||||
/*
|
||||
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);
|
||||
timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement);
|
||||
minSf = min(delayBufferSf,timeSignalSf);
|
||||
minSf = min(delayBufferSf,timeSignalSf);
|
||||
minSf = min(minSf,13);
|
||||
|
||||
|
||||
outData0 = realOut + FRAME_LEN_LONG/2;
|
||||
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
||||
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*/
|
||||
dctIn0 = mdctDelayBuffer + 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;
|
||||
for(i=0;i<FRAME_LEN_SHORT/2;i++){
|
||||
timeSignalSample = (*dctIn0++) << minSf;
|
||||
@@ -602,13 +602,13 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
||||
winPtr++;
|
||||
*outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
|
||||
}
|
||||
|
||||
|
||||
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
|
||||
|
||||
|
||||
/* add windows and pre add for mdct to new buffer*/
|
||||
dctIn0 = mdctDelayBuffer;
|
||||
dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
|
||||
outData0 = realOut + FRAME_LEN_LONG/2 - 1;
|
||||
outData0 = realOut + FRAME_LEN_LONG/2 - 1;
|
||||
winPtr = (int *)LongWindowKBD;
|
||||
for(i=0;i<FRAME_LEN_LONG/2;i++){
|
||||
timeSignalSample= (*dctIn0++) << minSf;
|
||||
@@ -618,26 +618,26 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
||||
*outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */
|
||||
winPtr++;
|
||||
}
|
||||
|
||||
|
||||
Mdct_Long(realOut);
|
||||
minSf = 14 - minSf;
|
||||
*mdctScale= minSf; /* update scale factor */
|
||||
break;
|
||||
|
||||
|
||||
case SHORT_WINDOW:
|
||||
/*
|
||||
we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no new timeSignal samples
|
||||
and get the biggest scale factor for next calculate more precise
|
||||
*/
|
||||
*/
|
||||
minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+TRANSFORM_OFFSET_SHORT,9*FRAME_LEN_SHORT,1);
|
||||
minSf = min(minSf,10);
|
||||
|
||||
|
||||
|
||||
|
||||
for(w=0;w<TRANS_FAC;w++){
|
||||
dctIn0 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT;
|
||||
dctIn1 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT + FRAME_LEN_SHORT-1;
|
||||
outData0 = realOut + FRAME_LEN_SHORT/2;
|
||||
outData1 = realOut + FRAME_LEN_SHORT/2 - 1;
|
||||
outData0 = realOut + FRAME_LEN_SHORT/2;
|
||||
outData1 = realOut + FRAME_LEN_SHORT/2 - 1;
|
||||
|
||||
winPtr = (int *)ShortWindowSine;
|
||||
for(i=0;i<FRAME_LEN_SHORT/2;i++){
|
||||
@@ -646,7 +646,7 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
||||
timeSignalSample= *dctIn1 << minSf;
|
||||
ws2 = timeSignalSample * (*winPtr & 0xffff);
|
||||
*outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
|
||||
|
||||
|
||||
timeSignalSample= *(dctIn0 + FRAME_LEN_SHORT) << minSf;
|
||||
ws1 = timeSignalSample * (*winPtr & 0xffff);
|
||||
timeSignalSample= *(dctIn1 + FRAME_LEN_SHORT) << minSf;
|
||||
@@ -661,10 +661,10 @@ void Transform_Real(Word16 *mdctDelayBuffer,
|
||||
Mdct_Short(realOut);
|
||||
realOut += FRAME_LEN_SHORT;
|
||||
}
|
||||
|
||||
|
||||
minSf = 11 - minSf;
|
||||
*mdctScale = minSf; /* update scale factor */
|
||||
|
||||
|
||||
shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ include $(CLEAR_VARS)
|
||||
include frameworks/base/media/libstagefright/codecs/common/Config.mk
|
||||
|
||||
LOCAL_PRELINK_MODULE := false
|
||||
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
AMRWBEncoder.cpp \
|
||||
src/autocorr.c \
|
||||
@@ -91,7 +91,7 @@ LOCAL_MODULE := libstagefright_amrwbenc
|
||||
|
||||
LOCAL_ARM_MODE := arm
|
||||
|
||||
LOCAL_STATIC_LIBRARIES :=
|
||||
LOCAL_STATIC_LIBRARIES :=
|
||||
|
||||
LOCAL_SHARED_LIBRARIES :=
|
||||
|
||||
|
||||
@@ -70,10 +70,10 @@ int GetNextBuf(FILE* inFile,unsigned char* dst,int size)
|
||||
typedef int (VO_API * VOGETAUDIOENCAPI) (VO_AUDIO_CODECAPI * pEncHandle);
|
||||
|
||||
int encode(
|
||||
int mode,
|
||||
int mode,
|
||||
short allow_dtx,
|
||||
VOAMRWBFRAMETYPE frameType,
|
||||
const char* srcfile,
|
||||
const char* srcfile,
|
||||
const char* dstfile
|
||||
)
|
||||
{
|
||||
@@ -136,7 +136,7 @@ int encode(
|
||||
return -1;
|
||||
}
|
||||
|
||||
pfunc = dlsym(handle, "voGetAMRWBEncAPI");
|
||||
pfunc = dlsym(handle, "voGetAMRWBEncAPI");
|
||||
if(pfunc == 0)
|
||||
{
|
||||
printf("open function error......");
|
||||
@@ -159,7 +159,7 @@ int encode(
|
||||
printf("get APIs error......");
|
||||
goto safe_exit;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//####################################### Init Encoding Section #########################################
|
||||
ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData);
|
||||
@@ -214,7 +214,7 @@ int encode(
|
||||
if(framenum == 1)
|
||||
{
|
||||
fwrite(OutputBuf, 1, outData.Length + size1, fdst);
|
||||
fflush(fdst);
|
||||
fflush(fdst);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -323,7 +323,7 @@ int main(int argc, char **argv) // for gcc compiler;
|
||||
case '1': frameType = VOAMRWB_ITU;
|
||||
break;
|
||||
case '2': frameType = VOAMRWB_RFC3267 ;
|
||||
break;
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
printf ("Invalid parameter '%s'.\n", argv [arg]);
|
||||
@@ -338,11 +338,11 @@ int main(int argc, char **argv) // for gcc compiler;
|
||||
|
||||
} else {
|
||||
switch (filename) {
|
||||
case 0:
|
||||
case 0:
|
||||
inFileName = argv[arg];
|
||||
break;
|
||||
case 1:
|
||||
outFileName = argv[arg];
|
||||
case 1:
|
||||
outFileName = argv[arg];
|
||||
break;
|
||||
default:
|
||||
usage ();
|
||||
|
||||
@@ -2,15 +2,15 @@ LOCAL_PATH := $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_SRC_FILES := AMRWB_E_SAMPLE.c
|
||||
|
||||
|
||||
LOCAL_SRC_FILES += \
|
||||
../../../Common/cmnMemory.c
|
||||
../../../Common/cmnMemory.c
|
||||
|
||||
LOCAL_MODULE := TestvoAMRWBEnc
|
||||
|
||||
LOCAL_ARM_MODE := arm
|
||||
|
||||
LOCAL_STATIC_LIBRARIES :=
|
||||
LOCAL_STATIC_LIBRARIES :=
|
||||
|
||||
LOCAL_SHARED_LIBRARIES := libvoAMRWBEnc
|
||||
|
||||
@@ -20,7 +20,7 @@ LOCAL_C_INCLUDES := \
|
||||
$(LOCAL_PATH)/../../../Include \
|
||||
|
||||
LOCAL_CFLAGS := $(VO_CFLAGS)
|
||||
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
||||
|
||||
|
||||
|
||||
@@ -25,8 +25,8 @@ VOMT:= exe
|
||||
|
||||
|
||||
# module macros
|
||||
# please append the additional macro definitions here for your module if necessary.
|
||||
# e.g. -DVISUALON, macro VISUALON defined for your module
|
||||
# please append the additional macro definitions here for your module if necessary.
|
||||
# e.g. -DVISUALON, macro VISUALON defined for your module
|
||||
VOMM:= #ARMV5E
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ VOTARGET:= voAMRWBEnc_Test
|
||||
|
||||
|
||||
# please modify here to be sure to see the g1.mk
|
||||
include ../../../../Tools/eclair.mk
|
||||
include ../../../../Tools/eclair.mk
|
||||
|
||||
# dependent libraries.
|
||||
VODEPLIBS:=-ldl
|
||||
@@ -52,5 +52,5 @@ VORELDIR:=../
|
||||
|
||||
|
||||
# please modify here to be sure to see the doit.mk
|
||||
include ../../../../Tools/doit.mk
|
||||
include ../../../../Tools/doit.mk
|
||||
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
# */
|
||||
# please list all objects needed by your target here
|
||||
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:=../ \
|
||||
../../../../Common \
|
||||
../../../../Include
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ VOMT:= lib
|
||||
|
||||
|
||||
# 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)
|
||||
VOMM:=-DARM -DASM_OPT
|
||||
endif
|
||||
@@ -35,7 +35,7 @@ VOTARGET:= libvoAMRWBEncv5
|
||||
|
||||
|
||||
# please modify here to be sure to see the g1.mk
|
||||
include ../../../../../Tools/eclair.mk
|
||||
include ../../../../../Tools/eclair.mk
|
||||
|
||||
# dependent libraries.
|
||||
VODEPLIBS:=-ldl -lstdc++ -lcutils
|
||||
@@ -49,5 +49,5 @@ include ../ms.mk
|
||||
VORELDIR:=../../../../../../Release
|
||||
|
||||
# please modify here to be sure to see the doit.mk
|
||||
include ../../../../../Tools/doit.mk
|
||||
include ../../../../../Tools/doit.mk
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ VOMT:= lib
|
||||
|
||||
|
||||
# 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)
|
||||
VOMM:=-DARM -DARMV7 -DASM_OPT
|
||||
endif
|
||||
@@ -35,7 +35,7 @@ VOTARGET:= libvoAMRWBEncv7
|
||||
|
||||
|
||||
# please modify here to be sure to see the g1.mk
|
||||
include ../../../../../Tools/eclair.mk
|
||||
include ../../../../../Tools/eclair.mk
|
||||
|
||||
# dependent libraries.
|
||||
VODEPLIBS:=-ldl -lstdc++ -lcutils
|
||||
@@ -49,5 +49,5 @@ include ../ms.mk
|
||||
VORELDIR:=../../../../../../Release
|
||||
|
||||
# please modify here to be sure to see the doit.mk
|
||||
include ../../../../../Tools/doit.mk
|
||||
include ../../../../../Tools/doit.mk
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
# */
|
||||
# Just acting as Father Makefile of Modules
|
||||
# please keep the name 'makefile' unchanged
|
||||
|
||||
|
||||
# Module Subdirs
|
||||
VOMSD:=$(dir $(shell find . -name 'Makefile'))
|
||||
|
||||
|
||||
@@ -13,10 +13,10 @@
|
||||
# ** See the License for the specific language governing permissions and
|
||||
# ** 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 \
|
||||
../../../src \
|
||||
../../../../../Include
|
||||
../../../../../Include
|
||||
|
||||
# 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 \
|
||||
@@ -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 \
|
||||
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
|
||||
|
||||
|
||||
|
||||
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 \
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#define static_vo static __inline__
|
||||
#else
|
||||
#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)))
|
||||
|
||||
@@ -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 Word16 norm_s (Word16 var1); /* Short norm, 15 */
|
||||
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;
|
||||
if (L_num >= L_denom)
|
||||
{
|
||||
L_num -= L_denom;
|
||||
var_out += 1;
|
||||
L_num -= L_denom;
|
||||
var_out += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,89 +33,89 @@
|
||||
|
||||
static const Word16 dfh_M7k[PRMN_7k] =
|
||||
{
|
||||
3168, 29954, 29213, 16121,
|
||||
64, 13440, 30624, 16430,
|
||||
3168, 29954, 29213, 16121,
|
||||
64, 13440, 30624, 16430,
|
||||
19008
|
||||
};
|
||||
|
||||
static const Word16 dfh_M9k[PRMN_9k] =
|
||||
{
|
||||
3168, 31665, 9943, 9123,
|
||||
15599, 4358, 20248, 2048,
|
||||
3168, 31665, 9943, 9123,
|
||||
15599, 4358, 20248, 2048,
|
||||
17040, 27787, 16816, 13888
|
||||
};
|
||||
|
||||
static const Word16 dfh_M12k[PRMN_12k] =
|
||||
{
|
||||
3168, 31665, 9943, 9128,
|
||||
3647, 8129, 30930, 27926,
|
||||
18880, 12319, 496, 1042,
|
||||
4061, 20446, 25629, 28069,
|
||||
3168, 31665, 9943, 9128,
|
||||
3647, 8129, 30930, 27926,
|
||||
18880, 12319, 496, 1042,
|
||||
4061, 20446, 25629, 28069,
|
||||
13948
|
||||
};
|
||||
|
||||
static const Word16 dfh_M14k[PRMN_14k] =
|
||||
{
|
||||
3168, 31665, 9943, 9131,
|
||||
24815, 655, 26616, 26764,
|
||||
7238, 19136, 6144, 88,
|
||||
4158, 25733, 30567, 30494,
|
||||
3168, 31665, 9943, 9131,
|
||||
24815, 655, 26616, 26764,
|
||||
7238, 19136, 6144, 88,
|
||||
4158, 25733, 30567, 30494,
|
||||
221, 20321, 17823
|
||||
};
|
||||
|
||||
static const Word16 dfh_M16k[PRMN_16k] =
|
||||
{
|
||||
3168, 31665, 9943, 9131,
|
||||
24815, 700, 3824, 7271,
|
||||
26400, 9528, 6594, 26112,
|
||||
108, 2068, 12867, 16317,
|
||||
23035, 24632, 7528, 1752,
|
||||
3168, 31665, 9943, 9131,
|
||||
24815, 700, 3824, 7271,
|
||||
26400, 9528, 6594, 26112,
|
||||
108, 2068, 12867, 16317,
|
||||
23035, 24632, 7528, 1752,
|
||||
6759, 24576
|
||||
};
|
||||
|
||||
static const Word16 dfh_M18k[PRMN_18k] =
|
||||
{
|
||||
3168, 31665, 9943, 9135,
|
||||
14787, 14423, 30477, 24927,
|
||||
25345, 30154, 916, 5728,
|
||||
18978, 2048, 528, 16449,
|
||||
2436, 3581, 23527, 29479,
|
||||
8237, 16810, 27091, 19052,
|
||||
3168, 31665, 9943, 9135,
|
||||
14787, 14423, 30477, 24927,
|
||||
25345, 30154, 916, 5728,
|
||||
18978, 2048, 528, 16449,
|
||||
2436, 3581, 23527, 29479,
|
||||
8237, 16810, 27091, 19052,
|
||||
0
|
||||
};
|
||||
|
||||
static const Word16 dfh_M20k[PRMN_20k] =
|
||||
{
|
||||
3168, 31665, 9943, 9129,
|
||||
8637, 31807, 24646, 736,
|
||||
28643, 2977, 2566, 25564,
|
||||
12930, 13960, 2048, 834,
|
||||
3270, 4100, 26920, 16237,
|
||||
31227, 17667, 15059, 20589,
|
||||
3168, 31665, 9943, 9129,
|
||||
8637, 31807, 24646, 736,
|
||||
28643, 2977, 2566, 25564,
|
||||
12930, 13960, 2048, 834,
|
||||
3270, 4100, 26920, 16237,
|
||||
31227, 17667, 15059, 20589,
|
||||
30249, 29123, 0
|
||||
};
|
||||
|
||||
static const Word16 dfh_M23k[PRMN_23k] =
|
||||
{
|
||||
3168, 31665, 9943, 9132,
|
||||
16748, 3202, 28179, 16317,
|
||||
30590, 15857, 19960, 8818,
|
||||
21711, 21538, 4260, 16690,
|
||||
20224, 3666, 4194, 9497,
|
||||
16320, 15388, 5755, 31551,
|
||||
14080, 3574, 15932, 50,
|
||||
3168, 31665, 9943, 9132,
|
||||
16748, 3202, 28179, 16317,
|
||||
30590, 15857, 19960, 8818,
|
||||
21711, 21538, 4260, 16690,
|
||||
20224, 3666, 4194, 9497,
|
||||
16320, 15388, 5755, 31551,
|
||||
14080, 3574, 15932, 50,
|
||||
23392, 26053, 31216
|
||||
};
|
||||
|
||||
static const Word16 dfh_M24k[PRMN_24k] =
|
||||
{
|
||||
3168, 31665, 9943, 9134,
|
||||
24776, 5857, 18475, 28535,
|
||||
29662, 14321, 16725, 4396,
|
||||
29353, 10003, 17068, 20504,
|
||||
720, 0, 8465, 12581,
|
||||
28863, 24774, 9709, 26043,
|
||||
7941, 27649, 13965, 15236,
|
||||
3168, 31665, 9943, 9134,
|
||||
24776, 5857, 18475, 28535,
|
||||
29662, 14321, 16725, 4396,
|
||||
29353, 10003, 17068, 20504,
|
||||
720, 0, 8465, 12581,
|
||||
28863, 24774, 9709, 26043,
|
||||
7941, 27649, 13965, 15236,
|
||||
18026, 22047, 16681, 3968
|
||||
};
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ const static Word16 table[129] = {
|
||||
|
||||
/* 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,
|
||||
-1579, -1409, -1279, -1170, -1079, -1004, -933, -880,
|
||||
-827, -783, -743, -708, -676, -647, -621, -599,
|
||||
|
||||
@@ -25,20 +25,20 @@
|
||||
*/
|
||||
#ifndef __LOG2_H__
|
||||
#define __LOG2_H__
|
||||
|
||||
|
||||
/*
|
||||
********************************************************************************
|
||||
* INCLUDE FILES
|
||||
********************************************************************************
|
||||
*/
|
||||
#include "typedef.h"
|
||||
|
||||
|
||||
/*
|
||||
********************************************************************************
|
||||
* DEFINITION OF DATA TYPES
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
********************************************************************************
|
||||
* DECLARATION OF PROTOTYPES
|
||||
|
||||
@@ -98,7 +98,7 @@ static Word16 sort_1265[253] = {
|
||||
244, 61, 111, 164, 214, 65, 115, 168, 218, 70,
|
||||
120, 173, 223, 74, 124, 177, 227, 79, 129, 182,
|
||||
232, 83, 133, 186, 236, 88, 138, 191, 241, 92,
|
||||
142, 195, 245
|
||||
142, 195, 245
|
||||
};
|
||||
|
||||
static Word16 sort_1425[285] = {
|
||||
@@ -205,7 +205,7 @@ static Word16 sort_1825[365] = {
|
||||
257, 243, 229, 356, 159, 119, 67, 187, 173, 145,
|
||||
240, 77, 304, 332, 314, 342, 109, 254, 81, 278,
|
||||
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] = {
|
||||
@@ -248,7 +248,7 @@ static Word16 sort_1985[397] = {
|
||||
128, 118, 303, 104, 379, 182, 114, 375, 200, 96,
|
||||
293, 172, 214, 365, 279, 86, 289, 351, 347, 357,
|
||||
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] = {
|
||||
@@ -349,7 +349,7 @@ static Word16 sort_2385[477] = {
|
||||
132, 453, 336, 425, 325, 347, 126, 104, 137, 458,
|
||||
352, 243, 447, 115, 341, 210, 330, 221, 232, 436,
|
||||
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] = {
|
||||
|
||||
@@ -26,7 +26,7 @@ Contains: VOME API Buffer Operator Implement Header
|
||||
#define __STREAM_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 MIN(a,b) ((a) < (b)? (a) : (b))
|
||||
|
||||
@@ -35,7 +35,7 @@ typedef struct{
|
||||
unsigned char *frame_ptr;
|
||||
unsigned char *frame_ptr_bk;
|
||||
int set_len;
|
||||
int framebuffer_len;
|
||||
int framebuffer_len;
|
||||
int frame_storelen;
|
||||
int used_len;
|
||||
}FrameStream;
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
/*
|
||||
* this is the original code from the ETSI file typedef.h
|
||||
*/
|
||||
|
||||
|
||||
#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__)
|
||||
typedef signed char Word8;
|
||||
typedef short Word16;
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
* OSF only defined if the current platform is an Alpha
|
||||
* PC only defined if the current platform is a PC
|
||||
* SUN only defined if the current platform is a Sun
|
||||
*
|
||||
*
|
||||
* LSBFIRST is defined if the byte order on this platform is
|
||||
* "least significant byte first" -> defined on DEC Alpha
|
||||
* 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 Isf_isp voAWB_Isf_isp
|
||||
#define Levinson voAWB_Levinson
|
||||
#define median5 voAWB_median5
|
||||
#define median5 voAWB_median5
|
||||
#define Pred_lt4 voAWB_Pred_lt4
|
||||
#define Reorder_isf voAWB_Reorder_isf
|
||||
#define Dpisf_2s_36b voAWB_Dpisf_2s_36b
|
||||
|
||||
@@ -30,10 +30,10 @@
|
||||
|
||||
.section .text
|
||||
.global Deemph_32_asm
|
||||
|
||||
|
||||
Deemph_32_asm:
|
||||
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
MOV r4, #2 @i=0
|
||||
LDRSH r6, [r0], #2 @load x_hi[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
|
||||
MOV r10, r12, LSL #3 @L_tmp <<= 3
|
||||
MUL r9, r5, r8
|
||||
LDRSH r6, [r0], #2 @load x_hi[1]
|
||||
LDRSH r6, [r0], #2 @load x_hi[1]
|
||||
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)
|
||||
QADD r10, r12, r11
|
||||
MOV r14, r10, ASR #16 @y[0] = round(L_tmp)
|
||||
@@ -94,9 +94,9 @@ LOOP:
|
||||
|
||||
BLT LOOP
|
||||
STR r14, [r3]
|
||||
STRH r14, [r2]
|
||||
STRH r14, [r2]
|
||||
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
@ENDP
|
||||
.END
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
Dot_product12_asm:
|
||||
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
MOV r4, #0 @ L_sum = 0
|
||||
MOV r5, #0 @ i = 0
|
||||
|
||||
@@ -41,13 +41,13 @@ LOOP:
|
||||
LDR r8, [r0], #4
|
||||
SMLABB r4, r6, r7, r4
|
||||
LDR r9, [r1], #4
|
||||
SMLATT r4, r6, r7, r4
|
||||
SMLATT r4, r6, r7, r4
|
||||
|
||||
LDR r6, [r0], #4
|
||||
SMLABB r4, r8, r9, r4
|
||||
|
||||
LDR r7, [r1], #4
|
||||
SMLATT r4, r8, r9, r4
|
||||
SMLATT r4, r8, r9, r4
|
||||
LDR r8, [r0], #4
|
||||
|
||||
SMLABB r4, r6, r7, r4
|
||||
@@ -58,7 +58,7 @@ LOOP:
|
||||
CMP r5, r2
|
||||
SMLATT r4, r8, r9, r4
|
||||
BLT LOOP
|
||||
|
||||
|
||||
MOV r12, r4, LSL #1
|
||||
ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1
|
||||
MOV r4, r12
|
||||
@@ -69,12 +69,12 @@ LOOP:
|
||||
SUB r10, r10, #1 @ sft = norm_l(L_sum)
|
||||
MOV r0, r12, LSL r10 @ L_sum = L_sum << sft
|
||||
RSB r11, r10, #30 @ *exp = 30 - sft
|
||||
STRH r11, [r3]
|
||||
STRH r11, [r3]
|
||||
|
||||
Dot_product12_end:
|
||||
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
@ENDFUNC
|
||||
.END
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
@******************************************************************
|
||||
@ r0 --- signal[]
|
||||
@ r1 --- lg
|
||||
@ r2 --- mem[]
|
||||
@ r2 --- mem[]
|
||||
|
||||
.section .text
|
||||
.global Filt_6k_7k_asm
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
Filt_6k_7k_asm:
|
||||
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
SUB r13, r13, #240 @ x[L_SUBFR16k + (L_FIR - 1)]
|
||||
MOV r8, r0 @ copy signal[] address
|
||||
MOV r4, r1 @ copy lg address
|
||||
@@ -43,9 +43,9 @@ Filt_6k_7k_asm:
|
||||
MOV r2, #30 @ L_FIR - 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
|
||||
ADD r6, r13, #60 @ get x[L_FIR - 1] address
|
||||
MOV r7, r3 @ get signal[i]
|
||||
@@ -76,14 +76,14 @@ LOOP1:
|
||||
STRH r12, [r6], #2
|
||||
ADD r14, r14, #8
|
||||
CMP r14, #80
|
||||
BLT LOOP1
|
||||
BLT LOOP1
|
||||
|
||||
|
||||
STR r5, [sp, #-4] @ PUSH r5 to stack
|
||||
|
||||
@ not use registers: r4, r10, r12, r14, r5
|
||||
MOV r4, r13
|
||||
MOV r5, #0 @ i = 0
|
||||
MOV r4, r13
|
||||
MOV r5, #0 @ i = 0
|
||||
LOOP2:
|
||||
LDR r0, [r10]
|
||||
|
||||
@@ -111,13 +111,13 @@ LOOP2:
|
||||
LDRSH r8, [r4, #10] @ load x[i+5]
|
||||
LDRSH r9, [r4, #50] @ load x[i+25]
|
||||
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]
|
||||
LDRSH r1, [r4, #12] @ x[i+6]
|
||||
LDRSH r2, [r4, #48] @ x[i+24]
|
||||
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]
|
||||
SMLABT r14, r8, r0, r14 @ (x[i+5] + x[i+25]) * fir_7k[5]
|
||||
LDR r0, [r10, #12]
|
||||
@@ -125,8 +125,8 @@ LOOP2:
|
||||
ADD r6, r6, r7 @ (x[i+7] + x[i+23])
|
||||
SMLABB r14, r1, r0, r14 @ (x[i+6] + x[i+24]) * fir_7k[6]
|
||||
LDRSH r8, [r4, #16] @ x[i+8]
|
||||
LDRSH r9, [r4, #44] @ x[i+22]
|
||||
SMLABT r14, r6, r0, r14 @ (x[i+7] + x[i+23]) * fir_7k[7]
|
||||
LDRSH r9, [r4, #44] @ x[i+22]
|
||||
SMLABT r14, r6, r0, r14 @ (x[i+7] + x[i+23]) * fir_7k[7]
|
||||
LDR r0, [r10, #16]
|
||||
LDRSH r1, [r4, #18] @ x[i+9]
|
||||
LDRSH r2, [r4, #42] @ x[i+21]
|
||||
@@ -144,7 +144,7 @@ LOOP2:
|
||||
LDRSH r2, [r4, #36] @ x[i+18]
|
||||
SMLABB r14, r6, r0, r14 @ (x[i+10] + x[i+20]) * fir_7k[10]
|
||||
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]
|
||||
SMLABT r14, r8, r0, r14 @ (x[i+11] + x[i+19]) * fir_7k[11]
|
||||
LDR r0, [r10, #24]
|
||||
@@ -152,31 +152,31 @@ LOOP2:
|
||||
LDRSH r8, [r4, #28] @ x[i+14]
|
||||
SMLABB r14, r1, r0, r14 @ (x[i+12] + x[i+18]) * fir_7k[12]
|
||||
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]
|
||||
LDR r0, [r10, #28]
|
||||
LDR r0, [r10, #28]
|
||||
ADD r8, r8, r9 @ (x[i+14] + x[i+16])
|
||||
LDRSH r1, [r4, #30] @ x[i+15]
|
||||
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 r14, r14, #0x4000
|
||||
ADD r4, r4, #2
|
||||
ADD r4, r4, #2
|
||||
MOV r1, r14, ASR #15
|
||||
CMP r5, #80
|
||||
STRH r1, [r3], #2 @signal[i] = (L_tmp + 0x4000) >> 15
|
||||
BLT LOOP2
|
||||
|
||||
BLT LOOP2
|
||||
|
||||
LDR r1, [sp, #-4] @mem address
|
||||
ADD r0, r13, #160 @x + lg
|
||||
MOV r2, #30
|
||||
BL voAWB_Copy
|
||||
|
||||
|
||||
Filt_6k_7k_end:
|
||||
ADD r13, r13, #240
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
ADD r13, r13, #240
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
Lable1:
|
||||
.word fir_6k_7k
|
||||
@ENDFUNC
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
@ r6 --- corr_norm[]
|
||||
|
||||
|
||||
.section .text
|
||||
.global Norm_corr_asm
|
||||
.section .text
|
||||
.global Norm_corr_asm
|
||||
.extern Convolve_asm
|
||||
.extern Isqrt_n
|
||||
@******************************
|
||||
@@ -47,17 +47,17 @@
|
||||
.equ T_MIN , 212
|
||||
.equ T_MAX , 216
|
||||
.equ CORR_NORM , 220
|
||||
|
||||
|
||||
Norm_corr_asm:
|
||||
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
SUB r13, r13, #voSTACK
|
||||
|
||||
|
||||
ADD r8, r13, #20 @get the excf[L_SUBFR]
|
||||
LDR r4, [r13, #T_MIN] @get 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
|
||||
STMFD sp!, {r0 - r3}
|
||||
MOV r0, r5
|
||||
@@ -68,7 +68,7 @@ Norm_corr_asm:
|
||||
|
||||
@ r8 --- excf[]
|
||||
|
||||
MOV r14, r1 @copy xn[] address
|
||||
MOV r14, r1 @copy xn[] address
|
||||
MOV r5, #64
|
||||
MOV r6, #0 @L_tmp = 0
|
||||
MOV r7, #1
|
||||
@@ -93,21 +93,21 @@ LOOP1:
|
||||
CLZ r7, r9
|
||||
SUB r6, r7, #1 @exp = norm_l(L_tmp)
|
||||
RSB r7, r6, #32 @exp = 32 - exp
|
||||
MOV r6, r7, ASR #1
|
||||
MOV r6, r7, ASR #1
|
||||
RSB r7, r6, #0 @scale = -(exp >> 1)
|
||||
|
||||
|
||||
@loop for every possible period
|
||||
@for(t = t_min@ t <= t_max@ t++)
|
||||
@r7 --- scale r4 --- t_min r8 --- excf[]
|
||||
|
||||
LOOPFOR:
|
||||
LOOPFOR:
|
||||
MOV r5, #0 @L_tmp = 0
|
||||
MOV r6, #0 @L_tmp1 = 0
|
||||
MOV r9, #64
|
||||
MOV r9, #64
|
||||
MOV r12, r1 @copy of xn[]
|
||||
ADD r14, r13, #20 @copy of excf[]
|
||||
MOV r8, #0x8000
|
||||
|
||||
|
||||
LOOPi:
|
||||
LDR r11, [r14], #4 @load excf[i], excf[i+1]
|
||||
LDR r10, [r12], #4 @load xn[i], xn[i+1]
|
||||
@@ -128,13 +128,13 @@ LOOPi:
|
||||
MOV r10, #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
|
||||
|
||||
CLZ r10, r5
|
||||
|
||||
CLZ r10, r5
|
||||
CMP r5, #0
|
||||
RSBLT r11, r5, #0
|
||||
CLZLT r10, r11
|
||||
SUB r10, r10, #1 @exp = norm_l(L_tmp)
|
||||
|
||||
|
||||
MOV r5, r5, LSL r10 @L_tmp = (L_tmp << exp)
|
||||
RSB r10, r10, #30 @exp_corr = 30 - exp
|
||||
MOV r11, r5, ASR #16 @corr = extract_h(L_tmp)
|
||||
@@ -150,7 +150,7 @@ LOOPi:
|
||||
@Isqrt_n(&L_tmp, &exp_norm)
|
||||
|
||||
MOV r14, r0
|
||||
MOV r12, r1
|
||||
MOV r12, r1
|
||||
|
||||
STMFD sp!, {r0 - r4, r7 - r12, r14}
|
||||
ADD r1, sp, #4
|
||||
@@ -168,7 +168,7 @@ LOOPi:
|
||||
MOV r6, r6, ASR #16 @norm = extract_h(L_tmp)
|
||||
MUL r12, r6, r11
|
||||
ADD r12, r12, r12 @L_tmp = vo_L_mult(corr, norm)
|
||||
|
||||
|
||||
ADD r6, r10, r5
|
||||
ADD r6, r6, r7 @exp_corr + exp_norm + scale
|
||||
|
||||
@@ -187,9 +187,9 @@ LOOPi:
|
||||
|
||||
CMP r4, r6
|
||||
BEQ Norm_corr_asm_end
|
||||
|
||||
|
||||
ADD r4, r4, #1 @ t_min ++
|
||||
|
||||
|
||||
RSB r5, r4, #0 @ k
|
||||
|
||||
MOV r6, #63 @ i = 63
|
||||
@@ -216,16 +216,16 @@ LOOPK:
|
||||
MUL r14, r11, r8
|
||||
LDR r6, [r13, #T_MAX] @ get t_max
|
||||
MOV r8, r14, ASR #15
|
||||
STRH r8, [r10]
|
||||
STRH r8, [r10]
|
||||
|
||||
CMP r4, r6
|
||||
BLE LOOPFOR
|
||||
|
||||
Norm_corr_asm_end:
|
||||
|
||||
ADD r13, r13, #voSTACK
|
||||
Norm_corr_asm_end:
|
||||
|
||||
ADD r13, r13, #voSTACK
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
|
||||
.END
|
||||
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
Syn_filt_32_asm:
|
||||
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
LDR r4, [r13, #40] @ get sig_hi[] address
|
||||
LDR r5, [r13, #44] @ get sig_lo[] address
|
||||
|
||||
@@ -55,7 +55,7 @@ Syn_filt_32_asm:
|
||||
AND r8, r8, r14
|
||||
ORR r10, r6, r7, LSL #16 @ Aq[2] -- Aq[1]
|
||||
ORR r11, r8, r9, LSL #16 @ Aq[4] -- Aq[3]
|
||||
STR r10, [r13, #-4]
|
||||
STR r10, [r13, #-4]
|
||||
STR r11, [r13, #-8]
|
||||
|
||||
LDRSH r6, [r0, #10] @ load Aq[5]
|
||||
@@ -73,12 +73,12 @@ Syn_filt_32_asm:
|
||||
LDRSH r7, [r0, #20] @ load Aq[10]
|
||||
LDRSH r8, [r0, #22] @ load Aq[11]
|
||||
LDRSH r9, [r0, #24] @ load Aq[12]
|
||||
AND r6, r6, r14
|
||||
AND r6, r6, r14
|
||||
AND r8, r8, r14
|
||||
ORR r10, r6, r7, LSL #16 @ Aq[10] -- Aq[9]
|
||||
ORR r11, r8, r9, LSL #16 @ Aq[12] -- Aq[11]
|
||||
STR r10, [r13, #-20]
|
||||
STR r11, [r13, #-24]
|
||||
STR r11, [r13, #-24]
|
||||
|
||||
LDRSH r6, [r0, #26] @ load Aq[13]
|
||||
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]
|
||||
STR r10, [r13, #-28]
|
||||
STR r11, [r13, #-32]
|
||||
|
||||
|
||||
MOV r8, #0 @ i = 0
|
||||
|
||||
LOOP:
|
||||
|
||||
LOOP:
|
||||
LDRSH r6, [r5, #-2] @ load sig_lo[i-1]
|
||||
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 r10, [r5, #-8] @ load sig_lo[i-4]
|
||||
|
||||
@@ -135,12 +135,12 @@ LOOP:
|
||||
LDRSH r10, [r5, #-32] @ load sig_lo[i-16]
|
||||
SMLABB r12, r6, r11, r12 @ sig_lo[i-13] * Aq[13]
|
||||
SMLABT r12, r7, r11, r12 @ sig_lo[i-14] * Aq[14]
|
||||
|
||||
|
||||
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]
|
||||
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
|
||||
MOV r14, r14, ASR #11 @ L_tmp >>= 11
|
||||
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 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 r10, [r4, #-8] @ load sig_hi[i-4]
|
||||
SMULBB r12, r6, r11 @ sig_hi[i-1] * Aq[1]
|
||||
@@ -198,14 +198,14 @@ LOOP:
|
||||
LDRSH r10, [r4, #-32] @ load sig_hi[i-16]
|
||||
SMLABB r12, r6, r11, r12 @ sig_hi[i-13] * Aq[13]
|
||||
SMLABT r12, r7, r11, r12 @ sig_hi[i-14] * Aq[14]
|
||||
|
||||
|
||||
LDR r11, [r13, #-32] @ Aq[16] -- 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
|
||||
SUB r14, r14, r6
|
||||
SUB r14, r14, r6
|
||||
MOV r14, r14, LSL #3 @ L_tmp <<=3
|
||||
|
||||
|
||||
MOV r7, r14, ASR #16 @ L_tmp >> 16
|
||||
|
||||
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)
|
||||
|
||||
ADD r8, r8, #1
|
||||
STRH r9, [r5], #2
|
||||
STRH r9, [r5], #2
|
||||
CMP r8, #64
|
||||
BLT LOOP
|
||||
|
||||
BLT LOOP
|
||||
|
||||
Syn_filt_32_end:
|
||||
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
@ENDFUNC
|
||||
.END
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -27,24 +27,24 @@
|
||||
@ r3 --- L
|
||||
|
||||
.section .text
|
||||
.global Convolve_asm
|
||||
.global Convolve_asm
|
||||
|
||||
Convolve_asm:
|
||||
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
MOV r3, #0 @ n
|
||||
MOV r11, #0x8000
|
||||
|
||||
LOOP:
|
||||
|
||||
LOOP:
|
||||
ADD r4, r1, r3, LSL #1 @ tmpH address
|
||||
ADD r5, r3, #1 @ i = n + 1
|
||||
MOV r6, r0 @ tmpX = x
|
||||
LDRSH r9, [r6], #2 @ *tmpX++
|
||||
LDRSH r10, [r4], #-2 @ *tmpH--
|
||||
SUB r5, r5, #1
|
||||
MUL r8, r9, r10
|
||||
MUL r8, r9, r10
|
||||
|
||||
LOOP1:
|
||||
LOOP1:
|
||||
CMP r5, #0
|
||||
BLE L1
|
||||
LDRSH r9, [r6], #2 @ *tmpX++
|
||||
@@ -58,12 +58,12 @@ LOOP1:
|
||||
LDRSH r12, [r6], #2 @ *tmpX++
|
||||
LDRSH r14, [r4], #-2 @ *tmpH--
|
||||
MLA r8, r9, r10, r8
|
||||
SUBS r5, r5, #4
|
||||
SUBS r5, r5, #4
|
||||
MLA r8, r12, r14, r8
|
||||
|
||||
B LOOP1
|
||||
|
||||
L1:
|
||||
B LOOP1
|
||||
|
||||
L1:
|
||||
|
||||
ADD r5, r11, r8, LSL #1
|
||||
MOV r5, r5, LSR #16 @extract_h(s)
|
||||
@@ -75,14 +75,14 @@ L1:
|
||||
ADD r5, r3, #1
|
||||
MOV r6, r0
|
||||
LDRSH r9, [r6], #2 @ *tmpX++
|
||||
LDRSH r10, [r4], #-2
|
||||
LDRSH r10, [r4], #-2
|
||||
LDRSH r12, [r6], #2
|
||||
LDRSH r14, [r4], #-2
|
||||
|
||||
MUL r8, r9, r10
|
||||
SUB r5, r5, #2
|
||||
MLA r8, r12, r14, r8
|
||||
|
||||
|
||||
LOOP2:
|
||||
CMP r5, #0
|
||||
BLE L2
|
||||
@@ -97,14 +97,14 @@ LOOP2:
|
||||
LDRSH r12, [r6], #2 @ *tmpX++
|
||||
LDRSH r14, [r4], #-2 @ *tmpH--
|
||||
MLA r8, r9, r10, r8
|
||||
SUBS r5, r5, #4
|
||||
SUBS r5, r5, #4
|
||||
MLA r8, r12, r14, r8
|
||||
B LOOP2
|
||||
|
||||
L2:
|
||||
ADD r8, r11, r8, LSL #1
|
||||
MOV r8, r8, LSR #16 @extract_h(s)
|
||||
ADD r3, r3, #1
|
||||
ADD r3, r3, #1
|
||||
STRH r8, [r2], #2 @y[n]
|
||||
|
||||
ADD r4, r1, r3, LSL #1
|
||||
@@ -117,7 +117,7 @@ L2:
|
||||
MUL r8, r9, r10
|
||||
LDRSH r9, [r6], #2
|
||||
LDRSH r10, [r4], #-2
|
||||
MLA r8, r12, r14, r8
|
||||
MLA r8, r12, r14, r8
|
||||
SUB r5, r5, #3
|
||||
MLA r8, r9, r10, r8
|
||||
|
||||
@@ -135,9 +135,9 @@ LOOP3:
|
||||
LDRSH r12, [r6], #2 @ *tmpX++
|
||||
LDRSH r14, [r4], #-2 @ *tmpH--
|
||||
MLA r8, r9, r10, r8
|
||||
SUBS r5, r5, #4
|
||||
MLA r8, r12, r14, r8
|
||||
B LOOP3
|
||||
SUBS r5, r5, #4
|
||||
MLA r8, r12, r14, r8
|
||||
B LOOP3
|
||||
|
||||
L3:
|
||||
ADD r8, r11, r8, LSL #1
|
||||
@@ -150,7 +150,7 @@ L3:
|
||||
MOV r6, r0
|
||||
MOV r8, #0
|
||||
|
||||
LOOP4:
|
||||
LOOP4:
|
||||
CMP r5, #0
|
||||
BLE L4
|
||||
LDRSH r9, [r6], #2 @ *tmpX++
|
||||
@@ -164,22 +164,22 @@ LOOP4:
|
||||
LDRSH r12, [r6], #2 @ *tmpX++
|
||||
LDRSH r14, [r4], #-2 @ *tmpH--
|
||||
MLA r8, r9, r10, r8
|
||||
SUBS r5, r5, #4
|
||||
MLA r8, r12, r14, r8
|
||||
B LOOP4
|
||||
L4:
|
||||
SUBS r5, r5, #4
|
||||
MLA r8, r12, r14, r8
|
||||
B LOOP4
|
||||
L4:
|
||||
ADD r5, r11, r8, LSL #1
|
||||
MOV r5, r5, LSR #16 @extract_h(s)
|
||||
ADD r3, r3, #1
|
||||
STRH r5, [r2], #2 @y[n]
|
||||
|
||||
|
||||
CMP r3, #64
|
||||
BLT LOOP
|
||||
|
||||
Convolve_asm_end:
|
||||
|
||||
|
||||
Convolve_asm_end:
|
||||
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
|
||||
@ENDFUNC
|
||||
.END
|
||||
|
||||
|
||||
@@ -51,12 +51,12 @@ LOOPi:
|
||||
RSB r11, r2, #62 @j=62-pos
|
||||
|
||||
LOOPj1:
|
||||
LDRSH r12, [r10], #2
|
||||
LDRSH r12, [r10], #2
|
||||
LDRSH r8, [r9], #2
|
||||
LDRSH r14, [r9]
|
||||
SUBS r11, r11, #1
|
||||
MLA r5, r12, r8, r5
|
||||
MLA r6, r12, r14, r6
|
||||
MLA r6, r12, r14, r6
|
||||
BGE LOOPj1
|
||||
|
||||
LDRSH r12, [r10], #2 @*p1++
|
||||
@@ -64,7 +64,7 @@ LOOPj1:
|
||||
MLA r5, r12, r14, r5
|
||||
MOV r14, #0x8000
|
||||
MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2)
|
||||
ADD r10, r6, r14
|
||||
ADD r10, r6, r14
|
||||
ADD r9, r5, r14
|
||||
MOV r5, r9, ASR #16
|
||||
MOV r6, r10, ASR #16
|
||||
@@ -76,7 +76,7 @@ LOOPj1:
|
||||
MUL r14, r6, r11
|
||||
MOV r5, r12, ASR #15
|
||||
MOV r6, r14, ASR #15
|
||||
LDR r9, [r13, #44]
|
||||
LDR r9, [r13, #44]
|
||||
LDR r12, [r13, #48]
|
||||
LDRSH r10, [r7], #2 @*p0++
|
||||
LDRSH r11, [r8] @*p3++
|
||||
@@ -88,7 +88,7 @@ LOOPj1:
|
||||
STRH r6, [r12]
|
||||
|
||||
ADD r2, r2, #4
|
||||
|
||||
|
||||
MOV r5, #0 @L_sum1 = 0
|
||||
MOV r6, #0 @L_sum2 = 0
|
||||
ADD r9, r1, r2, LSL #1 @p2 = &vec[pos]
|
||||
@@ -97,12 +97,12 @@ LOOPj1:
|
||||
ADD r4, r4, #1 @i++
|
||||
|
||||
LOOPj2:
|
||||
LDRSH r12, [r10], #2
|
||||
LDRSH r12, [r10], #2
|
||||
LDRSH r8, [r9], #2
|
||||
LDRSH r14, [r9]
|
||||
SUBS r11, r11, #1
|
||||
MLA r5, r12, r8, r5
|
||||
MLA r6, r12, r14, r6
|
||||
MLA r6, r12, r14, r6
|
||||
BGE LOOPj2
|
||||
|
||||
LDRSH r12, [r10], #2 @*p1++
|
||||
@@ -110,7 +110,7 @@ LOOPj2:
|
||||
MLA r5, r12, r14, r5
|
||||
MOV r14, #0x8000
|
||||
MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2)
|
||||
ADD r10, r6, r14
|
||||
ADD r10, r6, r14
|
||||
ADD r9, r5, r14
|
||||
|
||||
MOV r5, r9, ASR #16
|
||||
@@ -123,7 +123,7 @@ LOOPj2:
|
||||
MUL r14, r6, r11
|
||||
MOV r5, r12, ASR #15
|
||||
MOV r6, r14, ASR #15
|
||||
LDR r9, [r13, #44]
|
||||
LDR r9, [r13, #44]
|
||||
LDR r12, [r13, #48]
|
||||
LDRSH r10, [r7], #2 @*p0++
|
||||
LDRSH r11, [r8] @*p3++
|
||||
@@ -136,16 +136,16 @@ LOOPj2:
|
||||
ADD r4, r4, #1 @i+1
|
||||
ADD r2, r2, #4 @pos += STEP
|
||||
CMP r4, #16
|
||||
|
||||
|
||||
BLT LOOPi
|
||||
|
||||
|
||||
the_end:
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
|
||||
@ENDFUNC
|
||||
.END
|
||||
|
||||
|
||||
|
||||
.END
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
pred_lt4_asm:
|
||||
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
RSB r4, r1, #0 @-T0
|
||||
RSB r2, r2, #0 @frac = -frac
|
||||
ADD r5, r0, r4, LSL #1 @x = exc - T0
|
||||
@@ -45,7 +45,7 @@ pred_lt4_asm:
|
||||
SUB r5, r5, #30 @x -= 15
|
||||
RSB r4, r2, #3 @k = 3 - frac
|
||||
LDR r6, Table
|
||||
MOV r8, r4, LSL #6
|
||||
MOV r8, r4, LSL #6
|
||||
@MOV r7, #0 @j = 0
|
||||
ADD r8, r6, r8 @ptr2 = &(inter4_2[k][0])
|
||||
|
||||
@@ -63,7 +63,7 @@ THREE_LOOP:
|
||||
LDRSH r6, [r1], #2 @x[1]
|
||||
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 r12, r9, r3 @x[2] * h[0]
|
||||
|
||||
@@ -285,7 +285,7 @@ Last2LOOP:
|
||||
|
||||
SMLABB r10, r9, r3, r10 @x[2] * h[2]
|
||||
SMLABB r11, r4, r3, r11 @x[3] * h[2]
|
||||
|
||||
|
||||
SMLABT r10, r4, r3, r10 @x[3] * h[3]
|
||||
SMLABT r11, r6, r3, r11 @x[4] * h[3]
|
||||
|
||||
@@ -435,7 +435,7 @@ Last2LOOP:
|
||||
MOV r11, r11, LSL #1
|
||||
|
||||
QADD r10, r10, r10
|
||||
QADD r11, r11, r11
|
||||
QADD r11, r11, r11
|
||||
|
||||
QADD r10, r10, r5
|
||||
QADD r11, r11, r5
|
||||
|
||||
@@ -34,12 +34,12 @@ Residu_opt:
|
||||
|
||||
LDRH r5, [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 r7, [r0], #2
|
||||
ORR r6, r7, r6, LSL #16 @r6 --- a2, a3
|
||||
|
||||
|
||||
LDRH r7, [r0], #2
|
||||
LDRH r8, [r0], #2
|
||||
ORR r7, r8, r7, LSL #16 @r7 --- a4, a5
|
||||
@@ -59,13 +59,13 @@ Residu_opt:
|
||||
LDRH r11, [r0], #2
|
||||
LDRH r12, [r0], #2
|
||||
ORR r11, r12, r11, LSL #16 @r11 --- a12, a13
|
||||
|
||||
|
||||
LDRH r12, [r0], #2
|
||||
LDRH r4, [r0], #2
|
||||
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
|
||||
MOV r14, r3, ASR #2 @one loop get 4 outputs
|
||||
ADD r1, r1, #4
|
||||
@@ -78,7 +78,7 @@ residu_loop:
|
||||
LDR r2, [r1], #-4 @r2 --- x[1], x[0]
|
||||
|
||||
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
|
||||
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
|
||||
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]
|
||||
|
||||
SMLABT r3, r5, r2, r3 @i1(1) --- r3 += x[-1] * a1
|
||||
SMLATT r4, r6, r2, r4 @i2(2) --- r4 += x[-1] * a2
|
||||
SMLABT r11, r6, r2, r11 @i3(3) --- r11 += x[-1] * a3
|
||||
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)
|
||||
SMLATB r11,r7, r2, r11 @ i3 (4)
|
||||
SMLABB r12,r7, r2, r12 @ i4 (5)
|
||||
|
||||
|
||||
LDR r2,[r1],#-4
|
||||
SMLABT r3, r6, r2, r3 @ i1 (3)
|
||||
SMLATT r4, r7, r2, r4 @ i2 (4)
|
||||
@@ -111,7 +111,7 @@ residu_loop:
|
||||
SMLABB r4, r7, r2, r4 @ i2 (5)
|
||||
SMLATB r11,r8, r2, r11 @ i3 (6)
|
||||
SMLABB r12,r8, r2, r12 @ i4 (7)
|
||||
|
||||
|
||||
LDR r2,[r1],#-4
|
||||
SMLABT r3, r7, r2, r3 @ i1 (5)
|
||||
SMLATT r4, r8, r2, r4 @ i2 (6)
|
||||
@@ -122,7 +122,7 @@ residu_loop:
|
||||
SMLATB r11,r9, r2, r11 @ i3 (8)
|
||||
SMLABB r12,r9, r2, r12 @ i4 (9)
|
||||
LDR r10, [r13, #8] @ [ a10 | a11]
|
||||
|
||||
|
||||
LDR r2,[r1],#-4
|
||||
SMLABT r3, r8, r2, r3 @ i1 (7)
|
||||
SMLATT r4, r9, r2, r4 @ i2 (8)
|
||||
@@ -133,7 +133,7 @@ residu_loop:
|
||||
SMLATB r11,r10, r2, r11 @ i3 (10)
|
||||
SMLABB r12,r10, r2, r12 @ i4 (11)
|
||||
LDR r8, [r13, #12] @ [ a12 | a13 ]
|
||||
|
||||
|
||||
LDR r2,[r1],#-4
|
||||
SMLABT r3, r9, r2, r3 @ i1 (9)
|
||||
SMLATT r4, r10, r2, r4 @ i2 (10)
|
||||
@@ -144,7 +144,7 @@ residu_loop:
|
||||
SMLATB r11,r8, r2, r11 @ i3 (12)
|
||||
SMLABB r12,r8, r2, r12 @ i4 (13)
|
||||
LDR r9, [r13, #16] @ [ a14 | a15 ]
|
||||
|
||||
|
||||
LDR r2,[r1],#-4
|
||||
SMLABT r3, r10, r2, r3 @ i1 (11)
|
||||
SMLATT r4, r8, r2, r4 @ i2 (12)
|
||||
@@ -154,7 +154,7 @@ residu_loop:
|
||||
SMLABB r4, r8, r2, r4 @ i2 (13)
|
||||
SMLATB r11,r9, r2, r11 @ i3 (14)
|
||||
SMLABB r12,r9, r2, r12 @ i4 (15)
|
||||
|
||||
|
||||
|
||||
LDR r2,[r1],#-4
|
||||
SMLABT r3, r8, r2, r3 @ i1 (13)
|
||||
@@ -165,64 +165,64 @@ residu_loop:
|
||||
SMLABB r4, r9, r2, r4 @ i2 (15)
|
||||
SMLABB r11,r14, r2, r11 @ i3 (16)
|
||||
LDR r8, [r13] @ [ a6 | a7 ]
|
||||
|
||||
|
||||
LDR r2,[r1],#44 @ Change
|
||||
SMLABT r3, r9, r2, r3
|
||||
SMLABB r3, r14, r2, r3
|
||||
SMLABT r4, r14, r2, r4
|
||||
LDR r9, [r13, #4] @ [ a8 | a9 ]
|
||||
|
||||
|
||||
QADD r3,r3,r3
|
||||
QADD r4,r4,r4
|
||||
QADD r11,r11,r11
|
||||
QADD r12,r12,r12
|
||||
|
||||
QADD r3,r3,r3
|
||||
QADD r4,r4,r4
|
||||
QADD r11,r11,r11
|
||||
QADD r12,r12,r12
|
||||
|
||||
QADD r3,r3,r3
|
||||
QADD r4,r4,r4
|
||||
QADD r11,r11,r11
|
||||
QADD r12,r12,r12
|
||||
|
||||
QADD r3,r3,r3
|
||||
QADD r4,r4,r4
|
||||
QADD r11,r11,r11
|
||||
QADD r12,r12,r12
|
||||
|
||||
MOV r2,#32768
|
||||
|
||||
QDADD r3,r2,r3
|
||||
QDADD r4,r2,r4
|
||||
QDADD r11,r2,r11
|
||||
QDADD r12,r2,r12
|
||||
|
||||
|
||||
|
||||
QADD r3,r3,r3
|
||||
QADD r4,r4,r4
|
||||
QADD r11,r11,r11
|
||||
QADD r12,r12,r12
|
||||
|
||||
QADD r3,r3,r3
|
||||
QADD r4,r4,r4
|
||||
QADD r11,r11,r11
|
||||
QADD r12,r12,r12
|
||||
|
||||
QADD r3,r3,r3
|
||||
QADD r4,r4,r4
|
||||
QADD r11,r11,r11
|
||||
QADD r12,r12,r12
|
||||
|
||||
QADD r3,r3,r3
|
||||
QADD r4,r4,r4
|
||||
QADD r11,r11,r11
|
||||
QADD r12,r12,r12
|
||||
|
||||
MOV r2,#32768
|
||||
|
||||
QDADD r3,r2,r3
|
||||
QDADD r4,r2,r4
|
||||
QDADD r11,r2,r11
|
||||
QDADD r12,r2,r12
|
||||
|
||||
|
||||
MOV r3,r3,asr #16
|
||||
MOV r4,r4,asr #16
|
||||
MOV r11,r11,asr #16
|
||||
MOV r12,r12,asr #16
|
||||
|
||||
|
||||
STRH r3,[r0],#2
|
||||
STRH r4,[r0],#2
|
||||
STRH r11,[r0],#2
|
||||
STRH r12,[r0],#2
|
||||
|
||||
|
||||
MOV r2,r14,asr #16
|
||||
SUB r14, r14, #0x10000
|
||||
SUBS r2,r2,#1
|
||||
BNE residu_loop
|
||||
BNE residu_loop
|
||||
end:
|
||||
LDMFD r13!, {r8 -r12}
|
||||
LDMFD r13!, {r8 -r12}
|
||||
LDMFD r13!, {r4 -r12,pc}
|
||||
|
||||
@ENDFUNC
|
||||
.END
|
||||
|
||||
|
||||
|
||||
.END
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ Scale_sig_opt:
|
||||
MOV r8, #0x7fffffff
|
||||
MOV r9, #0x8000
|
||||
BLE LOOP2
|
||||
|
||||
|
||||
LOOP1:
|
||||
|
||||
LDRSH r5, [r4] @load x[i]
|
||||
@@ -65,11 +65,11 @@ LOOP2:
|
||||
|
||||
The_end:
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
|
||||
@ENDFUNC
|
||||
.END
|
||||
|
||||
|
||||
|
||||
.END
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -33,18 +33,18 @@
|
||||
|
||||
Syn_filt_asm:
|
||||
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
SUB r13, r13, #700 @ y_buf[L_FRAME16k + M16k]
|
||||
|
||||
|
||||
MOV r4, r3 @ copy mem[] address
|
||||
MOV r5, r13 @ copy yy = y_buf address
|
||||
|
||||
@ for(i = 0@ i < m@ i++)
|
||||
@{
|
||||
@ *yy++ = mem[i]@
|
||||
@}
|
||||
@}
|
||||
|
||||
LDRH r6, [r4], #2
|
||||
LDRH r6, [r4], #2
|
||||
LDRH r7, [r4], #2
|
||||
LDRH r8, [r4], #2
|
||||
LDRH r9, [r4], #2
|
||||
@@ -62,7 +62,7 @@ Syn_filt_asm:
|
||||
STRH r12, [r5], #2
|
||||
STRH r14, [r5], #2
|
||||
|
||||
LDRH r6, [r4], #2
|
||||
LDRH r6, [r4], #2
|
||||
LDRH r7, [r4], #2
|
||||
LDRH r8, [r4], #2
|
||||
LDRH r9, [r4], #2
|
||||
@@ -92,45 +92,45 @@ Syn_filt_asm:
|
||||
LDRSH r9, [r0, #6] @ load a[3]
|
||||
LDRSH r11,[r0, #8] @ load a[4]
|
||||
AND r6, r6, r14
|
||||
AND r9, r9, r14
|
||||
AND r9, r9, r14
|
||||
ORR r10, r6, r7, LSL #16 @ -a[2] -- -a[1]
|
||||
ORR r12, r9, r11, LSL #16 @ -a[4] -- -a[3]
|
||||
STR r10, [r13, #-4]
|
||||
STR r12, [r13, #-8]
|
||||
|
||||
|
||||
LDRSH r6, [r0, #10] @ load a[5]
|
||||
LDRSH r7, [r0, #12] @ load a[6]
|
||||
LDRSH r9, [r0, #14] @ load a[7]
|
||||
LDRSH r11,[r0, #16] @ load a[8]
|
||||
AND r6, r6, r14
|
||||
AND r9, r9, r14
|
||||
AND r9, r9, r14
|
||||
ORR r10, r6, r7, LSL #16 @ -a[6] -- -a[5]
|
||||
ORR r12, r9, r11, LSL #16 @ -a[8] -- -a[7]
|
||||
STR r10, [r13, #-12]
|
||||
STR r12, [r13, #-16]
|
||||
|
||||
STR r12, [r13, #-16]
|
||||
|
||||
LDRSH r6, [r0, #18] @ load a[9]
|
||||
LDRSH r7, [r0, #20] @ load a[10]
|
||||
LDRSH r9, [r0, #22] @ load a[11]
|
||||
LDRSH r11,[r0, #24] @ load a[12]
|
||||
AND r6, r6, r14
|
||||
AND r9, r9, r14
|
||||
AND r9, r9, r14
|
||||
ORR r10, r6, r7, LSL #16 @ -a[10] -- -a[9]
|
||||
ORR r12, r9, r11, LSL #16 @ -a[12] -- -a[11]
|
||||
STR r10, [r13, #-20]
|
||||
STR r12, [r13, #-24]
|
||||
STR r12, [r13, #-24]
|
||||
|
||||
LDRSH r6, [r0, #26] @ load a[13]
|
||||
LDRSH r7, [r0, #28] @ load a[14]
|
||||
LDRSH r9, [r0, #30] @ load a[15]
|
||||
LDRSH r11,[r0, #32] @ load a[16]
|
||||
AND r6, r6, r14
|
||||
AND r9, r9, r14
|
||||
AND r9, r9, r14
|
||||
ORR r10, r6, r7, LSL #16 @ -a[14] -- -a[13]
|
||||
ORR r12, r9, r11, LSL #16 @ -a[16] -- -a[15]
|
||||
STR r10, [r13, #-28]
|
||||
STR r12, [r13, #-32]
|
||||
|
||||
STR r12, [r13, #-32]
|
||||
|
||||
ADD r4, r13, #32
|
||||
LOOP:
|
||||
LDRSH r6, [r1], #2 @ load x[i]
|
||||
@@ -155,8 +155,8 @@ LOOP:
|
||||
SMLABB r14, r6, r7, r14 @ -a[3] * (*(temp_p -3))
|
||||
|
||||
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]
|
||||
LDRSH r12, [r10, #-12] @ *(temp_p - 6)
|
||||
@@ -169,13 +169,13 @@ LOOP:
|
||||
|
||||
LDR r7, [r13, #-16] @ -a[8] -a[7]
|
||||
LDRSH r11, [r10, #-16] @ *(temp_p - 8)
|
||||
|
||||
|
||||
SMLABB r14, r6, r7, r14 @ -a[7] * (*(temp_p -7))
|
||||
|
||||
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]
|
||||
LDRSH r12, [r10, #-20] @ *(temp_p - 10)
|
||||
|
||||
@@ -192,11 +192,11 @@ LOOP:
|
||||
|
||||
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]
|
||||
LDRSH r12, [r10, #-28] @ *(temp_p - 14)
|
||||
|
||||
|
||||
SMLABB r14, r9, r7, r14 @ -a[13] * (*(temp_p -13))
|
||||
|
||||
LDRSH r6, [r10, #-30] @ *(temp_p - 15)
|
||||
@@ -211,28 +211,28 @@ LOOP:
|
||||
SMLABT r14, r11, r7, r14 @ -a[16] * (*(temp_p -16))
|
||||
|
||||
RSB r14, r14, r0
|
||||
|
||||
|
||||
MOV r7, r14, LSL #4 @ L_tmp <<=4
|
||||
ADD r8, r8, #1
|
||||
ADD r14, r7, #0x8000
|
||||
ADD r14, r7, #0x8000
|
||||
MOV r7, r14, ASR #16 @ (L_tmp + 0x8000) >> 16
|
||||
CMP r8, #80
|
||||
STRH r7, [r10] @ yy[i]
|
||||
STRH r7, [r2], #2 @ y[i]
|
||||
BLT LOOP
|
||||
|
||||
|
||||
@ update mem[]
|
||||
ADD r5, r13, #160 @ yy[64] address
|
||||
MOV r1, r3
|
||||
MOV r0, r5
|
||||
MOV r2, #16
|
||||
BL voAWB_Copy
|
||||
BL voAWB_Copy
|
||||
|
||||
Syn_filt_asm_end:
|
||||
|
||||
ADD r13, r13, #700
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
ADD r13, r13, #700
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
@ENDFUNC
|
||||
.END
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -30,10 +30,10 @@
|
||||
|
||||
.section .text
|
||||
.global Deemph_32_asm
|
||||
|
||||
|
||||
Deemph_32_asm:
|
||||
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
MOV r4, #2 @i=0
|
||||
LDRSH r6, [r0], #2 @load x_hi[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
|
||||
MOV r10, r12, LSL #3 @L_tmp <<= 3
|
||||
MUL r9, r5, r8
|
||||
LDRSH r6, [r0], #2 @load x_hi[1]
|
||||
LDRSH r6, [r0], #2 @load x_hi[1]
|
||||
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)
|
||||
QADD r10, r12, r11
|
||||
MOV r14, r10, ASR #16 @y[0] = round(L_tmp)
|
||||
@@ -94,9 +94,9 @@ LOOP:
|
||||
|
||||
BLT LOOP
|
||||
STR r14, [r3]
|
||||
STRH r14, [r2]
|
||||
STRH r14, [r2]
|
||||
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
.END
|
||||
|
||||
|
||||
@@ -45,14 +45,14 @@ Dot_product12_asm:
|
||||
VLD1.S16 {Q12, Q13}, [r1]! @load 16 Word16 y[]
|
||||
|
||||
VMULL.S16 Q15, D16, D0
|
||||
VMLAL.S16 Q15, D17, D1
|
||||
VMLAL.S16 Q15, D17, D1
|
||||
VMLAL.S16 Q15, D18, D2
|
||||
VMLAL.S16 Q15, D19, D3
|
||||
VLD1.S16 {Q0, Q1}, [r1]! @load 16 Word16 y[]
|
||||
VMLAL.S16 Q15, D20, D4
|
||||
VLD1.S16 {Q0, Q1}, [r1]! @load 16 Word16 y[]
|
||||
VMLAL.S16 Q15, D20, D4
|
||||
VMLAL.S16 Q15, D21, D5
|
||||
VMLAL.S16 Q15, D22, D6
|
||||
VMLAL.S16 Q15, D23, D7
|
||||
VMLAL.S16 Q15, D23, D7
|
||||
VMLAL.S16 Q15, D24, D8
|
||||
VMLAL.S16 Q15, D25, D9
|
||||
VMLAL.S16 Q15, D26, D10
|
||||
@@ -64,9 +64,9 @@ Dot_product12_asm:
|
||||
|
||||
CMP r2, #64
|
||||
BEQ Lable1
|
||||
VLD1.S16 {Q0, Q1}, [r0]! @load 16 Word16 x[]
|
||||
VLD1.S16 {Q2, Q3}, [r1]!
|
||||
VMLAL.S16 Q15, D4, D0
|
||||
VLD1.S16 {Q0, Q1}, [r0]! @load 16 Word16 x[]
|
||||
VLD1.S16 {Q2, Q3}, [r1]!
|
||||
VMLAL.S16 Q15, D4, D0
|
||||
VMLAL.S16 Q15, D5, D1
|
||||
VMLAL.S16 Q15, D6, D2
|
||||
VMLAL.S16 Q15, D7, D3
|
||||
@@ -102,11 +102,11 @@ LOOP_EQ:
|
||||
VMLAL.S16 Q15, D2, D2
|
||||
VMLAL.S16 Q15, D3, D3
|
||||
|
||||
Lable1:
|
||||
Lable1:
|
||||
|
||||
VQADD.S32 D30, D30, D31
|
||||
VPADD.S32 D30, D30, D30
|
||||
VMOV.S32 r12, D30[0]
|
||||
VMOV.S32 r12, D30[0]
|
||||
|
||||
ADD r12, r12, r12
|
||||
ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1
|
||||
@@ -117,11 +117,11 @@ Lable1:
|
||||
SUB r10, r10, #1 @ sft = norm_l(L_sum)
|
||||
MOV r0, r12, LSL r10 @ L_sum = L_sum << sft
|
||||
RSB r11, r10, #30 @ *exp = 30 - sft
|
||||
STRH r11, [r3]
|
||||
STRH r11, [r3]
|
||||
|
||||
Dot_product12_end:
|
||||
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
.END
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
@ ** See the License for the specific language governing permissions and
|
||||
@ ** limitations under the License.
|
||||
@ */
|
||||
@
|
||||
@
|
||||
@**********************************************************************/
|
||||
@void Filt_6k_7k(
|
||||
@ Word16 signal[], /* input: signal */
|
||||
@@ -23,7 +23,7 @@
|
||||
@***********************************************************************
|
||||
@ r0 --- signal[]
|
||||
@ r1 --- lg
|
||||
@ r2 --- mem[]
|
||||
@ r2 --- mem[]
|
||||
|
||||
.section .text
|
||||
.global Filt_6k_7k_asm
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
Filt_6k_7k_asm:
|
||||
|
||||
STMFD r13!, {r0 - r12, r14}
|
||||
STMFD r13!, {r0 - r12, r14}
|
||||
SUB r13, r13, #240 @ x[L_SUBFR16k + (L_FIR - 1)]
|
||||
MOV r8, r0 @ copy signal[] 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
|
||||
ADD r6, r13, #60 @ get x[L_FIR - 1] address
|
||||
MOV r7, r3 @ get signal[i]
|
||||
@@ -81,9 +81,9 @@ Filt_6k_7k_asm:
|
||||
MOV r12, r5
|
||||
@STR r5, [sp, #-4] @ PUSH r5 to stack
|
||||
@ not use registers: r4, r10, r12, r14, r5
|
||||
MOV r4, r13
|
||||
MOV r5, #0 @ i = 0
|
||||
|
||||
MOV r4, r13
|
||||
MOV r5, #0 @ i = 0
|
||||
|
||||
@ r4 --- x[i], r10 ---- fir_6k_7k
|
||||
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]
|
||||
@@ -91,20 +91,20 @@ Filt_6k_7k_asm:
|
||||
|
||||
VLD1.S16 {Q4, Q5}, [r4]! @x[0] ~ x[15]
|
||||
VLD1.S16 {Q6, Q7}, [r4]! @x[16] ~ X[31]
|
||||
VLD1.S16 {Q8}, [r4]!
|
||||
VMOV.S16 Q15, #0
|
||||
|
||||
VLD1.S16 {Q8}, [r4]!
|
||||
VMOV.S16 Q15, #0
|
||||
|
||||
LOOP_6K7K:
|
||||
|
||||
VMULL.S16 Q9,D8,D0[0]
|
||||
VMULL.S16 Q10,D9,D1[0]
|
||||
VMULL.S16 Q11,D9,D0[0]
|
||||
VMULL.S16 Q9,D8,D0[0]
|
||||
VMULL.S16 Q10,D9,D1[0]
|
||||
VMULL.S16 Q11,D9,D0[0]
|
||||
VMULL.S16 Q12,D10,D1[0]
|
||||
VEXT.8 Q4,Q4,Q5,#2
|
||||
VMLAL.S16 Q9,D10,D2[0]
|
||||
VMLAL.S16 Q10,D11,D3[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
|
||||
VMLAL.S16 Q9,D12,D4[0]
|
||||
VMLAL.S16 Q10,D13,D5[0]
|
||||
@@ -115,18 +115,18 @@ LOOP_6K7K:
|
||||
VMLAL.S16 Q10,D15,D7[0]
|
||||
VMLAL.S16 Q11,D15,D6[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]
|
||||
VEXT.8 Q8,Q8,Q15,#2
|
||||
VMLAL.S16 Q11,D9,D0[1]
|
||||
VEXT.8 Q8,Q8,Q15,#2
|
||||
VMLAL.S16 Q11,D9,D0[1]
|
||||
VMLAL.S16 Q12,D10,D1[1]
|
||||
VEXT.8 Q4,Q4,Q5,#2
|
||||
VMLAL.S16 Q9,D10,D2[1]
|
||||
VMLAL.S16 Q10,D11,D3[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
|
||||
VMLAL.S16 Q9,D12,D4[1]
|
||||
VMLAL.S16 Q10,D13,D5[1]
|
||||
@@ -137,18 +137,18 @@ LOOP_6K7K:
|
||||
VMLAL.S16 Q10,D15,D7[1]
|
||||
VMLAL.S16 Q11,D15,D6[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]
|
||||
VEXT.8 Q8,Q8,Q15,#2
|
||||
VMLAL.S16 Q11,D9,D0[2]
|
||||
VEXT.8 Q8,Q8,Q15,#2
|
||||
VMLAL.S16 Q11,D9,D0[2]
|
||||
VMLAL.S16 Q12,D10,D1[2]
|
||||
VEXT.8 Q4,Q4,Q5,#2
|
||||
VMLAL.S16 Q9,D10,D2[2]
|
||||
VMLAL.S16 Q10,D11,D3[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
|
||||
VMLAL.S16 Q9,D12,D4[2]
|
||||
VMLAL.S16 Q10,D13,D5[2]
|
||||
@@ -159,18 +159,18 @@ LOOP_6K7K:
|
||||
VMLAL.S16 Q10,D15,D7[2]
|
||||
VMLAL.S16 Q11,D15,D6[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]
|
||||
VEXT.8 Q8,Q8,Q15,#2
|
||||
VMLAL.S16 Q11,D9,D0[3]
|
||||
VEXT.8 Q8,Q8,Q15,#2
|
||||
VMLAL.S16 Q11,D9,D0[3]
|
||||
VMLAL.S16 Q12,D10,D1[3]
|
||||
VEXT.8 Q4,Q4,Q5,#2
|
||||
VMLAL.S16 Q9,D10,D2[3]
|
||||
VMLAL.S16 Q10,D11,D3[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
|
||||
VMLAL.S16 Q9,D12,D4[3]
|
||||
VMLAL.S16 Q10,D13,D5[3]
|
||||
@@ -181,10 +181,10 @@ LOOP_6K7K:
|
||||
VMLAL.S16 Q10,D15,D7[3]
|
||||
VMLAL.S16 Q11,D15,D6[3]
|
||||
VMLAL.S16 Q12,D16,D7[3]
|
||||
VEXT.8 Q7,Q7,Q8,#2
|
||||
VEXT.8 Q7,Q7,Q8,#2
|
||||
|
||||
VMOV.S16 D8,D9
|
||||
VEXT.8 Q8,Q8,Q15,#2
|
||||
VEXT.8 Q8,Q8,Q15,#2
|
||||
VMOV.S16 D9,D10
|
||||
VADD.S32 Q9,Q9,Q10
|
||||
VMOV.S16 D10,D11
|
||||
@@ -214,12 +214,12 @@ LOOP_6K7K:
|
||||
VST1.S16 {D4, D5, D6}, [r1]!
|
||||
VST1.S16 D7[0], [r1]!
|
||||
VST1.S16 D7[1], [r1]!
|
||||
|
||||
|
||||
Filt_6k_7k_end:
|
||||
|
||||
ADD r13, r13, #240
|
||||
LDMFD r13!, {r0 - r12, r15}
|
||||
|
||||
ADD r13, r13, #240
|
||||
LDMFD r13!, {r0 - r12, r15}
|
||||
|
||||
Lable1:
|
||||
.word fir_6k_7k
|
||||
@ENDFUNC
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
|
||||
.section .text
|
||||
.global Norm_corr_asm
|
||||
.global Norm_corr_asm
|
||||
.extern Convolve_asm
|
||||
.extern Isqrt_n
|
||||
@******************************
|
||||
@@ -47,17 +47,17 @@
|
||||
.equ T_MIN , 212
|
||||
.equ T_MAX , 216
|
||||
.equ CORR_NORM , 220
|
||||
|
||||
|
||||
Norm_corr_asm:
|
||||
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
SUB r13, r13, #voSTACK
|
||||
|
||||
|
||||
ADD r8, r13, #20 @get the excf[L_SUBFR]
|
||||
LDR r4, [r13, #T_MIN] @get 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
|
||||
STMFD sp!, {r0 - r3}
|
||||
MOV r0, r5
|
||||
@@ -68,7 +68,7 @@ Norm_corr_asm:
|
||||
|
||||
@ r8 --- excf[]
|
||||
|
||||
MOV r14, r1 @copy xn[] address
|
||||
MOV r14, r1 @copy xn[] address
|
||||
MOV r7, #1
|
||||
VLD1.S16 {Q0, Q1}, [r14]!
|
||||
VLD1.S16 {Q2, Q3}, [r14]!
|
||||
@@ -95,34 +95,34 @@ Norm_corr_asm:
|
||||
VQADD.S32 D20, D20, D21
|
||||
VMOV.S32 r9, D20[0]
|
||||
VMOV.S32 r10, D20[1]
|
||||
QADD r6, r9, r10
|
||||
QADD r6, r9, r10
|
||||
QADD r6, r6, r6
|
||||
QADD r9, r6, r7 @L_tmp = (L_tmp << 1) + 1;
|
||||
CLZ r7, r9
|
||||
SUB r6, r7, #1 @exp = norm_l(L_tmp)
|
||||
RSB r7, r6, #32 @exp = 32 - exp
|
||||
MOV r6, r7, ASR #1
|
||||
MOV r6, r7, ASR #1
|
||||
RSB r7, r6, #0 @scale = -(exp >> 1)
|
||||
|
||||
|
||||
@loop for every possible period
|
||||
@for(t = t_min@ t <= t_max@ t++)
|
||||
@r7 --- scale r4 --- t_min r8 --- excf[]
|
||||
|
||||
LOOPFOR:
|
||||
LOOPFOR:
|
||||
ADD r14, r13, #20 @copy of excf[]
|
||||
MOV r12, r1 @copy of xn[]
|
||||
MOV r8, #0x8000
|
||||
|
||||
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 {Q6, Q7}, [r12]! @ load 16 x[]
|
||||
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 Q11, D1, D9
|
||||
VMLAL.S16 Q10, D2, D2
|
||||
VMLAL.S16 Q11, D2, D10
|
||||
VMLAL.S16 Q11, D2, D10
|
||||
VMLAL.S16 Q10, D3, D3
|
||||
VMLAL.S16 Q11, D3, D11
|
||||
VMLAL.S16 Q10, D4, D4
|
||||
@@ -143,7 +143,7 @@ LOOPFOR:
|
||||
VMLAL.S16 Q10, D1, D1
|
||||
VMLAL.S16 Q11, D1, D9
|
||||
VMLAL.S16 Q10, D2, D2
|
||||
VMLAL.S16 Q11, D2, D10
|
||||
VMLAL.S16 Q11, D2, D10
|
||||
VMLAL.S16 Q10, D3, D3
|
||||
VMLAL.S16 Q11, D3, D11
|
||||
VMLAL.S16 Q10, D4, D4
|
||||
@@ -162,19 +162,19 @@ LOOPFOR:
|
||||
VPADD.S32 D22, D22, D22 @D22[0] --- L_tmp << 1
|
||||
|
||||
VMOV.S32 r6, D20[0]
|
||||
VMOV.S32 r5, D22[0]
|
||||
VMOV.S32 r5, D22[0]
|
||||
|
||||
@r5 --- L_tmp, r6 --- L_tmp1
|
||||
MOV r10, #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
|
||||
|
||||
CLZ r10, r5
|
||||
|
||||
CLZ r10, r5
|
||||
CMP r5, #0
|
||||
RSBLT r11, r5, #0
|
||||
CLZLT r10, r11
|
||||
SUB r10, r10, #1 @exp = norm_l(L_tmp)
|
||||
|
||||
|
||||
MOV r5, r5, LSL r10 @L_tmp = (L_tmp << exp)
|
||||
RSB r10, r10, #30 @exp_corr = 30 - exp
|
||||
MOV r11, r5, ASR #16 @corr = extract_h(L_tmp)
|
||||
@@ -190,7 +190,7 @@ LOOPFOR:
|
||||
@Isqrt_n(&L_tmp, &exp_norm)
|
||||
|
||||
MOV r14, r0
|
||||
MOV r12, r1
|
||||
MOV r12, r1
|
||||
|
||||
STMFD sp!, {r0 - r4, r7 - r12, r14}
|
||||
ADD r1, sp, #4
|
||||
@@ -208,7 +208,7 @@ LOOPFOR:
|
||||
MOV r6, r6, ASR #16 @norm = extract_h(L_tmp)
|
||||
MUL r12, r6, r11
|
||||
ADD r12, r12, r12 @L_tmp = vo_L_mult(corr, norm)
|
||||
|
||||
|
||||
ADD r6, r10, r5
|
||||
ADD r6, r6, r7 @exp_corr + exp_norm + scale
|
||||
|
||||
@@ -227,8 +227,8 @@ LOOPFOR:
|
||||
|
||||
CMP r4, r6
|
||||
BEQ Norm_corr_asm_end
|
||||
|
||||
ADD r4, r4, #1 @ t_min ++
|
||||
|
||||
ADD r4, r4, #1 @ t_min ++
|
||||
RSB r5, r4, #0 @ k
|
||||
|
||||
MOV r6, #63 @ i = 63
|
||||
@@ -255,16 +255,16 @@ LOOPK:
|
||||
MUL r14, r11, r8
|
||||
LDR r6, [r13, #T_MAX] @ get t_max
|
||||
MOV r8, r14, ASR #15
|
||||
STRH r8, [r10]
|
||||
STRH r8, [r10]
|
||||
|
||||
CMP r4, r6
|
||||
BLE LOOPFOR
|
||||
|
||||
Norm_corr_asm_end:
|
||||
|
||||
ADD r13, r13, #voSTACK
|
||||
Norm_corr_asm_end:
|
||||
|
||||
ADD r13, r13, #voSTACK
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
|
||||
.END
|
||||
|
||||
|
||||
|
||||
@@ -33,12 +33,12 @@
|
||||
@ sig_lo[] --- r5
|
||||
@ lg --- r6
|
||||
|
||||
.section .text
|
||||
.section .text
|
||||
.global 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 r5, [r13, #44] @ get sig_lo[] address
|
||||
|
||||
@@ -49,8 +49,8 @@ Syn_filt_32_asm:
|
||||
SUB r10, r4, #32 @ sig_hi[-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
|
||||
|
||||
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
|
||||
VLD1.S16 {D8, D9, D10, D11}, [r11]! @ sig_lo[-16] ~ sig_lo[-1]
|
||||
VREV64.16 D2, D2
|
||||
VREV64.16 D3, D3
|
||||
VREV64.16 D3, D3
|
||||
VDUP.S32 Q15, r8
|
||||
|
||||
|
||||
SYN_LOOP:
|
||||
|
||||
LDRSH r6, [r2], #2 @exc[i]
|
||||
@@ -73,12 +73,12 @@ SYN_LOOP:
|
||||
|
||||
VEXT.8 D9, D9, D10, #2
|
||||
VEXT.8 D10, D10, D11, #2
|
||||
|
||||
|
||||
VPADD.S32 D28, D20, D21
|
||||
MUL r12, r6, r3 @exc[i] * a0
|
||||
VPADD.S32 D29, D28, D28
|
||||
VDUP.S32 Q10, D29[0] @result1
|
||||
|
||||
|
||||
VMULL.S16 Q11, D4, D3
|
||||
VMLAL.S16 Q11, D5, D2
|
||||
VSUB.S32 Q10, Q15, Q10
|
||||
@@ -101,7 +101,7 @@ SYN_LOOP:
|
||||
|
||||
VSHR.S32 Q10, Q10, #11 @result1 >>= 11
|
||||
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)
|
||||
VSUB.S32 Q12, Q12, Q11
|
||||
|
||||
@@ -122,12 +122,12 @@ SYN_LOOP:
|
||||
STRH r12, [r5], #2 @stroe sig_lo[i]
|
||||
|
||||
CMP r8, #64
|
||||
BLT SYN_LOOP
|
||||
|
||||
BLT SYN_LOOP
|
||||
|
||||
Syn_filt_32_end:
|
||||
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
@ENDFUNC
|
||||
.END
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -20,22 +20,22 @@
|
||||
@* Word16 y[], /* (o) : output vector */
|
||||
@* Word16 L /* (i) : vector size */
|
||||
@*)
|
||||
@
|
||||
@
|
||||
@ r0 --- x[]
|
||||
@ r1 --- h[]
|
||||
@ r2 --- y[]
|
||||
@ r3 --- L
|
||||
|
||||
.section .text
|
||||
.global Convolve_asm
|
||||
.section .text
|
||||
.global Convolve_asm
|
||||
|
||||
Convolve_asm:
|
||||
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
MOV r3, #0
|
||||
STMFD r13!, {r4 - r12, r14}
|
||||
MOV r3, #0
|
||||
MOV r11, #0x8000
|
||||
|
||||
LOOP:
|
||||
|
||||
LOOP:
|
||||
@MOV r8, #0 @ s = 0
|
||||
ADD r4, r1, r3, LSL #1 @ tmpH address
|
||||
ADD r5, r3, #1 @ i = n + 1
|
||||
@@ -43,21 +43,21 @@ LOOP:
|
||||
LDRSH r9, [r6], #2 @ *tmpX++
|
||||
LDRSH r10, [r4] @ *tmpH--
|
||||
SUB r5, r5, #1
|
||||
VMOV.S32 Q10, #0
|
||||
MUL r8, r9, r10
|
||||
VMOV.S32 Q10, #0
|
||||
MUL r8, r9, r10
|
||||
|
||||
LOOP1:
|
||||
LOOP1:
|
||||
CMP r5, #0
|
||||
BLE L1
|
||||
SUB r4, r4, #8
|
||||
MOV r9, r4
|
||||
VLD1.S16 D0, [r6]!
|
||||
VLD1.S16 D0, [r6]!
|
||||
VLD1.S16 D1, [r9]!
|
||||
VREV64.16 D1, D1
|
||||
SUBS r5, r5, #4
|
||||
VMLAL.S16 Q10, D0, D1
|
||||
B LOOP1
|
||||
L1:
|
||||
SUBS r5, r5, #4
|
||||
VMLAL.S16 Q10, D0, D1
|
||||
B LOOP1
|
||||
L1:
|
||||
VADD.S32 D20, D20, D21
|
||||
VPADD.S32 D20, D20, D20
|
||||
VMOV.S32 r5, D20[0]
|
||||
@@ -73,25 +73,25 @@ L1:
|
||||
ADD r5, r3, #1
|
||||
MOV r6, r0
|
||||
LDRSH r9, [r6], #2 @ *tmpX++
|
||||
LDRSH r10, [r4], #-2
|
||||
LDRSH r10, [r4], #-2
|
||||
LDRSH r12, [r6], #2
|
||||
LDRSH r14, [r4]
|
||||
|
||||
MUL r8, r9, r10
|
||||
SUB r5, r5, #2
|
||||
MLA r8, r12, r14, r8
|
||||
|
||||
|
||||
VMOV.S32 Q10, #0
|
||||
LOOP2:
|
||||
CMP r5, #0
|
||||
BLE L2
|
||||
SUB r4, r4, #8
|
||||
MOV r9, r4
|
||||
VLD1.S16 D0, [r6]!
|
||||
VLD1.S16 D0, [r6]!
|
||||
VLD1.S16 D1, [r9]!
|
||||
SUBS r5, r5, #4
|
||||
VREV64.16 D1, D1
|
||||
VMLAL.S16 Q10, D0, D1
|
||||
VMLAL.S16 Q10, D0, D1
|
||||
B LOOP2
|
||||
L2:
|
||||
VADD.S32 D20, D20, D21
|
||||
@@ -100,7 +100,7 @@ L2:
|
||||
ADD r8, r8, r5
|
||||
ADD r8, r11, r8, LSL #1
|
||||
MOV r8, r8, LSR #16 @extract_h(s)
|
||||
ADD r3, r3, #1
|
||||
ADD r3, r3, #1
|
||||
STRH r8, [r2], #2 @y[n]
|
||||
|
||||
|
||||
@@ -115,7 +115,7 @@ L2:
|
||||
MUL r8, r9, r10
|
||||
LDRSH r9, [r6], #2
|
||||
LDRSH r10, [r4]
|
||||
MLA r8, r12, r14, r8
|
||||
MLA r8, r12, r14, r8
|
||||
SUB r5, r5, #3
|
||||
MLA r8, r9, r10, r8
|
||||
|
||||
@@ -125,12 +125,12 @@ LOOP3:
|
||||
BLE L3
|
||||
SUB r4, r4, #8
|
||||
MOV r9, r4
|
||||
VLD1.S16 D0, [r6]!
|
||||
VLD1.S16 D0, [r6]!
|
||||
VLD1.S16 D1, [r9]!
|
||||
VREV64.16 D1, D1
|
||||
SUBS r5, r5, #4
|
||||
VMLAL.S16 Q10, D0, D1
|
||||
B LOOP3
|
||||
VMLAL.S16 Q10, D0, D1
|
||||
B LOOP3
|
||||
|
||||
L3:
|
||||
VADD.S32 D20, D20, D21
|
||||
@@ -146,18 +146,18 @@ L3:
|
||||
ADD r4, r1, r5, LSL #1 @ tmpH address
|
||||
MOV r6, r0
|
||||
VMOV.S32 Q10, #0
|
||||
LOOP4:
|
||||
LOOP4:
|
||||
CMP r5, #0
|
||||
BLE L4
|
||||
SUB r4, r4, #8
|
||||
MOV r9, r4
|
||||
VLD1.S16 D0, [r6]!
|
||||
VLD1.S16 D0, [r6]!
|
||||
VLD1.S16 D1, [r9]!
|
||||
VREV64.16 D1, D1
|
||||
SUBS r5, r5, #4
|
||||
VMLAL.S16 Q10, D0, D1
|
||||
B LOOP4
|
||||
L4:
|
||||
SUBS r5, r5, #4
|
||||
VMLAL.S16 Q10, D0, D1
|
||||
B LOOP4
|
||||
L4:
|
||||
VADD.S32 D20, D20, D21
|
||||
VPADD.S32 D20, D20, D20
|
||||
VMOV.S32 r5, D20[0]
|
||||
@@ -165,14 +165,14 @@ L4:
|
||||
MOV r5, r5, LSR #16 @extract_h(s)
|
||||
ADD r3, r3, #1
|
||||
STRH r5, [r2], #2 @y[n]
|
||||
|
||||
|
||||
CMP r3, #64
|
||||
BLT LOOP
|
||||
|
||||
Convolve_asm_end:
|
||||
|
||||
|
||||
Convolve_asm_end:
|
||||
|
||||
LDMFD r13!, {r4 - r12, r15}
|
||||
|
||||
|
||||
@ENDFUNC
|
||||
.END
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user