From e2e838afcf03e603a41a0455846eaf9614537c16 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Fri, 22 Apr 2011 09:22:33 +0300 Subject: Convert line breaks to Unix style Change-Id: I6219725a9fbd72432bad71a176c14f26fabdbd5f --- .../codecs/aacenc/SampleCode/AAC_E_SAMPLES.c | 566 +-- .../codecs/aacenc/basic_op/basic_op.h | 2308 ++++++------ .../codecs/aacenc/basic_op/basicop2.c | 3240 ++++++++-------- .../codecs/aacenc/basic_op/oper_32b.c | 358 +- .../codecs/aacenc/basic_op/oper_32b.h | 138 +- .../codecs/aacenc/basic_op/typedef.h | 42 +- .../codecs/aacenc/basic_op/typedefs.h | 262 +- media/libstagefright/codecs/aacenc/inc/aac_rom.h | 94 +- .../libstagefright/codecs/aacenc/inc/aacenc_core.h | 124 +- media/libstagefright/codecs/aacenc/inc/adj_thr.h | 40 +- .../codecs/aacenc/inc/adj_thr_data.h | 42 +- media/libstagefright/codecs/aacenc/inc/band_nrg.h | 40 +- media/libstagefright/codecs/aacenc/inc/bit_cnt.h | 42 +- media/libstagefright/codecs/aacenc/inc/bitbuffer.h | 40 +- media/libstagefright/codecs/aacenc/inc/bitenc.h | 44 +- .../codecs/aacenc/inc/block_switch.h | 40 +- .../libstagefright/codecs/aacenc/inc/channel_map.h | 40 +- media/libstagefright/codecs/aacenc/inc/config.h | 68 +- media/libstagefright/codecs/aacenc/inc/dyn_bits.h | 40 +- media/libstagefright/codecs/aacenc/inc/grp_data.h | 40 +- media/libstagefright/codecs/aacenc/inc/interface.h | 42 +- media/libstagefright/codecs/aacenc/inc/line_pe.h | 40 +- media/libstagefright/codecs/aacenc/inc/memalign.h | 70 +- media/libstagefright/codecs/aacenc/inc/ms_stereo.h | 40 +- .../codecs/aacenc/inc/pre_echo_control.h | 40 +- .../codecs/aacenc/inc/psy_configuration.h | 54 +- media/libstagefright/codecs/aacenc/inc/psy_const.h | 48 +- media/libstagefright/codecs/aacenc/inc/psy_data.h | 40 +- media/libstagefright/codecs/aacenc/inc/psy_main.h | 42 +- media/libstagefright/codecs/aacenc/inc/qc_data.h | 42 +- media/libstagefright/codecs/aacenc/inc/qc_main.h | 40 +- media/libstagefright/codecs/aacenc/inc/quantize.h | 40 +- media/libstagefright/codecs/aacenc/inc/sf_estim.h | 40 +- media/libstagefright/codecs/aacenc/inc/spreading.h | 42 +- media/libstagefright/codecs/aacenc/inc/stat_bits.h | 42 +- media/libstagefright/codecs/aacenc/inc/tns.h | 42 +- media/libstagefright/codecs/aacenc/inc/tns_func.h | 42 +- media/libstagefright/codecs/aacenc/inc/tns_param.h | 40 +- media/libstagefright/codecs/aacenc/inc/transform.h | 40 +- media/libstagefright/codecs/aacenc/src/aac_rom.c | 2010 +++++----- media/libstagefright/codecs/aacenc/src/aacenc.c | 942 ++--- .../libstagefright/codecs/aacenc/src/aacenc_core.c | 54 +- media/libstagefright/codecs/aacenc/src/adj_thr.c | 156 +- .../aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s | 334 +- .../aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s | 224 +- .../codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s | 260 +- .../codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s | 502 +-- .../codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s | 336 +- .../codecs/aacenc/src/asm/ARMV5E/band_nrg_v5.s | 408 +- .../codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s | 268 +- .../codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s | 290 +- .../codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s | 284 +- media/libstagefright/codecs/aacenc/src/band_nrg.c | 56 +- media/libstagefright/codecs/aacenc/src/bit_cnt.c | 1014 ++--- media/libstagefright/codecs/aacenc/src/bitbuffer.c | 42 +- media/libstagefright/codecs/aacenc/src/bitenc.c | 100 +- .../codecs/aacenc/src/block_switch.c | 92 +- .../libstagefright/codecs/aacenc/src/channel_map.c | 40 +- media/libstagefright/codecs/aacenc/src/dyn_bits.c | 68 +- media/libstagefright/codecs/aacenc/src/grp_data.c | 48 +- media/libstagefright/codecs/aacenc/src/interface.c | 54 +- media/libstagefright/codecs/aacenc/src/line_pe.c | 66 +- media/libstagefright/codecs/aacenc/src/ms_stereo.c | 50 +- .../codecs/aacenc/src/pre_echo_control.c | 44 +- .../codecs/aacenc/src/psy_configuration.c | 134 +- media/libstagefright/codecs/aacenc/src/psy_main.c | 218 +- media/libstagefright/codecs/aacenc/src/qc_main.c | 122 +- media/libstagefright/codecs/aacenc/src/quantize.c | 382 +- media/libstagefright/codecs/aacenc/src/sf_estim.c | 124 +- media/libstagefright/codecs/aacenc/src/spreading.c | 90 +- media/libstagefright/codecs/aacenc/src/stat_bits.c | 56 +- media/libstagefright/codecs/aacenc/src/tns.c | 140 +- media/libstagefright/codecs/aacenc/src/transform.c | 730 ++-- .../codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c | 728 ++-- media/libstagefright/codecs/amrwbenc/inc/acelp.h | 1042 +++--- .../libstagefright/codecs/amrwbenc/inc/basic_op.h | 2188 +++++------ media/libstagefright/codecs/amrwbenc/inc/bits.h | 184 +- media/libstagefright/codecs/amrwbenc/inc/cnst.h | 162 +- .../libstagefright/codecs/amrwbenc/inc/cod_main.h | 206 +- media/libstagefright/codecs/amrwbenc/inc/dtx.h | 230 +- .../libstagefright/codecs/amrwbenc/inc/grid100.tab | 106 +- .../codecs/amrwbenc/inc/ham_wind.tab | 146 +- .../libstagefright/codecs/amrwbenc/inc/homing.tab | 246 +- .../libstagefright/codecs/amrwbenc/inc/isp_isf.tab | 124 +- .../codecs/amrwbenc/inc/lag_wind.tab | 162 +- media/libstagefright/codecs/amrwbenc/inc/log2.h | 124 +- .../libstagefright/codecs/amrwbenc/inc/log2_tab.h | 70 +- media/libstagefright/codecs/amrwbenc/inc/main.h | 90 +- media/libstagefright/codecs/amrwbenc/inc/math_op.h | 110 +- .../libstagefright/codecs/amrwbenc/inc/mem_align.h | 70 +- .../libstagefright/codecs/amrwbenc/inc/mime_io.tab | 736 ++-- .../libstagefright/codecs/amrwbenc/inc/oper_32b.h | 62 +- media/libstagefright/codecs/amrwbenc/inc/p_med_o.h | 104 +- .../codecs/amrwbenc/inc/p_med_ol.tab | 94 +- .../libstagefright/codecs/amrwbenc/inc/q_gain2.tab | 456 +-- media/libstagefright/codecs/amrwbenc/inc/q_pulse.h | 132 +- .../libstagefright/codecs/amrwbenc/inc/qisf_ns.tab | 694 ++-- .../codecs/amrwbenc/inc/qpisf_2s.tab | 2720 +++++++------- media/libstagefright/codecs/amrwbenc/inc/stream.h | 94 +- media/libstagefright/codecs/amrwbenc/inc/typedef.h | 130 +- .../libstagefright/codecs/amrwbenc/inc/typedefs.h | 422 +-- media/libstagefright/codecs/amrwbenc/inc/wb_vad.h | 156 +- .../libstagefright/codecs/amrwbenc/inc/wb_vad_c.h | 218 +- .../codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s | 208 +- .../codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s | 160 +- .../amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s | 370 +- .../amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s | 452 +-- .../codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s | 302 +- .../amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s | 920 ++--- .../amrwbenc/src/asm/ARMV5E/residu_asm_opt.s | 456 +-- .../codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s | 150 +- .../codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s | 476 +-- .../codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s | 204 +- .../codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s | 254 +- .../amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s | 456 +-- .../amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s | 266 +- .../codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s | 302 +- .../amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s | 200 +- .../codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s | 276 +- .../codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s | 212 +- .../libstagefright/codecs/amrwbenc/src/autocorr.c | 254 +- media/libstagefright/codecs/amrwbenc/src/az_isp.c | 536 +-- media/libstagefright/codecs/amrwbenc/src/bits.c | 420 +-- media/libstagefright/codecs/amrwbenc/src/c2t64fx.c | 594 +-- media/libstagefright/codecs/amrwbenc/src/c4t64fx.c | 2086 +++++------ .../libstagefright/codecs/amrwbenc/src/cmnMemory.c | 146 +- .../libstagefright/codecs/amrwbenc/src/convolve.c | 218 +- media/libstagefright/codecs/amrwbenc/src/cor_h_x.c | 254 +- media/libstagefright/codecs/amrwbenc/src/decim54.c | 292 +- media/libstagefright/codecs/amrwbenc/src/deemph.c | 234 +- media/libstagefright/codecs/amrwbenc/src/dtx.c | 1210 +++--- media/libstagefright/codecs/amrwbenc/src/g_pitch.c | 158 +- media/libstagefright/codecs/amrwbenc/src/gpclip.c | 220 +- media/libstagefright/codecs/amrwbenc/src/homing.c | 92 +- media/libstagefright/codecs/amrwbenc/src/hp400.c | 212 +- media/libstagefright/codecs/amrwbenc/src/hp50.c | 212 +- media/libstagefright/codecs/amrwbenc/src/hp6k.c | 186 +- media/libstagefright/codecs/amrwbenc/src/hp_wsp.c | 296 +- media/libstagefright/codecs/amrwbenc/src/int_lpc.c | 132 +- media/libstagefright/codecs/amrwbenc/src/isp_az.c | 494 +-- media/libstagefright/codecs/amrwbenc/src/isp_isf.c | 182 +- .../libstagefright/codecs/amrwbenc/src/lag_wind.c | 98 +- .../libstagefright/codecs/amrwbenc/src/levinson.c | 500 +-- media/libstagefright/codecs/amrwbenc/src/log2.c | 222 +- media/libstagefright/codecs/amrwbenc/src/lp_dec2.c | 140 +- media/libstagefright/codecs/amrwbenc/src/math_op.c | 438 +-- .../libstagefright/codecs/amrwbenc/src/oper_32b.c | 446 +-- .../libstagefright/codecs/amrwbenc/src/p_med_ol.c | 512 +-- .../libstagefright/codecs/amrwbenc/src/pit_shrp.c | 98 +- .../libstagefright/codecs/amrwbenc/src/pitch_f4.c | 648 ++-- .../libstagefright/codecs/amrwbenc/src/pred_lt4.c | 240 +- media/libstagefright/codecs/amrwbenc/src/preemph.c | 176 +- media/libstagefright/codecs/amrwbenc/src/q_gain2.c | 692 ++-- media/libstagefright/codecs/amrwbenc/src/q_pulse.c | 800 ++-- media/libstagefright/codecs/amrwbenc/src/qisf_ns.c | 222 +- .../libstagefright/codecs/amrwbenc/src/qpisf_2s.c | 1084 +++--- media/libstagefright/codecs/amrwbenc/src/random.c | 66 +- media/libstagefright/codecs/amrwbenc/src/residu.c | 134 +- media/libstagefright/codecs/amrwbenc/src/scale.c | 114 +- media/libstagefright/codecs/amrwbenc/src/stream.c | 116 +- .../libstagefright/codecs/amrwbenc/src/syn_filt.c | 320 +- .../libstagefright/codecs/amrwbenc/src/updt_tar.c | 98 +- media/libstagefright/codecs/amrwbenc/src/util.c | 148 +- .../codecs/amrwbenc/src/voAMRWBEnc.c | 3882 ++++++++++---------- .../libstagefright/codecs/amrwbenc/src/voicefac.c | 184 +- media/libstagefright/codecs/amrwbenc/src/wb_vad.c | 1616 ++++---- .../libstagefright/codecs/amrwbenc/src/weight_a.c | 96 +- media/libstagefright/codecs/common/Config.mk | 48 +- media/libstagefright/codecs/common/cmnMemory.c | 146 +- .../codecs/common/include/cmnMemory.h | 212 +- media/libstagefright/codecs/common/include/voAAC.h | 148 +- .../libstagefright/codecs/common/include/voAMRWB.h | 174 +- .../libstagefright/codecs/common/include/voAudio.h | 346 +- .../libstagefright/codecs/common/include/voIndex.h | 386 +- .../libstagefright/codecs/common/include/voType.h | 442 +-- 175 files changed, 29631 insertions(+), 29631 deletions(-) (limited to 'media/libstagefright') diff --git a/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c b/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c index 774da7b..2ea9449 100644 --- a/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c +++ b/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c @@ -1,283 +1,283 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: AAC_E_SAMPLES.h - - Content: sample code for AAC encoder - -*******************************************************************************/ - -#include -#include -#include -#include -#include -#include "voAAC.h" -#include "cmnMemory.h" - -#define VO_AAC_E_OUTPUT 1 -#define READ_SIZE (1024*8) -unsigned char outBuf[1024*8]; -unsigned char inBuf[READ_SIZE]; - -const char* HelpString = -"VisualOn AAC encoder Usage:\n" -"voAACEncTest -if -of -sr -ch -br -adts \n" -"-if input file name \n" -"-of output file name \n" -"-sr input pcm samplerate, default 44100 \n" -"-ch input pcm channel, default 2 channel \n" -"-br encoded aac bitrate, default 64000 * (samplerate/100)*channel/441(480)\n" -"-adts add or no adts header, default add adts header\n" -"For example: \n" -"./voAACEncTest -if raw.pcm -of raw.aac -sr 44100 -ch 2 -br 128000\n"; - -static int parsecmdline(int argc, char **argv,char **input_filename, char **output_filename, AACENC_PARAM *param) -{ - // notice that: - // bitRate/nChannels > 8000 - // bitRate/nChannels < 160000 - // bitRate/nChannels < sampleRate*6 - param->adtsUsed = 1; - param->bitRate = 0; - param->nChannels = 2; - param->sampleRate = 44100; - - if(argc < 5 || argc > 13) - { - return -1; - } - - argc--; - argv++; - while (argc > 0) - { - if (!strcmp(*argv, "-if")) - { - argv++; - argc--; - *input_filename = *argv; - } - else if (!strcmp(*argv, "-of")) - { - argv++; - argc--; - *output_filename = *argv; - } - else if (!strcmp(*argv, "-sr")) - { - argv++; - argc--; - param->sampleRate = atoi(*argv); - } - else if (!strcmp(*argv, "-ch")) - { - argv++; - argc--; - param->nChannels = atoi(*argv); - } - else if (!strcmp(*argv, "-br")) - { - argv++; - argc--; - param->bitRate = atoi(*argv); - } - else if(!strcmp(*argv, "-adts")) - { - argv++; - argc--; - param->adtsUsed = atoi(*argv); - } - else - { - return -1; - } - - argv++; - argc--; - } - - if(param->bitRate == 0) - { - int scale = 441; - if(param->sampleRate%8000 == 0) - scale = 480; - param->bitRate = 640*param->nChannels*param->sampleRate/scale; - } - - return 0; -} - -int ReadFile2Buf(FILE* infile,unsigned char* dest,int readSize) -{ - int readBytes = 0; - readBytes = fread(dest, 1, readSize, infile); - return readBytes; -} - -typedef int (VO_API * VOGETAUDIODECAPI) (VO_AUDIO_CODECAPI * pDecHandle); - -int main(int argc, char **argv) -{ - FILE *infile, *outfile; - int t1, t2; - VO_AUDIO_CODECAPI AudioAPI; - VO_MEM_OPERATOR moper; - VO_CODEC_INIT_USERDATA useData; - VO_HANDLE hCodec; - VO_CODECBUFFER inData; - VO_CODECBUFFER outData; - VO_AUDIO_OUTPUTINFO outInfo; - int firstWrite = 1; - int eofFile = 0; - int *info=(int*)inBuf; - int bytesLeft, nRead; - int EncoderdFrame = 0; - int total = 0; - int isOutput = 1; - int returnCode; - AACENC_PARAM aacpara; - void *handle; - void *pfunc; - VOGETAUDIODECAPI pGetAPI; - const char *infileName = NULL; - const char *outfileName = NULL; - - returnCode = parsecmdline(argc,argv, &infileName, &outfileName, &aacpara); - if(returnCode) - { - printf("%s", HelpString); - return 0; - } - - /* open input file */ - infile = fopen(infileName, "rb"); - if (!infile) { - printf("Open input file fail..."); - return -1; - } - - /* open output file */ - if(isOutput) - { - outfile = fopen(outfileName, "wb"); - if (!outfile) { - printf("Open output file fail..."); - return -1; - } - } - // set memory operators; - moper.Alloc = cmnMemAlloc; - moper.Copy = cmnMemCopy; - moper.Free = cmnMemFree; - moper.Set = cmnMemSet; - moper.Check = cmnMemCheck; - useData.memflag = VO_IMF_USERMEMOPERATOR; - useData.memData = (VO_PTR)(&moper); - // open encoder dll; - handle = dlopen("libstagefright.so", RTLD_NOW); - if(handle == 0) - { - printf("open dll error......"); - return -1; - } - // Get API; - pfunc = dlsym(handle, "voGetAACEncAPI"); - if(pfunc == 0) - { - printf("open function error......"); - return -1; - } - pGetAPI = (VOGETAUDIODECAPI)pfunc; - returnCode = pGetAPI(&AudioAPI); - if(returnCode) - return -1; - - -//####################################### Init Encoding Section ######################################### - returnCode = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAAC, &useData); - if(returnCode < 0) - { - printf("#### VOI_Error2:fail to initialize the Encoderr###\n"); - return -1; - } - - 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; - outData.Buffer = outBuf; - outData.Length = 1024*8; - - t1 = clock(); - - returnCode = AudioAPI.SetInputData(hCodec,&inData); - - do { - outData.Buffer = outBuf; - outData.Length = 1024*8; - - returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outInfo); - - if(returnCode == 0) - EncoderdFrame++; - if(returnCode == VO_ERR_LICENSE_ERROR) - break; - -#if VO_AAC_E_OUTPUT - if (isOutput && returnCode == 0) - { - fwrite(outData.Buffer, 1, outData.Length, outfile); - } -#endif - } while(returnCode != (VO_ERR_INPUT_BUFFER_SMALL)); - - if(returnCode == VO_ERR_LICENSE_ERROR) - break; - - t2 = clock(); - total += t2 - t1; - - if (!eofFile) { - nRead = ReadFile2Buf(infile, inBuf,READ_SIZE); - bytesLeft = nRead; - inData.Buffer = inBuf; - if (feof(infile)) - eofFile = 1; - } - - } while (!eofFile && returnCode); - - -//################################################ End Encoding Section ####################################################### - returnCode = AudioAPI.Uninit(hCodec); - - fclose(infile); - if (outfile) - { - fclose(outfile); - } - dlclose(handle); - return 0; -} - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: AAC_E_SAMPLES.h + + Content: sample code for AAC encoder + +*******************************************************************************/ + +#include +#include +#include +#include +#include +#include "voAAC.h" +#include "cmnMemory.h" + +#define VO_AAC_E_OUTPUT 1 +#define READ_SIZE (1024*8) +unsigned char outBuf[1024*8]; +unsigned char inBuf[READ_SIZE]; + +const char* HelpString = +"VisualOn AAC encoder Usage:\n" +"voAACEncTest -if -of -sr -ch -br -adts \n" +"-if input file name \n" +"-of output file name \n" +"-sr input pcm samplerate, default 44100 \n" +"-ch input pcm channel, default 2 channel \n" +"-br encoded aac bitrate, default 64000 * (samplerate/100)*channel/441(480)\n" +"-adts add or no adts header, default add adts header\n" +"For example: \n" +"./voAACEncTest -if raw.pcm -of raw.aac -sr 44100 -ch 2 -br 128000\n"; + +static int parsecmdline(int argc, char **argv,char **input_filename, char **output_filename, AACENC_PARAM *param) +{ + // notice that: + // bitRate/nChannels > 8000 + // bitRate/nChannels < 160000 + // bitRate/nChannels < sampleRate*6 + param->adtsUsed = 1; + param->bitRate = 0; + param->nChannels = 2; + param->sampleRate = 44100; + + if(argc < 5 || argc > 13) + { + return -1; + } + + argc--; + argv++; + while (argc > 0) + { + if (!strcmp(*argv, "-if")) + { + argv++; + argc--; + *input_filename = *argv; + } + else if (!strcmp(*argv, "-of")) + { + argv++; + argc--; + *output_filename = *argv; + } + else if (!strcmp(*argv, "-sr")) + { + argv++; + argc--; + param->sampleRate = atoi(*argv); + } + else if (!strcmp(*argv, "-ch")) + { + argv++; + argc--; + param->nChannels = atoi(*argv); + } + else if (!strcmp(*argv, "-br")) + { + argv++; + argc--; + param->bitRate = atoi(*argv); + } + else if(!strcmp(*argv, "-adts")) + { + argv++; + argc--; + param->adtsUsed = atoi(*argv); + } + else + { + return -1; + } + + argv++; + argc--; + } + + if(param->bitRate == 0) + { + int scale = 441; + if(param->sampleRate%8000 == 0) + scale = 480; + param->bitRate = 640*param->nChannels*param->sampleRate/scale; + } + + return 0; +} + +int ReadFile2Buf(FILE* infile,unsigned char* dest,int readSize) +{ + int readBytes = 0; + readBytes = fread(dest, 1, readSize, infile); + return readBytes; +} + +typedef int (VO_API * VOGETAUDIODECAPI) (VO_AUDIO_CODECAPI * pDecHandle); + +int main(int argc, char **argv) +{ + FILE *infile, *outfile; + int t1, t2; + VO_AUDIO_CODECAPI AudioAPI; + VO_MEM_OPERATOR moper; + VO_CODEC_INIT_USERDATA useData; + VO_HANDLE hCodec; + VO_CODECBUFFER inData; + VO_CODECBUFFER outData; + VO_AUDIO_OUTPUTINFO outInfo; + int firstWrite = 1; + int eofFile = 0; + int *info=(int*)inBuf; + int bytesLeft, nRead; + int EncoderdFrame = 0; + int total = 0; + int isOutput = 1; + int returnCode; + AACENC_PARAM aacpara; + void *handle; + void *pfunc; + VOGETAUDIODECAPI pGetAPI; + const char *infileName = NULL; + const char *outfileName = NULL; + + returnCode = parsecmdline(argc,argv, &infileName, &outfileName, &aacpara); + if(returnCode) + { + printf("%s", HelpString); + return 0; + } + + /* open input file */ + infile = fopen(infileName, "rb"); + if (!infile) { + printf("Open input file fail..."); + return -1; + } + + /* open output file */ + if(isOutput) + { + outfile = fopen(outfileName, "wb"); + if (!outfile) { + printf("Open output file fail..."); + return -1; + } + } + // set memory operators; + moper.Alloc = cmnMemAlloc; + moper.Copy = cmnMemCopy; + moper.Free = cmnMemFree; + moper.Set = cmnMemSet; + moper.Check = cmnMemCheck; + useData.memflag = VO_IMF_USERMEMOPERATOR; + useData.memData = (VO_PTR)(&moper); + // open encoder dll; + handle = dlopen("libstagefright.so", RTLD_NOW); + if(handle == 0) + { + printf("open dll error......"); + return -1; + } + // Get API; + pfunc = dlsym(handle, "voGetAACEncAPI"); + if(pfunc == 0) + { + printf("open function error......"); + return -1; + } + pGetAPI = (VOGETAUDIODECAPI)pfunc; + returnCode = pGetAPI(&AudioAPI); + if(returnCode) + return -1; + + +//####################################### Init Encoding Section ######################################### + returnCode = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAAC, &useData); + if(returnCode < 0) + { + printf("#### VOI_Error2:fail to initialize the Encoderr###\n"); + return -1; + } + + 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; + outData.Buffer = outBuf; + outData.Length = 1024*8; + + t1 = clock(); + + returnCode = AudioAPI.SetInputData(hCodec,&inData); + + do { + outData.Buffer = outBuf; + outData.Length = 1024*8; + + returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outInfo); + + if(returnCode == 0) + EncoderdFrame++; + if(returnCode == VO_ERR_LICENSE_ERROR) + break; + +#if VO_AAC_E_OUTPUT + if (isOutput && returnCode == 0) + { + fwrite(outData.Buffer, 1, outData.Length, outfile); + } +#endif + } while(returnCode != (VO_ERR_INPUT_BUFFER_SMALL)); + + if(returnCode == VO_ERR_LICENSE_ERROR) + break; + + t2 = clock(); + total += t2 - t1; + + if (!eofFile) { + nRead = ReadFile2Buf(infile, inBuf,READ_SIZE); + bytesLeft = nRead; + inData.Buffer = inBuf; + if (feof(infile)) + eofFile = 1; + } + + } while (!eofFile && returnCode); + + +//################################################ End Encoding Section ####################################################### + returnCode = AudioAPI.Uninit(hCodec); + + fclose(infile); + if (outfile) + { + fclose(outfile); + } + dlclose(handle); + return 0; +} + + diff --git a/media/libstagefright/codecs/aacenc/basic_op/basic_op.h b/media/libstagefright/codecs/aacenc/basic_op/basic_op.h index 5457f33..8291684 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/basic_op.h +++ b/media/libstagefright/codecs/aacenc/basic_op/basic_op.h @@ -1,27 +1,27 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: basicop2.h - - Content: Constants , Globals and Basic arithmetic operators. - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: basicop2.h + + Content: Constants , Globals and Basic arithmetic operators. + *******************************************************************************/ #ifndef __BASIC_OP_H -#define __BASIC_OP_H +#define __BASIC_OP_H #include "typedef.h" @@ -30,1137 +30,1137 @@ #define MAX_16 (Word16)0x7fff #define MIN_16 (Word16)0x8000 -#define ABS(a) ((a) >= 0) ? (a) : (-(a)) - -/* Short abs, 1 */ -#define abs_s(x) ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16)) - -/* 16 bit var1 -> MSB, 2 */ -#define L_deposit_h(x) (((Word32)(x)) << 16) - - -/* 16 bit var1 -> LSB, 2 */ -#define L_deposit_l(x) ((Word32)(x)) - - -/* Long abs, 3 */ -#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32) - - -/* Short negate, 1 */ -#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1)))) - - -/* Long negate, 2 */ -#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1))) - - -#define MULHIGH(A,B) (int)(((Word64)(A)*(Word64)(B)) >> 32) -#define fixmul(a, b) (int)((((Word64)(a)*(Word64)(b)) >> 32) << 1) - - -#if (SATRUATE_IS_INLINE) -__inline Word16 saturate(Word32 L_var1); -#else -Word16 saturate(Word32 L_var1); -#endif - -/* Short shift left, 1 */ -#if (SHL_IS_INLINE) -__inline Word16 shl (Word16 var1, Word16 var2); -#else -Word16 shl (Word16 var1, Word16 var2); -#endif - -/* Short shift right, 1 */ -#if (SHR_IS_INLINE) -__inline Word16 shr (Word16 var1, Word16 var2); -#else -Word16 shr (Word16 var1, Word16 var2); -#endif - -#if (L_MULT_IS_INLINE) -__inline Word32 L_mult(Word16 var1, Word16 var2); -#else -Word32 L_mult(Word16 var1, Word16 var2); -#endif - -/* Msu, 1 */ -#if (L_MSU_IS_INLINE) -__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); -#else -Word32 L_sub(Word32 L_var1, Word32 L_var2); -#endif - -/* Long shift left, 2 */ -#if (L_SHL_IS_INLINE) -__inline Word32 L_shl (Word32 L_var1, Word16 var2); -#else -Word32 L_shl (Word32 L_var1, Word16 var2); -#endif - -/* Long shift right, 2*/ -#if (L_SHR_IS_INLINE) -__inline Word32 L_shr (Word32 L_var1, Word16 var2); -#else -Word32 L_shr (Word32 L_var1, Word16 var2); -#endif - -/* Short add, 1 */ -#if (ADD_IS_INLINE) -__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); -#else -Word16 sub(Word16 var1, Word16 var2); -#endif - -/* Short division, 18 */ -#if (DIV_S_IS_INLINE) -__inline Word16 div_s (Word16 var1, Word16 var2); -#else -Word16 div_s (Word16 var1, Word16 var2); -#endif - -/* Short mult, 1 */ -#if (MULT_IS_INLINE) -__inline Word16 mult (Word16 var1, Word16 var2); -#else -Word16 mult (Word16 var1, Word16 var2); -#endif - -/* Short norm, 15 */ -#if (NORM_S_IS_INLINE) -__inline Word16 norm_s (Word16 var1); -#else -Word16 norm_s (Word16 var1); -#endif - -/* Long norm, 30 */ -#if (NORM_L_IS_INLINE) -__inline Word16 norm_l (Word32 L_var1); -#else -Word16 norm_l (Word32 L_var1); -#endif - -/* Round, 1 */ -#if (ROUND_IS_INLINE) -__inline Word16 round16(Word32 L_var1); -#else -Word16 round16(Word32 L_var1); -#endif - -/* Mac, 1 */ -#if (L_MAC_IS_INLINE) -__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2); -#else -Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2); -#endif - -#if (L_ADD_IS_INLINE) -__inline Word32 L_add (Word32 L_var1, Word32 L_var2); -#else -Word32 L_add (Word32 L_var1, Word32 L_var2); -#endif - -/* Extract high, 1 */ -#if (EXTRACT_H_IS_INLINE) -__inline Word16 extract_h (Word32 L_var1); -#else -Word16 extract_h (Word32 L_var1); -#endif - -/* Extract low, 1 */ -#if (EXTRACT_L_IS_INLINE) -__inline Word16 extract_l(Word32 L_var1); -#else -Word16 extract_l(Word32 L_var1); -#endif - -/* Mult with round, 2 */ -#if (MULT_R_IS_INLINE) -__inline Word16 mult_r(Word16 var1, Word16 var2); -#else -Word16 mult_r(Word16 var1, Word16 var2); -#endif - -/* Shift right with round, 2 */ -#if (SHR_R_IS_INLINE) -__inline Word16 shr_r (Word16 var1, Word16 var2); -#else -Word16 shr_r (Word16 var1, Word16 var2); -#endif - -/* Mac with rounding,2 */ -#if (MAC_R_IS_INLINE) -__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2); -#else -Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2); -#endif - -/* Msu with rounding,2 */ -#if (MSU_R_IS_INLINE) -__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2); -#else -Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2); -#endif - -/* Long shift right with round, 3 */ -#if (L_SHR_R_IS_INLINE) -__inline Word32 L_shr_r (Word32 L_var1, Word16 var2); -#else -Word32 L_shr_r (Word32 L_var1, Word16 var2); -#endif - -#if ARMV4_INASM -__inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2) -{ - Word32 result; - asm volatile( - "MOV %[result], %[L_var1], ASR %[var2] \n" - :[result]"=r"(result) - :[L_var1]"r"(L_var1), [var2]"r"(var2) - ); - return result; -} - -__inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2) -{ - Word32 result; - asm volatile( - "MOV r2, %[L_var1] \n" - "MOV r3, #0x7fffffff\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; -} - -__inline Word32 ASM_shr(Word32 L_var1, Word16 var2) -{ - 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; -} - -__inline Word32 ASM_shl(Word32 L_var1, Word16 var2) -{ - Word32 result; - asm volatile( - "CMP %[var2], #16\n" - "MOVGE %[var2], #16\n" - "MOV %[result], %[L_var1], ASL %[var2]\n" - "MOV r3, #1\n" - "MOV r2, %[result], ASR #15\n" - "RSB r3,r3,r3,LSL #15 \n" - "TEQ r2, %[result], ASR #31 \n" - "EORNE %[result], r3, %[result],ASR #31" - :[result]"+r"(result) - :[L_var1]"r"(L_var1), [var2]"r"(var2) - :"r2", "r3" - ); - return result; -} -#endif - -/*___________________________________________________________________________ - | | - | definitions for inline basic arithmetic operators | - |___________________________________________________________________________| -*/ -#if (SATRUATE_IS_INLINE) -__inline Word16 saturate(Word32 L_var1) -{ -#if ARMV5TE_SAT - Word16 result; - asm volatile ( - "MOV %[result], %[L_var1]\n" - "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" - "EORNE %[result],r3,%[L_var1],ASR#31\n" - :[result]"+r"(result) - :[L_var1]"r"(L_var1) - :"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) - { - var_out = MAX_16; - } - else if (L_var1 < (Word32) 0xffff8000L) - { - var_out = MIN_16; - } - else - { - var_out = extract_l(L_var1); - } - - return (var_out); -#endif -} -#endif - -/* Short shift left, 1 */ -#if (SHL_IS_INLINE) -__inline Word16 shl (Word16 var1, Word16 var2) -{ -#if ARMV5TE_SHL - if(var2>=0) - { - return ASM_shl( var1, var2); - } - else - { - return ASM_shr( var1, -var2); - } -#else - Word16 var_out; - Word32 result; - - if (var2 < 0) - { - var_out = shr (var1, (Word16)-var2); - } - else - { - result = (Word32) var1 *((Word32) 1 << var2); - - if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result))) - { - var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16); - } - else - { - var_out = extract_l(result); - } - } - return (var_out); -#endif -} -#endif - -/* Short shift right, 1 */ -#if (SHR_IS_INLINE) -__inline Word16 shr (Word16 var1, Word16 var2) -{ -#if ARMV5TE_SHR - if(var2>=0) - { - return ASM_shr( var1, var2); - } - else - { - return ASM_shl( var1, -var2); - } -#else - Word16 var_out; - - if (var2 < 0) - { - var_out = shl (var1, (Word16)-var2); - } - else - { - if (var2 >= 15) - { - var_out = (Word16)((var1 < 0) ? -1 : 0); - } - else - { - if (var1 < 0) - { - var_out = (Word16)(~((~var1) >> var2)); - } - else - { - var_out = (Word16)(var1 >> var2); - } - } - } - - return (var_out); -#endif -} -#endif - - -#if (L_MULT_IS_INLINE) -__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" - :[result]"+r"(result) - :[var1]"r"(var1), [var2]"r"(var2) - ); - return result; -#else - Word32 L_var_out; - - L_var_out = (Word32) var1 *(Word32) var2; - - if (L_var_out != (Word32) 0x40000000L) - { - L_var_out <<= 1; - } - else - { - L_var_out = MAX_32; - } - return (L_var_out); -#endif -} -#endif - -#if (L_MSU_IS_INLINE) -__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2) -{ -#if ARMV5TE_L_MSU - 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; - Word32 L_product; - - L_product = L_mult(var1, var2); - L_var_out = L_sub(L_var3, L_product); - return (L_var_out); -#endif -} -#endif - -#if (L_SUB_IS_INLINE) -__inline Word32 L_sub(Word32 L_var1, Word32 L_var2) -{ -#if ARMV5TE_L_SUB - 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; - - L_var_out = L_var1 - L_var2; - - if (((L_var1 ^ L_var2) & MIN_32) != 0) - { - if ((L_var_out ^ L_var1) & MIN_32) - { - L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32; - } - } - - return (L_var_out); -#endif -} -#endif - -#if (L_SHL_IS_INLINE) -__inline Word32 L_shl(Word32 L_var1, Word16 var2) -{ -#if ARMV5TE_L_SHL - if(var2>=0) - { - return ASM_L_shl( L_var1, var2); - } - else - { - return ASM_L_shr( L_var1, -var2); - } -#else - Word32 L_var_out = 0L; - - if (var2 <= 0) - { - L_var1 = L_shr(L_var1, (Word16)-var2); - } - else - { - for (; var2 > 0; var2--) - { - if (L_var1 > (Word32) 0X3fffffffL) - { - return MAX_32; - } - else - { - if (L_var1 < (Word32) 0xc0000000L) - { - return MIN_32; - } - } - L_var1 <<= 1; - L_var_out = L_var1; - } - } - return (L_var1); -#endif -} -#endif - -#if (L_SHR_IS_INLINE) -__inline Word32 L_shr (Word32 L_var1, Word16 var2) -{ -#if ARMV5TE_L_SHR - if(var2>=0) - { - return ASM_L_shr( L_var1, var2); - } - else - { - return ASM_L_shl( L_var1, -var2); - } -#else - Word32 L_var_out; - - if (var2 < 0) - { - L_var_out = L_shl (L_var1, (Word16)-var2); - } - else - { - if (var2 >= 31) - { - L_var_out = (L_var1 < 0L) ? -1 : 0; - } - else - { - if (L_var1 < 0) - { - L_var_out = ~((~L_var1) >> var2); - } - else - { - L_var_out = L_var1 >> var2; - } - } - } - return (L_var_out); -#endif -} -#endif - -/* Short add, 1 */ -#if (ADD_IS_INLINE) -__inline Word16 add (Word16 var1, Word16 var2) -{ -#if ARMV5TE_ADD - 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" - "TEQ r2, %[result], ASR #31\n" - "EORNE %[result], r3, %[result], ASR #31" - :[result]"+r"(result) - :[var1]"r"(var1), [var2]"r"(var2) - :"r2", "r3" - ); - return result; -#else - Word16 var_out; - Word32 L_sum; - - L_sum = (Word32) var1 + var2; - var_out = saturate(L_sum); - - return (var_out); -#endif -} -#endif - -/* Short sub, 1 */ -#if (SUB_IS_INLINE) -__inline Word16 sub(Word16 var1, Word16 var2) -{ -#if ARMV5TE_SUB - Word32 result; - asm volatile( - "MOV r3, #1\n" - "SUB %[result], %[var1], %[var2] \n" - "RSB r3,r3,r3,LSL#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; - Word32 L_diff; - - L_diff = (Word32) var1 - var2; - var_out = saturate(L_diff); - - return (var_out); -#endif -} -#endif - -/* Short division, 18 */ -#if (DIV_S_IS_INLINE) -__inline Word16 div_s (Word16 var1, Word16 var2) -{ - Word16 var_out = 0; - Word16 iteration; - Word32 L_num; - Word32 L_denom; - - var_out = MAX_16; - if (var1!= var2)//var1!= 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; - var_out++; - } - } - } - return (var_out); -} -#endif - -/* Short mult, 1 */ -#if (MULT_IS_INLINE) -__inline Word16 mult (Word16 var1, Word16 var2) -{ -#if ARMV5TE_MULT - Word32 result; - asm volatile( - "SMULBB r2, %[var1], %[var2] \n" - "MOV r3, #1\n" - "MOV %[result], r2, ASR #15\n" - "RSB r3, r3, r3, LSL #15\n" - "MOV r2, %[result], ASR #15\n" - "TEQ r2, %[result], 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; - Word32 L_product; - - L_product = (Word32) var1 *(Word32) var2; - L_product = (L_product & (Word32) 0xffff8000L) >> 15; - if (L_product & (Word32) 0x00010000L) - L_product = L_product | (Word32) 0xffff0000L; - var_out = saturate(L_product); - - return (var_out); -#endif -} -#endif - - -/* Short norm, 15 */ -#if (NORM_S_IS_INLINE) -__inline Word16 norm_s (Word16 var1) -{ -#if ARMV5TE_NORM_S - Word16 result; - asm volatile( - "MOV r2,%[var1] \n" - "CMP r2, #0\n" - "RSBLT %[var1], %[var1], #0 \n" - "CLZNE %[result], %[var1]\n" - "SUBNE %[result], %[result], #17\n" - "MOVEQ %[result], #0\n" - "CMP r2, #-1\n" - "MOVEQ %[result], #15\n" - :[result]"+r"(result) - :[var1]"r"(var1) - :"r2" - ); - return result; -#else - Word16 var_out; - - if (var1 == 0) - { - var_out = 0; - } - else - { - if (var1 == -1) - { - var_out = 15; - } - else - { - if (var1 < 0) - { - var1 = (Word16)~var1; - } - for (var_out = 0; var1 < 0x4000; var_out++) - { - var1 <<= 1; - } - } - } - return (var_out); -#endif -} -#endif - -/* Long norm, 30 */ -#if (NORM_L_IS_INLINE) -__inline Word16 norm_l (Word32 L_var1) -{ -#if ARMV5TE_NORM_L - Word16 result; - asm volatile( - "CMP %[L_var1], #0\n" - "CLZNE %[result], %[L_var1]\n" - "SUBNE %[result], %[result], #1\n" - "MOVEQ %[result], #0\n" - :[result]"+r"(result) - :[L_var1]"r"(L_var1) - ); - return result; -#else - //Word16 var_out; - - //if (L_var1 == 0) - //{ - // var_out = 0; - //} - //else - //{ - // if (L_var1 == (Word32) 0xffffffffL) - // { - // var_out = 31; - // } - // else - // { - // if (L_var1 < 0) - // { - // L_var1 = ~L_var1; - // } - // for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++) - // { - // L_var1 <<= 1; - // } - // } - //} - //return (var_out); - Word16 a16; - Word16 r = 0 ; - - - if ( L_var1 < 0 ) { - 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 { - - 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; - } - } - } - } - } - 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; - } - } - } - } - 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; - } - } - } - } - } - - return r ; -#endif -} -#endif - -/* Round, 1 */ -#if (ROUND_IS_INLINE) -__inline Word16 round16(Word32 L_var1) -{ -#if ARMV5TE_ROUND - Word16 result; - asm volatile( - "MOV r1,#0x00008000\n" - "QADD %[result], %[L_var1], r1\n" - "MOV %[result], %[result], ASR #16 \n" - :[result]"+r"(result) - :[L_var1]"r"(L_var1) - :"r1" - ); - return result; -#else - Word16 var_out; - Word32 L_rounded; - - L_rounded = L_add (L_var1, (Word32) 0x00008000L); - var_out = extract_h (L_rounded); - return (var_out); -#endif -} -#endif - -/* Mac, 1 */ -#if (L_MAC_IS_INLINE) -__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2) -{ -#if ARMV5TE_L_MAC - 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; - Word32 L_product; - - L_product = L_mult(var1, var2); - L_var_out = L_add (L_var3, L_product); - return (L_var_out); -#endif -} -#endif - -#if (L_ADD_IS_INLINE) -__inline Word32 L_add (Word32 L_var1, Word32 L_var2) -{ -#if ARMV5TE_L_ADD - 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; - - L_var_out = L_var1 + L_var2; - if (((L_var1 ^ L_var2) & MIN_32) == 0) - { - if ((L_var_out ^ L_var1) & MIN_32) - { - L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32; - } - } - return (L_var_out); -#endif -} -#endif - - - -#if (MULT_R_IS_INLINE) -__inline Word16 mult_r (Word16 var1, Word16 var2) -{ - Word16 var_out; - Word32 L_product_arr; - - L_product_arr = (Word32)var1 *(Word32)var2; /* product */ - L_product_arr += (Word32)0x00004000L; /* round */ - L_product_arr >>= 15; /* shift */ - - var_out = saturate(L_product_arr); - - return (var_out); -} -#endif - -#if (SHR_R_IS_INLINE) -__inline Word16 shr_r (Word16 var1, Word16 var2) -{ - Word16 var_out; - - if (var2 > 15) - { - var_out = 0; - } - else - { - var_out = shr(var1, var2); - - if (var2 > 0) - { - if ((var1 & ((Word16) 1 << (var2 - 1))) != 0) - { - var_out++; - } - } - } - - return (var_out); -} -#endif - -#if (MAC_R_IS_INLINE) -__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2) -{ - Word16 var_out; - - L_var3 = L_mac (L_var3, var1, var2); - var_out = (Word16)((L_var3 + 0x8000L) >> 16); - - return (var_out); -} -#endif - -#if (MSU_R_IS_INLINE) -__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2) -{ - Word16 var_out; - - L_var3 = L_msu (L_var3, var1, var2); - var_out = (Word16)((L_var3 + 0x8000L) >> 16); - - return (var_out); -} -#endif - -#if (L_SHR_R_IS_INLINE) -__inline Word32 L_shr_r (Word32 L_var1, Word16 var2) -{ - Word32 L_var_out; - - if (var2 > 31) - { - L_var_out = 0; - } - else - { - L_var_out = L_shr(L_var1, var2); - - if (var2 > 0) - { - if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0) - { - L_var_out++; - } - } - } - - return (L_var_out); -} -#endif - -#if (EXTRACT_H_IS_INLINE) -__inline Word16 extract_h (Word32 L_var1) -{ - Word16 var_out; - - var_out = (Word16) (L_var1 >> 16); - - return (var_out); -} -#endif - -#if (EXTRACT_L_IS_INLINE) -__inline Word16 extract_l(Word32 L_var1) -{ - return (Word16) L_var1; -} -#endif - +#define ABS(a) ((a) >= 0) ? (a) : (-(a)) + +/* Short abs, 1 */ +#define abs_s(x) ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16)) + +/* 16 bit var1 -> MSB, 2 */ +#define L_deposit_h(x) (((Word32)(x)) << 16) + + +/* 16 bit var1 -> LSB, 2 */ +#define L_deposit_l(x) ((Word32)(x)) + + +/* Long abs, 3 */ +#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32) + + +/* Short negate, 1 */ +#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1)))) + + +/* Long negate, 2 */ +#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1))) + + +#define MULHIGH(A,B) (int)(((Word64)(A)*(Word64)(B)) >> 32) +#define fixmul(a, b) (int)((((Word64)(a)*(Word64)(b)) >> 32) << 1) + + +#if (SATRUATE_IS_INLINE) +__inline Word16 saturate(Word32 L_var1); +#else +Word16 saturate(Word32 L_var1); +#endif + +/* Short shift left, 1 */ +#if (SHL_IS_INLINE) +__inline Word16 shl (Word16 var1, Word16 var2); +#else +Word16 shl (Word16 var1, Word16 var2); +#endif + +/* Short shift right, 1 */ +#if (SHR_IS_INLINE) +__inline Word16 shr (Word16 var1, Word16 var2); +#else +Word16 shr (Word16 var1, Word16 var2); +#endif + +#if (L_MULT_IS_INLINE) +__inline Word32 L_mult(Word16 var1, Word16 var2); +#else +Word32 L_mult(Word16 var1, Word16 var2); +#endif + +/* Msu, 1 */ +#if (L_MSU_IS_INLINE) +__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); +#else +Word32 L_sub(Word32 L_var1, Word32 L_var2); +#endif + +/* Long shift left, 2 */ +#if (L_SHL_IS_INLINE) +__inline Word32 L_shl (Word32 L_var1, Word16 var2); +#else +Word32 L_shl (Word32 L_var1, Word16 var2); +#endif + +/* Long shift right, 2*/ +#if (L_SHR_IS_INLINE) +__inline Word32 L_shr (Word32 L_var1, Word16 var2); +#else +Word32 L_shr (Word32 L_var1, Word16 var2); +#endif + +/* Short add, 1 */ +#if (ADD_IS_INLINE) +__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); +#else +Word16 sub(Word16 var1, Word16 var2); +#endif + +/* Short division, 18 */ +#if (DIV_S_IS_INLINE) +__inline Word16 div_s (Word16 var1, Word16 var2); +#else +Word16 div_s (Word16 var1, Word16 var2); +#endif + +/* Short mult, 1 */ +#if (MULT_IS_INLINE) +__inline Word16 mult (Word16 var1, Word16 var2); +#else +Word16 mult (Word16 var1, Word16 var2); +#endif + +/* Short norm, 15 */ +#if (NORM_S_IS_INLINE) +__inline Word16 norm_s (Word16 var1); +#else +Word16 norm_s (Word16 var1); +#endif + +/* Long norm, 30 */ +#if (NORM_L_IS_INLINE) +__inline Word16 norm_l (Word32 L_var1); +#else +Word16 norm_l (Word32 L_var1); +#endif + +/* Round, 1 */ +#if (ROUND_IS_INLINE) +__inline Word16 round16(Word32 L_var1); +#else +Word16 round16(Word32 L_var1); +#endif + +/* Mac, 1 */ +#if (L_MAC_IS_INLINE) +__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2); +#else +Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2); +#endif + +#if (L_ADD_IS_INLINE) +__inline Word32 L_add (Word32 L_var1, Word32 L_var2); +#else +Word32 L_add (Word32 L_var1, Word32 L_var2); +#endif + +/* Extract high, 1 */ +#if (EXTRACT_H_IS_INLINE) +__inline Word16 extract_h (Word32 L_var1); +#else +Word16 extract_h (Word32 L_var1); +#endif + +/* Extract low, 1 */ +#if (EXTRACT_L_IS_INLINE) +__inline Word16 extract_l(Word32 L_var1); +#else +Word16 extract_l(Word32 L_var1); +#endif + +/* Mult with round, 2 */ +#if (MULT_R_IS_INLINE) +__inline Word16 mult_r(Word16 var1, Word16 var2); +#else +Word16 mult_r(Word16 var1, Word16 var2); +#endif + +/* Shift right with round, 2 */ +#if (SHR_R_IS_INLINE) +__inline Word16 shr_r (Word16 var1, Word16 var2); +#else +Word16 shr_r (Word16 var1, Word16 var2); +#endif + +/* Mac with rounding,2 */ +#if (MAC_R_IS_INLINE) +__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2); +#else +Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2); +#endif + +/* Msu with rounding,2 */ +#if (MSU_R_IS_INLINE) +__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2); +#else +Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2); +#endif + +/* Long shift right with round, 3 */ +#if (L_SHR_R_IS_INLINE) +__inline Word32 L_shr_r (Word32 L_var1, Word16 var2); +#else +Word32 L_shr_r (Word32 L_var1, Word16 var2); +#endif + +#if ARMV4_INASM +__inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2) +{ + Word32 result; + asm volatile( + "MOV %[result], %[L_var1], ASR %[var2] \n" + :[result]"=r"(result) + :[L_var1]"r"(L_var1), [var2]"r"(var2) + ); + return result; +} + +__inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2) +{ + Word32 result; + asm volatile( + "MOV r2, %[L_var1] \n" + "MOV r3, #0x7fffffff\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; +} + +__inline Word32 ASM_shr(Word32 L_var1, Word16 var2) +{ + 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; +} + +__inline Word32 ASM_shl(Word32 L_var1, Word16 var2) +{ + Word32 result; + asm volatile( + "CMP %[var2], #16\n" + "MOVGE %[var2], #16\n" + "MOV %[result], %[L_var1], ASL %[var2]\n" + "MOV r3, #1\n" + "MOV r2, %[result], ASR #15\n" + "RSB r3,r3,r3,LSL #15 \n" + "TEQ r2, %[result], ASR #31 \n" + "EORNE %[result], r3, %[result],ASR #31" + :[result]"+r"(result) + :[L_var1]"r"(L_var1), [var2]"r"(var2) + :"r2", "r3" + ); + return result; +} +#endif + +/*___________________________________________________________________________ + | | + | definitions for inline basic arithmetic operators | + |___________________________________________________________________________| +*/ +#if (SATRUATE_IS_INLINE) +__inline Word16 saturate(Word32 L_var1) +{ +#if ARMV5TE_SAT + Word16 result; + asm volatile ( + "MOV %[result], %[L_var1]\n" + "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" + "EORNE %[result],r3,%[L_var1],ASR#31\n" + :[result]"+r"(result) + :[L_var1]"r"(L_var1) + :"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) + { + var_out = MAX_16; + } + else if (L_var1 < (Word32) 0xffff8000L) + { + var_out = MIN_16; + } + else + { + var_out = extract_l(L_var1); + } + + return (var_out); +#endif +} +#endif + +/* Short shift left, 1 */ +#if (SHL_IS_INLINE) +__inline Word16 shl (Word16 var1, Word16 var2) +{ +#if ARMV5TE_SHL + if(var2>=0) + { + return ASM_shl( var1, var2); + } + else + { + return ASM_shr( var1, -var2); + } +#else + Word16 var_out; + Word32 result; + + if (var2 < 0) + { + var_out = shr (var1, (Word16)-var2); + } + else + { + result = (Word32) var1 *((Word32) 1 << var2); + + if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result))) + { + var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16); + } + else + { + var_out = extract_l(result); + } + } + return (var_out); +#endif +} +#endif + +/* Short shift right, 1 */ +#if (SHR_IS_INLINE) +__inline Word16 shr (Word16 var1, Word16 var2) +{ +#if ARMV5TE_SHR + if(var2>=0) + { + return ASM_shr( var1, var2); + } + else + { + return ASM_shl( var1, -var2); + } +#else + Word16 var_out; + + if (var2 < 0) + { + var_out = shl (var1, (Word16)-var2); + } + else + { + if (var2 >= 15) + { + var_out = (Word16)((var1 < 0) ? -1 : 0); + } + else + { + if (var1 < 0) + { + var_out = (Word16)(~((~var1) >> var2)); + } + else + { + var_out = (Word16)(var1 >> var2); + } + } + } + + return (var_out); +#endif +} +#endif + + +#if (L_MULT_IS_INLINE) +__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" + :[result]"+r"(result) + :[var1]"r"(var1), [var2]"r"(var2) + ); + return result; +#else + Word32 L_var_out; + + L_var_out = (Word32) var1 *(Word32) var2; + + if (L_var_out != (Word32) 0x40000000L) + { + L_var_out <<= 1; + } + else + { + L_var_out = MAX_32; + } + return (L_var_out); +#endif +} +#endif + +#if (L_MSU_IS_INLINE) +__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2) +{ +#if ARMV5TE_L_MSU + 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; + Word32 L_product; + + L_product = L_mult(var1, var2); + L_var_out = L_sub(L_var3, L_product); + return (L_var_out); +#endif +} +#endif + +#if (L_SUB_IS_INLINE) +__inline Word32 L_sub(Word32 L_var1, Word32 L_var2) +{ +#if ARMV5TE_L_SUB + 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; + + L_var_out = L_var1 - L_var2; + + if (((L_var1 ^ L_var2) & MIN_32) != 0) + { + if ((L_var_out ^ L_var1) & MIN_32) + { + L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32; + } + } + + return (L_var_out); +#endif +} +#endif + +#if (L_SHL_IS_INLINE) +__inline Word32 L_shl(Word32 L_var1, Word16 var2) +{ +#if ARMV5TE_L_SHL + if(var2>=0) + { + return ASM_L_shl( L_var1, var2); + } + else + { + return ASM_L_shr( L_var1, -var2); + } +#else + Word32 L_var_out = 0L; + + if (var2 <= 0) + { + L_var1 = L_shr(L_var1, (Word16)-var2); + } + else + { + for (; var2 > 0; var2--) + { + if (L_var1 > (Word32) 0X3fffffffL) + { + return MAX_32; + } + else + { + if (L_var1 < (Word32) 0xc0000000L) + { + return MIN_32; + } + } + L_var1 <<= 1; + L_var_out = L_var1; + } + } + return (L_var1); +#endif +} +#endif + +#if (L_SHR_IS_INLINE) +__inline Word32 L_shr (Word32 L_var1, Word16 var2) +{ +#if ARMV5TE_L_SHR + if(var2>=0) + { + return ASM_L_shr( L_var1, var2); + } + else + { + return ASM_L_shl( L_var1, -var2); + } +#else + Word32 L_var_out; + + if (var2 < 0) + { + L_var_out = L_shl (L_var1, (Word16)-var2); + } + else + { + if (var2 >= 31) + { + L_var_out = (L_var1 < 0L) ? -1 : 0; + } + else + { + if (L_var1 < 0) + { + L_var_out = ~((~L_var1) >> var2); + } + else + { + L_var_out = L_var1 >> var2; + } + } + } + return (L_var_out); +#endif +} +#endif + +/* Short add, 1 */ +#if (ADD_IS_INLINE) +__inline Word16 add (Word16 var1, Word16 var2) +{ +#if ARMV5TE_ADD + 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" + "TEQ r2, %[result], ASR #31\n" + "EORNE %[result], r3, %[result], ASR #31" + :[result]"+r"(result) + :[var1]"r"(var1), [var2]"r"(var2) + :"r2", "r3" + ); + return result; +#else + Word16 var_out; + Word32 L_sum; + + L_sum = (Word32) var1 + var2; + var_out = saturate(L_sum); + + return (var_out); +#endif +} +#endif + +/* Short sub, 1 */ +#if (SUB_IS_INLINE) +__inline Word16 sub(Word16 var1, Word16 var2) +{ +#if ARMV5TE_SUB + Word32 result; + asm volatile( + "MOV r3, #1\n" + "SUB %[result], %[var1], %[var2] \n" + "RSB r3,r3,r3,LSL#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; + Word32 L_diff; + + L_diff = (Word32) var1 - var2; + var_out = saturate(L_diff); + + return (var_out); +#endif +} +#endif + +/* Short division, 18 */ +#if (DIV_S_IS_INLINE) +__inline Word16 div_s (Word16 var1, Word16 var2) +{ + Word16 var_out = 0; + Word16 iteration; + Word32 L_num; + Word32 L_denom; + + var_out = MAX_16; + if (var1!= var2)//var1!= 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; + var_out++; + } + } + } + return (var_out); +} +#endif + +/* Short mult, 1 */ +#if (MULT_IS_INLINE) +__inline Word16 mult (Word16 var1, Word16 var2) +{ +#if ARMV5TE_MULT + Word32 result; + asm volatile( + "SMULBB r2, %[var1], %[var2] \n" + "MOV r3, #1\n" + "MOV %[result], r2, ASR #15\n" + "RSB r3, r3, r3, LSL #15\n" + "MOV r2, %[result], ASR #15\n" + "TEQ r2, %[result], 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; + Word32 L_product; + + L_product = (Word32) var1 *(Word32) var2; + L_product = (L_product & (Word32) 0xffff8000L) >> 15; + if (L_product & (Word32) 0x00010000L) + L_product = L_product | (Word32) 0xffff0000L; + var_out = saturate(L_product); + + return (var_out); +#endif +} +#endif + + +/* Short norm, 15 */ +#if (NORM_S_IS_INLINE) +__inline Word16 norm_s (Word16 var1) +{ +#if ARMV5TE_NORM_S + Word16 result; + asm volatile( + "MOV r2,%[var1] \n" + "CMP r2, #0\n" + "RSBLT %[var1], %[var1], #0 \n" + "CLZNE %[result], %[var1]\n" + "SUBNE %[result], %[result], #17\n" + "MOVEQ %[result], #0\n" + "CMP r2, #-1\n" + "MOVEQ %[result], #15\n" + :[result]"+r"(result) + :[var1]"r"(var1) + :"r2" + ); + return result; +#else + Word16 var_out; + + if (var1 == 0) + { + var_out = 0; + } + else + { + if (var1 == -1) + { + var_out = 15; + } + else + { + if (var1 < 0) + { + var1 = (Word16)~var1; + } + for (var_out = 0; var1 < 0x4000; var_out++) + { + var1 <<= 1; + } + } + } + return (var_out); +#endif +} +#endif + +/* Long norm, 30 */ +#if (NORM_L_IS_INLINE) +__inline Word16 norm_l (Word32 L_var1) +{ +#if ARMV5TE_NORM_L + Word16 result; + asm volatile( + "CMP %[L_var1], #0\n" + "CLZNE %[result], %[L_var1]\n" + "SUBNE %[result], %[result], #1\n" + "MOVEQ %[result], #0\n" + :[result]"+r"(result) + :[L_var1]"r"(L_var1) + ); + return result; +#else + //Word16 var_out; + + //if (L_var1 == 0) + //{ + // var_out = 0; + //} + //else + //{ + // if (L_var1 == (Word32) 0xffffffffL) + // { + // var_out = 31; + // } + // else + // { + // if (L_var1 < 0) + // { + // L_var1 = ~L_var1; + // } + // for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++) + // { + // L_var1 <<= 1; + // } + // } + //} + //return (var_out); + Word16 a16; + Word16 r = 0 ; + + + if ( L_var1 < 0 ) { + 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 { + + 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; + } + } + } + } + } + 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; + } + } + } + } + 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; + } + } + } + } + } + + return r ; +#endif +} +#endif + +/* Round, 1 */ +#if (ROUND_IS_INLINE) +__inline Word16 round16(Word32 L_var1) +{ +#if ARMV5TE_ROUND + Word16 result; + asm volatile( + "MOV r1,#0x00008000\n" + "QADD %[result], %[L_var1], r1\n" + "MOV %[result], %[result], ASR #16 \n" + :[result]"+r"(result) + :[L_var1]"r"(L_var1) + :"r1" + ); + return result; +#else + Word16 var_out; + Word32 L_rounded; + + L_rounded = L_add (L_var1, (Word32) 0x00008000L); + var_out = extract_h (L_rounded); + return (var_out); +#endif +} +#endif + +/* Mac, 1 */ +#if (L_MAC_IS_INLINE) +__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2) +{ +#if ARMV5TE_L_MAC + 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; + Word32 L_product; + + L_product = L_mult(var1, var2); + L_var_out = L_add (L_var3, L_product); + return (L_var_out); +#endif +} +#endif + +#if (L_ADD_IS_INLINE) +__inline Word32 L_add (Word32 L_var1, Word32 L_var2) +{ +#if ARMV5TE_L_ADD + 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; + + L_var_out = L_var1 + L_var2; + if (((L_var1 ^ L_var2) & MIN_32) == 0) + { + if ((L_var_out ^ L_var1) & MIN_32) + { + L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32; + } + } + return (L_var_out); +#endif +} +#endif + + + +#if (MULT_R_IS_INLINE) +__inline Word16 mult_r (Word16 var1, Word16 var2) +{ + Word16 var_out; + Word32 L_product_arr; + + L_product_arr = (Word32)var1 *(Word32)var2; /* product */ + L_product_arr += (Word32)0x00004000L; /* round */ + L_product_arr >>= 15; /* shift */ + + var_out = saturate(L_product_arr); + + return (var_out); +} +#endif + +#if (SHR_R_IS_INLINE) +__inline Word16 shr_r (Word16 var1, Word16 var2) +{ + Word16 var_out; + + if (var2 > 15) + { + var_out = 0; + } + else + { + var_out = shr(var1, var2); + + if (var2 > 0) + { + if ((var1 & ((Word16) 1 << (var2 - 1))) != 0) + { + var_out++; + } + } + } + + return (var_out); +} +#endif + +#if (MAC_R_IS_INLINE) +__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2) +{ + Word16 var_out; + + L_var3 = L_mac (L_var3, var1, var2); + var_out = (Word16)((L_var3 + 0x8000L) >> 16); + + return (var_out); +} +#endif + +#if (MSU_R_IS_INLINE) +__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2) +{ + Word16 var_out; + + L_var3 = L_msu (L_var3, var1, var2); + var_out = (Word16)((L_var3 + 0x8000L) >> 16); + + return (var_out); +} +#endif + +#if (L_SHR_R_IS_INLINE) +__inline Word32 L_shr_r (Word32 L_var1, Word16 var2) +{ + Word32 L_var_out; + + if (var2 > 31) + { + L_var_out = 0; + } + else + { + L_var_out = L_shr(L_var1, var2); + + if (var2 > 0) + { + if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0) + { + L_var_out++; + } + } + } + + return (L_var_out); +} +#endif + +#if (EXTRACT_H_IS_INLINE) +__inline Word16 extract_h (Word32 L_var1) +{ + Word16 var_out; + + var_out = (Word16) (L_var1 >> 16); + + return (var_out); +} +#endif + +#if (EXTRACT_L_IS_INLINE) +__inline Word16 extract_l(Word32 L_var1) +{ + return (Word16) L_var1; +} +#endif + #endif diff --git a/media/libstagefright/codecs/aacenc/basic_op/basicop2.c b/media/libstagefright/codecs/aacenc/basic_op/basicop2.c index a0d5dba..82d3f38 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/basicop2.c +++ b/media/libstagefright/codecs/aacenc/basic_op/basicop2.c @@ -1,1624 +1,1624 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: basicop2.c - - Content: Basic arithmetic operators. - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: basicop2.c + + Content: Basic arithmetic operators. + *******************************************************************************/ #include "typedef.h" -#include "basic_op.h" - - -/*___________________________________________________________________________ - | | - | Functions | - |___________________________________________________________________________| -*/ - -/*___________________________________________________________________________ - | | - | Function Name : saturate | - | | - | Purpose : | - | | - | Limit the 32 bit input to the range of a 16 bit word. | - | | - | Inputs : | - | | - | L_var1 | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ - -#if (!SATRUATE_IS_INLINE) -Word16 saturate(Word32 L_var1) -{ - Word16 var_out; - - if (L_var1 > 0X00007fffL) - { - var_out = MAX_16; - } - else if (L_var1 < (Word32) 0xffff8000L) - { - var_out = MIN_16; - } - else - { - var_out = extract_l(L_var1); - } - - return (var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : add | - | | - | Purpose : | - | | - | Performs the addition (var1+var2) with overflow control and saturation;| - | the 16 bit result is set at +32767 when overflow occurs or at -32768 | - | when underflow occurs. | - | | - | Complexity weight : 1 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ - -#if (!ADD_IS_INLINE) -Word16 add (Word16 var1, Word16 var2) -{ - Word16 var_out; - Word32 L_sum; - - L_sum = (Word32)var1 + (Word32)var2; - var_out = saturate(L_sum); - - return (var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : sub | - | | - | Purpose : | - | | - | Performs the subtraction (var1+var2) with overflow control and satu- | - | ration; the 16 bit result is set at +32767 when overflow occurs or at | - | -32768 when underflow occurs. | - | | - | Complexity weight : 1 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ -#if (!SUB_IS_INLINE) -Word16 sub(Word16 var1, Word16 var2) -{ - Word16 var_out; - Word32 L_diff; - - L_diff = (Word32) var1 - var2; - var_out = saturate(L_diff); - - return (var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : abs_s | - | | - | Purpose : | - | | - | Absolute value of var1; abs_s(-32768) = 32767. | - | | - | Complexity weight : 1 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0x0000 0000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ -//Word16 abs_s (Word16 var1) -//{ -// Word16 var_out; -// -// if (var1 == MIN_16) -// { -// var_out = MAX_16; -// } -// else -// { -// if (var1 < 0) -// { -// var_out = (Word16)-var1; -// } -// else -// { -// var_out = var1; -// } -// } -// -// return (var_out); -//} - - -/*___________________________________________________________________________ - | | - | Function Name : shl | - | | - | Purpose : | - | | - | Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill| - | the var2 LSB of the result. If var2 is negative, arithmetically shift | - | var1 right by -var2 with sign extension. Saturate the result in case of | - | underflows or overflows. | - | | - | Complexity weight : 1 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ - -#if (!SHL_IS_INLINE) -Word16 shl (Word16 var1, Word16 var2) -{ - Word16 var_out; - Word32 result; - - if (var2 < 0) - { - if (var2 < -16) - var2 = -16; - var_out = shr (var1, (Word16)-var2); - } - else - { - result = (Word32) var1 *((Word32) 1 << var2); - - if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result))) - { - //Overflow = 1; - var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16); - } - else - { - var_out = extract_l(result); - } - } - - return (var_out); -} -#endif -// end - -/*___________________________________________________________________________ - | | - | Function Name : shr | - | | - | Purpose : | - | | - | Arithmetically shift the 16 bit input var1 right var2 positions with | - | sign extension. If var2 is negative, arithmetically shift var1 left by | - | -var2 with sign extension. Saturate the result in case of underflows or | - | overflows. | - | | - | Complexity weight : 1 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ - -#if (!SHR_IS_INLINE) -Word16 shr (Word16 var1, Word16 var2) -{ - Word16 var_out; - - if (var2 < 0) - { - if (var2 < -16) - var2 = -16; - var_out = shl (var1, (Word16)-var2); - } - else - { - if (var2 >= 15) - { - var_out = (Word16)((var1 < 0) ? -1 : 0); - } - else - { - if (var1 < 0) - { - var_out = (Word16)(~((~var1) >> var2)); - } - else - { - var_out = (Word16)(var1 >> var2); - } - } - } - - return (var_out); -} -#endif - - -/*___________________________________________________________________________ - | | - | Function Name : mult | - | | - | Purpose : | - | | - | Performs the multiplication of var1 by var2 and gives a 16 bit result | - | which is scaled i.e.: | - | mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and | - | mult(-32768,-32768) = 32767. | - | | - | Complexity weight : 1 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ -#if (!MULT_IS_INLINE) -Word16 mult (Word16 var1, Word16 var2) -{ - Word16 var_out; - Word32 L_product; - - L_product = (Word32) var1 *(Word32) var2; - - L_product = (L_product & (Word32) 0xffff8000L) >> 15; - - if (L_product & (Word32) 0x00010000L) - L_product = L_product | (Word32) 0xffff0000L; - - var_out = saturate(L_product); - - return (var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : L_mult | - | | - | Purpose : | - | | - | L_mult is the 32 bit result of the multiplication of var1 times var2 | - | with one shift left i.e.: | - | L_mult(var1,var2) = L_shl((var1 times var2),1) and | - | L_mult(-32768,-32768) = 2147483647. | - | | - | Complexity weight : 1 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | L_var_out | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | - |___________________________________________________________________________| -*/ - -#if (!L_MULT_IS_INLINE) -Word32 L_mult(Word16 var1, Word16 var2) -{ - Word32 L_var_out; - - L_var_out = (Word32) var1 *(Word32) var2; - - if (L_var_out != (Word32) 0x40000000L) - { - L_var_out <<= 1; - } - else - { - L_var_out = MAX_32; - } - - return (L_var_out); -} -#endif -// end - -/*___________________________________________________________________________ - | | - | Function Name : negate | - | | - | Purpose : | - | | - | Negate var1 with saturation, saturate in the case where input is -32768:| - | negate(var1) = sub(0,var1). | - | | - | Complexity weight : 1 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ -//Word16 negate (Word16 var1) -//{ -// Word16 var_out; -// -// var_out = (Word16)((var1 == MIN_16) ? MAX_16 : -var1); -// -// return (var_out); -//} - - -/*___________________________________________________________________________ - | | - | Function Name : extract_h | - | | - | Purpose : | - | | - | Return the 16 MSB of L_var1. | - | | - | Complexity weight : 1 | - | | - | Inputs : | - | | - | L_var1 | - | 32 bit long signed integer (Word32 ) whose value falls in the | - | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ -#if (!EXTRACT_H_IS_INLINE) -Word16 extract_h (Word32 L_var1) -{ - Word16 var_out; - - var_out = (Word16) (L_var1 >> 16); - - return (var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : extract_l | - | | - | Purpose : | - | | - | Return the 16 LSB of L_var1. | - | | - | Complexity weight : 1 | - | | - | Inputs : | - | | - | L_var1 | - | 32 bit long signed integer (Word32 ) whose value falls in the | - | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ -#if (!EXTRACT_L_IS_INLINE) -Word16 extract_l(Word32 L_var1) -{ - Word16 var_out; - - var_out = (Word16) L_var1; - - return (var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : round | - | | - | Purpose : | - | | - | Round the lower 16 bits of the 32 bit input number into the MS 16 bits | - | with saturation. Shift the resulting bits right by 16 and return the 16 | - | bit number: | - | round(L_var1) = extract_h(L_add(L_var1,32768)) | - | | - | Complexity weight : 1 | - | | - | Inputs : | - | | - | L_var1 | - | 32 bit long signed integer (Word32 ) whose value falls in the | - | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ - -#if (!ROUND_IS_INLINE) -Word16 round16(Word32 L_var1) -{ - Word16 var_out; - Word32 L_rounded; - - L_rounded = L_add (L_var1, (Word32) 0x00008000L); - var_out = extract_h (L_rounded); - - return (var_out); -} -#endif -// end - -/*___________________________________________________________________________ - | | - | Function Name : L_mac | - | | - | Purpose : | - | | - | Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | - | result to L_var3 with saturation, return a 32 bit result: | - | L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)). | - | | - | Complexity weight : 1 | - | | - | Inputs : | - | | - | L_var3 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | L_var_out | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | - |___________________________________________________________________________| -*/ -#if (!L_MSU_IS_INLINE) -Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2) -{ - Word32 L_var_out; - Word32 L_product; - - L_product = L_mult(var1, var2); - L_var_out = L_add (L_var3, L_product); - - return (L_var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : L_msu | - | | - | Purpose : | - | | - | Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | - | bit result to L_var3 with saturation, return a 32 bit result: | - | L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)). | - | | - | Complexity weight : 1 | - | | - | Inputs : | - | | - | L_var3 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | L_var_out | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | - |___________________________________________________________________________| -*/ - -#if (!L_MSU_IS_INLINE) -Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2) -{ - Word32 L_var_out; - Word32 L_product; - - L_product = L_mult(var1, var2); - L_var_out = L_sub (L_var3, L_product); - - return (L_var_out); -} -#endif - - -/*___________________________________________________________________________ - | | - | Function Name : L_add | - | | - | Purpose : | - | | - | 32 bits addition of the two 32 bits variables (L_var1+L_var2) with | - | overflow control and saturation; the result is set at +2147483647 when | - | overflow occurs or at -2147483648 when underflow occurs. | - | | - | Complexity weight : 2 | - | | - | Inputs : | - | | - | L_var1 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | - | | - | L_var2 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | L_var_out | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | - |___________________________________________________________________________| -*/ -#if (!L_ADD_IS_INLINE) -Word32 L_add (Word32 L_var1, Word32 L_var2) -{ - Word32 L_var_out; - - L_var_out = L_var1 + L_var2; - - if (((L_var1 ^ L_var2) & MIN_32) == 0) - { - if ((L_var_out ^ L_var1) & MIN_32) - { - L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32; - //Overflow = 1; - } - } - - return (L_var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : L_sub | - | | - | Purpose : | - | | - | 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with | - | overflow control and saturation; the result is set at +2147483647 when | - | overflow occurs or at -2147483648 when underflow occurs. | - | | - | Complexity weight : 2 | - | | - | Inputs : | - | | - | L_var1 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | - | | - | L_var2 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | L_var_out | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | - |___________________________________________________________________________| -*/ -#if (!L_SUB_IS_INLINE) -Word32 L_sub(Word32 L_var1, Word32 L_var2) -{ - Word32 L_var_out; - - L_var_out = L_var1 - L_var2; - - if (((L_var1 ^ L_var2) & MIN_32) != 0) - { - if ((L_var_out ^ L_var1) & MIN_32) - { - L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32; - //Overflow = 1; - } - } - - return (L_var_out); -} -#endif - - -/*___________________________________________________________________________ - | | - | Function Name : L_negate | - | | - | Purpose : | - | | - | Negate the 32 bit variable L_var1 with saturation; saturate in the case | - | where input is -2147483648 (0x8000 0000). | - | | - | Complexity weight : 2 | - | | - | Inputs : | - | | - | L_var1 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | L_var_out | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | - |___________________________________________________________________________| -*/ -//Word32 L_negate (Word32 L_var1) -//{ -// Word32 L_var_out; -// -// L_var_out = (L_var1 == MIN_32) ? MAX_32 : -L_var1; -// -// return (L_var_out); -//} - - -/*___________________________________________________________________________ - | | - | Function Name : mult_r | - | | - | Purpose : | - | | - | Same as mult with rounding, i.e.: | - | mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and | - | mult_r(-32768,-32768) = 32767. | - | | - | Complexity weight : 2 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ -#if (!MULT_R_IS_INLINE) -Word16 mult_r (Word16 var1, Word16 var2) -{ - Word16 var_out; - Word32 L_product_arr; - - L_product_arr = (Word32) var1 *(Word32) var2; /* product */ - L_product_arr += (Word32) 0x00004000L; /* round */ - L_product_arr &= (Word32) 0xffff8000L; - L_product_arr >>= 15; /* shift */ - - if (L_product_arr & (Word32) 0x00010000L) /* sign extend when necessary */ - { - L_product_arr |= (Word32) 0xffff0000L; - } - var_out = saturate(L_product_arr); - - return (var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : L_shl | - | | - | Purpose : | - | | - | Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero | - | fill the var2 LSB of the result. If var2 is negative, arithmetically | - | shift L_var1 right by -var2 with sign extension. Saturate the result in | - | case of underflows or overflows. | - | | - | Complexity weight : 2 | - | | - | Inputs : | - | | - | L_var1 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | L_var_out | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | - |___________________________________________________________________________| -*/ - -#if (!L_SHL_IS_INLINE) -Word32 L_shl (Word32 L_var1, Word16 var2) -{ - Word32 L_var_out = 0L; - - if (var2 <= 0) - { - L_var1 = L_shr(L_var1, (Word16)-var2); - } - else - { - for (; var2 > 0; var2--) - { - if (L_var1 > (Word32) 0X3fffffffL) - { - return MAX_32; - } - else - { - if (L_var1 < (Word32) 0xc0000000L) - { - return MIN_32; - } - } - L_var1 <<= 1; - } - } - return (L_var1); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : L_shr | - | | - | Purpose : | - | | - | Arithmetically shift the 32 bit input L_var1 right var2 positions with | - | sign extension. If var2 is negative, arithmetically shift L_var1 left | - | by -var2 and zero fill the -var2 LSB of the result. Saturate the result | - | in case of underflows or overflows. | - | | - | Complexity weight : 2 | - | | - | Inputs : | - | | - | L_var1 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | L_var_out | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | - |___________________________________________________________________________| -*/ - -#if (!L_SHR_IS_INLINE) -Word32 L_shr (Word32 L_var1, Word16 var2) -{ - Word32 L_var_out; - - if (var2 < 0) - { - L_var_out = L_shl (L_var1, (Word16)-var2); - } - else - { - if (var2 >= 31) - { - L_var_out = (L_var1 < 0L) ? -1 : 0; - } - else - { - if (L_var1 < 0) - { - L_var_out = ~((~L_var1) >> var2); - } - else - { - L_var_out = L_var1 >> var2; - } - } - } - return (L_var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : shr_r | - | | - | Purpose : | - | | - | Same as shr(var1,var2) but with rounding. Saturate the result in case of| - | underflows or overflows : | - | - If var2 is greater than zero : | - | if (sub(shl(shr(var1,var2),1),shr(var1,sub(var2,1)))) | - | is equal to zero | - | then | - | shr_r(var1,var2) = shr(var1,var2) | - | else | - | shr_r(var1,var2) = add(shr(var1,var2),1) | - | - If var2 is less than or equal to zero : | - | shr_r(var1,var2) = shr(var1,var2). | - | | - | Complexity weight : 2 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ -#if (!SHR_R_IS_INLINE) -Word16 shr_r (Word16 var1, Word16 var2) -{ - Word16 var_out; - - if (var2 > 15) - { - var_out = 0; - } - else - { - var_out = shr (var1, var2); - - if (var2 > 0) - { - if ((var1 & ((Word16) 1 << (var2 - 1))) != 0) - { - var_out++; - } - } - } - - return (var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : mac_r | - | | - | Purpose : | - | | - | Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | - | result to L_var3 with saturation. Round the LS 16 bits of the result | - | into the MS 16 bits with saturation and shift the result right by 16. | - | Return a 16 bit result. | - | mac_r(L_var3,var1,var2) = round(L_mac(L_var3,var1,var2)) | - | | - | Complexity weight : 2 | - | | - | Inputs : | - | | - | L_var3 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ -#if (!MAC_R_IS_INLINE) -Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2) -{ - Word16 var_out; - - L_var3 = L_mac (L_var3, var1, var2); - L_var3 = L_add (L_var3, (Word32) 0x00008000L); - var_out = extract_h (L_var3); - - return (var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : msu_r | - | | - | Purpose : | - | | - | Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | - | bit result to L_var3 with saturation. Round the LS 16 bits of the res- | - | ult into the MS 16 bits with saturation and shift the result right by | - | 16. Return a 16 bit result. | - | msu_r(L_var3,var1,var2) = round(L_msu(L_var3,var1,var2)) | - | | - | Complexity weight : 2 | - | | - | Inputs : | - | | - | L_var3 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ -#if (!MSU_R_IS_INLINE) -Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2) -{ - Word16 var_out; - - L_var3 = L_msu (L_var3, var1, var2); - L_var3 = L_add (L_var3, (Word32) 0x00008000L); - var_out = extract_h (L_var3); - - return (var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : L_deposit_h | - | | - | Purpose : | - | | - | Deposit the 16 bit var1 into the 16 MS bits of the 32 bit output. The | - | 16 LS bits of the output are zeroed. | - | | - | Complexity weight : 2 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | L_var_out | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= var_out <= 0x7fff 0000. | - |___________________________________________________________________________| -*/ -//Word32 L_deposit_h (Word16 var1) -//{ -// Word32 L_var_out; -// -// L_var_out = (Word32) var1 << 16; -// -// return (L_var_out); -//} - - -/*___________________________________________________________________________ - | | - | Function Name : L_deposit_l | - | | - | Purpose : | - | | - | Deposit the 16 bit var1 into the 16 LS bits of the 32 bit output. The | - | 16 MS bits of the output are sign extended. | - | | - | Complexity weight : 2 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | L_var_out | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0xFFFF 8000 <= var_out <= 0x0000 7fff. | - |___________________________________________________________________________| -*/ -//Word32 L_deposit_l (Word16 var1) -//{ -// Word32 L_var_out; -// -// L_var_out = (Word32) var1; -// -// return (L_var_out); -//} - - -/*___________________________________________________________________________ - | | - | Function Name : L_shr_r | - | | - | Purpose : | - | | - | Same as L_shr(L_var1,var2) but with rounding. Saturate the result in | - | case of underflows or overflows : | - | - If var2 is greater than zero : | - | if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))| - | is equal to zero | - | then | - | L_shr_r(L_var1,var2) = L_shr(L_var1,var2) | - | else | - | L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1) | - | - If var2 is less than or equal to zero : | - | L_shr_r(L_var1,var2) = L_shr(L_var1,var2). | - | | - | Complexity weight : 3 | - | | - | Inputs : | - | | - | L_var1 | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | L_var_out | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= var_out <= 0x7fff ffff. | - |___________________________________________________________________________| -*/ -#if (!L_SHR_R_IS_INLINE) -Word32 L_shr_r (Word32 L_var1, Word16 var2) -{ - Word32 L_var_out; - - if (var2 > 31) - { - L_var_out = 0; - } - else - { - L_var_out = L_shr (L_var1, var2); - - if (var2 > 0) - { - if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0) - { - L_var_out++; - } - } - } - - return (L_var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : L_abs | - | | - | Purpose : | - | | - | Absolute value of L_var1; Saturate in case where the input is | - | -214783648 | - | | - | Complexity weight : 3 | - | | - | Inputs : | - | | - | L_var1 | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | L_var_out | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x0000 0000 <= var_out <= 0x7fff ffff. | - |___________________________________________________________________________| -*/ -//Word32 L_abs (Word32 L_var1) -//{ -// Word32 L_var_out; -// -// if (L_var1 == MIN_32) -// { -// L_var_out = MAX_32; -// } -// else -// { -// if (L_var1 < 0) -// { -// L_var_out = -L_var1; -// } -// else -// { -// L_var_out = L_var1; -// } -// } -// -// return (L_var_out); -//} - -/*___________________________________________________________________________ - | | - | Function Name : norm_s | - | | - | Purpose : | - | | - | Produces the number of left shift needed to normalize the 16 bit varia- | - | ble var1 for positive values on the interval with minimum of 16384 and | - | maximum of 32767, and for negative values on the interval with minimum | - | of -32768 and maximum of -16384; in order to normalize the result, the | - | following operation must be done : | - | norm_var1 = shl(var1,norm_s(var1)). | - | | - | Complexity weight : 15 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0x0000 0000 <= var_out <= 0x0000 000f. | - |___________________________________________________________________________| -*/ - -#if (!NORM_S_IS_INLINE) -Word16 norm_s (Word16 var1) -{ - Word16 var_out; - - if (var1 == 0) - { - var_out = 0; - } - else - { - if (var1 == -1) - { - var_out = 15; - } - else - { - if (var1 < 0) - { - var1 = (Word16)~var1; - } - for (var_out = 0; var1 < 0x4000; var_out++) - { - var1 <<= 1; - } - } - } - - return (var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : div_s | - | | - | Purpose : | - | | - | Produces a result which is the fractional integer division of var1 by | - | var2; var1 and var2 must be positive and var2 must be greater or equal | - | to var1; the result is positive (leading bit equal to 0) and truncated | - | to 16 bits. | - | If var1 = var2 then div(var1,var2) = 32767. | - | | - | Complexity weight : 18 | - | | - | Inputs : | - | | - | var1 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0x0000 0000 <= var1 <= var2 and var2 != 0. | - | | - | var2 | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : var1 <= var2 <= 0x0000 7fff and var2 != 0. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0x0000 0000 <= var_out <= 0x0000 7fff. | - | It's a Q15 value (point between b15 and b14). | - |___________________________________________________________________________| -*/ - -#if (!DIV_S_IS_INLINE) -Word16 div_s (Word16 var1, Word16 var2) -{ - Word16 var_out = 0; - Word16 iteration; - Word32 L_num; - Word32 L_denom; - - if (var1 == 0) - { - var_out = 0; - } - else - { - if (var1 == var2) - { - var_out = MAX_16; - } - else - { - L_num = L_deposit_l (var1); - L_denom = L_deposit_l (var2); - - for (iteration = 0; iteration < 15; iteration++) - { - var_out <<= 1; - L_num <<= 1; - - if (L_num >= L_denom) - { - L_num = L_sub(L_num, L_denom); - var_out = add (var_out, 1); - } - } - } - } - - return (var_out); -} -#endif - -/*___________________________________________________________________________ - | | - | Function Name : norm_l | - | | - | Purpose : | - | | - | Produces the number of left shifts needed to normalize the 32 bit varia-| - | ble L_var1 for positive values on the interval with minimum of | - | 1073741824 and maximum of 2147483647, and for negative values on the in-| - | terval with minimum of -2147483648 and maximum of -1073741824; in order | - | to normalize the result, the following operation must be done : | - | norm_L_var1 = L_shl(L_var1,norm_l(L_var1)). | - | | - | Complexity weight : 30 | - | | - | Inputs : | - | | - | L_var1 | - | 32 bit long signed integer (Word32) whose value falls in the | - | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | - | | - | Outputs : | - | | - | none | - | | - | Return Value : | - | | - | var_out | - | 16 bit short signed integer (Word16) whose value falls in the | - | range : 0x0000 0000 <= var_out <= 0x0000 001f. | - |___________________________________________________________________________| -*/ - -#if (!NORM_L_IS_INLINE) -Word16 norm_l (Word32 L_var1) -{ - Word16 var_out; - - if (L_var1 == 0) - { - var_out = 0; - } - else - { - if (L_var1 == (Word32) 0xffffffffL) - { - var_out = 31; - } - else - { - if (L_var1 < 0) - { - L_var1 = ~L_var1; - } - for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++) - { - L_var1 <<= 1; - } - } - } - - return (var_out); -} -#endif +#include "basic_op.h" + + +/*___________________________________________________________________________ + | | + | Functions | + |___________________________________________________________________________| +*/ + +/*___________________________________________________________________________ + | | + | Function Name : saturate | + | | + | Purpose : | + | | + | Limit the 32 bit input to the range of a 16 bit word. | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ + +#if (!SATRUATE_IS_INLINE) +Word16 saturate(Word32 L_var1) +{ + Word16 var_out; + + if (L_var1 > 0X00007fffL) + { + var_out = MAX_16; + } + else if (L_var1 < (Word32) 0xffff8000L) + { + var_out = MIN_16; + } + else + { + var_out = extract_l(L_var1); + } + + return (var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : add | + | | + | Purpose : | + | | + | Performs the addition (var1+var2) with overflow control and saturation;| + | the 16 bit result is set at +32767 when overflow occurs or at -32768 | + | when underflow occurs. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ + +#if (!ADD_IS_INLINE) +Word16 add (Word16 var1, Word16 var2) +{ + Word16 var_out; + Word32 L_sum; + + L_sum = (Word32)var1 + (Word32)var2; + var_out = saturate(L_sum); + + return (var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : sub | + | | + | Purpose : | + | | + | Performs the subtraction (var1+var2) with overflow control and satu- | + | ration; the 16 bit result is set at +32767 when overflow occurs or at | + | -32768 when underflow occurs. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#if (!SUB_IS_INLINE) +Word16 sub(Word16 var1, Word16 var2) +{ + Word16 var_out; + Word32 L_diff; + + L_diff = (Word32) var1 - var2; + var_out = saturate(L_diff); + + return (var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : abs_s | + | | + | Purpose : | + | | + | Absolute value of var1; abs_s(-32768) = 32767. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 0000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +//Word16 abs_s (Word16 var1) +//{ +// Word16 var_out; +// +// if (var1 == MIN_16) +// { +// var_out = MAX_16; +// } +// else +// { +// if (var1 < 0) +// { +// var_out = (Word16)-var1; +// } +// else +// { +// var_out = var1; +// } +// } +// +// return (var_out); +//} + + +/*___________________________________________________________________________ + | | + | Function Name : shl | + | | + | Purpose : | + | | + | Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill| + | the var2 LSB of the result. If var2 is negative, arithmetically shift | + | var1 right by -var2 with sign extension. Saturate the result in case of | + | underflows or overflows. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ + +#if (!SHL_IS_INLINE) +Word16 shl (Word16 var1, Word16 var2) +{ + Word16 var_out; + Word32 result; + + if (var2 < 0) + { + if (var2 < -16) + var2 = -16; + var_out = shr (var1, (Word16)-var2); + } + else + { + result = (Word32) var1 *((Word32) 1 << var2); + + if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result))) + { + //Overflow = 1; + var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16); + } + else + { + var_out = extract_l(result); + } + } + + return (var_out); +} +#endif +// end + +/*___________________________________________________________________________ + | | + | Function Name : shr | + | | + | Purpose : | + | | + | Arithmetically shift the 16 bit input var1 right var2 positions with | + | sign extension. If var2 is negative, arithmetically shift var1 left by | + | -var2 with sign extension. Saturate the result in case of underflows or | + | overflows. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ + +#if (!SHR_IS_INLINE) +Word16 shr (Word16 var1, Word16 var2) +{ + Word16 var_out; + + if (var2 < 0) + { + if (var2 < -16) + var2 = -16; + var_out = shl (var1, (Word16)-var2); + } + else + { + if (var2 >= 15) + { + var_out = (Word16)((var1 < 0) ? -1 : 0); + } + else + { + if (var1 < 0) + { + var_out = (Word16)(~((~var1) >> var2)); + } + else + { + var_out = (Word16)(var1 >> var2); + } + } + } + + return (var_out); +} +#endif + + +/*___________________________________________________________________________ + | | + | Function Name : mult | + | | + | Purpose : | + | | + | Performs the multiplication of var1 by var2 and gives a 16 bit result | + | which is scaled i.e.: | + | mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and | + | mult(-32768,-32768) = 32767. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#if (!MULT_IS_INLINE) +Word16 mult (Word16 var1, Word16 var2) +{ + Word16 var_out; + Word32 L_product; + + L_product = (Word32) var1 *(Word32) var2; + + L_product = (L_product & (Word32) 0xffff8000L) >> 15; + + if (L_product & (Word32) 0x00010000L) + L_product = L_product | (Word32) 0xffff0000L; + + var_out = saturate(L_product); + + return (var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : L_mult | + | | + | Purpose : | + | | + | L_mult is the 32 bit result of the multiplication of var1 times var2 | + | with one shift left i.e.: | + | L_mult(var1,var2) = L_shl((var1 times var2),1) and | + | L_mult(-32768,-32768) = 2147483647. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ + +#if (!L_MULT_IS_INLINE) +Word32 L_mult(Word16 var1, Word16 var2) +{ + Word32 L_var_out; + + L_var_out = (Word32) var1 *(Word32) var2; + + if (L_var_out != (Word32) 0x40000000L) + { + L_var_out <<= 1; + } + else + { + L_var_out = MAX_32; + } + + return (L_var_out); +} +#endif +// end + +/*___________________________________________________________________________ + | | + | Function Name : negate | + | | + | Purpose : | + | | + | Negate var1 with saturation, saturate in the case where input is -32768:| + | negate(var1) = sub(0,var1). | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +//Word16 negate (Word16 var1) +//{ +// Word16 var_out; +// +// var_out = (Word16)((var1 == MIN_16) ? MAX_16 : -var1); +// +// return (var_out); +//} + + +/*___________________________________________________________________________ + | | + | Function Name : extract_h | + | | + | Purpose : | + | | + | Return the 16 MSB of L_var1. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32 ) whose value falls in the | + | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#if (!EXTRACT_H_IS_INLINE) +Word16 extract_h (Word32 L_var1) +{ + Word16 var_out; + + var_out = (Word16) (L_var1 >> 16); + + return (var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : extract_l | + | | + | Purpose : | + | | + | Return the 16 LSB of L_var1. | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32 ) whose value falls in the | + | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#if (!EXTRACT_L_IS_INLINE) +Word16 extract_l(Word32 L_var1) +{ + Word16 var_out; + + var_out = (Word16) L_var1; + + return (var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : round | + | | + | Purpose : | + | | + | Round the lower 16 bits of the 32 bit input number into the MS 16 bits | + | with saturation. Shift the resulting bits right by 16 and return the 16 | + | bit number: | + | round(L_var1) = extract_h(L_add(L_var1,32768)) | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32 ) whose value falls in the | + | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ + +#if (!ROUND_IS_INLINE) +Word16 round16(Word32 L_var1) +{ + Word16 var_out; + Word32 L_rounded; + + L_rounded = L_add (L_var1, (Word32) 0x00008000L); + var_out = extract_h (L_rounded); + + return (var_out); +} +#endif +// end + +/*___________________________________________________________________________ + | | + | Function Name : L_mac | + | | + | Purpose : | + | | + | Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | + | result to L_var3 with saturation, return a 32 bit result: | + | L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)). | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var3 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +#if (!L_MSU_IS_INLINE) +Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2) +{ + Word32 L_var_out; + Word32 L_product; + + L_product = L_mult(var1, var2); + L_var_out = L_add (L_var3, L_product); + + return (L_var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : L_msu | + | | + | Purpose : | + | | + | Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | + | bit result to L_var3 with saturation, return a 32 bit result: | + | L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)). | + | | + | Complexity weight : 1 | + | | + | Inputs : | + | | + | L_var3 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ + +#if (!L_MSU_IS_INLINE) +Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2) +{ + Word32 L_var_out; + Word32 L_product; + + L_product = L_mult(var1, var2); + L_var_out = L_sub (L_var3, L_product); + + return (L_var_out); +} +#endif + + +/*___________________________________________________________________________ + | | + | Function Name : L_add | + | | + | Purpose : | + | | + | 32 bits addition of the two 32 bits variables (L_var1+L_var2) with | + | overflow control and saturation; the result is set at +2147483647 when | + | overflow occurs or at -2147483648 when underflow occurs. | + | | + | Complexity weight : 2 | + | | + | Inputs : | + | | + | L_var1 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | L_var2 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +#if (!L_ADD_IS_INLINE) +Word32 L_add (Word32 L_var1, Word32 L_var2) +{ + Word32 L_var_out; + + L_var_out = L_var1 + L_var2; + + if (((L_var1 ^ L_var2) & MIN_32) == 0) + { + if ((L_var_out ^ L_var1) & MIN_32) + { + L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32; + //Overflow = 1; + } + } + + return (L_var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : L_sub | + | | + | Purpose : | + | | + | 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with | + | overflow control and saturation; the result is set at +2147483647 when | + | overflow occurs or at -2147483648 when underflow occurs. | + | | + | Complexity weight : 2 | + | | + | Inputs : | + | | + | L_var1 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | L_var2 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +#if (!L_SUB_IS_INLINE) +Word32 L_sub(Word32 L_var1, Word32 L_var2) +{ + Word32 L_var_out; + + L_var_out = L_var1 - L_var2; + + if (((L_var1 ^ L_var2) & MIN_32) != 0) + { + if ((L_var_out ^ L_var1) & MIN_32) + { + L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32; + //Overflow = 1; + } + } + + return (L_var_out); +} +#endif + + +/*___________________________________________________________________________ + | | + | Function Name : L_negate | + | | + | Purpose : | + | | + | Negate the 32 bit variable L_var1 with saturation; saturate in the case | + | where input is -2147483648 (0x8000 0000). | + | | + | Complexity weight : 2 | + | | + | Inputs : | + | | + | L_var1 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +//Word32 L_negate (Word32 L_var1) +//{ +// Word32 L_var_out; +// +// L_var_out = (L_var1 == MIN_32) ? MAX_32 : -L_var1; +// +// return (L_var_out); +//} + + +/*___________________________________________________________________________ + | | + | Function Name : mult_r | + | | + | Purpose : | + | | + | Same as mult with rounding, i.e.: | + | mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and | + | mult_r(-32768,-32768) = 32767. | + | | + | Complexity weight : 2 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#if (!MULT_R_IS_INLINE) +Word16 mult_r (Word16 var1, Word16 var2) +{ + Word16 var_out; + Word32 L_product_arr; + + L_product_arr = (Word32) var1 *(Word32) var2; /* product */ + L_product_arr += (Word32) 0x00004000L; /* round */ + L_product_arr &= (Word32) 0xffff8000L; + L_product_arr >>= 15; /* shift */ + + if (L_product_arr & (Word32) 0x00010000L) /* sign extend when necessary */ + { + L_product_arr |= (Word32) 0xffff0000L; + } + var_out = saturate(L_product_arr); + + return (var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : L_shl | + | | + | Purpose : | + | | + | Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero | + | fill the var2 LSB of the result. If var2 is negative, arithmetically | + | shift L_var1 right by -var2 with sign extension. Saturate the result in | + | case of underflows or overflows. | + | | + | Complexity weight : 2 | + | | + | Inputs : | + | | + | L_var1 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ + +#if (!L_SHL_IS_INLINE) +Word32 L_shl (Word32 L_var1, Word16 var2) +{ + Word32 L_var_out = 0L; + + if (var2 <= 0) + { + L_var1 = L_shr(L_var1, (Word16)-var2); + } + else + { + for (; var2 > 0; var2--) + { + if (L_var1 > (Word32) 0X3fffffffL) + { + return MAX_32; + } + else + { + if (L_var1 < (Word32) 0xc0000000L) + { + return MIN_32; + } + } + L_var1 <<= 1; + } + } + return (L_var1); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : L_shr | + | | + | Purpose : | + | | + | Arithmetically shift the 32 bit input L_var1 right var2 positions with | + | sign extension. If var2 is negative, arithmetically shift L_var1 left | + | by -var2 and zero fill the -var2 LSB of the result. Saturate the result | + | in case of underflows or overflows. | + | | + | Complexity weight : 2 | + | | + | Inputs : | + | | + | L_var1 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ + +#if (!L_SHR_IS_INLINE) +Word32 L_shr (Word32 L_var1, Word16 var2) +{ + Word32 L_var_out; + + if (var2 < 0) + { + L_var_out = L_shl (L_var1, (Word16)-var2); + } + else + { + if (var2 >= 31) + { + L_var_out = (L_var1 < 0L) ? -1 : 0; + } + else + { + if (L_var1 < 0) + { + L_var_out = ~((~L_var1) >> var2); + } + else + { + L_var_out = L_var1 >> var2; + } + } + } + return (L_var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : shr_r | + | | + | Purpose : | + | | + | Same as shr(var1,var2) but with rounding. Saturate the result in case of| + | underflows or overflows : | + | - If var2 is greater than zero : | + | if (sub(shl(shr(var1,var2),1),shr(var1,sub(var2,1)))) | + | is equal to zero | + | then | + | shr_r(var1,var2) = shr(var1,var2) | + | else | + | shr_r(var1,var2) = add(shr(var1,var2),1) | + | - If var2 is less than or equal to zero : | + | shr_r(var1,var2) = shr(var1,var2). | + | | + | Complexity weight : 2 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#if (!SHR_R_IS_INLINE) +Word16 shr_r (Word16 var1, Word16 var2) +{ + Word16 var_out; + + if (var2 > 15) + { + var_out = 0; + } + else + { + var_out = shr (var1, var2); + + if (var2 > 0) + { + if ((var1 & ((Word16) 1 << (var2 - 1))) != 0) + { + var_out++; + } + } + } + + return (var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : mac_r | + | | + | Purpose : | + | | + | Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | + | result to L_var3 with saturation. Round the LS 16 bits of the result | + | into the MS 16 bits with saturation and shift the result right by 16. | + | Return a 16 bit result. | + | mac_r(L_var3,var1,var2) = round(L_mac(L_var3,var1,var2)) | + | | + | Complexity weight : 2 | + | | + | Inputs : | + | | + | L_var3 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#if (!MAC_R_IS_INLINE) +Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2) +{ + Word16 var_out; + + L_var3 = L_mac (L_var3, var1, var2); + L_var3 = L_add (L_var3, (Word32) 0x00008000L); + var_out = extract_h (L_var3); + + return (var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : msu_r | + | | + | Purpose : | + | | + | Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | + | bit result to L_var3 with saturation. Round the LS 16 bits of the res- | + | ult into the MS 16 bits with saturation and shift the result right by | + | 16. Return a 16 bit result. | + | msu_r(L_var3,var1,var2) = round(L_msu(L_var3,var1,var2)) | + | | + | Complexity weight : 2 | + | | + | Inputs : | + | | + | L_var3 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +#if (!MSU_R_IS_INLINE) +Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2) +{ + Word16 var_out; + + L_var3 = L_msu (L_var3, var1, var2); + L_var3 = L_add (L_var3, (Word32) 0x00008000L); + var_out = extract_h (L_var3); + + return (var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : L_deposit_h | + | | + | Purpose : | + | | + | Deposit the 16 bit var1 into the 16 MS bits of the 32 bit output. The | + | 16 LS bits of the output are zeroed. | + | | + | Complexity weight : 2 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var_out <= 0x7fff 0000. | + |___________________________________________________________________________| +*/ +//Word32 L_deposit_h (Word16 var1) +//{ +// Word32 L_var_out; +// +// L_var_out = (Word32) var1 << 16; +// +// return (L_var_out); +//} + + +/*___________________________________________________________________________ + | | + | Function Name : L_deposit_l | + | | + | Purpose : | + | | + | Deposit the 16 bit var1 into the 16 LS bits of the 32 bit output. The | + | 16 MS bits of the output are sign extended. | + | | + | Complexity weight : 2 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0xFFFF 8000 <= var_out <= 0x0000 7fff. | + |___________________________________________________________________________| +*/ +//Word32 L_deposit_l (Word16 var1) +//{ +// Word32 L_var_out; +// +// L_var_out = (Word32) var1; +// +// return (L_var_out); +//} + + +/*___________________________________________________________________________ + | | + | Function Name : L_shr_r | + | | + | Purpose : | + | | + | Same as L_shr(L_var1,var2) but with rounding. Saturate the result in | + | case of underflows or overflows : | + | - If var2 is greater than zero : | + | if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))| + | is equal to zero | + | then | + | L_shr_r(L_var1,var2) = L_shr(L_var1,var2) | + | else | + | L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1) | + | - If var2 is less than or equal to zero : | + | L_shr_r(L_var1,var2) = L_shr(L_var1,var2). | + | | + | Complexity weight : 3 | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +#if (!L_SHR_R_IS_INLINE) +Word32 L_shr_r (Word32 L_var1, Word16 var2) +{ + Word32 L_var_out; + + if (var2 > 31) + { + L_var_out = 0; + } + else + { + L_var_out = L_shr (L_var1, var2); + + if (var2 > 0) + { + if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0) + { + L_var_out++; + } + } + } + + return (L_var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : L_abs | + | | + | Purpose : | + | | + | Absolute value of L_var1; Saturate in case where the input is | + | -214783648 | + | | + | Complexity weight : 3 | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | L_var_out | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x0000 0000 <= var_out <= 0x7fff ffff. | + |___________________________________________________________________________| +*/ +//Word32 L_abs (Word32 L_var1) +//{ +// Word32 L_var_out; +// +// if (L_var1 == MIN_32) +// { +// L_var_out = MAX_32; +// } +// else +// { +// if (L_var1 < 0) +// { +// L_var_out = -L_var1; +// } +// else +// { +// L_var_out = L_var1; +// } +// } +// +// return (L_var_out); +//} + +/*___________________________________________________________________________ + | | + | Function Name : norm_s | + | | + | Purpose : | + | | + | Produces the number of left shift needed to normalize the 16 bit varia- | + | ble var1 for positive values on the interval with minimum of 16384 and | + | maximum of 32767, and for negative values on the interval with minimum | + | of -32768 and maximum of -16384; in order to normalize the result, the | + | following operation must be done : | + | norm_var1 = shl(var1,norm_s(var1)). | + | | + | Complexity weight : 15 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 0000 <= var_out <= 0x0000 000f. | + |___________________________________________________________________________| +*/ + +#if (!NORM_S_IS_INLINE) +Word16 norm_s (Word16 var1) +{ + Word16 var_out; + + if (var1 == 0) + { + var_out = 0; + } + else + { + if (var1 == -1) + { + var_out = 15; + } + else + { + if (var1 < 0) + { + var1 = (Word16)~var1; + } + for (var_out = 0; var1 < 0x4000; var_out++) + { + var1 <<= 1; + } + } + } + + return (var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : div_s | + | | + | Purpose : | + | | + | Produces a result which is the fractional integer division of var1 by | + | var2; var1 and var2 must be positive and var2 must be greater or equal | + | to var1; the result is positive (leading bit equal to 0) and truncated | + | to 16 bits. | + | If var1 = var2 then div(var1,var2) = 32767. | + | | + | Complexity weight : 18 | + | | + | Inputs : | + | | + | var1 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 0000 <= var1 <= var2 and var2 != 0. | + | | + | var2 | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : var1 <= var2 <= 0x0000 7fff and var2 != 0. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 0000 <= var_out <= 0x0000 7fff. | + | It's a Q15 value (point between b15 and b14). | + |___________________________________________________________________________| +*/ + +#if (!DIV_S_IS_INLINE) +Word16 div_s (Word16 var1, Word16 var2) +{ + Word16 var_out = 0; + Word16 iteration; + Word32 L_num; + Word32 L_denom; + + if (var1 == 0) + { + var_out = 0; + } + else + { + if (var1 == var2) + { + var_out = MAX_16; + } + else + { + L_num = L_deposit_l (var1); + L_denom = L_deposit_l (var2); + + for (iteration = 0; iteration < 15; iteration++) + { + var_out <<= 1; + L_num <<= 1; + + if (L_num >= L_denom) + { + L_num = L_sub(L_num, L_denom); + var_out = add (var_out, 1); + } + } + } + } + + return (var_out); +} +#endif + +/*___________________________________________________________________________ + | | + | Function Name : norm_l | + | | + | Purpose : | + | | + | Produces the number of left shifts needed to normalize the 32 bit varia-| + | ble L_var1 for positive values on the interval with minimum of | + | 1073741824 and maximum of 2147483647, and for negative values on the in-| + | terval with minimum of -2147483648 and maximum of -1073741824; in order | + | to normalize the result, the following operation must be done : | + | norm_L_var1 = L_shl(L_var1,norm_l(L_var1)). | + | | + | Complexity weight : 30 | + | | + | Inputs : | + | | + | L_var1 | + | 32 bit long signed integer (Word32) whose value falls in the | + | range : 0x8000 0000 <= var1 <= 0x7fff ffff. | + | | + | Outputs : | + | | + | none | + | | + | Return Value : | + | | + | var_out | + | 16 bit short signed integer (Word16) whose value falls in the | + | range : 0x0000 0000 <= var_out <= 0x0000 001f. | + |___________________________________________________________________________| +*/ + +#if (!NORM_L_IS_INLINE) +Word16 norm_l (Word32 L_var1) +{ + Word16 var_out; + + if (L_var1 == 0) + { + var_out = 0; + } + else + { + if (L_var1 == (Word32) 0xffffffffL) + { + var_out = 31; + } + else + { + if (L_var1 < 0) + { + L_var1 = ~L_var1; + } + for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++) + { + L_var1 <<= 1; + } + } + } + + return (var_out); +} +#endif diff --git a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c index 906a9df..0ad82f0 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c +++ b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: oper_32b.c - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: oper_32b.c + Content: This file contains operations in double precision. - + *******************************************************************************/ #include "typedef.h" @@ -198,164 +198,164 @@ Word32 Div_32 (Word32 L_num, Word32 denom) return (L_32); } - -/*! - - \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) -{ - Word16 iLog4; - - if(value != 0){ - Word32 tmp; - Word16 tmp16; - iLog4 = norm_l(value); - tmp = (value << iLog4); - tmp16 = round16(tmp); - tmp = L_mult(tmp16, tmp16); - tmp16 = round16(tmp); - tmp = L_mult(tmp16, tmp16); - tmp16 = round16(tmp); - - iLog4 = (-(iLog4 << 2) - norm_s(tmp16)) - 1; - } - else { - iLog4 = -128; /* -(INT_BITS*4); */ - } - - return iLog4; -} - -#define step(shift) \ - if ((0x40000000l >> shift) + root <= value) \ - { \ - value -= (0x40000000l >> shift) + root; \ - root = (root >> 1) | (0x40000000l >> shift); \ - } else { \ - root = root >> 1; \ - } - -Word32 rsqrt(Word32 value, /*!< Operand to square root (0.0 ... 1) */ - Word32 accuracy) /*!< Number of valid bits that will be calculated */ -{ - Word32 root = 0; - Word32 scale; - - if(value < 0) - return 0; - - scale = norm_l(value); - if(scale & 1) scale--; - - value <<= scale; - - step( 0); step( 2); step( 4); step( 6); - step( 8); step(10); step(12); step(14); - step(16); step(18); step(20); step(22); - step(24); step(26); step(28); step(30); - - scale >>= 1; - if (root < value) - ++root; - - root >>= scale; - return root* 46334; -} - -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 -}; - -/*! - - \brief calculates 2 ^ (x/y) for x<=0, y > 0, x <= 32768 * y - - avoids integer division - - \return -*/ -Word32 pow2_xy(Word32 x, Word32 y) -{ - Word32 iPart; - Word32 fPart; - Word32 res; - Word32 tmp, tmp2; - Word32 shift, shift2; - - tmp2 = -x; - iPart = tmp2 / y; - fPart = tmp2 - iPart*y; - iPart = min(iPart,INT_BITS-1); - - res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart; - - return(res); + +/*! + + \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) +{ + Word16 iLog4; + + if(value != 0){ + Word32 tmp; + Word16 tmp16; + iLog4 = norm_l(value); + tmp = (value << iLog4); + tmp16 = round16(tmp); + tmp = L_mult(tmp16, tmp16); + tmp16 = round16(tmp); + tmp = L_mult(tmp16, tmp16); + tmp16 = round16(tmp); + + iLog4 = (-(iLog4 << 2) - norm_s(tmp16)) - 1; + } + else { + iLog4 = -128; /* -(INT_BITS*4); */ + } + + return iLog4; +} + +#define step(shift) \ + if ((0x40000000l >> shift) + root <= value) \ + { \ + value -= (0x40000000l >> shift) + root; \ + root = (root >> 1) | (0x40000000l >> shift); \ + } else { \ + root = root >> 1; \ + } + +Word32 rsqrt(Word32 value, /*!< Operand to square root (0.0 ... 1) */ + Word32 accuracy) /*!< Number of valid bits that will be calculated */ +{ + Word32 root = 0; + Word32 scale; + + if(value < 0) + return 0; + + scale = norm_l(value); + if(scale & 1) scale--; + + value <<= scale; + + step( 0); step( 2); step( 4); step( 6); + step( 8); step(10); step(12); step(14); + step(16); step(18); step(20); step(22); + step(24); step(26); step(28); step(30); + + scale >>= 1; + if (root < value) + ++root; + + root >>= scale; + return root* 46334; +} + +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 +}; + +/*! + + \brief calculates 2 ^ (x/y) for x<=0, y > 0, x <= 32768 * y + + avoids integer division + + \return +*/ +Word32 pow2_xy(Word32 x, Word32 y) +{ + Word32 iPart; + Word32 fPart; + Word32 res; + Word32 tmp, tmp2; + Word32 shift, shift2; + + tmp2 = -x; + iPart = tmp2 / y; + fPart = tmp2 - iPart*y; + iPart = min(iPart,INT_BITS-1); + + res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart; + + return(res); } \ No newline at end of file diff --git a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h index 4119bc3..1d35e5e 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h +++ b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h @@ -1,86 +1,86 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: oper_32b.h - - Content: Double precision operations - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: oper_32b.h + + Content: Double precision operations + *******************************************************************************/ #ifndef __OPER_32b_H #define __OPER_32b_H - -#include "typedef.h" + +#include "typedef.h" #ifdef __cplusplus extern "C" { #endif - -#define POW2_TABLE_BITS 8 -#define POW2_TABLE_SIZE (1<> 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" - :[result]"+r"(result) - :[L_var2]"r"(L_var2), [var1]"r"(var1) - ); - return result; -#else - unsigned short swLow1; - Word16 swHigh1; - Word32 l_var_out; - - swLow1 = (unsigned short)(L_var2); - swHigh1 = (Word16)(L_var2 >> 16); - - l_var_out = (long)swLow1 * (long)var1 >> 16; - l_var_out += swHigh1 * var1; - - return(l_var_out); -#endif -} +Word16 iLog4(Word32 value); +Word32 rsqrt(Word32 value, Word32 accuracy); +Word32 pow2_xy(Word32 x, Word32 y); + +__inline Word32 L_mpy_ls(Word32 L_var2, Word16 var1) +{ + unsigned short swLow1; + Word16 swHigh1; + Word32 l_var_out; + + swLow1 = (unsigned short)(L_var2); + 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" + :[result]"+r"(result) + :[L_var2]"r"(L_var2), [var1]"r"(var1) + ); + return result; +#else + unsigned short swLow1; + Word16 swHigh1; + Word32 l_var_out; + + swLow1 = (unsigned short)(L_var2); + swHigh1 = (Word16)(L_var2 >> 16); + + l_var_out = (long)swLow1 * (long)var1 >> 16; + l_var_out += swHigh1 * var1; + + return(l_var_out); +#endif +} #ifdef __cplusplus } diff --git a/media/libstagefright/codecs/aacenc/basic_op/typedef.h b/media/libstagefright/codecs/aacenc/basic_op/typedef.h index d3a626a..1030803 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/typedef.h +++ b/media/libstagefright/codecs/aacenc/basic_op/typedef.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: typedef.h - - Content: type defined for defferent paltform - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: typedef.h + + Content: type defined for defferent paltform + *******************************************************************************/ #ifndef typedef_h @@ -54,7 +54,7 @@ typedef int Flag; /* * use (improved) type definition file typdefs.h and add a "Flag" type - */ + */ #include "typedefs.h" typedef int Flag; diff --git a/media/libstagefright/codecs/aacenc/basic_op/typedefs.h b/media/libstagefright/codecs/aacenc/basic_op/typedefs.h index 7d16fca..c7e774b 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/typedefs.h +++ b/media/libstagefright/codecs/aacenc/basic_op/typedefs.h @@ -1,56 +1,56 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: typedefs.h - - Content: type defined or const defined - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: typedefs.h + + Content: type defined or const defined + *******************************************************************************/ #ifndef typedefs_h #define typedefs_h "$Id $" -#ifndef CHAR_BIT -#define CHAR_BIT 8 /* number of bits in a char */ -#endif - -#ifndef VOAAC_SHRT_MAX -#define VOAAC_SHRT_MAX (32767) /* maximum (signed) short value */ -#endif - -#ifndef VOAAC_SHRT_MIN -#define VOAAC_SHRT_MIN (-32768) /* minimum (signed) short value */ -#endif - -/* Define NULL pointer value */ -#ifndef NULL -#ifdef __cplusplus -#define NULL 0 -#else -#define NULL ((void *)0) -#endif +#ifndef CHAR_BIT +#define CHAR_BIT 8 /* number of bits in a char */ +#endif + +#ifndef VOAAC_SHRT_MAX +#define VOAAC_SHRT_MAX (32767) /* maximum (signed) short value */ +#endif + +#ifndef VOAAC_SHRT_MIN +#define VOAAC_SHRT_MIN (-32768) /* minimum (signed) short value */ +#endif + +/* Define NULL pointer value */ +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else +#define NULL ((void *)0) +#endif #endif #ifndef assert #define assert(_Expression) ((void)0) #endif - -#ifdef LINUX -#define __inline static __inline__ -#endif + +#ifdef LINUX +#define __inline static __inline__ +#endif #define INT_BITS 32 /* @@ -80,100 +80,100 @@ typedef unsigned short UWord16; typedef long Word32; typedef unsigned long UWord32; - - + + #ifdef LINUX typedef long long Word64; typedef unsigned long long UWord64; #else -typedef __int64 Word64; +typedef __int64 Word64; typedef unsigned __int64 UWord64; #endif -#ifndef min -#define min(a,b) ( a < b ? a : b) -#endif - -#ifndef max -#define max(a,b) ( a > b ? a : b) -#endif - -#ifdef ARM_INASM -#ifdef ARMV5_INASM -#define ARMV5E_INASM 1 -#endif -#define ARMV4_INASM 1 -#endif - -#if ARMV4_INASM - #define ARMV5TE_SAT 1 - #define ARMV5TE_ADD 1 - #define ARMV5TE_SUB 1 - #define ARMV5TE_SHL 1 - #define ARMV5TE_SHR 1 - #define ARMV5TE_L_SHL 1 - #define ARMV5TE_L_SHR 1 -#endif//ARMV4 -#if ARMV5E_INASM - #define ARMV5TE_L_ADD 1 - #define ARMV5TE_L_SUB 1 - #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 +#ifndef min +#define min(a,b) ( a < b ? a : b) +#endif + +#ifndef max +#define max(a,b) ( a > b ? a : b) +#endif + +#ifdef ARM_INASM +#ifdef ARMV5_INASM +#define ARMV5E_INASM 1 +#endif +#define ARMV4_INASM 1 +#endif + +#if ARMV4_INASM + #define ARMV5TE_SAT 1 + #define ARMV5TE_ADD 1 + #define ARMV5TE_SUB 1 + #define ARMV5TE_SHL 1 + #define ARMV5TE_SHR 1 + #define ARMV5TE_L_SHL 1 + #define ARMV5TE_L_SHR 1 +#endif//ARMV4 +#if ARMV5E_INASM + #define ARMV5TE_L_ADD 1 + #define ARMV5TE_L_SUB 1 + #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 #endif - -//basic operation functions optimization flags -#define SATRUATE_IS_INLINE 1 //define saturate as inline function -#define SHL_IS_INLINE 1 //define shl as inline function -#define SHR_IS_INLINE 1 //define shr as inline function -#define L_MULT_IS_INLINE 1 //define L_mult as inline function -#define L_MSU_IS_INLINE 1 //define L_msu as inline function -#define L_SUB_IS_INLINE 1 //define L_sub as inline function -#define L_SHL_IS_INLINE 1 //define L_shl as inline function -#define L_SHR_IS_INLINE 1 //define L_shr as inline function -#define ADD_IS_INLINE 1 //define add as inline function //add, inline is the best -#define SUB_IS_INLINE 1 //define sub as inline function //sub, inline is the best -#define DIV_S_IS_INLINE 1 //define div_s as inline function -#define MULT_IS_INLINE 1 //define mult as inline function -#define NORM_S_IS_INLINE 1 //define norm_s as inline function -#define NORM_L_IS_INLINE 1 //define norm_l as inline function -#define ROUND_IS_INLINE 1 //define round as inline function -#define L_MAC_IS_INLINE 1 //define L_mac as inline function -#define L_ADD_IS_INLINE 1 //define L_add 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 -#define MAC_R_IS_INLINE 1 //define mac_r as inline function -#define MSU_R_IS_INLINE 1 //define msu_r as inline function -#define L_SHR_R_IS_INLINE 1 //define L_shr_r as inline function - -#define PREFIX voAACEnc -#define LINK0(x, y, z) LINK1(x,y,z) -#define LINK1(x,y,z) x##y##z -#define ADD_PREFIX(func) LINK0(PREFIX, _, func) - -#define L_Extract ADD_PREFIX(L_Extract) -#define L_Comp ADD_PREFIX(L_Comp) -#define Mpy_32 ADD_PREFIX(Mpy_32) -#define Mpy_32_16 ADD_PREFIX(Mpy_32_16) -#define Div_32 ADD_PREFIX(Div_32) -#define iLog4 ADD_PREFIX(iLog4) -#define rsqrt ADD_PREFIX(rsqrt) -#define pow2_xy ADD_PREFIX(pow2_xy) -#define L_mpy_ls ADD_PREFIX(L_mpy_ls) -#define L_mpy_wx ADD_PREFIX(L_mpy_wx) - -#define mem_malloc ADD_PREFIX(mem_malloc) -#define mem_free ADD_PREFIX(mem_free) - + +//basic operation functions optimization flags +#define SATRUATE_IS_INLINE 1 //define saturate as inline function +#define SHL_IS_INLINE 1 //define shl as inline function +#define SHR_IS_INLINE 1 //define shr as inline function +#define L_MULT_IS_INLINE 1 //define L_mult as inline function +#define L_MSU_IS_INLINE 1 //define L_msu as inline function +#define L_SUB_IS_INLINE 1 //define L_sub as inline function +#define L_SHL_IS_INLINE 1 //define L_shl as inline function +#define L_SHR_IS_INLINE 1 //define L_shr as inline function +#define ADD_IS_INLINE 1 //define add as inline function //add, inline is the best +#define SUB_IS_INLINE 1 //define sub as inline function //sub, inline is the best +#define DIV_S_IS_INLINE 1 //define div_s as inline function +#define MULT_IS_INLINE 1 //define mult as inline function +#define NORM_S_IS_INLINE 1 //define norm_s as inline function +#define NORM_L_IS_INLINE 1 //define norm_l as inline function +#define ROUND_IS_INLINE 1 //define round as inline function +#define L_MAC_IS_INLINE 1 //define L_mac as inline function +#define L_ADD_IS_INLINE 1 //define L_add 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 +#define MAC_R_IS_INLINE 1 //define mac_r as inline function +#define MSU_R_IS_INLINE 1 //define msu_r as inline function +#define L_SHR_R_IS_INLINE 1 //define L_shr_r as inline function + +#define PREFIX voAACEnc +#define LINK0(x, y, z) LINK1(x,y,z) +#define LINK1(x,y,z) x##y##z +#define ADD_PREFIX(func) LINK0(PREFIX, _, func) + +#define L_Extract ADD_PREFIX(L_Extract) +#define L_Comp ADD_PREFIX(L_Comp) +#define Mpy_32 ADD_PREFIX(Mpy_32) +#define Mpy_32_16 ADD_PREFIX(Mpy_32_16) +#define Div_32 ADD_PREFIX(Div_32) +#define iLog4 ADD_PREFIX(iLog4) +#define rsqrt ADD_PREFIX(rsqrt) +#define pow2_xy ADD_PREFIX(pow2_xy) +#define L_mpy_ls ADD_PREFIX(L_mpy_ls) +#define L_mpy_wx ADD_PREFIX(L_mpy_wx) + +#define mem_malloc ADD_PREFIX(mem_malloc) +#define mem_free ADD_PREFIX(mem_free) + #endif diff --git a/media/libstagefright/codecs/aacenc/inc/aac_rom.h b/media/libstagefright/codecs/aacenc/inc/aac_rom.h index b0429fc..784bb70 100644 --- a/media/libstagefright/codecs/aacenc/inc/aac_rom.h +++ b/media/libstagefright/codecs/aacenc/inc/aac_rom.h @@ -1,28 +1,28 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: aac_rom.h - - Content: constant tables - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: aac_rom.h + + Content: constant tables + *******************************************************************************/ #ifndef ROM_H #define ROM_H - + #include "config.h" #include "psy_const.h" #include "tns_param.h" @@ -31,16 +31,16 @@ mdct */ extern const int ShortWindowSine[FRAME_LEN_SHORT/2]; -extern const int LongWindowKBD[FRAME_LEN_LONG/2]; - -extern const unsigned char bitrevTab[17 + 129]; -extern const int cossintab[128 + 1024]; - -#if defined (ARMV5E) && !defined (ARMV7Neon) -extern const int twidTab64[(4*6 + 16*6)/2]; -extern const int twidTab512[(8*6 + 32*6 + 128*6)/2]; -#else -extern const int twidTab64[4*6 + 16*6]; +extern const int LongWindowKBD[FRAME_LEN_LONG/2]; + +extern const unsigned char bitrevTab[17 + 129]; +extern const int cossintab[128 + 1024]; + +#if defined (ARMV5E) && !defined (ARMV7Neon) +extern const int twidTab64[(4*6 + 16*6)/2]; +extern const int twidTab512[(8*6 + 32*6 + 128*6)/2]; +#else +extern const int twidTab64[4*6 + 16*6]; extern const int twidTab512[8*6 + 32*6 + 128*6]; #endif @@ -61,7 +61,7 @@ extern Word32 specExpMantTableComb_enc[4][14]; extern const UWord8 specExpTableComb_enc[4][14]; extern const Word16 quantBorders[4][4]; -//extern const Word16 quantRecon[3][4]; +//extern const Word16 quantRecon[3][4]; extern const Word16 quantRecon[4][3]; /* @@ -92,26 +92,26 @@ extern const UWord32 huff_ctabscf[121]; /* misc */ -extern const int sampRateTab[NUM_SAMPLE_RATES]; -extern const int BandwithCoefTab[8][NUM_SAMPLE_RATES]; -extern const int rates[8]; -extern const UWord8 sfBandTotalShort[NUM_SAMPLE_RATES]; -extern const UWord8 sfBandTotalLong[NUM_SAMPLE_RATES]; -extern const int sfBandTabShortOffset[NUM_SAMPLE_RATES]; -extern const short sfBandTabShort[76]; -extern const int sfBandTabLongOffset[NUM_SAMPLE_RATES]; -extern const short sfBandTabLong[325]; +extern const int sampRateTab[NUM_SAMPLE_RATES]; +extern const int BandwithCoefTab[8][NUM_SAMPLE_RATES]; +extern const int rates[8]; +extern const UWord8 sfBandTotalShort[NUM_SAMPLE_RATES]; +extern const UWord8 sfBandTotalLong[NUM_SAMPLE_RATES]; +extern const int sfBandTabShortOffset[NUM_SAMPLE_RATES]; +extern const short sfBandTabShort[76]; +extern const int sfBandTabLongOffset[NUM_SAMPLE_RATES]; +extern const short sfBandTabLong[325]; extern const Word32 m_log2_table[INT_BITS]; /* TNS */ -extern const Word32 tnsCoeff3[8]; -extern const Word32 tnsCoeff3Borders[8]; -extern const Word32 tnsCoeff4[16]; -extern const Word32 tnsCoeff4Borders[16]; -extern const Word32 invSBF[24]; -extern const Word16 sideInfoTabLong[MAX_SFB_LONG + 1]; +extern const Word32 tnsCoeff3[8]; +extern const Word32 tnsCoeff3Borders[8]; +extern const Word32 tnsCoeff4[16]; +extern const Word32 tnsCoeff4Borders[16]; +extern const Word32 invSBF[24]; +extern const Word16 sideInfoTabLong[MAX_SFB_LONG + 1]; extern const Word16 sideInfoTabShort[MAX_SFB_SHORT + 1]; #endif diff --git a/media/libstagefright/codecs/aacenc/inc/aacenc_core.h b/media/libstagefright/codecs/aacenc/inc/aacenc_core.h index faa1d20..41ba756 100644 --- a/media/libstagefright/codecs/aacenc/inc/aacenc_core.h +++ b/media/libstagefright/codecs/aacenc/inc/aacenc_core.h @@ -1,37 +1,37 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: aacenc_core.h - - Content: aac encoder interface functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: aacenc_core.h + + Content: aac encoder interface functions + *******************************************************************************/ #ifndef _aacenc_core_h_ #define _aacenc_core_h_ - + #include "typedef.h" -#include "config.h" -#include "bitenc.h" - -#include "psy_configuration.h" -#include "psy_main.h" -#include "qc_main.h" -#include "psy_main.h" +#include "config.h" +#include "bitenc.h" + +#include "psy_configuration.h" +#include "psy_main.h" +#include "qc_main.h" +#include "psy_main.h" /*-------------------------- defines --------------------------------------*/ @@ -41,42 +41,42 @@ typedef struct { Word32 bitRate; /* encoder bit rate in bits/sec */ Word16 nChannelsIn; /* number of channels on input (1,2) */ Word16 nChannelsOut; /* number of channels on output (1,2) */ - Word16 bandWidth; /* targeted audio bandwidth in Hz */ + Word16 bandWidth; /* targeted audio bandwidth in Hz */ Word16 adtsUsed; /* whether write adts header */ } AACENC_CONFIG; - - -typedef struct { - - AACENC_CONFIG config; /* Word16 size: 8 */ - - ELEMENT_INFO elInfo; /* Word16 size: 4 */ - - QC_STATE qcKernel; /* Word16 size: 6 + 5(PADDING) + 7(ELEMENT_BITS) + 54(ADJ_THR_STATE) = 72 */ - QC_OUT qcOut; /* Word16 size: MAX_CHANNELS*920(QC_OUT_CHANNEL) + 5(QC_OUT_ELEMENT) + 7 = 932 / 1852 */ - - PSY_OUT psyOut; /* Word16 size: MAX_CHANNELS*186 + 2 = 188 / 374 */ - PSY_KERNEL psyKernel; /* Word16 size: 2587 / 4491 */ - - struct BITSTREAMENCODER_INIT bseInit; /* Word16 size: 6 */ - struct BIT_BUF bitStream; /* Word16 size: 8 */ - HANDLE_BIT_BUF hBitStream; - int initOK; - - short *intbuf; - short *encbuf; - short *inbuf; - int enclen; - int inlen; - int intlen; - int uselength; - - void *hCheck; - VO_MEM_OPERATOR *voMemop; - VO_MEM_OPERATOR voMemoprator; - -}AAC_ENCODER; /* Word16 size: 3809 / 6851 */ - + + +typedef struct { + + AACENC_CONFIG config; /* Word16 size: 8 */ + + ELEMENT_INFO elInfo; /* Word16 size: 4 */ + + QC_STATE qcKernel; /* Word16 size: 6 + 5(PADDING) + 7(ELEMENT_BITS) + 54(ADJ_THR_STATE) = 72 */ + QC_OUT qcOut; /* Word16 size: MAX_CHANNELS*920(QC_OUT_CHANNEL) + 5(QC_OUT_ELEMENT) + 7 = 932 / 1852 */ + + PSY_OUT psyOut; /* Word16 size: MAX_CHANNELS*186 + 2 = 188 / 374 */ + PSY_KERNEL psyKernel; /* Word16 size: 2587 / 4491 */ + + struct BITSTREAMENCODER_INIT bseInit; /* Word16 size: 6 */ + struct BIT_BUF bitStream; /* Word16 size: 8 */ + HANDLE_BIT_BUF hBitStream; + int initOK; + + short *intbuf; + short *encbuf; + short *inbuf; + int enclen; + int inlen; + int intlen; + int uselength; + + void *hCheck; + VO_MEM_OPERATOR *voMemop; + VO_MEM_OPERATOR voMemoprator; + +}AAC_ENCODER; /* Word16 size: 3809 / 6851 */ + /*----------------------------------------------------------------------------- functionname: AacInitDefaultConfig diff --git a/media/libstagefright/codecs/aacenc/inc/adj_thr.h b/media/libstagefright/codecs/aacenc/inc/adj_thr.h index 4057cbe..f7cb888 100644 --- a/media/libstagefright/codecs/aacenc/inc/adj_thr.h +++ b/media/libstagefright/codecs/aacenc/inc/adj_thr.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: adj_thr.h - - Content: Threshold compensation function - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: adj_thr.h + + Content: Threshold compensation function + *******************************************************************************/ #ifndef __ADJ_THR_H diff --git a/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h b/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h index 25dd437..9ac4664 100644 --- a/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h +++ b/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h @@ -1,29 +1,29 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: adj_thr_data.h - - Content: Threshold compensation parameter - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: adj_thr_data.h + + Content: Threshold compensation parameter + *******************************************************************************/ #ifndef __ADJ_THR_DATA_H #define __ADJ_THR_DATA_H -#include "typedef.h" +#include "typedef.h" #include "psy_const.h" #include "line_pe.h" diff --git a/media/libstagefright/codecs/aacenc/inc/band_nrg.h b/media/libstagefright/codecs/aacenc/inc/band_nrg.h index 68509da..65453c0 100644 --- a/media/libstagefright/codecs/aacenc/inc/band_nrg.h +++ b/media/libstagefright/codecs/aacenc/inc/band_nrg.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: band_nrg.h - - Content: Band/Line energy calculations functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: band_nrg.h + + Content: Band/Line energy calculations functions + *******************************************************************************/ diff --git a/media/libstagefright/codecs/aacenc/inc/bit_cnt.h b/media/libstagefright/codecs/aacenc/inc/bit_cnt.h index 808319e..266a219 100644 --- a/media/libstagefright/codecs/aacenc/inc/bit_cnt.h +++ b/media/libstagefright/codecs/aacenc/inc/bit_cnt.h @@ -1,29 +1,29 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: bit_cnt.h - - Content: Huffman Bitcounter & coder structure and functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: bit_cnt.h + + Content: Huffman Bitcounter & coder structure and functions + *******************************************************************************/ #ifndef __BITCOUNT_H #define __BITCOUNT_H -#include "bitbuffer.h" +#include "bitbuffer.h" #include "basic_op.h" #define INVALID_BITCOUNT (MAX_16/4) diff --git a/media/libstagefright/codecs/aacenc/inc/bitbuffer.h b/media/libstagefright/codecs/aacenc/inc/bitbuffer.h index cb850c9..e538064 100644 --- a/media/libstagefright/codecs/aacenc/inc/bitbuffer.h +++ b/media/libstagefright/codecs/aacenc/inc/bitbuffer.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: bitbuffer.h - - Content: Bit Buffer Management structure and functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: bitbuffer.h + + Content: Bit Buffer Management structure and functions + *******************************************************************************/ #ifndef BITBUFFER_H diff --git a/media/libstagefright/codecs/aacenc/inc/bitenc.h b/media/libstagefright/codecs/aacenc/inc/bitenc.h index 1151057..6ded3c6 100644 --- a/media/libstagefright/codecs/aacenc/inc/bitenc.h +++ b/media/libstagefright/codecs/aacenc/inc/bitenc.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: bitenc.h - - Content: Bitstream encoder structure and functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: bitenc.h + + Content: Bitstream encoder structure and functions + *******************************************************************************/ #ifndef _BITENC_H @@ -42,8 +42,8 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitstream, ELEMENT_INFO elInfo, QC_OUT *qcOut, PSY_OUT *psyOut, - Word16 *globUsedBits, - const UWord8 *ancBytes, + Word16 *globUsedBits, + const UWord8 *ancBytes, Word16 samplerate ); diff --git a/media/libstagefright/codecs/aacenc/inc/block_switch.h b/media/libstagefright/codecs/aacenc/inc/block_switch.h index 3e35819..a4d3e8f 100644 --- a/media/libstagefright/codecs/aacenc/inc/block_switch.h +++ b/media/libstagefright/codecs/aacenc/inc/block_switch.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: block_switch.h - - Content: Block switching structure and functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: block_switch.h + + Content: Block switching structure and functions + *******************************************************************************/ #ifndef _BLOCK_SWITCH_H diff --git a/media/libstagefright/codecs/aacenc/inc/channel_map.h b/media/libstagefright/codecs/aacenc/inc/channel_map.h index e3aa8dc..c361feb 100644 --- a/media/libstagefright/codecs/aacenc/inc/channel_map.h +++ b/media/libstagefright/codecs/aacenc/inc/channel_map.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: channel_map.h - - Content: channel mapping functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: channel_map.h + + Content: channel mapping functions + *******************************************************************************/ #ifndef _CHANNEL_MAP_H diff --git a/media/libstagefright/codecs/aacenc/inc/config.h b/media/libstagefright/codecs/aacenc/inc/config.h index 6211c8f..3b29cef 100644 --- a/media/libstagefright/codecs/aacenc/inc/config.h +++ b/media/libstagefright/codecs/aacenc/inc/config.h @@ -1,36 +1,36 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: config.h - - Content: aac encoder parameter - -*******************************************************************************/ - -#ifndef _AACENC_CONFIG_H_ -#define _AACENC_CONFIG_H_ - -#define MAX_CHANNELS 2 - -#define AACENC_BLOCKSIZE 1024 /*! encoder only takes BLOCKSIZE samples at a time */ -#define AACENC_TRANS_FAC 8 /*! encoder short long ratio */ - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: config.h + + Content: aac encoder parameter + +*******************************************************************************/ + +#ifndef _AACENC_CONFIG_H_ +#define _AACENC_CONFIG_H_ + +#define MAX_CHANNELS 2 + +#define AACENC_BLOCKSIZE 1024 /*! encoder only takes BLOCKSIZE samples at a time */ +#define AACENC_TRANS_FAC 8 /*! encoder short long ratio */ + + #define MAXBITS_COEF 6144 -#define MINBITS_COEF 744 - - +#define MINBITS_COEF 744 + + #endif \ No newline at end of file diff --git a/media/libstagefright/codecs/aacenc/inc/dyn_bits.h b/media/libstagefright/codecs/aacenc/inc/dyn_bits.h index 0468fa2..d3a8a67 100644 --- a/media/libstagefright/codecs/aacenc/inc/dyn_bits.h +++ b/media/libstagefright/codecs/aacenc/inc/dyn_bits.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: dyn_bits.h - - Content: Noiseless coder module structure and functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: dyn_bits.h + + Content: Noiseless coder module structure and functions + *******************************************************************************/ #ifndef __DYN_BITS_H diff --git a/media/libstagefright/codecs/aacenc/inc/grp_data.h b/media/libstagefright/codecs/aacenc/inc/grp_data.h index 9666577..4c1b2cb 100644 --- a/media/libstagefright/codecs/aacenc/inc/grp_data.h +++ b/media/libstagefright/codecs/aacenc/inc/grp_data.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: grp_data.h - - Content: Short block grouping function - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: grp_data.h + + Content: Short block grouping function + *******************************************************************************/ #ifndef __GRP_DATA_H__ diff --git a/media/libstagefright/codecs/aacenc/inc/interface.h b/media/libstagefright/codecs/aacenc/inc/interface.h index b84334a..966ac99 100644 --- a/media/libstagefright/codecs/aacenc/inc/interface.h +++ b/media/libstagefright/codecs/aacenc/inc/interface.h @@ -1,29 +1,29 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: interface.h - - Content: psychoaccoustic/quantizer structures and interface - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: interface.h + + Content: psychoaccoustic/quantizer structures and interface + *******************************************************************************/ #ifndef _INTERFACE_H #define _INTERFACE_H -#include "config.h" +#include "config.h" #include "psy_const.h" #include "psy_data.h" #include "typedefs.h" diff --git a/media/libstagefright/codecs/aacenc/inc/line_pe.h b/media/libstagefright/codecs/aacenc/inc/line_pe.h index fed938b..038d5a3 100644 --- a/media/libstagefright/codecs/aacenc/inc/line_pe.h +++ b/media/libstagefright/codecs/aacenc/inc/line_pe.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: line_pe.h - - Content: Perceptual entropie module structure and functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: line_pe.h + + Content: Perceptual entropie module structure and functions + *******************************************************************************/ #ifndef __LINE_PE_H diff --git a/media/libstagefright/codecs/aacenc/inc/memalign.h b/media/libstagefright/codecs/aacenc/inc/memalign.h index 3b302a7..30bbf45 100644 --- a/media/libstagefright/codecs/aacenc/inc/memalign.h +++ b/media/libstagefright/codecs/aacenc/inc/memalign.h @@ -1,35 +1,35 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: memalign.h - - Content: Memory alloc alignments functions - -*******************************************************************************/ - -#ifndef __VO_AACENC_MEM_ALIGN_H__ -#define __VO_AACENC_MEM_ALIGN_H__ - -#include "voMem.h" -#include "typedef.h" - -extern void *mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID); -extern void mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID); - -#endif /* __VO_MEM_ALIGN_H__ */ - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: memalign.h + + Content: Memory alloc alignments functions + +*******************************************************************************/ + +#ifndef __VO_AACENC_MEM_ALIGN_H__ +#define __VO_AACENC_MEM_ALIGN_H__ + +#include "voMem.h" +#include "typedef.h" + +extern void *mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID); +extern void mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID); + +#endif /* __VO_MEM_ALIGN_H__ */ + + + diff --git a/media/libstagefright/codecs/aacenc/inc/ms_stereo.h b/media/libstagefright/codecs/aacenc/inc/ms_stereo.h index 6d43dec..3c03dea 100644 --- a/media/libstagefright/codecs/aacenc/inc/ms_stereo.h +++ b/media/libstagefright/codecs/aacenc/inc/ms_stereo.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: ms_stereo.h - - Content: Declaration MS stereo processing structure and functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: ms_stereo.h + + Content: Declaration MS stereo processing structure and functions + *******************************************************************************/ #ifndef __MS_STEREO_H__ diff --git a/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h b/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h index 35f36e8..e719ba7 100644 --- a/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h +++ b/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: pre_echo_control.h - - Content: Pre echo control functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: pre_echo_control.h + + Content: Pre echo control functions + *******************************************************************************/ #ifndef __PRE_ECHO_CONTROL_H diff --git a/media/libstagefright/codecs/aacenc/inc/psy_configuration.h b/media/libstagefright/codecs/aacenc/inc/psy_configuration.h index 53cf25b..9abfc99 100644 --- a/media/libstagefright/codecs/aacenc/inc/psy_configuration.h +++ b/media/libstagefright/codecs/aacenc/inc/psy_configuration.h @@ -1,28 +1,28 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: psy_configuration.h - - Content: Psychoaccoustic configuration structure and functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: psy_configuration.h + + Content: Psychoaccoustic configuration structure and functions + *******************************************************************************/ #ifndef _PSY_CONFIGURATION_H #define _PSY_CONFIGURATION_H - + #include "typedefs.h" #include "psy_const.h" #include "tns.h" @@ -38,7 +38,7 @@ typedef struct{ Word16 maxAllowedIncreaseFactor; /* preecho control */ Word16 minRemainingThresholdFactor; - Word16 lowpassLine; + Word16 lowpassLine; Word16 sampRateIdx; Word32 clipEnergy; /* for level dependend tmn */ @@ -68,7 +68,7 @@ typedef struct{ Word16 maxAllowedIncreaseFactor; /* preecho control */ Word16 minRemainingThresholdFactor; - Word16 lowpassLine; + Word16 lowpassLine; Word16 sampRateIdx; Word32 clipEnergy; /* for level dependend tmn */ @@ -85,10 +85,10 @@ typedef struct{ TNS_CONFIG tnsConf; }PSY_CONFIGURATION_SHORT; /*Word16 size: 8 + 16 + 16 + 16 + 16 + 16 + 16 + 16 + 47 = 167 */ - - -/* Returns the sample rate index */ -Word32 GetSRIndex(Word32 sampleRate); + + +/* Returns the sample rate index */ +Word32 GetSRIndex(Word32 sampleRate); Word16 InitPsyConfigurationLong(Word32 bitrate, diff --git a/media/libstagefright/codecs/aacenc/inc/psy_const.h b/media/libstagefright/codecs/aacenc/inc/psy_const.h index 5455ab1..b05d683 100644 --- a/media/libstagefright/codecs/aacenc/inc/psy_const.h +++ b/media/libstagefright/codecs/aacenc/inc/psy_const.h @@ -1,37 +1,37 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: psy_const.h - - Content: Global psychoacoustic constants structures - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: psy_const.h + + Content: Global psychoacoustic constants structures + *******************************************************************************/ #ifndef _PSYCONST_H #define _PSYCONST_H -#include "config.h" +#include "config.h" #define TRUE 1 #define FALSE 0 #define FRAME_LEN_LONG AACENC_BLOCKSIZE #define TRANS_FAC 8 -#define FRAME_LEN_SHORT (FRAME_LEN_LONG/TRANS_FAC) - +#define FRAME_LEN_SHORT (FRAME_LEN_LONG/TRANS_FAC) + /* Block types */ @@ -74,7 +74,7 @@ enum #define TRANSFORM_OFFSET_SHORT 448 #define LOG_NORM_PCM -15 - + #define NUM_SAMPLE_RATES 12 #endif /* _PSYCONST_H */ diff --git a/media/libstagefright/codecs/aacenc/inc/psy_data.h b/media/libstagefright/codecs/aacenc/inc/psy_data.h index 1412d53..3ea6a84 100644 --- a/media/libstagefright/codecs/aacenc/inc/psy_data.h +++ b/media/libstagefright/codecs/aacenc/inc/psy_data.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: psy_data.h - - Content: Psychoacoustic data and structures - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: psy_data.h + + Content: Psychoacoustic data and structures + *******************************************************************************/ #ifndef _PSY_DATA_H diff --git a/media/libstagefright/codecs/aacenc/inc/psy_main.h b/media/libstagefright/codecs/aacenc/inc/psy_main.h index ab0b8b1..5fcbe13 100644 --- a/media/libstagefright/codecs/aacenc/inc/psy_main.h +++ b/media/libstagefright/codecs/aacenc/inc/psy_main.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: psy_main.h - - Content: Psychoacoustic major function block - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: psy_main.h + + Content: Psychoacoustic major function block + *******************************************************************************/ #ifndef _PSYMAIN_H @@ -35,7 +35,7 @@ typedef struct { PSY_CONFIGURATION_SHORT psyConfShort; /* Word16 size: 167 */ PSY_DATA psyData[MAX_CHANNELS]; /* Word16 size: MAX_CHANNELS*1669*/ TNS_DATA tnsData[MAX_CHANNELS]; /* Word16 size: MAX_CHANNELS*235 */ - Word32* pScratchTns; + Word32* pScratchTns; Word16 sampleRateIdx; }PSY_KERNEL; /* Word16 size: 2587 / 4491 */ diff --git a/media/libstagefright/codecs/aacenc/inc/qc_data.h b/media/libstagefright/codecs/aacenc/inc/qc_data.h index 81d4051..109922d 100644 --- a/media/libstagefright/codecs/aacenc/inc/qc_data.h +++ b/media/libstagefright/codecs/aacenc/inc/qc_data.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: qc_data.h - - Content: Quantizing & coding structures - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: qc_data.h + + Content: Quantizing & coding structures + *******************************************************************************/ #ifndef _QC_DATA_H @@ -89,7 +89,7 @@ typedef struct typedef struct { - Word16 adtsUsed; + Word16 adtsUsed; Word16 staticBitsUsed; /* for verification purposes */ Word16 dynBitsUsed; /* for verification purposes */ Word16 pe; diff --git a/media/libstagefright/codecs/aacenc/inc/qc_main.h b/media/libstagefright/codecs/aacenc/inc/qc_main.h index e1138b2..924a06d 100644 --- a/media/libstagefright/codecs/aacenc/inc/qc_main.h +++ b/media/libstagefright/codecs/aacenc/inc/qc_main.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: qc_main.h - - Content: Quantizing & coding functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: qc_main.h + + Content: Quantizing & coding functions + *******************************************************************************/ #ifndef _QC_MAIN_H diff --git a/media/libstagefright/codecs/aacenc/inc/quantize.h b/media/libstagefright/codecs/aacenc/inc/quantize.h index 88a95e1..7dac2bf 100644 --- a/media/libstagefright/codecs/aacenc/inc/quantize.h +++ b/media/libstagefright/codecs/aacenc/inc/quantize.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: quantize.h - - Content: Quantization functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: quantize.h + + Content: Quantization functions + *******************************************************************************/ #ifndef _QUANTIZE_H_ diff --git a/media/libstagefright/codecs/aacenc/inc/sf_estim.h b/media/libstagefright/codecs/aacenc/inc/sf_estim.h index b25ec3c..11436a2 100644 --- a/media/libstagefright/codecs/aacenc/inc/sf_estim.h +++ b/media/libstagefright/codecs/aacenc/inc/sf_estim.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: sf_estim.h - - Content: Scale factor estimation functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: sf_estim.h + + Content: Scale factor estimation functions + *******************************************************************************/ #ifndef __SF_ESTIM_H__ diff --git a/media/libstagefright/codecs/aacenc/inc/spreading.h b/media/libstagefright/codecs/aacenc/inc/spreading.h index 29cf63d..0c96fc7 100644 --- a/media/libstagefright/codecs/aacenc/inc/spreading.h +++ b/media/libstagefright/codecs/aacenc/inc/spreading.h @@ -1,29 +1,29 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: spreading.h - - Content: Spreading of energy functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: spreading.h + + Content: Spreading of energy functions + *******************************************************************************/ #ifndef _SPREADING_H #define _SPREADING_H #include "typedefs.h" - + void SpreadingMax(const Word16 pbCnt, const Word16 *maskLowFactor, diff --git a/media/libstagefright/codecs/aacenc/inc/stat_bits.h b/media/libstagefright/codecs/aacenc/inc/stat_bits.h index 6e90b9c..fff3d14 100644 --- a/media/libstagefright/codecs/aacenc/inc/stat_bits.h +++ b/media/libstagefright/codecs/aacenc/inc/stat_bits.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: stat_bits.h - - Content: Static bit counter functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: stat_bits.h + + Content: Static bit counter functions + *******************************************************************************/ #ifndef __STAT_BITS_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 */ diff --git a/media/libstagefright/codecs/aacenc/inc/tns.h b/media/libstagefright/codecs/aacenc/inc/tns.h index 9ffcce9..40cfaee 100644 --- a/media/libstagefright/codecs/aacenc/inc/tns.h +++ b/media/libstagefright/codecs/aacenc/inc/tns.h @@ -1,28 +1,28 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: tns.h - - Content: TNS structures - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: tns.h + + Content: TNS structures + *******************************************************************************/ #ifndef _TNS_H #define _TNS_H - + #include "typedef.h" #include "psy_const.h" diff --git a/media/libstagefright/codecs/aacenc/inc/tns_func.h b/media/libstagefright/codecs/aacenc/inc/tns_func.h index 58b75b6..02df24d 100644 --- a/media/libstagefright/codecs/aacenc/inc/tns_func.h +++ b/media/libstagefright/codecs/aacenc/inc/tns_func.h @@ -1,30 +1,30 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: tns_func.h - - Content: TNS functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: tns_func.h + + Content: TNS functions + *******************************************************************************/ /* Temporal noise shaping */ #ifndef _TNS_FUNC_H -#define _TNS_FUNC_H +#define _TNS_FUNC_H #include "typedef.h" #include "psy_configuration.h" diff --git a/media/libstagefright/codecs/aacenc/inc/tns_param.h b/media/libstagefright/codecs/aacenc/inc/tns_param.h index 26266ac..78265bb 100644 --- a/media/libstagefright/codecs/aacenc/inc/tns_param.h +++ b/media/libstagefright/codecs/aacenc/inc/tns_param.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: tns_param.h - - Content: TNS parameters - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: tns_param.h + + Content: TNS parameters + *******************************************************************************/ /* diff --git a/media/libstagefright/codecs/aacenc/inc/transform.h b/media/libstagefright/codecs/aacenc/inc/transform.h index 2666914..93d5ffe 100644 --- a/media/libstagefright/codecs/aacenc/inc/transform.h +++ b/media/libstagefright/codecs/aacenc/inc/transform.h @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: transform.h - - Content: MDCT Transform functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: transform.h + + Content: MDCT Transform functions + *******************************************************************************/ #ifndef __TRANSFORM_H__ diff --git a/media/libstagefright/codecs/aacenc/src/aac_rom.c b/media/libstagefright/codecs/aacenc/src/aac_rom.c index 2ce0352..16b44e0 100644 --- a/media/libstagefright/codecs/aacenc/src/aac_rom.c +++ b/media/libstagefright/codecs/aacenc/src/aac_rom.c @@ -1,358 +1,358 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: aac_rom.c - - Content: constant tables - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: aac_rom.c + + Content: constant tables + *******************************************************************************/ -#include "aac_rom.h" - -#if defined (ARMV5E) && !defined (ARMV7Neon) - -/* - * Q30 for 128 and 1024 - * - * for (i = 0; i < num/4; i++) { - * angle = (i + 0.125) * M_PI / num; - * x = cos(angle) * (1 << 30); - * x = sin(angle) * (1 << 30); - * - * angle = (num/2 - 1 - i + 0.125) * M_PI / num; - * x = cos(angle) * (1 << 30); - * x = sin(angle) * (1 << 30); - * } - */ -const int cossintab[128 + 1024] = { - /* 128 */ - 0x3fffec43, 0x003243f1, 0x015fd4d2, 0x3ffc38d1, 0x3ff9c13a, 0x01c454f5, 0x02f1b755, 0x3feea776, - 0x3fe9b8a9, 0x03562038, 0x0483259d, 0x3fd73a4a, 0x3fcfd50b, 0x04e767c5, 0x0613e1c5, 0x3fb5f4ea, - 0x3fac1a5b, 0x0677edbb, 0x07a3adff, 0x3f8adc77, 0x3f7e8e1e, 0x08077457, 0x09324ca7, 0x3f55f796, - 0x3f473759, 0x0995bdfd, 0x0abf8043, 0x3f174e70, 0x3f061e95, 0x0b228d42, 0x0c4b0b94, 0x3eceeaad, - 0x3ebb4ddb, 0x0cada4f5, 0x0dd4b19a, 0x3e7cd778, 0x3e66d0b4, 0x0e36c82a, 0x0f5c35a3, 0x3e212179, - 0x3e08b42a, 0x0fbdba40, 0x10e15b4e, 0x3dbbd6d4, 0x3da106bd, 0x11423ef0, 0x1263e699, 0x3d4d0728, - 0x3d2fd86c, 0x12c41a4f, 0x13e39be9, 0x3cd4c38b, 0x3cb53aaa, 0x144310dd, 0x15604013, 0x3c531e88, - 0x3c314060, 0x15bee78c, 0x16d99864, 0x3bc82c1f, 0x3ba3fde7, 0x173763c9, 0x184f6aab, 0x3b3401bb, - 0x3b0d8909, 0x18ac4b87, 0x19c17d44, 0x3a96b636, 0x3a6df8f8, 0x1a1d6544, 0x1b2f971e, 0x39f061d2, - 0x39c5664f, 0x1b8a7815, 0x1c997fc4, 0x39411e33, 0x3913eb0e, 0x1cf34baf, 0x1dfeff67, 0x38890663, - 0x3859a292, 0x1e57a86d, 0x1f5fdee6, 0x37c836c2, 0x3796a996, 0x1fb7575c, 0x20bbe7d8, 0x36fecd0e, - 0x36cb1e2a, 0x21122240, 0x2212e492, 0x362ce855, 0x35f71fb1, 0x2267d3a0, 0x2364a02e, 0x3552a8f4, - 0x351acedd, 0x23b836ca, 0x24b0e699, 0x34703095, 0x34364da6, 0x250317df, 0x25f78497, 0x3385a222, - 0x3349bf48, 0x264843d9, 0x273847c8, 0x329321c7, 0x32554840, 0x27878893, 0x2872feb6, 0x3198d4ea, - 0x31590e3e, 0x28c0b4d2, 0x29a778db, 0x3096e223, 0x30553828, 0x29f3984c, 0x2ad586a3, 0x2f8d713a, - 0x2f49ee0f, 0x2b2003ac, 0x2bfcf97c, 0x2e7cab1c, 0x2e37592c, 0x2c45c8a0, 0x2d1da3d5, 0x2d64b9da, - /* 1024 */ - 0x3fffffb1, 0x0006487f, 0x002bfb74, 0x3ffff0e3, 0x3fffe705, 0x00388c6e, 0x005e3f4c, 0x3fffba9b, - 0x3fffa6de, 0x006ad03b, 0x009082ea, 0x3fff5cd8, 0x3fff3f3c, 0x009d13c5, 0x00c2c62f, 0x3ffed79b, - 0x3ffeb021, 0x00cf56ef, 0x00f508fc, 0x3ffe2ae5, 0x3ffdf98c, 0x01019998, 0x01274b31, 0x3ffd56b5, - 0x3ffd1b7e, 0x0133dba3, 0x01598cb1, 0x3ffc5b0c, 0x3ffc15f7, 0x01661cf0, 0x018bcd5b, 0x3ffb37ec, - 0x3ffae8f9, 0x01985d60, 0x01be0d11, 0x3ff9ed53, 0x3ff99483, 0x01ca9cd4, 0x01f04bb4, 0x3ff87b44, - 0x3ff81896, 0x01fcdb2e, 0x02228924, 0x3ff6e1bf, 0x3ff67534, 0x022f184d, 0x0254c544, 0x3ff520c5, - 0x3ff4aa5d, 0x02615414, 0x0286fff3, 0x3ff33858, 0x3ff2b813, 0x02938e62, 0x02b93914, 0x3ff12878, - 0x3ff09e56, 0x02c5c71a, 0x02eb7086, 0x3feef126, 0x3fee5d28, 0x02f7fe1c, 0x031da62b, 0x3fec9265, - 0x3febf48b, 0x032a3349, 0x034fd9e5, 0x3fea0c35, 0x3fe96480, 0x035c6682, 0x03820b93, 0x3fe75e98, - 0x3fe6ad08, 0x038e97a9, 0x03b43b17, 0x3fe48990, 0x3fe3ce26, 0x03c0c69e, 0x03e66852, 0x3fe18d1f, - 0x3fe0c7da, 0x03f2f342, 0x04189326, 0x3fde6945, 0x3fdd9a27, 0x04251d77, 0x044abb73, 0x3fdb1e06, - 0x3fda450f, 0x0457451d, 0x047ce11a, 0x3fd7ab64, 0x3fd6c894, 0x04896a16, 0x04af03fc, 0x3fd4115f, - 0x3fd324b7, 0x04bb8c42, 0x04e123fa, 0x3fd04ffc, 0x3fcf597c, 0x04edab83, 0x051340f6, 0x3fcc673b, - 0x3fcb66e4, 0x051fc7b9, 0x05455ad1, 0x3fc8571f, 0x3fc74cf3, 0x0551e0c7, 0x0577716b, 0x3fc41fac, - 0x3fc30baa, 0x0583f68c, 0x05a984a6, 0x3fbfc0e3, 0x3fbea30c, 0x05b608eb, 0x05db9463, 0x3fbb3ac7, - 0x3fba131b, 0x05e817c3, 0x060da083, 0x3fb68d5b, 0x3fb55bdc, 0x061a22f7, 0x063fa8e7, 0x3fb1b8a2, - 0x3fb07d50, 0x064c2a67, 0x0671ad71, 0x3facbc9f, 0x3fab777b, 0x067e2df5, 0x06a3ae00, 0x3fa79954, - 0x3fa64a5f, 0x06b02d81, 0x06d5aa77, 0x3fa24ec6, 0x3fa0f600, 0x06e228ee, 0x0707a2b7, 0x3f9cdcf7, - 0x3f9b7a62, 0x0714201b, 0x073996a1, 0x3f9743eb, 0x3f95d787, 0x074612eb, 0x076b8616, 0x3f9183a5, - 0x3f900d72, 0x0778013d, 0x079d70f7, 0x3f8b9c28, 0x3f8a1c29, 0x07a9eaf5, 0x07cf5726, 0x3f858d79, - 0x3f8403ae, 0x07dbcff2, 0x08013883, 0x3f7f579b, 0x3f7dc405, 0x080db016, 0x083314f1, 0x3f78fa92, - 0x3f775d31, 0x083f8b43, 0x0864ec4f, 0x3f727661, 0x3f70cf38, 0x08716159, 0x0896be80, 0x3f6bcb0e, - 0x3f6a1a1c, 0x08a3323a, 0x08c88b65, 0x3f64f89b, 0x3f633de2, 0x08d4fdc6, 0x08fa52de, 0x3f5dff0e, - 0x3f5c3a8f, 0x0906c3e0, 0x092c14ce, 0x3f56de6a, 0x3f551026, 0x09388469, 0x095dd116, 0x3f4f96b4, - 0x3f4dbeac, 0x096a3f42, 0x098f8796, 0x3f4827f0, 0x3f464626, 0x099bf44c, 0x09c13831, 0x3f409223, - 0x3f3ea697, 0x09cda368, 0x09f2e2c7, 0x3f38d552, 0x3f36e006, 0x09ff4c78, 0x0a24873a, 0x3f30f181, - 0x3f2ef276, 0x0a30ef5e, 0x0a56256c, 0x3f28e6b6, 0x3f26ddec, 0x0a628bfa, 0x0a87bd3d, 0x3f20b4f5, - 0x3f1ea26e, 0x0a94222f, 0x0ab94e8f, 0x3f185c43, 0x3f164001, 0x0ac5b1dc, 0x0aead944, 0x3f0fdca5, - 0x3f0db6a9, 0x0af73ae5, 0x0b1c5d3d, 0x3f073621, 0x3f05066d, 0x0b28bd2a, 0x0b4dda5c, 0x3efe68bc, - 0x3efc2f50, 0x0b5a388d, 0x0b7f5081, 0x3ef5747b, 0x3ef3315a, 0x0b8bacf0, 0x0bb0bf8f, 0x3eec5965, - 0x3eea0c8e, 0x0bbd1a33, 0x0be22766, 0x3ee3177e, 0x3ee0c0f4, 0x0bee8038, 0x0c1387e9, 0x3ed9aecc, - 0x3ed74e91, 0x0c1fdee1, 0x0c44e0f9, 0x3ed01f55, 0x3ecdb56a, 0x0c513610, 0x0c763278, 0x3ec66920, - 0x3ec3f585, 0x0c8285a5, 0x0ca77c47, 0x3ebc8c31, 0x3eba0ee9, 0x0cb3cd84, 0x0cd8be47, 0x3eb2888f, - 0x3eb0019c, 0x0ce50d8c, 0x0d09f85b, 0x3ea85e41, 0x3ea5cda3, 0x0d1645a0, 0x0d3b2a64, 0x3e9e0d4c, - 0x3e9b7306, 0x0d4775a1, 0x0d6c5443, 0x3e9395b7, 0x3e90f1ca, 0x0d789d71, 0x0d9d75db, 0x3e88f788, - 0x3e8649f5, 0x0da9bcf2, 0x0dce8f0d, 0x3e7e32c6, 0x3e7b7b90, 0x0ddad406, 0x0dff9fba, 0x3e734778, - 0x3e70869f, 0x0e0be28e, 0x0e30a7c5, 0x3e6835a4, 0x3e656b2b, 0x0e3ce86b, 0x0e61a70f, 0x3e5cfd51, - 0x3e5a2939, 0x0e6de580, 0x0e929d7a, 0x3e519e86, 0x3e4ec0d1, 0x0e9ed9af, 0x0ec38ae8, 0x3e46194a, - 0x3e4331fa, 0x0ecfc4d9, 0x0ef46f3b, 0x3e3a6da4, 0x3e377cbb, 0x0f00a6df, 0x0f254a53, 0x3e2e9b9c, - 0x3e2ba11b, 0x0f317fa5, 0x0f561c15, 0x3e22a338, 0x3e1f9f21, 0x0f624f0c, 0x0f86e460, 0x3e168480, - 0x3e1376d5, 0x0f9314f5, 0x0fb7a317, 0x3e0a3f7b, 0x3e07283f, 0x0fc3d143, 0x0fe8581d, 0x3dfdd432, - 0x3dfab365, 0x0ff483d7, 0x10190352, 0x3df142ab, 0x3dee1851, 0x10252c94, 0x1049a49a, 0x3de48aef, - 0x3de15708, 0x1055cb5b, 0x107a3bd5, 0x3dd7ad05, 0x3dd46f94, 0x1086600e, 0x10aac8e6, 0x3dcaa8f5, - 0x3dc761fc, 0x10b6ea90, 0x10db4baf, 0x3dbd7ec7, 0x3dba2e48, 0x10e76ac3, 0x110bc413, 0x3db02e84, - 0x3dacd481, 0x1117e088, 0x113c31f3, 0x3da2b834, 0x3d9f54af, 0x11484bc2, 0x116c9531, 0x3d951bde, - 0x3d91aed9, 0x1178ac53, 0x119cedaf, 0x3d87598c, 0x3d83e309, 0x11a9021d, 0x11cd3b50, 0x3d797145, - 0x3d75f147, 0x11d94d02, 0x11fd7df6, 0x3d6b6313, 0x3d67d99b, 0x12098ce5, 0x122db583, 0x3d5d2efe, - 0x3d599c0e, 0x1239c1a7, 0x125de1da, 0x3d4ed50f, 0x3d4b38aa, 0x1269eb2b, 0x128e02dc, 0x3d40554e, - 0x3d3caf76, 0x129a0954, 0x12be186c, 0x3d31afc5, 0x3d2e007c, 0x12ca1c03, 0x12ee226c, 0x3d22e47c, - 0x3d1f2bc5, 0x12fa231b, 0x131e20c0, 0x3d13f37e, 0x3d10315a, 0x132a1e7e, 0x134e1348, 0x3d04dcd2, - 0x3d011145, 0x135a0e0e, 0x137df9e7, 0x3cf5a082, 0x3cf1cb8e, 0x1389f1af, 0x13add481, 0x3ce63e98, - 0x3ce2603f, 0x13b9c943, 0x13dda2f7, 0x3cd6b71e, 0x3cd2cf62, 0x13e994ab, 0x140d652c, 0x3cc70a1c, - 0x3cc318ff, 0x141953cb, 0x143d1b02, 0x3cb7379c, 0x3cb33d22, 0x14490685, 0x146cc45c, 0x3ca73fa9, - 0x3ca33bd3, 0x1478acbc, 0x149c611d, 0x3c97224c, 0x3c93151d, 0x14a84652, 0x14cbf127, 0x3c86df8e, - 0x3c82c909, 0x14d7d32a, 0x14fb745e, 0x3c76777b, 0x3c7257a2, 0x15075327, 0x152aeaa3, 0x3c65ea1c, - 0x3c61c0f1, 0x1536c62b, 0x155a53d9, 0x3c55377b, 0x3c510501, 0x15662c18, 0x1589afe3, 0x3c445fa2, - 0x3c4023dd, 0x159584d3, 0x15b8fea4, 0x3c33629d, 0x3c2f1d8e, 0x15c4d03e, 0x15e83fff, 0x3c224075, - 0x3c1df21f, 0x15f40e3a, 0x161773d6, 0x3c10f935, 0x3c0ca19b, 0x16233eac, 0x16469a0d, 0x3bff8ce8, - 0x3bfb2c0c, 0x16526176, 0x1675b286, 0x3bedfb99, 0x3be9917e, 0x1681767c, 0x16a4bd25, 0x3bdc4552, - 0x3bd7d1fa, 0x16b07d9f, 0x16d3b9cc, 0x3bca6a1d, 0x3bc5ed8d, 0x16df76c3, 0x1702a85e, 0x3bb86a08, - 0x3bb3e440, 0x170e61cc, 0x173188be, 0x3ba6451b, 0x3ba1b620, 0x173d3e9b, 0x17605ad0, 0x3b93fb63, - 0x3b8f6337, 0x176c0d15, 0x178f1e76, 0x3b818ceb, 0x3b7ceb90, 0x179acd1c, 0x17bdd394, 0x3b6ef9be, - 0x3b6a4f38, 0x17c97e93, 0x17ec7a0d, 0x3b5c41e8, 0x3b578e39, 0x17f8215e, 0x181b11c4, 0x3b496574, - 0x3b44a8a0, 0x1826b561, 0x18499a9d, 0x3b36646e, 0x3b319e77, 0x18553a7d, 0x1878147a, 0x3b233ee1, - 0x3b1e6fca, 0x1883b097, 0x18a67f3f, 0x3b0ff4d9, 0x3b0b1ca6, 0x18b21791, 0x18d4dad0, 0x3afc8663, - 0x3af7a516, 0x18e06f50, 0x1903270f, 0x3ae8f38b, 0x3ae40926, 0x190eb7b7, 0x193163e1, 0x3ad53c5b, - 0x3ad048e3, 0x193cf0a9, 0x195f9128, 0x3ac160e1, 0x3abc6458, 0x196b1a09, 0x198daec8, 0x3aad6129, - 0x3aa85b92, 0x199933bb, 0x19bbbca6, 0x3a993d3e, 0x3a942e9d, 0x19c73da3, 0x19e9baa3, 0x3a84f52f, - 0x3a7fdd86, 0x19f537a4, 0x1a17a8a5, 0x3a708906, 0x3a6b6859, 0x1a2321a2, 0x1a45868e, 0x3a5bf8d1, - 0x3a56cf23, 0x1a50fb81, 0x1a735442, 0x3a47449c, 0x3a4211f0, 0x1a7ec524, 0x1aa111a6, 0x3a326c74, - 0x3a2d30cd, 0x1aac7e6f, 0x1acebe9d, 0x3a1d7066, 0x3a182bc8, 0x1ada2746, 0x1afc5b0a, 0x3a08507f, - 0x3a0302ed, 0x1b07bf8c, 0x1b29e6d2, 0x39f30ccc, 0x39edb649, 0x1b354727, 0x1b5761d8, 0x39dda55a, - 0x39d845e9, 0x1b62bdf8, 0x1b84cc01, 0x39c81a36, 0x39c2b1da, 0x1b9023e5, 0x1bb22530, 0x39b26b6d, - 0x39acfa2b, 0x1bbd78d2, 0x1bdf6d4a, 0x399c990d, 0x39971ee7, 0x1beabca1, 0x1c0ca432, 0x3986a324, - 0x3981201e, 0x1c17ef39, 0x1c39c9cd, 0x397089bf, 0x396afddc, 0x1c45107c, 0x1c66ddfe, 0x395a4ceb, - 0x3954b82e, 0x1c72204f, 0x1c93e0ab, 0x3943ecb6, 0x393e4f23, 0x1c9f1e96, 0x1cc0d1b6, 0x392d692f, - 0x3927c2c9, 0x1ccc0b35, 0x1cedb106, 0x3916c262, 0x3911132d, 0x1cf8e611, 0x1d1a7e7d, 0x38fff85e, - 0x38fa405e, 0x1d25af0d, 0x1d473a00, 0x38e90b31, 0x38e34a69, 0x1d52660f, 0x1d73e374, 0x38d1fae9, - 0x38cc315d, 0x1d7f0afb, 0x1da07abc, 0x38bac795, 0x38b4f547, 0x1dab9db5, 0x1dccffbf, 0x38a37142, - 0x389d9637, 0x1dd81e21, 0x1df9725f, 0x388bf7ff, 0x3886143b, 0x1e048c24, 0x1e25d282, 0x38745bdb, - 0x386e6f60, 0x1e30e7a4, 0x1e52200c, 0x385c9ce3, 0x3856a7b6, 0x1e5d3084, 0x1e7e5ae2, 0x3844bb28, - 0x383ebd4c, 0x1e8966a8, 0x1eaa82e9, 0x382cb6b7, 0x3826b030, 0x1eb589f7, 0x1ed69805, 0x38148f9f, - 0x380e8071, 0x1ee19a54, 0x1f029a1c, 0x37fc45ef, 0x37f62e1d, 0x1f0d97a5, 0x1f2e8911, 0x37e3d9b7, - 0x37ddb945, 0x1f3981ce, 0x1f5a64cb, 0x37cb4b04, 0x37c521f6, 0x1f6558b5, 0x1f862d2d, 0x37b299e7, - 0x37ac6841, 0x1f911c3d, 0x1fb1e21d, 0x3799c66f, 0x37938c34, 0x1fbccc4d, 0x1fdd8381, 0x3780d0aa, - 0x377a8ddf, 0x1fe868c8, 0x2009113c, 0x3767b8a9, 0x37616d51, 0x2013f196, 0x20348b35, 0x374e7e7b, - 0x37482a9a, 0x203f6699, 0x205ff14f, 0x3735222f, 0x372ec5c9, 0x206ac7b8, 0x208b4372, 0x371ba3d4, - 0x37153eee, 0x209614d9, 0x20b68181, 0x3702037c, 0x36fb9618, 0x20c14ddf, 0x20e1ab63, 0x36e84135, - 0x36e1cb58, 0x20ec72b1, 0x210cc0fc, 0x36ce5d10, 0x36c7debd, 0x21178334, 0x2137c232, 0x36b4571b, - 0x36add058, 0x21427f4d, 0x2162aeea, 0x369a2f69, 0x3693a038, 0x216d66e2, 0x218d870b, 0x367fe608, - 0x36794e6e, 0x219839d8, 0x21b84a79, 0x36657b08, 0x365edb09, 0x21c2f815, 0x21e2f91a, 0x364aee7b, - 0x3644461b, 0x21eda17f, 0x220d92d4, 0x36304070, 0x36298fb4, 0x221835fb, 0x2238178d, 0x361570f8, - 0x360eb7e3, 0x2242b56f, 0x22628729, 0x35fa8023, 0x35f3beba, 0x226d1fc1, 0x228ce191, 0x35df6e03, - 0x35d8a449, 0x229774d7, 0x22b726a8, 0x35c43aa7, 0x35bd68a1, 0x22c1b496, 0x22e15655, 0x35a8e621, - 0x35a20bd3, 0x22ebdee5, 0x230b707e, 0x358d7081, 0x35868def, 0x2315f3a8, 0x23357509, 0x3571d9d9, - 0x356aef08, 0x233ff2c8, 0x235f63dc, 0x35562239, 0x354f2f2c, 0x2369dc29, 0x23893cdd, 0x353a49b2, - 0x35334e6f, 0x2393afb2, 0x23b2fff3, 0x351e5056, 0x35174ce0, 0x23bd6d48, 0x23dcad03, 0x35023636, - 0x34fb2a92, 0x23e714d3, 0x240643f4, 0x34e5fb63, 0x34dee795, 0x2410a639, 0x242fc4ad, 0x34c99fef, - 0x34c283fb, 0x243a215f, 0x24592f13, 0x34ad23eb, 0x34a5ffd5, 0x2463862c, 0x2482830d, 0x34908768, - 0x34895b36, 0x248cd487, 0x24abc082, 0x3473ca79, 0x346c962f, 0x24b60c57, 0x24d4e757, 0x3456ed2f, - 0x344fb0d1, 0x24df2d81, 0x24fdf775, 0x3439ef9c, 0x3432ab2e, 0x250837ed, 0x2526f0c1, 0x341cd1d2, - 0x34158559, 0x25312b81, 0x254fd323, 0x33ff93e2, 0x33f83f62, 0x255a0823, 0x25789e80, 0x33e235df, - 0x33dad95e, 0x2582cdbc, 0x25a152c0, 0x33c4b7db, 0x33bd535c, 0x25ab7c30, 0x25c9efca, 0x33a719e8, - 0x339fad70, 0x25d41369, 0x25f27584, 0x33895c18, 0x3381e7ac, 0x25fc934b, 0x261ae3d6, 0x336b7e7e, - 0x33640223, 0x2624fbbf, 0x26433aa7, 0x334d812d, 0x3345fce6, 0x264d4cac, 0x266b79dd, 0x332f6435, - 0x3327d808, 0x267585f8, 0x2693a161, 0x331127ab, 0x3309939c, 0x269da78b, 0x26bbb119, 0x32f2cba1, - 0x32eb2fb5, 0x26c5b14c, 0x26e3a8ec, 0x32d45029, 0x32ccac64, 0x26eda322, 0x270b88c2, 0x32b5b557, - 0x32ae09be, 0x27157cf5, 0x27335082, 0x3296fb3d, 0x328f47d5, 0x273d3eac, 0x275b0014, 0x327821ee, - 0x327066bc, 0x2764e82f, 0x27829760, 0x3259297d, 0x32516686, 0x278c7965, 0x27aa164c, 0x323a11fe, - 0x32324746, 0x27b3f235, 0x27d17cc1, 0x321adb83, 0x3213090f, 0x27db5288, 0x27f8caa5, 0x31fb8620, - 0x31f3abf5, 0x28029a45, 0x281fffe2, 0x31dc11e8, 0x31d4300b, 0x2829c954, 0x28471c5e, 0x31bc7eee, - 0x31b49564, 0x2850df9d, 0x286e2002, 0x319ccd46, 0x3194dc14, 0x2877dd07, 0x28950ab6, 0x317cfd04, - 0x3175042e, 0x289ec17a, 0x28bbdc61, 0x315d0e3b, 0x31550dc6, 0x28c58cdf, 0x28e294eb, 0x313d00ff, - 0x3134f8f1, 0x28ec3f1e, 0x2909343e, 0x311cd564, 0x3114c5c0, 0x2912d81f, 0x292fba40, 0x30fc8b7d, - 0x30f47449, 0x293957c9, 0x295626da, 0x30dc235e, 0x30d404a0, 0x295fbe06, 0x297c79f5, 0x30bb9d1c, - 0x30b376d8, 0x29860abd, 0x29a2b378, 0x309af8ca, 0x3092cb05, 0x29ac3dd7, 0x29c8d34d, 0x307a367c, - 0x3072013c, 0x29d2573c, 0x29eed95b, 0x30595648, 0x30511991, 0x29f856d5, 0x2a14c58b, 0x30385840, - 0x30301418, 0x2a1e3c8a, 0x2a3a97c7, 0x30173c7a, 0x300ef0e5, 0x2a440844, 0x2a604ff5, 0x2ff6030a, - 0x2fedb00d, 0x2a69b9ec, 0x2a85ee00, 0x2fd4ac04, 0x2fcc51a5, 0x2a8f516b, 0x2aab71d0, 0x2fb3377c, - 0x2faad5c1, 0x2ab4cea9, 0x2ad0db4e, 0x2f91a589, 0x2f893c75, 0x2ada318e, 0x2af62a63, 0x2f6ff63d, - 0x2f6785d7, 0x2aff7a05, 0x2b1b5ef8, 0x2f4e29af, 0x2f45b1fb, 0x2b24a7f6, 0x2b4078f5, 0x2f2c3ff2, - 0x2f23c0f6, 0x2b49bb4a, 0x2b657844, 0x2f0a391d, 0x2f01b2de, 0x2b6eb3ea, 0x2b8a5cce, 0x2ee81543, - 0x2edf87c6, 0x2b9391c0, 0x2baf267d, 0x2ec5d479, 0x2ebd3fc4, 0x2bb854b4, 0x2bd3d53a, 0x2ea376d6, - 0x2e9adaee, 0x2bdcfcb0, 0x2bf868ed, 0x2e80fc6e, 0x2e785958, 0x2c01899e, 0x2c1ce181, 0x2e5e6556, - 0x2e55bb17, 0x2c25fb66, 0x2c413edf, 0x2e3bb1a4, 0x2e330042, 0x2c4a51f3, 0x2c6580f1, 0x2e18e16d, - 0x2e1028ed, 0x2c6e8d2e, 0x2c89a79f, 0x2df5f4c7, 0x2ded352f, 0x2c92ad01, 0x2cadb2d5, 0x2dd2ebc7, - 0x2dca251c, 0x2cb6b155, 0x2cd1a27b, 0x2dafc683, 0x2da6f8ca, 0x2cda9a14, 0x2cf5767c, 0x2d8c8510, - 0x2d83b04f, 0x2cfe6728, 0x2d192ec1, 0x2d692784, 0x2d604bc0, 0x2d22187a, 0x2d3ccb34, 0x2d45adf6 -}; - - -const int twidTab512[(8*6 + 32*6 + 128*6)/2] = { - 0x40000000, 0x40000000, 0x40000000, 0x3b20187d, - 0x3ec50c7c, 0x3536238e, 0x2d412d41, 0x3b20187d, - 0x187d3b20, 0x187d3b20, 0x3536238e, 0xf3843ec5, - 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xe7833b20, - 0x238e3536, 0xc13b0c7c, 0xd2bf2d41, 0x187d3b20, - 0xc4e0e783, 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, - - 0x40000000, 0x40000000, 0x40000000, 0x3fb10645, - 0x3fec0323, 0x3f4e0964, 0x3ec50c7c, 0x3fb10645, - 0x3d3e1294, 0x3d3e1294, 0x3f4e0964, 0x39da1b5d, - 0x3b20187d, 0x3ec50c7c, 0x3536238e, 0x38711e2b, - 0x3e140f8c, 0x2f6b2afa, 0x3536238e, 0x3d3e1294, - 0x28993179, 0x31792899, 0x3c42158f, 0x20e736e5, - 0x2d412d41, 0x3b20187d, 0x187d3b20, 0x28993179, - 0x39da1b5d, 0x0f8c3e14, 0x238e3536, 0x38711e2b, - 0x06453fb1, 0x1e2b3871, 0x36e520e7, 0xfcdd3fec, - 0x187d3b20, 0x3536238e, 0xf3843ec5, 0x12943d3e, - 0x3367261f, 0xea713c42, 0x0c7c3ec5, 0x31792899, - 0xe1d53871, 0x06453fb1, 0x2f6b2afa, 0xd9e13367, - 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xf9bb3fb1, - 0x2afa2f6b, 0xcc99261f, 0xf3843ec5, 0x28993179, - 0xc78f1e2b, 0xed6c3d3e, 0x261f3367, 0xc3be158f, - 0xe7833b20, 0x238e3536, 0xc13b0c7c, 0xe1d53871, - 0x20e736e5, 0xc0140323, 0xdc723536, 0x1e2b3871, - 0xc04ff9bb, 0xd7673179, 0x1b5d39da, 0xc1ecf074, - 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xce872899, - 0x158f3c42, 0xc91bdf19, 0xcaca238e, 0x12943d3e, - 0xce87d767, 0xc78f1e2b, 0x0f8c3e14, 0xd506d095, - 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 0xc2c21294, - 0x09643f4e, 0xe4a3c626, 0xc13b0c7c, 0x06453fb1, - 0xed6cc2c2, 0xc04f0645, 0x03233fec, 0xf69cc0b2, - - 0x40000000, 0x40000000, 0x40000000, 0x3ffb0192, - 0x3ffe00c9, 0x3ff4025b, 0x3fec0323, 0x3ffb0192, - 0x3fd304b5, 0x3fd304b5, 0x3ff4025b, 0x3f9c070d, - 0x3fb10645, 0x3fec0323, 0x3f4e0964, 0x3f8407d5, - 0x3fe103ec, 0x3eeb0bb6, 0x3f4e0964, 0x3fd304b5, - 0x3e710e05, 0x3f0e0af1, 0x3fc3057d, 0x3de2104f, - 0x3ec50c7c, 0x3fb10645, 0x3d3e1294, 0x3e710e05, - 0x3f9c070d, 0x3c8414d1, 0x3e140f8c, 0x3f8407d5, - 0x3bb61708, 0x3dae1111, 0x3f6a089c, 0x3ad21937, - 0x3d3e1294, 0x3f4e0964, 0x39da1b5d, 0x3cc51413, - 0x3f2f0a2a, 0x38cf1d79, 0x3c42158f, 0x3f0e0af1, - 0x37af1f8b, 0x3bb61708, 0x3eeb0bb6, 0x367c2192, - 0x3b20187d, 0x3ec50c7c, 0x3536238e, 0x3a8219ef, - 0x3e9c0d41, 0x33de257d, 0x39da1b5d, 0x3e710e05, - 0x3274275f, 0x392a1cc6, 0x3e440ec9, 0x30f82934, - 0x38711e2b, 0x3e140f8c, 0x2f6b2afa, 0x37af1f8b, - 0x3de2104f, 0x2dce2cb2, 0x36e520e7, 0x3dae1111, - 0x2c212e5a, 0x3612223d, 0x3d7711d3, 0x2a652ff1, - 0x3536238e, 0x3d3e1294, 0x28993179, 0x345324da, - 0x3d021354, 0x26c032ee, 0x3367261f, 0x3cc51413, - 0x24da3453, 0x3274275f, 0x3c8414d1, 0x22e635a5, - 0x31792899, 0x3c42158f, 0x20e736e5, 0x307629cd, - 0x3bfd164c, 0x1edc3811, 0x2f6b2afa, 0x3bb61708, - 0x1cc6392a, 0x2e5a2c21, 0x3b6c17c3, 0x1aa63a2f, - 0x2d412d41, 0x3b20187d, 0x187d3b20, 0x2c212e5a, - 0x3ad21937, 0x164c3bfd, 0x2afa2f6b, 0x3a8219ef, - 0x14133cc5, 0x29cd3076, 0x3a2f1aa6, 0x11d33d77, - 0x28993179, 0x39da1b5d, 0x0f8c3e14, 0x275f3274, - 0x39831c12, 0x0d413e9c, 0x261f3367, 0x392a1cc6, - 0x0af13f0e, 0x24da3453, 0x38cf1d79, 0x089c3f6a, - 0x238e3536, 0x38711e2b, 0x06453fb1, 0x223d3612, - 0x38111edc, 0x03ec3fe1, 0x20e736e5, 0x37af1f8b, - 0x01923ffb, 0x1f8b37af, 0x374b2039, 0xff373ffe, - 0x1e2b3871, 0x36e520e7, 0xfcdd3fec, 0x1cc6392a, - 0x367c2192, 0xfa833fc3, 0x1b5d39da, 0x3612223d, - 0xf82b3f84, 0x19ef3a82, 0x35a522e6, 0xf5d63f2f, - 0x187d3b20, 0x3536238e, 0xf3843ec5, 0x17083bb6, - 0x34c62434, 0xf1373e44, 0x158f3c42, 0x345324da, - 0xeeef3dae, 0x14133cc5, 0x33de257d, 0xecac3d02, - 0x12943d3e, 0x3367261f, 0xea713c42, 0x11113dae, - 0x32ee26c0, 0xe83d3b6c, 0x0f8c3e14, 0x3274275f, - 0xe6113a82, 0x0e053e71, 0x31f727fd, 0xe3ee3983, - 0x0c7c3ec5, 0x31792899, 0xe1d53871, 0x0af13f0e, - 0x30f82934, 0xdfc7374b, 0x09643f4e, 0x307629cd, - 0xddc33612, 0x07d53f84, 0x2ff12a65, 0xdbcc34c6, - 0x06453fb1, 0x2f6b2afa, 0xd9e13367, 0x04b53fd3, - 0x2ee32b8e, 0xd80331f7, 0x03233fec, 0x2e5a2c21, - 0xd6333076, 0x01923ffb, 0x2dce2cb2, 0xd4722ee3, - 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xfe6e3ffb, - 0x2cb22dce, 0xd11d2b8e, 0xfcdd3fec, 0x2c212e5a, - 0xcf8a29cd, 0xfb4b3fd3, 0x2b8e2ee3, 0xce0927fd, - 0xf9bb3fb1, 0x2afa2f6b, 0xcc99261f, 0xf82b3f84, - 0x2a652ff1, 0xcb3a2434, 0xf69c3f4e, 0x29cd3076, - 0xc9ee223d, 0xf50f3f0e, 0x293430f8, 0xc8b52039, - 0xf3843ec5, 0x28993179, 0xc78f1e2b, 0xf1fb3e71, - 0x27fd31f7, 0xc67d1c12, 0xf0743e14, 0x275f3274, - 0xc57e19ef, 0xeeef3dae, 0x26c032ee, 0xc49417c3, - 0xed6c3d3e, 0x261f3367, 0xc3be158f, 0xebed3cc5, - 0x257d33de, 0xc2fe1354, 0xea713c42, 0x24da3453, - 0xc2521111, 0xe8f83bb6, 0x243434c6, 0xc1bc0ec9, - 0xe7833b20, 0x238e3536, 0xc13b0c7c, 0xe6113a82, - 0x22e635a5, 0xc0d10a2a, 0xe4a339da, 0x223d3612, - 0xc07c07d5, 0xe33a392a, 0x2192367c, 0xc03d057d, - 0xe1d53871, 0x20e736e5, 0xc0140323, 0xe07537af, - 0x2039374b, 0xc00200c9, 0xdf1936e5, 0x1f8b37af, - 0xc005fe6e, 0xddc33612, 0x1edc3811, 0xc01ffc14, - 0xdc723536, 0x1e2b3871, 0xc04ff9bb, 0xdb263453, - 0x1d7938cf, 0xc096f764, 0xd9e13367, 0x1cc6392a, - 0xc0f2f50f, 0xd8a13274, 0x1c123983, 0xc164f2bf, - 0xd7673179, 0x1b5d39da, 0xc1ecf074, 0xd6333076, - 0x1aa63a2f, 0xc289ee2d, 0xd5062f6b, 0x19ef3a82, - 0xc33bebed, 0xd3df2e5a, 0x19373ad2, 0xc403e9b4, - 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xd1a62c21, - 0x17c33b6c, 0xc5d1e55a, 0xd0952afa, 0x17083bb6, - 0xc6d6e33a, 0xcf8a29cd, 0x164c3bfd, 0xc7efe124, - 0xce872899, 0x158f3c42, 0xc91bdf19, 0xcd8c275f, - 0x14d13c84, 0xca5bdd1a, 0xcc99261f, 0x14133cc5, - 0xcbaddb26, 0xcbad24da, 0x13543d02, 0xcd12d940, - 0xcaca238e, 0x12943d3e, 0xce87d767, 0xc9ee223d, - 0x11d33d77, 0xd00fd59b, 0xc91b20e7, 0x11113dae, - 0xd1a6d3df, 0xc8511f8b, 0x104f3de2, 0xd34ed232, - 0xc78f1e2b, 0x0f8c3e14, 0xd506d095, 0xc6d61cc6, - 0x0ec93e44, 0xd6cccf08, 0xc6261b5d, 0x0e053e71, - 0xd8a1cd8c, 0xc57e19ef, 0x0d413e9c, 0xda83cc22, - 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 0xc44a1708, - 0x0bb63eeb, 0xde6ec984, 0xc3be158f, 0x0af13f0e, - 0xe075c851, 0xc33b1413, 0x0a2a3f2f, 0xe287c731, - 0xc2c21294, 0x09643f4e, 0xe4a3c626, 0xc2521111, - 0x089c3f6a, 0xe6c9c52e, 0xc1ec0f8c, 0x07d53f84, - 0xe8f8c44a, 0xc18f0e05, 0x070d3f9c, 0xeb2fc37c, - 0xc13b0c7c, 0x06453fb1, 0xed6cc2c2, 0xc0f20af1, - 0x057d3fc3, 0xefb1c21e, 0xc0b20964, 0x04b53fd3, - 0xf1fbc18f, 0xc07c07d5, 0x03ec3fe1, 0xf44ac115, - 0xc04f0645, 0x03233fec, 0xf69cc0b2, 0xc02d04b5, - 0x025b3ff4, 0xf8f3c064, 0xc0140323, 0x01923ffb, - 0xfb4bc02d, 0xc0050192, 0x00c93ffe, 0xfda5c00c -}; - -const int twidTab64[(4*6 + 16*6)/2] = { - 0x40000000, 0x40000000, 0x40000000, 0x2d412d41, - 0x3b20187d, 0x187d3b20, 0x00004000, 0x2d412d41, - 0xd2bf2d41, 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, - - 0x40000000, 0x40000000, 0x40000000, 0x3ec50c7c, - 0x3fb10645, 0x3d3e1294, 0x3b20187d, 0x3ec50c7c, - 0x3536238e, 0x3536238e, 0x3d3e1294, 0x28993179, - 0x2d412d41, 0x3b20187d, 0x187d3b20, 0x238e3536, - 0x38711e2b, 0x06453fb1, 0x187d3b20, 0x3536238e, - 0xf3843ec5, 0x0c7c3ec5, 0x31792899, 0xe1d53871, - 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xf3843ec5, - 0x28993179, 0xc78f1e2b, 0xe7833b20, 0x238e3536, - 0xc13b0c7c, 0xdc723536, 0x1e2b3871, 0xc04ff9bb, - 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xcaca238e, - 0x12943d3e, 0xce87d767, 0xc4e0187d, 0x0c7c3ec5, - 0xdc72caca, 0xc13b0c7c, 0x06453fb1, 0xed6cc2c2 -}; - -#elif defined ARMV7Neon -/* - * Q29 for 128 and 1024 - * - * for (i = 0; i < num/4; i++) { - * angle = (i + 0.125) * M_PI / num; - * x = cos(angle) * (1 << 29); - * x = sin(angle) * (1 << 29); - * - * angle = (num/2 - 1 - i + 0.125) * M_PI / num; - * x = cos(angle) * (1 << 29); - * x = sin(angle) * (1 << 29); - * } - */ -const int cossintab[128 + 1024] = { - /* 128 */ +#include "aac_rom.h" + +#if defined (ARMV5E) && !defined (ARMV7Neon) + +/* + * Q30 for 128 and 1024 + * + * for (i = 0; i < num/4; i++) { + * angle = (i + 0.125) * M_PI / num; + * x = cos(angle) * (1 << 30); + * x = sin(angle) * (1 << 30); + * + * angle = (num/2 - 1 - i + 0.125) * M_PI / num; + * x = cos(angle) * (1 << 30); + * x = sin(angle) * (1 << 30); + * } + */ +const int cossintab[128 + 1024] = { + /* 128 */ + 0x3fffec43, 0x003243f1, 0x015fd4d2, 0x3ffc38d1, 0x3ff9c13a, 0x01c454f5, 0x02f1b755, 0x3feea776, + 0x3fe9b8a9, 0x03562038, 0x0483259d, 0x3fd73a4a, 0x3fcfd50b, 0x04e767c5, 0x0613e1c5, 0x3fb5f4ea, + 0x3fac1a5b, 0x0677edbb, 0x07a3adff, 0x3f8adc77, 0x3f7e8e1e, 0x08077457, 0x09324ca7, 0x3f55f796, + 0x3f473759, 0x0995bdfd, 0x0abf8043, 0x3f174e70, 0x3f061e95, 0x0b228d42, 0x0c4b0b94, 0x3eceeaad, + 0x3ebb4ddb, 0x0cada4f5, 0x0dd4b19a, 0x3e7cd778, 0x3e66d0b4, 0x0e36c82a, 0x0f5c35a3, 0x3e212179, + 0x3e08b42a, 0x0fbdba40, 0x10e15b4e, 0x3dbbd6d4, 0x3da106bd, 0x11423ef0, 0x1263e699, 0x3d4d0728, + 0x3d2fd86c, 0x12c41a4f, 0x13e39be9, 0x3cd4c38b, 0x3cb53aaa, 0x144310dd, 0x15604013, 0x3c531e88, + 0x3c314060, 0x15bee78c, 0x16d99864, 0x3bc82c1f, 0x3ba3fde7, 0x173763c9, 0x184f6aab, 0x3b3401bb, + 0x3b0d8909, 0x18ac4b87, 0x19c17d44, 0x3a96b636, 0x3a6df8f8, 0x1a1d6544, 0x1b2f971e, 0x39f061d2, + 0x39c5664f, 0x1b8a7815, 0x1c997fc4, 0x39411e33, 0x3913eb0e, 0x1cf34baf, 0x1dfeff67, 0x38890663, + 0x3859a292, 0x1e57a86d, 0x1f5fdee6, 0x37c836c2, 0x3796a996, 0x1fb7575c, 0x20bbe7d8, 0x36fecd0e, + 0x36cb1e2a, 0x21122240, 0x2212e492, 0x362ce855, 0x35f71fb1, 0x2267d3a0, 0x2364a02e, 0x3552a8f4, + 0x351acedd, 0x23b836ca, 0x24b0e699, 0x34703095, 0x34364da6, 0x250317df, 0x25f78497, 0x3385a222, + 0x3349bf48, 0x264843d9, 0x273847c8, 0x329321c7, 0x32554840, 0x27878893, 0x2872feb6, 0x3198d4ea, + 0x31590e3e, 0x28c0b4d2, 0x29a778db, 0x3096e223, 0x30553828, 0x29f3984c, 0x2ad586a3, 0x2f8d713a, + 0x2f49ee0f, 0x2b2003ac, 0x2bfcf97c, 0x2e7cab1c, 0x2e37592c, 0x2c45c8a0, 0x2d1da3d5, 0x2d64b9da, + /* 1024 */ + 0x3fffffb1, 0x0006487f, 0x002bfb74, 0x3ffff0e3, 0x3fffe705, 0x00388c6e, 0x005e3f4c, 0x3fffba9b, + 0x3fffa6de, 0x006ad03b, 0x009082ea, 0x3fff5cd8, 0x3fff3f3c, 0x009d13c5, 0x00c2c62f, 0x3ffed79b, + 0x3ffeb021, 0x00cf56ef, 0x00f508fc, 0x3ffe2ae5, 0x3ffdf98c, 0x01019998, 0x01274b31, 0x3ffd56b5, + 0x3ffd1b7e, 0x0133dba3, 0x01598cb1, 0x3ffc5b0c, 0x3ffc15f7, 0x01661cf0, 0x018bcd5b, 0x3ffb37ec, + 0x3ffae8f9, 0x01985d60, 0x01be0d11, 0x3ff9ed53, 0x3ff99483, 0x01ca9cd4, 0x01f04bb4, 0x3ff87b44, + 0x3ff81896, 0x01fcdb2e, 0x02228924, 0x3ff6e1bf, 0x3ff67534, 0x022f184d, 0x0254c544, 0x3ff520c5, + 0x3ff4aa5d, 0x02615414, 0x0286fff3, 0x3ff33858, 0x3ff2b813, 0x02938e62, 0x02b93914, 0x3ff12878, + 0x3ff09e56, 0x02c5c71a, 0x02eb7086, 0x3feef126, 0x3fee5d28, 0x02f7fe1c, 0x031da62b, 0x3fec9265, + 0x3febf48b, 0x032a3349, 0x034fd9e5, 0x3fea0c35, 0x3fe96480, 0x035c6682, 0x03820b93, 0x3fe75e98, + 0x3fe6ad08, 0x038e97a9, 0x03b43b17, 0x3fe48990, 0x3fe3ce26, 0x03c0c69e, 0x03e66852, 0x3fe18d1f, + 0x3fe0c7da, 0x03f2f342, 0x04189326, 0x3fde6945, 0x3fdd9a27, 0x04251d77, 0x044abb73, 0x3fdb1e06, + 0x3fda450f, 0x0457451d, 0x047ce11a, 0x3fd7ab64, 0x3fd6c894, 0x04896a16, 0x04af03fc, 0x3fd4115f, + 0x3fd324b7, 0x04bb8c42, 0x04e123fa, 0x3fd04ffc, 0x3fcf597c, 0x04edab83, 0x051340f6, 0x3fcc673b, + 0x3fcb66e4, 0x051fc7b9, 0x05455ad1, 0x3fc8571f, 0x3fc74cf3, 0x0551e0c7, 0x0577716b, 0x3fc41fac, + 0x3fc30baa, 0x0583f68c, 0x05a984a6, 0x3fbfc0e3, 0x3fbea30c, 0x05b608eb, 0x05db9463, 0x3fbb3ac7, + 0x3fba131b, 0x05e817c3, 0x060da083, 0x3fb68d5b, 0x3fb55bdc, 0x061a22f7, 0x063fa8e7, 0x3fb1b8a2, + 0x3fb07d50, 0x064c2a67, 0x0671ad71, 0x3facbc9f, 0x3fab777b, 0x067e2df5, 0x06a3ae00, 0x3fa79954, + 0x3fa64a5f, 0x06b02d81, 0x06d5aa77, 0x3fa24ec6, 0x3fa0f600, 0x06e228ee, 0x0707a2b7, 0x3f9cdcf7, + 0x3f9b7a62, 0x0714201b, 0x073996a1, 0x3f9743eb, 0x3f95d787, 0x074612eb, 0x076b8616, 0x3f9183a5, + 0x3f900d72, 0x0778013d, 0x079d70f7, 0x3f8b9c28, 0x3f8a1c29, 0x07a9eaf5, 0x07cf5726, 0x3f858d79, + 0x3f8403ae, 0x07dbcff2, 0x08013883, 0x3f7f579b, 0x3f7dc405, 0x080db016, 0x083314f1, 0x3f78fa92, + 0x3f775d31, 0x083f8b43, 0x0864ec4f, 0x3f727661, 0x3f70cf38, 0x08716159, 0x0896be80, 0x3f6bcb0e, + 0x3f6a1a1c, 0x08a3323a, 0x08c88b65, 0x3f64f89b, 0x3f633de2, 0x08d4fdc6, 0x08fa52de, 0x3f5dff0e, + 0x3f5c3a8f, 0x0906c3e0, 0x092c14ce, 0x3f56de6a, 0x3f551026, 0x09388469, 0x095dd116, 0x3f4f96b4, + 0x3f4dbeac, 0x096a3f42, 0x098f8796, 0x3f4827f0, 0x3f464626, 0x099bf44c, 0x09c13831, 0x3f409223, + 0x3f3ea697, 0x09cda368, 0x09f2e2c7, 0x3f38d552, 0x3f36e006, 0x09ff4c78, 0x0a24873a, 0x3f30f181, + 0x3f2ef276, 0x0a30ef5e, 0x0a56256c, 0x3f28e6b6, 0x3f26ddec, 0x0a628bfa, 0x0a87bd3d, 0x3f20b4f5, + 0x3f1ea26e, 0x0a94222f, 0x0ab94e8f, 0x3f185c43, 0x3f164001, 0x0ac5b1dc, 0x0aead944, 0x3f0fdca5, + 0x3f0db6a9, 0x0af73ae5, 0x0b1c5d3d, 0x3f073621, 0x3f05066d, 0x0b28bd2a, 0x0b4dda5c, 0x3efe68bc, + 0x3efc2f50, 0x0b5a388d, 0x0b7f5081, 0x3ef5747b, 0x3ef3315a, 0x0b8bacf0, 0x0bb0bf8f, 0x3eec5965, + 0x3eea0c8e, 0x0bbd1a33, 0x0be22766, 0x3ee3177e, 0x3ee0c0f4, 0x0bee8038, 0x0c1387e9, 0x3ed9aecc, + 0x3ed74e91, 0x0c1fdee1, 0x0c44e0f9, 0x3ed01f55, 0x3ecdb56a, 0x0c513610, 0x0c763278, 0x3ec66920, + 0x3ec3f585, 0x0c8285a5, 0x0ca77c47, 0x3ebc8c31, 0x3eba0ee9, 0x0cb3cd84, 0x0cd8be47, 0x3eb2888f, + 0x3eb0019c, 0x0ce50d8c, 0x0d09f85b, 0x3ea85e41, 0x3ea5cda3, 0x0d1645a0, 0x0d3b2a64, 0x3e9e0d4c, + 0x3e9b7306, 0x0d4775a1, 0x0d6c5443, 0x3e9395b7, 0x3e90f1ca, 0x0d789d71, 0x0d9d75db, 0x3e88f788, + 0x3e8649f5, 0x0da9bcf2, 0x0dce8f0d, 0x3e7e32c6, 0x3e7b7b90, 0x0ddad406, 0x0dff9fba, 0x3e734778, + 0x3e70869f, 0x0e0be28e, 0x0e30a7c5, 0x3e6835a4, 0x3e656b2b, 0x0e3ce86b, 0x0e61a70f, 0x3e5cfd51, + 0x3e5a2939, 0x0e6de580, 0x0e929d7a, 0x3e519e86, 0x3e4ec0d1, 0x0e9ed9af, 0x0ec38ae8, 0x3e46194a, + 0x3e4331fa, 0x0ecfc4d9, 0x0ef46f3b, 0x3e3a6da4, 0x3e377cbb, 0x0f00a6df, 0x0f254a53, 0x3e2e9b9c, + 0x3e2ba11b, 0x0f317fa5, 0x0f561c15, 0x3e22a338, 0x3e1f9f21, 0x0f624f0c, 0x0f86e460, 0x3e168480, + 0x3e1376d5, 0x0f9314f5, 0x0fb7a317, 0x3e0a3f7b, 0x3e07283f, 0x0fc3d143, 0x0fe8581d, 0x3dfdd432, + 0x3dfab365, 0x0ff483d7, 0x10190352, 0x3df142ab, 0x3dee1851, 0x10252c94, 0x1049a49a, 0x3de48aef, + 0x3de15708, 0x1055cb5b, 0x107a3bd5, 0x3dd7ad05, 0x3dd46f94, 0x1086600e, 0x10aac8e6, 0x3dcaa8f5, + 0x3dc761fc, 0x10b6ea90, 0x10db4baf, 0x3dbd7ec7, 0x3dba2e48, 0x10e76ac3, 0x110bc413, 0x3db02e84, + 0x3dacd481, 0x1117e088, 0x113c31f3, 0x3da2b834, 0x3d9f54af, 0x11484bc2, 0x116c9531, 0x3d951bde, + 0x3d91aed9, 0x1178ac53, 0x119cedaf, 0x3d87598c, 0x3d83e309, 0x11a9021d, 0x11cd3b50, 0x3d797145, + 0x3d75f147, 0x11d94d02, 0x11fd7df6, 0x3d6b6313, 0x3d67d99b, 0x12098ce5, 0x122db583, 0x3d5d2efe, + 0x3d599c0e, 0x1239c1a7, 0x125de1da, 0x3d4ed50f, 0x3d4b38aa, 0x1269eb2b, 0x128e02dc, 0x3d40554e, + 0x3d3caf76, 0x129a0954, 0x12be186c, 0x3d31afc5, 0x3d2e007c, 0x12ca1c03, 0x12ee226c, 0x3d22e47c, + 0x3d1f2bc5, 0x12fa231b, 0x131e20c0, 0x3d13f37e, 0x3d10315a, 0x132a1e7e, 0x134e1348, 0x3d04dcd2, + 0x3d011145, 0x135a0e0e, 0x137df9e7, 0x3cf5a082, 0x3cf1cb8e, 0x1389f1af, 0x13add481, 0x3ce63e98, + 0x3ce2603f, 0x13b9c943, 0x13dda2f7, 0x3cd6b71e, 0x3cd2cf62, 0x13e994ab, 0x140d652c, 0x3cc70a1c, + 0x3cc318ff, 0x141953cb, 0x143d1b02, 0x3cb7379c, 0x3cb33d22, 0x14490685, 0x146cc45c, 0x3ca73fa9, + 0x3ca33bd3, 0x1478acbc, 0x149c611d, 0x3c97224c, 0x3c93151d, 0x14a84652, 0x14cbf127, 0x3c86df8e, + 0x3c82c909, 0x14d7d32a, 0x14fb745e, 0x3c76777b, 0x3c7257a2, 0x15075327, 0x152aeaa3, 0x3c65ea1c, + 0x3c61c0f1, 0x1536c62b, 0x155a53d9, 0x3c55377b, 0x3c510501, 0x15662c18, 0x1589afe3, 0x3c445fa2, + 0x3c4023dd, 0x159584d3, 0x15b8fea4, 0x3c33629d, 0x3c2f1d8e, 0x15c4d03e, 0x15e83fff, 0x3c224075, + 0x3c1df21f, 0x15f40e3a, 0x161773d6, 0x3c10f935, 0x3c0ca19b, 0x16233eac, 0x16469a0d, 0x3bff8ce8, + 0x3bfb2c0c, 0x16526176, 0x1675b286, 0x3bedfb99, 0x3be9917e, 0x1681767c, 0x16a4bd25, 0x3bdc4552, + 0x3bd7d1fa, 0x16b07d9f, 0x16d3b9cc, 0x3bca6a1d, 0x3bc5ed8d, 0x16df76c3, 0x1702a85e, 0x3bb86a08, + 0x3bb3e440, 0x170e61cc, 0x173188be, 0x3ba6451b, 0x3ba1b620, 0x173d3e9b, 0x17605ad0, 0x3b93fb63, + 0x3b8f6337, 0x176c0d15, 0x178f1e76, 0x3b818ceb, 0x3b7ceb90, 0x179acd1c, 0x17bdd394, 0x3b6ef9be, + 0x3b6a4f38, 0x17c97e93, 0x17ec7a0d, 0x3b5c41e8, 0x3b578e39, 0x17f8215e, 0x181b11c4, 0x3b496574, + 0x3b44a8a0, 0x1826b561, 0x18499a9d, 0x3b36646e, 0x3b319e77, 0x18553a7d, 0x1878147a, 0x3b233ee1, + 0x3b1e6fca, 0x1883b097, 0x18a67f3f, 0x3b0ff4d9, 0x3b0b1ca6, 0x18b21791, 0x18d4dad0, 0x3afc8663, + 0x3af7a516, 0x18e06f50, 0x1903270f, 0x3ae8f38b, 0x3ae40926, 0x190eb7b7, 0x193163e1, 0x3ad53c5b, + 0x3ad048e3, 0x193cf0a9, 0x195f9128, 0x3ac160e1, 0x3abc6458, 0x196b1a09, 0x198daec8, 0x3aad6129, + 0x3aa85b92, 0x199933bb, 0x19bbbca6, 0x3a993d3e, 0x3a942e9d, 0x19c73da3, 0x19e9baa3, 0x3a84f52f, + 0x3a7fdd86, 0x19f537a4, 0x1a17a8a5, 0x3a708906, 0x3a6b6859, 0x1a2321a2, 0x1a45868e, 0x3a5bf8d1, + 0x3a56cf23, 0x1a50fb81, 0x1a735442, 0x3a47449c, 0x3a4211f0, 0x1a7ec524, 0x1aa111a6, 0x3a326c74, + 0x3a2d30cd, 0x1aac7e6f, 0x1acebe9d, 0x3a1d7066, 0x3a182bc8, 0x1ada2746, 0x1afc5b0a, 0x3a08507f, + 0x3a0302ed, 0x1b07bf8c, 0x1b29e6d2, 0x39f30ccc, 0x39edb649, 0x1b354727, 0x1b5761d8, 0x39dda55a, + 0x39d845e9, 0x1b62bdf8, 0x1b84cc01, 0x39c81a36, 0x39c2b1da, 0x1b9023e5, 0x1bb22530, 0x39b26b6d, + 0x39acfa2b, 0x1bbd78d2, 0x1bdf6d4a, 0x399c990d, 0x39971ee7, 0x1beabca1, 0x1c0ca432, 0x3986a324, + 0x3981201e, 0x1c17ef39, 0x1c39c9cd, 0x397089bf, 0x396afddc, 0x1c45107c, 0x1c66ddfe, 0x395a4ceb, + 0x3954b82e, 0x1c72204f, 0x1c93e0ab, 0x3943ecb6, 0x393e4f23, 0x1c9f1e96, 0x1cc0d1b6, 0x392d692f, + 0x3927c2c9, 0x1ccc0b35, 0x1cedb106, 0x3916c262, 0x3911132d, 0x1cf8e611, 0x1d1a7e7d, 0x38fff85e, + 0x38fa405e, 0x1d25af0d, 0x1d473a00, 0x38e90b31, 0x38e34a69, 0x1d52660f, 0x1d73e374, 0x38d1fae9, + 0x38cc315d, 0x1d7f0afb, 0x1da07abc, 0x38bac795, 0x38b4f547, 0x1dab9db5, 0x1dccffbf, 0x38a37142, + 0x389d9637, 0x1dd81e21, 0x1df9725f, 0x388bf7ff, 0x3886143b, 0x1e048c24, 0x1e25d282, 0x38745bdb, + 0x386e6f60, 0x1e30e7a4, 0x1e52200c, 0x385c9ce3, 0x3856a7b6, 0x1e5d3084, 0x1e7e5ae2, 0x3844bb28, + 0x383ebd4c, 0x1e8966a8, 0x1eaa82e9, 0x382cb6b7, 0x3826b030, 0x1eb589f7, 0x1ed69805, 0x38148f9f, + 0x380e8071, 0x1ee19a54, 0x1f029a1c, 0x37fc45ef, 0x37f62e1d, 0x1f0d97a5, 0x1f2e8911, 0x37e3d9b7, + 0x37ddb945, 0x1f3981ce, 0x1f5a64cb, 0x37cb4b04, 0x37c521f6, 0x1f6558b5, 0x1f862d2d, 0x37b299e7, + 0x37ac6841, 0x1f911c3d, 0x1fb1e21d, 0x3799c66f, 0x37938c34, 0x1fbccc4d, 0x1fdd8381, 0x3780d0aa, + 0x377a8ddf, 0x1fe868c8, 0x2009113c, 0x3767b8a9, 0x37616d51, 0x2013f196, 0x20348b35, 0x374e7e7b, + 0x37482a9a, 0x203f6699, 0x205ff14f, 0x3735222f, 0x372ec5c9, 0x206ac7b8, 0x208b4372, 0x371ba3d4, + 0x37153eee, 0x209614d9, 0x20b68181, 0x3702037c, 0x36fb9618, 0x20c14ddf, 0x20e1ab63, 0x36e84135, + 0x36e1cb58, 0x20ec72b1, 0x210cc0fc, 0x36ce5d10, 0x36c7debd, 0x21178334, 0x2137c232, 0x36b4571b, + 0x36add058, 0x21427f4d, 0x2162aeea, 0x369a2f69, 0x3693a038, 0x216d66e2, 0x218d870b, 0x367fe608, + 0x36794e6e, 0x219839d8, 0x21b84a79, 0x36657b08, 0x365edb09, 0x21c2f815, 0x21e2f91a, 0x364aee7b, + 0x3644461b, 0x21eda17f, 0x220d92d4, 0x36304070, 0x36298fb4, 0x221835fb, 0x2238178d, 0x361570f8, + 0x360eb7e3, 0x2242b56f, 0x22628729, 0x35fa8023, 0x35f3beba, 0x226d1fc1, 0x228ce191, 0x35df6e03, + 0x35d8a449, 0x229774d7, 0x22b726a8, 0x35c43aa7, 0x35bd68a1, 0x22c1b496, 0x22e15655, 0x35a8e621, + 0x35a20bd3, 0x22ebdee5, 0x230b707e, 0x358d7081, 0x35868def, 0x2315f3a8, 0x23357509, 0x3571d9d9, + 0x356aef08, 0x233ff2c8, 0x235f63dc, 0x35562239, 0x354f2f2c, 0x2369dc29, 0x23893cdd, 0x353a49b2, + 0x35334e6f, 0x2393afb2, 0x23b2fff3, 0x351e5056, 0x35174ce0, 0x23bd6d48, 0x23dcad03, 0x35023636, + 0x34fb2a92, 0x23e714d3, 0x240643f4, 0x34e5fb63, 0x34dee795, 0x2410a639, 0x242fc4ad, 0x34c99fef, + 0x34c283fb, 0x243a215f, 0x24592f13, 0x34ad23eb, 0x34a5ffd5, 0x2463862c, 0x2482830d, 0x34908768, + 0x34895b36, 0x248cd487, 0x24abc082, 0x3473ca79, 0x346c962f, 0x24b60c57, 0x24d4e757, 0x3456ed2f, + 0x344fb0d1, 0x24df2d81, 0x24fdf775, 0x3439ef9c, 0x3432ab2e, 0x250837ed, 0x2526f0c1, 0x341cd1d2, + 0x34158559, 0x25312b81, 0x254fd323, 0x33ff93e2, 0x33f83f62, 0x255a0823, 0x25789e80, 0x33e235df, + 0x33dad95e, 0x2582cdbc, 0x25a152c0, 0x33c4b7db, 0x33bd535c, 0x25ab7c30, 0x25c9efca, 0x33a719e8, + 0x339fad70, 0x25d41369, 0x25f27584, 0x33895c18, 0x3381e7ac, 0x25fc934b, 0x261ae3d6, 0x336b7e7e, + 0x33640223, 0x2624fbbf, 0x26433aa7, 0x334d812d, 0x3345fce6, 0x264d4cac, 0x266b79dd, 0x332f6435, + 0x3327d808, 0x267585f8, 0x2693a161, 0x331127ab, 0x3309939c, 0x269da78b, 0x26bbb119, 0x32f2cba1, + 0x32eb2fb5, 0x26c5b14c, 0x26e3a8ec, 0x32d45029, 0x32ccac64, 0x26eda322, 0x270b88c2, 0x32b5b557, + 0x32ae09be, 0x27157cf5, 0x27335082, 0x3296fb3d, 0x328f47d5, 0x273d3eac, 0x275b0014, 0x327821ee, + 0x327066bc, 0x2764e82f, 0x27829760, 0x3259297d, 0x32516686, 0x278c7965, 0x27aa164c, 0x323a11fe, + 0x32324746, 0x27b3f235, 0x27d17cc1, 0x321adb83, 0x3213090f, 0x27db5288, 0x27f8caa5, 0x31fb8620, + 0x31f3abf5, 0x28029a45, 0x281fffe2, 0x31dc11e8, 0x31d4300b, 0x2829c954, 0x28471c5e, 0x31bc7eee, + 0x31b49564, 0x2850df9d, 0x286e2002, 0x319ccd46, 0x3194dc14, 0x2877dd07, 0x28950ab6, 0x317cfd04, + 0x3175042e, 0x289ec17a, 0x28bbdc61, 0x315d0e3b, 0x31550dc6, 0x28c58cdf, 0x28e294eb, 0x313d00ff, + 0x3134f8f1, 0x28ec3f1e, 0x2909343e, 0x311cd564, 0x3114c5c0, 0x2912d81f, 0x292fba40, 0x30fc8b7d, + 0x30f47449, 0x293957c9, 0x295626da, 0x30dc235e, 0x30d404a0, 0x295fbe06, 0x297c79f5, 0x30bb9d1c, + 0x30b376d8, 0x29860abd, 0x29a2b378, 0x309af8ca, 0x3092cb05, 0x29ac3dd7, 0x29c8d34d, 0x307a367c, + 0x3072013c, 0x29d2573c, 0x29eed95b, 0x30595648, 0x30511991, 0x29f856d5, 0x2a14c58b, 0x30385840, + 0x30301418, 0x2a1e3c8a, 0x2a3a97c7, 0x30173c7a, 0x300ef0e5, 0x2a440844, 0x2a604ff5, 0x2ff6030a, + 0x2fedb00d, 0x2a69b9ec, 0x2a85ee00, 0x2fd4ac04, 0x2fcc51a5, 0x2a8f516b, 0x2aab71d0, 0x2fb3377c, + 0x2faad5c1, 0x2ab4cea9, 0x2ad0db4e, 0x2f91a589, 0x2f893c75, 0x2ada318e, 0x2af62a63, 0x2f6ff63d, + 0x2f6785d7, 0x2aff7a05, 0x2b1b5ef8, 0x2f4e29af, 0x2f45b1fb, 0x2b24a7f6, 0x2b4078f5, 0x2f2c3ff2, + 0x2f23c0f6, 0x2b49bb4a, 0x2b657844, 0x2f0a391d, 0x2f01b2de, 0x2b6eb3ea, 0x2b8a5cce, 0x2ee81543, + 0x2edf87c6, 0x2b9391c0, 0x2baf267d, 0x2ec5d479, 0x2ebd3fc4, 0x2bb854b4, 0x2bd3d53a, 0x2ea376d6, + 0x2e9adaee, 0x2bdcfcb0, 0x2bf868ed, 0x2e80fc6e, 0x2e785958, 0x2c01899e, 0x2c1ce181, 0x2e5e6556, + 0x2e55bb17, 0x2c25fb66, 0x2c413edf, 0x2e3bb1a4, 0x2e330042, 0x2c4a51f3, 0x2c6580f1, 0x2e18e16d, + 0x2e1028ed, 0x2c6e8d2e, 0x2c89a79f, 0x2df5f4c7, 0x2ded352f, 0x2c92ad01, 0x2cadb2d5, 0x2dd2ebc7, + 0x2dca251c, 0x2cb6b155, 0x2cd1a27b, 0x2dafc683, 0x2da6f8ca, 0x2cda9a14, 0x2cf5767c, 0x2d8c8510, + 0x2d83b04f, 0x2cfe6728, 0x2d192ec1, 0x2d692784, 0x2d604bc0, 0x2d22187a, 0x2d3ccb34, 0x2d45adf6 +}; + + +const int twidTab512[(8*6 + 32*6 + 128*6)/2] = { + 0x40000000, 0x40000000, 0x40000000, 0x3b20187d, + 0x3ec50c7c, 0x3536238e, 0x2d412d41, 0x3b20187d, + 0x187d3b20, 0x187d3b20, 0x3536238e, 0xf3843ec5, + 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xe7833b20, + 0x238e3536, 0xc13b0c7c, 0xd2bf2d41, 0x187d3b20, + 0xc4e0e783, 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, + + 0x40000000, 0x40000000, 0x40000000, 0x3fb10645, + 0x3fec0323, 0x3f4e0964, 0x3ec50c7c, 0x3fb10645, + 0x3d3e1294, 0x3d3e1294, 0x3f4e0964, 0x39da1b5d, + 0x3b20187d, 0x3ec50c7c, 0x3536238e, 0x38711e2b, + 0x3e140f8c, 0x2f6b2afa, 0x3536238e, 0x3d3e1294, + 0x28993179, 0x31792899, 0x3c42158f, 0x20e736e5, + 0x2d412d41, 0x3b20187d, 0x187d3b20, 0x28993179, + 0x39da1b5d, 0x0f8c3e14, 0x238e3536, 0x38711e2b, + 0x06453fb1, 0x1e2b3871, 0x36e520e7, 0xfcdd3fec, + 0x187d3b20, 0x3536238e, 0xf3843ec5, 0x12943d3e, + 0x3367261f, 0xea713c42, 0x0c7c3ec5, 0x31792899, + 0xe1d53871, 0x06453fb1, 0x2f6b2afa, 0xd9e13367, + 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xf9bb3fb1, + 0x2afa2f6b, 0xcc99261f, 0xf3843ec5, 0x28993179, + 0xc78f1e2b, 0xed6c3d3e, 0x261f3367, 0xc3be158f, + 0xe7833b20, 0x238e3536, 0xc13b0c7c, 0xe1d53871, + 0x20e736e5, 0xc0140323, 0xdc723536, 0x1e2b3871, + 0xc04ff9bb, 0xd7673179, 0x1b5d39da, 0xc1ecf074, + 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xce872899, + 0x158f3c42, 0xc91bdf19, 0xcaca238e, 0x12943d3e, + 0xce87d767, 0xc78f1e2b, 0x0f8c3e14, 0xd506d095, + 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 0xc2c21294, + 0x09643f4e, 0xe4a3c626, 0xc13b0c7c, 0x06453fb1, + 0xed6cc2c2, 0xc04f0645, 0x03233fec, 0xf69cc0b2, + + 0x40000000, 0x40000000, 0x40000000, 0x3ffb0192, + 0x3ffe00c9, 0x3ff4025b, 0x3fec0323, 0x3ffb0192, + 0x3fd304b5, 0x3fd304b5, 0x3ff4025b, 0x3f9c070d, + 0x3fb10645, 0x3fec0323, 0x3f4e0964, 0x3f8407d5, + 0x3fe103ec, 0x3eeb0bb6, 0x3f4e0964, 0x3fd304b5, + 0x3e710e05, 0x3f0e0af1, 0x3fc3057d, 0x3de2104f, + 0x3ec50c7c, 0x3fb10645, 0x3d3e1294, 0x3e710e05, + 0x3f9c070d, 0x3c8414d1, 0x3e140f8c, 0x3f8407d5, + 0x3bb61708, 0x3dae1111, 0x3f6a089c, 0x3ad21937, + 0x3d3e1294, 0x3f4e0964, 0x39da1b5d, 0x3cc51413, + 0x3f2f0a2a, 0x38cf1d79, 0x3c42158f, 0x3f0e0af1, + 0x37af1f8b, 0x3bb61708, 0x3eeb0bb6, 0x367c2192, + 0x3b20187d, 0x3ec50c7c, 0x3536238e, 0x3a8219ef, + 0x3e9c0d41, 0x33de257d, 0x39da1b5d, 0x3e710e05, + 0x3274275f, 0x392a1cc6, 0x3e440ec9, 0x30f82934, + 0x38711e2b, 0x3e140f8c, 0x2f6b2afa, 0x37af1f8b, + 0x3de2104f, 0x2dce2cb2, 0x36e520e7, 0x3dae1111, + 0x2c212e5a, 0x3612223d, 0x3d7711d3, 0x2a652ff1, + 0x3536238e, 0x3d3e1294, 0x28993179, 0x345324da, + 0x3d021354, 0x26c032ee, 0x3367261f, 0x3cc51413, + 0x24da3453, 0x3274275f, 0x3c8414d1, 0x22e635a5, + 0x31792899, 0x3c42158f, 0x20e736e5, 0x307629cd, + 0x3bfd164c, 0x1edc3811, 0x2f6b2afa, 0x3bb61708, + 0x1cc6392a, 0x2e5a2c21, 0x3b6c17c3, 0x1aa63a2f, + 0x2d412d41, 0x3b20187d, 0x187d3b20, 0x2c212e5a, + 0x3ad21937, 0x164c3bfd, 0x2afa2f6b, 0x3a8219ef, + 0x14133cc5, 0x29cd3076, 0x3a2f1aa6, 0x11d33d77, + 0x28993179, 0x39da1b5d, 0x0f8c3e14, 0x275f3274, + 0x39831c12, 0x0d413e9c, 0x261f3367, 0x392a1cc6, + 0x0af13f0e, 0x24da3453, 0x38cf1d79, 0x089c3f6a, + 0x238e3536, 0x38711e2b, 0x06453fb1, 0x223d3612, + 0x38111edc, 0x03ec3fe1, 0x20e736e5, 0x37af1f8b, + 0x01923ffb, 0x1f8b37af, 0x374b2039, 0xff373ffe, + 0x1e2b3871, 0x36e520e7, 0xfcdd3fec, 0x1cc6392a, + 0x367c2192, 0xfa833fc3, 0x1b5d39da, 0x3612223d, + 0xf82b3f84, 0x19ef3a82, 0x35a522e6, 0xf5d63f2f, + 0x187d3b20, 0x3536238e, 0xf3843ec5, 0x17083bb6, + 0x34c62434, 0xf1373e44, 0x158f3c42, 0x345324da, + 0xeeef3dae, 0x14133cc5, 0x33de257d, 0xecac3d02, + 0x12943d3e, 0x3367261f, 0xea713c42, 0x11113dae, + 0x32ee26c0, 0xe83d3b6c, 0x0f8c3e14, 0x3274275f, + 0xe6113a82, 0x0e053e71, 0x31f727fd, 0xe3ee3983, + 0x0c7c3ec5, 0x31792899, 0xe1d53871, 0x0af13f0e, + 0x30f82934, 0xdfc7374b, 0x09643f4e, 0x307629cd, + 0xddc33612, 0x07d53f84, 0x2ff12a65, 0xdbcc34c6, + 0x06453fb1, 0x2f6b2afa, 0xd9e13367, 0x04b53fd3, + 0x2ee32b8e, 0xd80331f7, 0x03233fec, 0x2e5a2c21, + 0xd6333076, 0x01923ffb, 0x2dce2cb2, 0xd4722ee3, + 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xfe6e3ffb, + 0x2cb22dce, 0xd11d2b8e, 0xfcdd3fec, 0x2c212e5a, + 0xcf8a29cd, 0xfb4b3fd3, 0x2b8e2ee3, 0xce0927fd, + 0xf9bb3fb1, 0x2afa2f6b, 0xcc99261f, 0xf82b3f84, + 0x2a652ff1, 0xcb3a2434, 0xf69c3f4e, 0x29cd3076, + 0xc9ee223d, 0xf50f3f0e, 0x293430f8, 0xc8b52039, + 0xf3843ec5, 0x28993179, 0xc78f1e2b, 0xf1fb3e71, + 0x27fd31f7, 0xc67d1c12, 0xf0743e14, 0x275f3274, + 0xc57e19ef, 0xeeef3dae, 0x26c032ee, 0xc49417c3, + 0xed6c3d3e, 0x261f3367, 0xc3be158f, 0xebed3cc5, + 0x257d33de, 0xc2fe1354, 0xea713c42, 0x24da3453, + 0xc2521111, 0xe8f83bb6, 0x243434c6, 0xc1bc0ec9, + 0xe7833b20, 0x238e3536, 0xc13b0c7c, 0xe6113a82, + 0x22e635a5, 0xc0d10a2a, 0xe4a339da, 0x223d3612, + 0xc07c07d5, 0xe33a392a, 0x2192367c, 0xc03d057d, + 0xe1d53871, 0x20e736e5, 0xc0140323, 0xe07537af, + 0x2039374b, 0xc00200c9, 0xdf1936e5, 0x1f8b37af, + 0xc005fe6e, 0xddc33612, 0x1edc3811, 0xc01ffc14, + 0xdc723536, 0x1e2b3871, 0xc04ff9bb, 0xdb263453, + 0x1d7938cf, 0xc096f764, 0xd9e13367, 0x1cc6392a, + 0xc0f2f50f, 0xd8a13274, 0x1c123983, 0xc164f2bf, + 0xd7673179, 0x1b5d39da, 0xc1ecf074, 0xd6333076, + 0x1aa63a2f, 0xc289ee2d, 0xd5062f6b, 0x19ef3a82, + 0xc33bebed, 0xd3df2e5a, 0x19373ad2, 0xc403e9b4, + 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xd1a62c21, + 0x17c33b6c, 0xc5d1e55a, 0xd0952afa, 0x17083bb6, + 0xc6d6e33a, 0xcf8a29cd, 0x164c3bfd, 0xc7efe124, + 0xce872899, 0x158f3c42, 0xc91bdf19, 0xcd8c275f, + 0x14d13c84, 0xca5bdd1a, 0xcc99261f, 0x14133cc5, + 0xcbaddb26, 0xcbad24da, 0x13543d02, 0xcd12d940, + 0xcaca238e, 0x12943d3e, 0xce87d767, 0xc9ee223d, + 0x11d33d77, 0xd00fd59b, 0xc91b20e7, 0x11113dae, + 0xd1a6d3df, 0xc8511f8b, 0x104f3de2, 0xd34ed232, + 0xc78f1e2b, 0x0f8c3e14, 0xd506d095, 0xc6d61cc6, + 0x0ec93e44, 0xd6cccf08, 0xc6261b5d, 0x0e053e71, + 0xd8a1cd8c, 0xc57e19ef, 0x0d413e9c, 0xda83cc22, + 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 0xc44a1708, + 0x0bb63eeb, 0xde6ec984, 0xc3be158f, 0x0af13f0e, + 0xe075c851, 0xc33b1413, 0x0a2a3f2f, 0xe287c731, + 0xc2c21294, 0x09643f4e, 0xe4a3c626, 0xc2521111, + 0x089c3f6a, 0xe6c9c52e, 0xc1ec0f8c, 0x07d53f84, + 0xe8f8c44a, 0xc18f0e05, 0x070d3f9c, 0xeb2fc37c, + 0xc13b0c7c, 0x06453fb1, 0xed6cc2c2, 0xc0f20af1, + 0x057d3fc3, 0xefb1c21e, 0xc0b20964, 0x04b53fd3, + 0xf1fbc18f, 0xc07c07d5, 0x03ec3fe1, 0xf44ac115, + 0xc04f0645, 0x03233fec, 0xf69cc0b2, 0xc02d04b5, + 0x025b3ff4, 0xf8f3c064, 0xc0140323, 0x01923ffb, + 0xfb4bc02d, 0xc0050192, 0x00c93ffe, 0xfda5c00c +}; + +const int twidTab64[(4*6 + 16*6)/2] = { + 0x40000000, 0x40000000, 0x40000000, 0x2d412d41, + 0x3b20187d, 0x187d3b20, 0x00004000, 0x2d412d41, + 0xd2bf2d41, 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, + + 0x40000000, 0x40000000, 0x40000000, 0x3ec50c7c, + 0x3fb10645, 0x3d3e1294, 0x3b20187d, 0x3ec50c7c, + 0x3536238e, 0x3536238e, 0x3d3e1294, 0x28993179, + 0x2d412d41, 0x3b20187d, 0x187d3b20, 0x238e3536, + 0x38711e2b, 0x06453fb1, 0x187d3b20, 0x3536238e, + 0xf3843ec5, 0x0c7c3ec5, 0x31792899, 0xe1d53871, + 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xf3843ec5, + 0x28993179, 0xc78f1e2b, 0xe7833b20, 0x238e3536, + 0xc13b0c7c, 0xdc723536, 0x1e2b3871, 0xc04ff9bb, + 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xcaca238e, + 0x12943d3e, 0xce87d767, 0xc4e0187d, 0x0c7c3ec5, + 0xdc72caca, 0xc13b0c7c, 0x06453fb1, 0xed6cc2c2 +}; + +#elif defined ARMV7Neon +/* + * Q29 for 128 and 1024 + * + * for (i = 0; i < num/4; i++) { + * angle = (i + 0.125) * M_PI / num; + * x = cos(angle) * (1 << 29); + * x = sin(angle) * (1 << 29); + * + * angle = (num/2 - 1 - i + 0.125) * M_PI / num; + * x = cos(angle) * (1 << 29); + * x = sin(angle) * (1 << 29); + * } + */ +const int cossintab[128 + 1024] = { + /* 128 */ 0x1ffff621, 0x001921f9, 0x00afea69, 0x1ffe1c68, 0x1ffce09d, 0x00e22a7a, 0x0178dbaa, 0x1ff753bb, 0x1ff4dc55, 0x01ab101c, 0x024192cf, 0x1feb9d25, 0x1fe7ea85, 0x0273b3e2, 0x0309f0e2, 0x1fdafa75, 0x1fd60d2e, 0x033bf6dd, 0x03d1d700, 0x1fc56e3b, 0x1fbf470f, 0x0403ba2b, 0x04992653, 0x1faafbcb, @@ -368,139 +368,139 @@ const int cossintab[128 + 1024] = { 0x1a8d676e, 0x11dc1b65, 0x1258734d, 0x1a38184a, 0x1a1b26d3, 0x12818bef, 0x12fbc24b, 0x19c2d111, 0x19a4dfa4, 0x132421ec, 0x139c23e4, 0x194990e4, 0x192aa420, 0x13c3c44a, 0x14397f5b, 0x18cc6a75, 0x18ac871f, 0x14605a69, 0x14d3bc6d, 0x184b7112, 0x182a9c14, 0x14f9cc26, 0x156ac352, 0x17c6b89d, - 0x17a4f708, 0x159001d6, 0x15fe7cbe, 0x173e558e, 0x171bac96, 0x1622e450, 0x168ed1eb, 0x16b25ced, - /* 1024 */ - 0x1fffffd9, 0x0003243f, 0x0015fdba, 0x1ffff872, 0x1ffff382, 0x001c4637, 0x002f1fa6, 0x1fffdd4d, - 0x1fffd36f, 0x0035681d, 0x00484175, 0x1fffae6c, 0x1fff9f9e, 0x004e89e3, 0x00616318, 0x1fff6bce, - 0x1fff5811, 0x0067ab77, 0x007a847e, 0x1fff1572, 0x1ffefcc6, 0x0080cccc, 0x0093a599, 0x1ffeab5b, - 0x1ffe8dbf, 0x0099edd2, 0x00acc658, 0x1ffe2d86, 0x1ffe0afc, 0x00b30e78, 0x00c5e6ad, 0x1ffd9bf6, - 0x1ffd747c, 0x00cc2eb0, 0x00df0688, 0x1ffcf6aa, 0x1ffcca41, 0x00e54e6a, 0x00f825da, 0x1ffc3da2, - 0x1ffc0c4b, 0x00fe6d97, 0x01114492, 0x1ffb70e0, 0x1ffb3a9a, 0x01178c27, 0x012a62a2, 0x1ffa9063, - 0x1ffa552e, 0x0130aa0a, 0x01437ffa, 0x1ff99c2c, 0x1ff95c09, 0x0149c731, 0x015c9c8a, 0x1ff8943c, - 0x1ff84f2b, 0x0162e38d, 0x0175b843, 0x1ff77893, 0x1ff72e94, 0x017bff0e, 0x018ed316, 0x1ff64932, - 0x1ff5fa46, 0x019519a5, 0x01a7ecf2, 0x1ff5061b, 0x1ff4b240, 0x01ae3341, 0x01c105c9, 0x1ff3af4c, - 0x1ff35684, 0x01c74bd5, 0x01da1d8c, 0x1ff244c8, 0x1ff1e713, 0x01e0634f, 0x01f33429, 0x1ff0c68f, - 0x1ff063ed, 0x01f979a1, 0x020c4993, 0x1fef34a3, 0x1feecd14, 0x02128ebb, 0x02255db9, 0x1fed8f03, - 0x1fed2287, 0x022ba28f, 0x023e708d, 0x1febd5b2, 0x1feb644a, 0x0244b50b, 0x025781fe, 0x1fea08b0, - 0x1fe9925c, 0x025dc621, 0x027091fd, 0x1fe827fe, 0x1fe7acbe, 0x0276d5c1, 0x0289a07b, 0x1fe6339d, - 0x1fe5b372, 0x028fe3dd, 0x02a2ad69, 0x1fe42b90, 0x1fe3a679, 0x02a8f063, 0x02bbb8b6, 0x1fe20fd6, - 0x1fe185d5, 0x02c1fb46, 0x02d4c253, 0x1fdfe071, 0x1fdf5186, 0x02db0475, 0x02edca32, 0x1fdd9d64, - 0x1fdd098e, 0x02f40be2, 0x0306d042, 0x1fdb46ae, 0x1fdaadee, 0x030d117c, 0x031fd474, 0x1fd8dc51, - 0x1fd83ea8, 0x03261534, 0x0338d6b8, 0x1fd65e4f, 0x1fd5bbbd, 0x033f16fb, 0x0351d700, 0x1fd3ccaa, - 0x1fd32530, 0x035816c1, 0x036ad53c, 0x1fd12763, 0x1fd07b00, 0x03711477, 0x0383d15c, 0x1fce6e7c, - 0x1fcdbd31, 0x038a100e, 0x039ccb51, 0x1fcba1f5, 0x1fcaebc3, 0x03a30975, 0x03b5c30b, 0x1fc8c1d2, - 0x1fc806b9, 0x03bc009f, 0x03ceb87c, 0x1fc5ce14, 0x1fc50e14, 0x03d4f57a, 0x03e7ab93, 0x1fc2c6bd, - 0x1fc201d7, 0x03ede7f9, 0x04009c42, 0x1fbfabcd, 0x1fbee202, 0x0406d80b, 0x04198a78, 0x1fbc7d49, - 0x1fbbae99, 0x041fc5a1, 0x04327628, 0x1fb93b31, 0x1fb8679c, 0x0438b0ac, 0x044b5f40, 0x1fb5e587, - 0x1fb50d0e, 0x0451991d, 0x046445b2, 0x1fb27c4e, 0x1fb19ef1, 0x046a7ee3, 0x047d296f, 0x1faeff87, - 0x1fae1d47, 0x048361f0, 0x04960a67, 0x1fab6f35, 0x1faa8813, 0x049c4235, 0x04aee88b, 0x1fa7cb5a, - 0x1fa6df56, 0x04b51fa1, 0x04c7c3cb, 0x1fa413f8, 0x1fa32313, 0x04cdfa26, 0x04e09c18, 0x1fa04912, - 0x1f9f534c, 0x04e6d1b4, 0x04f97163, 0x1f9c6aa9, 0x1f9b7003, 0x04ffa63c, 0x0512439d, 0x1f9878c1, - 0x1f97793b, 0x051877af, 0x052b12b6, 0x1f94735b, 0x1f936ef6, 0x053145fd, 0x0543de9e, 0x1f905a7a, - 0x1f8f5137, 0x054a1117, 0x055ca748, 0x1f8c2e21, 0x1f8b2000, 0x0562d8ee, 0x05756ca2, 0x1f87ee52, - 0x1f86db55, 0x057b9d73, 0x058e2e9f, 0x1f839b10, 0x1f828336, 0x05945e95, 0x05a6ed2e, 0x1f7f345e, - 0x1f7e17a8, 0x05ad1c47, 0x05bfa840, 0x1f7aba3e, 0x1f7998ad, 0x05c5d678, 0x05d85fc7, 0x1f762cb2, - 0x1f750647, 0x05de8d19, 0x05f113b3, 0x1f718bbf, 0x1f70607a, 0x05f7401c, 0x0609c3f5, 0x1f6cd766, - 0x1f6ba748, 0x060fef71, 0x0622707d, 0x1f680fab, 0x1f66dab5, 0x06289b08, 0x063b193c, 0x1f633490, - 0x1f61fac3, 0x064142d3, 0x0653be23, 0x1f5e4619, 0x1f5d0775, 0x0659e6c2, 0x066c5f24, 0x1f594448, - 0x1f5800ce, 0x067286c6, 0x0684fc2e, 0x1f542f21, 0x1f52e6d2, 0x068b22d0, 0x069d9532, 0x1f4f06a6, - 0x1f4db983, 0x06a3bad0, 0x06b62a22, 0x1f49cadc, 0x1f4878e5, 0x06bc4eb9, 0x06cebaee, 0x1f447bc4, - 0x1f4324fb, 0x06d4de79, 0x06e74786, 0x1f3f1963, 0x1f3dbdc8, 0x06ed6a03, 0x06ffcfdd, 0x1f39a3bc, - 0x1f384350, 0x0705f147, 0x071853e3, 0x1f341ad2, 0x1f32b595, 0x071e7436, 0x0730d388, 0x1f2e7ea9, - 0x1f2d149d, 0x0736f2c0, 0x07494ebd, 0x1f28cf43, 0x1f276069, 0x074f6cd7, 0x0761c574, 0x1f230ca5, - 0x1f2198fd, 0x0767e26c, 0x077a379d, 0x1f1d36d2, 0x1f1bbe5d, 0x07805370, 0x0792a52a, 0x1f174dce, - 0x1f15d08d, 0x0798bfd3, 0x07ab0e0a, 0x1f11519c, 0x1f0fcf91, 0x07b12786, 0x07c37230, 0x1f0b4240, - 0x1f09bb6b, 0x07c98a7a, 0x07dbd18c, 0x1f051fbe, 0x1f03941f, 0x07e1e8a1, 0x07f42c0e, 0x1efeea19, - 0x1efd59b3, 0x07fa41eb, 0x080c81a9, 0x1ef8a155, 0x1ef70c28, 0x0812964a, 0x0824d24d, 0x1ef24577, - 0x1ef0ab84, 0x082ae5ad, 0x083d1dea, 0x1eebd682, 0x1eea37ca, 0x08433007, 0x08556473, 0x1ee5547a, - 0x1ee3b0fe, 0x085b7548, 0x086da5d8, 0x1edebf64, 0x1edd1724, 0x0873b562, 0x0885e209, 0x1ed81742, - 0x1ed66a41, 0x088bf044, 0x089e18f9, 0x1ed15c1a, 0x1ecfaa57, 0x08a425e1, 0x08b64a98, 0x1eca8def, - 0x1ec8d76c, 0x08bc562a, 0x08ce76d8, 0x1ec3acc6, 0x1ec1f184, 0x08d4810f, 0x08e69da8, 0x1ebcb8a3, - 0x1ebaf8a3, 0x08eca681, 0x08febefb, 0x1eb5b18a, 0x1eb3eccd, 0x0904c673, 0x0916dac2, 0x1eae977f, - 0x1eacce07, 0x091ce0d4, 0x092ef0ed, 0x1ea76a87, 0x1ea59c55, 0x0934f596, 0x0947016e, 0x1ea02aa7, - 0x1e9e57bb, 0x094d04aa, 0x095f0c36, 0x1e98d7e2, 0x1e97003e, 0x09650e01, 0x09771136, 0x1e91723e, - 0x1e8f95e3, 0x097d118d, 0x098f1060, 0x1e89f9bf, 0x1e8818ad, 0x09950f3f, 0x09a709a4, 0x1e826e69, - 0x1e8088a2, 0x09ad0707, 0x09befcf4, 0x1e7ad041, 0x1e78e5c7, 0x09c4f8d8, 0x09d6ea40, 0x1e731f4c, - 0x1e71301f, 0x09dce4a1, 0x09eed17b, 0x1e6b5b8f, 0x1e6967b1, 0x09f4ca56, 0x0a06b296, 0x1e63850e, - 0x1e618c80, 0x0a0ca9e6, 0x0a1e8d81, 0x1e5b9bce, 0x1e599e91, 0x0a248343, 0x0a36622e, 0x1e539fd4, - 0x1e519dea, 0x0a3c565e, 0x0a4e308f, 0x1e4b9126, 0x1e498a8e, 0x0a542329, 0x0a65f894, 0x1e436fc7, - 0x1e416485, 0x0a6be995, 0x0a7dba2f, 0x1e3b3bbd, 0x1e392bd1, 0x0a83a993, 0x0a957551, 0x1e32f50e, - 0x1e30e079, 0x0a9b6315, 0x0aad29ec, 0x1e2a9bbd, 0x1e288281, 0x0ab3160c, 0x0ac4d7f1, 0x1e222fd1, - 0x1e2011ee, 0x0acac26a, 0x0adc7f52, 0x1e19b14f, 0x1e178ec7, 0x0ae2681f, 0x0af41fff, 0x1e11203b, - 0x1e0ef910, 0x0afa071d, 0x0b0bb9eb, 0x1e087c9b, 0x1e0650ce, 0x0b119f56, 0x0b234d07, 0x1dffc674, - 0x1dfd9606, 0x0b2930bb, 0x0b3ad943, 0x1df6fdcc, 0x1df4c8bf, 0x0b40bb3e, 0x0b525e92, 0x1dee22a9, - 0x1debe8fd, 0x0b583ecf, 0x0b69dce6, 0x1de5350f, 0x1de2f6c6, 0x0b6fbb62, 0x0b81542f, 0x1ddc3504, - 0x1dd9f220, 0x0b8730e6, 0x0b98c45f, 0x1dd3228e, 0x1dd0db10, 0x0b9e9f4d, 0x0bb02d68, 0x1dc9fdb2, - 0x1dc7b19b, 0x0bb6068a, 0x0bc78f3b, 0x1dc0c676, 0x1dbe75c8, 0x0bcd668e, 0x0bdee9ca, 0x1db77cdf, - 0x1db5279c, 0x0be4bf4a, 0x0bf63d07, 0x1dae20f4, 0x1dabc71d, 0x0bfc10af, 0x0c0d88e2, 0x1da4b2ba, - 0x1da25450, 0x0c135ab0, 0x0c24cd4e, 0x1d9b3237, 0x1d98cf3b, 0x0c2a9d3e, 0x0c3c0a3d, 0x1d919f70, - 0x1d8f37e5, 0x0c41d84b, 0x0c533fa0, 0x1d87fa6d, 0x1d858e53, 0x0c590bc9, 0x0c6a6d68, 0x1d7e4332, - 0x1d7bd28b, 0x0c7037a8, 0x0c819388, 0x1d7479c5, 0x1d720493, 0x0c875bdb, 0x0c98b1f0, 0x1d6a9e2e, - 0x1d682472, 0x0c9e7854, 0x0cafc894, 0x1d60b070, 0x1d5e322c, 0x0cb58d04, 0x0cc6d764, 0x1d56b094, - 0x1d542dc9, 0x0ccc99de, 0x0cddde53, 0x1d4c9e9f, 0x1d4a174f, 0x0ce39ed2, 0x0cf4dd52, 0x1d427a97, - 0x1d3feec3, 0x0cfa9bd2, 0x0d0bd452, 0x1d384483, 0x1d35b42d, 0x0d1190d1, 0x0d22c347, 0x1d2dfc68, - 0x1d2b6791, 0x0d287dc1, 0x0d39aa21, 0x1d23a24e, 0x1d2108f8, 0x0d3f6292, 0x0d5088d3, 0x1d19363a, - 0x1d169867, 0x0d563f38, 0x0d675f4e, 0x1d0eb833, 0x1d0c15e4, 0x0d6d13a3, 0x0d7e2d85, 0x1d04283f, - 0x1d018176, 0x0d83dfc6, 0x0d94f369, 0x1cf98666, 0x1cf6db24, 0x0d9aa393, 0x0dabb0ec, 0x1ceed2ad, - 0x1cec22f4, 0x0db15efc, 0x0dc26600, 0x1ce40d1b, 0x1ce158ed, 0x0dc811f3, 0x0dd91298, 0x1cd935b7, - 0x1cd67d15, 0x0ddebc69, 0x0defb6a5, 0x1cce4c87, 0x1ccb8f74, 0x0df55e51, 0x0e065219, 0x1cc35192, - 0x1cc0900f, 0x0e0bf79c, 0x0e1ce4e6, 0x1cb844df, 0x1cb57eee, 0x0e22883e, 0x0e336eff, 0x1cad2675, - 0x1caa5c17, 0x0e391027, 0x0e49f055, 0x1ca1f65b, 0x1c9f2792, 0x0e4f8f4b, 0x0e6068db, 0x1c96b497, - 0x1c93e165, 0x0e66059a, 0x0e76d883, 0x1c8b6131, 0x1c888997, 0x0e7c7308, 0x0e8d3f3e, 0x1c7ffc2f, - 0x1c7d202f, 0x0e92d787, 0x0ea39d00, 0x1c748599, 0x1c71a535, 0x0ea93308, 0x0eb9f1ba, 0x1c68fd75, - 0x1c6618ae, 0x0ebf857d, 0x0ed03d5e, 0x1c5d63ca, 0x1c5a7aa4, 0x0ed5ceda, 0x0ee67fdf, 0x1c51b8a1, - 0x1c4ecb1c, 0x0eec0f10, 0x0efcb92f, 0x1c45fc00, 0x1c430a1d, 0x0f024612, 0x0f12e941, 0x1c3a2ded, - 0x1c3737b0, 0x0f1873d2, 0x0f291006, 0x1c2e4e72, 0x1c2b53db, 0x0f2e9842, 0x0f3f2d71, 0x1c225d94, - 0x1c1f5ea6, 0x0f44b354, 0x0f554175, 0x1c165b5b, 0x1c135818, 0x0f5ac4fc, 0x0f6b4c03, 0x1c0a47cf, - 0x1c074038, 0x0f70cd2a, 0x0f814d0e, 0x1bfe22f8, 0x1bfb170f, 0x0f86cbd3, 0x0f974489, 0x1bf1ecdb, - 0x1beedca2, 0x0f9cc0e7, 0x0fad3265, 0x1be5a582, 0x1be290fb, 0x0fb2ac5a, 0x0fc31697, 0x1bd94cf4, - 0x1bd63421, 0x0fc88e1e, 0x0fd8f10f, 0x1bcce337, 0x1bc9c61a, 0x0fde6626, 0x0feec1c0, 0x1bc06855, - 0x1bbd46f0, 0x0ff43464, 0x1004889e, 0x1bb3dc55, 0x1bb0b6a9, 0x1009f8cb, 0x101a459a, 0x1ba73f3d, - 0x1ba4154d, 0x101fb34d, 0x102ff8a8, 0x1b9a9117, 0x1b9762e4, 0x103563dc, 0x1045a1b9, 0x1b8dd1ea, - 0x1b8a9f77, 0x104b0a6c, 0x105b40c1, 0x1b8101be, 0x1b7dcb0c, 0x1060a6ef, 0x1070d5b1, 0x1b74209b, - 0x1b70e5ac, 0x10763958, 0x1086607e, 0x1b672e88, 0x1b63ef5f, 0x108bc19a, 0x109be119, 0x1b5a2b8e, - 0x1b56e82c, 0x10a13fa6, 0x10b15775, 0x1b4d17b4, 0x1b49d01c, 0x10b6b371, 0x10c6c385, 0x1b3ff304, - 0x1b3ca737, 0x10cc1cec, 0x10dc253c, 0x1b32bd84, 0x1b2f6d85, 0x10e17c0b, 0x10f17c8d, 0x1b25773d, - 0x1b22230e, 0x10f6d0c0, 0x1106c96a, 0x1b182038, 0x1b14c7da, 0x110c1afe, 0x111c0bc6, 0x1b0ab87c, - 0x1b075bf1, 0x11215ab8, 0x11314395, 0x1afd4012, 0x1af9df5d, 0x11368fe1, 0x114670c8, 0x1aefb702, - 0x1aec5225, 0x114bba6b, 0x115b9354, 0x1ae21d54, 0x1adeb451, 0x1160da4b, 0x1170ab2a, 0x1ad47311, - 0x1ad105e9, 0x1175ef72, 0x1185b83f, 0x1ac6b841, 0x1ac346f8, 0x118af9d4, 0x119aba84, 0x1ab8ecec, - 0x1ab57784, 0x119ff964, 0x11afb1ee, 0x1aab111c, 0x1aa79796, 0x11b4ee14, 0x11c49e6f, 0x1a9d24d9, - 0x1a99a737, 0x11c9d7d9, 0x11d97ff9, 0x1a8f282b, 0x1a8ba670, 0x11deb6a4, 0x11ee5682, 0x1a811b1b, - 0x1a7d9549, 0x11f38a6a, 0x120321fa, 0x1a72fdb2, 0x1a6f73ca, 0x1208531c, 0x1217e256, 0x1a64cff8, - 0x1a6141fd, 0x121d10af, 0x122c9789, 0x1a5691f5, 0x1a52ffeb, 0x1231c316, 0x12414186, 0x1a4843b4, - 0x1a44ad9b, 0x12466a44, 0x1255e041, 0x1a39e53d, 0x1a364b17, 0x125b062b, 0x126a73ac, 0x1a2b7698, - 0x1a27d868, 0x126f96c1, 0x127efbbb, 0x1a1cf7ce, 0x1a195597, 0x12841bf6, 0x12937861, 0x1a0e68e9, - 0x1a0ac2ac, 0x129895c0, 0x12a7e991, 0x19ffc9f1, 0x19fc1fb1, 0x12ad0412, 0x12bc4f40, 0x19f11af0, - 0x19ed6caf, 0x12c166de, 0x12d0a960, 0x19e25bee, 0x19dea9ae, 0x12d5be18, 0x12e4f7e5, 0x19d38cf4, - 0x19cfd6b8, 0x12ea09b4, 0x12f93ac2, 0x19c4ae0c, 0x19c0f3d6, 0x12fe49a6, 0x130d71eb, 0x19b5bf3f, - 0x19b20111, 0x13127de0, 0x13219d53, 0x19a6c096, 0x19a2fe73, 0x1326a656, 0x1335bcef, 0x1997b21b, - 0x1993ec04, 0x133ac2fc, 0x1349d0b0, 0x198893d6, 0x1984c9ce, 0x134ed3c5, 0x135dd88c, 0x197965d0, - 0x197597da, 0x1362d8a6, 0x1371d476, 0x196a2815, 0x19665632, 0x1376d191, 0x1385c461, 0x195adaab, - 0x195704df, 0x138abe7b, 0x1399a841, 0x194b7d9e, 0x1947a3eb, 0x139e9f56, 0x13ad800a, 0x193c10f7, - 0x1938335e, 0x13b27417, 0x13c14bb0, 0x192c94bf, 0x1928b343, 0x13c63cb2, 0x13d50b26, 0x191d08ff, - 0x191923a3, 0x13d9f91b, 0x13e8be60, 0x190d6dc1, 0x19098488, 0x13eda944, 0x13fc6553, 0x18fdc310, - 0x18f9d5fa, 0x14014d23, 0x140ffff1, 0x18ee08f4, 0x18ea1805, 0x1414e4aa, 0x14238e2f, 0x18de3f77, - 0x18da4ab2, 0x14286fce, 0x14371001, 0x18ce66a3, 0x18ca6e0a, 0x143bee83, 0x144a855b, 0x18be7e82, - 0x18ba8217, 0x144f60bd, 0x145dee30, 0x18ae871e, 0x18aa86e3, 0x1462c670, 0x14714a76, 0x189e8080, - 0x189a7c78, 0x14761f8f, 0x14849a1f, 0x188e6ab2, 0x188a62e0, 0x14896c0f, 0x1497dd20, 0x187e45be, - 0x187a3a25, 0x149cabe4, 0x14ab136d, 0x186e11af, 0x186a0250, 0x14afdf03, 0x14be3cfa, 0x185dce8e, - 0x1859bb6c, 0x14c3055e, 0x14d159bc, 0x184d7c65, 0x18496583, 0x14d61eeb, 0x14e469a6, 0x183d1b3e, - 0x1839009e, 0x14e92b9e, 0x14f76cad, 0x182cab24, 0x18288cc8, 0x14fc2b6a, 0x150a62c6, 0x181c2c20, - 0x18180a0c, 0x150f1e45, 0x151d4be3, 0x180b9e3d, 0x18077873, 0x15220422, 0x153027fb, 0x17fb0185, - 0x17f6d807, 0x1534dcf6, 0x1542f700, 0x17ea5602, 0x17e628d3, 0x1547a8b5, 0x1555b8e8, 0x17d99bbe, - 0x17d56ae0, 0x155a6754, 0x15686da7, 0x17c8d2c4, 0x17c49e3b, 0x156d18c7, 0x157b1532, 0x17b7fb1f, - 0x17b3c2ec, 0x157fbd03, 0x158daf7c, 0x17a714d7, 0x17a2d8fe, 0x159253fb, 0x15a03c7a, 0x17961ff9, - 0x1791e07b, 0x15a4dda5, 0x15b2bc22, 0x17851c8e, 0x1780d96f, 0x15b759f5, 0x15c52e67, 0x17740aa1, - 0x176fc3e3, 0x15c9c8e0, 0x15d7933f, 0x1762ea3d, 0x175e9fe2, 0x15dc2a5a, 0x15e9ea9d, 0x1751bb6b, - 0x174d6d77, 0x15ee7e58, 0x15fc3477, 0x17407e37, 0x173c2cac, 0x1600c4cf, 0x160e70c1, 0x172f32ab, - 0x172add8c, 0x1612fdb3, 0x16209f70, 0x171dd8d2, 0x17198021, 0x162528fa, 0x1632c078, 0x170c70b7, - 0x17081477, 0x16374697, 0x1644d3d0, 0x16fafa64, 0x16f69a97, 0x16495680, 0x1656d96a, 0x16e975e4, - 0x16e5128e, 0x165b58aa, 0x1668d13e, 0x16d7e341, 0x16d37c65, 0x166d4d0a, 0x167abb3e, 0x16c64288, - 0x16c1d827, 0x167f3394, 0x168c9760, 0x16b493c2, 0x16b025e0, 0x16910c3d, 0x169e659a, 0x16a2d6fb -}; - -const int twidTab512[8*6 + 32*6 + 128*6] = { + 0x17a4f708, 0x159001d6, 0x15fe7cbe, 0x173e558e, 0x171bac96, 0x1622e450, 0x168ed1eb, 0x16b25ced, + /* 1024 */ + 0x1fffffd9, 0x0003243f, 0x0015fdba, 0x1ffff872, 0x1ffff382, 0x001c4637, 0x002f1fa6, 0x1fffdd4d, + 0x1fffd36f, 0x0035681d, 0x00484175, 0x1fffae6c, 0x1fff9f9e, 0x004e89e3, 0x00616318, 0x1fff6bce, + 0x1fff5811, 0x0067ab77, 0x007a847e, 0x1fff1572, 0x1ffefcc6, 0x0080cccc, 0x0093a599, 0x1ffeab5b, + 0x1ffe8dbf, 0x0099edd2, 0x00acc658, 0x1ffe2d86, 0x1ffe0afc, 0x00b30e78, 0x00c5e6ad, 0x1ffd9bf6, + 0x1ffd747c, 0x00cc2eb0, 0x00df0688, 0x1ffcf6aa, 0x1ffcca41, 0x00e54e6a, 0x00f825da, 0x1ffc3da2, + 0x1ffc0c4b, 0x00fe6d97, 0x01114492, 0x1ffb70e0, 0x1ffb3a9a, 0x01178c27, 0x012a62a2, 0x1ffa9063, + 0x1ffa552e, 0x0130aa0a, 0x01437ffa, 0x1ff99c2c, 0x1ff95c09, 0x0149c731, 0x015c9c8a, 0x1ff8943c, + 0x1ff84f2b, 0x0162e38d, 0x0175b843, 0x1ff77893, 0x1ff72e94, 0x017bff0e, 0x018ed316, 0x1ff64932, + 0x1ff5fa46, 0x019519a5, 0x01a7ecf2, 0x1ff5061b, 0x1ff4b240, 0x01ae3341, 0x01c105c9, 0x1ff3af4c, + 0x1ff35684, 0x01c74bd5, 0x01da1d8c, 0x1ff244c8, 0x1ff1e713, 0x01e0634f, 0x01f33429, 0x1ff0c68f, + 0x1ff063ed, 0x01f979a1, 0x020c4993, 0x1fef34a3, 0x1feecd14, 0x02128ebb, 0x02255db9, 0x1fed8f03, + 0x1fed2287, 0x022ba28f, 0x023e708d, 0x1febd5b2, 0x1feb644a, 0x0244b50b, 0x025781fe, 0x1fea08b0, + 0x1fe9925c, 0x025dc621, 0x027091fd, 0x1fe827fe, 0x1fe7acbe, 0x0276d5c1, 0x0289a07b, 0x1fe6339d, + 0x1fe5b372, 0x028fe3dd, 0x02a2ad69, 0x1fe42b90, 0x1fe3a679, 0x02a8f063, 0x02bbb8b6, 0x1fe20fd6, + 0x1fe185d5, 0x02c1fb46, 0x02d4c253, 0x1fdfe071, 0x1fdf5186, 0x02db0475, 0x02edca32, 0x1fdd9d64, + 0x1fdd098e, 0x02f40be2, 0x0306d042, 0x1fdb46ae, 0x1fdaadee, 0x030d117c, 0x031fd474, 0x1fd8dc51, + 0x1fd83ea8, 0x03261534, 0x0338d6b8, 0x1fd65e4f, 0x1fd5bbbd, 0x033f16fb, 0x0351d700, 0x1fd3ccaa, + 0x1fd32530, 0x035816c1, 0x036ad53c, 0x1fd12763, 0x1fd07b00, 0x03711477, 0x0383d15c, 0x1fce6e7c, + 0x1fcdbd31, 0x038a100e, 0x039ccb51, 0x1fcba1f5, 0x1fcaebc3, 0x03a30975, 0x03b5c30b, 0x1fc8c1d2, + 0x1fc806b9, 0x03bc009f, 0x03ceb87c, 0x1fc5ce14, 0x1fc50e14, 0x03d4f57a, 0x03e7ab93, 0x1fc2c6bd, + 0x1fc201d7, 0x03ede7f9, 0x04009c42, 0x1fbfabcd, 0x1fbee202, 0x0406d80b, 0x04198a78, 0x1fbc7d49, + 0x1fbbae99, 0x041fc5a1, 0x04327628, 0x1fb93b31, 0x1fb8679c, 0x0438b0ac, 0x044b5f40, 0x1fb5e587, + 0x1fb50d0e, 0x0451991d, 0x046445b2, 0x1fb27c4e, 0x1fb19ef1, 0x046a7ee3, 0x047d296f, 0x1faeff87, + 0x1fae1d47, 0x048361f0, 0x04960a67, 0x1fab6f35, 0x1faa8813, 0x049c4235, 0x04aee88b, 0x1fa7cb5a, + 0x1fa6df56, 0x04b51fa1, 0x04c7c3cb, 0x1fa413f8, 0x1fa32313, 0x04cdfa26, 0x04e09c18, 0x1fa04912, + 0x1f9f534c, 0x04e6d1b4, 0x04f97163, 0x1f9c6aa9, 0x1f9b7003, 0x04ffa63c, 0x0512439d, 0x1f9878c1, + 0x1f97793b, 0x051877af, 0x052b12b6, 0x1f94735b, 0x1f936ef6, 0x053145fd, 0x0543de9e, 0x1f905a7a, + 0x1f8f5137, 0x054a1117, 0x055ca748, 0x1f8c2e21, 0x1f8b2000, 0x0562d8ee, 0x05756ca2, 0x1f87ee52, + 0x1f86db55, 0x057b9d73, 0x058e2e9f, 0x1f839b10, 0x1f828336, 0x05945e95, 0x05a6ed2e, 0x1f7f345e, + 0x1f7e17a8, 0x05ad1c47, 0x05bfa840, 0x1f7aba3e, 0x1f7998ad, 0x05c5d678, 0x05d85fc7, 0x1f762cb2, + 0x1f750647, 0x05de8d19, 0x05f113b3, 0x1f718bbf, 0x1f70607a, 0x05f7401c, 0x0609c3f5, 0x1f6cd766, + 0x1f6ba748, 0x060fef71, 0x0622707d, 0x1f680fab, 0x1f66dab5, 0x06289b08, 0x063b193c, 0x1f633490, + 0x1f61fac3, 0x064142d3, 0x0653be23, 0x1f5e4619, 0x1f5d0775, 0x0659e6c2, 0x066c5f24, 0x1f594448, + 0x1f5800ce, 0x067286c6, 0x0684fc2e, 0x1f542f21, 0x1f52e6d2, 0x068b22d0, 0x069d9532, 0x1f4f06a6, + 0x1f4db983, 0x06a3bad0, 0x06b62a22, 0x1f49cadc, 0x1f4878e5, 0x06bc4eb9, 0x06cebaee, 0x1f447bc4, + 0x1f4324fb, 0x06d4de79, 0x06e74786, 0x1f3f1963, 0x1f3dbdc8, 0x06ed6a03, 0x06ffcfdd, 0x1f39a3bc, + 0x1f384350, 0x0705f147, 0x071853e3, 0x1f341ad2, 0x1f32b595, 0x071e7436, 0x0730d388, 0x1f2e7ea9, + 0x1f2d149d, 0x0736f2c0, 0x07494ebd, 0x1f28cf43, 0x1f276069, 0x074f6cd7, 0x0761c574, 0x1f230ca5, + 0x1f2198fd, 0x0767e26c, 0x077a379d, 0x1f1d36d2, 0x1f1bbe5d, 0x07805370, 0x0792a52a, 0x1f174dce, + 0x1f15d08d, 0x0798bfd3, 0x07ab0e0a, 0x1f11519c, 0x1f0fcf91, 0x07b12786, 0x07c37230, 0x1f0b4240, + 0x1f09bb6b, 0x07c98a7a, 0x07dbd18c, 0x1f051fbe, 0x1f03941f, 0x07e1e8a1, 0x07f42c0e, 0x1efeea19, + 0x1efd59b3, 0x07fa41eb, 0x080c81a9, 0x1ef8a155, 0x1ef70c28, 0x0812964a, 0x0824d24d, 0x1ef24577, + 0x1ef0ab84, 0x082ae5ad, 0x083d1dea, 0x1eebd682, 0x1eea37ca, 0x08433007, 0x08556473, 0x1ee5547a, + 0x1ee3b0fe, 0x085b7548, 0x086da5d8, 0x1edebf64, 0x1edd1724, 0x0873b562, 0x0885e209, 0x1ed81742, + 0x1ed66a41, 0x088bf044, 0x089e18f9, 0x1ed15c1a, 0x1ecfaa57, 0x08a425e1, 0x08b64a98, 0x1eca8def, + 0x1ec8d76c, 0x08bc562a, 0x08ce76d8, 0x1ec3acc6, 0x1ec1f184, 0x08d4810f, 0x08e69da8, 0x1ebcb8a3, + 0x1ebaf8a3, 0x08eca681, 0x08febefb, 0x1eb5b18a, 0x1eb3eccd, 0x0904c673, 0x0916dac2, 0x1eae977f, + 0x1eacce07, 0x091ce0d4, 0x092ef0ed, 0x1ea76a87, 0x1ea59c55, 0x0934f596, 0x0947016e, 0x1ea02aa7, + 0x1e9e57bb, 0x094d04aa, 0x095f0c36, 0x1e98d7e2, 0x1e97003e, 0x09650e01, 0x09771136, 0x1e91723e, + 0x1e8f95e3, 0x097d118d, 0x098f1060, 0x1e89f9bf, 0x1e8818ad, 0x09950f3f, 0x09a709a4, 0x1e826e69, + 0x1e8088a2, 0x09ad0707, 0x09befcf4, 0x1e7ad041, 0x1e78e5c7, 0x09c4f8d8, 0x09d6ea40, 0x1e731f4c, + 0x1e71301f, 0x09dce4a1, 0x09eed17b, 0x1e6b5b8f, 0x1e6967b1, 0x09f4ca56, 0x0a06b296, 0x1e63850e, + 0x1e618c80, 0x0a0ca9e6, 0x0a1e8d81, 0x1e5b9bce, 0x1e599e91, 0x0a248343, 0x0a36622e, 0x1e539fd4, + 0x1e519dea, 0x0a3c565e, 0x0a4e308f, 0x1e4b9126, 0x1e498a8e, 0x0a542329, 0x0a65f894, 0x1e436fc7, + 0x1e416485, 0x0a6be995, 0x0a7dba2f, 0x1e3b3bbd, 0x1e392bd1, 0x0a83a993, 0x0a957551, 0x1e32f50e, + 0x1e30e079, 0x0a9b6315, 0x0aad29ec, 0x1e2a9bbd, 0x1e288281, 0x0ab3160c, 0x0ac4d7f1, 0x1e222fd1, + 0x1e2011ee, 0x0acac26a, 0x0adc7f52, 0x1e19b14f, 0x1e178ec7, 0x0ae2681f, 0x0af41fff, 0x1e11203b, + 0x1e0ef910, 0x0afa071d, 0x0b0bb9eb, 0x1e087c9b, 0x1e0650ce, 0x0b119f56, 0x0b234d07, 0x1dffc674, + 0x1dfd9606, 0x0b2930bb, 0x0b3ad943, 0x1df6fdcc, 0x1df4c8bf, 0x0b40bb3e, 0x0b525e92, 0x1dee22a9, + 0x1debe8fd, 0x0b583ecf, 0x0b69dce6, 0x1de5350f, 0x1de2f6c6, 0x0b6fbb62, 0x0b81542f, 0x1ddc3504, + 0x1dd9f220, 0x0b8730e6, 0x0b98c45f, 0x1dd3228e, 0x1dd0db10, 0x0b9e9f4d, 0x0bb02d68, 0x1dc9fdb2, + 0x1dc7b19b, 0x0bb6068a, 0x0bc78f3b, 0x1dc0c676, 0x1dbe75c8, 0x0bcd668e, 0x0bdee9ca, 0x1db77cdf, + 0x1db5279c, 0x0be4bf4a, 0x0bf63d07, 0x1dae20f4, 0x1dabc71d, 0x0bfc10af, 0x0c0d88e2, 0x1da4b2ba, + 0x1da25450, 0x0c135ab0, 0x0c24cd4e, 0x1d9b3237, 0x1d98cf3b, 0x0c2a9d3e, 0x0c3c0a3d, 0x1d919f70, + 0x1d8f37e5, 0x0c41d84b, 0x0c533fa0, 0x1d87fa6d, 0x1d858e53, 0x0c590bc9, 0x0c6a6d68, 0x1d7e4332, + 0x1d7bd28b, 0x0c7037a8, 0x0c819388, 0x1d7479c5, 0x1d720493, 0x0c875bdb, 0x0c98b1f0, 0x1d6a9e2e, + 0x1d682472, 0x0c9e7854, 0x0cafc894, 0x1d60b070, 0x1d5e322c, 0x0cb58d04, 0x0cc6d764, 0x1d56b094, + 0x1d542dc9, 0x0ccc99de, 0x0cddde53, 0x1d4c9e9f, 0x1d4a174f, 0x0ce39ed2, 0x0cf4dd52, 0x1d427a97, + 0x1d3feec3, 0x0cfa9bd2, 0x0d0bd452, 0x1d384483, 0x1d35b42d, 0x0d1190d1, 0x0d22c347, 0x1d2dfc68, + 0x1d2b6791, 0x0d287dc1, 0x0d39aa21, 0x1d23a24e, 0x1d2108f8, 0x0d3f6292, 0x0d5088d3, 0x1d19363a, + 0x1d169867, 0x0d563f38, 0x0d675f4e, 0x1d0eb833, 0x1d0c15e4, 0x0d6d13a3, 0x0d7e2d85, 0x1d04283f, + 0x1d018176, 0x0d83dfc6, 0x0d94f369, 0x1cf98666, 0x1cf6db24, 0x0d9aa393, 0x0dabb0ec, 0x1ceed2ad, + 0x1cec22f4, 0x0db15efc, 0x0dc26600, 0x1ce40d1b, 0x1ce158ed, 0x0dc811f3, 0x0dd91298, 0x1cd935b7, + 0x1cd67d15, 0x0ddebc69, 0x0defb6a5, 0x1cce4c87, 0x1ccb8f74, 0x0df55e51, 0x0e065219, 0x1cc35192, + 0x1cc0900f, 0x0e0bf79c, 0x0e1ce4e6, 0x1cb844df, 0x1cb57eee, 0x0e22883e, 0x0e336eff, 0x1cad2675, + 0x1caa5c17, 0x0e391027, 0x0e49f055, 0x1ca1f65b, 0x1c9f2792, 0x0e4f8f4b, 0x0e6068db, 0x1c96b497, + 0x1c93e165, 0x0e66059a, 0x0e76d883, 0x1c8b6131, 0x1c888997, 0x0e7c7308, 0x0e8d3f3e, 0x1c7ffc2f, + 0x1c7d202f, 0x0e92d787, 0x0ea39d00, 0x1c748599, 0x1c71a535, 0x0ea93308, 0x0eb9f1ba, 0x1c68fd75, + 0x1c6618ae, 0x0ebf857d, 0x0ed03d5e, 0x1c5d63ca, 0x1c5a7aa4, 0x0ed5ceda, 0x0ee67fdf, 0x1c51b8a1, + 0x1c4ecb1c, 0x0eec0f10, 0x0efcb92f, 0x1c45fc00, 0x1c430a1d, 0x0f024612, 0x0f12e941, 0x1c3a2ded, + 0x1c3737b0, 0x0f1873d2, 0x0f291006, 0x1c2e4e72, 0x1c2b53db, 0x0f2e9842, 0x0f3f2d71, 0x1c225d94, + 0x1c1f5ea6, 0x0f44b354, 0x0f554175, 0x1c165b5b, 0x1c135818, 0x0f5ac4fc, 0x0f6b4c03, 0x1c0a47cf, + 0x1c074038, 0x0f70cd2a, 0x0f814d0e, 0x1bfe22f8, 0x1bfb170f, 0x0f86cbd3, 0x0f974489, 0x1bf1ecdb, + 0x1beedca2, 0x0f9cc0e7, 0x0fad3265, 0x1be5a582, 0x1be290fb, 0x0fb2ac5a, 0x0fc31697, 0x1bd94cf4, + 0x1bd63421, 0x0fc88e1e, 0x0fd8f10f, 0x1bcce337, 0x1bc9c61a, 0x0fde6626, 0x0feec1c0, 0x1bc06855, + 0x1bbd46f0, 0x0ff43464, 0x1004889e, 0x1bb3dc55, 0x1bb0b6a9, 0x1009f8cb, 0x101a459a, 0x1ba73f3d, + 0x1ba4154d, 0x101fb34d, 0x102ff8a8, 0x1b9a9117, 0x1b9762e4, 0x103563dc, 0x1045a1b9, 0x1b8dd1ea, + 0x1b8a9f77, 0x104b0a6c, 0x105b40c1, 0x1b8101be, 0x1b7dcb0c, 0x1060a6ef, 0x1070d5b1, 0x1b74209b, + 0x1b70e5ac, 0x10763958, 0x1086607e, 0x1b672e88, 0x1b63ef5f, 0x108bc19a, 0x109be119, 0x1b5a2b8e, + 0x1b56e82c, 0x10a13fa6, 0x10b15775, 0x1b4d17b4, 0x1b49d01c, 0x10b6b371, 0x10c6c385, 0x1b3ff304, + 0x1b3ca737, 0x10cc1cec, 0x10dc253c, 0x1b32bd84, 0x1b2f6d85, 0x10e17c0b, 0x10f17c8d, 0x1b25773d, + 0x1b22230e, 0x10f6d0c0, 0x1106c96a, 0x1b182038, 0x1b14c7da, 0x110c1afe, 0x111c0bc6, 0x1b0ab87c, + 0x1b075bf1, 0x11215ab8, 0x11314395, 0x1afd4012, 0x1af9df5d, 0x11368fe1, 0x114670c8, 0x1aefb702, + 0x1aec5225, 0x114bba6b, 0x115b9354, 0x1ae21d54, 0x1adeb451, 0x1160da4b, 0x1170ab2a, 0x1ad47311, + 0x1ad105e9, 0x1175ef72, 0x1185b83f, 0x1ac6b841, 0x1ac346f8, 0x118af9d4, 0x119aba84, 0x1ab8ecec, + 0x1ab57784, 0x119ff964, 0x11afb1ee, 0x1aab111c, 0x1aa79796, 0x11b4ee14, 0x11c49e6f, 0x1a9d24d9, + 0x1a99a737, 0x11c9d7d9, 0x11d97ff9, 0x1a8f282b, 0x1a8ba670, 0x11deb6a4, 0x11ee5682, 0x1a811b1b, + 0x1a7d9549, 0x11f38a6a, 0x120321fa, 0x1a72fdb2, 0x1a6f73ca, 0x1208531c, 0x1217e256, 0x1a64cff8, + 0x1a6141fd, 0x121d10af, 0x122c9789, 0x1a5691f5, 0x1a52ffeb, 0x1231c316, 0x12414186, 0x1a4843b4, + 0x1a44ad9b, 0x12466a44, 0x1255e041, 0x1a39e53d, 0x1a364b17, 0x125b062b, 0x126a73ac, 0x1a2b7698, + 0x1a27d868, 0x126f96c1, 0x127efbbb, 0x1a1cf7ce, 0x1a195597, 0x12841bf6, 0x12937861, 0x1a0e68e9, + 0x1a0ac2ac, 0x129895c0, 0x12a7e991, 0x19ffc9f1, 0x19fc1fb1, 0x12ad0412, 0x12bc4f40, 0x19f11af0, + 0x19ed6caf, 0x12c166de, 0x12d0a960, 0x19e25bee, 0x19dea9ae, 0x12d5be18, 0x12e4f7e5, 0x19d38cf4, + 0x19cfd6b8, 0x12ea09b4, 0x12f93ac2, 0x19c4ae0c, 0x19c0f3d6, 0x12fe49a6, 0x130d71eb, 0x19b5bf3f, + 0x19b20111, 0x13127de0, 0x13219d53, 0x19a6c096, 0x19a2fe73, 0x1326a656, 0x1335bcef, 0x1997b21b, + 0x1993ec04, 0x133ac2fc, 0x1349d0b0, 0x198893d6, 0x1984c9ce, 0x134ed3c5, 0x135dd88c, 0x197965d0, + 0x197597da, 0x1362d8a6, 0x1371d476, 0x196a2815, 0x19665632, 0x1376d191, 0x1385c461, 0x195adaab, + 0x195704df, 0x138abe7b, 0x1399a841, 0x194b7d9e, 0x1947a3eb, 0x139e9f56, 0x13ad800a, 0x193c10f7, + 0x1938335e, 0x13b27417, 0x13c14bb0, 0x192c94bf, 0x1928b343, 0x13c63cb2, 0x13d50b26, 0x191d08ff, + 0x191923a3, 0x13d9f91b, 0x13e8be60, 0x190d6dc1, 0x19098488, 0x13eda944, 0x13fc6553, 0x18fdc310, + 0x18f9d5fa, 0x14014d23, 0x140ffff1, 0x18ee08f4, 0x18ea1805, 0x1414e4aa, 0x14238e2f, 0x18de3f77, + 0x18da4ab2, 0x14286fce, 0x14371001, 0x18ce66a3, 0x18ca6e0a, 0x143bee83, 0x144a855b, 0x18be7e82, + 0x18ba8217, 0x144f60bd, 0x145dee30, 0x18ae871e, 0x18aa86e3, 0x1462c670, 0x14714a76, 0x189e8080, + 0x189a7c78, 0x14761f8f, 0x14849a1f, 0x188e6ab2, 0x188a62e0, 0x14896c0f, 0x1497dd20, 0x187e45be, + 0x187a3a25, 0x149cabe4, 0x14ab136d, 0x186e11af, 0x186a0250, 0x14afdf03, 0x14be3cfa, 0x185dce8e, + 0x1859bb6c, 0x14c3055e, 0x14d159bc, 0x184d7c65, 0x18496583, 0x14d61eeb, 0x14e469a6, 0x183d1b3e, + 0x1839009e, 0x14e92b9e, 0x14f76cad, 0x182cab24, 0x18288cc8, 0x14fc2b6a, 0x150a62c6, 0x181c2c20, + 0x18180a0c, 0x150f1e45, 0x151d4be3, 0x180b9e3d, 0x18077873, 0x15220422, 0x153027fb, 0x17fb0185, + 0x17f6d807, 0x1534dcf6, 0x1542f700, 0x17ea5602, 0x17e628d3, 0x1547a8b5, 0x1555b8e8, 0x17d99bbe, + 0x17d56ae0, 0x155a6754, 0x15686da7, 0x17c8d2c4, 0x17c49e3b, 0x156d18c7, 0x157b1532, 0x17b7fb1f, + 0x17b3c2ec, 0x157fbd03, 0x158daf7c, 0x17a714d7, 0x17a2d8fe, 0x159253fb, 0x15a03c7a, 0x17961ff9, + 0x1791e07b, 0x15a4dda5, 0x15b2bc22, 0x17851c8e, 0x1780d96f, 0x15b759f5, 0x15c52e67, 0x17740aa1, + 0x176fc3e3, 0x15c9c8e0, 0x15d7933f, 0x1762ea3d, 0x175e9fe2, 0x15dc2a5a, 0x15e9ea9d, 0x1751bb6b, + 0x174d6d77, 0x15ee7e58, 0x15fc3477, 0x17407e37, 0x173c2cac, 0x1600c4cf, 0x160e70c1, 0x172f32ab, + 0x172add8c, 0x1612fdb3, 0x16209f70, 0x171dd8d2, 0x17198021, 0x162528fa, 0x1632c078, 0x170c70b7, + 0x17081477, 0x16374697, 0x1644d3d0, 0x16fafa64, 0x16f69a97, 0x16495680, 0x1656d96a, 0x16e975e4, + 0x16e5128e, 0x165b58aa, 0x1668d13e, 0x16d7e341, 0x16d37c65, 0x166d4d0a, 0x167abb3e, 0x16c64288, + 0x16c1d827, 0x167f3394, 0x168c9760, 0x16b493c2, 0x16b025e0, 0x16910c3d, 0x169e659a, 0x16a2d6fb +}; + +const int twidTab512[8*6 + 32*6 + 128*6] = { 0x20000000, 0x00000000, 0x1d906bcf, 0x0c3ef153, 0x16a09e66, 0x16a09e66, 0x0c3ef153, 0x1d906bcf, 0x20000000, 0x00000000, 0x1f6297d0, 0x063e2e0f, 0x1d906bcf, 0x0c3ef153, 0x1a9b6629, 0x11c73b3a, 0x20000000, 0x00000000, 0x1a9b6629, 0x11c73b3a, 0x0c3ef153, 0x1d906bcf, 0xf9c1d1f1, 0x1f6297d0, @@ -628,10 +628,10 @@ const int twidTab512[8*6 + 32*6 + 128*6] = { 0xf6b5fce9, 0xe160bea9, 0xf7d823f9, 0xe10e875c, 0xf8fd1f65, 0xe0c70c54, 0xfa248988, 0xe08a665c, 0xe027725c, 0x0322f4d8, 0xe0163253, 0x025aa412, 0xe009de1d, 0x0191f65f, 0xe002779f, 0x00c90ab0, 0x0191f65f, 0x1ff621e3, 0x012d8657, 0x1ffa72f0, 0x00c90ab0, 0x1ffd8861, 0x00648748, 0x1fff6217, - 0xfb4dfbe4, 0xe058aa81, 0xfc790f47, 0xe031ea03, 0xfda55bee, 0xe0163253, 0xfed279a9, 0xe0058d10 -}; - -const int twidTab64[4*6 + 16*6] = { + 0xfb4dfbe4, 0xe058aa81, 0xfc790f47, 0xe031ea03, 0xfda55bee, 0xe0163253, 0xfed279a9, 0xe0058d10 +}; + +const int twidTab64[4*6 + 16*6] = { 0x20000000, 0x00000000, 0x16a09e66, 0x16a09e66, 0x00000000, 0x20000000, 0xe95f619a, 0x16a09e66, 0x20000000, 0x00000000, 0x1d906bcf, 0x0c3ef153, 0x16a09e66, 0x16a09e66, 0x0c3ef153, 0x1d906bcf, 0x20000000, 0x00000000, 0x0c3ef153, 0x1d906bcf, 0xe95f619a, 0x16a09e66, 0xe26f9431, 0xf3c10ead, @@ -647,399 +647,399 @@ const int twidTab64[4*6 + 16*6] = { 0xe95f619a, 0x16a09e66, 0xe3c74d0e, 0x0f15ae9c, 0xe09d6830, 0x063e2e0f, 0xe027725c, 0xfcdd0b28, 0xe95f619a, 0x16a09e66, 0xe56499d7, 0x11c73b3a, 0xe26f9431, 0x0c3ef153, 0xe09d6830, 0x063e2e0f, 0x0c3ef153, 0x1d906bcf, 0x094a0317, 0x1e9f4157, 0x063e2e0f, 0x1f6297d0, 0x0322f4d8, 0x1fd88da4, - 0xe26f9431, 0xf3c10ead, 0xe7437f95, 0xebb30cdb, 0xee38c4c6, 0xe56499d7, 0xf6b5fce9, 0xe160bea9 -}; - + 0xe26f9431, 0xf3c10ead, 0xe7437f95, 0xebb30cdb, 0xee38c4c6, 0xe56499d7, 0xf6b5fce9, 0xe160bea9 +}; + #else -/* - * Q30 for 128 and 1024 - * - * for (i = 0; i < num/4; i++) { - * angle = (i + 0.125) * M_PI / num; - * x = cos(angle) * (1 << 30); - * x = sin(angle) * (1 << 30); - * - * angle = (num/2 - 1 - i + 0.125) * M_PI / num; - * x = cos(angle) * (1 << 30); - * x = sin(angle) * (1 << 30); - * } - */ -const int cossintab[128 + 1024] = { - /* 128 */ - 0x3fffec43, 0x003243f1, 0x015fd4d2, 0x3ffc38d1, 0x3ff9c13a, 0x01c454f5, 0x02f1b755, 0x3feea776, - 0x3fe9b8a9, 0x03562038, 0x0483259d, 0x3fd73a4a, 0x3fcfd50b, 0x04e767c5, 0x0613e1c5, 0x3fb5f4ea, - 0x3fac1a5b, 0x0677edbb, 0x07a3adff, 0x3f8adc77, 0x3f7e8e1e, 0x08077457, 0x09324ca7, 0x3f55f796, - 0x3f473759, 0x0995bdfd, 0x0abf8043, 0x3f174e70, 0x3f061e95, 0x0b228d42, 0x0c4b0b94, 0x3eceeaad, - 0x3ebb4ddb, 0x0cada4f5, 0x0dd4b19a, 0x3e7cd778, 0x3e66d0b4, 0x0e36c82a, 0x0f5c35a3, 0x3e212179, - 0x3e08b42a, 0x0fbdba40, 0x10e15b4e, 0x3dbbd6d4, 0x3da106bd, 0x11423ef0, 0x1263e699, 0x3d4d0728, - 0x3d2fd86c, 0x12c41a4f, 0x13e39be9, 0x3cd4c38b, 0x3cb53aaa, 0x144310dd, 0x15604013, 0x3c531e88, - 0x3c314060, 0x15bee78c, 0x16d99864, 0x3bc82c1f, 0x3ba3fde7, 0x173763c9, 0x184f6aab, 0x3b3401bb, - 0x3b0d8909, 0x18ac4b87, 0x19c17d44, 0x3a96b636, 0x3a6df8f8, 0x1a1d6544, 0x1b2f971e, 0x39f061d2, - 0x39c5664f, 0x1b8a7815, 0x1c997fc4, 0x39411e33, 0x3913eb0e, 0x1cf34baf, 0x1dfeff67, 0x38890663, - 0x3859a292, 0x1e57a86d, 0x1f5fdee6, 0x37c836c2, 0x3796a996, 0x1fb7575c, 0x20bbe7d8, 0x36fecd0e, - 0x36cb1e2a, 0x21122240, 0x2212e492, 0x362ce855, 0x35f71fb1, 0x2267d3a0, 0x2364a02e, 0x3552a8f4, - 0x351acedd, 0x23b836ca, 0x24b0e699, 0x34703095, 0x34364da6, 0x250317df, 0x25f78497, 0x3385a222, - 0x3349bf48, 0x264843d9, 0x273847c8, 0x329321c7, 0x32554840, 0x27878893, 0x2872feb6, 0x3198d4ea, - 0x31590e3e, 0x28c0b4d2, 0x29a778db, 0x3096e223, 0x30553828, 0x29f3984c, 0x2ad586a3, 0x2f8d713a, - 0x2f49ee0f, 0x2b2003ac, 0x2bfcf97c, 0x2e7cab1c, 0x2e37592c, 0x2c45c8a0, 0x2d1da3d5, 0x2d64b9da, - /* 1024 */ - 0x3fffffb1, 0x0006487f, 0x002bfb74, 0x3ffff0e3, 0x3fffe705, 0x00388c6e, 0x005e3f4c, 0x3fffba9b, - 0x3fffa6de, 0x006ad03b, 0x009082ea, 0x3fff5cd8, 0x3fff3f3c, 0x009d13c5, 0x00c2c62f, 0x3ffed79b, - 0x3ffeb021, 0x00cf56ef, 0x00f508fc, 0x3ffe2ae5, 0x3ffdf98c, 0x01019998, 0x01274b31, 0x3ffd56b5, - 0x3ffd1b7e, 0x0133dba3, 0x01598cb1, 0x3ffc5b0c, 0x3ffc15f7, 0x01661cf0, 0x018bcd5b, 0x3ffb37ec, - 0x3ffae8f9, 0x01985d60, 0x01be0d11, 0x3ff9ed53, 0x3ff99483, 0x01ca9cd4, 0x01f04bb4, 0x3ff87b44, - 0x3ff81896, 0x01fcdb2e, 0x02228924, 0x3ff6e1bf, 0x3ff67534, 0x022f184d, 0x0254c544, 0x3ff520c5, - 0x3ff4aa5d, 0x02615414, 0x0286fff3, 0x3ff33858, 0x3ff2b813, 0x02938e62, 0x02b93914, 0x3ff12878, - 0x3ff09e56, 0x02c5c71a, 0x02eb7086, 0x3feef126, 0x3fee5d28, 0x02f7fe1c, 0x031da62b, 0x3fec9265, - 0x3febf48b, 0x032a3349, 0x034fd9e5, 0x3fea0c35, 0x3fe96480, 0x035c6682, 0x03820b93, 0x3fe75e98, - 0x3fe6ad08, 0x038e97a9, 0x03b43b17, 0x3fe48990, 0x3fe3ce26, 0x03c0c69e, 0x03e66852, 0x3fe18d1f, - 0x3fe0c7da, 0x03f2f342, 0x04189326, 0x3fde6945, 0x3fdd9a27, 0x04251d77, 0x044abb73, 0x3fdb1e06, - 0x3fda450f, 0x0457451d, 0x047ce11a, 0x3fd7ab64, 0x3fd6c894, 0x04896a16, 0x04af03fc, 0x3fd4115f, - 0x3fd324b7, 0x04bb8c42, 0x04e123fa, 0x3fd04ffc, 0x3fcf597c, 0x04edab83, 0x051340f6, 0x3fcc673b, - 0x3fcb66e4, 0x051fc7b9, 0x05455ad1, 0x3fc8571f, 0x3fc74cf3, 0x0551e0c7, 0x0577716b, 0x3fc41fac, - 0x3fc30baa, 0x0583f68c, 0x05a984a6, 0x3fbfc0e3, 0x3fbea30c, 0x05b608eb, 0x05db9463, 0x3fbb3ac7, - 0x3fba131b, 0x05e817c3, 0x060da083, 0x3fb68d5b, 0x3fb55bdc, 0x061a22f7, 0x063fa8e7, 0x3fb1b8a2, - 0x3fb07d50, 0x064c2a67, 0x0671ad71, 0x3facbc9f, 0x3fab777b, 0x067e2df5, 0x06a3ae00, 0x3fa79954, - 0x3fa64a5f, 0x06b02d81, 0x06d5aa77, 0x3fa24ec6, 0x3fa0f600, 0x06e228ee, 0x0707a2b7, 0x3f9cdcf7, - 0x3f9b7a62, 0x0714201b, 0x073996a1, 0x3f9743eb, 0x3f95d787, 0x074612eb, 0x076b8616, 0x3f9183a5, - 0x3f900d72, 0x0778013d, 0x079d70f7, 0x3f8b9c28, 0x3f8a1c29, 0x07a9eaf5, 0x07cf5726, 0x3f858d79, - 0x3f8403ae, 0x07dbcff2, 0x08013883, 0x3f7f579b, 0x3f7dc405, 0x080db016, 0x083314f1, 0x3f78fa92, - 0x3f775d31, 0x083f8b43, 0x0864ec4f, 0x3f727661, 0x3f70cf38, 0x08716159, 0x0896be80, 0x3f6bcb0e, - 0x3f6a1a1c, 0x08a3323a, 0x08c88b65, 0x3f64f89b, 0x3f633de2, 0x08d4fdc6, 0x08fa52de, 0x3f5dff0e, - 0x3f5c3a8f, 0x0906c3e0, 0x092c14ce, 0x3f56de6a, 0x3f551026, 0x09388469, 0x095dd116, 0x3f4f96b4, - 0x3f4dbeac, 0x096a3f42, 0x098f8796, 0x3f4827f0, 0x3f464626, 0x099bf44c, 0x09c13831, 0x3f409223, - 0x3f3ea697, 0x09cda368, 0x09f2e2c7, 0x3f38d552, 0x3f36e006, 0x09ff4c78, 0x0a24873a, 0x3f30f181, - 0x3f2ef276, 0x0a30ef5e, 0x0a56256c, 0x3f28e6b6, 0x3f26ddec, 0x0a628bfa, 0x0a87bd3d, 0x3f20b4f5, - 0x3f1ea26e, 0x0a94222f, 0x0ab94e8f, 0x3f185c43, 0x3f164001, 0x0ac5b1dc, 0x0aead944, 0x3f0fdca5, - 0x3f0db6a9, 0x0af73ae5, 0x0b1c5d3d, 0x3f073621, 0x3f05066d, 0x0b28bd2a, 0x0b4dda5c, 0x3efe68bc, - 0x3efc2f50, 0x0b5a388d, 0x0b7f5081, 0x3ef5747b, 0x3ef3315a, 0x0b8bacf0, 0x0bb0bf8f, 0x3eec5965, - 0x3eea0c8e, 0x0bbd1a33, 0x0be22766, 0x3ee3177e, 0x3ee0c0f4, 0x0bee8038, 0x0c1387e9, 0x3ed9aecc, - 0x3ed74e91, 0x0c1fdee1, 0x0c44e0f9, 0x3ed01f55, 0x3ecdb56a, 0x0c513610, 0x0c763278, 0x3ec66920, - 0x3ec3f585, 0x0c8285a5, 0x0ca77c47, 0x3ebc8c31, 0x3eba0ee9, 0x0cb3cd84, 0x0cd8be47, 0x3eb2888f, - 0x3eb0019c, 0x0ce50d8c, 0x0d09f85b, 0x3ea85e41, 0x3ea5cda3, 0x0d1645a0, 0x0d3b2a64, 0x3e9e0d4c, - 0x3e9b7306, 0x0d4775a1, 0x0d6c5443, 0x3e9395b7, 0x3e90f1ca, 0x0d789d71, 0x0d9d75db, 0x3e88f788, - 0x3e8649f5, 0x0da9bcf2, 0x0dce8f0d, 0x3e7e32c6, 0x3e7b7b90, 0x0ddad406, 0x0dff9fba, 0x3e734778, - 0x3e70869f, 0x0e0be28e, 0x0e30a7c5, 0x3e6835a4, 0x3e656b2b, 0x0e3ce86b, 0x0e61a70f, 0x3e5cfd51, - 0x3e5a2939, 0x0e6de580, 0x0e929d7a, 0x3e519e86, 0x3e4ec0d1, 0x0e9ed9af, 0x0ec38ae8, 0x3e46194a, - 0x3e4331fa, 0x0ecfc4d9, 0x0ef46f3b, 0x3e3a6da4, 0x3e377cbb, 0x0f00a6df, 0x0f254a53, 0x3e2e9b9c, - 0x3e2ba11b, 0x0f317fa5, 0x0f561c15, 0x3e22a338, 0x3e1f9f21, 0x0f624f0c, 0x0f86e460, 0x3e168480, - 0x3e1376d5, 0x0f9314f5, 0x0fb7a317, 0x3e0a3f7b, 0x3e07283f, 0x0fc3d143, 0x0fe8581d, 0x3dfdd432, - 0x3dfab365, 0x0ff483d7, 0x10190352, 0x3df142ab, 0x3dee1851, 0x10252c94, 0x1049a49a, 0x3de48aef, - 0x3de15708, 0x1055cb5b, 0x107a3bd5, 0x3dd7ad05, 0x3dd46f94, 0x1086600e, 0x10aac8e6, 0x3dcaa8f5, - 0x3dc761fc, 0x10b6ea90, 0x10db4baf, 0x3dbd7ec7, 0x3dba2e48, 0x10e76ac3, 0x110bc413, 0x3db02e84, - 0x3dacd481, 0x1117e088, 0x113c31f3, 0x3da2b834, 0x3d9f54af, 0x11484bc2, 0x116c9531, 0x3d951bde, - 0x3d91aed9, 0x1178ac53, 0x119cedaf, 0x3d87598c, 0x3d83e309, 0x11a9021d, 0x11cd3b50, 0x3d797145, - 0x3d75f147, 0x11d94d02, 0x11fd7df6, 0x3d6b6313, 0x3d67d99b, 0x12098ce5, 0x122db583, 0x3d5d2efe, - 0x3d599c0e, 0x1239c1a7, 0x125de1da, 0x3d4ed50f, 0x3d4b38aa, 0x1269eb2b, 0x128e02dc, 0x3d40554e, - 0x3d3caf76, 0x129a0954, 0x12be186c, 0x3d31afc5, 0x3d2e007c, 0x12ca1c03, 0x12ee226c, 0x3d22e47c, - 0x3d1f2bc5, 0x12fa231b, 0x131e20c0, 0x3d13f37e, 0x3d10315a, 0x132a1e7e, 0x134e1348, 0x3d04dcd2, - 0x3d011145, 0x135a0e0e, 0x137df9e7, 0x3cf5a082, 0x3cf1cb8e, 0x1389f1af, 0x13add481, 0x3ce63e98, - 0x3ce2603f, 0x13b9c943, 0x13dda2f7, 0x3cd6b71e, 0x3cd2cf62, 0x13e994ab, 0x140d652c, 0x3cc70a1c, - 0x3cc318ff, 0x141953cb, 0x143d1b02, 0x3cb7379c, 0x3cb33d22, 0x14490685, 0x146cc45c, 0x3ca73fa9, - 0x3ca33bd3, 0x1478acbc, 0x149c611d, 0x3c97224c, 0x3c93151d, 0x14a84652, 0x14cbf127, 0x3c86df8e, - 0x3c82c909, 0x14d7d32a, 0x14fb745e, 0x3c76777b, 0x3c7257a2, 0x15075327, 0x152aeaa3, 0x3c65ea1c, - 0x3c61c0f1, 0x1536c62b, 0x155a53d9, 0x3c55377b, 0x3c510501, 0x15662c18, 0x1589afe3, 0x3c445fa2, - 0x3c4023dd, 0x159584d3, 0x15b8fea4, 0x3c33629d, 0x3c2f1d8e, 0x15c4d03e, 0x15e83fff, 0x3c224075, - 0x3c1df21f, 0x15f40e3a, 0x161773d6, 0x3c10f935, 0x3c0ca19b, 0x16233eac, 0x16469a0d, 0x3bff8ce8, - 0x3bfb2c0c, 0x16526176, 0x1675b286, 0x3bedfb99, 0x3be9917e, 0x1681767c, 0x16a4bd25, 0x3bdc4552, - 0x3bd7d1fa, 0x16b07d9f, 0x16d3b9cc, 0x3bca6a1d, 0x3bc5ed8d, 0x16df76c3, 0x1702a85e, 0x3bb86a08, - 0x3bb3e440, 0x170e61cc, 0x173188be, 0x3ba6451b, 0x3ba1b620, 0x173d3e9b, 0x17605ad0, 0x3b93fb63, - 0x3b8f6337, 0x176c0d15, 0x178f1e76, 0x3b818ceb, 0x3b7ceb90, 0x179acd1c, 0x17bdd394, 0x3b6ef9be, - 0x3b6a4f38, 0x17c97e93, 0x17ec7a0d, 0x3b5c41e8, 0x3b578e39, 0x17f8215e, 0x181b11c4, 0x3b496574, - 0x3b44a8a0, 0x1826b561, 0x18499a9d, 0x3b36646e, 0x3b319e77, 0x18553a7d, 0x1878147a, 0x3b233ee1, - 0x3b1e6fca, 0x1883b097, 0x18a67f3f, 0x3b0ff4d9, 0x3b0b1ca6, 0x18b21791, 0x18d4dad0, 0x3afc8663, - 0x3af7a516, 0x18e06f50, 0x1903270f, 0x3ae8f38b, 0x3ae40926, 0x190eb7b7, 0x193163e1, 0x3ad53c5b, - 0x3ad048e3, 0x193cf0a9, 0x195f9128, 0x3ac160e1, 0x3abc6458, 0x196b1a09, 0x198daec8, 0x3aad6129, - 0x3aa85b92, 0x199933bb, 0x19bbbca6, 0x3a993d3e, 0x3a942e9d, 0x19c73da3, 0x19e9baa3, 0x3a84f52f, - 0x3a7fdd86, 0x19f537a4, 0x1a17a8a5, 0x3a708906, 0x3a6b6859, 0x1a2321a2, 0x1a45868e, 0x3a5bf8d1, - 0x3a56cf23, 0x1a50fb81, 0x1a735442, 0x3a47449c, 0x3a4211f0, 0x1a7ec524, 0x1aa111a6, 0x3a326c74, - 0x3a2d30cd, 0x1aac7e6f, 0x1acebe9d, 0x3a1d7066, 0x3a182bc8, 0x1ada2746, 0x1afc5b0a, 0x3a08507f, - 0x3a0302ed, 0x1b07bf8c, 0x1b29e6d2, 0x39f30ccc, 0x39edb649, 0x1b354727, 0x1b5761d8, 0x39dda55a, - 0x39d845e9, 0x1b62bdf8, 0x1b84cc01, 0x39c81a36, 0x39c2b1da, 0x1b9023e5, 0x1bb22530, 0x39b26b6d, - 0x39acfa2b, 0x1bbd78d2, 0x1bdf6d4a, 0x399c990d, 0x39971ee7, 0x1beabca1, 0x1c0ca432, 0x3986a324, - 0x3981201e, 0x1c17ef39, 0x1c39c9cd, 0x397089bf, 0x396afddc, 0x1c45107c, 0x1c66ddfe, 0x395a4ceb, - 0x3954b82e, 0x1c72204f, 0x1c93e0ab, 0x3943ecb6, 0x393e4f23, 0x1c9f1e96, 0x1cc0d1b6, 0x392d692f, - 0x3927c2c9, 0x1ccc0b35, 0x1cedb106, 0x3916c262, 0x3911132d, 0x1cf8e611, 0x1d1a7e7d, 0x38fff85e, - 0x38fa405e, 0x1d25af0d, 0x1d473a00, 0x38e90b31, 0x38e34a69, 0x1d52660f, 0x1d73e374, 0x38d1fae9, - 0x38cc315d, 0x1d7f0afb, 0x1da07abc, 0x38bac795, 0x38b4f547, 0x1dab9db5, 0x1dccffbf, 0x38a37142, - 0x389d9637, 0x1dd81e21, 0x1df9725f, 0x388bf7ff, 0x3886143b, 0x1e048c24, 0x1e25d282, 0x38745bdb, - 0x386e6f60, 0x1e30e7a4, 0x1e52200c, 0x385c9ce3, 0x3856a7b6, 0x1e5d3084, 0x1e7e5ae2, 0x3844bb28, - 0x383ebd4c, 0x1e8966a8, 0x1eaa82e9, 0x382cb6b7, 0x3826b030, 0x1eb589f7, 0x1ed69805, 0x38148f9f, - 0x380e8071, 0x1ee19a54, 0x1f029a1c, 0x37fc45ef, 0x37f62e1d, 0x1f0d97a5, 0x1f2e8911, 0x37e3d9b7, - 0x37ddb945, 0x1f3981ce, 0x1f5a64cb, 0x37cb4b04, 0x37c521f6, 0x1f6558b5, 0x1f862d2d, 0x37b299e7, - 0x37ac6841, 0x1f911c3d, 0x1fb1e21d, 0x3799c66f, 0x37938c34, 0x1fbccc4d, 0x1fdd8381, 0x3780d0aa, - 0x377a8ddf, 0x1fe868c8, 0x2009113c, 0x3767b8a9, 0x37616d51, 0x2013f196, 0x20348b35, 0x374e7e7b, - 0x37482a9a, 0x203f6699, 0x205ff14f, 0x3735222f, 0x372ec5c9, 0x206ac7b8, 0x208b4372, 0x371ba3d4, - 0x37153eee, 0x209614d9, 0x20b68181, 0x3702037c, 0x36fb9618, 0x20c14ddf, 0x20e1ab63, 0x36e84135, - 0x36e1cb58, 0x20ec72b1, 0x210cc0fc, 0x36ce5d10, 0x36c7debd, 0x21178334, 0x2137c232, 0x36b4571b, - 0x36add058, 0x21427f4d, 0x2162aeea, 0x369a2f69, 0x3693a038, 0x216d66e2, 0x218d870b, 0x367fe608, - 0x36794e6e, 0x219839d8, 0x21b84a79, 0x36657b08, 0x365edb09, 0x21c2f815, 0x21e2f91a, 0x364aee7b, - 0x3644461b, 0x21eda17f, 0x220d92d4, 0x36304070, 0x36298fb4, 0x221835fb, 0x2238178d, 0x361570f8, - 0x360eb7e3, 0x2242b56f, 0x22628729, 0x35fa8023, 0x35f3beba, 0x226d1fc1, 0x228ce191, 0x35df6e03, - 0x35d8a449, 0x229774d7, 0x22b726a8, 0x35c43aa7, 0x35bd68a1, 0x22c1b496, 0x22e15655, 0x35a8e621, - 0x35a20bd3, 0x22ebdee5, 0x230b707e, 0x358d7081, 0x35868def, 0x2315f3a8, 0x23357509, 0x3571d9d9, - 0x356aef08, 0x233ff2c8, 0x235f63dc, 0x35562239, 0x354f2f2c, 0x2369dc29, 0x23893cdd, 0x353a49b2, - 0x35334e6f, 0x2393afb2, 0x23b2fff3, 0x351e5056, 0x35174ce0, 0x23bd6d48, 0x23dcad03, 0x35023636, - 0x34fb2a92, 0x23e714d3, 0x240643f4, 0x34e5fb63, 0x34dee795, 0x2410a639, 0x242fc4ad, 0x34c99fef, - 0x34c283fb, 0x243a215f, 0x24592f13, 0x34ad23eb, 0x34a5ffd5, 0x2463862c, 0x2482830d, 0x34908768, - 0x34895b36, 0x248cd487, 0x24abc082, 0x3473ca79, 0x346c962f, 0x24b60c57, 0x24d4e757, 0x3456ed2f, - 0x344fb0d1, 0x24df2d81, 0x24fdf775, 0x3439ef9c, 0x3432ab2e, 0x250837ed, 0x2526f0c1, 0x341cd1d2, - 0x34158559, 0x25312b81, 0x254fd323, 0x33ff93e2, 0x33f83f62, 0x255a0823, 0x25789e80, 0x33e235df, - 0x33dad95e, 0x2582cdbc, 0x25a152c0, 0x33c4b7db, 0x33bd535c, 0x25ab7c30, 0x25c9efca, 0x33a719e8, - 0x339fad70, 0x25d41369, 0x25f27584, 0x33895c18, 0x3381e7ac, 0x25fc934b, 0x261ae3d6, 0x336b7e7e, - 0x33640223, 0x2624fbbf, 0x26433aa7, 0x334d812d, 0x3345fce6, 0x264d4cac, 0x266b79dd, 0x332f6435, - 0x3327d808, 0x267585f8, 0x2693a161, 0x331127ab, 0x3309939c, 0x269da78b, 0x26bbb119, 0x32f2cba1, - 0x32eb2fb5, 0x26c5b14c, 0x26e3a8ec, 0x32d45029, 0x32ccac64, 0x26eda322, 0x270b88c2, 0x32b5b557, - 0x32ae09be, 0x27157cf5, 0x27335082, 0x3296fb3d, 0x328f47d5, 0x273d3eac, 0x275b0014, 0x327821ee, - 0x327066bc, 0x2764e82f, 0x27829760, 0x3259297d, 0x32516686, 0x278c7965, 0x27aa164c, 0x323a11fe, - 0x32324746, 0x27b3f235, 0x27d17cc1, 0x321adb83, 0x3213090f, 0x27db5288, 0x27f8caa5, 0x31fb8620, - 0x31f3abf5, 0x28029a45, 0x281fffe2, 0x31dc11e8, 0x31d4300b, 0x2829c954, 0x28471c5e, 0x31bc7eee, - 0x31b49564, 0x2850df9d, 0x286e2002, 0x319ccd46, 0x3194dc14, 0x2877dd07, 0x28950ab6, 0x317cfd04, - 0x3175042e, 0x289ec17a, 0x28bbdc61, 0x315d0e3b, 0x31550dc6, 0x28c58cdf, 0x28e294eb, 0x313d00ff, - 0x3134f8f1, 0x28ec3f1e, 0x2909343e, 0x311cd564, 0x3114c5c0, 0x2912d81f, 0x292fba40, 0x30fc8b7d, - 0x30f47449, 0x293957c9, 0x295626da, 0x30dc235e, 0x30d404a0, 0x295fbe06, 0x297c79f5, 0x30bb9d1c, - 0x30b376d8, 0x29860abd, 0x29a2b378, 0x309af8ca, 0x3092cb05, 0x29ac3dd7, 0x29c8d34d, 0x307a367c, - 0x3072013c, 0x29d2573c, 0x29eed95b, 0x30595648, 0x30511991, 0x29f856d5, 0x2a14c58b, 0x30385840, - 0x30301418, 0x2a1e3c8a, 0x2a3a97c7, 0x30173c7a, 0x300ef0e5, 0x2a440844, 0x2a604ff5, 0x2ff6030a, - 0x2fedb00d, 0x2a69b9ec, 0x2a85ee00, 0x2fd4ac04, 0x2fcc51a5, 0x2a8f516b, 0x2aab71d0, 0x2fb3377c, - 0x2faad5c1, 0x2ab4cea9, 0x2ad0db4e, 0x2f91a589, 0x2f893c75, 0x2ada318e, 0x2af62a63, 0x2f6ff63d, - 0x2f6785d7, 0x2aff7a05, 0x2b1b5ef8, 0x2f4e29af, 0x2f45b1fb, 0x2b24a7f6, 0x2b4078f5, 0x2f2c3ff2, - 0x2f23c0f6, 0x2b49bb4a, 0x2b657844, 0x2f0a391d, 0x2f01b2de, 0x2b6eb3ea, 0x2b8a5cce, 0x2ee81543, - 0x2edf87c6, 0x2b9391c0, 0x2baf267d, 0x2ec5d479, 0x2ebd3fc4, 0x2bb854b4, 0x2bd3d53a, 0x2ea376d6, - 0x2e9adaee, 0x2bdcfcb0, 0x2bf868ed, 0x2e80fc6e, 0x2e785958, 0x2c01899e, 0x2c1ce181, 0x2e5e6556, - 0x2e55bb17, 0x2c25fb66, 0x2c413edf, 0x2e3bb1a4, 0x2e330042, 0x2c4a51f3, 0x2c6580f1, 0x2e18e16d, - 0x2e1028ed, 0x2c6e8d2e, 0x2c89a79f, 0x2df5f4c7, 0x2ded352f, 0x2c92ad01, 0x2cadb2d5, 0x2dd2ebc7, - 0x2dca251c, 0x2cb6b155, 0x2cd1a27b, 0x2dafc683, 0x2da6f8ca, 0x2cda9a14, 0x2cf5767c, 0x2d8c8510, - 0x2d83b04f, 0x2cfe6728, 0x2d192ec1, 0x2d692784, 0x2d604bc0, 0x2d22187a, 0x2d3ccb34, 0x2d45adf6 +/* + * Q30 for 128 and 1024 + * + * for (i = 0; i < num/4; i++) { + * angle = (i + 0.125) * M_PI / num; + * x = cos(angle) * (1 << 30); + * x = sin(angle) * (1 << 30); + * + * angle = (num/2 - 1 - i + 0.125) * M_PI / num; + * x = cos(angle) * (1 << 30); + * x = sin(angle) * (1 << 30); + * } + */ +const int cossintab[128 + 1024] = { + /* 128 */ + 0x3fffec43, 0x003243f1, 0x015fd4d2, 0x3ffc38d1, 0x3ff9c13a, 0x01c454f5, 0x02f1b755, 0x3feea776, + 0x3fe9b8a9, 0x03562038, 0x0483259d, 0x3fd73a4a, 0x3fcfd50b, 0x04e767c5, 0x0613e1c5, 0x3fb5f4ea, + 0x3fac1a5b, 0x0677edbb, 0x07a3adff, 0x3f8adc77, 0x3f7e8e1e, 0x08077457, 0x09324ca7, 0x3f55f796, + 0x3f473759, 0x0995bdfd, 0x0abf8043, 0x3f174e70, 0x3f061e95, 0x0b228d42, 0x0c4b0b94, 0x3eceeaad, + 0x3ebb4ddb, 0x0cada4f5, 0x0dd4b19a, 0x3e7cd778, 0x3e66d0b4, 0x0e36c82a, 0x0f5c35a3, 0x3e212179, + 0x3e08b42a, 0x0fbdba40, 0x10e15b4e, 0x3dbbd6d4, 0x3da106bd, 0x11423ef0, 0x1263e699, 0x3d4d0728, + 0x3d2fd86c, 0x12c41a4f, 0x13e39be9, 0x3cd4c38b, 0x3cb53aaa, 0x144310dd, 0x15604013, 0x3c531e88, + 0x3c314060, 0x15bee78c, 0x16d99864, 0x3bc82c1f, 0x3ba3fde7, 0x173763c9, 0x184f6aab, 0x3b3401bb, + 0x3b0d8909, 0x18ac4b87, 0x19c17d44, 0x3a96b636, 0x3a6df8f8, 0x1a1d6544, 0x1b2f971e, 0x39f061d2, + 0x39c5664f, 0x1b8a7815, 0x1c997fc4, 0x39411e33, 0x3913eb0e, 0x1cf34baf, 0x1dfeff67, 0x38890663, + 0x3859a292, 0x1e57a86d, 0x1f5fdee6, 0x37c836c2, 0x3796a996, 0x1fb7575c, 0x20bbe7d8, 0x36fecd0e, + 0x36cb1e2a, 0x21122240, 0x2212e492, 0x362ce855, 0x35f71fb1, 0x2267d3a0, 0x2364a02e, 0x3552a8f4, + 0x351acedd, 0x23b836ca, 0x24b0e699, 0x34703095, 0x34364da6, 0x250317df, 0x25f78497, 0x3385a222, + 0x3349bf48, 0x264843d9, 0x273847c8, 0x329321c7, 0x32554840, 0x27878893, 0x2872feb6, 0x3198d4ea, + 0x31590e3e, 0x28c0b4d2, 0x29a778db, 0x3096e223, 0x30553828, 0x29f3984c, 0x2ad586a3, 0x2f8d713a, + 0x2f49ee0f, 0x2b2003ac, 0x2bfcf97c, 0x2e7cab1c, 0x2e37592c, 0x2c45c8a0, 0x2d1da3d5, 0x2d64b9da, + /* 1024 */ + 0x3fffffb1, 0x0006487f, 0x002bfb74, 0x3ffff0e3, 0x3fffe705, 0x00388c6e, 0x005e3f4c, 0x3fffba9b, + 0x3fffa6de, 0x006ad03b, 0x009082ea, 0x3fff5cd8, 0x3fff3f3c, 0x009d13c5, 0x00c2c62f, 0x3ffed79b, + 0x3ffeb021, 0x00cf56ef, 0x00f508fc, 0x3ffe2ae5, 0x3ffdf98c, 0x01019998, 0x01274b31, 0x3ffd56b5, + 0x3ffd1b7e, 0x0133dba3, 0x01598cb1, 0x3ffc5b0c, 0x3ffc15f7, 0x01661cf0, 0x018bcd5b, 0x3ffb37ec, + 0x3ffae8f9, 0x01985d60, 0x01be0d11, 0x3ff9ed53, 0x3ff99483, 0x01ca9cd4, 0x01f04bb4, 0x3ff87b44, + 0x3ff81896, 0x01fcdb2e, 0x02228924, 0x3ff6e1bf, 0x3ff67534, 0x022f184d, 0x0254c544, 0x3ff520c5, + 0x3ff4aa5d, 0x02615414, 0x0286fff3, 0x3ff33858, 0x3ff2b813, 0x02938e62, 0x02b93914, 0x3ff12878, + 0x3ff09e56, 0x02c5c71a, 0x02eb7086, 0x3feef126, 0x3fee5d28, 0x02f7fe1c, 0x031da62b, 0x3fec9265, + 0x3febf48b, 0x032a3349, 0x034fd9e5, 0x3fea0c35, 0x3fe96480, 0x035c6682, 0x03820b93, 0x3fe75e98, + 0x3fe6ad08, 0x038e97a9, 0x03b43b17, 0x3fe48990, 0x3fe3ce26, 0x03c0c69e, 0x03e66852, 0x3fe18d1f, + 0x3fe0c7da, 0x03f2f342, 0x04189326, 0x3fde6945, 0x3fdd9a27, 0x04251d77, 0x044abb73, 0x3fdb1e06, + 0x3fda450f, 0x0457451d, 0x047ce11a, 0x3fd7ab64, 0x3fd6c894, 0x04896a16, 0x04af03fc, 0x3fd4115f, + 0x3fd324b7, 0x04bb8c42, 0x04e123fa, 0x3fd04ffc, 0x3fcf597c, 0x04edab83, 0x051340f6, 0x3fcc673b, + 0x3fcb66e4, 0x051fc7b9, 0x05455ad1, 0x3fc8571f, 0x3fc74cf3, 0x0551e0c7, 0x0577716b, 0x3fc41fac, + 0x3fc30baa, 0x0583f68c, 0x05a984a6, 0x3fbfc0e3, 0x3fbea30c, 0x05b608eb, 0x05db9463, 0x3fbb3ac7, + 0x3fba131b, 0x05e817c3, 0x060da083, 0x3fb68d5b, 0x3fb55bdc, 0x061a22f7, 0x063fa8e7, 0x3fb1b8a2, + 0x3fb07d50, 0x064c2a67, 0x0671ad71, 0x3facbc9f, 0x3fab777b, 0x067e2df5, 0x06a3ae00, 0x3fa79954, + 0x3fa64a5f, 0x06b02d81, 0x06d5aa77, 0x3fa24ec6, 0x3fa0f600, 0x06e228ee, 0x0707a2b7, 0x3f9cdcf7, + 0x3f9b7a62, 0x0714201b, 0x073996a1, 0x3f9743eb, 0x3f95d787, 0x074612eb, 0x076b8616, 0x3f9183a5, + 0x3f900d72, 0x0778013d, 0x079d70f7, 0x3f8b9c28, 0x3f8a1c29, 0x07a9eaf5, 0x07cf5726, 0x3f858d79, + 0x3f8403ae, 0x07dbcff2, 0x08013883, 0x3f7f579b, 0x3f7dc405, 0x080db016, 0x083314f1, 0x3f78fa92, + 0x3f775d31, 0x083f8b43, 0x0864ec4f, 0x3f727661, 0x3f70cf38, 0x08716159, 0x0896be80, 0x3f6bcb0e, + 0x3f6a1a1c, 0x08a3323a, 0x08c88b65, 0x3f64f89b, 0x3f633de2, 0x08d4fdc6, 0x08fa52de, 0x3f5dff0e, + 0x3f5c3a8f, 0x0906c3e0, 0x092c14ce, 0x3f56de6a, 0x3f551026, 0x09388469, 0x095dd116, 0x3f4f96b4, + 0x3f4dbeac, 0x096a3f42, 0x098f8796, 0x3f4827f0, 0x3f464626, 0x099bf44c, 0x09c13831, 0x3f409223, + 0x3f3ea697, 0x09cda368, 0x09f2e2c7, 0x3f38d552, 0x3f36e006, 0x09ff4c78, 0x0a24873a, 0x3f30f181, + 0x3f2ef276, 0x0a30ef5e, 0x0a56256c, 0x3f28e6b6, 0x3f26ddec, 0x0a628bfa, 0x0a87bd3d, 0x3f20b4f5, + 0x3f1ea26e, 0x0a94222f, 0x0ab94e8f, 0x3f185c43, 0x3f164001, 0x0ac5b1dc, 0x0aead944, 0x3f0fdca5, + 0x3f0db6a9, 0x0af73ae5, 0x0b1c5d3d, 0x3f073621, 0x3f05066d, 0x0b28bd2a, 0x0b4dda5c, 0x3efe68bc, + 0x3efc2f50, 0x0b5a388d, 0x0b7f5081, 0x3ef5747b, 0x3ef3315a, 0x0b8bacf0, 0x0bb0bf8f, 0x3eec5965, + 0x3eea0c8e, 0x0bbd1a33, 0x0be22766, 0x3ee3177e, 0x3ee0c0f4, 0x0bee8038, 0x0c1387e9, 0x3ed9aecc, + 0x3ed74e91, 0x0c1fdee1, 0x0c44e0f9, 0x3ed01f55, 0x3ecdb56a, 0x0c513610, 0x0c763278, 0x3ec66920, + 0x3ec3f585, 0x0c8285a5, 0x0ca77c47, 0x3ebc8c31, 0x3eba0ee9, 0x0cb3cd84, 0x0cd8be47, 0x3eb2888f, + 0x3eb0019c, 0x0ce50d8c, 0x0d09f85b, 0x3ea85e41, 0x3ea5cda3, 0x0d1645a0, 0x0d3b2a64, 0x3e9e0d4c, + 0x3e9b7306, 0x0d4775a1, 0x0d6c5443, 0x3e9395b7, 0x3e90f1ca, 0x0d789d71, 0x0d9d75db, 0x3e88f788, + 0x3e8649f5, 0x0da9bcf2, 0x0dce8f0d, 0x3e7e32c6, 0x3e7b7b90, 0x0ddad406, 0x0dff9fba, 0x3e734778, + 0x3e70869f, 0x0e0be28e, 0x0e30a7c5, 0x3e6835a4, 0x3e656b2b, 0x0e3ce86b, 0x0e61a70f, 0x3e5cfd51, + 0x3e5a2939, 0x0e6de580, 0x0e929d7a, 0x3e519e86, 0x3e4ec0d1, 0x0e9ed9af, 0x0ec38ae8, 0x3e46194a, + 0x3e4331fa, 0x0ecfc4d9, 0x0ef46f3b, 0x3e3a6da4, 0x3e377cbb, 0x0f00a6df, 0x0f254a53, 0x3e2e9b9c, + 0x3e2ba11b, 0x0f317fa5, 0x0f561c15, 0x3e22a338, 0x3e1f9f21, 0x0f624f0c, 0x0f86e460, 0x3e168480, + 0x3e1376d5, 0x0f9314f5, 0x0fb7a317, 0x3e0a3f7b, 0x3e07283f, 0x0fc3d143, 0x0fe8581d, 0x3dfdd432, + 0x3dfab365, 0x0ff483d7, 0x10190352, 0x3df142ab, 0x3dee1851, 0x10252c94, 0x1049a49a, 0x3de48aef, + 0x3de15708, 0x1055cb5b, 0x107a3bd5, 0x3dd7ad05, 0x3dd46f94, 0x1086600e, 0x10aac8e6, 0x3dcaa8f5, + 0x3dc761fc, 0x10b6ea90, 0x10db4baf, 0x3dbd7ec7, 0x3dba2e48, 0x10e76ac3, 0x110bc413, 0x3db02e84, + 0x3dacd481, 0x1117e088, 0x113c31f3, 0x3da2b834, 0x3d9f54af, 0x11484bc2, 0x116c9531, 0x3d951bde, + 0x3d91aed9, 0x1178ac53, 0x119cedaf, 0x3d87598c, 0x3d83e309, 0x11a9021d, 0x11cd3b50, 0x3d797145, + 0x3d75f147, 0x11d94d02, 0x11fd7df6, 0x3d6b6313, 0x3d67d99b, 0x12098ce5, 0x122db583, 0x3d5d2efe, + 0x3d599c0e, 0x1239c1a7, 0x125de1da, 0x3d4ed50f, 0x3d4b38aa, 0x1269eb2b, 0x128e02dc, 0x3d40554e, + 0x3d3caf76, 0x129a0954, 0x12be186c, 0x3d31afc5, 0x3d2e007c, 0x12ca1c03, 0x12ee226c, 0x3d22e47c, + 0x3d1f2bc5, 0x12fa231b, 0x131e20c0, 0x3d13f37e, 0x3d10315a, 0x132a1e7e, 0x134e1348, 0x3d04dcd2, + 0x3d011145, 0x135a0e0e, 0x137df9e7, 0x3cf5a082, 0x3cf1cb8e, 0x1389f1af, 0x13add481, 0x3ce63e98, + 0x3ce2603f, 0x13b9c943, 0x13dda2f7, 0x3cd6b71e, 0x3cd2cf62, 0x13e994ab, 0x140d652c, 0x3cc70a1c, + 0x3cc318ff, 0x141953cb, 0x143d1b02, 0x3cb7379c, 0x3cb33d22, 0x14490685, 0x146cc45c, 0x3ca73fa9, + 0x3ca33bd3, 0x1478acbc, 0x149c611d, 0x3c97224c, 0x3c93151d, 0x14a84652, 0x14cbf127, 0x3c86df8e, + 0x3c82c909, 0x14d7d32a, 0x14fb745e, 0x3c76777b, 0x3c7257a2, 0x15075327, 0x152aeaa3, 0x3c65ea1c, + 0x3c61c0f1, 0x1536c62b, 0x155a53d9, 0x3c55377b, 0x3c510501, 0x15662c18, 0x1589afe3, 0x3c445fa2, + 0x3c4023dd, 0x159584d3, 0x15b8fea4, 0x3c33629d, 0x3c2f1d8e, 0x15c4d03e, 0x15e83fff, 0x3c224075, + 0x3c1df21f, 0x15f40e3a, 0x161773d6, 0x3c10f935, 0x3c0ca19b, 0x16233eac, 0x16469a0d, 0x3bff8ce8, + 0x3bfb2c0c, 0x16526176, 0x1675b286, 0x3bedfb99, 0x3be9917e, 0x1681767c, 0x16a4bd25, 0x3bdc4552, + 0x3bd7d1fa, 0x16b07d9f, 0x16d3b9cc, 0x3bca6a1d, 0x3bc5ed8d, 0x16df76c3, 0x1702a85e, 0x3bb86a08, + 0x3bb3e440, 0x170e61cc, 0x173188be, 0x3ba6451b, 0x3ba1b620, 0x173d3e9b, 0x17605ad0, 0x3b93fb63, + 0x3b8f6337, 0x176c0d15, 0x178f1e76, 0x3b818ceb, 0x3b7ceb90, 0x179acd1c, 0x17bdd394, 0x3b6ef9be, + 0x3b6a4f38, 0x17c97e93, 0x17ec7a0d, 0x3b5c41e8, 0x3b578e39, 0x17f8215e, 0x181b11c4, 0x3b496574, + 0x3b44a8a0, 0x1826b561, 0x18499a9d, 0x3b36646e, 0x3b319e77, 0x18553a7d, 0x1878147a, 0x3b233ee1, + 0x3b1e6fca, 0x1883b097, 0x18a67f3f, 0x3b0ff4d9, 0x3b0b1ca6, 0x18b21791, 0x18d4dad0, 0x3afc8663, + 0x3af7a516, 0x18e06f50, 0x1903270f, 0x3ae8f38b, 0x3ae40926, 0x190eb7b7, 0x193163e1, 0x3ad53c5b, + 0x3ad048e3, 0x193cf0a9, 0x195f9128, 0x3ac160e1, 0x3abc6458, 0x196b1a09, 0x198daec8, 0x3aad6129, + 0x3aa85b92, 0x199933bb, 0x19bbbca6, 0x3a993d3e, 0x3a942e9d, 0x19c73da3, 0x19e9baa3, 0x3a84f52f, + 0x3a7fdd86, 0x19f537a4, 0x1a17a8a5, 0x3a708906, 0x3a6b6859, 0x1a2321a2, 0x1a45868e, 0x3a5bf8d1, + 0x3a56cf23, 0x1a50fb81, 0x1a735442, 0x3a47449c, 0x3a4211f0, 0x1a7ec524, 0x1aa111a6, 0x3a326c74, + 0x3a2d30cd, 0x1aac7e6f, 0x1acebe9d, 0x3a1d7066, 0x3a182bc8, 0x1ada2746, 0x1afc5b0a, 0x3a08507f, + 0x3a0302ed, 0x1b07bf8c, 0x1b29e6d2, 0x39f30ccc, 0x39edb649, 0x1b354727, 0x1b5761d8, 0x39dda55a, + 0x39d845e9, 0x1b62bdf8, 0x1b84cc01, 0x39c81a36, 0x39c2b1da, 0x1b9023e5, 0x1bb22530, 0x39b26b6d, + 0x39acfa2b, 0x1bbd78d2, 0x1bdf6d4a, 0x399c990d, 0x39971ee7, 0x1beabca1, 0x1c0ca432, 0x3986a324, + 0x3981201e, 0x1c17ef39, 0x1c39c9cd, 0x397089bf, 0x396afddc, 0x1c45107c, 0x1c66ddfe, 0x395a4ceb, + 0x3954b82e, 0x1c72204f, 0x1c93e0ab, 0x3943ecb6, 0x393e4f23, 0x1c9f1e96, 0x1cc0d1b6, 0x392d692f, + 0x3927c2c9, 0x1ccc0b35, 0x1cedb106, 0x3916c262, 0x3911132d, 0x1cf8e611, 0x1d1a7e7d, 0x38fff85e, + 0x38fa405e, 0x1d25af0d, 0x1d473a00, 0x38e90b31, 0x38e34a69, 0x1d52660f, 0x1d73e374, 0x38d1fae9, + 0x38cc315d, 0x1d7f0afb, 0x1da07abc, 0x38bac795, 0x38b4f547, 0x1dab9db5, 0x1dccffbf, 0x38a37142, + 0x389d9637, 0x1dd81e21, 0x1df9725f, 0x388bf7ff, 0x3886143b, 0x1e048c24, 0x1e25d282, 0x38745bdb, + 0x386e6f60, 0x1e30e7a4, 0x1e52200c, 0x385c9ce3, 0x3856a7b6, 0x1e5d3084, 0x1e7e5ae2, 0x3844bb28, + 0x383ebd4c, 0x1e8966a8, 0x1eaa82e9, 0x382cb6b7, 0x3826b030, 0x1eb589f7, 0x1ed69805, 0x38148f9f, + 0x380e8071, 0x1ee19a54, 0x1f029a1c, 0x37fc45ef, 0x37f62e1d, 0x1f0d97a5, 0x1f2e8911, 0x37e3d9b7, + 0x37ddb945, 0x1f3981ce, 0x1f5a64cb, 0x37cb4b04, 0x37c521f6, 0x1f6558b5, 0x1f862d2d, 0x37b299e7, + 0x37ac6841, 0x1f911c3d, 0x1fb1e21d, 0x3799c66f, 0x37938c34, 0x1fbccc4d, 0x1fdd8381, 0x3780d0aa, + 0x377a8ddf, 0x1fe868c8, 0x2009113c, 0x3767b8a9, 0x37616d51, 0x2013f196, 0x20348b35, 0x374e7e7b, + 0x37482a9a, 0x203f6699, 0x205ff14f, 0x3735222f, 0x372ec5c9, 0x206ac7b8, 0x208b4372, 0x371ba3d4, + 0x37153eee, 0x209614d9, 0x20b68181, 0x3702037c, 0x36fb9618, 0x20c14ddf, 0x20e1ab63, 0x36e84135, + 0x36e1cb58, 0x20ec72b1, 0x210cc0fc, 0x36ce5d10, 0x36c7debd, 0x21178334, 0x2137c232, 0x36b4571b, + 0x36add058, 0x21427f4d, 0x2162aeea, 0x369a2f69, 0x3693a038, 0x216d66e2, 0x218d870b, 0x367fe608, + 0x36794e6e, 0x219839d8, 0x21b84a79, 0x36657b08, 0x365edb09, 0x21c2f815, 0x21e2f91a, 0x364aee7b, + 0x3644461b, 0x21eda17f, 0x220d92d4, 0x36304070, 0x36298fb4, 0x221835fb, 0x2238178d, 0x361570f8, + 0x360eb7e3, 0x2242b56f, 0x22628729, 0x35fa8023, 0x35f3beba, 0x226d1fc1, 0x228ce191, 0x35df6e03, + 0x35d8a449, 0x229774d7, 0x22b726a8, 0x35c43aa7, 0x35bd68a1, 0x22c1b496, 0x22e15655, 0x35a8e621, + 0x35a20bd3, 0x22ebdee5, 0x230b707e, 0x358d7081, 0x35868def, 0x2315f3a8, 0x23357509, 0x3571d9d9, + 0x356aef08, 0x233ff2c8, 0x235f63dc, 0x35562239, 0x354f2f2c, 0x2369dc29, 0x23893cdd, 0x353a49b2, + 0x35334e6f, 0x2393afb2, 0x23b2fff3, 0x351e5056, 0x35174ce0, 0x23bd6d48, 0x23dcad03, 0x35023636, + 0x34fb2a92, 0x23e714d3, 0x240643f4, 0x34e5fb63, 0x34dee795, 0x2410a639, 0x242fc4ad, 0x34c99fef, + 0x34c283fb, 0x243a215f, 0x24592f13, 0x34ad23eb, 0x34a5ffd5, 0x2463862c, 0x2482830d, 0x34908768, + 0x34895b36, 0x248cd487, 0x24abc082, 0x3473ca79, 0x346c962f, 0x24b60c57, 0x24d4e757, 0x3456ed2f, + 0x344fb0d1, 0x24df2d81, 0x24fdf775, 0x3439ef9c, 0x3432ab2e, 0x250837ed, 0x2526f0c1, 0x341cd1d2, + 0x34158559, 0x25312b81, 0x254fd323, 0x33ff93e2, 0x33f83f62, 0x255a0823, 0x25789e80, 0x33e235df, + 0x33dad95e, 0x2582cdbc, 0x25a152c0, 0x33c4b7db, 0x33bd535c, 0x25ab7c30, 0x25c9efca, 0x33a719e8, + 0x339fad70, 0x25d41369, 0x25f27584, 0x33895c18, 0x3381e7ac, 0x25fc934b, 0x261ae3d6, 0x336b7e7e, + 0x33640223, 0x2624fbbf, 0x26433aa7, 0x334d812d, 0x3345fce6, 0x264d4cac, 0x266b79dd, 0x332f6435, + 0x3327d808, 0x267585f8, 0x2693a161, 0x331127ab, 0x3309939c, 0x269da78b, 0x26bbb119, 0x32f2cba1, + 0x32eb2fb5, 0x26c5b14c, 0x26e3a8ec, 0x32d45029, 0x32ccac64, 0x26eda322, 0x270b88c2, 0x32b5b557, + 0x32ae09be, 0x27157cf5, 0x27335082, 0x3296fb3d, 0x328f47d5, 0x273d3eac, 0x275b0014, 0x327821ee, + 0x327066bc, 0x2764e82f, 0x27829760, 0x3259297d, 0x32516686, 0x278c7965, 0x27aa164c, 0x323a11fe, + 0x32324746, 0x27b3f235, 0x27d17cc1, 0x321adb83, 0x3213090f, 0x27db5288, 0x27f8caa5, 0x31fb8620, + 0x31f3abf5, 0x28029a45, 0x281fffe2, 0x31dc11e8, 0x31d4300b, 0x2829c954, 0x28471c5e, 0x31bc7eee, + 0x31b49564, 0x2850df9d, 0x286e2002, 0x319ccd46, 0x3194dc14, 0x2877dd07, 0x28950ab6, 0x317cfd04, + 0x3175042e, 0x289ec17a, 0x28bbdc61, 0x315d0e3b, 0x31550dc6, 0x28c58cdf, 0x28e294eb, 0x313d00ff, + 0x3134f8f1, 0x28ec3f1e, 0x2909343e, 0x311cd564, 0x3114c5c0, 0x2912d81f, 0x292fba40, 0x30fc8b7d, + 0x30f47449, 0x293957c9, 0x295626da, 0x30dc235e, 0x30d404a0, 0x295fbe06, 0x297c79f5, 0x30bb9d1c, + 0x30b376d8, 0x29860abd, 0x29a2b378, 0x309af8ca, 0x3092cb05, 0x29ac3dd7, 0x29c8d34d, 0x307a367c, + 0x3072013c, 0x29d2573c, 0x29eed95b, 0x30595648, 0x30511991, 0x29f856d5, 0x2a14c58b, 0x30385840, + 0x30301418, 0x2a1e3c8a, 0x2a3a97c7, 0x30173c7a, 0x300ef0e5, 0x2a440844, 0x2a604ff5, 0x2ff6030a, + 0x2fedb00d, 0x2a69b9ec, 0x2a85ee00, 0x2fd4ac04, 0x2fcc51a5, 0x2a8f516b, 0x2aab71d0, 0x2fb3377c, + 0x2faad5c1, 0x2ab4cea9, 0x2ad0db4e, 0x2f91a589, 0x2f893c75, 0x2ada318e, 0x2af62a63, 0x2f6ff63d, + 0x2f6785d7, 0x2aff7a05, 0x2b1b5ef8, 0x2f4e29af, 0x2f45b1fb, 0x2b24a7f6, 0x2b4078f5, 0x2f2c3ff2, + 0x2f23c0f6, 0x2b49bb4a, 0x2b657844, 0x2f0a391d, 0x2f01b2de, 0x2b6eb3ea, 0x2b8a5cce, 0x2ee81543, + 0x2edf87c6, 0x2b9391c0, 0x2baf267d, 0x2ec5d479, 0x2ebd3fc4, 0x2bb854b4, 0x2bd3d53a, 0x2ea376d6, + 0x2e9adaee, 0x2bdcfcb0, 0x2bf868ed, 0x2e80fc6e, 0x2e785958, 0x2c01899e, 0x2c1ce181, 0x2e5e6556, + 0x2e55bb17, 0x2c25fb66, 0x2c413edf, 0x2e3bb1a4, 0x2e330042, 0x2c4a51f3, 0x2c6580f1, 0x2e18e16d, + 0x2e1028ed, 0x2c6e8d2e, 0x2c89a79f, 0x2df5f4c7, 0x2ded352f, 0x2c92ad01, 0x2cadb2d5, 0x2dd2ebc7, + 0x2dca251c, 0x2cb6b155, 0x2cd1a27b, 0x2dafc683, 0x2da6f8ca, 0x2cda9a14, 0x2cf5767c, 0x2d8c8510, + 0x2d83b04f, 0x2cfe6728, 0x2d192ec1, 0x2d692784, 0x2d604bc0, 0x2d22187a, 0x2d3ccb34, 0x2d45adf6 +}; + +const int twidTab512[8*6 + 32*6 + 128*6] = { + 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3b20d79e, 0x187de2a6, + 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, + 0x187de2a6, 0x3b20d79e, 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, + 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xe7821d5a, 0x3b20d79e, + 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, + 0xc4df2862, 0xe7821d5a, 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, + + 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3fb11b47, 0x0645e9af, + 0x3fec43c6, 0x0323ecbe, 0x3f4eaafe, 0x09640837, 0x3ec52f9f, 0x0c7c5c1e, 0x3fb11b47, 0x0645e9af, + 0x3d3e82ad, 0x1294062e, 0x3d3e82ad, 0x1294062e, 0x3f4eaafe, 0x09640837, 0x39daf5e8, 0x1b5d1009, + 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x387165e3, 0x1e2b5d38, + 0x3e14fdf7, 0x0f8cfcbd, 0x2f6bbe44, 0x2afad269, 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, + 0x2899e64a, 0x317900d6, 0x317900d6, 0x2899e64a, 0x3c424209, 0x158f9a75, 0x20e70f32, 0x36e5068a, + 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x2899e64a, 0x317900d6, + 0x39daf5e8, 0x1b5d1009, 0x0f8cfcbd, 0x3e14fdf7, 0x238e7673, 0x3536cc52, 0x387165e3, 0x1e2b5d38, + 0x0645e9af, 0x3fb11b47, 0x1e2b5d38, 0x387165e3, 0x36e5068a, 0x20e70f32, 0xfcdc1342, 0x3fec43c6, + 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 0x1294062e, 0x3d3e82ad, + 0x3367c08f, 0x261feff9, 0xea70658b, 0x3c424209, 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, + 0xe1d4a2c8, 0x387165e3, 0x0645e9af, 0x3fb11b47, 0x2f6bbe44, 0x2afad269, 0xd9e01007, 0x3367c08f, + 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xf9ba1651, 0x3fb11b47, + 0x2afad269, 0x2f6bbe44, 0xcc983f71, 0x261feff9, 0xf383a3e2, 0x3ec52f9f, 0x2899e64a, 0x317900d6, + 0xc78e9a1d, 0x1e2b5d38, 0xed6bf9d2, 0x3d3e82ad, 0x261feff9, 0x3367c08f, 0xc3bdbdf7, 0x158f9a75, + 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xe1d4a2c8, 0x387165e3, + 0x20e70f32, 0x36e5068a, 0xc013bc3a, 0x0323ecbe, 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, + 0xc04ee4b9, 0xf9ba1651, 0xd76619b6, 0x317900d6, 0x1b5d1009, 0x39daf5e8, 0xc1eb0209, 0xf0730343, + 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xce86ff2a, 0x2899e64a, + 0x158f9a75, 0x3c424209, 0xc91af976, 0xdf18f0ce, 0xcac933ae, 0x238e7673, 0x1294062e, 0x3d3e82ad, + 0xce86ff2a, 0xd76619b6, 0xc78e9a1d, 0x1e2b5d38, 0x0f8cfcbd, 0x3e14fdf7, 0xd5052d97, 0xd09441bc, + 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 0xc2c17d53, 0x1294062e, + 0x09640837, 0x3f4eaafe, 0xe4a2eff7, 0xc6250a18, 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, + 0xed6bf9d2, 0xc2c17d53, 0xc04ee4b9, 0x0645e9af, 0x0323ecbe, 0x3fec43c6, 0xf69bf7c9, 0xc0b15502, + + 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3ffb10c1, 0x0192155f, + 0x3ffec42d, 0x00c90e8f, 0x3ff4e5df, 0x025b0cae, 0x3fec43c6, 0x0323ecbe, 0x3ffb10c1, 0x0192155f, + 0x3fd39b5a, 0x04b54824, 0x3fd39b5a, 0x04b54824, 0x3ff4e5df, 0x025b0cae, 0x3f9c2bfa, 0x070de171, + 0x3fb11b47, 0x0645e9af, 0x3fec43c6, 0x0323ecbe, 0x3f4eaafe, 0x09640837, 0x3f84c8e1, 0x07d59395, + 0x3fe12acb, 0x03ecadcf, 0x3eeb3347, 0x0bb6ecef, 0x3f4eaafe, 0x09640837, 0x3fd39b5a, 0x04b54824, + 0x3e71e758, 0x0e05c135, 0x3f0ec9f4, 0x0af10a22, 0x3fc395f9, 0x057db402, 0x3de2f147, 0x104fb80e, + 0x3ec52f9f, 0x0c7c5c1e, 0x3fb11b47, 0x0645e9af, 0x3d3e82ad, 0x1294062e, 0x3e71e758, 0x0e05c135, + 0x3f9c2bfa, 0x070de171, 0x3c84d496, 0x14d1e242, 0x3e14fdf7, 0x0f8cfcbd, 0x3f84c8e1, 0x07d59395, + 0x3bb6276d, 0x17088530, 0x3dae81ce, 0x1111d262, 0x3f6af2e3, 0x089cf867, 0x3ad2c2e7, 0x19372a63, + 0x3d3e82ad, 0x1294062e, 0x3f4eaafe, 0x09640837, 0x39daf5e8, 0x1b5d1009, 0x3cc511d8, 0x14135c94, + 0x3f2ff249, 0x0a2abb58, 0x38cf1669, 0x1d79775b, 0x3c424209, 0x158f9a75, 0x3f0ec9f4, 0x0af10a22, + 0x37af8158, 0x1f8ba4db, 0x3bb6276d, 0x17088530, 0x3eeb3347, 0x0bb6ecef, 0x367c9a7d, 0x2192e09a, + 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x3a8269a2, 0x19ef7943, + 0x3e9cc076, 0x0d415012, 0x33de87de, 0x257db64b, 0x39daf5e8, 0x1b5d1009, 0x3e71e758, 0x0e05c135, + 0x32744493, 0x275ff452, 0x392a9642, 0x1cc66e99, 0x3e44a5ee, 0x0ec9a7f2, 0x30f8801f, 0x29348937, + 0x387165e3, 0x1e2b5d38, 0x3e14fdf7, 0x0f8cfcbd, 0x2f6bbe44, 0x2afad269, 0x37af8158, 0x1f8ba4db, + 0x3de2f147, 0x104fb80e, 0x2dce88a9, 0x2cb2324b, 0x36e5068a, 0x20e70f32, 0x3dae81ce, 0x1111d262, + 0x2c216eaa, 0x2e5a106f, 0x361214b0, 0x223d66a8, 0x3d77b191, 0x11d3443f, 0x2a650525, 0x2ff1d9c6, + 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 0x2899e64a, 0x317900d6, 0x34534f40, 0x24da0a99, + 0x3d02f756, 0x135410c2, 0x26c0b162, 0x32eefde9, 0x3367c08f, 0x261feff9, 0x3cc511d8, 0x14135c94, + 0x24da0a99, 0x34534f40, 0x32744493, 0x275ff452, 0x3c84d496, 0x14d1e242, 0x22e69ac7, 0x35a5793c, + 0x317900d6, 0x2899e64a, 0x3c424209, 0x158f9a75, 0x20e70f32, 0x36e5068a, 0x30761c17, 0x29cd9577, + 0x3bfd5cc4, 0x164c7ddd, 0x1edc1952, 0x3811884c, 0x2f6bbe44, 0x2afad269, 0x3bb6276d, 0x17088530, + 0x1cc66e99, 0x392a9642, 0x2e5a106f, 0x2c216eaa, 0x3b6ca4c4, 0x17c3a931, 0x1aa6c82b, 0x3a2fcee8, + 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x2c216eaa, 0x2e5a106f, + 0x3ad2c2e7, 0x19372a63, 0x164c7ddd, 0x3bfd5cc4, 0x2afad269, 0x2f6bbe44, 0x3a8269a2, 0x19ef7943, + 0x14135c94, 0x3cc511d8, 0x29cd9577, 0x30761c17, 0x3a2fcee8, 0x1aa6c82b, 0x11d3443f, 0x3d77b191, + 0x2899e64a, 0x317900d6, 0x39daf5e8, 0x1b5d1009, 0x0f8cfcbd, 0x3e14fdf7, 0x275ff452, 0x32744493, + 0x3983e1e7, 0x1c1249d8, 0x0d415012, 0x3e9cc076, 0x261feff9, 0x3367c08f, 0x392a9642, 0x1cc66e99, + 0x0af10a22, 0x3f0ec9f4, 0x24da0a99, 0x34534f40, 0x38cf1669, 0x1d79775b, 0x089cf867, 0x3f6af2e3, + 0x238e7673, 0x3536cc52, 0x387165e3, 0x1e2b5d38, 0x0645e9af, 0x3fb11b47, 0x223d66a8, 0x361214b0, + 0x3811884c, 0x1edc1952, 0x03ecadcf, 0x3fe12acb, 0x20e70f32, 0x36e5068a, 0x37af8158, 0x1f8ba4db, + 0x0192155f, 0x3ffb10c1, 0x1f8ba4db, 0x37af8158, 0x374b54ce, 0x2039f90e, 0xff36f171, 0x3ffec42d, + 0x1e2b5d38, 0x387165e3, 0x36e5068a, 0x20e70f32, 0xfcdc1342, 0x3fec43c6, 0x1cc66e99, 0x392a9642, + 0x367c9a7d, 0x2192e09a, 0xfa824bfe, 0x3fc395f9, 0x1b5d1009, 0x39daf5e8, 0x361214b0, 0x223d66a8, + 0xf82a6c6b, 0x3f84c8e1, 0x19ef7943, 0x3a8269a2, 0x35a5793c, 0x22e69ac7, 0xf5d544a8, 0x3f2ff249, + 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 0x17088530, 0x3bb6276d, + 0x34c61236, 0x2434f332, 0xf136580e, 0x3e44a5ee, 0x158f9a75, 0x3c424209, 0x34534f40, 0x24da0a99, + 0xeeee2d9e, 0x3dae81ce, 0x14135c94, 0x3cc511d8, 0x33de87de, 0x257db64b, 0xecabef3e, 0x3d02f756, + 0x1294062e, 0x3d3e82ad, 0x3367c08f, 0x261feff9, 0xea70658b, 0x3c424209, 0x1111d262, 0x3dae81ce, + 0x32eefde9, 0x26c0b162, 0xe83c56cf, 0x3b6ca4c4, 0x0f8cfcbd, 0x3e14fdf7, 0x32744493, 0x275ff452, + 0xe61086bd, 0x3a8269a2, 0x0e05c135, 0x3e71e758, 0x31f79947, 0x27fdb2a6, 0xe3edb628, 0x3983e1e7, + 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 0xe1d4a2c8, 0x387165e3, 0x0af10a22, 0x3f0ec9f4, + 0x30f8801f, 0x29348937, 0xdfc606f2, 0x374b54ce, 0x09640837, 0x3f4eaafe, 0x30761c17, 0x29cd9577, + 0xddc29958, 0x361214b0, 0x07d59395, 0x3f84c8e1, 0x2ff1d9c6, 0x2a650525, 0xdbcb0cce, 0x34c61236, + 0x0645e9af, 0x3fb11b47, 0x2f6bbe44, 0x2afad269, 0xd9e01007, 0x3367c08f, 0x04b54824, 0x3fd39b5a, + 0x2ee3cebe, 0x2b8ef77c, 0xd8024d5a, 0x31f79947, 0x0323ecbe, 0x3fec43c6, 0x2e5a106f, 0x2c216eaa, + 0xd6326a89, 0x30761c17, 0x0192155f, 0x3ffb10c1, 0x2dce88a9, 0x2cb2324b, 0xd4710884, 0x2ee3cebe, + 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xfe6deaa1, 0x3ffb10c1, + 0x2cb2324b, 0x2dce88a9, 0xd11c3142, 0x2b8ef77c, 0xfcdc1342, 0x3fec43c6, 0x2c216eaa, 0x2e5a106f, + 0xcf89e3e9, 0x29cd9577, 0xfb4ab7dc, 0x3fd39b5a, 0x2b8ef77c, 0x2ee3cebe, 0xce0866b9, 0x27fdb2a6, + 0xf9ba1651, 0x3fb11b47, 0x2afad269, 0x2f6bbe44, 0xcc983f71, 0x261feff9, 0xf82a6c6b, 0x3f84c8e1, + 0x2a650525, 0x2ff1d9c6, 0xcb39edca, 0x2434f332, 0xf69bf7c9, 0x3f4eaafe, 0x29cd9577, 0x30761c17, + 0xc9edeb50, 0x223d66a8, 0xf50ef5de, 0x3f0ec9f4, 0x29348937, 0x30f8801f, 0xc8b4ab32, 0x2039f90e, + 0xf383a3e2, 0x3ec52f9f, 0x2899e64a, 0x317900d6, 0xc78e9a1d, 0x1e2b5d38, 0xf1fa3ecb, 0x3e71e758, + 0x27fdb2a6, 0x31f79947, 0xc67c1e19, 0x1c1249d8, 0xf0730343, 0x3e14fdf7, 0x275ff452, 0x32744493, + 0xc57d965e, 0x19ef7943, 0xeeee2d9e, 0x3dae81ce, 0x26c0b162, 0x32eefde9, 0xc4935b3c, 0x17c3a931, + 0xed6bf9d2, 0x3d3e82ad, 0x261feff9, 0x3367c08f, 0xc3bdbdf7, 0x158f9a75, 0xebeca36c, 0x3cc511d8, + 0x257db64b, 0x33de87de, 0xc2fd08aa, 0x135410c2, 0xea70658b, 0x3c424209, 0x24da0a99, 0x34534f40, + 0xc2517e32, 0x1111d262, 0xe8f77ad0, 0x3bb6276d, 0x2434f332, 0x34c61236, 0xc1bb5a12, 0x0ec9a7f2, + 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xe61086bd, 0x3a8269a2, + 0x22e69ac7, 0x35a5793c, 0xc0d00db7, 0x0a2abb58, 0xe4a2eff7, 0x39daf5e8, 0x223d66a8, 0x361214b0, + 0xc07b371f, 0x07d59395, 0xe3399167, 0x392a9642, 0x2192e09a, 0x367c9a7d, 0xc03c6a07, 0x057db402, + 0xe1d4a2c8, 0x387165e3, 0x20e70f32, 0x36e5068a, 0xc013bc3a, 0x0323ecbe, 0xe0745b25, 0x37af8158, + 0x2039f90e, 0x374b54ce, 0xc0013bd3, 0x00c90e8f, 0xdf18f0ce, 0x36e5068a, 0x1f8ba4db, 0x37af8158, + 0xc004ef3f, 0xfe6deaa1, 0xddc29958, 0x361214b0, 0x1edc1952, 0x3811884c, 0xc01ed535, 0xfc135231, + 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 0xc04ee4b9, 0xf9ba1651, 0xdb25f567, 0x34534f40, + 0x1d79775b, 0x38cf1669, 0xc0950d1d, 0xf7630799, 0xd9e01007, 0x3367c08f, 0x1cc66e99, 0x392a9642, + 0xc0f1360c, 0xf50ef5de, 0xd8a00bae, 0x32744493, 0x1c1249d8, 0x3983e1e7, 0xc1633f8a, 0xf2beafee, + 0xd76619b6, 0x317900d6, 0x1b5d1009, 0x39daf5e8, 0xc1eb0209, 0xf0730343, 0xd6326a89, 0x30761c17, + 0x1aa6c82b, 0x3a2fcee8, 0xc2884e6f, 0xee2cbbc1, 0xd5052d97, 0x2f6bbe44, 0x19ef7943, 0x3a8269a2, + 0xc33aee28, 0xebeca36c, 0xd3de9156, 0x2e5a106f, 0x19372a63, 0x3ad2c2e7, 0xc402a33c, 0xe9b38223, + 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xd1a5ef91, 0x2c216eaa, + 0x17c3a931, 0x3b6ca4c4, 0xc5d03118, 0xe55937d5, 0xd09441bc, 0x2afad269, 0x17088530, 0x3bb6276d, + 0xc6d569be, 0xe3399167, 0xcf89e3e9, 0x29cd9577, 0x164c7ddd, 0x3bfd5cc4, 0xc7ee77b4, 0xe123e6ae, + 0xce86ff2a, 0x2899e64a, 0x158f9a75, 0x3c424209, 0xc91af976, 0xdf18f0ce, 0xcd8bbb6d, 0x275ff452, + 0x14d1e242, 0x3c84d496, 0xca5a86c4, 0xdd196539, 0xcc983f71, 0x261feff9, 0x14135c94, 0x3cc511d8, + 0xcbacb0c0, 0xdb25f567, 0xcbacb0c0, 0x24da0a99, 0x135410c2, 0x3d02f756, 0xcd110217, 0xd93f4e9e, + 0xcac933ae, 0x238e7673, 0x1294062e, 0x3d3e82ad, 0xce86ff2a, 0xd76619b6, 0xc9edeb50, 0x223d66a8, + 0x11d3443f, 0x3d77b191, 0xd00e263a, 0xd59afadb, 0xc91af976, 0x20e70f32, 0x1111d262, 0x3dae81ce, + 0xd1a5ef91, 0xd3de9156, 0xc8507ea8, 0x1f8ba4db, 0x104fb80e, 0x3de2f147, 0xd34dcdb5, 0xd2317757, + 0xc78e9a1d, 0x1e2b5d38, 0x0f8cfcbd, 0x3e14fdf7, 0xd5052d97, 0xd09441bc, 0xc6d569be, 0x1cc66e99, + 0x0ec9a7f2, 0x3e44a5ee, 0xd6cb76c9, 0xcf077fe1, 0xc6250a18, 0x1b5d1009, 0x0e05c135, 0x3e71e758, + 0xd8a00bae, 0xcd8bbb6d, 0xc57d965e, 0x19ef7943, 0x0d415012, 0x3e9cc076, 0xda8249b5, 0xcc217822, + 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 0xc449d893, 0x17088530, + 0x0bb6ecef, 0x3eeb3347, 0xde6d1f66, 0xc9836583, 0xc3bdbdf7, 0x158f9a75, 0x0af10a22, 0x3f0ec9f4, + 0xe0745b25, 0xc8507ea8, 0xc33aee28, 0x14135c94, 0x0a2abb58, 0x3f2ff249, 0xe28688a5, 0xc730e997, + 0xc2c17d53, 0x1294062e, 0x09640837, 0x3f4eaafe, 0xe4a2eff7, 0xc6250a18, 0xc2517e32, 0x1111d262, + 0x089cf867, 0x3f6af2e3, 0xe6c8d59d, 0xc52d3d19, 0xc1eb0209, 0x0f8cfcbd, 0x07d59395, 0x3f84c8e1, + 0xe8f77ad0, 0xc449d893, 0xc18e18a8, 0x0e05c135, 0x070de171, 0x3f9c2bfa, 0xeb2e1dbe, 0xc37b2b6a, + 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 0xed6bf9d2, 0xc2c17d53, 0xc0f1360c, 0x0af10a22, + 0x057db402, 0x3fc395f9, 0xefb047f2, 0xc21d0eb9, 0xc0b15502, 0x09640837, 0x04b54824, 0x3fd39b5a, + 0xf1fa3ecb, 0xc18e18a8, 0xc07b371f, 0x07d59395, 0x03ecadcf, 0x3fe12acb, 0xf4491311, 0xc114ccb9, + 0xc04ee4b9, 0x0645e9af, 0x0323ecbe, 0x3fec43c6, 0xf69bf7c9, 0xc0b15502, 0xc02c64a6, 0x04b54824, + 0x025b0cae, 0x3ff4e5df, 0xf8f21e8f, 0xc063d406, 0xc013bc3a, 0x0323ecbe, 0x0192155f, 0x3ffb10c1, + 0xfb4ab7dc, 0xc02c64a6, 0xc004ef3f, 0x0192155f, 0x00c90e8f, 0x3ffec42d, 0xfda4f352, 0xc00b1a21 }; -const int twidTab512[8*6 + 32*6 + 128*6] = { - 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3b20d79e, 0x187de2a6, - 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, - 0x187de2a6, 0x3b20d79e, 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, - 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xe7821d5a, 0x3b20d79e, - 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, - 0xc4df2862, 0xe7821d5a, 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, - - 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3fb11b47, 0x0645e9af, - 0x3fec43c6, 0x0323ecbe, 0x3f4eaafe, 0x09640837, 0x3ec52f9f, 0x0c7c5c1e, 0x3fb11b47, 0x0645e9af, - 0x3d3e82ad, 0x1294062e, 0x3d3e82ad, 0x1294062e, 0x3f4eaafe, 0x09640837, 0x39daf5e8, 0x1b5d1009, - 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x387165e3, 0x1e2b5d38, - 0x3e14fdf7, 0x0f8cfcbd, 0x2f6bbe44, 0x2afad269, 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, - 0x2899e64a, 0x317900d6, 0x317900d6, 0x2899e64a, 0x3c424209, 0x158f9a75, 0x20e70f32, 0x36e5068a, - 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x2899e64a, 0x317900d6, - 0x39daf5e8, 0x1b5d1009, 0x0f8cfcbd, 0x3e14fdf7, 0x238e7673, 0x3536cc52, 0x387165e3, 0x1e2b5d38, - 0x0645e9af, 0x3fb11b47, 0x1e2b5d38, 0x387165e3, 0x36e5068a, 0x20e70f32, 0xfcdc1342, 0x3fec43c6, - 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 0x1294062e, 0x3d3e82ad, - 0x3367c08f, 0x261feff9, 0xea70658b, 0x3c424209, 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, - 0xe1d4a2c8, 0x387165e3, 0x0645e9af, 0x3fb11b47, 0x2f6bbe44, 0x2afad269, 0xd9e01007, 0x3367c08f, - 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xf9ba1651, 0x3fb11b47, - 0x2afad269, 0x2f6bbe44, 0xcc983f71, 0x261feff9, 0xf383a3e2, 0x3ec52f9f, 0x2899e64a, 0x317900d6, - 0xc78e9a1d, 0x1e2b5d38, 0xed6bf9d2, 0x3d3e82ad, 0x261feff9, 0x3367c08f, 0xc3bdbdf7, 0x158f9a75, - 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xe1d4a2c8, 0x387165e3, - 0x20e70f32, 0x36e5068a, 0xc013bc3a, 0x0323ecbe, 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, - 0xc04ee4b9, 0xf9ba1651, 0xd76619b6, 0x317900d6, 0x1b5d1009, 0x39daf5e8, 0xc1eb0209, 0xf0730343, - 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xce86ff2a, 0x2899e64a, - 0x158f9a75, 0x3c424209, 0xc91af976, 0xdf18f0ce, 0xcac933ae, 0x238e7673, 0x1294062e, 0x3d3e82ad, - 0xce86ff2a, 0xd76619b6, 0xc78e9a1d, 0x1e2b5d38, 0x0f8cfcbd, 0x3e14fdf7, 0xd5052d97, 0xd09441bc, - 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 0xc2c17d53, 0x1294062e, - 0x09640837, 0x3f4eaafe, 0xe4a2eff7, 0xc6250a18, 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, - 0xed6bf9d2, 0xc2c17d53, 0xc04ee4b9, 0x0645e9af, 0x0323ecbe, 0x3fec43c6, 0xf69bf7c9, 0xc0b15502, - - 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3ffb10c1, 0x0192155f, - 0x3ffec42d, 0x00c90e8f, 0x3ff4e5df, 0x025b0cae, 0x3fec43c6, 0x0323ecbe, 0x3ffb10c1, 0x0192155f, - 0x3fd39b5a, 0x04b54824, 0x3fd39b5a, 0x04b54824, 0x3ff4e5df, 0x025b0cae, 0x3f9c2bfa, 0x070de171, - 0x3fb11b47, 0x0645e9af, 0x3fec43c6, 0x0323ecbe, 0x3f4eaafe, 0x09640837, 0x3f84c8e1, 0x07d59395, - 0x3fe12acb, 0x03ecadcf, 0x3eeb3347, 0x0bb6ecef, 0x3f4eaafe, 0x09640837, 0x3fd39b5a, 0x04b54824, - 0x3e71e758, 0x0e05c135, 0x3f0ec9f4, 0x0af10a22, 0x3fc395f9, 0x057db402, 0x3de2f147, 0x104fb80e, - 0x3ec52f9f, 0x0c7c5c1e, 0x3fb11b47, 0x0645e9af, 0x3d3e82ad, 0x1294062e, 0x3e71e758, 0x0e05c135, - 0x3f9c2bfa, 0x070de171, 0x3c84d496, 0x14d1e242, 0x3e14fdf7, 0x0f8cfcbd, 0x3f84c8e1, 0x07d59395, - 0x3bb6276d, 0x17088530, 0x3dae81ce, 0x1111d262, 0x3f6af2e3, 0x089cf867, 0x3ad2c2e7, 0x19372a63, - 0x3d3e82ad, 0x1294062e, 0x3f4eaafe, 0x09640837, 0x39daf5e8, 0x1b5d1009, 0x3cc511d8, 0x14135c94, - 0x3f2ff249, 0x0a2abb58, 0x38cf1669, 0x1d79775b, 0x3c424209, 0x158f9a75, 0x3f0ec9f4, 0x0af10a22, - 0x37af8158, 0x1f8ba4db, 0x3bb6276d, 0x17088530, 0x3eeb3347, 0x0bb6ecef, 0x367c9a7d, 0x2192e09a, - 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x3a8269a2, 0x19ef7943, - 0x3e9cc076, 0x0d415012, 0x33de87de, 0x257db64b, 0x39daf5e8, 0x1b5d1009, 0x3e71e758, 0x0e05c135, - 0x32744493, 0x275ff452, 0x392a9642, 0x1cc66e99, 0x3e44a5ee, 0x0ec9a7f2, 0x30f8801f, 0x29348937, - 0x387165e3, 0x1e2b5d38, 0x3e14fdf7, 0x0f8cfcbd, 0x2f6bbe44, 0x2afad269, 0x37af8158, 0x1f8ba4db, - 0x3de2f147, 0x104fb80e, 0x2dce88a9, 0x2cb2324b, 0x36e5068a, 0x20e70f32, 0x3dae81ce, 0x1111d262, - 0x2c216eaa, 0x2e5a106f, 0x361214b0, 0x223d66a8, 0x3d77b191, 0x11d3443f, 0x2a650525, 0x2ff1d9c6, - 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 0x2899e64a, 0x317900d6, 0x34534f40, 0x24da0a99, - 0x3d02f756, 0x135410c2, 0x26c0b162, 0x32eefde9, 0x3367c08f, 0x261feff9, 0x3cc511d8, 0x14135c94, - 0x24da0a99, 0x34534f40, 0x32744493, 0x275ff452, 0x3c84d496, 0x14d1e242, 0x22e69ac7, 0x35a5793c, - 0x317900d6, 0x2899e64a, 0x3c424209, 0x158f9a75, 0x20e70f32, 0x36e5068a, 0x30761c17, 0x29cd9577, - 0x3bfd5cc4, 0x164c7ddd, 0x1edc1952, 0x3811884c, 0x2f6bbe44, 0x2afad269, 0x3bb6276d, 0x17088530, - 0x1cc66e99, 0x392a9642, 0x2e5a106f, 0x2c216eaa, 0x3b6ca4c4, 0x17c3a931, 0x1aa6c82b, 0x3a2fcee8, - 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x2c216eaa, 0x2e5a106f, - 0x3ad2c2e7, 0x19372a63, 0x164c7ddd, 0x3bfd5cc4, 0x2afad269, 0x2f6bbe44, 0x3a8269a2, 0x19ef7943, - 0x14135c94, 0x3cc511d8, 0x29cd9577, 0x30761c17, 0x3a2fcee8, 0x1aa6c82b, 0x11d3443f, 0x3d77b191, - 0x2899e64a, 0x317900d6, 0x39daf5e8, 0x1b5d1009, 0x0f8cfcbd, 0x3e14fdf7, 0x275ff452, 0x32744493, - 0x3983e1e7, 0x1c1249d8, 0x0d415012, 0x3e9cc076, 0x261feff9, 0x3367c08f, 0x392a9642, 0x1cc66e99, - 0x0af10a22, 0x3f0ec9f4, 0x24da0a99, 0x34534f40, 0x38cf1669, 0x1d79775b, 0x089cf867, 0x3f6af2e3, - 0x238e7673, 0x3536cc52, 0x387165e3, 0x1e2b5d38, 0x0645e9af, 0x3fb11b47, 0x223d66a8, 0x361214b0, - 0x3811884c, 0x1edc1952, 0x03ecadcf, 0x3fe12acb, 0x20e70f32, 0x36e5068a, 0x37af8158, 0x1f8ba4db, - 0x0192155f, 0x3ffb10c1, 0x1f8ba4db, 0x37af8158, 0x374b54ce, 0x2039f90e, 0xff36f171, 0x3ffec42d, - 0x1e2b5d38, 0x387165e3, 0x36e5068a, 0x20e70f32, 0xfcdc1342, 0x3fec43c6, 0x1cc66e99, 0x392a9642, - 0x367c9a7d, 0x2192e09a, 0xfa824bfe, 0x3fc395f9, 0x1b5d1009, 0x39daf5e8, 0x361214b0, 0x223d66a8, - 0xf82a6c6b, 0x3f84c8e1, 0x19ef7943, 0x3a8269a2, 0x35a5793c, 0x22e69ac7, 0xf5d544a8, 0x3f2ff249, - 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 0x17088530, 0x3bb6276d, - 0x34c61236, 0x2434f332, 0xf136580e, 0x3e44a5ee, 0x158f9a75, 0x3c424209, 0x34534f40, 0x24da0a99, - 0xeeee2d9e, 0x3dae81ce, 0x14135c94, 0x3cc511d8, 0x33de87de, 0x257db64b, 0xecabef3e, 0x3d02f756, - 0x1294062e, 0x3d3e82ad, 0x3367c08f, 0x261feff9, 0xea70658b, 0x3c424209, 0x1111d262, 0x3dae81ce, - 0x32eefde9, 0x26c0b162, 0xe83c56cf, 0x3b6ca4c4, 0x0f8cfcbd, 0x3e14fdf7, 0x32744493, 0x275ff452, - 0xe61086bd, 0x3a8269a2, 0x0e05c135, 0x3e71e758, 0x31f79947, 0x27fdb2a6, 0xe3edb628, 0x3983e1e7, - 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 0xe1d4a2c8, 0x387165e3, 0x0af10a22, 0x3f0ec9f4, - 0x30f8801f, 0x29348937, 0xdfc606f2, 0x374b54ce, 0x09640837, 0x3f4eaafe, 0x30761c17, 0x29cd9577, - 0xddc29958, 0x361214b0, 0x07d59395, 0x3f84c8e1, 0x2ff1d9c6, 0x2a650525, 0xdbcb0cce, 0x34c61236, - 0x0645e9af, 0x3fb11b47, 0x2f6bbe44, 0x2afad269, 0xd9e01007, 0x3367c08f, 0x04b54824, 0x3fd39b5a, - 0x2ee3cebe, 0x2b8ef77c, 0xd8024d5a, 0x31f79947, 0x0323ecbe, 0x3fec43c6, 0x2e5a106f, 0x2c216eaa, - 0xd6326a89, 0x30761c17, 0x0192155f, 0x3ffb10c1, 0x2dce88a9, 0x2cb2324b, 0xd4710884, 0x2ee3cebe, - 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xfe6deaa1, 0x3ffb10c1, - 0x2cb2324b, 0x2dce88a9, 0xd11c3142, 0x2b8ef77c, 0xfcdc1342, 0x3fec43c6, 0x2c216eaa, 0x2e5a106f, - 0xcf89e3e9, 0x29cd9577, 0xfb4ab7dc, 0x3fd39b5a, 0x2b8ef77c, 0x2ee3cebe, 0xce0866b9, 0x27fdb2a6, - 0xf9ba1651, 0x3fb11b47, 0x2afad269, 0x2f6bbe44, 0xcc983f71, 0x261feff9, 0xf82a6c6b, 0x3f84c8e1, - 0x2a650525, 0x2ff1d9c6, 0xcb39edca, 0x2434f332, 0xf69bf7c9, 0x3f4eaafe, 0x29cd9577, 0x30761c17, - 0xc9edeb50, 0x223d66a8, 0xf50ef5de, 0x3f0ec9f4, 0x29348937, 0x30f8801f, 0xc8b4ab32, 0x2039f90e, - 0xf383a3e2, 0x3ec52f9f, 0x2899e64a, 0x317900d6, 0xc78e9a1d, 0x1e2b5d38, 0xf1fa3ecb, 0x3e71e758, - 0x27fdb2a6, 0x31f79947, 0xc67c1e19, 0x1c1249d8, 0xf0730343, 0x3e14fdf7, 0x275ff452, 0x32744493, - 0xc57d965e, 0x19ef7943, 0xeeee2d9e, 0x3dae81ce, 0x26c0b162, 0x32eefde9, 0xc4935b3c, 0x17c3a931, - 0xed6bf9d2, 0x3d3e82ad, 0x261feff9, 0x3367c08f, 0xc3bdbdf7, 0x158f9a75, 0xebeca36c, 0x3cc511d8, - 0x257db64b, 0x33de87de, 0xc2fd08aa, 0x135410c2, 0xea70658b, 0x3c424209, 0x24da0a99, 0x34534f40, - 0xc2517e32, 0x1111d262, 0xe8f77ad0, 0x3bb6276d, 0x2434f332, 0x34c61236, 0xc1bb5a12, 0x0ec9a7f2, - 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xe61086bd, 0x3a8269a2, - 0x22e69ac7, 0x35a5793c, 0xc0d00db7, 0x0a2abb58, 0xe4a2eff7, 0x39daf5e8, 0x223d66a8, 0x361214b0, - 0xc07b371f, 0x07d59395, 0xe3399167, 0x392a9642, 0x2192e09a, 0x367c9a7d, 0xc03c6a07, 0x057db402, - 0xe1d4a2c8, 0x387165e3, 0x20e70f32, 0x36e5068a, 0xc013bc3a, 0x0323ecbe, 0xe0745b25, 0x37af8158, - 0x2039f90e, 0x374b54ce, 0xc0013bd3, 0x00c90e8f, 0xdf18f0ce, 0x36e5068a, 0x1f8ba4db, 0x37af8158, - 0xc004ef3f, 0xfe6deaa1, 0xddc29958, 0x361214b0, 0x1edc1952, 0x3811884c, 0xc01ed535, 0xfc135231, - 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 0xc04ee4b9, 0xf9ba1651, 0xdb25f567, 0x34534f40, - 0x1d79775b, 0x38cf1669, 0xc0950d1d, 0xf7630799, 0xd9e01007, 0x3367c08f, 0x1cc66e99, 0x392a9642, - 0xc0f1360c, 0xf50ef5de, 0xd8a00bae, 0x32744493, 0x1c1249d8, 0x3983e1e7, 0xc1633f8a, 0xf2beafee, - 0xd76619b6, 0x317900d6, 0x1b5d1009, 0x39daf5e8, 0xc1eb0209, 0xf0730343, 0xd6326a89, 0x30761c17, - 0x1aa6c82b, 0x3a2fcee8, 0xc2884e6f, 0xee2cbbc1, 0xd5052d97, 0x2f6bbe44, 0x19ef7943, 0x3a8269a2, - 0xc33aee28, 0xebeca36c, 0xd3de9156, 0x2e5a106f, 0x19372a63, 0x3ad2c2e7, 0xc402a33c, 0xe9b38223, - 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xd1a5ef91, 0x2c216eaa, - 0x17c3a931, 0x3b6ca4c4, 0xc5d03118, 0xe55937d5, 0xd09441bc, 0x2afad269, 0x17088530, 0x3bb6276d, - 0xc6d569be, 0xe3399167, 0xcf89e3e9, 0x29cd9577, 0x164c7ddd, 0x3bfd5cc4, 0xc7ee77b4, 0xe123e6ae, - 0xce86ff2a, 0x2899e64a, 0x158f9a75, 0x3c424209, 0xc91af976, 0xdf18f0ce, 0xcd8bbb6d, 0x275ff452, - 0x14d1e242, 0x3c84d496, 0xca5a86c4, 0xdd196539, 0xcc983f71, 0x261feff9, 0x14135c94, 0x3cc511d8, - 0xcbacb0c0, 0xdb25f567, 0xcbacb0c0, 0x24da0a99, 0x135410c2, 0x3d02f756, 0xcd110217, 0xd93f4e9e, - 0xcac933ae, 0x238e7673, 0x1294062e, 0x3d3e82ad, 0xce86ff2a, 0xd76619b6, 0xc9edeb50, 0x223d66a8, - 0x11d3443f, 0x3d77b191, 0xd00e263a, 0xd59afadb, 0xc91af976, 0x20e70f32, 0x1111d262, 0x3dae81ce, - 0xd1a5ef91, 0xd3de9156, 0xc8507ea8, 0x1f8ba4db, 0x104fb80e, 0x3de2f147, 0xd34dcdb5, 0xd2317757, - 0xc78e9a1d, 0x1e2b5d38, 0x0f8cfcbd, 0x3e14fdf7, 0xd5052d97, 0xd09441bc, 0xc6d569be, 0x1cc66e99, - 0x0ec9a7f2, 0x3e44a5ee, 0xd6cb76c9, 0xcf077fe1, 0xc6250a18, 0x1b5d1009, 0x0e05c135, 0x3e71e758, - 0xd8a00bae, 0xcd8bbb6d, 0xc57d965e, 0x19ef7943, 0x0d415012, 0x3e9cc076, 0xda8249b5, 0xcc217822, - 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 0xc449d893, 0x17088530, - 0x0bb6ecef, 0x3eeb3347, 0xde6d1f66, 0xc9836583, 0xc3bdbdf7, 0x158f9a75, 0x0af10a22, 0x3f0ec9f4, - 0xe0745b25, 0xc8507ea8, 0xc33aee28, 0x14135c94, 0x0a2abb58, 0x3f2ff249, 0xe28688a5, 0xc730e997, - 0xc2c17d53, 0x1294062e, 0x09640837, 0x3f4eaafe, 0xe4a2eff7, 0xc6250a18, 0xc2517e32, 0x1111d262, - 0x089cf867, 0x3f6af2e3, 0xe6c8d59d, 0xc52d3d19, 0xc1eb0209, 0x0f8cfcbd, 0x07d59395, 0x3f84c8e1, - 0xe8f77ad0, 0xc449d893, 0xc18e18a8, 0x0e05c135, 0x070de171, 0x3f9c2bfa, 0xeb2e1dbe, 0xc37b2b6a, - 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 0xed6bf9d2, 0xc2c17d53, 0xc0f1360c, 0x0af10a22, - 0x057db402, 0x3fc395f9, 0xefb047f2, 0xc21d0eb9, 0xc0b15502, 0x09640837, 0x04b54824, 0x3fd39b5a, - 0xf1fa3ecb, 0xc18e18a8, 0xc07b371f, 0x07d59395, 0x03ecadcf, 0x3fe12acb, 0xf4491311, 0xc114ccb9, - 0xc04ee4b9, 0x0645e9af, 0x0323ecbe, 0x3fec43c6, 0xf69bf7c9, 0xc0b15502, 0xc02c64a6, 0x04b54824, - 0x025b0cae, 0x3ff4e5df, 0xf8f21e8f, 0xc063d406, 0xc013bc3a, 0x0323ecbe, 0x0192155f, 0x3ffb10c1, - 0xfb4ab7dc, 0xc02c64a6, 0xc004ef3f, 0x0192155f, 0x00c90e8f, 0x3ffec42d, 0xfda4f352, 0xc00b1a21 -}; - -const int twidTab64[4*6 + 16*6] = { - 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x2d413ccc, 0x2d413ccc, - 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, - 0xd2bec334, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, - - 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3ec52f9f, 0x0c7c5c1e, - 0x3fb11b47, 0x0645e9af, 0x3d3e82ad, 0x1294062e, 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, - 0x3536cc52, 0x238e7673, 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 0x2899e64a, 0x317900d6, - 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x238e7673, 0x3536cc52, - 0x387165e3, 0x1e2b5d38, 0x0645e9af, 0x3fb11b47, 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, - 0xf383a3e2, 0x3ec52f9f, 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 0xe1d4a2c8, 0x387165e3, - 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xf383a3e2, 0x3ec52f9f, - 0x2899e64a, 0x317900d6, 0xc78e9a1d, 0x1e2b5d38, 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, - 0xc13ad061, 0x0c7c5c1e, 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 0xc04ee4b9, 0xf9ba1651, - 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xcac933ae, 0x238e7673, - 0x1294062e, 0x3d3e82ad, 0xce86ff2a, 0xd76619b6, 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, - 0xdc71898d, 0xcac933ae, 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 0xed6bf9d2, 0xc2c17d53 -}; -#endif //ARMV5E - -const int ShortWindowSine[FRAME_LEN_SHORT/2] ={ - 0x00c97fff, 0x025b7ffa, 0x03ed7ff1, 0x057f7fe2, 0x07117fce, 0x08a27fb5, 0x0a337f98, 0x0bc47f75, - 0x0d547f4e, 0x0ee47f22, 0x10737ef0, 0x12017eba, 0x138f7e7f, 0x151c7e3f, 0x16a87dfb, 0x18337db1, - 0x19be7d63, 0x1b477d0f, 0x1cd07cb7, 0x1e577c5a, 0x1fdd7bf9, 0x21627b92, 0x22e57b27, 0x24677ab7, - 0x25e87a42, 0x276879c9, 0x28e5794a, 0x2a6278c8, 0x2bdc7840, 0x2d5577b4, 0x2ecc7723, 0x3042768e, - 0x31b575f4, 0x33277556, 0x349774b3, 0x3604740b, 0x3770735f, 0x38d972af, 0x3a4071fa, 0x3ba57141, - 0x3d087083, 0x3e686fc2, 0x3fc66efb, 0x41216e31, 0x427a6d62, 0x43d16c8f, 0x45246bb8, 0x46756add, - 0x47c469fd, 0x490f691a, 0x4a586832, 0x4b9e6747, 0x4ce16657, 0x4e216564, 0x4f5e646c, 0x50986371, - 0x51cf6272, 0x5303616f, 0x54336068, 0x55605f5e, 0x568a5e50, 0x57b15d3e, 0x58d45c29, 0x59f45b10 +const int twidTab64[4*6 + 16*6] = { + 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x2d413ccc, 0x2d413ccc, + 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, + 0xd2bec334, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, + + 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3ec52f9f, 0x0c7c5c1e, + 0x3fb11b47, 0x0645e9af, 0x3d3e82ad, 0x1294062e, 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, + 0x3536cc52, 0x238e7673, 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 0x2899e64a, 0x317900d6, + 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x238e7673, 0x3536cc52, + 0x387165e3, 0x1e2b5d38, 0x0645e9af, 0x3fb11b47, 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, + 0xf383a3e2, 0x3ec52f9f, 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 0xe1d4a2c8, 0x387165e3, + 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xf383a3e2, 0x3ec52f9f, + 0x2899e64a, 0x317900d6, 0xc78e9a1d, 0x1e2b5d38, 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, + 0xc13ad061, 0x0c7c5c1e, 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 0xc04ee4b9, 0xf9ba1651, + 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xcac933ae, 0x238e7673, + 0x1294062e, 0x3d3e82ad, 0xce86ff2a, 0xd76619b6, 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, + 0xdc71898d, 0xcac933ae, 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 0xed6bf9d2, 0xc2c17d53 +}; +#endif //ARMV5E + +const int ShortWindowSine[FRAME_LEN_SHORT/2] ={ + 0x00c97fff, 0x025b7ffa, 0x03ed7ff1, 0x057f7fe2, 0x07117fce, 0x08a27fb5, 0x0a337f98, 0x0bc47f75, + 0x0d547f4e, 0x0ee47f22, 0x10737ef0, 0x12017eba, 0x138f7e7f, 0x151c7e3f, 0x16a87dfb, 0x18337db1, + 0x19be7d63, 0x1b477d0f, 0x1cd07cb7, 0x1e577c5a, 0x1fdd7bf9, 0x21627b92, 0x22e57b27, 0x24677ab7, + 0x25e87a42, 0x276879c9, 0x28e5794a, 0x2a6278c8, 0x2bdc7840, 0x2d5577b4, 0x2ecc7723, 0x3042768e, + 0x31b575f4, 0x33277556, 0x349774b3, 0x3604740b, 0x3770735f, 0x38d972af, 0x3a4071fa, 0x3ba57141, + 0x3d087083, 0x3e686fc2, 0x3fc66efb, 0x41216e31, 0x427a6d62, 0x43d16c8f, 0x45246bb8, 0x46756add, + 0x47c469fd, 0x490f691a, 0x4a586832, 0x4b9e6747, 0x4ce16657, 0x4e216564, 0x4f5e646c, 0x50986371, + 0x51cf6272, 0x5303616f, 0x54336068, 0x55605f5e, 0x568a5e50, 0x57b15d3e, 0x58d45c29, 0x59f45b10 }; const int LongWindowKBD[FRAME_LEN_LONG/2]={ - 0x000a7fff, 0x000e7fff, 0x00127fff, 0x00157fff, 0x00197fff, 0x001c7fff, 0x00207fff, 0x00237fff, - 0x00267fff, 0x002a7fff, 0x002d7fff, 0x00307fff, 0x00347fff, 0x00387fff, 0x003b7fff, 0x003f7fff, - 0x00437fff, 0x00477fff, 0x004b7fff, 0x004f7fff, 0x00537fff, 0x00577fff, 0x005b7fff, 0x00607fff, - 0x00647fff, 0x00697fff, 0x006d7fff, 0x00727fff, 0x00777fff, 0x007c7fff, 0x00817fff, 0x00867fff, - 0x008b7fff, 0x00917fff, 0x00967fff, 0x009c7fff, 0x00a17fff, 0x00a77fff, 0x00ad7fff, 0x00b37fff, - 0x00b97fff, 0x00bf7fff, 0x00c67fff, 0x00cc7fff, 0x00d37fff, 0x00da7fff, 0x00e07fff, 0x00e77fff, - 0x00ee7fff, 0x00f57fff, 0x00fd7fff, 0x01047fff, 0x010c7fff, 0x01137fff, 0x011b7fff, 0x01237fff, - 0x012b7fff, 0x01337fff, 0x013c7ffe, 0x01447ffe, 0x014d7ffe, 0x01567ffe, 0x015f7ffe, 0x01687ffe, - 0x01717ffe, 0x017a7ffe, 0x01837ffe, 0x018d7ffe, 0x01977ffd, 0x01a17ffd, 0x01ab7ffd, 0x01b57ffd, - 0x01bf7ffd, 0x01ca7ffd, 0x01d47ffd, 0x01df7ffc, 0x01ea7ffc, 0x01f57ffc, 0x02007ffc, 0x020c7ffc, - 0x02177ffc, 0x02237ffb, 0x022f7ffb, 0x023b7ffb, 0x02477ffb, 0x02537ffb, 0x02607ffa, 0x026d7ffa, - 0x027a7ffa, 0x02877ffa, 0x02947ff9, 0x02a17ff9, 0x02af7ff9, 0x02bc7ff9, 0x02ca7ff8, 0x02d87ff8, - 0x02e77ff8, 0x02f57ff7, 0x03047ff7, 0x03127ff7, 0x03217ff6, 0x03317ff6, 0x03407ff5, 0x034f7ff5, - 0x035f7ff5, 0x036f7ff4, 0x037f7ff4, 0x038f7ff3, 0x03a07ff3, 0x03b07ff2, 0x03c17ff2, 0x03d27ff1, - 0x03e37ff1, 0x03f57ff0, 0x04067ff0, 0x04187fef, 0x042a7fef, 0x043c7fee, 0x044f7fed, 0x04617fed, - 0x04747fec, 0x04877feb, 0x049a7feb, 0x04ae7fea, 0x04c17fe9, 0x04d57fe9, 0x04e97fe8, 0x04fd7fe7, - 0x05127fe6, 0x05277fe5, 0x053b7fe5, 0x05507fe4, 0x05667fe3, 0x057b7fe2, 0x05917fe1, 0x05a77fe0, - 0x05bd7fdf, 0x05d37fde, 0x05ea7fdd, 0x06017fdc, 0x06187fdb, 0x062f7fda, 0x06467fd9, 0x065e7fd7, - 0x06767fd6, 0x068e7fd5, 0x06a67fd4, 0x06bf7fd2, 0x06d87fd1, 0x06f17fd0, 0x070a7fce, 0x07237fcd, - 0x073d7fcc, 0x07577fca, 0x07717fc9, 0x078c7fc7, 0x07a67fc5, 0x07c17fc4, 0x07dc7fc2, 0x07f77fc0, - 0x08137fbf, 0x082f7fbd, 0x084b7fbb, 0x08677fb9, 0x08847fb7, 0x08a07fb6, 0x08bd7fb4, 0x08da7fb2, - 0x08f87faf, 0x09167fad, 0x09347fab, 0x09527fa9, 0x09707fa7, 0x098f7fa5, 0x09ae7fa2, 0x09cd7fa0, - 0x09ec7f9d, 0x0a0c7f9b, 0x0a2c7f98, 0x0a4c7f96, 0x0a6c7f93, 0x0a8d7f91, 0x0aae7f8e, 0x0acf7f8b, - 0x0af07f88, 0x0b127f85, 0x0b337f82, 0x0b557f7f, 0x0b787f7c, 0x0b9a7f79, 0x0bbd7f76, 0x0be07f73, - 0x0c047f6f, 0x0c277f6c, 0x0c4b7f69, 0x0c6f7f65, 0x0c937f61, 0x0cb87f5e, 0x0cdd7f5a, 0x0d027f56, - 0x0d277f53, 0x0d4d7f4f, 0x0d737f4b, 0x0d997f47, 0x0dbf7f43, 0x0de67f3e, 0x0e0c7f3a, 0x0e347f36, - 0x0e5b7f31, 0x0e837f2d, 0x0eaa7f28, 0x0ed37f24, 0x0efb7f1f, 0x0f237f1a, 0x0f4c7f15, 0x0f757f10, - 0x0f9f7f0b, 0x0fc87f06, 0x0ff27f01, 0x101c7efb, 0x10477ef6, 0x10717ef0, 0x109c7eeb, 0x10c87ee5, - 0x10f37edf, 0x111f7eda, 0x114a7ed4, 0x11777ece, 0x11a37ec7, 0x11d07ec1, 0x11fd7ebb, 0x122a7eb4, - 0x12577eae, 0x12857ea7, 0x12b37ea0, 0x12e17e9a, 0x130f7e93, 0x133e7e8c, 0x136d7e84, 0x139c7e7d, - 0x13cc7e76, 0x13fb7e6e, 0x142b7e67, 0x145b7e5f, 0x148c7e57, 0x14bc7e4f, 0x14ed7e47, 0x151e7e3f, - 0x15507e37, 0x15817e2e, 0x15b37e26, 0x15e57e1d, 0x16187e14, 0x164a7e0b, 0x167d7e02, 0x16b07df9, - 0x16e47df0, 0x17177de6, 0x174b7ddd, 0x177f7dd3, 0x17b37dc9, 0x17e87dbf, 0x181d7db5, 0x18527dab, - 0x18877da1, 0x18bc7d96, 0x18f27d8c, 0x19287d81, 0x195e7d76, 0x19957d6b, 0x19cb7d60, 0x1a027d54, - 0x1a397d49, 0x1a717d3d, 0x1aa87d31, 0x1ae07d26, 0x1b187d19, 0x1b507d0d, 0x1b897d01, 0x1bc27cf4, - 0x1bfb7ce8, 0x1c347cdb, 0x1c6d7cce, 0x1ca77cc1, 0x1ce17cb3, 0x1d1b7ca6, 0x1d557c98, 0x1d8f7c8a, - 0x1dca7c7c, 0x1e057c6e, 0x1e407c60, 0x1e7b7c51, 0x1eb77c43, 0x1ef37c34, 0x1f2f7c25, 0x1f6b7c16, - 0x1fa77c06, 0x1fe47bf7, 0x20217be7, 0x205e7bd7, 0x209b7bc7, 0x20d87bb7, 0x21167ba6, 0x21547b96, - 0x21927b85, 0x21d07b74, 0x220e7b63, 0x224d7b52, 0x228c7b40, 0x22cb7b2e, 0x230a7b1c, 0x23497b0a, - 0x23897af8, 0x23c87ae6, 0x24087ad3, 0x24487ac0, 0x24897aad, 0x24c97a9a, 0x250a7a86, 0x254b7a73, - 0x258c7a5f, 0x25cd7a4b, 0x260e7a36, 0x26507a22, 0x26917a0d, 0x26d379f8, 0x271579e3, 0x275779ce, - 0x279a79b8, 0x27dc79a3, 0x281f798d, 0x28627977, 0x28a57960, 0x28e8794a, 0x292b7933, 0x296f791c, - 0x29b27905, 0x29f678ed, 0x2a3a78d6, 0x2a7e78be, 0x2ac278a6, 0x2b07788d, 0x2b4b7875, 0x2b90785c, - 0x2bd47843, 0x2c19782a, 0x2c5e7810, 0x2ca477f7, 0x2ce977dd, 0x2d2e77c3, 0x2d7477a8, 0x2dba778e, - 0x2dff7773, 0x2e457758, 0x2e8b773d, 0x2ed27721, 0x2f187706, 0x2f5e76ea, 0x2fa576cd, 0x2fec76b1, - 0x30327694, 0x30797677, 0x30c0765a, 0x3107763d, 0x314e761f, 0x31967601, 0x31dd75e3, 0x322575c5, - 0x326c75a6, 0x32b47588, 0x32fc7569, 0x33447549, 0x338c752a, 0x33d4750a, 0x341c74ea, 0x346474ca, - 0x34ac74a9, 0x34f57488, 0x353d7467, 0x35857446, 0x35ce7424, 0x36177403, 0x365f73e1, 0x36a873be, - 0x36f1739c, 0x373a7379, 0x37837356, 0x37cc7333, 0x3815730f, 0x385e72ec, 0x38a772c8, 0x38f172a3, - 0x393a727f, 0x3983725a, 0x39cd7235, 0x3a167210, 0x3a6071ea, 0x3aa971c4, 0x3af3719e, 0x3b3c7178, - 0x3b867151, 0x3bd0712b, 0x3c197104, 0x3c6370dc, 0x3cad70b5, 0x3cf7708d, 0x3d407065, 0x3d8a703c, - 0x3dd47014, 0x3e1e6feb, 0x3e686fc2, 0x3eb16f98, 0x3efb6f6f, 0x3f456f45, 0x3f8f6f1b, 0x3fd96ef0, - 0x40236ec6, 0x406d6e9b, 0x40b66e70, 0x41006e44, 0x414a6e19, 0x41946ded, 0x41de6dc1, 0x42286d94, - 0x42716d68, 0x42bb6d3b, 0x43056d0d, 0x434f6ce0, 0x43986cb2, 0x43e26c84, 0x442c6c56, 0x44756c28, - 0x44bf6bf9, 0x45086bca, 0x45526b9b, 0x459b6b6b, 0x45e56b3c, 0x462e6b0c, 0x46786adb, 0x46c16aab, - 0x470a6a7a, 0x47536a49, 0x479c6a18, 0x47e569e7, 0x482e69b5, 0x48776983, 0x48c06951, 0x4909691e, - 0x495268ec, 0x499b68b9, 0x49e36885, 0x4a2c6852, 0x4a74681e, 0x4abd67ea, 0x4b0567b6, 0x4b4d6782, - 0x4b95674d, 0x4bde6718, 0x4c2666e3, 0x4c6d66ae, 0x4cb56678, 0x4cfd6642, 0x4d45660c, 0x4d8c65d6, - 0x4dd4659f, 0x4e1b6568, 0x4e626531, 0x4ea964fa, 0x4ef064c3, 0x4f37648b, 0x4f7e6453, 0x4fc5641b, - 0x500b63e2, 0x505263aa, 0x50986371, 0x50df6338, 0x512562fe, 0x516b62c5, 0x51b1628b, 0x51f66251, - 0x523c6217, 0x528161dc, 0x52c761a2, 0x530c6167, 0x5351612c, 0x539660f1, 0x53db60b5, 0x54206079, - 0x5464603d, 0x54a96001, 0x54ed5fc5, 0x55315f88, 0x55755f4b, 0x55b95f0e, 0x55fc5ed1, 0x56405e94, - 0x56835e56, 0x56c75e18, 0x570a5dda, 0x574d5d9c, 0x578f5d5e, 0x57d25d1f, 0x58145ce0, 0x58565ca1, + 0x000a7fff, 0x000e7fff, 0x00127fff, 0x00157fff, 0x00197fff, 0x001c7fff, 0x00207fff, 0x00237fff, + 0x00267fff, 0x002a7fff, 0x002d7fff, 0x00307fff, 0x00347fff, 0x00387fff, 0x003b7fff, 0x003f7fff, + 0x00437fff, 0x00477fff, 0x004b7fff, 0x004f7fff, 0x00537fff, 0x00577fff, 0x005b7fff, 0x00607fff, + 0x00647fff, 0x00697fff, 0x006d7fff, 0x00727fff, 0x00777fff, 0x007c7fff, 0x00817fff, 0x00867fff, + 0x008b7fff, 0x00917fff, 0x00967fff, 0x009c7fff, 0x00a17fff, 0x00a77fff, 0x00ad7fff, 0x00b37fff, + 0x00b97fff, 0x00bf7fff, 0x00c67fff, 0x00cc7fff, 0x00d37fff, 0x00da7fff, 0x00e07fff, 0x00e77fff, + 0x00ee7fff, 0x00f57fff, 0x00fd7fff, 0x01047fff, 0x010c7fff, 0x01137fff, 0x011b7fff, 0x01237fff, + 0x012b7fff, 0x01337fff, 0x013c7ffe, 0x01447ffe, 0x014d7ffe, 0x01567ffe, 0x015f7ffe, 0x01687ffe, + 0x01717ffe, 0x017a7ffe, 0x01837ffe, 0x018d7ffe, 0x01977ffd, 0x01a17ffd, 0x01ab7ffd, 0x01b57ffd, + 0x01bf7ffd, 0x01ca7ffd, 0x01d47ffd, 0x01df7ffc, 0x01ea7ffc, 0x01f57ffc, 0x02007ffc, 0x020c7ffc, + 0x02177ffc, 0x02237ffb, 0x022f7ffb, 0x023b7ffb, 0x02477ffb, 0x02537ffb, 0x02607ffa, 0x026d7ffa, + 0x027a7ffa, 0x02877ffa, 0x02947ff9, 0x02a17ff9, 0x02af7ff9, 0x02bc7ff9, 0x02ca7ff8, 0x02d87ff8, + 0x02e77ff8, 0x02f57ff7, 0x03047ff7, 0x03127ff7, 0x03217ff6, 0x03317ff6, 0x03407ff5, 0x034f7ff5, + 0x035f7ff5, 0x036f7ff4, 0x037f7ff4, 0x038f7ff3, 0x03a07ff3, 0x03b07ff2, 0x03c17ff2, 0x03d27ff1, + 0x03e37ff1, 0x03f57ff0, 0x04067ff0, 0x04187fef, 0x042a7fef, 0x043c7fee, 0x044f7fed, 0x04617fed, + 0x04747fec, 0x04877feb, 0x049a7feb, 0x04ae7fea, 0x04c17fe9, 0x04d57fe9, 0x04e97fe8, 0x04fd7fe7, + 0x05127fe6, 0x05277fe5, 0x053b7fe5, 0x05507fe4, 0x05667fe3, 0x057b7fe2, 0x05917fe1, 0x05a77fe0, + 0x05bd7fdf, 0x05d37fde, 0x05ea7fdd, 0x06017fdc, 0x06187fdb, 0x062f7fda, 0x06467fd9, 0x065e7fd7, + 0x06767fd6, 0x068e7fd5, 0x06a67fd4, 0x06bf7fd2, 0x06d87fd1, 0x06f17fd0, 0x070a7fce, 0x07237fcd, + 0x073d7fcc, 0x07577fca, 0x07717fc9, 0x078c7fc7, 0x07a67fc5, 0x07c17fc4, 0x07dc7fc2, 0x07f77fc0, + 0x08137fbf, 0x082f7fbd, 0x084b7fbb, 0x08677fb9, 0x08847fb7, 0x08a07fb6, 0x08bd7fb4, 0x08da7fb2, + 0x08f87faf, 0x09167fad, 0x09347fab, 0x09527fa9, 0x09707fa7, 0x098f7fa5, 0x09ae7fa2, 0x09cd7fa0, + 0x09ec7f9d, 0x0a0c7f9b, 0x0a2c7f98, 0x0a4c7f96, 0x0a6c7f93, 0x0a8d7f91, 0x0aae7f8e, 0x0acf7f8b, + 0x0af07f88, 0x0b127f85, 0x0b337f82, 0x0b557f7f, 0x0b787f7c, 0x0b9a7f79, 0x0bbd7f76, 0x0be07f73, + 0x0c047f6f, 0x0c277f6c, 0x0c4b7f69, 0x0c6f7f65, 0x0c937f61, 0x0cb87f5e, 0x0cdd7f5a, 0x0d027f56, + 0x0d277f53, 0x0d4d7f4f, 0x0d737f4b, 0x0d997f47, 0x0dbf7f43, 0x0de67f3e, 0x0e0c7f3a, 0x0e347f36, + 0x0e5b7f31, 0x0e837f2d, 0x0eaa7f28, 0x0ed37f24, 0x0efb7f1f, 0x0f237f1a, 0x0f4c7f15, 0x0f757f10, + 0x0f9f7f0b, 0x0fc87f06, 0x0ff27f01, 0x101c7efb, 0x10477ef6, 0x10717ef0, 0x109c7eeb, 0x10c87ee5, + 0x10f37edf, 0x111f7eda, 0x114a7ed4, 0x11777ece, 0x11a37ec7, 0x11d07ec1, 0x11fd7ebb, 0x122a7eb4, + 0x12577eae, 0x12857ea7, 0x12b37ea0, 0x12e17e9a, 0x130f7e93, 0x133e7e8c, 0x136d7e84, 0x139c7e7d, + 0x13cc7e76, 0x13fb7e6e, 0x142b7e67, 0x145b7e5f, 0x148c7e57, 0x14bc7e4f, 0x14ed7e47, 0x151e7e3f, + 0x15507e37, 0x15817e2e, 0x15b37e26, 0x15e57e1d, 0x16187e14, 0x164a7e0b, 0x167d7e02, 0x16b07df9, + 0x16e47df0, 0x17177de6, 0x174b7ddd, 0x177f7dd3, 0x17b37dc9, 0x17e87dbf, 0x181d7db5, 0x18527dab, + 0x18877da1, 0x18bc7d96, 0x18f27d8c, 0x19287d81, 0x195e7d76, 0x19957d6b, 0x19cb7d60, 0x1a027d54, + 0x1a397d49, 0x1a717d3d, 0x1aa87d31, 0x1ae07d26, 0x1b187d19, 0x1b507d0d, 0x1b897d01, 0x1bc27cf4, + 0x1bfb7ce8, 0x1c347cdb, 0x1c6d7cce, 0x1ca77cc1, 0x1ce17cb3, 0x1d1b7ca6, 0x1d557c98, 0x1d8f7c8a, + 0x1dca7c7c, 0x1e057c6e, 0x1e407c60, 0x1e7b7c51, 0x1eb77c43, 0x1ef37c34, 0x1f2f7c25, 0x1f6b7c16, + 0x1fa77c06, 0x1fe47bf7, 0x20217be7, 0x205e7bd7, 0x209b7bc7, 0x20d87bb7, 0x21167ba6, 0x21547b96, + 0x21927b85, 0x21d07b74, 0x220e7b63, 0x224d7b52, 0x228c7b40, 0x22cb7b2e, 0x230a7b1c, 0x23497b0a, + 0x23897af8, 0x23c87ae6, 0x24087ad3, 0x24487ac0, 0x24897aad, 0x24c97a9a, 0x250a7a86, 0x254b7a73, + 0x258c7a5f, 0x25cd7a4b, 0x260e7a36, 0x26507a22, 0x26917a0d, 0x26d379f8, 0x271579e3, 0x275779ce, + 0x279a79b8, 0x27dc79a3, 0x281f798d, 0x28627977, 0x28a57960, 0x28e8794a, 0x292b7933, 0x296f791c, + 0x29b27905, 0x29f678ed, 0x2a3a78d6, 0x2a7e78be, 0x2ac278a6, 0x2b07788d, 0x2b4b7875, 0x2b90785c, + 0x2bd47843, 0x2c19782a, 0x2c5e7810, 0x2ca477f7, 0x2ce977dd, 0x2d2e77c3, 0x2d7477a8, 0x2dba778e, + 0x2dff7773, 0x2e457758, 0x2e8b773d, 0x2ed27721, 0x2f187706, 0x2f5e76ea, 0x2fa576cd, 0x2fec76b1, + 0x30327694, 0x30797677, 0x30c0765a, 0x3107763d, 0x314e761f, 0x31967601, 0x31dd75e3, 0x322575c5, + 0x326c75a6, 0x32b47588, 0x32fc7569, 0x33447549, 0x338c752a, 0x33d4750a, 0x341c74ea, 0x346474ca, + 0x34ac74a9, 0x34f57488, 0x353d7467, 0x35857446, 0x35ce7424, 0x36177403, 0x365f73e1, 0x36a873be, + 0x36f1739c, 0x373a7379, 0x37837356, 0x37cc7333, 0x3815730f, 0x385e72ec, 0x38a772c8, 0x38f172a3, + 0x393a727f, 0x3983725a, 0x39cd7235, 0x3a167210, 0x3a6071ea, 0x3aa971c4, 0x3af3719e, 0x3b3c7178, + 0x3b867151, 0x3bd0712b, 0x3c197104, 0x3c6370dc, 0x3cad70b5, 0x3cf7708d, 0x3d407065, 0x3d8a703c, + 0x3dd47014, 0x3e1e6feb, 0x3e686fc2, 0x3eb16f98, 0x3efb6f6f, 0x3f456f45, 0x3f8f6f1b, 0x3fd96ef0, + 0x40236ec6, 0x406d6e9b, 0x40b66e70, 0x41006e44, 0x414a6e19, 0x41946ded, 0x41de6dc1, 0x42286d94, + 0x42716d68, 0x42bb6d3b, 0x43056d0d, 0x434f6ce0, 0x43986cb2, 0x43e26c84, 0x442c6c56, 0x44756c28, + 0x44bf6bf9, 0x45086bca, 0x45526b9b, 0x459b6b6b, 0x45e56b3c, 0x462e6b0c, 0x46786adb, 0x46c16aab, + 0x470a6a7a, 0x47536a49, 0x479c6a18, 0x47e569e7, 0x482e69b5, 0x48776983, 0x48c06951, 0x4909691e, + 0x495268ec, 0x499b68b9, 0x49e36885, 0x4a2c6852, 0x4a74681e, 0x4abd67ea, 0x4b0567b6, 0x4b4d6782, + 0x4b95674d, 0x4bde6718, 0x4c2666e3, 0x4c6d66ae, 0x4cb56678, 0x4cfd6642, 0x4d45660c, 0x4d8c65d6, + 0x4dd4659f, 0x4e1b6568, 0x4e626531, 0x4ea964fa, 0x4ef064c3, 0x4f37648b, 0x4f7e6453, 0x4fc5641b, + 0x500b63e2, 0x505263aa, 0x50986371, 0x50df6338, 0x512562fe, 0x516b62c5, 0x51b1628b, 0x51f66251, + 0x523c6217, 0x528161dc, 0x52c761a2, 0x530c6167, 0x5351612c, 0x539660f1, 0x53db60b5, 0x54206079, + 0x5464603d, 0x54a96001, 0x54ed5fc5, 0x55315f88, 0x55755f4b, 0x55b95f0e, 0x55fc5ed1, 0x56405e94, + 0x56835e56, 0x56c75e18, 0x570a5dda, 0x574d5d9c, 0x578f5d5e, 0x57d25d1f, 0x58145ce0, 0x58565ca1, 0x58995c62, 0x58da5c23, 0x591c5be3, 0x595e5ba4, 0x599f5b64, 0x59e05b24, 0x5a215ae3, 0x5a625aa3 }; @@ -1334,15 +1334,15 @@ const Word32 mTab_4_3[512]={ 0x7f5571cd, 0x7f801003, 0x7faab1c8, 0x7fd5571d }; - -const Word32 invSBF[24] = { - 0x3FFD34FC, 0x2D3F8000, 0x24F18C7E, 0x1FFE9A7E, - 0x1C9DF10C, 0x1A1F851A, 0x182FE994, 0x169FC000, - 0x15542AAA, 0x143C31C2, 0x134B1B6C, 0x127920BE, - 0x11BF2FCC, 0x111A749E, 0x1085FC42, 0x0FFFA7BE, - 0x0F855818, 0x0F14EE56, 0x0EAE6A78, 0x0E4EF886, - 0x0DF69880, 0x0DA49568, 0x0D578542, 0x0D101D0C -}; + +const Word32 invSBF[24] = { + 0x3FFD34FC, 0x2D3F8000, 0x24F18C7E, 0x1FFE9A7E, + 0x1C9DF10C, 0x1A1F851A, 0x182FE994, 0x169FC000, + 0x15542AAA, 0x143C31C2, 0x134B1B6C, 0x127920BE, + 0x11BF2FCC, 0x111A749E, 0x1085FC42, 0x0FFFA7BE, + 0x0F855818, 0x0F14EE56, 0x0EAE6A78, 0x0E4EF886, + 0x0DF69880, 0x0DA49568, 0x0D578542, 0x0D101D0C +}; const Word16 pow2tominusNover16[17] = { 0x7fff, 0x7a93, 0x7560, 0x7066, @@ -1350,21 +1350,21 @@ const Word16 pow2tominusNover16[17] = { 0x5a82, 0x56ac, 0x52ff, 0x4f7b, 0x4c1c, 0x48e2, 0x45cb, 0x42d5, 0x4000 -}; - -const Word16 sideInfoTabLong[MAX_SFB_LONG + 1] = { - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14 -}; - -const Word16 sideInfoTabShort[MAX_SFB_SHORT + 1] = { - 7, 7, 7, 7, 7, 7, 7, 10, 10, - 10, 10, 10, 10, 10, 13, 13 +}; + +const Word16 sideInfoTabLong[MAX_SFB_LONG + 1] = { + 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14 +}; + +const Word16 sideInfoTabShort[MAX_SFB_SHORT + 1] = { + 7, 7, 7, 7, 7, 7, 7, 10, 10, + 10, 10, 10, 10, 10, 13, 13 }; Word32 specExpMantTableComb_enc[4][14] = @@ -1398,33 +1398,33 @@ const UWord8 specExpTableComb_enc[4][14] = {1, 3, 4, 5, 7, 8, 9, 11, 12, 13, 15, 16, 17, 19} }; -const Word16 quantBorders[4][4] = { - /* pow(1.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */ - {0x0400, 0x0ee7, 0x1c86, 0x2c0d}, - /* pow(2.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */ - {0x04c2, 0x11b9, 0x21eb, 0x3463}, - /* pow(3.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */ - {0x05a8, 0x1514, 0x2856, 0x3e4c}, - /* pow(4.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */ - {0x06ba, 0x1911, 0x2ff8, 0x4a16}, -}; - -const Word16 quantRecon[4][3] = { - {0x0800, 0x1429, 0x229d}, - {0x0983, 0x17f9, 0x292a}, - {0x0b50, 0x1c82, 0x30f4}, - {0x0d74, 0x21e7, 0x3a37}, +const Word16 quantBorders[4][4] = { + /* pow(1.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */ + {0x0400, 0x0ee7, 0x1c86, 0x2c0d}, + /* pow(2.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */ + {0x04c2, 0x11b9, 0x21eb, 0x3463}, + /* pow(3.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */ + {0x05a8, 0x1514, 0x2856, 0x3e4c}, + /* pow(4.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */ + {0x06ba, 0x1911, 0x2ff8, 0x4a16}, +}; + +const Word16 quantRecon[4][3] = { + {0x0800, 0x1429, 0x229d}, + {0x0983, 0x17f9, 0x292a}, + {0x0b50, 0x1c82, 0x30f4}, + {0x0d74, 0x21e7, 0x3a37}, }; -const int sampRateTab[NUM_SAMPLE_RATES] = { - 96000, 88200, 64000, 48000, 44100, 32000, - 24000, 22050, 16000, 12000, 11025, 8000 +const int sampRateTab[NUM_SAMPLE_RATES] = { + 96000, 88200, 64000, 48000, 44100, 32000, + 24000, 22050, 16000, 12000, 11025, 8000 }; -const int rates[8] = { - 160, 240, 320, 400, 480, 560, 640, 0 -}; +const int rates[8] = { + 160, 240, 320, 400, 480, 560, 640, 0 +}; const int BandwithCoefTab[8][NUM_SAMPLE_RATES] = { { 7000, 7000, 4666, 3500, 3500, 2800, 2800, 2800, 2800, 2000, 2000, 2000}, @@ -1438,73 +1438,73 @@ const int BandwithCoefTab[8][NUM_SAMPLE_RATES] = { }; -/* total number of scale factor bands in one window */ -const UWord8 sfBandTotalShort[NUM_SAMPLE_RATES] = { - 12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15 -}; - -const UWord8 sfBandTotalLong[NUM_SAMPLE_RATES] = { - 41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40 -}; - -/* scale factor band tables */ -const int sfBandTabShortOffset[NUM_SAMPLE_RATES] = {0, 0, 0, 13, 13, 13, 28, 28, 44, 44, 44, 60}; - -const short sfBandTabShort[76] = { - /* short block 64, 88, 96 kHz [13] */ - 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128, - - /* short block 32, 44, 48 kHz [15] */ - 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128, - - /* short block 22, 24 kHz [16] */ - 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128, - - /* short block 11, 12, 16 kHz [16] */ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128, - - /* short block 8 kHz [16] */ - 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128 -}; - -const int sfBandTabLongOffset[NUM_SAMPLE_RATES] = {0, 0, 42, 90, 90, 140, 192, 192, 240, 240, 240, 284}; - -const short sfBandTabLong[325] = { - /* long block 88, 96 kHz [42] */ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, - 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, - 240, 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024, - - /* long block 64 kHz [48] */ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, - 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268, 304, 344, 384, - 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824, 864, 904, 944, 984, 1024, - - /* long block 44, 48 kHz [50] */ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, - 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, - 480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 1024, - - /* long block 32 kHz [52] */ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, - 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 512, - 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 992, 1024, - - /* long block 22, 24 kHz [48] */ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 76, - 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260, 284, - 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 1024, - - /* long block 11, 12, 16 kHz [44] */ - 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, - 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, 368, - 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024, - - /* long block 8 kHz [41] */ - 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, - 172, 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, - 448, 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024 -}; +/* total number of scale factor bands in one window */ +const UWord8 sfBandTotalShort[NUM_SAMPLE_RATES] = { + 12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15 +}; + +const UWord8 sfBandTotalLong[NUM_SAMPLE_RATES] = { + 41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40 +}; + +/* scale factor band tables */ +const int sfBandTabShortOffset[NUM_SAMPLE_RATES] = {0, 0, 0, 13, 13, 13, 28, 28, 44, 44, 44, 60}; + +const short sfBandTabShort[76] = { + /* short block 64, 88, 96 kHz [13] */ + 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128, + + /* short block 32, 44, 48 kHz [15] */ + 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128, + + /* short block 22, 24 kHz [16] */ + 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128, + + /* short block 11, 12, 16 kHz [16] */ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128, + + /* short block 8 kHz [16] */ + 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128 +}; + +const int sfBandTabLongOffset[NUM_SAMPLE_RATES] = {0, 0, 42, 90, 90, 140, 192, 192, 240, 240, 240, 284}; + +const short sfBandTabLong[325] = { + /* long block 88, 96 kHz [42] */ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, + 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, + 240, 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024, + + /* long block 64 kHz [48] */ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, + 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268, 304, 344, 384, + 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824, 864, 904, 944, 984, 1024, + + /* long block 44, 48 kHz [50] */ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, + 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, + 480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 1024, + + /* long block 32 kHz [52] */ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, + 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 512, + 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 992, 1024, + + /* long block 22, 24 kHz [48] */ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 76, + 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260, 284, + 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 1024, + + /* long block 11, 12, 16 kHz [44] */ + 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, + 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, 368, + 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024, + + /* long block 8 kHz [41] */ + 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, + 172, 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, + 448, 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024 +}; /* these tables are used only for counting and @@ -2344,20 +2344,20 @@ const Word32 tnsCoeff4Borders[16]= }; -const unsigned char bitrevTab[17 + 129] = -{ -/* 64 */ -0x01, 0x08, 0x02, 0x04, 0x03, 0x0c, 0x05, 0x0a, 0x07, 0x0e, 0x0b, 0x0d, 0x00, 0x06, 0x09, 0x0f, -0x00, - -/* 512 */ -0x01, 0x40, 0x02, 0x20, 0x03, 0x60, 0x04, 0x10, 0x05, 0x50, 0x06, 0x30, 0x07, 0x70, 0x09, 0x48, -0x0a, 0x28, 0x0b, 0x68, 0x0c, 0x18, 0x0d, 0x58, 0x0e, 0x38, 0x0f, 0x78, 0x11, 0x44, 0x12, 0x24, -0x13, 0x64, 0x15, 0x54, 0x16, 0x34, 0x17, 0x74, 0x19, 0x4c, 0x1a, 0x2c, 0x1b, 0x6c, 0x1d, 0x5c, -0x1e, 0x3c, 0x1f, 0x7c, 0x21, 0x42, 0x23, 0x62, 0x25, 0x52, 0x26, 0x32, 0x27, 0x72, 0x29, 0x4a, -0x2b, 0x6a, 0x2d, 0x5a, 0x2e, 0x3a, 0x2f, 0x7a, 0x31, 0x46, 0x33, 0x66, 0x35, 0x56, 0x37, 0x76, -0x39, 0x4e, 0x3b, 0x6e, 0x3d, 0x5e, 0x3f, 0x7e, 0x43, 0x61, 0x45, 0x51, 0x47, 0x71, 0x4b, 0x69, -0x4d, 0x59, 0x4f, 0x79, 0x53, 0x65, 0x57, 0x75, 0x5b, 0x6d, 0x5f, 0x7d, 0x67, 0x73, 0x6f, 0x7b, -0x00, 0x08, 0x14, 0x1c, 0x22, 0x2a, 0x36, 0x3e, 0x41, 0x49, 0x55, 0x5d, 0x63, 0x6b, 0x77, 0x7f, -0x00, +const unsigned char bitrevTab[17 + 129] = +{ +/* 64 */ +0x01, 0x08, 0x02, 0x04, 0x03, 0x0c, 0x05, 0x0a, 0x07, 0x0e, 0x0b, 0x0d, 0x00, 0x06, 0x09, 0x0f, +0x00, + +/* 512 */ +0x01, 0x40, 0x02, 0x20, 0x03, 0x60, 0x04, 0x10, 0x05, 0x50, 0x06, 0x30, 0x07, 0x70, 0x09, 0x48, +0x0a, 0x28, 0x0b, 0x68, 0x0c, 0x18, 0x0d, 0x58, 0x0e, 0x38, 0x0f, 0x78, 0x11, 0x44, 0x12, 0x24, +0x13, 0x64, 0x15, 0x54, 0x16, 0x34, 0x17, 0x74, 0x19, 0x4c, 0x1a, 0x2c, 0x1b, 0x6c, 0x1d, 0x5c, +0x1e, 0x3c, 0x1f, 0x7c, 0x21, 0x42, 0x23, 0x62, 0x25, 0x52, 0x26, 0x32, 0x27, 0x72, 0x29, 0x4a, +0x2b, 0x6a, 0x2d, 0x5a, 0x2e, 0x3a, 0x2f, 0x7a, 0x31, 0x46, 0x33, 0x66, 0x35, 0x56, 0x37, 0x76, +0x39, 0x4e, 0x3b, 0x6e, 0x3d, 0x5e, 0x3f, 0x7e, 0x43, 0x61, 0x45, 0x51, 0x47, 0x71, 0x4b, 0x69, +0x4d, 0x59, 0x4f, 0x79, 0x53, 0x65, 0x57, 0x75, 0x5b, 0x6d, 0x5f, 0x7d, 0x67, 0x73, 0x6f, 0x7b, +0x00, 0x08, 0x14, 0x1c, 0x22, 0x2a, 0x36, 0x3e, 0x41, 0x49, 0x55, 0x5d, 0x63, 0x6b, 0x77, 0x7f, +0x00, }; \ No newline at end of file diff --git a/media/libstagefright/codecs/aacenc/src/aacenc.c b/media/libstagefright/codecs/aacenc/src/aacenc.c index 552ae41..975f598 100644 --- a/media/libstagefright/codecs/aacenc/src/aacenc.c +++ b/media/libstagefright/codecs/aacenc/src/aacenc.c @@ -1,105 +1,105 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: aacenc.c - - Content: aac encoder interface functions - -*******************************************************************************/ - -#include "voAAC.h" -#include "typedef.h" -#include "aacenc_core.h" -#include "aac_rom.h" -#include "cmnMemory.h" -#include "memalign.h" - -/** -* Init the audio codec module and return codec handle -* \param phCodec [OUT] Return the video codec handle -* \param vType [IN] The codec type if the module support multi codec. -* \param pUserData [IN] The init param. It is memory operator or alloced memory -* \retval VO_ERR_NONE Succeeded. -*/ -VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_CODEC_INIT_USERDATA *pUserData) -{ - AAC_ENCODER*hAacEnc; - AACENC_CONFIG config; - int error; - -#ifdef USE_DEAULT_MEM - VO_MEM_OPERATOR voMemoprator; -#endif - VO_MEM_OPERATOR *pMemOP; - int interMem; - - interMem = 0; - error = 0; - - /* init the memory operator */ - if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL ) - { -#ifdef USE_DEAULT_MEM - voMemoprator.Alloc = cmnMemAlloc; - voMemoprator.Copy = cmnMemCopy; - voMemoprator.Free = cmnMemFree; - voMemoprator.Set = cmnMemSet; - voMemoprator.Check = cmnMemCheck; - - interMem = 1; - - pMemOP = &voMemoprator; -#else - *phCodec = NULL; - return VO_ERR_INVALID_ARG; -#endif - } - else - { - pMemOP = (VO_MEM_OPERATOR *)pUserData->memData; - } - - /* init the aac encoder handle */ - hAacEnc = (AAC_ENCODER*)mem_malloc(pMemOP, sizeof(AAC_ENCODER), 32, VO_INDEX_ENC_AAC); - if(NULL == hAacEnc) - { - error = 1; - } - - if(!error) - { - /* init the aac encoder intra memory */ - hAacEnc->intbuf = (short *)mem_malloc(pMemOP, AACENC_BLOCKSIZE*MAX_CHANNELS*sizeof(short), 32, VO_INDEX_ENC_AAC); - if(NULL == hAacEnc->intbuf) - { - error = 1; - } - } - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: aacenc.c + + Content: aac encoder interface functions + +*******************************************************************************/ + +#include "voAAC.h" +#include "typedef.h" +#include "aacenc_core.h" +#include "aac_rom.h" +#include "cmnMemory.h" +#include "memalign.h" + +/** +* Init the audio codec module and return codec handle +* \param phCodec [OUT] Return the video codec handle +* \param vType [IN] The codec type if the module support multi codec. +* \param pUserData [IN] The init param. It is memory operator or alloced memory +* \retval VO_ERR_NONE Succeeded. +*/ +VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_CODEC_INIT_USERDATA *pUserData) +{ + AAC_ENCODER*hAacEnc; + AACENC_CONFIG config; + int error; + +#ifdef USE_DEAULT_MEM + VO_MEM_OPERATOR voMemoprator; +#endif + VO_MEM_OPERATOR *pMemOP; + int interMem; + + interMem = 0; + error = 0; + + /* init the memory operator */ + if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL ) + { +#ifdef USE_DEAULT_MEM + voMemoprator.Alloc = cmnMemAlloc; + voMemoprator.Copy = cmnMemCopy; + voMemoprator.Free = cmnMemFree; + voMemoprator.Set = cmnMemSet; + voMemoprator.Check = cmnMemCheck; + + interMem = 1; + + pMemOP = &voMemoprator; +#else + *phCodec = NULL; + return VO_ERR_INVALID_ARG; +#endif + } + else + { + pMemOP = (VO_MEM_OPERATOR *)pUserData->memData; + } + + /* init the aac encoder handle */ + hAacEnc = (AAC_ENCODER*)mem_malloc(pMemOP, sizeof(AAC_ENCODER), 32, VO_INDEX_ENC_AAC); + if(NULL == hAacEnc) + { + error = 1; + } + + if(!error) + { + /* init the aac encoder intra memory */ + hAacEnc->intbuf = (short *)mem_malloc(pMemOP, AACENC_BLOCKSIZE*MAX_CHANNELS*sizeof(short), 32, VO_INDEX_ENC_AAC); + if(NULL == hAacEnc->intbuf) + { + error = 1; + } + } + if (!error) { /* init the aac encoder psychoacoustic */ error = (PsyNew(&hAacEnc->psyKernel, MAX_CHANNELS, pMemOP) || PsyOutNew(&hAacEnc->psyOut, pMemOP)); - } - + } + if (!error) { /* init the aac encoder quantization elements */ error = QCOutNew(&hAacEnc->qcOut,MAX_CHANNELS, pMemOP); - } - + } + if (!error) { /* init the aac encoder quantization state */ error = QCNew(&hAacEnc->qcKernel, pMemOP); @@ -116,380 +116,380 @@ VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_COD } *phCodec = NULL; return VO_ERR_OUTOF_MEMORY; - } - - /* init the aac encoder memory operator */ -#ifdef USE_DEAULT_MEM - if(interMem) - { - hAacEnc->voMemoprator.Alloc = cmnMemAlloc; - hAacEnc->voMemoprator.Copy = cmnMemCopy; - hAacEnc->voMemoprator.Free = cmnMemFree; - hAacEnc->voMemoprator.Set = cmnMemSet; - hAacEnc->voMemoprator.Check = cmnMemCheck; - - pMemOP = &hAacEnc->voMemoprator; - } -#endif - /* init the aac encoder default parameter */ - if(hAacEnc->initOK == 0) - { - AACENC_CONFIG config; - config.adtsUsed = 1; - config.bitRate = 128000; - config.nChannelsIn = 2; - config.nChannelsOut = 2; - config.sampleRate = 44100; - config.bandWidth = 20000; - - AacEncOpen(hAacEnc, config); - } - - hAacEnc->voMemop = pMemOP; - - *phCodec = hAacEnc; - - return VO_ERR_NONE; -} - -/** -* Set input audio data. -* \param hCodec [IN]] The Codec Handle which was created by Init function. -* \param pInput [IN] The input buffer param. -* \param pOutBuffer [OUT] The output buffer info. -* \retval VO_ERR_NONE Succeeded. -*/ -VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput) -{ - AAC_ENCODER *hAacEnc; - int length; - - if(NULL == hCodec || NULL == pInput || NULL == pInput->Buffer) - { - 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); - hAacEnc->uselength = 0; - - 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->inbuf, length*sizeof(short)); - - hAacEnc->encbuf = hAacEnc->intbuf; - hAacEnc->enclen = hAacEnc->intlen + length; - - hAacEnc->inbuf += length; - hAacEnc->inlen -= length; - } - - return VO_ERR_NONE; -} - -/** -* Get the outut audio data -* \param hCodec [IN]] The Codec Handle which was created by Init function. -* \param pOutBuffer [OUT] The output audio data -* \param pOutInfo [OUT] The dec module filled audio format and used the input size. -* pOutInfo->InputUsed is total used the input size. -* \retval VO_ERR_NONE Succeeded. -* VO_ERR_INPUT_BUFFER_SMALL. The input was finished or the input data was not enought. -*/ -VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput, VO_AUDIO_OUTPUTINFO * pOutInfo) -{ - AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec; - Word16 numAncDataBytes=0; - Word32 inbuflen; - int ret, length; - if(NULL == hAacEnc) - return VO_ERR_INVALID_ARG; - - inbuflen = AACENC_BLOCKSIZE*hAacEnc->config.nChannelsIn; - - /* check the input pcm buffer and length*/ - if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen) - { - length = hAacEnc->enclen; - if(hAacEnc->intlen == 0) - { - hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf, - hAacEnc->encbuf, length*sizeof(short)); - hAacEnc->uselength += length*sizeof(short); - } - else - { - hAacEnc->uselength += (length - hAacEnc->intlen)*sizeof(short); - } - - hAacEnc->intlen = length; - - pOutput->Length = 0; - if(pOutInfo) - pOutInfo->InputUsed = hAacEnc->uselength; - return VO_ERR_INPUT_BUFFER_SMALL; - } - - /* check the output aac buffer and length*/ - if(NULL == pOutput || NULL == pOutput->Buffer || pOutput->Length < (6144/8)*hAacEnc->config.nChannelsOut/(sizeof(Word32))) - return VO_ERR_OUTPUT_BUFFER_SMALL; - - /* aac encoder core function */ - AacEncEncode( hAacEnc, - (Word16*)hAacEnc->encbuf, - NULL, - &numAncDataBytes, - pOutput->Buffer, - &pOutput->Length); - - /* update the input pcm buffer and length*/ - if(hAacEnc->intlen) - { - length = inbuflen - hAacEnc->intlen; - hAacEnc->encbuf = hAacEnc->inbuf; - hAacEnc->enclen = hAacEnc->inlen; - hAacEnc->uselength += length*sizeof(short); - hAacEnc->intlen = 0; - } - else - { - hAacEnc->encbuf = hAacEnc->encbuf + inbuflen; - hAacEnc->enclen = hAacEnc->enclen - inbuflen; - hAacEnc->uselength += inbuflen*sizeof(short); - } - - /* update the output aac information */ - if(pOutInfo) - { - pOutInfo->Format.Channels = hAacEnc->config.nChannelsOut; - pOutInfo->Format.SampleRate = hAacEnc->config.sampleRate; - pOutInfo->Format.SampleBits = 16; - pOutInfo->InputUsed = hAacEnc->uselength; - } - - return VO_ERR_NONE; -} - -/** -* Uninit the Codec. -* \param hCodec [IN]] The Codec Handle which was created by Init function. -* \retval VO_ERR_NONE Succeeded. -*/ -VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec) -{ - AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec; - - if(NULL != hAacEnc) - { - /* close the aac encoder */ - AacEncClose(hAacEnc, hAacEnc->voMemop); - - /* free the aac encoder handle*/ - mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC); - hAacEnc = NULL; - } - - return VO_ERR_NONE; -} - -/** -* Set the param for special target. -* \param hCodec [IN]] The Codec Handle which was created by Init function. -* \param uParamID [IN] The param ID. -* \param pData [IN] The param value depend on the ID> -* \retval VO_ERR_NONE Succeeded. -*/ -VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData) -{ - AACENC_CONFIG config; - AACENC_PARAM* pAAC_param; - VO_AUDIO_FORMAT *pWAV_Format; - AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec; - int ret, i, bitrate, tmp; - int SampleRateIdx; - - if(NULL == hAacEnc) - return VO_ERR_INVALID_ARG; - - switch(uParamID) - { - case VO_PID_AAC_ENCPARAM: /* init aac encoder parameter*/ - AacInitDefaultConfig(&config); - if(pData == NULL) - return VO_ERR_INVALID_ARG; - pAAC_param = (AACENC_PARAM*)pData; - config.adtsUsed = pAAC_param->adtsUsed; - config.bitRate = pAAC_param->bitRate; - config.nChannelsIn = pAAC_param->nChannels; - config.nChannelsOut = pAAC_param->nChannels; - config.sampleRate = pAAC_param->sampleRate; - - /* check the channel */ - if(config.nChannelsIn< 1 || config.nChannelsIn > MAX_CHANNELS || - config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut) - return VO_ERR_AUDIO_UNSCHANNEL; - - /* check the samplerate */ - ret = -1; - for(i = 0; i < NUM_SAMPLE_RATES; i++) - { - if(config.sampleRate == sampRateTab[i]) - { - ret = 0; - break; - } - } - if(ret < 0) - return VO_ERR_AUDIO_UNSSAMPLERATE; - - SampleRateIdx = i; - - tmp = 441; - 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.sampleRate*6*config.nChannelsOut)) - { - config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut; - - if(config.bitRate/config.nChannelsOut < 4000) - config.bitRate = 4000 * config.nChannelsOut; - else if(config.bitRate > config.sampleRate*6*config.nChannelsOut) - config.bitRate = config.sampleRate*6*config.nChannelsOut; - else if(config.bitRate/config.nChannelsOut > 160000) - config.bitRate = config.nChannelsOut*160000; - } - - /* check the bandwidth */ - bitrate = config.bitRate / config.nChannelsOut; - bitrate = bitrate * tmp / config.sampleRate; - - for (i = 0; rates[i]; i++) - { - if (rates[i] >= bitrate) - break; - } - - config.bandWidth = BandwithCoefTab[i][SampleRateIdx]; - - /* init aac encoder core */ - ret = AacEncOpen(hAacEnc, config); - if(ret) - return VO_ERR_AUDIO_UNSFEATURE; - break; - case VO_PID_AUDIO_FORMAT: /* init pcm channel and samplerate*/ - AacInitDefaultConfig(&config); - if(pData == NULL) - return VO_ERR_INVALID_ARG; - pWAV_Format = (VO_AUDIO_FORMAT*)pData; - config.adtsUsed = 1; - config.nChannelsIn = pWAV_Format->Channels; - config.nChannelsOut = pWAV_Format->Channels; - config.sampleRate = pWAV_Format->SampleRate; - - /* check the channel */ - if(config.nChannelsIn< 1 || config.nChannelsIn > MAX_CHANNELS || - config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut) - return VO_ERR_AUDIO_UNSCHANNEL; - - /* check the samplebits */ - if(pWAV_Format->SampleBits != 16) - { - return VO_ERR_AUDIO_UNSFEATURE; - } - - /* check the samplerate */ - ret = -1; - for(i = 0; i < NUM_SAMPLE_RATES; i++) - { - if(config.sampleRate == sampRateTab[i]) - { - ret = 0; - break; - } - } - if(ret < 0) - return VO_ERR_AUDIO_UNSSAMPLERATE; - - SampleRateIdx = i; - - /* update the bitrates */ - tmp = 441; - if(config.sampleRate%8000 == 0) - tmp =480; - - config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut; - - if(config.bitRate/config.nChannelsOut < 4000) - config.bitRate = 4000 * config.nChannelsOut; - else if(config.bitRate > config.sampleRate*6*config.nChannelsOut) - config.bitRate = config.sampleRate*6*config.nChannelsOut; - else if(config.bitRate/config.nChannelsOut > 160000) - config.bitRate = config.nChannelsOut*160000; - - /* check the bandwidth */ - bitrate = config.bitRate / config.nChannelsOut; - bitrate = bitrate * tmp / config.sampleRate; - - for (i = 0; rates[i]; i++) - { - if (rates[i] >= bitrate) - break; - } - - config.bandWidth = BandwithCoefTab[i][SampleRateIdx]; - - /* init aac encoder core */ - ret = AacEncOpen(hAacEnc, config); - if(ret) - return VO_ERR_AUDIO_UNSFEATURE; - break; - default: - return VO_ERR_WRONG_PARAM_ID; - } - - return VO_ERR_NONE; -} - -/** -* Get the param for special target. -* \param hCodec [IN]] The Codec Handle which was created by Init function. -* \param uParamID [IN] The param ID. -* \param pData [IN] The param value depend on the ID> -* \retval VO_ERR_NONE Succeeded. -*/ -VO_U32 VO_API voAACEncGetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData) -{ - return VO_ERR_NONE; -} - -/** - * Get audio codec API interface - * \param pEncHandle [out] Return the AAC Encoder handle. - * \retval VO_ERR_OK Succeeded. - */ -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; - pDecHandle->SetParam = voAACEncSetParam; - pDecHandle->GetParam = voAACEncGetParam; - pDecHandle->Uninit = voAACEncUninit; - - return VO_ERR_NONE; + } + + /* init the aac encoder memory operator */ +#ifdef USE_DEAULT_MEM + if(interMem) + { + hAacEnc->voMemoprator.Alloc = cmnMemAlloc; + hAacEnc->voMemoprator.Copy = cmnMemCopy; + hAacEnc->voMemoprator.Free = cmnMemFree; + hAacEnc->voMemoprator.Set = cmnMemSet; + hAacEnc->voMemoprator.Check = cmnMemCheck; + + pMemOP = &hAacEnc->voMemoprator; + } +#endif + /* init the aac encoder default parameter */ + if(hAacEnc->initOK == 0) + { + AACENC_CONFIG config; + config.adtsUsed = 1; + config.bitRate = 128000; + config.nChannelsIn = 2; + config.nChannelsOut = 2; + config.sampleRate = 44100; + config.bandWidth = 20000; + + AacEncOpen(hAacEnc, config); + } + + hAacEnc->voMemop = pMemOP; + + *phCodec = hAacEnc; + + return VO_ERR_NONE; +} + +/** +* Set input audio data. +* \param hCodec [IN]] The Codec Handle which was created by Init function. +* \param pInput [IN] The input buffer param. +* \param pOutBuffer [OUT] The output buffer info. +* \retval VO_ERR_NONE Succeeded. +*/ +VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput) +{ + AAC_ENCODER *hAacEnc; + int length; + + if(NULL == hCodec || NULL == pInput || NULL == pInput->Buffer) + { + 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); + hAacEnc->uselength = 0; + + 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->inbuf, length*sizeof(short)); + + hAacEnc->encbuf = hAacEnc->intbuf; + hAacEnc->enclen = hAacEnc->intlen + length; + + hAacEnc->inbuf += length; + hAacEnc->inlen -= length; + } + + return VO_ERR_NONE; +} + +/** +* Get the outut audio data +* \param hCodec [IN]] The Codec Handle which was created by Init function. +* \param pOutBuffer [OUT] The output audio data +* \param pOutInfo [OUT] The dec module filled audio format and used the input size. +* pOutInfo->InputUsed is total used the input size. +* \retval VO_ERR_NONE Succeeded. +* VO_ERR_INPUT_BUFFER_SMALL. The input was finished or the input data was not enought. +*/ +VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput, VO_AUDIO_OUTPUTINFO * pOutInfo) +{ + AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec; + Word16 numAncDataBytes=0; + Word32 inbuflen; + int ret, length; + if(NULL == hAacEnc) + return VO_ERR_INVALID_ARG; + + inbuflen = AACENC_BLOCKSIZE*hAacEnc->config.nChannelsIn; + + /* check the input pcm buffer and length*/ + if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen) + { + length = hAacEnc->enclen; + if(hAacEnc->intlen == 0) + { + hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf, + hAacEnc->encbuf, length*sizeof(short)); + hAacEnc->uselength += length*sizeof(short); + } + else + { + hAacEnc->uselength += (length - hAacEnc->intlen)*sizeof(short); + } + + hAacEnc->intlen = length; + + pOutput->Length = 0; + if(pOutInfo) + pOutInfo->InputUsed = hAacEnc->uselength; + return VO_ERR_INPUT_BUFFER_SMALL; + } + + /* check the output aac buffer and length*/ + if(NULL == pOutput || NULL == pOutput->Buffer || pOutput->Length < (6144/8)*hAacEnc->config.nChannelsOut/(sizeof(Word32))) + return VO_ERR_OUTPUT_BUFFER_SMALL; + + /* aac encoder core function */ + AacEncEncode( hAacEnc, + (Word16*)hAacEnc->encbuf, + NULL, + &numAncDataBytes, + pOutput->Buffer, + &pOutput->Length); + + /* update the input pcm buffer and length*/ + if(hAacEnc->intlen) + { + length = inbuflen - hAacEnc->intlen; + hAacEnc->encbuf = hAacEnc->inbuf; + hAacEnc->enclen = hAacEnc->inlen; + hAacEnc->uselength += length*sizeof(short); + hAacEnc->intlen = 0; + } + else + { + hAacEnc->encbuf = hAacEnc->encbuf + inbuflen; + hAacEnc->enclen = hAacEnc->enclen - inbuflen; + hAacEnc->uselength += inbuflen*sizeof(short); + } + + /* update the output aac information */ + if(pOutInfo) + { + pOutInfo->Format.Channels = hAacEnc->config.nChannelsOut; + pOutInfo->Format.SampleRate = hAacEnc->config.sampleRate; + pOutInfo->Format.SampleBits = 16; + pOutInfo->InputUsed = hAacEnc->uselength; + } + + return VO_ERR_NONE; +} + +/** +* Uninit the Codec. +* \param hCodec [IN]] The Codec Handle which was created by Init function. +* \retval VO_ERR_NONE Succeeded. +*/ +VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec) +{ + AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec; + + if(NULL != hAacEnc) + { + /* close the aac encoder */ + AacEncClose(hAacEnc, hAacEnc->voMemop); + + /* free the aac encoder handle*/ + mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC); + hAacEnc = NULL; + } + + return VO_ERR_NONE; +} + +/** +* Set the param for special target. +* \param hCodec [IN]] The Codec Handle which was created by Init function. +* \param uParamID [IN] The param ID. +* \param pData [IN] The param value depend on the ID> +* \retval VO_ERR_NONE Succeeded. +*/ +VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData) +{ + AACENC_CONFIG config; + AACENC_PARAM* pAAC_param; + VO_AUDIO_FORMAT *pWAV_Format; + AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec; + int ret, i, bitrate, tmp; + int SampleRateIdx; + + if(NULL == hAacEnc) + return VO_ERR_INVALID_ARG; + + switch(uParamID) + { + case VO_PID_AAC_ENCPARAM: /* init aac encoder parameter*/ + AacInitDefaultConfig(&config); + if(pData == NULL) + return VO_ERR_INVALID_ARG; + pAAC_param = (AACENC_PARAM*)pData; + config.adtsUsed = pAAC_param->adtsUsed; + config.bitRate = pAAC_param->bitRate; + config.nChannelsIn = pAAC_param->nChannels; + config.nChannelsOut = pAAC_param->nChannels; + config.sampleRate = pAAC_param->sampleRate; + + /* check the channel */ + if(config.nChannelsIn< 1 || config.nChannelsIn > MAX_CHANNELS || + config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut) + return VO_ERR_AUDIO_UNSCHANNEL; + + /* check the samplerate */ + ret = -1; + for(i = 0; i < NUM_SAMPLE_RATES; i++) + { + if(config.sampleRate == sampRateTab[i]) + { + ret = 0; + break; + } + } + if(ret < 0) + return VO_ERR_AUDIO_UNSSAMPLERATE; + + SampleRateIdx = i; + + tmp = 441; + 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.sampleRate*6*config.nChannelsOut)) + { + config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut; + + if(config.bitRate/config.nChannelsOut < 4000) + config.bitRate = 4000 * config.nChannelsOut; + else if(config.bitRate > config.sampleRate*6*config.nChannelsOut) + config.bitRate = config.sampleRate*6*config.nChannelsOut; + else if(config.bitRate/config.nChannelsOut > 160000) + config.bitRate = config.nChannelsOut*160000; + } + + /* check the bandwidth */ + bitrate = config.bitRate / config.nChannelsOut; + bitrate = bitrate * tmp / config.sampleRate; + + for (i = 0; rates[i]; i++) + { + if (rates[i] >= bitrate) + break; + } + + config.bandWidth = BandwithCoefTab[i][SampleRateIdx]; + + /* init aac encoder core */ + ret = AacEncOpen(hAacEnc, config); + if(ret) + return VO_ERR_AUDIO_UNSFEATURE; + break; + case VO_PID_AUDIO_FORMAT: /* init pcm channel and samplerate*/ + AacInitDefaultConfig(&config); + if(pData == NULL) + return VO_ERR_INVALID_ARG; + pWAV_Format = (VO_AUDIO_FORMAT*)pData; + config.adtsUsed = 1; + config.nChannelsIn = pWAV_Format->Channels; + config.nChannelsOut = pWAV_Format->Channels; + config.sampleRate = pWAV_Format->SampleRate; + + /* check the channel */ + if(config.nChannelsIn< 1 || config.nChannelsIn > MAX_CHANNELS || + config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut) + return VO_ERR_AUDIO_UNSCHANNEL; + + /* check the samplebits */ + if(pWAV_Format->SampleBits != 16) + { + return VO_ERR_AUDIO_UNSFEATURE; + } + + /* check the samplerate */ + ret = -1; + for(i = 0; i < NUM_SAMPLE_RATES; i++) + { + if(config.sampleRate == sampRateTab[i]) + { + ret = 0; + break; + } + } + if(ret < 0) + return VO_ERR_AUDIO_UNSSAMPLERATE; + + SampleRateIdx = i; + + /* update the bitrates */ + tmp = 441; + if(config.sampleRate%8000 == 0) + tmp =480; + + config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut; + + if(config.bitRate/config.nChannelsOut < 4000) + config.bitRate = 4000 * config.nChannelsOut; + else if(config.bitRate > config.sampleRate*6*config.nChannelsOut) + config.bitRate = config.sampleRate*6*config.nChannelsOut; + else if(config.bitRate/config.nChannelsOut > 160000) + config.bitRate = config.nChannelsOut*160000; + + /* check the bandwidth */ + bitrate = config.bitRate / config.nChannelsOut; + bitrate = bitrate * tmp / config.sampleRate; + + for (i = 0; rates[i]; i++) + { + if (rates[i] >= bitrate) + break; + } + + config.bandWidth = BandwithCoefTab[i][SampleRateIdx]; + + /* init aac encoder core */ + ret = AacEncOpen(hAacEnc, config); + if(ret) + return VO_ERR_AUDIO_UNSFEATURE; + break; + default: + return VO_ERR_WRONG_PARAM_ID; + } + + return VO_ERR_NONE; +} + +/** +* Get the param for special target. +* \param hCodec [IN]] The Codec Handle which was created by Init function. +* \param uParamID [IN] The param ID. +* \param pData [IN] The param value depend on the ID> +* \retval VO_ERR_NONE Succeeded. +*/ +VO_U32 VO_API voAACEncGetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData) +{ + return VO_ERR_NONE; +} + +/** + * Get audio codec API interface + * \param pEncHandle [out] Return the AAC Encoder handle. + * \retval VO_ERR_OK Succeeded. + */ +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; + pDecHandle->SetParam = voAACEncSetParam; + pDecHandle->GetParam = voAACEncGetParam; + pDecHandle->Uninit = voAACEncUninit; + + return VO_ERR_NONE; } \ No newline at end of file diff --git a/media/libstagefright/codecs/aacenc/src/aacenc_core.c b/media/libstagefright/codecs/aacenc/src/aacenc_core.c index 616475c..b69a017 100644 --- a/media/libstagefright/codecs/aacenc/src/aacenc_core.c +++ b/media/libstagefright/codecs/aacenc/src/aacenc_core.c @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: aacenc_core.c - - Content: aac encoder core functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: aacenc_core.c + + Content: aac encoder core functions + *******************************************************************************/ #include "typedef.h" @@ -58,9 +58,9 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder const AACENC_CONFIG config /* pre-initialized config struct */ ) { - Word32 i; + Word32 i; Word32 error = 0; - Word16 profile = 1; + Word16 profile = 1; ELEMENT_INFO *elInfo = NULL; @@ -76,7 +76,7 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder error = InitElementInfo (config.nChannelsOut, &hAacEnc->elInfo); } - + if (!error) { elInfo = &hAacEnc->elInfo; } @@ -95,8 +95,8 @@ Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder } /* use or not adts header */ - if(!error) { - hAacEnc->qcOut.qcElement.adtsUsed = config.adtsUsed; + if(!error) { + hAacEnc->qcOut.qcElement.adtsUsed = config.adtsUsed; } /* init encoder quantization */ @@ -198,14 +198,14 @@ Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */ &aacEnc->qcOut, &aacEnc->psyOut, &globUsedBits, - ancBytes, + ancBytes, aacEnc->psyKernel.sampleRateIdx); updateBitres(&aacEnc->qcKernel, &aacEnc->qcOut); /* write out the bitstream */ - *numOutBytes = GetBitsAvail(aacEnc->hBitStream) >> 3; + *numOutBytes = GetBitsAvail(aacEnc->hBitStream) >> 3; return 0; } diff --git a/media/libstagefright/codecs/aacenc/src/adj_thr.c b/media/libstagefright/codecs/aacenc/src/adj_thr.c index 0dbd216..83b43a1 100644 --- a/media/libstagefright/codecs/aacenc/src/adj_thr.c +++ b/media/libstagefright/codecs/aacenc/src/adj_thr.c @@ -1,26 +1,26 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: adj_thr.c - - Content: Threshold compensation functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: adj_thr.c + + Content: Threshold compensation functions + *******************************************************************************/ -#include "basic_op.h" +#include "basic_op.h" #include "oper_32b.h" #include "adj_thr_data.h" #include "adj_thr.h" @@ -29,14 +29,14 @@ #define minSnrLimit 0x6666 /* 1 dB */ -#define PEBITS_COEF 0x170a /* 0.18*(1 << 15)*/ - -#define HOLE_THR_LONG 0x2873 /* 0.316*(1 << 15) */ -#define HOLE_THR_SHORT 0x4000 /* 0.5 *(1 << 15) */ - -#define MS_THRSPREAD_COEF 0x7333 /* 0.9 * (1 << 15) */ - -#define MIN_SNR_COEF 0x651f /* 3.16* (1 << (15 - 2)) */ +#define PEBITS_COEF 0x170a /* 0.18*(1 << 15)*/ + +#define HOLE_THR_LONG 0x2873 /* 0.316*(1 << 15) */ +#define HOLE_THR_SHORT 0x4000 /* 0.5 *(1 << 15) */ + +#define MS_THRSPREAD_COEF 0x7333 /* 0.9 * (1 << 15) */ + +#define MIN_SNR_COEF 0x651f /* 3.16* (1 << (15 - 2)) */ /* values for avoid hole flag */ enum _avoid_hole_state { @@ -67,15 +67,15 @@ static void calcThreshExp(Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB], PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], const Word16 nChannels) { - Word16 ch, sfb, sfbGrp; + Word16 ch, sfb, sfbGrp; Word32 *pthrExp, *psfbThre; for (ch=0; chsfbCnt; sfbGrp+= psyOutChan->sfbPerGroup) - pthrExp = &(thrExp[ch][sfbGrp]); - psfbThre = psyOutChan->sfbThreshold + sfbGrp; + PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch]; + for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup) + pthrExp = &(thrExp[ch][sfbGrp]); + psfbThre = psyOutChan->sfbThreshold + sfbGrp; for (sfb=0; sfbmaxSfbPerGroup; sfb++) { - *pthrExp = rsqrt(rsqrt(*psfbThre,INT_BITS),INT_BITS); + *pthrExp = rsqrt(rsqrt(*psfbThre,INT_BITS),INT_BITS); pthrExp++; psfbThre++; } } @@ -112,7 +112,7 @@ static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], } if (nSfb > 0) { - avgEn = avgEn / nSfb; + avgEn = avgEn / nSfb; log_avgEn = iLog4(avgEn); startRatio_x_avgEn = fixmul(msaParam->startRatio, avgEn); @@ -172,18 +172,18 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], if (psyOutChan->windowSequence != SHORT_WINDOW) { for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ - psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp; + psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp; for (sfb=0; sfbmaxSfbPerGroup; sfb++) { - *psfbSpreadEn = *psfbSpreadEn >> 1; /* 0.5 */ + *psfbSpreadEn = *psfbSpreadEn >> 1; /* 0.5 */ ++psfbSpreadEn; } } } else { - for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ + for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp; for (sfb=0; sfbmaxSfbPerGroup; sfb++) { - *psfbSpreadEn = (*psfbSpreadEn >> 1) + (*psfbSpreadEn >> 3); /* 0.63 */ + *psfbSpreadEn = (*psfbSpreadEn >> 1) + (*psfbSpreadEn >> 3); /* 0.63 */ ++psfbSpreadEn; } } @@ -201,7 +201,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], threshold = HOLE_THR_SHORT; for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ - Word16 *psfbMinSnr = psyOutChan->sfbMinSnr + sfbGrp; + Word16 *psfbMinSnr = psyOutChan->sfbMinSnr + sfbGrp; for (sfb=0; sfbmaxSfbPerGroup; sfb++) { Word32 sfbEn, sfbEnm1, sfbEnp1, avgEn; @@ -219,7 +219,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], if (sfbEn > avgEn && avgEn > 0) { Word32 tmpMinSnr; - shift = norm_l(sfbEn); + shift = norm_l(sfbEn); tmpMinSnr = Div_32(L_mpy_ls(avgEn, minSnrLimit) << shift, sfbEn << shift ); tmpMinSnr = max(tmpMinSnr, HOLE_THR_LONG); tmpMinSnr = max(tmpMinSnr, threshold); @@ -231,7 +231,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], Word32 tmpMinSnr; Word32 minSnrEn = L_mpy_wx(avgEn, *psfbMinSnr); - if(minSnrEn < sfbEn) { + if(minSnrEn < sfbEn) { shift = norm_l(sfbEn); tmpMinSnr = Div_32( minSnrEn << shift, sfbEn<> 2), mult(*psfbMinSnr, MIN_SNR_COEF)) << 2); - } + } psfbMinSnr++; } } @@ -266,17 +266,17 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], 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<= sfbEnS) { psyOutChanS->sfbMinSnr[sfb] = MAX_16; } - else { + 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); } @@ -295,7 +295,7 @@ static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB], for(ch=0; chsfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ - Word16 *pahFlag = ahFlag[ch] + sfbGrp; + Word16 *pahFlag = ahFlag[ch] + sfbGrp; for (sfb=0; sfbmaxSfbPerGroup; sfb++) { if ((psyOutChan->sfbSpreadedEnergy[sfbGrp+sfb] > psyOutChan->sfbEnergy[sfbGrp+sfb]) || @@ -328,7 +328,7 @@ static void calcPeNoAH(Word16 *pe, PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], const Word16 nChannels) { - Word16 ch, sfb, sfbGrp; + Word16 ch, sfb, sfbGrp; int ipe, iconstPart, inActiveLines; ipe = 0; @@ -347,7 +347,7 @@ static void calcPeNoAH(Word16 *pe, } } } - } + } *pe = saturate(ipe); *constPart = saturate(iconstPart); @@ -367,14 +367,14 @@ static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], const Word32 redVal) { Word32 sfbThrReduced; - Word32 *psfbEn, *psfbThr; - Word16 ch, sfb, sfbGrp; + Word32 *psfbEn, *psfbThr; + Word16 ch, sfb, sfbGrp; for(ch=0; chsfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) { - psfbEn = psyOutChan->sfbEnergy + sfbGrp; - psfbThr = psyOutChan->sfbThreshold + sfbGrp; + psfbEn = psyOutChan->sfbEnergy + sfbGrp; + psfbThr = psyOutChan->sfbThreshold + sfbGrp; for (sfb=0; sfbmaxSfbPerGroup; sfb++) { if (*psfbEn > *psfbThr) { @@ -391,8 +391,8 @@ static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE; } *psfbThr = sfbThrReduced; - } - + } + psfbEn++; psfbThr++; } } @@ -419,8 +419,8 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], PSY_OUT_CHANNEL *psyOutChan; PE_CHANNEL_DATA *peChanData; Word32 deltaSfbPe; - Word32 normFactor; - Word32 *psfbPeFactors; + Word32 normFactor; + Word32 *psfbPeFactors; Word16 *psfbNActiveLines, *pahFlag; Word32 sfbEn, sfbThr; Word32 sfbThrReduced; @@ -431,9 +431,9 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], psyOutChan = &psyOutChannel[ch]; peChanData = &peData->peChannelData[ch]; for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ - psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp; - psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp; - pahFlag = ahFlag[ch] + sfbGrp; + psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp; + psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp; + pahFlag = ahFlag[ch] + sfbGrp; for (sfb=0; sfbmaxSfbPerGroup; sfb++) { Word32 redThrExp = thrExp[ch][sfbGrp+sfb] + redVal; @@ -444,8 +444,8 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], } else { *psfbPeFactors = 0; - } - psfbPeFactors++; + } + psfbPeFactors++; pahFlag++; psfbNActiveLines++; } } @@ -457,9 +457,9 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], psyOutChan = &psyOutChannel[ch]; peChanData = &peData->peChannelData[ch]; for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ - psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp; - psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp; - pahFlag = ahFlag[ch] + sfbGrp; + psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp; + psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp; + pahFlag = ahFlag[ch] + sfbGrp; for (sfb=0; sfbmaxSfbPerGroup; sfb++) { /* pe difference for this sfb */ deltaSfbPe = *psfbPeFactors * deltaPe; @@ -487,7 +487,7 @@ static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], if(thrFactor > sfbThr) { - shift = norm_l(thrFactor); + shift = norm_l(thrFactor); sfbThrReduced = Div_32( sfbThr << shift, thrFactor<sfbThreshold[sfbGrp+sfb] = sfbThrReduced; - } - + } + pahFlag++; psfbNActiveLines++; psfbPeFactors++; } } @@ -539,8 +539,8 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], for (sfb=sfbSubWin; sfbpeChannelData; - PSY_OUT_CHANNEL* psyOutCh = psyOutChannel; + PE_CHANNEL_DATA* peChan = peData->peChannelData; + PSY_OUT_CHANNEL* psyOutCh = psyOutChannel; for (ch=0; chsfbMinSnr[sfb] < minSnrLimit) { @@ -553,7 +553,7 @@ static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], peChan->sfbPe[sfb]; peData->pe = peData->pe + deltaPe; peChan->pe = peChan->pe + deltaPe; - } + } peChan += 1; psyOutCh += 1; } /* stop if enough has been saved */ @@ -659,7 +659,7 @@ static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], if(ahCnt) { Word32 iahCnt; - shift = norm_l(ahCnt); + shift = norm_l(ahCnt); iahCnt = Div_32( 1 << shift, ahCnt << shift ); avgEn = fixmul(avgEn, iahCnt); } @@ -831,7 +831,7 @@ static Word16 calcBitSave(Word16 fillLevel, fillLevel = max(fillLevel, clipLow); fillLevel = min(fillLevel, clipHigh); - if(clipHigh-clipLow) + if(clipHigh-clipLow) bitsave = (maxBitSave - (((maxBitSave-minBitSave)*(fillLevel-clipLow))/ (clipHigh-clipLow))); @@ -860,7 +860,7 @@ static Word16 calcBitSpend(Word16 fillLevel, fillLevel = max(fillLevel, clipLow); fillLevel = min(fillLevel, clipHigh); - if(clipHigh-clipLow) + if(clipHigh-clipLow) bitspend = (minBitSpend + ((maxBitSpend - minBitSpend)*(fillLevel - clipLow) / (clipHigh-clipLow))); @@ -964,7 +964,7 @@ static Word16 bitresCalcBitFac( const Word16 bitresBits, bresParam->clipSpendLow, bresParam->clipSpendHigh, bresParam->minBitSpend, bresParam->maxBitSpend); - if(adjThrChan->peMax != adjThrChan->peMin) + if(adjThrChan->peMax != adjThrChan->peMin) bitresFac = (100 - bitSave) + extract_l(((bitSpend + bitSave) * (pex - adjThrChan->peMin)) / (adjThrChan->peMax - adjThrChan->peMin)); else @@ -1196,7 +1196,7 @@ void AdjustThresholds(ADJ_THR_STATE *adjThrState, if (peOffsDiff > 0) { Word32 temp = 1000 - (nChannels * 200); - chBitDistribution[ch] = chBitDistribution[ch] + + chBitDistribution[ch] = chBitDistribution[ch] + (temp * peData.peChannelData[ch].pe) / peOffsDiff; } } diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s index 48edd4f..e0885f1 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s @@ -1,167 +1,167 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ File: AutoCorrelation_v5.s -@ -@ Content: AutoCorrelation function armv5 assemble -@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - - - .section .text - .global AutoCorrelation - -AutoCorrelation: - stmdb sp!, {r4 - r11, lr} - - 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 - - sub r12, r4, #8 -L132: - ldr r6, [r5, r2] - add r2, r2, #4 - smulbb r3, r6, r6 - ldr r1, [r5, r2] - smultt r10, r6, r6 - mov r3, r3, asr #9 - smulbb r6, r1, r1 - mov r10, r10, asr #9 - qadd r0, r0, r3 - smultt r11, r1, r1 - add r2, r2, #4 - qadd r0, r0, r10 - mov r6, r6, asr #9 - mov r11, r11, asr #9 - ldr r1, [r5, r2] - qadd r0, r0, r6 - smulbb r10, r1, r1 - smultt r6, r1, r1 - qadd r0, r0, r11 - mov r10, r10, asr #9 - mov r6, r6, asr #9 - qadd r0, r0, r10 - add r2, r2, #4 - 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 - 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 - 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] - 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 - -L1319: -L1320: - add r13, r13, #20 - ldmia sp!, {r4 - r11, pc} - - @ENDP @ |AutoCorrelation| - .end +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ File: AutoCorrelation_v5.s +@ +@ Content: AutoCorrelation function armv5 assemble +@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + + .section .text + .global AutoCorrelation + +AutoCorrelation: + stmdb sp!, {r4 - r11, lr} + + 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 + + sub r12, r4, #8 +L132: + ldr r6, [r5, r2] + add r2, r2, #4 + smulbb r3, r6, r6 + ldr r1, [r5, r2] + smultt r10, r6, r6 + mov r3, r3, asr #9 + smulbb r6, r1, r1 + mov r10, r10, asr #9 + qadd r0, r0, r3 + smultt r11, r1, r1 + add r2, r2, #4 + qadd r0, r0, r10 + mov r6, r6, asr #9 + mov r11, r11, asr #9 + ldr r1, [r5, r2] + qadd r0, r0, r6 + smulbb r10, r1, r1 + smultt r6, r1, r1 + qadd r0, r0, r11 + mov r10, r10, asr #9 + mov r6, r6, asr #9 + qadd r0, r0, r10 + add r2, r2, #4 + 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 + 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 + 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] + 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 + +L1319: +L1320: + add r13, r13, #20 + ldmia sp!, {r4 - r11, pc} + + @ENDP @ |AutoCorrelation| + .end diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s index 7997e98..75b916c 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s @@ -1,112 +1,112 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ File: CalcWindowEnergy_v5.s -@ -@ Content: CalcWindowEnergy function armv5 assemble -@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - - .section .text - - .global CalcWindowEnergy - -CalcWindowEnergy: - stmdb sp!, {r4 - r11, lr} - sub r13, r13, #20 - - mov r3, r3, lsl #16 - ldr r10, [r0, #168] @ states0 = blockSwitchingControl->iirStates[0]; - mov r3, r3, asr #16 - ldr r11, [r0, #172] @ states1 = blockSwitchingControl->iirStates[1]; - - mov r2, r2, lsl #16 - 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 r4, #0 @ i=0 - - str r8, [r13, #4] - str r0, [r13, #8] - str r3, [r13, #12] - -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); - 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 r8, r0, r8 @ out = accu3 - accu2; - - mov r10, r3 @ states0 = accu1; - 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 - ldr r3, [r13, #12] - - add r7, r7, r9, asr #7 - - 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] - - cmp r8, #8 - 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} - -hiPassCoeff: - .word 0xbec8b439 - .word 0x609d4952 - - @ENDP - .end +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ File: CalcWindowEnergy_v5.s +@ +@ Content: CalcWindowEnergy function armv5 assemble +@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + .section .text + + .global CalcWindowEnergy + +CalcWindowEnergy: + stmdb sp!, {r4 - r11, lr} + sub r13, r13, #20 + + mov r3, r3, lsl #16 + ldr r10, [r0, #168] @ states0 = blockSwitchingControl->iirStates[0]; + mov r3, r3, asr #16 + ldr r11, [r0, #172] @ states1 = blockSwitchingControl->iirStates[1]; + + mov r2, r2, lsl #16 + 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 r4, #0 @ i=0 + + str r8, [r13, #4] + str r0, [r13, #8] + str r3, [r13, #12] + +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); + 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 r8, r0, r8 @ out = accu3 - accu2; + + mov r10, r3 @ states0 = accu1; + 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 + ldr r3, [r13, #12] + + add r7, r7, r9, asr #7 + + 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] + + cmp r8, #8 + 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} + +hiPassCoeff: + .word 0xbec8b439 + .word 0x609d4952 + + @ENDP + .end diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s index d4d3edb..38fe092 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s @@ -1,131 +1,131 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ File: PrePostMDCT_v5.s -@ -@ Content: premdct and postmdct function armv5 assemble -@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - - .section .text - .global PreMDCT - -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)@ - 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] - strd r8, [r3] - - subs r1, r1, #1 - sub r3, r3, #8 - add r0, r0, #8 - bne 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 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)@ - 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 - - strd r4, [r0] - strd r6, [r3] - - subs r1, r1, #1 - sub r3, r3, #8 - add r0, r0, #8 - bne PostMDCT_LOOP - -PostMDCT_END: - ldmia sp!, {r4 - r11, pc} - @ENDP @ |PostMDCT| +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ File: PrePostMDCT_v5.s +@ +@ Content: premdct and postmdct function armv5 assemble +@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + .section .text + .global PreMDCT + +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)@ + 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] + strd r8, [r3] + + subs r1, r1, #1 + sub r3, r3, #8 + add r0, r0, #8 + bne 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 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)@ + 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 + + strd r4, [r0] + strd r6, [r3] + + subs r1, r1, #1 + sub r3, r3, #8 + add r0, r0, #8 + bne PostMDCT_LOOP + +PostMDCT_END: + ldmia sp!, {r4 - r11, pc} + @ENDP @ |PostMDCT| .end \ No newline at end of file diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s index 370daf4..b30881a 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s @@ -1,252 +1,252 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ File: R4R8First_v5.s -@ -@ Content: Radix8First and Radix4First function armv5 assemble -@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - - .section .text - .global Radix4First - -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 - -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 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 - - str r6, [sp] - str r7, [sp, #4] - - str r8, [sp, #8] - str r9, [sp, #12] - - str r2, [sp, #16] - str r3, [sp, #20] - - str r0, [sp, #24] - 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 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 - - ldr r2, [sp, #16] - ldr r3, [sp, #20] - - 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| +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ File: R4R8First_v5.s +@ +@ Content: Radix8First and Radix4First function armv5 assemble +@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + .section .text + .global Radix4First + +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 + +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 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 + + str r6, [sp] + str r7, [sp, #4] + + str r8, [sp, #8] + str r9, [sp, #12] + + str r2, [sp, #16] + str r3, [sp, #20] + + str r0, [sp, #24] + 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 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 + + ldr r2, [sp, #16] + ldr r3, [sp, #20] + + 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 \ No newline at end of file diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s index db8e5d8..bc069b4 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s @@ -1,169 +1,169 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ File: Radix4FFT_v5.s -@ -@ Content: Radix4FFT armv5 assemble -@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - .section .text - .global Radix4FFT - -Radix4FFT: - stmdb sp!, {r4 - r11, lr} - sub sp, sp, #32 - - mov r1, r1, asr #2 - 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] - str r2, [sp, #8] - str r3, [sp, #12] - beq Radix4FFT_LOOP1_END - -Radix4FFT_LOOP2: - mov r12, r3 @ csptr = twidTab@ - mov r11, r2 @ j = bgn - cmp r11, #0 - str r10, [sp, #16] - 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]@ - 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@ - 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] - 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] - 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] - 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] - add r14, r14, #8 @ xptr += 2@ - - ldr r11, [sp, #20] - subs r11, r11, #1 - bne Radix4FFT_LOOP3 - -Radix4FFT_LOOP2_END: - ldr r10, [sp, #16] - ldr r3, [sp, #12] - ldr r2, [sp, #8] - 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] - 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 - ldmia sp!, {r4 - r11, pc} - - @ENDP @ |Radix4FFT| +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ File: Radix4FFT_v5.s +@ +@ Content: Radix4FFT armv5 assemble +@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + .section .text + .global Radix4FFT + +Radix4FFT: + stmdb sp!, {r4 - r11, lr} + sub sp, sp, #32 + + mov r1, r1, asr #2 + 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] + str r2, [sp, #8] + str r3, [sp, #12] + beq Radix4FFT_LOOP1_END + +Radix4FFT_LOOP2: + mov r12, r3 @ csptr = twidTab@ + mov r11, r2 @ j = bgn + cmp r11, #0 + str r10, [sp, #16] + 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]@ + 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@ + 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] + 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] + 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] + 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] + add r14, r14, #8 @ xptr += 2@ + + ldr r11, [sp, #20] + subs r11, r11, #1 + bne Radix4FFT_LOOP3 + +Radix4FFT_LOOP2_END: + ldr r10, [sp, #16] + ldr r3, [sp, #12] + ldr r2, [sp, #8] + 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] + 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 + ldmia sp!, {r4 - r11, pc} + + @ENDP @ |Radix4FFT| .end \ No newline at end of file diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/band_nrg_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/band_nrg_v5.s index a463dfd..3b88810 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/band_nrg_v5.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/band_nrg_v5.s @@ -1,204 +1,204 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ File: band_nrg_v5.s -@ -@ Content: CalcBandEnergy and CalcBandEnergyMS function armv5 assemble -@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - - .section .text - - .global CalcBandEnergy - -CalcBandEnergy: - 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 - -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 - -L23: - 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 - smull r6, r8, r6, r6 - ldr r11, [r0, +r10, lsl #2] - qadd r14, r14, r7 - add r10, r10, #1 - smull r11, r7, r11, r11 - ldr r6, [r0, +r10, lsl #2] - qadd r14, r14, r8 - smull r6, r8, r6, r6 - add r10, r10, #1 - qadd r14, r14, r7 - cmp r10, r2 - qadd r14, r14, r8 - blt L23 - -L28: - qadd r14, r14, r14 - str r14, [r3, +r4, lsl #2] - add r4, r4, #1 - qadd r9, r9, r14 - cmp r4, r5 - - blt L22 - -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 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 - - str r3, [r13, #4] - str r4, [r13, #8] - str r12, [r13, #12] - str r14, [r13, #16] - -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 r14, [r1, +r10, lsl #2] - sub r8, r8, r9 - - smull r5, r3, r5, r5 - mov r12, r12, asr #1 - smull r8, r4, r8, r8 - mov r14, r14, asr #1 - - qadd r6, r6, r3 - add r5, r12, r14 - qadd r7, r7, r4 - sub r8, r12, r14 - - smull r5, r3, r5, r5 - add r10, r10, #1 - smull r8, r4, r8, r8 - - qadd r6, r6, r3 - qadd r7, r7, r4 - - 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 r14, [r1, +r10, lsl #2] - sub r8, r8, r9 - - smull r5, r3, r5, r5 - mov r12, r12, asr #1 - smull r8, r4, r8, r8 - mov r14, r14, asr #1 - - qadd r6, r6, r3 - add r5, r12, r14 - qadd r7, r7, r4 - sub r8, r12, r14 - - smull r5, r3, r5, r5 - add r10, r10, #1 - 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 r12, [r13, #12] - ldr r14, [r13, #16] -L39: - qadd r6, r6, r6 - 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] - - add r4, r4, #1 - cmp r4, r3 - blt L32 - -L315: - ldr r8, [r13, #64] - ldr r9, [r13, #72] - str r12, [r8, #0] - str r14, [r9, #0] - - add r13, r13, #24 - ldmia sp!, {r4 - r11, pc} - @ENDP ; |CalcBandEnergyMS| - - .end +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ File: band_nrg_v5.s +@ +@ Content: CalcBandEnergy and CalcBandEnergyMS function armv5 assemble +@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + .section .text + + .global CalcBandEnergy + +CalcBandEnergy: + 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 + +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 + +L23: + 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 + smull r6, r8, r6, r6 + ldr r11, [r0, +r10, lsl #2] + qadd r14, r14, r7 + add r10, r10, #1 + smull r11, r7, r11, r11 + ldr r6, [r0, +r10, lsl #2] + qadd r14, r14, r8 + smull r6, r8, r6, r6 + add r10, r10, #1 + qadd r14, r14, r7 + cmp r10, r2 + qadd r14, r14, r8 + blt L23 + +L28: + qadd r14, r14, r14 + str r14, [r3, +r4, lsl #2] + add r4, r4, #1 + qadd r9, r9, r14 + cmp r4, r5 + + blt L22 + +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 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 + + str r3, [r13, #4] + str r4, [r13, #8] + str r12, [r13, #12] + str r14, [r13, #16] + +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 r14, [r1, +r10, lsl #2] + sub r8, r8, r9 + + smull r5, r3, r5, r5 + mov r12, r12, asr #1 + smull r8, r4, r8, r8 + mov r14, r14, asr #1 + + qadd r6, r6, r3 + add r5, r12, r14 + qadd r7, r7, r4 + sub r8, r12, r14 + + smull r5, r3, r5, r5 + add r10, r10, #1 + smull r8, r4, r8, r8 + + qadd r6, r6, r3 + qadd r7, r7, r4 + + 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 r14, [r1, +r10, lsl #2] + sub r8, r8, r9 + + smull r5, r3, r5, r5 + mov r12, r12, asr #1 + smull r8, r4, r8, r8 + mov r14, r14, asr #1 + + qadd r6, r6, r3 + add r5, r12, r14 + qadd r7, r7, r4 + sub r8, r12, r14 + + smull r5, r3, r5, r5 + add r10, r10, #1 + 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 r12, [r13, #12] + ldr r14, [r13, #16] +L39: + qadd r6, r6, r6 + 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] + + add r4, r4, #1 + cmp r4, r3 + blt L32 + +L315: + ldr r8, [r13, #64] + ldr r9, [r13, #72] + str r12, [r8, #0] + str r14, [r9, #0] + + add r13, r13, #24 + ldmia sp!, {r4 - r11, pc} + @ENDP ; |CalcBandEnergyMS| + + .end diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s index bf7dcba..a04c105 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s @@ -1,135 +1,135 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ File: PrePostMDCT_v7.s -@ -@ Content: premdct and postmdct function armv7 assemble -@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - - .section .text - .global PreMDCT - -PreMDCT: - stmdb sp!, {r4 - r11, lr} - - add r9, r0, r1, lsl #2 - sub r3, r9, #32 - - movs r1, r1, asr #2 - 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 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]! - - subs r1, r1, #4 - sub r3, r3, #64 - bne 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, #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)@ - - 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)@ - - VREV64.32 Q2, Q4 - 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]! - - subs r1, r1, #4 - sub r3, r3, #64 - bne PostMDCT_LOOP - -PostMDCT_END: - ldmia sp!, {r4 - r11, pc} - - @ENDP @ |PostMDCT| +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ File: PrePostMDCT_v7.s +@ +@ Content: premdct and postmdct function armv7 assemble +@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + .section .text + .global PreMDCT + +PreMDCT: + stmdb sp!, {r4 - r11, lr} + + add r9, r0, r1, lsl #2 + sub r3, r9, #32 + + movs r1, r1, asr #2 + 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 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]! + + subs r1, r1, #4 + sub r3, r3, #64 + bne 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, #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)@ + + 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)@ + + VREV64.32 Q2, Q4 + 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]! + + subs r1, r1, #4 + sub r3, r3, #64 + bne PostMDCT_LOOP + +PostMDCT_END: + ldmia sp!, {r4 - r11, pc} + + @ENDP @ |PostMDCT| .end \ No newline at end of file diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s index 99ee68b..defd45d 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s @@ -1,146 +1,146 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ File: R4R8First_v7.s -@ -@ Content: Radix8First and Radix4First function armv7 assemble -@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - - .section .text - .global Radix8First - -Radix8First: - stmdb sp!, {r4 - r11, lr} - - ldr r3, SQRT1_2 - cmp r1, #0 - - 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]@ - VADD.S32 d6, d2, d3 @ r3 = buf[4] + buf[6]@i3 = buf[5] + buf[7]@ - 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 - - 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]@ - VADD.S32 d6, d10, d11 @ r2 = buf[12] + buf[14]@i2 = buf[13] + buf[15]@ - VREV64.I32 d7, d7 - VSUB.S32 d5, d8, d9 @ r3 = buf[ 8] - buf[10]@i3 = buf[ 9] - buf[11]@ - - 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 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 - 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 - - 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 - - VST1.I32 {d12, d13, d14, d15}, [r0]! - VST1.I32 {d16, d17, d18, d19}, [r0]! - bne Radix8First_LOOP - -Radix8First_END: - ldmia sp!, {r4 - r11, pc} -SQRT1_2: - .word 0x2d413ccd - - @ENDP @ |Radix8First| - - .section .text - .global Radix4First - -Radix4First: - stmdb sp!, {r4 - r11, lr} - - 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]@ - 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 @ - - VADD.S32 Q4, Q2, Q3 - VSUB.S32 Q5, Q2, Q3 - - VREV64.I32 d11, d11 - VTRN.32 d9, d11 - 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} - - @ENDP @ |Radix4First| +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ File: R4R8First_v7.s +@ +@ Content: Radix8First and Radix4First function armv7 assemble +@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + .section .text + .global Radix8First + +Radix8First: + stmdb sp!, {r4 - r11, lr} + + ldr r3, SQRT1_2 + cmp r1, #0 + + 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]@ + VADD.S32 d6, d2, d3 @ r3 = buf[4] + buf[6]@i3 = buf[5] + buf[7]@ + 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 + + 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]@ + VADD.S32 d6, d10, d11 @ r2 = buf[12] + buf[14]@i2 = buf[13] + buf[15]@ + VREV64.I32 d7, d7 + VSUB.S32 d5, d8, d9 @ r3 = buf[ 8] - buf[10]@i3 = buf[ 9] - buf[11]@ + + 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 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 + 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 + + 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 + + VST1.I32 {d12, d13, d14, d15}, [r0]! + VST1.I32 {d16, d17, d18, d19}, [r0]! + bne Radix8First_LOOP + +Radix8First_END: + ldmia sp!, {r4 - r11, pc} +SQRT1_2: + .word 0x2d413ccd + + @ENDP @ |Radix8First| + + .section .text + .global Radix4First + +Radix4First: + stmdb sp!, {r4 - r11, lr} + + 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]@ + 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 @ + + VADD.S32 Q4, Q2, Q3 + VSUB.S32 Q5, Q2, Q3 + + VREV64.I32 d11, d11 + VTRN.32 d9, d11 + 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} + + @ENDP @ |Radix4First| .end \ No newline at end of file diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s index e1a8438..84a4a80 100644 --- a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s +++ b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s @@ -1,143 +1,143 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ File: Radix4FFT_v7.s -@ -@ Content: Radix4FFT armv7 assemble -@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - - .section .text - .global Radix4FFT - -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: - @r0 = xptr[0]@ - @r1 = xptr[1]@ - 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@ - 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]! - 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] - 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) - - 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 - 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: - ldmia sp!, {r4 - r11, pc} - - @ENDP @ |Radix4FFT| +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ File: Radix4FFT_v7.s +@ +@ Content: Radix4FFT armv7 assemble +@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + .section .text + .global Radix4FFT + +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: + @r0 = xptr[0]@ + @r1 = xptr[1]@ + 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@ + 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]! + 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] + 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) + + 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 + 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: + ldmia sp!, {r4 - r11, pc} + + @ENDP @ |Radix4FFT| .end \ No newline at end of file diff --git a/media/libstagefright/codecs/aacenc/src/band_nrg.c b/media/libstagefright/codecs/aacenc/src/band_nrg.c index 666c4ca..89c39b6 100644 --- a/media/libstagefright/codecs/aacenc/src/band_nrg.c +++ b/media/libstagefright/codecs/aacenc/src/band_nrg.c @@ -1,35 +1,35 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: band_nrg.c - - Content: Band/Line energy calculations functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: band_nrg.c + + Content: Band/Line energy calculations functions + *******************************************************************************/ -#include "basic_op.h" +#include "basic_op.h" #include "band_nrg.h" -#ifndef ARMV5E +#ifndef ARMV5E /******************************************************************************** * * function name: CalcBandEnergy * description: Calc sfb-bandwise mdct-energies for left and right channel * -**********************************************************************************/ +**********************************************************************************/ void CalcBandEnergy(const Word32 *mdctSpectrum, const Word16 *bandOffset, const Word16 numBands, @@ -42,8 +42,8 @@ void CalcBandEnergy(const Word32 *mdctSpectrum, for (i=0; i0) + (t1>0) + (t2>0) + (t3>0); - } + } bitCount[1]=INVALID_BITCOUNT; bitCount[2]=INVALID_BITCOUNT; @@ -196,7 +196,7 @@ static void count5_6_7_8_9_10_11(const Word16 *values, Word32 t0,t1,i; Word32 bc5_6,bc7_8,bc9_10; - Word16 bc11,sc; + Word16 bc11,sc; bc5_6=0; bc7_8=0; @@ -294,43 +294,43 @@ static void count7_8_9_10_11(const Word16 *values, * output: bitCount for tables 9-11 * *****************************************************************************/ -static void count9_10_11(const Word16 *values, - const Word16 width, - Word16 *bitCount) -{ - - Word32 t0,t1,i; - Word32 bc9_10; - Word16 bc11,sc; - - bc9_10=0; - bc11=0; - sc=0; - - for(i=0;i0) + (t1>0); - } - bitCount[1]=INVALID_BITCOUNT; - bitCount[2]=INVALID_BITCOUNT; - bitCount[3]=INVALID_BITCOUNT; - bitCount[4]=INVALID_BITCOUNT; - bitCount[5]=INVALID_BITCOUNT; - bitCount[6]=INVALID_BITCOUNT; - bitCount[7]=INVALID_BITCOUNT; - bitCount[8]=INVALID_BITCOUNT; - bitCount[9]=extract_h(bc9_10) + sc; - bitCount[10]=extract_l(bc9_10) + sc; - bitCount[11]=bc11 + sc; - +static void count9_10_11(const Word16 *values, + const Word16 width, + Word16 *bitCount) +{ + + Word32 t0,t1,i; + Word32 bc9_10; + Word16 bc11,sc; + + bc9_10=0; + bc11=0; + sc=0; + + for(i=0;i0) + (t1>0); + } + bitCount[1]=INVALID_BITCOUNT; + bitCount[2]=INVALID_BITCOUNT; + bitCount[3]=INVALID_BITCOUNT; + bitCount[4]=INVALID_BITCOUNT; + bitCount[5]=INVALID_BITCOUNT; + bitCount[6]=INVALID_BITCOUNT; + bitCount[7]=INVALID_BITCOUNT; + bitCount[8]=INVALID_BITCOUNT; + bitCount[9]=extract_h(bc9_10) + sc; + bitCount[10]=extract_l(bc9_10) + sc; + bitCount[11]=bc11 + sc; + } /***************************************************************************** @@ -342,35 +342,35 @@ static void count9_10_11(const Word16 *values, * output: bitCount for table 11 * *****************************************************************************/ - static void count11(const Word16 *values, - const Word16 width, - Word16 *bitCount) -{ - Word32 t0,t1,i; - Word16 bc11,sc; - - bc11=0; - sc=0; - for(i=0;i0) + (t1>0); - } - - bitCount[1]=INVALID_BITCOUNT; - bitCount[2]=INVALID_BITCOUNT; - bitCount[3]=INVALID_BITCOUNT; - bitCount[4]=INVALID_BITCOUNT; - bitCount[5]=INVALID_BITCOUNT; - bitCount[6]=INVALID_BITCOUNT; - bitCount[7]=INVALID_BITCOUNT; - bitCount[8]=INVALID_BITCOUNT; - bitCount[9]=INVALID_BITCOUNT; - bitCount[10]=INVALID_BITCOUNT; - bitCount[11]=bc11 + sc; + static void count11(const Word16 *values, + const Word16 width, + Word16 *bitCount) +{ + Word32 t0,t1,i; + Word16 bc11,sc; + + bc11=0; + sc=0; + for(i=0;i0) + (t1>0); + } + + bitCount[1]=INVALID_BITCOUNT; + bitCount[2]=INVALID_BITCOUNT; + bitCount[3]=INVALID_BITCOUNT; + bitCount[4]=INVALID_BITCOUNT; + bitCount[5]=INVALID_BITCOUNT; + bitCount[6]=INVALID_BITCOUNT; + bitCount[7]=INVALID_BITCOUNT; + bitCount[8]=INVALID_BITCOUNT; + bitCount[9]=INVALID_BITCOUNT; + bitCount[10]=INVALID_BITCOUNT; + bitCount[11]=bc11 + sc; } /***************************************************************************** @@ -383,54 +383,54 @@ static void count9_10_11(const Word16 *values, * *****************************************************************************/ -static void countEsc(const Word16 *values, - const Word16 width, - Word16 *bitCount) -{ - Word32 t0,t1,t00,t01,i; - Word16 bc11,ec,sc; - - bc11=0; - sc=0; - ec=0; - for(i=0;i0) + (t1>0); - - t00 = min(t0,16); - t01 = min(t1,16); - bc11 = bc11 + huff_ltab11[t00][t01]; - - - if(t0 >= 16){ - ec = ec + 5; - while(sub(t0=(t0 >> 1), 16) >= 0) { - ec = ec + 2; - } - } - - - if(t1 >= 16){ - ec = ec + 5; - while(sub(t1=(t1 >> 1), 16) >= 0) { - ec = ec + 2; - } - } - } - bitCount[1]=INVALID_BITCOUNT; - bitCount[2]=INVALID_BITCOUNT; - bitCount[3]=INVALID_BITCOUNT; - bitCount[4]=INVALID_BITCOUNT; - bitCount[5]=INVALID_BITCOUNT; - bitCount[6]=INVALID_BITCOUNT; - bitCount[7]=INVALID_BITCOUNT; - bitCount[8]=INVALID_BITCOUNT; - bitCount[9]=INVALID_BITCOUNT; - bitCount[10]=INVALID_BITCOUNT; - bitCount[11]=bc11 + sc + ec; +static void countEsc(const Word16 *values, + const Word16 width, + Word16 *bitCount) +{ + Word32 t0,t1,t00,t01,i; + Word16 bc11,ec,sc; + + bc11=0; + sc=0; + ec=0; + for(i=0;i0) + (t1>0); + + t00 = min(t0,16); + t01 = min(t1,16); + bc11 = bc11 + huff_ltab11[t00][t01]; + + + if(t0 >= 16){ + ec = ec + 5; + while(sub(t0=(t0 >> 1), 16) >= 0) { + ec = ec + 2; + } + } + + + if(t1 >= 16){ + ec = ec + 5; + while(sub(t1=(t1 >> 1), 16) >= 0) { + ec = ec + 2; + } + } + } + bitCount[1]=INVALID_BITCOUNT; + bitCount[2]=INVALID_BITCOUNT; + bitCount[3]=INVALID_BITCOUNT; + bitCount[4]=INVALID_BITCOUNT; + bitCount[5]=INVALID_BITCOUNT; + bitCount[6]=INVALID_BITCOUNT; + bitCount[7]=INVALID_BITCOUNT; + bitCount[8]=INVALID_BITCOUNT; + bitCount[9]=INVALID_BITCOUNT; + bitCount[10]=INVALID_BITCOUNT; + bitCount[11]=bc11 + sc + ec; } @@ -492,376 +492,376 @@ Word16 bitCount(const Word16 *values, * description: write huffum bits * *****************************************************************************/ -Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF hBitstream) -{ - - Word32 i, t0, t1, t2, t3, t00, t01; - Word16 codeWord, codeLength; - Word16 sign, signLength; - - - switch (codeBook) { - case CODE_BOOK_ZERO_NO: - break; - - case CODE_BOOK_1_NO: - for(i=0; i= 16){ - Word16 n, p; - n=0; - p=t0; - while(sub(p=(p >> 1), 16) >= 0){ - - WriteBits(hBitstream,1,1); - n = n + 1; - } - WriteBits(hBitstream,0,1); - n = n + 4; - WriteBits(hBitstream,(t0 - (1 << n)),n); - } - - if(t1 >= 16){ - Word16 n, p; - n=0; - p=t1; - while(sub(p=(p >> 1), 16) >= 0){ - - WriteBits(hBitstream,1,1); - n = n + 1; - } - WriteBits(hBitstream,0,1); - n = n + 4; - WriteBits(hBitstream,(t1 - (1 << n)),n); - } - } - break; - - default: - break; - } - return(0); +Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF hBitstream) +{ + + Word32 i, t0, t1, t2, t3, t00, t01; + Word16 codeWord, codeLength; + Word16 sign, signLength; + + + switch (codeBook) { + case CODE_BOOK_ZERO_NO: + break; + + case CODE_BOOK_1_NO: + for(i=0; i= 16){ + Word16 n, p; + n=0; + p=t0; + while(sub(p=(p >> 1), 16) >= 0){ + + WriteBits(hBitstream,1,1); + n = n + 1; + } + WriteBits(hBitstream,0,1); + n = n + 4; + WriteBits(hBitstream,(t0 - (1 << n)),n); + } + + if(t1 >= 16){ + Word16 n, p; + n=0; + p=t1; + while(sub(p=(p >> 1), 16) >= 0){ + + WriteBits(hBitstream,1,1); + n = n + 1; + } + WriteBits(hBitstream,0,1); + n = n + 4; + WriteBits(hBitstream,(t1 - (1 << n)),n); + } + } + break; + + default: + break; + } + return(0); } Word16 bitCountScalefactorDelta(Word16 delta) diff --git a/media/libstagefright/codecs/aacenc/src/bitbuffer.c b/media/libstagefright/codecs/aacenc/src/bitbuffer.c index 3248f0b..ef13c13 100644 --- a/media/libstagefright/codecs/aacenc/src/bitbuffer.c +++ b/media/libstagefright/codecs/aacenc/src/bitbuffer.c @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: bitbuffer.c - - Content: Bit Buffer Management functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: bitbuffer.c + + Content: Bit Buffer Management functions + *******************************************************************************/ #include "bitbuffer.h" @@ -81,7 +81,7 @@ HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf, *****************************************************************************/ void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf) { - if(*hBitBuf) + if(*hBitBuf) (*hBitBuf)->isValid = 0; *hBitBuf = NULL; } diff --git a/media/libstagefright/codecs/aacenc/src/bitenc.c b/media/libstagefright/codecs/aacenc/src/bitenc.c index 588c2da..ea34407 100644 --- a/media/libstagefright/codecs/aacenc/src/bitenc.c +++ b/media/libstagefright/codecs/aacenc/src/bitenc.c @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: bitenc.c - - Content: Bitstream encoder functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: bitenc.c + + Content: Bitstream encoder functions + *******************************************************************************/ #include "bitenc.h" @@ -49,7 +49,7 @@ static Word32 encodeSpectralData(Word16 *sfbOffset, dbgVal = GetBitsAvail(hBitStream); for(i=0; inoOfSections; i++) { - psectioninfo = &(sectionData->sectionInfo[i]); + psectioninfo = &(sectionData->sectionInfo[i]); /* huffencode spectral data for this section */ @@ -564,7 +564,7 @@ static void writeFillElement( const UWord8 *ancBytes, } } } - + /***************************************************************************** * * function name: WriteBitStream @@ -577,39 +577,39 @@ Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream, QC_OUT *qcOut, PSY_OUT *psyOut, Word16 *globUsedBits, - const UWord8 *ancBytes, + const UWord8 *ancBytes, Word16 sampindex ) /* returns error code */ { Word16 bitMarkUp; Word16 elementUsedBits; - Word16 frameBits=0; - - /* struct bitbuffer bsWriteCopy; */ - bitMarkUp = GetBitsAvail(hBitStream); - if(qcOut->qcElement.adtsUsed) /* write adts header*/ - { - WriteBits(hBitStream, 0xFFF, 12); /* 12 bit Syncword */ - WriteBits(hBitStream, 1, 1); /* ID == 0 for MPEG4 AAC, 1 for MPEG2 AAC */ - WriteBits(hBitStream, 0, 2); /* layer == 0 */ - WriteBits(hBitStream, 1, 1); /* protection absent */ - WriteBits(hBitStream, 1, 2); /* profile */ - WriteBits(hBitStream, sampindex, 4); /* sampling rate */ - WriteBits(hBitStream, 0, 1); /* private bit */ - WriteBits(hBitStream, elInfo.nChannelsInEl, 3); /* ch. config (must be > 0) */ - /* simply using numChannels only works for - 6 channels or less, else a channel - configuration should be written */ - WriteBits(hBitStream, 0, 1); /* original/copy */ - 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) */ - } + Word16 frameBits=0; + + /* struct bitbuffer bsWriteCopy; */ + bitMarkUp = GetBitsAvail(hBitStream); + if(qcOut->qcElement.adtsUsed) /* write adts header*/ + { + WriteBits(hBitStream, 0xFFF, 12); /* 12 bit Syncword */ + WriteBits(hBitStream, 1, 1); /* ID == 0 for MPEG4 AAC, 1 for MPEG2 AAC */ + WriteBits(hBitStream, 0, 2); /* layer == 0 */ + WriteBits(hBitStream, 1, 1); /* protection absent */ + WriteBits(hBitStream, 1, 2); /* profile */ + WriteBits(hBitStream, sampindex, 4); /* sampling rate */ + WriteBits(hBitStream, 0, 1); /* private bit */ + WriteBits(hBitStream, elInfo.nChannelsInEl, 3); /* ch. config (must be > 0) */ + /* simply using numChannels only works for + 6 channels or less, else a channel + configuration should be written */ + WriteBits(hBitStream, 0, 1); /* original/copy */ + 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) */ + } *globUsedBits=0; diff --git a/media/libstagefright/codecs/aacenc/src/block_switch.c b/media/libstagefright/codecs/aacenc/src/block_switch.c index c0054f7..d54e32f 100644 --- a/media/libstagefright/codecs/aacenc/src/block_switch.c +++ b/media/libstagefright/codecs/aacenc/src/block_switch.c @@ -1,27 +1,27 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: block_switch.c - - Content: Block switching functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: block_switch.c + + Content: Block switching functions + *******************************************************************************/ -#include "typedef.h" -#include "basic_op.h" +#include "typedef.h" +#include "basic_op.h" #include "oper_32b.h" #include "psy_const.h" #include "block_switch.h" @@ -132,7 +132,7 @@ Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, for (i=0; igroupLen[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) { @@ -274,7 +274,7 @@ static Word32 SrchMaxWithIndex(const Word32 in[], Word16 *index, Word16 n) * returns: TRUE if success * **********************************************************************************/ -#ifndef ARMV5E +#ifndef ARMV5E Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, Word16 *timeSignal, Word16 chIncrement, @@ -283,14 +283,14 @@ Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, Word32 w, i, wOffset, tidx, ch; Word32 accuUE, accuFE; Word32 tempUnfiltered; - Word32 tempFiltered; - Word32 states0, states1; - Word32 Coeff0, Coeff1; - - - states0 = blockSwitchingControl->iirStates[0]; - states1 = blockSwitchingControl->iirStates[1]; - Coeff0 = hiPassCoeff[0]; + Word32 tempFiltered; + Word32 states0, states1; + Word32 Coeff0, Coeff1; + + + states0 = blockSwitchingControl->iirStates[0]; + states1 = blockSwitchingControl->iirStates[1]; + Coeff0 = hiPassCoeff[0]; Coeff1 = hiPassCoeff[1]; tidx = 0; for (w=0; w < BLOCK_SWITCH_WINDOWS; w++) { @@ -299,19 +299,19 @@ Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, accuFE = 0; for(i=0; i> ENERGY_SHIFT; accuFE += (tempFiltered * tempFiltered) >> ENERGY_SHIFT; @@ -320,9 +320,9 @@ Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, blockSwitchingControl->windowNrg[1][w] = accuUE; blockSwitchingControl->windowNrgF[1][w] = accuFE; - } - - blockSwitchingControl->iirStates[0] = states0; + } + + blockSwitchingControl->iirStates[0] = states0; blockSwitchingControl->iirStates[1] = states1; return(TRUE); diff --git a/media/libstagefright/codecs/aacenc/src/channel_map.c b/media/libstagefright/codecs/aacenc/src/channel_map.c index 247293b..2d41f8c 100644 --- a/media/libstagefright/codecs/aacenc/src/channel_map.c +++ b/media/libstagefright/codecs/aacenc/src/channel_map.c @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: channel_map.c - - Content: channel mapping functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: channel_map.c + + Content: channel mapping functions + *******************************************************************************/ #include "channel_map.h" diff --git a/media/libstagefright/codecs/aacenc/src/dyn_bits.c b/media/libstagefright/codecs/aacenc/src/dyn_bits.c index 3deacca..f3b3e02 100644 --- a/media/libstagefright/codecs/aacenc/src/dyn_bits.c +++ b/media/libstagefright/codecs/aacenc/src/dyn_bits.c @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: dyn_bits.c - - Content: Noiseless coder module functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: dyn_bits.c + + Content: Noiseless coder module functions + *******************************************************************************/ #include "aac_rom.h" @@ -177,14 +177,14 @@ gmStage1(SECTION_INFO * sectionInfo, const Word16 maxSfb, const Word16 *sideInfoTab) { - SECTION_INFO * sectionInfo_s; - SECTION_INFO * sectionInfo_e; + SECTION_INFO * sectionInfo_s; + SECTION_INFO * sectionInfo_e; Word32 mergeStart, mergeEnd; mergeStart = 0; do { - sectionInfo_s = sectionInfo + mergeStart; + sectionInfo_s = sectionInfo + mergeStart; for (mergeEnd=mergeStart+1; mergeEndcodeBook != sectionInfo_e->codeBook) @@ -372,9 +372,9 @@ static void scfCount(const Word16 *scalefacGain, SECTION_DATA * sectionData) { - SECTION_INFO *psectionInfo; - SECTION_INFO *psectionInfom; - + SECTION_INFO *psectionInfo; + SECTION_INFO *psectionInfom; + /* counter */ Word32 i = 0; /* section counter */ Word32 j = 0; /* sfb counter */ @@ -397,7 +397,7 @@ static void scfCount(const Word16 *scalefacGain, } lastValScf = 0; - sectionData->firstScf = 0; + sectionData->firstScf = 0; psectionInfo = sectionData->sectionInfo; for (i=0; inoOfSections; i++) { @@ -406,9 +406,9 @@ static void scfCount(const Word16 *scalefacGain, sectionData->firstScf = psectionInfo->sfbStart; lastValScf = scalefacGain[sectionData->firstScf]; break; - } + } psectionInfo += 1; - } + } psectionInfo = sectionData->sectionInfo; for (i=0; inoOfSections; i++, psectionInfo += 1) { @@ -451,7 +451,7 @@ 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++) { @@ -477,8 +477,8 @@ static void scfCount(const Word16 *scalefacGain, /* count scalefactor skip */ scfSkipCounter = scfSkipCounter + 1; } - } - + } + psectionInfom += 1; } @@ -490,7 +490,7 @@ static void scfCount(const Word16 *scalefacGain, else { deltaScf = 0; scfSkipCounter = scfSkipCounter - 1; - } + } } else { deltaScf = lastValScf - scalefacGain[j]; @@ -539,7 +539,7 @@ dynBitCount(const Word16 *quantSpectrum, sectionData); - return (sectionData->huffmanBits + sectionData->sideInfoBits + + return (sectionData->huffmanBits + sectionData->sideInfoBits + sectionData->scalefacBits); } diff --git a/media/libstagefright/codecs/aacenc/src/grp_data.c b/media/libstagefright/codecs/aacenc/src/grp_data.c index 08d9a76..fb88654 100644 --- a/media/libstagefright/codecs/aacenc/src/grp_data.c +++ b/media/libstagefright/codecs/aacenc/src/grp_data.c @@ -1,26 +1,26 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: grp_data.c - - Content: Short block grouping function - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: grp_data.c + + Content: Short block grouping function + *******************************************************************************/ -#include "basic_op.h" +#include "basic_op.h" #include "psy_const.h" #include "interface.h" #include "grp_data.h" @@ -179,9 +179,9 @@ groupShortData(Word32 *mdctSpectrum, } for(i=0;isfbThreshold = groupedSfbThreshold->sfbLong; psyOutCh->sfbSpreadedEnergy = groupedSfbSpreadedEnergy->sfbLong; - tmpV = psyOutCh->sfbOffsets; + tmpV = psyOutCh->sfbOffsets; for(j=0; jsfbMinSnr; for(j=0;jpe = peData->offset; @@ -95,7 +95,7 @@ void calcSfbPe(PE_DATA *peData, for (sfb=0; sfbmaxSfbPerGroup; sfb++) { Word32 nrg = sfbEnergy[sfbGrp+sfb]; Word32 thres = sfbThreshold[sfbGrp+sfb]; - Word32 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb]; + Word32 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb]; if (nrg > thres) { ldThr = iLog4(thres); @@ -111,10 +111,10 @@ void calcSfbPe(PE_DATA *peData, } else { /* sfbPe = nl*(c2 + c3*log2(en/thr))*/ - peChanData->sfbPe[sfbGrp+sfb] = extract_l((L_mpy_wx( - (C2_I + C3_I * ldRatio * 2) << 4, nLines4) + 4) >> 3); - peChanData->sfbConstPart[sfbGrp+sfb] = extract_l(( L_mpy_wx( - (C2_I + C3_I * sfbLDEn * 2) << 4, nLines4) + 4) >> 3); + peChanData->sfbPe[sfbGrp+sfb] = extract_l((L_mpy_wx( + (C2_I + C3_I * ldRatio * 2) << 4, nLines4) + 4) >> 3); + peChanData->sfbConstPart[sfbGrp+sfb] = extract_l(( L_mpy_wx( + (C2_I + C3_I * sfbLDEn * 2) << 4, nLines4) + 4) >> 3); nLines4 = (nLines4 * C3_I + (1024<<1)) >> 10; } peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines4 >> 2; @@ -129,10 +129,10 @@ void calcSfbPe(PE_DATA *peData, 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; diff --git a/media/libstagefright/codecs/aacenc/src/ms_stereo.c b/media/libstagefright/codecs/aacenc/src/ms_stereo.c index c83d07b..44d45cc 100644 --- a/media/libstagefright/codecs/aacenc/src/ms_stereo.c +++ b/media/libstagefright/codecs/aacenc/src/ms_stereo.c @@ -1,26 +1,26 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: ms_stereo.c - - Content: MS stereo processing function - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: ms_stereo.c + + Content: MS stereo processing function + *******************************************************************************/ -#include "basic_op.h" +#include "basic_op.h" #include "oper_32b.h" #include "psy_const.h" #include "ms_stereo.h" @@ -74,10 +74,10 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft, minThreshold = min(thrL, thrR); nrgL = max(nrgL,thrL) + 1; - shift = norm_l(nrgL); + shift = norm_l(nrgL); nrgL = Div_32(thrL << shift, nrgL << shift); nrgR = max(nrgR,thrR) + 1; - shift = norm_l(nrgR); + shift = norm_l(nrgR); nrgR = Div_32(thrR << shift, nrgR << shift); pnlr = fixmul(nrgL, nrgR); @@ -86,11 +86,11 @@ void MsStereoProcessing(Word32 *sfbEnergyLeft, nrgR = sfbEnergySide[idx]; nrgL = max(nrgL,minThreshold) + 1; - shift = norm_l(nrgL); + shift = norm_l(nrgL); nrgL = Div_32(minThreshold << shift, nrgL << shift); nrgR = max(nrgR,minThreshold) + 1; - shift = norm_l(nrgR); + shift = norm_l(nrgR); nrgR = Div_32(minThreshold << shift, nrgR << shift); pnms = fixmul(nrgL, nrgR); diff --git a/media/libstagefright/codecs/aacenc/src/pre_echo_control.c b/media/libstagefright/codecs/aacenc/src/pre_echo_control.c index f59216e..1e818a2 100644 --- a/media/libstagefright/codecs/aacenc/src/pre_echo_control.c +++ b/media/libstagefright/codecs/aacenc/src/pre_echo_control.c @@ -1,27 +1,27 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: pre_echo_control.c - - Content: Pre echo control functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: pre_echo_control.c + + Content: Pre echo control functions + *******************************************************************************/ -#include "basic_op.h" -#include "oper_32b.h" +#include "basic_op.h" +#include "oper_32b.h" #include "oper_32b.h" #include "pre_echo_control.h" diff --git a/media/libstagefright/codecs/aacenc/src/psy_configuration.c b/media/libstagefright/codecs/aacenc/src/psy_configuration.c index 586e00f..8e599b0 100644 --- a/media/libstagefright/codecs/aacenc/src/psy_configuration.c +++ b/media/libstagefright/codecs/aacenc/src/psy_configuration.c @@ -1,26 +1,26 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: psy_configuration.c - - Content: Psychoaccoustic configuration functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: psy_configuration.c + + Content: Psychoaccoustic configuration functions + *******************************************************************************/ -#include "basic_op.h" +#include "basic_op.h" #include "oper_32b.h" #include "psy_configuration.h" #include "adj_thr.h" @@ -29,10 +29,10 @@ #define BARC_SCALE 100 /* integer barc values are scaled with 100 */ -#define LOG2_1000 301 /* log2*1000 */ -#define PI2_1000 1571 /* pi/2*1000*/ -#define ATAN_COEF1 3560 /* 1000/0.280872f*/ -#define ATAN_COEF2 281 /* 1000*0.280872f*/ +#define LOG2_1000 301 /* log2*1000 */ +#define PI2_1000 1571 /* pi/2*1000*/ +#define ATAN_COEF1 3560 /* 1000/0.280872f*/ +#define ATAN_COEF2 281 /* 1000*0.280872f*/ typedef struct{ @@ -57,30 +57,30 @@ static const Word16 maskLowSprEnLong = 30; /* in 1dB/bark */ static const Word16 maskHighSprEnLong = 20; /* in 1dB/bark */ static const Word16 maskHighSprEnLongLowBr = 15; /* in 1dB/bark */ static const Word16 maskLowSprEnShort = 20; /* in 1dB/bark */ -static const Word16 maskHighSprEnShort = 15; /* in 1dB/bark */ -static const Word16 c_minRemainingThresholdFactor = 0x0148; /* 0.01 *(1 << 15)*/ -static const Word32 c_maxsnr = 0x66666666; /* upper limit is -1 dB */ -static const Word32 c_minsnr = 0x00624dd3; /* lower limit is -25 dB */ - -static const Word32 c_maxClipEnergyLong = 0x77359400; /* 2.0e9f*/ -static const Word32 c_maxClipEnergyShort = 0x01dcd650; /* 2.0e9f/(AACENC_TRANS_FAC*AACENC_TRANS_FAC)*/ - - -Word32 GetSRIndex(Word32 sampleRate) -{ - if (92017 <= sampleRate) return 0; - if (75132 <= sampleRate) return 1; - if (55426 <= sampleRate) return 2; - if (46009 <= sampleRate) return 3; - if (37566 <= sampleRate) return 4; - if (27713 <= sampleRate) return 5; - if (23004 <= sampleRate) return 6; - if (18783 <= sampleRate) return 7; - if (13856 <= sampleRate) return 8; - if (11502 <= sampleRate) return 9; - if (9391 <= sampleRate) return 10; - - return 11; +static const Word16 maskHighSprEnShort = 15; /* in 1dB/bark */ +static const Word16 c_minRemainingThresholdFactor = 0x0148; /* 0.01 *(1 << 15)*/ +static const Word32 c_maxsnr = 0x66666666; /* upper limit is -1 dB */ +static const Word32 c_minsnr = 0x00624dd3; /* lower limit is -25 dB */ + +static const Word32 c_maxClipEnergyLong = 0x77359400; /* 2.0e9f*/ +static const Word32 c_maxClipEnergyShort = 0x01dcd650; /* 2.0e9f/(AACENC_TRANS_FAC*AACENC_TRANS_FAC)*/ + + +Word32 GetSRIndex(Word32 sampleRate) +{ + if (92017 <= sampleRate) return 0; + if (75132 <= sampleRate) return 1; + if (55426 <= sampleRate) return 2; + if (46009 <= sampleRate) return 3; + if (37566 <= sampleRate) return 4; + if (27713 <= sampleRate) return 5; + if (23004 <= sampleRate) return 6; + if (18783 <= sampleRate) return 7; + if (13856 <= sampleRate) return 8; + if (11502 <= sampleRate) return 9; + if (9391 <= sampleRate) return 10; + + return 11; } @@ -89,8 +89,8 @@ Word32 GetSRIndex(Word32 sampleRate) * function name: atan_1000 * description: calculates 1000*atan(x/1000) * 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 +* 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) * **********************************************************************************/ @@ -272,7 +272,7 @@ static void initBarcValues(Word16 numPb, * * function name: initMinSnr * description: calculate min snr parameter -* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5) +* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5) * *****************************************************************************/ static void initMinSnr(const Word32 bitrate, @@ -303,7 +303,7 @@ static void initMinSnr(const Word32 bitrate, barcWidth = pbVal1 - pbVal0; pbVal0 = pbVal1; - /* allow at least 2.4% of pe for each active barc */ + /* allow at least 2.4% of pe for each active barc */ pePart = ((pePerWindow * 24) * (max_bark * barcWidth)) / (pbBarcVal[sfbActive-1] * (sfbOffset[sfb+1] - sfbOffset[sfb])); @@ -311,15 +311,15 @@ static void initMinSnr(const Word32 bitrate, pePart = min(pePart, 8400); pePart = max(pePart, 1400); - /* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)*/ + /* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)*/ /* we add an offset of 2^16 to the pow functions */ - /* 0xc000 = 1.5*(1 << 15)*/ + /* 0xc000 = 1.5*(1 << 15)*/ snr = pow2_xy((pePart - 16*1000),1000) - 0x0000c000; - if(snr > 0x00008000) - { - shift = norm_l(snr); + if(snr > 0x00008000) + { + shift = norm_l(snr); snr = Div_32(0x00008000 << shift, snr << shift); } else @@ -347,16 +347,16 @@ Word16 InitPsyConfigurationLong(Word32 bitrate, Word16 bandwidth, PSY_CONFIGURATION_LONG *psyConf) { - Word32 samplerateindex; - Word16 sfbBarcVal[MAX_SFB_LONG]; + Word32 samplerateindex; + Word16 sfbBarcVal[MAX_SFB_LONG]; Word16 sfb; /* init sfb table - */ - samplerateindex = GetSRIndex(samplerate); - psyConf->sfbCnt = sfBandTotalLong[samplerateindex]; - psyConf->sfbOffset = sfBandTabLong + sfBandTabLongOffset[samplerateindex]; + */ + samplerateindex = GetSRIndex(samplerate); + psyConf->sfbCnt = sfBandTotalLong[samplerateindex]; + psyConf->sfbOffset = sfBandTabLong + sfBandTabLongOffset[samplerateindex]; psyConf->sampRateIdx = samplerateindex; /* @@ -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,8 +437,8 @@ Word16 InitPsyConfigurationShort(Word32 bitrate, /* init sfb table */ - samplerateindex = GetSRIndex(samplerate); - psyConf->sfbCnt = sfBandTotalShort[samplerateindex]; + samplerateindex = GetSRIndex(samplerate); + psyConf->sfbCnt = sfBandTotalShort[samplerateindex]; psyConf->sfbOffset = sfBandTabShort + sfBandTabShortOffset[samplerateindex]; psyConf->sampRateIdx = samplerateindex; /* diff --git a/media/libstagefright/codecs/aacenc/src/psy_main.c b/media/libstagefright/codecs/aacenc/src/psy_main.c index 8746a72..3d0a355 100644 --- a/media/libstagefright/codecs/aacenc/src/psy_main.c +++ b/media/libstagefright/codecs/aacenc/src/psy_main.c @@ -1,27 +1,27 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: psy_main.c - - Content: Psychoacoustic major functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: psy_main.c + + Content: Psychoacoustic major functions + *******************************************************************************/ -#include "typedef.h" -#include "basic_op.h" +#include "typedef.h" +#include "basic_op.h" #include "oper_32b.h" #include "psy_const.h" #include "block_switch.h" @@ -77,27 +77,27 @@ static Word16 advancePsychShortMS (PSY_DATA psyData[MAX_CHANNELS], *****************************************************************************/ Word16 PsyNew(PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP) { - Word16 i; - 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; - - scratchTNS = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC); - if(NULL == scratchTNS) - { - return 1; - } - - mdctDelayBuffer = (Word16 *)mem_malloc(pMemOP, nChan * BLOCK_SWITCHING_OFFSET * sizeof(Word16), 32, VO_INDEX_ENC_AAC); - if(NULL == mdctDelayBuffer) - { + Word16 i; + 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; + + scratchTNS = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC); + if(NULL == scratchTNS) + { return 1; - } - + } + + mdctDelayBuffer = (Word16 *)mem_malloc(pMemOP, nChan * BLOCK_SWITCHING_OFFSET * sizeof(Word16), 32, VO_INDEX_ENC_AAC); + if(NULL == mdctDelayBuffer) + { + return 1; + } + for (i=0; ipsyData[i].mdctDelayBuffer = mdctDelayBuffer + i*BLOCK_SWITCHING_OFFSET; hPsy->psyData[i].mdctSpectrum = mdctSpectrum + i*FRAME_LEN_LONG; @@ -118,27 +118,27 @@ Word16 PsyNew(PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP) *****************************************************************************/ Word16 PsyDelete(PSY_KERNEL *hPsy, VO_MEM_OPERATOR *pMemOP) { - Word32 nch; - - if(hPsy) - { - 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; nchpsyData[nch].mdctDelayBuffer = NULL; - hPsy->psyData[nch].mdctSpectrum = NULL; - } - - if(hPsy->pScratchTns) - { - mem_free(pMemOP, hPsy->pScratchTns, VO_INDEX_ENC_AAC); - hPsy->pScratchTns = NULL; - } - } + Word32 nch; + + if(hPsy) + { + 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; nchpsyData[nch].mdctDelayBuffer = NULL; + hPsy->psyData[nch].mdctSpectrum = NULL; + } + + if(hPsy->pScratchTns) + { + mem_free(pMemOP, hPsy->pScratchTns, VO_INDEX_ENC_AAC); + hPsy->pScratchTns = NULL; + } + } return 0; } @@ -196,10 +196,10 @@ Word16 psyMainInit(PSY_KERNEL *hPsy, err = InitPsyConfigurationLong(channelBitRate, sampleRate, bandwidth, - &(hPsy->psyConfLong)); - + &(hPsy->psyConfLong)); + if (!err) { - hPsy->sampleRateIdx = hPsy->psyConfLong.sampRateIdx; + hPsy->sampleRateIdx = hPsy->psyConfLong.sampRateIdx; err = InitTnsConfigurationLong(bitRate, sampleRate, channels, &hPsy->psyConfLong.tnsConf, &hPsy->psyConfLong, tnsMask&2); } @@ -263,7 +263,7 @@ Word16 psyMain(Word16 nChannels, channels = elemInfo->nChannelsInEl; maxScale = 0; - /* block switching */ + /* block switching */ for(ch = 0; ch < channels; ch++) { BlockSwitching(&psyData[ch].blockSwitchingControl, timeSignal+elemInfo->ChannelIndex[ch], @@ -477,11 +477,11 @@ static Word16 advancePsychLong(PSY_DATA* psyData, { Word32 i; Word32 normEnergyShift = (psyData->mdctScale + 1) << 1; /* in reference code, mdct spectrum must be multipied with 2, so +1 */ - Word32 clipEnergy = hPsyConfLong->clipEnergy >> normEnergyShift; + Word32 clipEnergy = hPsyConfLong->clipEnergy >> normEnergyShift; Word32 *data0, *data1, tdata; /* low pass */ - data0 = psyData->mdctSpectrum + hPsyConfLong->lowpassLine; + data0 = psyData->mdctSpectrum + hPsyConfLong->lowpassLine; for(i=hPsyConfLong->lowpassLine; iblockSwitchingControl.windowSequence); /* first part of threshold calculation */ - data0 = psyData->sfbEnergy.sfbLong; - data1 = psyData->sfbThreshold.sfbLong; + data0 = psyData->sfbEnergy.sfbLong; + data1 = psyData->sfbThreshold.sfbLong; for (i=hPsyConfLong->sfbCnt; i; i--) { tdata = L_mpy_ls(*data0++, hPsyConfLong->ratio); - *data1++ = min(tdata, clipEnergy); + *data1++ = min(tdata, clipEnergy); } /* Calc sfb-bandwise mdct-energies for left and right channel again */ @@ -540,12 +540,12 @@ static Word16 advancePsychLong(PSY_DATA* psyData, hPsyConfLong->sfbActive - tnsStartBand, psyData->sfbEnergy.sfbLong+tnsStartBand, &psyData->sfbEnergySum.sfbLong); - - data0 = psyData->sfbEnergy.sfbLong; - tdata = psyData->sfbEnergySum.sfbLong; + + data0 = psyData->sfbEnergy.sfbLong; + tdata = psyData->sfbEnergySum.sfbLong; for (i=0; isfbEnergySum.sfbLong = tdata; } @@ -557,20 +557,20 @@ static Word16 advancePsychLong(PSY_DATA* psyData, psyData->sfbThreshold.sfbLong); /* threshold in quiet */ - data0 = psyData->sfbThreshold.sfbLong; - data1 = hPsyConfLong->sfbThresholdQuiet; + data0 = psyData->sfbThreshold.sfbLong; + data1 = hPsyConfLong->sfbThresholdQuiet; for (i=hPsyConfLong->sfbCnt; i; i--) - { - *data0 = max(*data0, (*data1 >> normEnergyShift)); - data0++; data1++; + { + *data0 = max(*data0, (*data1 >> normEnergyShift)); + data0++; data1++; } /* preecho control */ if (psyData->blockSwitchingControl.windowSequence == STOP_WINDOW) { - data0 = psyData->sfbThresholdnm1; - for (i=hPsyConfLong->sfbCnt; i; i--) { - *data0++ = MAX_32; - } + data0 = psyData->sfbThresholdnm1; + for (i=hPsyConfLong->sfbCnt; i; i--) { + *data0++ = MAX_32; + } psyData->mdctScalenm1 = 0; } @@ -585,7 +585,7 @@ static Word16 advancePsychLong(PSY_DATA* psyData, if (psyData->blockSwitchingControl.windowSequence== START_WINDOW) { - data0 = psyData->sfbThresholdnm1; + data0 = psyData->sfbThresholdnm1; for (i=hPsyConfLong->sfbCnt; i; i--) { *data0++ = MAX_32; } @@ -600,10 +600,10 @@ static Word16 advancePsychLong(PSY_DATA* psyData, /* spreaded energy */ - data0 = psyData->sfbSpreadedEnergy.sfbLong; - data1 = psyData->sfbEnergy.sfbLong; + 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++; } @@ -657,14 +657,14 @@ 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++) { Word32 i, tdata; /* low pass */ - data0 = psyData->mdctSpectrum + wOffset + hPsyConfShort->lowpassLine; + data0 = psyData->mdctSpectrum + wOffset + hPsyConfShort->lowpassLine; for(i=hPsyConfShort->lowpassLine; iblockSwitchingControl.windowSequence); /* first part of threshold calculation */ - data0 = psyData->sfbThreshold.sfbShort[w]; - data1 = psyData->sfbEnergy.sfbShort[w]; + data0 = psyData->sfbThreshold.sfbShort[w]; + data1 = psyData->sfbEnergy.sfbShort[w]; for (i=hPsyConfShort->sfbCnt; i; i--) { tdata = L_mpy_ls(*data1++, hPsyConfShort->ratio); - *data0++ = min(tdata, clipEnergy); + *data0++ = min(tdata, clipEnergy); } /* Calc sfb-bandwise mdct-energies for left and right channel again */ @@ -720,13 +720,13 @@ static Word16 advancePsychShort(PSY_DATA* psyData, hPsyConfShort->sfbOffset+tnsStartBand, (hPsyConfShort->sfbActive - tnsStartBand), psyData->sfbEnergy.sfbShort[w]+tnsStartBand, - &psyData->sfbEnergySum.sfbShort[w]); + &psyData->sfbEnergySum.sfbShort[w]); - tdata = psyData->sfbEnergySum.sfbShort[w]; - data0 = psyData->sfbEnergy.sfbShort[w]; + tdata = psyData->sfbEnergySum.sfbShort[w]; + data0 = psyData->sfbEnergy.sfbShort[w]; for (i=tnsStartBand; i; i--) - tdata += *data0++; - + tdata += *data0++; + psyData->sfbEnergySum.sfbShort[w] = tdata; } @@ -738,14 +738,14 @@ static Word16 advancePsychShort(PSY_DATA* psyData, /* threshold in quiet */ - data0 = psyData->sfbThreshold.sfbShort[w]; - data1 = hPsyConfShort->sfbThresholdQuiet; + data0 = psyData->sfbThreshold.sfbShort[w]; + data1 = hPsyConfShort->sfbThresholdQuiet; for (i=hPsyConfShort->sfbCnt; i; i--) - { - *data0 = max(*data0, (*data1 >> normEnergyShift)); - - data0++; data1++; - } + { + *data0 = max(*data0, (*data1 >> normEnergyShift)); + + data0++; data1++; + } /* preecho */ @@ -764,8 +764,8 @@ static Word16 advancePsychShort(PSY_DATA* psyData, psyData->sfbThreshold.sfbShort[w]); /* spreaded energy */ - data0 = psyData->sfbSpreadedEnergy.sfbShort[w]; - data1 = psyData->sfbEnergy.sfbShort[w]; + data0 = psyData->sfbSpreadedEnergy.sfbShort[w]; + data1 = psyData->sfbEnergy.sfbShort[w]; for (i=hPsyConfShort->sfbCnt; i; i--) { *data0++ = *data1++; } diff --git a/media/libstagefright/codecs/aacenc/src/qc_main.c b/media/libstagefright/codecs/aacenc/src/qc_main.c index a568020..e8c39e4 100644 --- a/media/libstagefright/codecs/aacenc/src/qc_main.c +++ b/media/libstagefright/codecs/aacenc/src/qc_main.c @@ -1,27 +1,27 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: qc_main.c - - Content: Quantizing & coding functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: qc_main.c + + Content: Quantizing & coding functions + *******************************************************************************/ -#include "basic_op.h" -#include "oper_32b.h" +#include "basic_op.h" +#include "oper_32b.h" #include "qc_main.h" #include "quantize.h" #include "interface.h" @@ -120,25 +120,25 @@ static Word16 framePadding(Word32 bitRate, Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP) { - Word32 i; - Word16 *quantSpec; - Word16 *scf; + Word32 i; + Word16 *quantSpec; + Word16 *scf; UWord16 *maxValueInSfb; - - quantSpec = (Word16 *)mem_malloc(pMemOP, nChannels * FRAME_LEN_LONG * sizeof(Word16), 32, VO_INDEX_ENC_AAC); - if(NULL == quantSpec) + + 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); + if(NULL == scf) + { return 1; - scf = (Word16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(Word16), 32, VO_INDEX_ENC_AAC); - if(NULL == scf) - { - return 1; } - maxValueInSfb = (UWord16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(UWord16), 32, VO_INDEX_ENC_AAC); - if(NULL == maxValueInSfb) - { - return 1; - } - + maxValueInSfb = (UWord16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(UWord16), 32, VO_INDEX_ENC_AAC); + if(NULL == maxValueInSfb) + { + return 1; + } + for (i=0; iqcChannel[i].quantSpec = quantSpec + i*FRAME_LEN_LONG; @@ -160,25 +160,25 @@ Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP) **********************************************************************************/ void QCOutDelete(QC_OUT* hQC, VO_MEM_OPERATOR *pMemOP) { - Word32 i; - if(hQC) - { - 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; iqcChannel[i].quantSpec = NULL; - - hQC->qcChannel[i].maxValueInSfb = NULL; - - hQC->qcChannel[i].scf = NULL; - } + Word32 i; + if(hQC) + { + 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; iqcChannel[i].quantSpec = NULL; + + hQC->qcChannel[i].maxValueInSfb = NULL; + + hQC->qcChannel[i].scf = NULL; + } } } @@ -278,7 +278,7 @@ Word16 QCMain(QC_STATE* hQC, qcOutElement->staticBitsUsed = countStaticBitdemand(psyOutChannel, psyOutElement, - nChannels, + nChannels, qcOutElement->adtsUsed); @@ -474,8 +474,8 @@ void updateBitres(QC_STATE* qcKernel, Word16 FinalizeBitConsumption(QC_STATE *qcKernel, QC_OUT* qcOut) { - Word32 nFullFillElem; - Word32 totFillBits; + Word32 nFullFillElem; + Word32 totFillBits; Word16 diffBits; Word16 bitsUsed; @@ -491,7 +491,7 @@ Word16 FinalizeBitConsumption(QC_STATE *qcKernel, totFillBits += qcOut->qcElement.fillBits; } - nFullFillElem = (max((qcOut->totFillBits - 1), 0) / maxFillElemBits) * maxFillElemBits; + nFullFillElem = (max((qcOut->totFillBits - 1), 0) / maxFillElemBits) * maxFillElemBits; qcOut->totFillBits = qcOut->totFillBits - nFullFillElem; diff --git a/media/libstagefright/codecs/aacenc/src/quantize.c b/media/libstagefright/codecs/aacenc/src/quantize.c index 205f167..973554e 100644 --- a/media/libstagefright/codecs/aacenc/src/quantize.c +++ b/media/libstagefright/codecs/aacenc/src/quantize.c @@ -1,27 +1,27 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: quantize.c - - Content: quantization functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: quantize.c + + Content: quantization functions + *******************************************************************************/ -#include "typedef.h" -#include "basic_op.h" +#include "typedef.h" +#include "basic_op.h" #include "oper_32b.h" #include "quantize.h" #include "aac_rom.h" @@ -77,14 +77,14 @@ static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum) x += XROUND >> (INT_BITS - finalShift); - /* shift and quantize */ - finalShift--; - - if(finalShift >= 0) - x >>= finalShift; - else - x <<= (-finalShift); - + /* shift and quantize */ + finalShift--; + + if(finalShift >= 0) + x >>= finalShift; + else + x <<= (-finalShift); + qua = saturate(x); } } @@ -108,29 +108,29 @@ static void quantizeLines(const Word16 gain, { Word32 line; Word32 m = gain&3; - Word32 g = (gain >> 2) + 4; - Word32 mdctSpeL; + Word32 g = (gain >> 2) + 4; + Word32 mdctSpeL; Word16 *pquat; - /* gain&3 */ - - pquat = quantBorders[m]; - - g += 16; - - if(g >= 0) - { + /* gain&3 */ + + pquat = quantBorders[m]; + + g += 16; + + if(g >= 0) + { for (line=0; line> g; if (saShft > pquat[0]) { @@ -163,54 +163,54 @@ static void quantizeLines(const Word16 gain, } } quaSpectrum[line] = qua ; - } - } - else - { - for (line=0; line 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; - } - } - } - } - } - quaSpectrum[line] = qua ; - } + } + } + else + { + for (line=0; line 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; + } + } + } + } + } + quaSpectrum[line] = qua ; + } } } @@ -266,10 +266,10 @@ static void iquantizeLines(const Word16 gain, /* get approperiate exponent shifter */ specExp = specExpTableComb_enc[iquantizermod][specExp]; - specExp += iquantizershift + 1; - if(specExp >= 0) - mdctSpectrum[line] = accu << specExp; - else + specExp += iquantizershift + 1; + if(specExp >= 0) + mdctSpectrum[line] = accu << specExp; + else mdctSpectrum[line] = accu >> (-specExp); } else { @@ -331,19 +331,69 @@ Word32 calcSfbDist(const Word32 *spec, Word32 line; Word32 dist; Word32 m = gain&3; - Word32 g = (gain >> 2) + 4; - Word32 g2 = (g << 1) + 1; - Word16 *pquat, *repquat; + Word32 g = (gain >> 2) + 4; + Word32 g2 = (g << 1) + 1; + Word16 *pquat, *repquat; /* gain&3 */ - - pquat = quantBorders[m]; + + pquat = quantBorders[m]; repquat = quantRecon[m]; - - dist = 0; - g += 16; - if(g2 < 0 && g >= 0) + + dist = 0; + g += 16; + if(g2 < 0 && g >= 0) { - g2 = -g2; + g2 = -g2; + for(line=0; line> g; + + if (saShft < pquat[0]) { + 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; + } + else { + Word16 qua = quantizeSingleLine(gain, sa); + Word32 iqval, diff32; + /* now that we have quantized x, re-quantize it. */ + iquantizeLines(gain, 1, &qua, &iqval); + diff32 = sa - iqval; + distSingle = fixmul(diff32, diff32); + } + } + } + } + + dist = L_add(dist, distSingle); + } + } + } + else + { for(line=0; line> g; - - if (saShft < pquat[0]) { - 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; - } - else { - Word16 qua = quantizeSingleLine(gain, sa); - Word32 iqval, diff32; - /* now that we have quantized x, re-quantize it. */ - iquantizeLines(gain, 1, &qua, &iqval); - diff32 = sa - iqval; - distSingle = fixmul(diff32, diff32); - } - } - } - } - - dist = L_add(dist, distSingle); + saShft = L_shr(sa, g); + + if (saShft < pquat[0]) { + 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); + } + else { + Word16 qua = quantizeSingleLine(gain, sa); + Word32 iqval, diff32; + /* now that we have quantized x, re-quantize it. */ + iquantizeLines(gain, 1, &qua, &iqval); + diff32 = sa - iqval; + distSingle = fixmul(diff32, diff32); + } + } + } + } + dist = L_add(dist, distSingle); } - } - } - else - { - for(line=0; line> 1; preshift = postshift << 1; postshift = postshift + 8; /* sqrt/256 */ - if(preshift >= 0) - y = x << preshift; /* now 1/4 <= y < 1 */ - else - y = x >> (-preshift); - y = formfac_sqrttable[y-32]; - - if(postshift >= 0) - y = y >> postshift; - else - y = y << (-postshift); - + if(preshift >= 0) + y = x << preshift; /* now 1/4 <= y < 1 */ + else + y = x >> (-preshift); + y = formfac_sqrttable[y-32]; + + if(postshift >= 0) + y = y >> postshift; + else + y = y << (-postshift); + return y; } @@ -97,25 +97,25 @@ CalcFormFactorChannel(Word16 *logSfbFormFactor, Word16 *logSfbEnergy, PSY_OUT_CHANNEL *psyOutChan) { - Word32 sfbw, sfbw1; + Word32 sfbw, sfbw1; Word32 i, j; Word32 sfbOffs, sfb, shift; - - sfbw = sfbw1 = 0; + + sfbw = sfbw1 = 0; for (sfbOffs=0; sfbOffssfbCnt; sfbOffs+=psyOutChan->sfbPerGroup){ for (sfb=0; sfbmaxSfbPerGroup; sfb++) { i = sfbOffs+sfb; if (psyOutChan->sfbEnergy[i] > psyOutChan->sfbThreshold[i]) { - Word32 accu, avgFormFactor,iSfbWidth; + Word32 accu, avgFormFactor,iSfbWidth; Word32 *mdctSpec; - sfbw = psyOutChan->sfbOffsets[i+1] - psyOutChan->sfbOffsets[i]; - iSfbWidth = invSBF[(sfbw >> 2) - 1]; + sfbw = psyOutChan->sfbOffsets[i+1] - psyOutChan->sfbOffsets[i]; + iSfbWidth = invSBF[(sfbw >> 2) - 1]; mdctSpec = psyOutChan->mdctSpectrum + psyOutChan->sfbOffsets[i]; accu = 0; /* calc sum of sqrt(spec) */ - for (j=sfbw; j; j--) { - accu += formfac_sqrt(L_abs(*mdctSpec)); mdctSpec++; + for (j=sfbw; j; j--) { + accu += formfac_sqrt(L_abs(*mdctSpec)); mdctSpec++; } logSfbFormFactor[i] = iLog4(accu); logSfbEnergy[i] = iLog4(psyOutChan->sfbEnergy[i]); @@ -158,8 +158,8 @@ static Word16 improveScf(Word32 *spec, /* calc real distortion */ sfbDist = calcSfbDist(spec, sfbWidth, scf); - *minScfCalculated = scf; - if(!sfbDist) + *minScfCalculated = scf; + if(!sfbDist) return scfBest; if (sfbDist > thresh125) { @@ -194,7 +194,7 @@ static Word16 improveScf(Word32 *spec, } *minScfCalculated = scf; cnt = cnt + 1; - } + } *dist = sfbDistBest; } else { @@ -419,7 +419,7 @@ static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan, prevScfLast[j] = MAX_16; prevScfNext[j] = MAX_16; deltaPeLast[j] = MAX_16; - } + } sfbLast = -1; sfbAct = -1; @@ -713,20 +713,20 @@ EstimateScaleFactorsChannel(PSY_OUT_CHANNEL *psyOutChan, for (i=0; isfbCnt; i++) { - Word32 sbfwith, sbfStart; + Word32 sbfwith, sbfStart; Word32 *mdctSpec; thresh = psyOutChan->sfbThreshold[i]; energy = psyOutChan->sfbEnergy[i]; - - sbfStart = psyOutChan->sfbOffsets[i]; - sbfwith = psyOutChan->sfbOffsets[i+1] - sbfStart; - mdctSpec = psyOutChan->mdctSpectrum+sbfStart; + + sbfStart = psyOutChan->sfbOffsets[i]; + sbfwith = psyOutChan->sfbOffsets[i+1] - sbfStart; + mdctSpec = psyOutChan->mdctSpectrum+sbfStart; maxSpec = 0; /* maximum of spectrum */ - for (j=sbfwith; j; j-- ) { - Word32 absSpec = L_abs(*mdctSpec); mdctSpec++; - maxSpec |= absSpec; + for (j=sbfwith; j; j-- ) { + Word32 absSpec = L_abs(*mdctSpec); mdctSpec++; + maxSpec |= absSpec; } /* scfs without energy or with thresh>energy are marked with MIN_16 */ @@ -737,7 +737,7 @@ EstimateScaleFactorsChannel(PSY_OUT_CHANNEL *psyOutChan, energyPart = logSfbFormFactor[i]; thresholdPart = iLog4(thresh); - /* -20 = 4*log2(6.75) - 32 */ + /* -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 */ @@ -748,9 +748,9 @@ EstimateScaleFactorsChannel(PSY_OUT_CHANNEL *psyOutChan, } /* find better scalefactor with analysis by synthesis */ - scfInt = improveScf(psyOutChan->mdctSpectrum+sbfStart, - sbfwith, - thresh, scfInt, minSfMaxQuant[i], + scfInt = improveScf(psyOutChan->mdctSpectrum+sbfStart, + sbfwith, + thresh, scfInt, minSfMaxQuant[i], &sfbDist[i], &minScfCalculated[i]); scf[i] = scfInt; diff --git a/media/libstagefright/codecs/aacenc/src/spreading.c b/media/libstagefright/codecs/aacenc/src/spreading.c index e6fc7da..aaf2fff 100644 --- a/media/libstagefright/codecs/aacenc/src/spreading.c +++ b/media/libstagefright/codecs/aacenc/src/spreading.c @@ -1,29 +1,29 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: spreading.c - - Content: Spreading of energy function - -*******************************************************************************/ - -#include "basic_op.h" -#include "oper_32b.h" -#include "spreading.h" - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: spreading.c + + Content: Spreading of energy function + +*******************************************************************************/ + +#include "basic_op.h" +#include "oper_32b.h" +#include "spreading.h" + /********************************************************************************* * * function name: SpreadingMax @@ -31,22 +31,22 @@ * higher frequencies thr(n) = max(thr(n), sh(n)*thr(n-1)) * lower frequencies thr(n) = max(thr(n), sl(n)*thr(n+1)) * -**********************************************************************************/ -void SpreadingMax(const Word16 pbCnt, - const Word16 *maskLowFactor, - const Word16 *maskHighFactor, - Word32 *pbSpreadedEnergy) -{ - Word32 i; - - /* slope to higher frequencies */ - for (i=1; i=0; i--) { - pbSpreadedEnergy[i] = max(pbSpreadedEnergy[i], - L_mpy_ls(pbSpreadedEnergy[i+1], maskLowFactor[i])); - } -} +**********************************************************************************/ +void SpreadingMax(const Word16 pbCnt, + const Word16 *maskLowFactor, + const Word16 *maskHighFactor, + Word32 *pbSpreadedEnergy) +{ + Word32 i; + + /* slope to higher frequencies */ + for (i=1; i=0; i--) { + pbSpreadedEnergy[i] = max(pbSpreadedEnergy[i], + L_mpy_ls(pbSpreadedEnergy[i+1], maskLowFactor[i])); + } +} diff --git a/media/libstagefright/codecs/aacenc/src/stat_bits.c b/media/libstagefright/codecs/aacenc/src/stat_bits.c index 556104e..baa289c 100644 --- a/media/libstagefright/codecs/aacenc/src/stat_bits.c +++ b/media/libstagefright/codecs/aacenc/src/stat_bits.c @@ -1,23 +1,23 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: stat_bits.c - - Content: Static bit counter functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: stat_bits.c + + Content: Static bit counter functions + *******************************************************************************/ #include "stat_bits.h" @@ -82,10 +82,10 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType) Flag tnsPresent; Word32 numOfWindows; Word32 count; - Word32 coefBits; + Word32 coefBits; Word16 *ptcoef; - count = 0; + count = 0; if (blockType == 2) numOfWindows = 8; @@ -127,7 +127,7 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType) count += 1; /*coef_compression */ if (tnsInfo->coefRes[i] == 4) { - ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT; + ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT; coefBits = 3; for(k=0; korder[i]; k++) { @@ -139,7 +139,7 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType) } else { coefBits = 2; - ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT; + ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT; for(k=0; korder[i]; k++) { if ((ptcoef[k] > 1) || (ptcoef[k] < -2)) { @@ -154,7 +154,7 @@ static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType) } } } - } + } return count; } @@ -178,14 +178,14 @@ static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType) **********************************************************************************/ 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; diff --git a/media/libstagefright/codecs/aacenc/src/tns.c b/media/libstagefright/codecs/aacenc/src/tns.c index 96d890e..473e0a0 100644 --- a/media/libstagefright/codecs/aacenc/src/tns.c +++ b/media/libstagefright/codecs/aacenc/src/tns.c @@ -1,27 +1,27 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: tns.c - - Content: Definition TNS tools functions - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: tns.c + + Content: Definition TNS tools functions + *******************************************************************************/ -#include "basic_op.h" -#include "oper_32b.h" +#include "basic_op.h" +#include "oper_32b.h" #include "assert.h" #include "aac_rom.h" #include "psy_const.h" @@ -32,23 +32,23 @@ #define TNS_MODIFY_BEGIN 2600 /* Hz */ #define RATIO_PATCH_LOWER_BORDER 380 /* Hz */ -#define TNS_GAIN_THRESH 141 /* 1.41*100 */ -#define NORM_COEF 0x028f5c28 - -static const Word32 TNS_PARCOR_THRESH = 0x0ccccccd; /* 0.1*(1 << 31) */ -/* Limit bands to > 2.0 kHz */ -static unsigned short tnsMinBandNumberLong[12] = -{ 11, 12, 15, 16, 17, 20, 25, 26, 24, 28, 30, 31 }; -static unsigned short tnsMinBandNumberShort[12] = -{ 2, 2, 2, 3, 3, 4, 6, 6, 8, 10, 10, 12 }; - -/**************************************/ -/* Main/Low Profile TNS Parameters */ -/**************************************/ -static unsigned short tnsMaxBandsLongMainLow[12] = -{ 31, 31, 34, 40, 42, 51, 46, 46, 42, 42, 42, 39 }; - -static unsigned short tnsMaxBandsShortMainLow[12] = +#define TNS_GAIN_THRESH 141 /* 1.41*100 */ +#define NORM_COEF 0x028f5c28 + +static const Word32 TNS_PARCOR_THRESH = 0x0ccccccd; /* 0.1*(1 << 31) */ +/* Limit bands to > 2.0 kHz */ +static unsigned short tnsMinBandNumberLong[12] = +{ 11, 12, 15, 16, 17, 20, 25, 26, 24, 28, 30, 31 }; +static unsigned short tnsMinBandNumberShort[12] = +{ 2, 2, 2, 3, 3, 4, 6, 6, 8, 10, 10, 12 }; + +/**************************************/ +/* Main/Low Profile TNS Parameters */ +/**************************************/ +static unsigned short tnsMaxBandsLongMainLow[12] = +{ 31, 31, 34, 40, 42, 51, 46, 46, 42, 42, 42, 39 }; + +static unsigned short tnsMaxBandsShortMainLow[12] = { 9, 9, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14 }; @@ -178,8 +178,8 @@ Word16 InitTnsConfigurationLong(Word32 bitRate, /*!< bitrate */ 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]; @@ -241,13 +241,13 @@ Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */ tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand]; - tC->lpcStopBand = tnsMaxBandsShortMainLow[pC->sampRateIdx]; + tC->lpcStopBand = tnsMaxBandsShortMainLow[pC->sampRateIdx]; tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive); tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand]; - tC->lpcStartBand = tnsMinBandNumberShort[pC->sampRateIdx]; + tC->lpcStartBand = tnsMinBandNumberShort[pC->sampRateIdx]; tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand]; @@ -399,12 +399,12 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */ { Word32 i; Word32 temp_s; - Word32 temp; + Word32 temp; TNS_SUBBLOCK_INFO *psubBlockInfo; temp_s = blockType - SHORT_WINDOW; if ( temp_s != 0) { - psubBlockInfo = &tnsData->dataRaw.tnsLong.subBlockInfo; + psubBlockInfo = &tnsData->dataRaw.tnsLong.subBlockInfo; if (psubBlockInfo->tnsActive == 0) { tnsInfo->tnsActive[subBlockNumber] = 0; return(0); @@ -449,7 +449,7 @@ Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */ } } /* if (blockType!=SHORT_WINDOW) */ else /*short block*/ { - psubBlockInfo = &tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber]; + psubBlockInfo = &tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber]; if (psubBlockInfo->tnsActive == 0) { tnsInfo->tnsActive[subBlockNumber] = 0; return(0); @@ -556,9 +556,9 @@ static void CalcWeightedSpectrum(const Word32 spectrum[], /*!< input sp tmp2 = sfbEnergy[sfb] - 2; if( tmp2 > 0) { tmp = rsqrt(sfbEnergy[sfb], INT_BITS); - if(tmp > INT_BITS_SCAL) - { - shift = norm_l(tmp); + if(tmp > INT_BITS_SCAL) + { + shift = norm_l(tmp); tmp = Div_32( INT_BITS_SCAL << shift, tmp << shift ); } else @@ -601,20 +601,20 @@ static void CalcWeightedSpectrum(const Word32 spectrum[], /*!< input sp maxWS |= L_abs(pWork32[i]); } maxShift = norm_l(maxWS); - - maxShift = 16 - maxShift; - if(maxShift >= 0) - { - for (i=lpcStartLine; i> maxShift; - } - } - else - { - maxShift = -maxShift; - for (i=lpcStartLine; i= 0) + { + for (i=lpcStartLine; i> maxShift; + } + } + else + { + maxShift = -maxShift; + for (i=lpcStartLine; i> scf)); + accu = L_add(accu, ((input[j] * input[j]) >> scf)); } corr[0] = accu; @@ -696,7 +696,7 @@ void AutoCorrelation(const Word16 input[], isamples = isamples - 1; accu = 0; for(j=0; j> scf)); + accu = L_add(accu, ((input[j] * input[j+i]) >> scf)); } corr[i] = accu; } @@ -737,7 +737,7 @@ static Word16 AutoToParcor(Word32 workBuffer[], Word32 reflCoeff[], Word16 numOf if (workBuffer[0] < L_abs(workBuffer[i + numOfCoeff])) { return 0 ; } - shift = norm_l(workBuffer[0]); + shift = norm_l(workBuffer[0]); workBuffer0 = Div_32(1 << shift, workBuffer[0] << shift); /* calculate refc = -workBuffer[numOfCoeff+i] / workBuffer[0]; -1 <= refc < 1 */ refc = L_negate(fixmul(workBuffer[numOfCoeff + i], workBuffer0)); @@ -758,8 +758,8 @@ static Word16 AutoToParcor(Word32 workBuffer[], Word32 reflCoeff[], Word16 numOf denom = MULHIGH(workBuffer[0], NORM_COEF); if (denom != 0) { - Word32 temp; - shift = norm_l(denom); + Word32 temp; + shift = norm_l(denom); temp = Div_32(1 << shift, denom << shift); predictionGain = fixmul(num, temp); } diff --git a/media/libstagefright/codecs/aacenc/src/transform.c b/media/libstagefright/codecs/aacenc/src/transform.c index af17b5a..4d11f78 100644 --- a/media/libstagefright/codecs/aacenc/src/transform.c +++ b/media/libstagefright/codecs/aacenc/src/transform.c @@ -1,37 +1,37 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: transform.c - - Content: MDCT Transform functionss - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: transform.c + + Content: MDCT Transform functionss + *******************************************************************************/ -#include "basic_op.h" +#include "basic_op.h" #include "psy_const.h" #include "transform.h" #include "aac_rom.h" - - -#define LS_TRANS ((FRAME_LEN_LONG-FRAME_LEN_SHORT)/2) /* 448 */ -#define SQRT1_2 0x5a82799a /* sqrt(1/2) in Q31 */ -#define swap2(p0,p1) \ - t = p0; t1 = *(&(p0)+1); \ - p0 = p1; *(&(p0)+1) = *(&(p1)+1); \ - p1 = t; *(&(p1)+1) = t1 + + +#define LS_TRANS ((FRAME_LEN_LONG-FRAME_LEN_SHORT)/2) /* 448 */ +#define SQRT1_2 0x5a82799a /* sqrt(1/2) in Q31 */ +#define swap2(p0,p1) \ + t = p0; t1 = *(&(p0)+1); \ + p0 = p1; *(&(p0)+1) = *(&(p1)+1); \ + p1 = t; *(&(p1)+1) = t1 /********************************************************************************* * @@ -39,343 +39,343 @@ * description: Shuffle points prepared function for fft * **********************************************************************************/ -static void Shuffle(int *buf, int num, const unsigned char* bitTab) -{ - int *part0, *part1; - int i, j; - int t, t1; - - 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]); - } - - do { - swap2(part0[4*i+2], part1[4*i+0]); - } while ((i = *bitTab++) != 0); -} - -#if !defined(ARMV5E) && !defined(ARMV7Neon) +static void Shuffle(int *buf, int num, const unsigned char* bitTab) +{ + int *part0, *part1; + int i, j; + int t, t1; + + 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]); + } + + do { + swap2(part0[4*i+2], part1[4*i+0]); + } while ((i = *bitTab++) != 0); +} + +#if !defined(ARMV5E) && !defined(ARMV7Neon) /***************************************************************************** * * function name: Radix4First * description: Radix 4 point prepared function for fft * -**********************************************************************************/ -static void Radix4First(int *buf, int num) -{ - int r0, r1, r2, r3; - int r4, r5, r6, r7; - - for (; num != 0; num--) - { - r0 = buf[0] + buf[2]; - r1 = buf[1] + buf[3]; - r2 = buf[0] - buf[2]; - r3 = buf[1] - buf[3]; - r4 = buf[4] + buf[6]; - r5 = buf[5] + buf[7]; - r6 = buf[4] - buf[6]; - r7 = buf[5] - buf[7]; - - buf[0] = r0 + r4; - buf[1] = r1 + r5; - buf[4] = r0 - r4; - buf[5] = r1 - r5; - buf[2] = r2 + r7; - buf[3] = r3 - r6; - buf[6] = r2 - r7; - buf[7] = r3 + r6; - - buf += 8; - } -} - +**********************************************************************************/ +static void Radix4First(int *buf, int num) +{ + int r0, r1, r2, r3; + int r4, r5, r6, r7; + + for (; num != 0; num--) + { + r0 = buf[0] + buf[2]; + r1 = buf[1] + buf[3]; + r2 = buf[0] - buf[2]; + r3 = buf[1] - buf[3]; + r4 = buf[4] + buf[6]; + r5 = buf[5] + buf[7]; + r6 = buf[4] - buf[6]; + r7 = buf[5] - buf[7]; + + buf[0] = r0 + r4; + buf[1] = r1 + r5; + buf[4] = r0 - r4; + buf[5] = r1 - r5; + buf[2] = r2 + r7; + buf[3] = r3 - r6; + buf[6] = r2 - r7; + buf[7] = r3 + r6; + + buf += 8; + } +} + /***************************************************************************** * * function name: Radix8First * description: Radix 8 point prepared function for fft * -**********************************************************************************/ -static void Radix8First(int *buf, int num) -{ - int r0, r1, r2, r3; - int i0, i1, i2, i3; - int r4, r5, r6, r7; - int i4, i5, i6, i7; - int t0, t1, t2, t3; - - for ( ; num != 0; num--) - { - r0 = buf[0] + buf[2]; - i0 = buf[1] + buf[3]; - r1 = buf[0] - buf[2]; - i1 = buf[1] - buf[3]; - r2 = buf[4] + buf[6]; - i2 = buf[5] + buf[7]; - r3 = buf[4] - buf[6]; - i3 = buf[5] - buf[7]; - - r4 = (r0 + r2) >> 1; - i4 = (i0 + i2) >> 1; - r5 = (r0 - r2) >> 1; - i5 = (i0 - i2) >> 1; - r6 = (r1 - i3) >> 1; - i6 = (i1 + r3) >> 1; - r7 = (r1 + i3) >> 1; - i7 = (i1 - r3) >> 1; - - r0 = buf[ 8] + buf[10]; - i0 = buf[ 9] + buf[11]; - r1 = buf[ 8] - buf[10]; - i1 = buf[ 9] - buf[11]; - r2 = buf[12] + buf[14]; - i2 = buf[13] + buf[15]; - r3 = buf[12] - buf[14]; - i3 = buf[13] - buf[15]; - - t0 = (r0 + r2) >> 1; - t1 = (i0 + i2) >> 1; - t2 = (r0 - r2) >> 1; - t3 = (i0 - i2) >> 1; - - buf[ 0] = r4 + t0; - buf[ 1] = i4 + t1; - buf[ 8] = r4 - t0; - buf[ 9] = i4 - t1; - buf[ 4] = r5 + t3; - buf[ 5] = i5 - t2; - buf[12] = r5 - t3; - buf[13] = i5 + t2; - - r0 = r1 - i3; - i0 = i1 + r3; - r2 = r1 + i3; - i2 = i1 - r3; - - t0 = MULHIGH(SQRT1_2, r0 - i0); - t1 = MULHIGH(SQRT1_2, r0 + i0); - t2 = MULHIGH(SQRT1_2, r2 - i2); - t3 = MULHIGH(SQRT1_2, r2 + i2); - - buf[ 6] = r6 - t0; - buf[ 7] = i6 - t1; - buf[14] = r6 + t0; - buf[15] = i6 + t1; - buf[ 2] = r7 + t3; - buf[ 3] = i7 - t2; - buf[10] = r7 - t3; - buf[11] = i7 + t2; - - buf += 16; - } -} - +**********************************************************************************/ +static void Radix8First(int *buf, int num) +{ + int r0, r1, r2, r3; + int i0, i1, i2, i3; + int r4, r5, r6, r7; + int i4, i5, i6, i7; + int t0, t1, t2, t3; + + for ( ; num != 0; num--) + { + r0 = buf[0] + buf[2]; + i0 = buf[1] + buf[3]; + r1 = buf[0] - buf[2]; + i1 = buf[1] - buf[3]; + r2 = buf[4] + buf[6]; + i2 = buf[5] + buf[7]; + r3 = buf[4] - buf[6]; + i3 = buf[5] - buf[7]; + + r4 = (r0 + r2) >> 1; + i4 = (i0 + i2) >> 1; + r5 = (r0 - r2) >> 1; + i5 = (i0 - i2) >> 1; + r6 = (r1 - i3) >> 1; + i6 = (i1 + r3) >> 1; + r7 = (r1 + i3) >> 1; + i7 = (i1 - r3) >> 1; + + r0 = buf[ 8] + buf[10]; + i0 = buf[ 9] + buf[11]; + r1 = buf[ 8] - buf[10]; + i1 = buf[ 9] - buf[11]; + r2 = buf[12] + buf[14]; + i2 = buf[13] + buf[15]; + r3 = buf[12] - buf[14]; + i3 = buf[13] - buf[15]; + + t0 = (r0 + r2) >> 1; + t1 = (i0 + i2) >> 1; + t2 = (r0 - r2) >> 1; + t3 = (i0 - i2) >> 1; + + buf[ 0] = r4 + t0; + buf[ 1] = i4 + t1; + buf[ 8] = r4 - t0; + buf[ 9] = i4 - t1; + buf[ 4] = r5 + t3; + buf[ 5] = i5 - t2; + buf[12] = r5 - t3; + buf[13] = i5 + t2; + + r0 = r1 - i3; + i0 = i1 + r3; + r2 = r1 + i3; + i2 = i1 - r3; + + t0 = MULHIGH(SQRT1_2, r0 - i0); + t1 = MULHIGH(SQRT1_2, r0 + i0); + t2 = MULHIGH(SQRT1_2, r2 - i2); + t3 = MULHIGH(SQRT1_2, r2 + i2); + + buf[ 6] = r6 - t0; + buf[ 7] = i6 - t1; + buf[14] = r6 + t0; + buf[15] = i6 + t1; + buf[ 2] = r7 + t3; + buf[ 3] = i7 - t2; + buf[10] = r7 - t3; + buf[11] = i7 + t2; + + buf += 16; + } +} + /***************************************************************************** * * function name: Radix4FFT * description: Radix 4 point fft core function * -**********************************************************************************/ -static void Radix4FFT(int *buf, int num, int bgn, int *twidTab) -{ - int r0, r1, r2, r3; - int r4, r5, r6, r7; - int t0, t1; - int sinx, cosx; - int i, j, step; - int *xptr, *csptr; - - for (num >>= 2; num != 0; num >>= 2) - { - step = 2*bgn; - xptr = buf; - - for (i = num; i != 0; i--) - { - csptr = twidTab; - - for (j = bgn; j != 0; j--) - { - r0 = xptr[0]; - r1 = xptr[1]; - xptr += step; - - t0 = xptr[0]; - t1 = xptr[1]; - cosx = csptr[0]; - sinx = csptr[1]; - r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*br + sin*bi */ - r3 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*bi - sin*br */ - xptr += step; - - t0 = r0 >> 2; - t1 = r1 >> 2; - r0 = t0 - r2; - r1 = t1 - r3; - r2 = t0 + r2; - r3 = t1 + r3; - - t0 = xptr[0]; - t1 = xptr[1]; - cosx = csptr[2]; - sinx = csptr[3]; - 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]; - sinx = csptr[5]; - r6 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*cr + sin*ci */ - r7 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*ci - sin*cr */ - csptr += 6; - - t0 = r4; - t1 = r5; - r4 = t0 + r6; - r5 = r7 - t1; - r6 = t0 - r6; - r7 = r7 + t1; - - xptr[0] = r0 + r5; - xptr[1] = r1 + r6; - xptr -= step; - - xptr[0] = r2 - r4; - xptr[1] = r3 - r7; - xptr -= step; - - xptr[0] = r0 - r5; - xptr[1] = r1 - r6; - xptr -= step; - - xptr[0] = r2 + r4; - xptr[1] = r3 + r7; - xptr += 2; - } - xptr += 3*step; - } - twidTab += 3*step; - bgn <<= 2; - } -} - +**********************************************************************************/ +static void Radix4FFT(int *buf, int num, int bgn, int *twidTab) +{ + int r0, r1, r2, r3; + int r4, r5, r6, r7; + int t0, t1; + int sinx, cosx; + int i, j, step; + int *xptr, *csptr; + + for (num >>= 2; num != 0; num >>= 2) + { + step = 2*bgn; + xptr = buf; + + for (i = num; i != 0; i--) + { + csptr = twidTab; + + for (j = bgn; j != 0; j--) + { + r0 = xptr[0]; + r1 = xptr[1]; + xptr += step; + + t0 = xptr[0]; + t1 = xptr[1]; + cosx = csptr[0]; + sinx = csptr[1]; + r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*br + sin*bi */ + r3 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*bi - sin*br */ + xptr += step; + + t0 = r0 >> 2; + t1 = r1 >> 2; + r0 = t0 - r2; + r1 = t1 - r3; + r2 = t0 + r2; + r3 = t1 + r3; + + t0 = xptr[0]; + t1 = xptr[1]; + cosx = csptr[2]; + sinx = csptr[3]; + 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]; + sinx = csptr[5]; + r6 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*cr + sin*ci */ + r7 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*ci - sin*cr */ + csptr += 6; + + t0 = r4; + t1 = r5; + r4 = t0 + r6; + r5 = r7 - t1; + r6 = t0 - r6; + r7 = r7 + t1; + + xptr[0] = r0 + r5; + xptr[1] = r1 + r6; + xptr -= step; + + xptr[0] = r2 - r4; + xptr[1] = r3 - r7; + xptr -= step; + + xptr[0] = r0 - r5; + xptr[1] = r1 - r6; + xptr -= step; + + xptr[0] = r2 + r4; + xptr[1] = r3 + r7; + xptr += 2; + } + xptr += 3*step; + } + twidTab += 3*step; + bgn <<= 2; + } +} + /********************************************************************************* * * function name: PreMDCT * description: prepare MDCT process for next FFT compute * -**********************************************************************************/ -static void PreMDCT(int *buf0, int num, const int *csptr) -{ - int i; - 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++; - - 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); - *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2); - } -} - +**********************************************************************************/ +static void PreMDCT(int *buf0, int num, const int *csptr) +{ + int i; + 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++; + + 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); + *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2); + } +} + /********************************************************************************* * * function name: PostMDCT * description: post MDCT process after next FFT for MDCT * -**********************************************************************************/ -static void PostMDCT(int *buf0, int num, const int *csptr) -{ - int i; - 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++; - - tr1 = *(buf0 + 0); - ti1 = *(buf0 + 1); - ti2 = *(buf1 + 0); - tr2 = *(buf1 - 1); - - *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1); - *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1); - - *buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2); - *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2); - } -} -#endif - - +**********************************************************************************/ +static void PostMDCT(int *buf0, int num, const int *csptr) +{ + int i; + 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++; + + tr1 = *(buf0 + 0); + ti1 = *(buf0 + 1); + ti2 = *(buf1 + 0); + tr2 = *(buf1 - 1); + + *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1); + *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1); + + *buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2); + *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2); + } +} +#endif + + /********************************************************************************** * * function name: Mdct_Long * description: the long block mdct, include long_start block, end_long block * -**********************************************************************************/ -void Mdct_Long(int *buf) -{ - PreMDCT(buf, 1024, cossintab + 128); - - Shuffle(buf, 512, bitrevTab + 17); - Radix8First(buf, 512 >> 3); - Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512); - - PostMDCT(buf, 1024, cossintab + 128); -} - - +**********************************************************************************/ +void Mdct_Long(int *buf) +{ + PreMDCT(buf, 1024, cossintab + 128); + + Shuffle(buf, 512, bitrevTab + 17); + Radix8First(buf, 512 >> 3); + Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512); + + PostMDCT(buf, 1024, cossintab + 128); +} + + /********************************************************************************** * * function name: Mdct_Short * description: the short block mdct * -**********************************************************************************/ -void Mdct_Short(int *buf) -{ - PreMDCT(buf, 128, cossintab); - - Shuffle(buf, 64, bitrevTab); - Radix4First(buf, 64 >> 2); - Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64); - - PostMDCT(buf, 128, cossintab); -} +**********************************************************************************/ +void Mdct_Short(int *buf) +{ + PreMDCT(buf, 128, cossintab); + + Shuffle(buf, 64, bitrevTab); + Radix4First(buf, 64 >> 2); + Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64); + + PostMDCT(buf, 128, cossintab); +} /***************************************************************************** @@ -419,31 +419,31 @@ static void shiftMdctDelayBuffer(Word16 *mdctDelayBuffer, /*! start of mdct dela *srBuf++ = *dsBuf; dsBuf += chIncrement; *srBuf++ = *dsBuf; dsBuf += chIncrement; } -} - - +} + + /***************************************************************************** * * function name: getScalefactorOfShortVectorStride * description: Calculate max possible scale factor for input vector of shorts * returns: Maximum scale factor * -**********************************************************************************/ -static Word16 getScalefactorOfShortVectorStride(const Word16 *vector, /*!< Pointer to input vector */ - Word16 len, /*!< Length of input vector */ - Word16 stride) /*!< Stride of input vector */ -{ - Word16 maxVal = 0; - Word16 absVal; - Word16 i; - - for(i=0; i> 2) + (ws2 >> 2)); } - Mdct_Long(realOut); - /* update scale factor */ + Mdct_Long(realOut); + /* update scale factor */ minSf = 14 - minSf; *mdctScale=minSf; break; @@ -543,7 +543,7 @@ void Transform_Real(Word16 *mdctDelayBuffer, timeSignalSample = (*dctIn1--) << minSf; ws2 = timeSignalSample * (*winPtr & 0xffff); winPtr ++; - *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ + *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ } shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); @@ -564,7 +564,7 @@ void Transform_Real(Word16 *mdctDelayBuffer, timeSignalSample= (*dctIn1--) << minSf; ws2 = timeSignalSample * (*winPtr >> 16); winPtr++; - *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */ + *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */ } Mdct_Long(realOut); @@ -600,7 +600,7 @@ void Transform_Real(Word16 *mdctDelayBuffer, timeSignalSample= (*dctIn1--) << minSf; ws2 = timeSignalSample * (*winPtr & 0xffff); winPtr++; - *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ + *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ } shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement); @@ -615,8 +615,8 @@ void Transform_Real(Word16 *mdctDelayBuffer, ws1 = timeSignalSample *(*winPtr & 0xffff); timeSignalSample= (*dctIn1--) << minSf; ws2 = timeSignalSample * (*winPtr >> 16); - *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */ - winPtr++; + *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */ + winPtr++; } Mdct_Long(realOut); @@ -645,23 +645,23 @@ void Transform_Real(Word16 *mdctDelayBuffer, ws1 = timeSignalSample * (*winPtr >> 16); timeSignalSample= *dctIn1 << minSf; ws2 = timeSignalSample * (*winPtr & 0xffff); - *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ + *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */ timeSignalSample= *(dctIn0 + FRAME_LEN_SHORT) << minSf; ws1 = timeSignalSample * (*winPtr & 0xffff); timeSignalSample= *(dctIn1 + FRAME_LEN_SHORT) << minSf; ws2 = timeSignalSample * (*winPtr >> 16); - *outData1-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */ - - winPtr++; - dctIn0++; - dctIn1--; + *outData1-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */ + + winPtr++; + dctIn0++; + dctIn1--; } Mdct_Short(realOut); realOut += FRAME_LEN_SHORT; } - + minSf = 11 - minSf; *mdctScale = minSf; /* update scale factor */ diff --git a/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c b/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c index 5e71a5b..4ff5f10 100644 --- a/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c +++ b/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c @@ -1,364 +1,364 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -#ifdef LINUX -#include -#endif - -#include -#include -#include -#include "voAMRWB.h" -#include "cmnMemory.h" - -#define VOAMRWB_RFC3267_HEADER_INFO "#!AMR-WB\n" - -#define INPUT_SIZE 640 -#define OUTPUT_SIZE 1024 -unsigned char InputBuf[INPUT_SIZE]; -unsigned char OutputBuf[OUTPUT_SIZE]; - -void usage (void) { - printf ("AMR_WB Encoder HELP Displays this text\n"); - printf ("\n"); - printf ("Usage:\n"); - printf ("AMRWBEnc [options] Input_file output_file \n"); - printf ("\n"); - printf ("Options +M* +F* +DTX \n"); - printf ("Support \n"); - printf ("Options +M* for seting compression bitrate mode, default is 23.85kbps\n"); - printf (" +M0 = 6.6kbps \n"); - printf (" +M1 = 8.85kbps \n"); - printf (" +M2 = 12.65kbps \n"); - printf (" +M3 = 14.25kbps \n"); - printf (" +M4 = 15.58kbps \n"); - printf (" +M5 = 18.25kbps \n"); - printf (" +M6 = 19.85kbps \n"); - printf (" +M7 = 23.05kbps \n"); - printf (" +M8 = 23.85kbps \n"); - printf ("\n"); - printf ("Options +F* for setting output frame Type, default is RFC3267 \n"); - printf ("+F0 for AMR_WB Defualt bit extern short data frame type \n"); - printf ("+F1 for AMR_WB_ITU bit extern short data frame type \n"); - printf ("+F2 for RFC3267\n "); - printf ("\n"); - printf ("Options +DTX enable DTX mode, default is disable.\n"); - printf ("File names, input raw PCM data, and output is AMR_WB bit-stream file.\n"); - printf ("\n"); -} - -int GetNextBuf(FILE* inFile,unsigned char* dst,int size) -{ - int size2 = (int)fread(dst, sizeof(signed char), size,inFile); - return size2; -} - -typedef int (VO_API * VOGETAUDIOENCAPI) (VO_AUDIO_CODECAPI * pEncHandle); - -int encode( - int mode, - short allow_dtx, - VOAMRWBFRAMETYPE frameType, - const char* srcfile, - const char* dstfile - ) -{ - int ret = 0; - int returnCode; - FILE *fsrc = NULL; - FILE *fdst = NULL; - int framenum = 0; - int eofFile = 0; - int size1 = 0; - int Relens; - - VO_AUDIO_CODECAPI AudioAPI; - VO_MEM_OPERATOR moper; - VO_CODEC_INIT_USERDATA useData; - VO_HANDLE hCodec; - VO_CODECBUFFER inData; - VO_CODECBUFFER outData; - VO_AUDIO_OUTPUTINFO outFormat; - - unsigned char *inBuf = InputBuf; - unsigned char *outBuf = OutputBuf; - - -#ifdef LINUX - void *handle = NULL; - void *pfunc; - VOGETAUDIOENCAPI pGetAPI; -#endif - - clock_t start, finish; - double duration = 0.0; - - if ((fsrc = fopen (srcfile, "rb")) == NULL) - { - ret = -1; - goto safe_exit; - } - - if ((fdst = fopen (dstfile, "wb")) == NULL) - { - ret = -1; - goto safe_exit; - } - - moper.Alloc = cmnMemAlloc; - moper.Copy = cmnMemCopy; - moper.Free = cmnMemFree; - moper.Set = cmnMemSet; - moper.Check = cmnMemCheck; - - useData.memflag = VO_IMF_USERMEMOPERATOR; - useData.memData = (VO_PTR)(&moper); - -#ifdef LINUX - handle = dlopen("libstagefright.so", RTLD_NOW); - if(handle == 0) - { - printf("open dll error......"); - return -1; - } - - pfunc = dlsym(handle, "voGetAMRWBEncAPI"); - if(pfunc == 0) - { - printf("open function error......"); - return -1; - } - - pGetAPI = (VOGETAUDIOENCAPI)pfunc; - - returnCode = pGetAPI(&AudioAPI); - if(returnCode) - { - printf("get APIs error......"); - return -1; - } -#else - ret = voGetAMRWBEncAPI(&AudioAPI); - if(ret) - { - ret = -1; - printf("get APIs error......"); - goto safe_exit; - } -#endif - - //####################################### Init Encoding Section ######################################### - ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData); - - if(ret) - { - ret = -1; - printf("APIs init error......"); - goto safe_exit; - } - - Relens = GetNextBuf(fsrc,InputBuf,INPUT_SIZE); - if(Relens!=INPUT_SIZE && !feof(fsrc)) - { - ret = -1; //Invalid magic number - printf("get next buffer error......"); - goto safe_exit; - } - - //###################################### set encode Mode ################################################## - ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_FRAMETYPE, &frameType); - ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_MODE, &mode); - ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_DTX, &allow_dtx); - - if(frameType == VOAMRWB_RFC3267) - { - /* write RFC3267 Header info to indicate single channel AMR file storage format */ - size1 = (int)strlen(VOAMRWB_RFC3267_HEADER_INFO); - memcpy(outBuf, VOAMRWB_RFC3267_HEADER_INFO, size1); - outBuf += size1; - } - - //####################################### Encoding Section ######################################### - printf(" \n ---------------- Running -------------------------\n "); - - do{ - inData.Buffer = (unsigned char *)inBuf; - inData.Length = Relens; - outData.Buffer = outBuf; - - start = clock(); - - /* decode one amr block */ - returnCode = AudioAPI.SetInputData(hCodec,&inData); - - do { - returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outFormat); - if(returnCode == 0) - { - framenum++; - printf(" Frames processed: %hd\r", framenum); - if(framenum == 1) - { - fwrite(OutputBuf, 1, outData.Length + size1, fdst); - fflush(fdst); - } - else - { - fwrite(outData.Buffer, 1, outData.Length, fdst); - fflush(fdst); - } - } - else if(returnCode == VO_ERR_LICENSE_ERROR) - { - printf("Encoder time reach upper limit......"); - goto safe_exit; - } - } while(returnCode != VO_ERR_INPUT_BUFFER_SMALL); - - finish = clock(); - duration += finish - start; - - if (!eofFile) { - Relens = GetNextBuf(fsrc, InputBuf, INPUT_SIZE); - inBuf = InputBuf; - if (feof(fsrc) && Relens == 0) - eofFile = 1; - } - } while (!eofFile && returnCode); - //####################################### End Encoding Section ######################################### - -safe_exit: - returnCode = AudioAPI.Uninit(hCodec); - - printf( "\n%2.5f seconds\n", (double)duration/CLOCKS_PER_SEC); - - if (fsrc) - fclose(fsrc); - if (fdst) - fclose(fdst); - -#ifdef LINUX - dlclose(handle); -#endif - - return ret; -} - -int main(int argc, char **argv) // for gcc compiler; -{ - int mode, r; - int arg, filename=0; - char *inFileName = NULL; - char *outFileName = NULL; - short allow_dtx; - VOAMRWBFRAMETYPE frameType; - - printf("\n"); - printf("************************Adaptive Multi-Rate Wide Band Encoder (AMR-WB)*******************************\n"); - printf("***********************************DEFINITIONS:*******************************************************\n"); - printf("AMR-WB encoder scheme is based on the principle of Algebraic Code Excited Linear Prediction algorithm\n"); - printf("The AMR-WB encoder compression MONO liner PCM speech input data at 16kHz sampling rate\n"); - printf("to one of nine data rate modes-6.60, 8.85, 12.65, 14.25, 15.85, 18.25, 19.25, 23.05 and 23.85kbps.\n"); - printf("The encoder supports output format AMRWB ITU, AMRWB RFC3267.\n"); - printf("\n"); - - /*Encoder Default setting */ - mode = VOAMRWB_MD2385; - allow_dtx = 0; - frameType = VOAMRWB_RFC3267; - - if(argc < 3){ - usage(); - return 0; - }else{ - for (arg = 1; arg < argc; arg++) { - if (argv [arg] [0] == '+') { - if(argv[arg][1] == 'M') - { - switch(argv[arg][2]) - { - case '0': mode = VOAMRWB_MD66; - break; - case '1': mode = VOAMRWB_MD885; - break; - case '2': mode = VOAMRWB_MD1265; - break; - case '3': mode = VOAMRWB_MD1425; - break; - case '4': mode = VOAMRWB_MD1585; - break; - case '5': mode = VOAMRWB_MD1825; - break; - case '6': mode = VOAMRWB_MD1985; - break; - case '7': mode = VOAMRWB_MD2305; - break; - case '8': mode = VOAMRWB_MD2385; - break; - default: - usage(); - printf ("Invalid parameter '%s'.\n", argv [arg]); - break; - } - }else if(argv[arg][1] == 'F') - { - switch(argv[arg][2]) - { - case '0': frameType = VOAMRWB_DEFAULT; - break; - case '1': frameType = VOAMRWB_ITU; - break; - case '2': frameType = VOAMRWB_RFC3267 ; - break; - default: - usage(); - printf ("Invalid parameter '%s'.\n", argv [arg]); - break; - - - } - }else if(strcmp (argv[arg], "+DTX") == 0) - { - allow_dtx = 1; - } - - } else { - switch (filename) { - case 0: - inFileName = argv[arg]; - break; - case 1: - outFileName = argv[arg]; - break; - default: - usage (); - fprintf (stderr, "Invalid parameter '%s'.\n", argv [arg]); - return 0; - } - filename++; - } - } - } - - r = encode(mode, allow_dtx, frameType, inFileName, outFileName); - if(r) - { - fprintf(stderr, "error: %d\n", r); - } - return r; -} - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +#ifdef LINUX +#include +#endif + +#include +#include +#include +#include "voAMRWB.h" +#include "cmnMemory.h" + +#define VOAMRWB_RFC3267_HEADER_INFO "#!AMR-WB\n" + +#define INPUT_SIZE 640 +#define OUTPUT_SIZE 1024 +unsigned char InputBuf[INPUT_SIZE]; +unsigned char OutputBuf[OUTPUT_SIZE]; + +void usage (void) { + printf ("AMR_WB Encoder HELP Displays this text\n"); + printf ("\n"); + printf ("Usage:\n"); + printf ("AMRWBEnc [options] Input_file output_file \n"); + printf ("\n"); + printf ("Options +M* +F* +DTX \n"); + printf ("Support \n"); + printf ("Options +M* for seting compression bitrate mode, default is 23.85kbps\n"); + printf (" +M0 = 6.6kbps \n"); + printf (" +M1 = 8.85kbps \n"); + printf (" +M2 = 12.65kbps \n"); + printf (" +M3 = 14.25kbps \n"); + printf (" +M4 = 15.58kbps \n"); + printf (" +M5 = 18.25kbps \n"); + printf (" +M6 = 19.85kbps \n"); + printf (" +M7 = 23.05kbps \n"); + printf (" +M8 = 23.85kbps \n"); + printf ("\n"); + printf ("Options +F* for setting output frame Type, default is RFC3267 \n"); + printf ("+F0 for AMR_WB Defualt bit extern short data frame type \n"); + printf ("+F1 for AMR_WB_ITU bit extern short data frame type \n"); + printf ("+F2 for RFC3267\n "); + printf ("\n"); + printf ("Options +DTX enable DTX mode, default is disable.\n"); + printf ("File names, input raw PCM data, and output is AMR_WB bit-stream file.\n"); + printf ("\n"); +} + +int GetNextBuf(FILE* inFile,unsigned char* dst,int size) +{ + int size2 = (int)fread(dst, sizeof(signed char), size,inFile); + return size2; +} + +typedef int (VO_API * VOGETAUDIOENCAPI) (VO_AUDIO_CODECAPI * pEncHandle); + +int encode( + int mode, + short allow_dtx, + VOAMRWBFRAMETYPE frameType, + const char* srcfile, + const char* dstfile + ) +{ + int ret = 0; + int returnCode; + FILE *fsrc = NULL; + FILE *fdst = NULL; + int framenum = 0; + int eofFile = 0; + int size1 = 0; + int Relens; + + VO_AUDIO_CODECAPI AudioAPI; + VO_MEM_OPERATOR moper; + VO_CODEC_INIT_USERDATA useData; + VO_HANDLE hCodec; + VO_CODECBUFFER inData; + VO_CODECBUFFER outData; + VO_AUDIO_OUTPUTINFO outFormat; + + unsigned char *inBuf = InputBuf; + unsigned char *outBuf = OutputBuf; + + +#ifdef LINUX + void *handle = NULL; + void *pfunc; + VOGETAUDIOENCAPI pGetAPI; +#endif + + clock_t start, finish; + double duration = 0.0; + + if ((fsrc = fopen (srcfile, "rb")) == NULL) + { + ret = -1; + goto safe_exit; + } + + if ((fdst = fopen (dstfile, "wb")) == NULL) + { + ret = -1; + goto safe_exit; + } + + moper.Alloc = cmnMemAlloc; + moper.Copy = cmnMemCopy; + moper.Free = cmnMemFree; + moper.Set = cmnMemSet; + moper.Check = cmnMemCheck; + + useData.memflag = VO_IMF_USERMEMOPERATOR; + useData.memData = (VO_PTR)(&moper); + +#ifdef LINUX + handle = dlopen("libstagefright.so", RTLD_NOW); + if(handle == 0) + { + printf("open dll error......"); + return -1; + } + + pfunc = dlsym(handle, "voGetAMRWBEncAPI"); + if(pfunc == 0) + { + printf("open function error......"); + return -1; + } + + pGetAPI = (VOGETAUDIOENCAPI)pfunc; + + returnCode = pGetAPI(&AudioAPI); + if(returnCode) + { + printf("get APIs error......"); + return -1; + } +#else + ret = voGetAMRWBEncAPI(&AudioAPI); + if(ret) + { + ret = -1; + printf("get APIs error......"); + goto safe_exit; + } +#endif + + //####################################### Init Encoding Section ######################################### + ret = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAMRWB, &useData); + + if(ret) + { + ret = -1; + printf("APIs init error......"); + goto safe_exit; + } + + Relens = GetNextBuf(fsrc,InputBuf,INPUT_SIZE); + if(Relens!=INPUT_SIZE && !feof(fsrc)) + { + ret = -1; //Invalid magic number + printf("get next buffer error......"); + goto safe_exit; + } + + //###################################### set encode Mode ################################################## + ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_FRAMETYPE, &frameType); + ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_MODE, &mode); + ret = AudioAPI.SetParam(hCodec, VO_PID_AMRWB_DTX, &allow_dtx); + + if(frameType == VOAMRWB_RFC3267) + { + /* write RFC3267 Header info to indicate single channel AMR file storage format */ + size1 = (int)strlen(VOAMRWB_RFC3267_HEADER_INFO); + memcpy(outBuf, VOAMRWB_RFC3267_HEADER_INFO, size1); + outBuf += size1; + } + + //####################################### Encoding Section ######################################### + printf(" \n ---------------- Running -------------------------\n "); + + do{ + inData.Buffer = (unsigned char *)inBuf; + inData.Length = Relens; + outData.Buffer = outBuf; + + start = clock(); + + /* decode one amr block */ + returnCode = AudioAPI.SetInputData(hCodec,&inData); + + do { + returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outFormat); + if(returnCode == 0) + { + framenum++; + printf(" Frames processed: %hd\r", framenum); + if(framenum == 1) + { + fwrite(OutputBuf, 1, outData.Length + size1, fdst); + fflush(fdst); + } + else + { + fwrite(outData.Buffer, 1, outData.Length, fdst); + fflush(fdst); + } + } + else if(returnCode == VO_ERR_LICENSE_ERROR) + { + printf("Encoder time reach upper limit......"); + goto safe_exit; + } + } while(returnCode != VO_ERR_INPUT_BUFFER_SMALL); + + finish = clock(); + duration += finish - start; + + if (!eofFile) { + Relens = GetNextBuf(fsrc, InputBuf, INPUT_SIZE); + inBuf = InputBuf; + if (feof(fsrc) && Relens == 0) + eofFile = 1; + } + } while (!eofFile && returnCode); + //####################################### End Encoding Section ######################################### + +safe_exit: + returnCode = AudioAPI.Uninit(hCodec); + + printf( "\n%2.5f seconds\n", (double)duration/CLOCKS_PER_SEC); + + if (fsrc) + fclose(fsrc); + if (fdst) + fclose(fdst); + +#ifdef LINUX + dlclose(handle); +#endif + + return ret; +} + +int main(int argc, char **argv) // for gcc compiler; +{ + int mode, r; + int arg, filename=0; + char *inFileName = NULL; + char *outFileName = NULL; + short allow_dtx; + VOAMRWBFRAMETYPE frameType; + + printf("\n"); + printf("************************Adaptive Multi-Rate Wide Band Encoder (AMR-WB)*******************************\n"); + printf("***********************************DEFINITIONS:*******************************************************\n"); + printf("AMR-WB encoder scheme is based on the principle of Algebraic Code Excited Linear Prediction algorithm\n"); + printf("The AMR-WB encoder compression MONO liner PCM speech input data at 16kHz sampling rate\n"); + printf("to one of nine data rate modes-6.60, 8.85, 12.65, 14.25, 15.85, 18.25, 19.25, 23.05 and 23.85kbps.\n"); + printf("The encoder supports output format AMRWB ITU, AMRWB RFC3267.\n"); + printf("\n"); + + /*Encoder Default setting */ + mode = VOAMRWB_MD2385; + allow_dtx = 0; + frameType = VOAMRWB_RFC3267; + + if(argc < 3){ + usage(); + return 0; + }else{ + for (arg = 1; arg < argc; arg++) { + if (argv [arg] [0] == '+') { + if(argv[arg][1] == 'M') + { + switch(argv[arg][2]) + { + case '0': mode = VOAMRWB_MD66; + break; + case '1': mode = VOAMRWB_MD885; + break; + case '2': mode = VOAMRWB_MD1265; + break; + case '3': mode = VOAMRWB_MD1425; + break; + case '4': mode = VOAMRWB_MD1585; + break; + case '5': mode = VOAMRWB_MD1825; + break; + case '6': mode = VOAMRWB_MD1985; + break; + case '7': mode = VOAMRWB_MD2305; + break; + case '8': mode = VOAMRWB_MD2385; + break; + default: + usage(); + printf ("Invalid parameter '%s'.\n", argv [arg]); + break; + } + }else if(argv[arg][1] == 'F') + { + switch(argv[arg][2]) + { + case '0': frameType = VOAMRWB_DEFAULT; + break; + case '1': frameType = VOAMRWB_ITU; + break; + case '2': frameType = VOAMRWB_RFC3267 ; + break; + default: + usage(); + printf ("Invalid parameter '%s'.\n", argv [arg]); + break; + + + } + }else if(strcmp (argv[arg], "+DTX") == 0) + { + allow_dtx = 1; + } + + } else { + switch (filename) { + case 0: + inFileName = argv[arg]; + break; + case 1: + outFileName = argv[arg]; + break; + default: + usage (); + fprintf (stderr, "Invalid parameter '%s'.\n", argv [arg]); + return 0; + } + filename++; + } + } + } + + r = encode(mode, allow_dtx, frameType, inFileName, outFileName); + if(r) + { + fprintf(stderr, "error: %d\n", r); + } + return r; +} + diff --git a/media/libstagefright/codecs/amrwbenc/inc/acelp.h b/media/libstagefright/codecs/amrwbenc/inc/acelp.h index 4cb38a1..5a1e536 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/acelp.h +++ b/media/libstagefright/codecs/amrwbenc/inc/acelp.h @@ -1,521 +1,521 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*--------------------------------------------------------------------------* - * ACELP.H * - *--------------------------------------------------------------------------* - * Function * - *--------------------------------------------------------------------------*/ -#ifndef __ACELP_H__ -#define __ACELP_H__ - -#include "typedef.h" -#include "cod_main.h" - -/*-----------------------------------------------------------------* - * LPC prototypes * - *-----------------------------------------------------------------*/ - -Word16 median5(Word16 x[]); - -void Autocorr( - Word16 x[], /* (i) : Input signal */ - Word16 m, /* (i) : LPC order */ - Word16 r_h[], /* (o) : Autocorrelations (msb) */ - Word16 r_l[] /* (o) : Autocorrelations (lsb) */ - ); - -void Lag_window( - Word16 r_h[], /* (i/o) : Autocorrelations (msb) */ - Word16 r_l[] /* (i/o) : Autocorrelations (lsb) */ - ); - -void Init_Levinson( - Word16 * mem /* output :static memory (18 words) */ - ); - -void Levinson( - Word16 Rh[], /* (i) : Rh[M+1] Vector of autocorrelations (msb) */ - Word16 Rl[], /* (i) : Rl[M+1] Vector of autocorrelations (lsb) */ - Word16 A[], /* (o) Q12 : A[M] LPC coefficients (m = 16) */ - Word16 rc[], /* (o) Q15 : rc[M] Reflection coefficients. */ - Word16 * mem /* (i/o) :static memory (18 words) */ - ); - -void Az_isp( - Word16 a[], /* (i) Q12 : predictor coefficients */ - Word16 isp[], /* (o) Q15 : Immittance spectral pairs */ - Word16 old_isp[] /* (i) : old isp[] (in case not found M roots) */ - ); - -void Isp_Az( - Word16 isp[], /* (i) Q15 : Immittance spectral pairs */ - Word16 a[], /* (o) Q12 : predictor coefficients (order = M) */ - Word16 m, - Word16 adaptive_scaling /* (i) 0 : adaptive scaling disabled */ - /* 1 : adaptive scaling enabled */ - ); - -void Isp_isf( - Word16 isp[], /* (i) Q15 : isp[m] (range: -1<=val<1) */ - Word16 isf[], /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */ - Word16 m /* (i) : LPC order */ - ); - -void Isf_isp( - Word16 isf[], /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */ - Word16 isp[], /* (o) Q15 : isp[m] (range: -1<=val<1) */ - Word16 m /* (i) : LPC order */ - ); - -void Int_isp( - Word16 isp_old[], /* input : isps from past frame */ - Word16 isp_new[], /* input : isps from present frame */ - Word16 frac[], /* input : fraction for 3 first subfr (Q15) */ - Word16 Az[] /* output: LP coefficients in 4 subframes */ - ); - -void Weight_a( - Word16 a[], /* (i) Q12 : a[m+1] LPC coefficients */ - Word16 ap[], /* (o) Q12 : Spectral expanded LPC coefficients */ - Word16 gamma, /* (i) Q15 : Spectral expansion factor. */ - Word16 m /* (i) : LPC order. */ - ); - - -/*-----------------------------------------------------------------* - * isf quantizers * - *-----------------------------------------------------------------*/ - -void Qpisf_2s_46b( - Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ - Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ - Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ - Word16 * indice, /* (o) : quantization indices */ - Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ - ); - -void Qpisf_2s_36b( - Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ - Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ - Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ - Word16 * indice, /* (o) : quantization indices */ - Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ - ); - -void Dpisf_2s_46b( - Word16 * indice, /* input: quantization indices */ - Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ - Word16 * past_isfq, /* i/0 : past ISF quantizer */ - Word16 * isfold, /* input : past quantized ISF */ - Word16 * isf_buf, /* input : isf buffer */ - Word16 bfi, /* input : Bad frame indicator */ - Word16 enc_dec - ); - -void Dpisf_2s_36b( - Word16 * indice, /* input: quantization indices */ - Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ - Word16 * past_isfq, /* i/0 : past ISF quantizer */ - Word16 * isfold, /* input : past quantized ISF */ - Word16 * isf_buf, /* input : isf buffer */ - Word16 bfi, /* input : Bad frame indicator */ - Word16 enc_dec - ); - -void Qisf_ns( - Word16 * isf1, /* input : ISF in the frequency domain (0..0.5) */ - Word16 * isf_q, /* output: quantized ISF */ - Word16 * indice /* output: quantization indices */ - ); - -void Disf_ns( - Word16 * indice, /* input: quantization indices */ - Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */ - ); - -Word16 Sub_VQ( /* output: return quantization index */ - Word16 * x, /* input : ISF residual vector */ - Word16 * dico, /* input : quantization codebook */ - Word16 dim, /* input : dimention of vector */ - Word16 dico_size, /* input : size of quantization codebook */ - Word32 * distance /* output: error of quantization */ - ); - -void Reorder_isf( - Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */ - Word16 min_dist, /* (i) Q15 : minimum distance to keep */ - Word16 n /* (i) : number of ISF */ - ); - -/*-----------------------------------------------------------------* - * filter prototypes * - *-----------------------------------------------------------------*/ - -void Init_Decim_12k8( - Word16 mem[] /* output: memory (2*NB_COEF_DOWN) set to zeros */ - ); -void Decim_12k8( - Word16 sig16k[], /* input: signal to downsampling */ - Word16 lg, /* input: length of input */ - Word16 sig12k8[], /* output: decimated signal */ - Word16 mem[] /* in/out: memory (2*NB_COEF_DOWN) */ - ); - -void Init_HP50_12k8(Word16 mem[]); -void HP50_12k8( - Word16 signal[], /* input/output signal */ - Word16 lg, /* lenght of signal */ - Word16 mem[] /* filter memory [6] */ - ); -void Init_HP400_12k8(Word16 mem[]); -void HP400_12k8( - Word16 signal[], /* input/output signal */ - Word16 lg, /* lenght of signal */ - Word16 mem[] /* filter memory [6] */ - ); - -void Init_Filt_6k_7k(Word16 mem[]); -void Filt_6k_7k( - Word16 signal[], /* input: signal */ - Word16 lg, /* input: length of input */ - Word16 mem[] /* in/out: memory (size=30) */ - ); -void Filt_6k_7k_asm( - Word16 signal[], /* input: signal */ - Word16 lg, /* input: length of input */ - Word16 mem[] /* in/out: memory (size=30) */ - ); - -void LP_Decim2( - Word16 x[], /* in/out: signal to process */ - Word16 l, /* input : size of filtering */ - Word16 mem[] /* in/out: memory (size=3) */ - ); - -void Preemph( - Word16 x[], /* (i/o) : input signal overwritten by the output */ - Word16 mu, /* (i) Q15 : preemphasis coefficient */ - Word16 lg, /* (i) : lenght of filtering */ - Word16 * mem /* (i/o) : memory (x[-1]) */ - ); -void Preemph2( - Word16 x[], /* (i/o) : input signal overwritten by the output */ - Word16 mu, /* (i) Q15 : preemphasis coefficient */ - Word16 lg, /* (i) : lenght of filtering */ - Word16 * mem /* (i/o) : memory (x[-1]) */ - ); -void Deemph( - Word16 x[], /* (i/o) : input signal overwritten by the output */ - Word16 mu, /* (i) Q15 : deemphasis factor */ - Word16 L, /* (i) : vector size */ - Word16 * mem /* (i/o) : memory (y[-1]) */ - ); -void Deemph2( - Word16 x[], /* (i/o) : input signal overwritten by the output */ - Word16 mu, /* (i) Q15 : deemphasis factor */ - Word16 L, /* (i) : vector size */ - Word16 * mem /* (i/o) : memory (y[-1]) */ - ); -void Deemph_32( - Word16 x_hi[], /* (i) : input signal (bit31..16) */ - Word16 x_lo[], /* (i) : input signal (bit15..4) */ - Word16 y[], /* (o) : output signal (x16) */ - Word16 mu, /* (i) Q15 : deemphasis factor */ - Word16 L, /* (i) : vector size */ - Word16 * mem /* (i/o) : memory (y[-1]) */ - ); - -void Deemph_32_asm( - Word16 x_hi[], /* (i) : input signal (bit31..16) */ - Word16 x_lo[], /* (i) : input signal (bit15..4) */ - Word16 y[], /* (o) : output signal (x16) */ - Word16 * mem /* (i/o) : memory (y[-1]) */ - ); - -void Convolve( - Word16 x[], /* (i) : input vector */ - Word16 h[], /* (i) Q15 : impulse response */ - Word16 y[], /* (o) 12 bits: output vector */ - Word16 L /* (i) : vector size */ - ); - -void Convolve_asm( - Word16 x[], /* (i) : input vector */ - Word16 h[], /* (i) Q15 : impulse response */ - Word16 y[], /* (o) 12 bits: output vector */ - Word16 L /* (i) : vector size */ - ); - -void Residu( - Word16 a[], /* (i) Q12 : prediction coefficients */ - Word16 x[], /* (i) : speech (values x[-m..-1] are needed */ - Word16 y[], /* (o) : residual signal */ - Word16 lg /* (i) : size of filtering */ - ); - -void Residu_opt( - Word16 a[], /* (i) Q12 : prediction coefficients */ - Word16 x[], /* (i) : speech (values x[-m..-1] are needed */ - Word16 y[], /* (o) : residual signal */ - Word16 lg /* (i) : size of filtering */ - ); - -void Syn_filt( - Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ - Word16 x[], /* (i) : input signal */ - Word16 y[], /* (o) : output signal */ - Word16 lg, /* (i) : size of filtering */ - Word16 mem[], /* (i/o) : memory associated with this filtering. */ - Word16 update /* (i) : 0=no update, 1=update of memory. */ - ); - -void Syn_filt_asm( - Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ - Word16 x[], /* (i) : input signal */ - Word16 y[], /* (o) : output signal */ - Word16 mem[] /* (i/o) : memory associated with this filtering. */ - ); - -void Syn_filt_32( - Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ - Word16 m, /* (i) : order of LP filter */ - Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ - Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ - Word16 sig_hi[], /* (o) /16 : synthesis high */ - Word16 sig_lo[], /* (o) /16 : synthesis low */ - Word16 lg /* (i) : size of filtering */ - ); - -void Syn_filt_32_asm( - Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ - Word16 m, /* (i) : order of LP filter */ - Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ - Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ - Word16 sig_hi[], /* (o) /16 : synthesis high */ - Word16 sig_lo[], /* (o) /16 : synthesis low */ - Word16 lg /* (i) : size of filtering */ - ); -/*-----------------------------------------------------------------* - * pitch prototypes * - *-----------------------------------------------------------------*/ - -Word16 Pitch_ol( /* output: open loop pitch lag */ - Word16 signal[], /* input : signal used to compute the open loop pitch */ -/* signal[-pit_max] to signal[-1] should be known */ - Word16 pit_min, /* input : minimum pitch lag */ - Word16 pit_max, /* input : maximum pitch lag */ - Word16 L_frame /* input : length of frame to compute pitch */ -); - -Word16 Pitch_med_ol( /* output: open loop pitch lag */ - Word16 wsp[], /* input : signal used to compute the open loop pitch */ - /* wsp[-pit_max] to wsp[-1] should be known */ - Coder_State *st, /* i/o : global codec structure */ - Word16 L_frame /* input : length of frame to compute pitch */ -); - -Word16 Med_olag( /* output : median of 5 previous open-loop lags */ - Word16 prev_ol_lag, /* input : previous open-loop lag */ - Word16 old_ol_lag[5] -); - -void Init_Hp_wsp(Word16 mem[]); -void scale_mem_Hp_wsp(Word16 mem[], Word16 exp); -void Hp_wsp( - Word16 wsp[], /* i : wsp[] signal */ - Word16 hp_wsp[], /* o : hypass wsp[] */ - Word16 lg, /* i : lenght of signal */ - Word16 mem[] /* i/o : filter memory [9] */ -); - -Word16 Pitch_fr4( /* (o) : pitch period. */ - Word16 exc[], /* (i) : excitation buffer */ - Word16 xn[], /* (i) : target vector */ - Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */ - Word16 t0_min, /* (i) : minimum value in the searched range. */ - Word16 t0_max, /* (i) : maximum value in the searched range. */ - Word16 * pit_frac, /* (o) : chosen fraction (0, 1, 2 or 3). */ - Word16 i_subfr, /* (i) : indicator for first subframe. */ - Word16 t0_fr2, /* (i) : minimum value for resolution 1/2 */ - Word16 t0_fr1, /* (i) : minimum value for resolution 1 */ - Word16 L_subfr /* (i) : Length of subframe */ -); -void Pred_lt4( - Word16 exc[], /* in/out: excitation buffer */ - Word16 T0, /* input : integer pitch lag */ - Word16 frac, /* input : fraction of lag */ - Word16 L_subfr /* input : subframe size */ -); - -void pred_lt4_asm( - Word16 exc[], /* in/out: excitation buffer */ - Word16 T0, /* input : integer pitch lag */ - Word16 frac, /* input : fraction of lag */ - Word16 L_subfr /* input : subframe size */ -); - -/*-----------------------------------------------------------------* - * gain prototypes * - *-----------------------------------------------------------------*/ - -Word16 G_pitch( /* (o) Q14 : Gain of pitch lag saturated to 1.2 */ - Word16 xn[], /* (i) : Pitch target. */ - Word16 y1[], /* (i) : filtered adaptive codebook. */ - Word16 g_coeff[], /* : Correlations need for gain quantization. */ - Word16 L_subfr /* : Length of subframe. */ -); -void Init_Q_gain2( - Word16 * mem /* output :static memory (2 words) */ -); -Word16 Q_gain2( /* Return index of quantization. */ - Word16 xn[], /* (i) Q_xn:Target vector. */ - Word16 y1[], /* (i) Q_xn:Adaptive codebook. */ - Word16 Q_xn, /* (i) :xn and y1 format */ - Word16 y2[], /* (i) Q9 :Filtered innovative vector. */ - Word16 code[], /* (i) Q9 :Innovative vector. */ - Word16 g_coeff[], /* (i) :Correlations */ -/* Compute in G_pitch(). */ - Word16 L_subfr, /* (i) :Subframe lenght. */ - Word16 nbits, /* (i) : number of bits (6 or 7) */ - Word16 * gain_pit, /* (i/o)Q14:Pitch gain. */ - Word32 * gain_cod, /* (o) Q16 :Code gain. */ - Word16 gp_clip, /* (i) : Gp Clipping flag */ - Word16 * mem /* (i/o) :static memory (2 words) */ -); - -void Init_D_gain2( - Word16 * mem /* output :static memory (4 words) */ -); -void D_gain2( - Word16 index, /* (i) :index of quantization. */ - Word16 nbits, /* (i) : number of bits (6 or 7) */ - Word16 code[], /* (i) Q9 :Innovative vector. */ - Word16 L_subfr, /* (i) :Subframe lenght. */ - Word16 * gain_pit, /* (o) Q14 :Pitch gain. */ - Word32 * gain_cod, /* (o) Q16 :Code gain. */ - Word16 bfi, /* (i) :bad frame indicator */ - Word16 prev_bfi, /* (i) : Previous BF indicator */ - Word16 state, /* (i) : State of BFH */ - Word16 unusable_frame, /* (i) : UF indicator */ - Word16 vad_hist, /* (i) :number of non-speech frames */ - Word16 * mem /* (i/o) :static memory (4 words) */ -); - -/*-----------------------------------------------------------------* - * acelp prototypes * - *-----------------------------------------------------------------*/ - -void cor_h_x( - Word16 h[], /* (i) Q12 : impulse response of weighted synthesis filter */ - Word16 x[], /* (i) Q0 : target vector */ - Word16 dn[] /* (o) <12bit : correlation between target and h[] */ -); -void ACELP_2t64_fx( - Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */ - Word16 cn[], /* (i) <12b : residual after long term prediction */ - Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */ - Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */ - Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */ - Word16 * index /* (o) : index (12): 5+1+5+1 = 11 bits. */ -); - -void ACELP_4t64_fx( - Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */ - Word16 cn[], /* (i) <12b : residual after long term prediction */ - Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */ - Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */ - Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */ - Word16 nbbits, /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits */ - Word16 ser_size, /* (i) : bit rate */ - Word16 _index[] /* (o) : index (20): 5+5+5+5 = 20 bits. */ - /* (o) : index (36): 9+9+9+9 = 36 bits. */ - /* (o) : index (44): 13+9+13+9 = 44 bits. */ - /* (o) : index (52): 13+13+13+13 = 52 bits. */ - /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits. */ - /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits. */ - /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */ -); - -void Pit_shrp( - Word16 * x, /* in/out: impulse response (or algebraic code) */ - Word16 pit_lag, /* input : pitch lag */ - Word16 sharp, /* input : pitch sharpening factor (Q15) */ - Word16 L_subfr /* input : subframe size */ -); - - -/*-----------------------------------------------------------------* - * others prototypes * - *-----------------------------------------------------------------*/ - -void Copy( - Word16 x[], /* (i) : input vector */ - Word16 y[], /* (o) : output vector */ - Word16 L /* (i) : vector length */ -); -void Set_zero( - Word16 x[], /* (o) : vector to clear */ - Word16 L /* (i) : length of vector */ -); -void Updt_tar( - Word16 * x, /* (i) Q0 : old target (for pitch search) */ - Word16 * x2, /* (o) Q0 : new target (for codebook search) */ - Word16 * y, /* (i) Q0 : filtered adaptive codebook vector */ - Word16 gain, /* (i) Q14 : adaptive codebook gain */ - Word16 L /* (i) : subframe size */ -); -Word16 voice_factor( /* (o) Q15 : factor (-1=unvoiced to 1=voiced) */ - Word16 exc[], /* (i) Q_exc: pitch excitation */ - Word16 Q_exc, /* (i) : exc format */ - Word16 gain_pit, /* (i) Q14 : gain of pitch */ - Word16 code[], /* (i) Q9 : Fixed codebook excitation */ - Word16 gain_code, /* (i) Q0 : gain of code */ - Word16 L_subfr /* (i) : subframe length */ -); -void Scale_sig( - Word16 x[], /* (i/o) : signal to scale */ - Word16 lg, /* (i) : size of x[] */ - Word16 exp /* (i) : exponent: x = round(x << exp) */ -); - -void Scale_sig_opt( - Word16 x[], /* (i/o) : signal to scale */ - Word16 lg, /* (i) : size of x[] */ - Word16 exp /* (i) : exponent: x = round(x << exp) */ -); - -Word16 Random(Word16 * seed); - -void Init_gp_clip( - Word16 mem[] /* (o) : memory of gain of pitch clipping algorithm */ -); -Word16 Gp_clip( - Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ -); -void Gp_clip_test_isf( - Word16 isf[], /* (i) : isf values (in frequency domain) */ - Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ -); -void Gp_clip_test_gain_pit( - Word16 gain_pit, /* (i) : gain of quantized pitch */ - Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ -); - - -#endif //__ACELP_H__ - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*--------------------------------------------------------------------------* + * ACELP.H * + *--------------------------------------------------------------------------* + * Function * + *--------------------------------------------------------------------------*/ +#ifndef __ACELP_H__ +#define __ACELP_H__ + +#include "typedef.h" +#include "cod_main.h" + +/*-----------------------------------------------------------------* + * LPC prototypes * + *-----------------------------------------------------------------*/ + +Word16 median5(Word16 x[]); + +void Autocorr( + Word16 x[], /* (i) : Input signal */ + Word16 m, /* (i) : LPC order */ + Word16 r_h[], /* (o) : Autocorrelations (msb) */ + Word16 r_l[] /* (o) : Autocorrelations (lsb) */ + ); + +void Lag_window( + Word16 r_h[], /* (i/o) : Autocorrelations (msb) */ + Word16 r_l[] /* (i/o) : Autocorrelations (lsb) */ + ); + +void Init_Levinson( + Word16 * mem /* output :static memory (18 words) */ + ); + +void Levinson( + Word16 Rh[], /* (i) : Rh[M+1] Vector of autocorrelations (msb) */ + Word16 Rl[], /* (i) : Rl[M+1] Vector of autocorrelations (lsb) */ + Word16 A[], /* (o) Q12 : A[M] LPC coefficients (m = 16) */ + Word16 rc[], /* (o) Q15 : rc[M] Reflection coefficients. */ + Word16 * mem /* (i/o) :static memory (18 words) */ + ); + +void Az_isp( + Word16 a[], /* (i) Q12 : predictor coefficients */ + Word16 isp[], /* (o) Q15 : Immittance spectral pairs */ + Word16 old_isp[] /* (i) : old isp[] (in case not found M roots) */ + ); + +void Isp_Az( + Word16 isp[], /* (i) Q15 : Immittance spectral pairs */ + Word16 a[], /* (o) Q12 : predictor coefficients (order = M) */ + Word16 m, + Word16 adaptive_scaling /* (i) 0 : adaptive scaling disabled */ + /* 1 : adaptive scaling enabled */ + ); + +void Isp_isf( + Word16 isp[], /* (i) Q15 : isp[m] (range: -1<=val<1) */ + Word16 isf[], /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */ + Word16 m /* (i) : LPC order */ + ); + +void Isf_isp( + Word16 isf[], /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */ + Word16 isp[], /* (o) Q15 : isp[m] (range: -1<=val<1) */ + Word16 m /* (i) : LPC order */ + ); + +void Int_isp( + Word16 isp_old[], /* input : isps from past frame */ + Word16 isp_new[], /* input : isps from present frame */ + Word16 frac[], /* input : fraction for 3 first subfr (Q15) */ + Word16 Az[] /* output: LP coefficients in 4 subframes */ + ); + +void Weight_a( + Word16 a[], /* (i) Q12 : a[m+1] LPC coefficients */ + Word16 ap[], /* (o) Q12 : Spectral expanded LPC coefficients */ + Word16 gamma, /* (i) Q15 : Spectral expansion factor. */ + Word16 m /* (i) : LPC order. */ + ); + + +/*-----------------------------------------------------------------* + * isf quantizers * + *-----------------------------------------------------------------*/ + +void Qpisf_2s_46b( + Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ + Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ + Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ + Word16 * indice, /* (o) : quantization indices */ + Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ + ); + +void Qpisf_2s_36b( + Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ + Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ + Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ + Word16 * indice, /* (o) : quantization indices */ + Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ + ); + +void Dpisf_2s_46b( + Word16 * indice, /* input: quantization indices */ + Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ + Word16 * past_isfq, /* i/0 : past ISF quantizer */ + Word16 * isfold, /* input : past quantized ISF */ + Word16 * isf_buf, /* input : isf buffer */ + Word16 bfi, /* input : Bad frame indicator */ + Word16 enc_dec + ); + +void Dpisf_2s_36b( + Word16 * indice, /* input: quantization indices */ + Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ + Word16 * past_isfq, /* i/0 : past ISF quantizer */ + Word16 * isfold, /* input : past quantized ISF */ + Word16 * isf_buf, /* input : isf buffer */ + Word16 bfi, /* input : Bad frame indicator */ + Word16 enc_dec + ); + +void Qisf_ns( + Word16 * isf1, /* input : ISF in the frequency domain (0..0.5) */ + Word16 * isf_q, /* output: quantized ISF */ + Word16 * indice /* output: quantization indices */ + ); + +void Disf_ns( + Word16 * indice, /* input: quantization indices */ + Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */ + ); + +Word16 Sub_VQ( /* output: return quantization index */ + Word16 * x, /* input : ISF residual vector */ + Word16 * dico, /* input : quantization codebook */ + Word16 dim, /* input : dimention of vector */ + Word16 dico_size, /* input : size of quantization codebook */ + Word32 * distance /* output: error of quantization */ + ); + +void Reorder_isf( + Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */ + Word16 min_dist, /* (i) Q15 : minimum distance to keep */ + Word16 n /* (i) : number of ISF */ + ); + +/*-----------------------------------------------------------------* + * filter prototypes * + *-----------------------------------------------------------------*/ + +void Init_Decim_12k8( + Word16 mem[] /* output: memory (2*NB_COEF_DOWN) set to zeros */ + ); +void Decim_12k8( + Word16 sig16k[], /* input: signal to downsampling */ + Word16 lg, /* input: length of input */ + Word16 sig12k8[], /* output: decimated signal */ + Word16 mem[] /* in/out: memory (2*NB_COEF_DOWN) */ + ); + +void Init_HP50_12k8(Word16 mem[]); +void HP50_12k8( + Word16 signal[], /* input/output signal */ + Word16 lg, /* lenght of signal */ + Word16 mem[] /* filter memory [6] */ + ); +void Init_HP400_12k8(Word16 mem[]); +void HP400_12k8( + Word16 signal[], /* input/output signal */ + Word16 lg, /* lenght of signal */ + Word16 mem[] /* filter memory [6] */ + ); + +void Init_Filt_6k_7k(Word16 mem[]); +void Filt_6k_7k( + Word16 signal[], /* input: signal */ + Word16 lg, /* input: length of input */ + Word16 mem[] /* in/out: memory (size=30) */ + ); +void Filt_6k_7k_asm( + Word16 signal[], /* input: signal */ + Word16 lg, /* input: length of input */ + Word16 mem[] /* in/out: memory (size=30) */ + ); + +void LP_Decim2( + Word16 x[], /* in/out: signal to process */ + Word16 l, /* input : size of filtering */ + Word16 mem[] /* in/out: memory (size=3) */ + ); + +void Preemph( + Word16 x[], /* (i/o) : input signal overwritten by the output */ + Word16 mu, /* (i) Q15 : preemphasis coefficient */ + Word16 lg, /* (i) : lenght of filtering */ + Word16 * mem /* (i/o) : memory (x[-1]) */ + ); +void Preemph2( + Word16 x[], /* (i/o) : input signal overwritten by the output */ + Word16 mu, /* (i) Q15 : preemphasis coefficient */ + Word16 lg, /* (i) : lenght of filtering */ + Word16 * mem /* (i/o) : memory (x[-1]) */ + ); +void Deemph( + Word16 x[], /* (i/o) : input signal overwritten by the output */ + Word16 mu, /* (i) Q15 : deemphasis factor */ + Word16 L, /* (i) : vector size */ + Word16 * mem /* (i/o) : memory (y[-1]) */ + ); +void Deemph2( + Word16 x[], /* (i/o) : input signal overwritten by the output */ + Word16 mu, /* (i) Q15 : deemphasis factor */ + Word16 L, /* (i) : vector size */ + Word16 * mem /* (i/o) : memory (y[-1]) */ + ); +void Deemph_32( + Word16 x_hi[], /* (i) : input signal (bit31..16) */ + Word16 x_lo[], /* (i) : input signal (bit15..4) */ + Word16 y[], /* (o) : output signal (x16) */ + Word16 mu, /* (i) Q15 : deemphasis factor */ + Word16 L, /* (i) : vector size */ + Word16 * mem /* (i/o) : memory (y[-1]) */ + ); + +void Deemph_32_asm( + Word16 x_hi[], /* (i) : input signal (bit31..16) */ + Word16 x_lo[], /* (i) : input signal (bit15..4) */ + Word16 y[], /* (o) : output signal (x16) */ + Word16 * mem /* (i/o) : memory (y[-1]) */ + ); + +void Convolve( + Word16 x[], /* (i) : input vector */ + Word16 h[], /* (i) Q15 : impulse response */ + Word16 y[], /* (o) 12 bits: output vector */ + Word16 L /* (i) : vector size */ + ); + +void Convolve_asm( + Word16 x[], /* (i) : input vector */ + Word16 h[], /* (i) Q15 : impulse response */ + Word16 y[], /* (o) 12 bits: output vector */ + Word16 L /* (i) : vector size */ + ); + +void Residu( + Word16 a[], /* (i) Q12 : prediction coefficients */ + Word16 x[], /* (i) : speech (values x[-m..-1] are needed */ + Word16 y[], /* (o) : residual signal */ + Word16 lg /* (i) : size of filtering */ + ); + +void Residu_opt( + Word16 a[], /* (i) Q12 : prediction coefficients */ + Word16 x[], /* (i) : speech (values x[-m..-1] are needed */ + Word16 y[], /* (o) : residual signal */ + Word16 lg /* (i) : size of filtering */ + ); + +void Syn_filt( + Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ + Word16 x[], /* (i) : input signal */ + Word16 y[], /* (o) : output signal */ + Word16 lg, /* (i) : size of filtering */ + Word16 mem[], /* (i/o) : memory associated with this filtering. */ + Word16 update /* (i) : 0=no update, 1=update of memory. */ + ); + +void Syn_filt_asm( + Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ + Word16 x[], /* (i) : input signal */ + Word16 y[], /* (o) : output signal */ + Word16 mem[] /* (i/o) : memory associated with this filtering. */ + ); + +void Syn_filt_32( + Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ + Word16 m, /* (i) : order of LP filter */ + Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ + Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ + Word16 sig_hi[], /* (o) /16 : synthesis high */ + Word16 sig_lo[], /* (o) /16 : synthesis low */ + Word16 lg /* (i) : size of filtering */ + ); + +void Syn_filt_32_asm( + Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ + Word16 m, /* (i) : order of LP filter */ + Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ + Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ + Word16 sig_hi[], /* (o) /16 : synthesis high */ + Word16 sig_lo[], /* (o) /16 : synthesis low */ + Word16 lg /* (i) : size of filtering */ + ); +/*-----------------------------------------------------------------* + * pitch prototypes * + *-----------------------------------------------------------------*/ + +Word16 Pitch_ol( /* output: open loop pitch lag */ + Word16 signal[], /* input : signal used to compute the open loop pitch */ +/* signal[-pit_max] to signal[-1] should be known */ + Word16 pit_min, /* input : minimum pitch lag */ + Word16 pit_max, /* input : maximum pitch lag */ + Word16 L_frame /* input : length of frame to compute pitch */ +); + +Word16 Pitch_med_ol( /* output: open loop pitch lag */ + Word16 wsp[], /* input : signal used to compute the open loop pitch */ + /* wsp[-pit_max] to wsp[-1] should be known */ + Coder_State *st, /* i/o : global codec structure */ + Word16 L_frame /* input : length of frame to compute pitch */ +); + +Word16 Med_olag( /* output : median of 5 previous open-loop lags */ + Word16 prev_ol_lag, /* input : previous open-loop lag */ + Word16 old_ol_lag[5] +); + +void Init_Hp_wsp(Word16 mem[]); +void scale_mem_Hp_wsp(Word16 mem[], Word16 exp); +void Hp_wsp( + Word16 wsp[], /* i : wsp[] signal */ + Word16 hp_wsp[], /* o : hypass wsp[] */ + Word16 lg, /* i : lenght of signal */ + Word16 mem[] /* i/o : filter memory [9] */ +); + +Word16 Pitch_fr4( /* (o) : pitch period. */ + Word16 exc[], /* (i) : excitation buffer */ + Word16 xn[], /* (i) : target vector */ + Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */ + Word16 t0_min, /* (i) : minimum value in the searched range. */ + Word16 t0_max, /* (i) : maximum value in the searched range. */ + Word16 * pit_frac, /* (o) : chosen fraction (0, 1, 2 or 3). */ + Word16 i_subfr, /* (i) : indicator for first subframe. */ + Word16 t0_fr2, /* (i) : minimum value for resolution 1/2 */ + Word16 t0_fr1, /* (i) : minimum value for resolution 1 */ + Word16 L_subfr /* (i) : Length of subframe */ +); +void Pred_lt4( + Word16 exc[], /* in/out: excitation buffer */ + Word16 T0, /* input : integer pitch lag */ + Word16 frac, /* input : fraction of lag */ + Word16 L_subfr /* input : subframe size */ +); + +void pred_lt4_asm( + Word16 exc[], /* in/out: excitation buffer */ + Word16 T0, /* input : integer pitch lag */ + Word16 frac, /* input : fraction of lag */ + Word16 L_subfr /* input : subframe size */ +); + +/*-----------------------------------------------------------------* + * gain prototypes * + *-----------------------------------------------------------------*/ + +Word16 G_pitch( /* (o) Q14 : Gain of pitch lag saturated to 1.2 */ + Word16 xn[], /* (i) : Pitch target. */ + Word16 y1[], /* (i) : filtered adaptive codebook. */ + Word16 g_coeff[], /* : Correlations need for gain quantization. */ + Word16 L_subfr /* : Length of subframe. */ +); +void Init_Q_gain2( + Word16 * mem /* output :static memory (2 words) */ +); +Word16 Q_gain2( /* Return index of quantization. */ + Word16 xn[], /* (i) Q_xn:Target vector. */ + Word16 y1[], /* (i) Q_xn:Adaptive codebook. */ + Word16 Q_xn, /* (i) :xn and y1 format */ + Word16 y2[], /* (i) Q9 :Filtered innovative vector. */ + Word16 code[], /* (i) Q9 :Innovative vector. */ + Word16 g_coeff[], /* (i) :Correlations */ +/* Compute in G_pitch(). */ + Word16 L_subfr, /* (i) :Subframe lenght. */ + Word16 nbits, /* (i) : number of bits (6 or 7) */ + Word16 * gain_pit, /* (i/o)Q14:Pitch gain. */ + Word32 * gain_cod, /* (o) Q16 :Code gain. */ + Word16 gp_clip, /* (i) : Gp Clipping flag */ + Word16 * mem /* (i/o) :static memory (2 words) */ +); + +void Init_D_gain2( + Word16 * mem /* output :static memory (4 words) */ +); +void D_gain2( + Word16 index, /* (i) :index of quantization. */ + Word16 nbits, /* (i) : number of bits (6 or 7) */ + Word16 code[], /* (i) Q9 :Innovative vector. */ + Word16 L_subfr, /* (i) :Subframe lenght. */ + Word16 * gain_pit, /* (o) Q14 :Pitch gain. */ + Word32 * gain_cod, /* (o) Q16 :Code gain. */ + Word16 bfi, /* (i) :bad frame indicator */ + Word16 prev_bfi, /* (i) : Previous BF indicator */ + Word16 state, /* (i) : State of BFH */ + Word16 unusable_frame, /* (i) : UF indicator */ + Word16 vad_hist, /* (i) :number of non-speech frames */ + Word16 * mem /* (i/o) :static memory (4 words) */ +); + +/*-----------------------------------------------------------------* + * acelp prototypes * + *-----------------------------------------------------------------*/ + +void cor_h_x( + Word16 h[], /* (i) Q12 : impulse response of weighted synthesis filter */ + Word16 x[], /* (i) Q0 : target vector */ + Word16 dn[] /* (o) <12bit : correlation between target and h[] */ +); +void ACELP_2t64_fx( + Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */ + Word16 cn[], /* (i) <12b : residual after long term prediction */ + Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */ + Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */ + Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */ + Word16 * index /* (o) : index (12): 5+1+5+1 = 11 bits. */ +); + +void ACELP_4t64_fx( + Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */ + Word16 cn[], /* (i) <12b : residual after long term prediction */ + Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */ + Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */ + Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */ + Word16 nbbits, /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits */ + Word16 ser_size, /* (i) : bit rate */ + Word16 _index[] /* (o) : index (20): 5+5+5+5 = 20 bits. */ + /* (o) : index (36): 9+9+9+9 = 36 bits. */ + /* (o) : index (44): 13+9+13+9 = 44 bits. */ + /* (o) : index (52): 13+13+13+13 = 52 bits. */ + /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits. */ + /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits. */ + /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */ +); + +void Pit_shrp( + Word16 * x, /* in/out: impulse response (or algebraic code) */ + Word16 pit_lag, /* input : pitch lag */ + Word16 sharp, /* input : pitch sharpening factor (Q15) */ + Word16 L_subfr /* input : subframe size */ +); + + +/*-----------------------------------------------------------------* + * others prototypes * + *-----------------------------------------------------------------*/ + +void Copy( + Word16 x[], /* (i) : input vector */ + Word16 y[], /* (o) : output vector */ + Word16 L /* (i) : vector length */ +); +void Set_zero( + Word16 x[], /* (o) : vector to clear */ + Word16 L /* (i) : length of vector */ +); +void Updt_tar( + Word16 * x, /* (i) Q0 : old target (for pitch search) */ + Word16 * x2, /* (o) Q0 : new target (for codebook search) */ + Word16 * y, /* (i) Q0 : filtered adaptive codebook vector */ + Word16 gain, /* (i) Q14 : adaptive codebook gain */ + Word16 L /* (i) : subframe size */ +); +Word16 voice_factor( /* (o) Q15 : factor (-1=unvoiced to 1=voiced) */ + Word16 exc[], /* (i) Q_exc: pitch excitation */ + Word16 Q_exc, /* (i) : exc format */ + Word16 gain_pit, /* (i) Q14 : gain of pitch */ + Word16 code[], /* (i) Q9 : Fixed codebook excitation */ + Word16 gain_code, /* (i) Q0 : gain of code */ + Word16 L_subfr /* (i) : subframe length */ +); +void Scale_sig( + Word16 x[], /* (i/o) : signal to scale */ + Word16 lg, /* (i) : size of x[] */ + Word16 exp /* (i) : exponent: x = round(x << exp) */ +); + +void Scale_sig_opt( + Word16 x[], /* (i/o) : signal to scale */ + Word16 lg, /* (i) : size of x[] */ + Word16 exp /* (i) : exponent: x = round(x << exp) */ +); + +Word16 Random(Word16 * seed); + +void Init_gp_clip( + Word16 mem[] /* (o) : memory of gain of pitch clipping algorithm */ +); +Word16 Gp_clip( + Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ +); +void Gp_clip_test_isf( + Word16 isf[], /* (i) : isf values (in frequency domain) */ + Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ +); +void Gp_clip_test_gain_pit( + Word16 gain_pit, /* (i) : gain of quantized pitch */ + Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ +); + + +#endif //__ACELP_H__ + diff --git a/media/libstagefright/codecs/amrwbenc/inc/basic_op.h b/media/libstagefright/codecs/amrwbenc/inc/basic_op.h index 6a2f860..7734913 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/basic_op.h +++ b/media/libstagefright/codecs/amrwbenc/inc/basic_op.h @@ -1,1094 +1,1094 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -#ifndef __BASIC_OP_H__ -#define __BASIC_OP_H__ - -#include -#include -#include "typedef.h" - -#define MAX_32 (Word32)0x7fffffffL -#define MIN_32 (Word32)0x80000000L - -#define MAX_16 (Word16)+32767 /* 0x7fff */ -#define MIN_16 (Word16)-32768 /* 0x8000 */ - - -#ifdef LINUX -#define static_vo static __inline__ -#else -#define static_vo static __inline -#endif - -#define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff))) - -#define abs_s(x) ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16)) /* Short abs, 1 */ -#define L_deposit_h(x) (((Word32)(x)) << 16) /* 16 bit var1 -> MSB, 2 */ -#define L_deposit_l(x) ((Word32)(x)) /* 16 bit var1 -> LSB, 2 */ -#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32) /* Long abs, 3*/ -#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1)))) /* Short negate, 1*/ -#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1))) /* Long negate, 2*/ - - -#define extract_h(a) ((Word16)(a >> 16)) -#define extract_l(x) (Word16)((x)) -#define add1(a,b) (a + b) -#define vo_L_msu(a,b,c) ( a - (( b * c ) << 1) ) -#define vo_mult32(a, b) ((a) * (b)) -#define vo_mult(a,b) (( a * b ) >> 15 ) -#define vo_L_mult(a,b) (((a) * (b)) << 1) -#define vo_shr_r(var1, var2) ((var1+((Word16)(1L<<(var2-1))))>>var2) -#define vo_sub(a,b) (a - b) -#define vo_L_deposit_h(a) ((Word32)((a) << 16)) -#define vo_round(a) ((a + 0x00008000) >> 16) -#define vo_extract_l(a) ((Word16)(a)) -#define vo_L_add(a,b) (a + b) -#define vo_L_sub(a,b) (a - b) -#define vo_mult_r(a,b) ((( a * b ) + 0x4000 ) >> 15 ) -#define vo_negate(a) (-a) -#define vo_L_shr_r(L_var1, var2) ((L_var1+((Word32)(1L<<(var2-1))))>>var2) - - -/*___________________________________________________________________________ -| | -| Prototypes for basic arithmetic operators | -|___________________________________________________________________________| -*/ -static_vo Word16 add (Word16 var1, Word16 var2); /* Short add,1 */ -static_vo Word16 sub (Word16 var1, Word16 var2); /* Short sub,1 */ -static_vo Word16 shl (Word16 var1, Word16 var2); /* Short shift left, 1 */ -static_vo Word16 shr (Word16 var1, Word16 var2); /* Short shift right, 1 */ -static_vo Word16 mult (Word16 var1, Word16 var2); /* Short mult, 1 */ -static_vo Word32 L_mult (Word16 var1, Word16 var2); /* Long mult, 1 */ -static_vo Word16 voround (Word32 L_var1); /* Round, 1 */ -static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2); /* Mac, 1 */ -static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2); /* Msu, 1 */ -static_vo Word32 L_add (Word32 L_var1, Word32 L_var2); /* Long add, 2 */ -static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2); /* Long sub, 2 */ -static_vo Word16 mult_r (Word16 var1, Word16 var2); /* Mult with round, 2 */ -static_vo Word32 L_shl2(Word32 L_var1, Word16 var2); /* var2 > 0*/ -static_vo Word32 L_shl (Word32 L_var1, Word16 var2); /* Long shift left, 2 */ -static_vo Word32 L_shr (Word32 L_var1, Word16 var2); /* Long shift right, 2*/ -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 */ - -/*___________________________________________________________________________ -| | -| Functions | -|___________________________________________________________________________| -*/ -/*___________________________________________________________________________ -| | -| Function Name : add | -| | -| Purpose : | -| | -| Performs the addition (var1+var2) with overflow control and saturation;| -| the 16 bit result is set at +32767 when overflow occurs or at -32768 | -| when underflow occurs. | -| | -| Complexity weight : 1 | -| | -| Inputs : | -| | -| var1 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| var2 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| var_out | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | -|___________________________________________________________________________| -*/ -static_vo Word16 add (Word16 var1, Word16 var2) -{ - Word16 var_out; - Word32 L_sum; - L_sum = (Word32) var1 + var2; - var_out = saturate (L_sum); - return (var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : sub | -| | -| Purpose : | -| | -| Performs the subtraction (var1+var2) with overflow control and satu- | -| ration; the 16 bit result is set at +32767 when overflow occurs or at | -| -32768 when underflow occurs. | -| | -| Complexity weight : 1 | -| | -| Inputs : | -| | -| var1 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| var2 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| var_out | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | -|___________________________________________________________________________| -*/ - -static_vo Word16 sub (Word16 var1, Word16 var2) -{ - Word16 var_out; - Word32 L_diff; - L_diff = (Word32) var1 - var2; - var_out = saturate (L_diff); - return (var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : shl | -| | -| Purpose : | -| | -| Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill| -| the var2 LSB of the result. If var2 is negative, arithmetically shift | -| var1 right by -var2 with sign extension. Saturate the result in case of | -| underflows or overflows. | -| | -| Complexity weight : 1 | -| | -| Inputs : | -| | -| var1 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| var2 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| var_out | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | -|___________________________________________________________________________| -*/ - -static_vo Word16 shl (Word16 var1, Word16 var2) -{ - Word16 var_out; - Word32 result; - if (var2 < 0) - { - if (var2 < -16) - var2 = -16; - var_out = var1 >> ((Word16)-var2); - } - else - { - result = (Word32) var1 *((Word32) 1 << var2); - if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result))) - { - var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16); - } - else - { - var_out = extract_l (result); - } - } - return (var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : shr | -| | -| Purpose : | -| | -| Arithmetically shift the 16 bit input var1 right var2 positions with | -| sign extension. If var2 is negative, arithmetically shift var1 left by | -| -var2 with sign extension. Saturate the result in case of underflows or | -| overflows. | -| | -| Complexity weight : 1 | -| | -| Inputs : | -| | -| var1 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| var2 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| var_out | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | -|___________________________________________________________________________| -*/ - -static_vo Word16 shr (Word16 var1, Word16 var2) -{ - Word16 var_out; - if (var2 < 0) - { - if (var2 < -16) - var2 = -16; - var_out = shl(var1, (Word16)-var2); - } - else - { - if (var2 >= 15) - { - var_out = (Word16)((var1 < 0) ? -1 : 0); - } - else - { - if (var1 < 0) - { - var_out = (Word16)(~((~var1) >> var2)); - } - else - { - var_out = (Word16)(var1 >> var2); - } - } - } - return (var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : mult | -| | -| Purpose : | -| | -| Performs the multiplication of var1 by var2 and gives a 16 bit result | -| which is scaled i.e.: | -| mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and | -| mult(-32768,-32768) = 32767. | -| | -| Complexity weight : 1 | -| | -| Inputs : | -| | -| var1 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| var2 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| var_out | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | -|___________________________________________________________________________| -*/ - -static_vo Word16 mult (Word16 var1, Word16 var2) -{ - Word16 var_out; - Word32 L_product; - L_product = (Word32) var1 *(Word32) var2; - L_product = (L_product & (Word32) 0xffff8000L) >> 15; - if (L_product & (Word32) 0x00010000L) - L_product = L_product | (Word32) 0xffff0000L; - var_out = saturate (L_product); - return (var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : L_mult | -| | -| Purpose : | -| | -| L_mult is the 32 bit result of the multiplication of var1 times var2 | -| with one shift left i.e.: | -| L_mult(var1,var2) = L_shl((var1 times var2),1) and | -| L_mult(-32768,-32768) = 2147483647. | -| | -| Complexity weight : 1 | -| | -| Inputs : | -| | -| var1 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| var2 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| L_var_out | -| 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | -|___________________________________________________________________________| -*/ - -static_vo Word32 L_mult (Word16 var1, Word16 var2) -{ - Word32 L_var_out; - L_var_out = (Word32) var1 *(Word32) var2; - if (L_var_out != (Word32) 0x40000000L) - { - L_var_out *= 2; - } - else - { - L_var_out = MAX_32; - } - return (L_var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : round | -| | -| Purpose : | -| | -| Round the lower 16 bits of the 32 bit input number into the MS 16 bits | -| with saturation. Shift the resulting bits right by 16 and return the 16 | -| bit number: | -| round(L_var1) = extract_h(L_add(L_var1,32768)) | -| | -| Complexity weight : 1 | -| | -| Inputs : | -| | -| L_var1 | -| 32 bit long signed integer (Word32 ) whose value falls in the | -| range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| var_out | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | -|___________________________________________________________________________| -*/ - -static_vo Word16 voround (Word32 L_var1) -{ - Word16 var_out; - Word32 L_rounded; - L_rounded = L_add (L_var1, (Word32) 0x00008000L); - var_out = extract_h (L_rounded); - return (var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : L_mac | -| | -| Purpose : | -| | -| Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | -| result to L_var3 with saturation, return a 32 bit result: | -| L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)). | -| | -| Complexity weight : 1 | -| | -| Inputs : | -| | -| L_var3 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | -| | -| var1 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| var2 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| L_var_out | -| 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | -|___________________________________________________________________________| -*/ - -static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2) -{ - Word32 L_var_out; - Word32 L_product; - L_product = ((var1 * var2) << 1); - L_var_out = L_add (L_var3, L_product); - return (L_var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : L_msu | -| | -| Purpose : | -| | -| Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | -| bit result to L_var3 with saturation, return a 32 bit result: | -| L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)). | -| | -| Complexity weight : 1 | -| | -| Inputs : | -| | -| L_var3 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | -| | -| var1 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| var2 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| L_var_out | -| 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | -|___________________________________________________________________________| -*/ - -static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2) -{ - Word32 L_var_out; - Word32 L_product; - L_product = (var1 * var2)<<1; - L_var_out = L_sub (L_var3, L_product); - return (L_var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : L_add | -| | -| Purpose : | -| | -| 32 bits addition of the two 32 bits variables (L_var1+L_var2) with | -| overflow control and saturation; the result is set at +2147483647 when | -| overflow occurs or at -2147483648 when underflow occurs. | -| | -| Complexity weight : 2 | -| | -| Inputs : | -| | -| L_var1 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | -| | -| L_var2 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| L_var_out | -| 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | -|___________________________________________________________________________| -*/ - -static_vo Word32 L_add (Word32 L_var1, Word32 L_var2) -{ - Word32 L_var_out; - L_var_out = L_var1 + L_var2; - if (((L_var1 ^ L_var2) & MIN_32) == 0) - { - if ((L_var_out ^ L_var1) & MIN_32) - { - L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32; - } - } - return (L_var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : L_sub | -| | -| Purpose : | -| | -| 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with | -| overflow control and saturation; the result is set at +2147483647 when | -| overflow occurs or at -2147483648 when underflow occurs. | -| | -| Complexity weight : 2 | -| | -| Inputs : | -| | -| L_var1 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | -| | -| L_var2 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| L_var_out | -| 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | -|___________________________________________________________________________| -*/ - -static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2) -{ - Word32 L_var_out; - L_var_out = L_var1 - L_var2; - if (((L_var1 ^ L_var2) & MIN_32) != 0) - { - if ((L_var_out ^ L_var1) & MIN_32) - { - L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32; - } - } - return (L_var_out); -} - - -/*___________________________________________________________________________ -| | -| Function Name : mult_r | -| | -| Purpose : | -| | -| Same as mult with rounding, i.e.: | -| mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and | -| mult_r(-32768,-32768) = 32767. | -| | -| Complexity weight : 2 | -| | -| Inputs : | -| | -| var1 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| var2 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| var_out | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | -|___________________________________________________________________________| -*/ - -static_vo Word16 mult_r (Word16 var1, Word16 var2) -{ - Word16 var_out; - Word32 L_product_arr; - L_product_arr = (Word32) var1 *(Word32) var2; /* product */ - L_product_arr += (Word32) 0x00004000L; /* round */ - L_product_arr &= (Word32) 0xffff8000L; - L_product_arr >>= 15; /* shift */ - if (L_product_arr & (Word32) 0x00010000L) /* sign extend when necessary */ - { - L_product_arr |= (Word32) 0xffff0000L; - } - var_out = saturate (L_product_arr); - return (var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : L_shl | -| | -| Purpose : | -| | -| Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero | -| fill the var2 LSB of the result. If var2 is negative, arithmetically | -| shift L_var1 right by -var2 with sign extension. Saturate the result in | -| case of underflows or overflows. | -| | -| Complexity weight : 2 | -| | -| Inputs : | -| | -| L_var1 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | -| | -| var2 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| L_var_out | -| 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | -|___________________________________________________________________________| -*/ - -static_vo Word32 L_shl (Word32 L_var1, Word16 var2) -{ - Word32 L_var_out = 0L; - if (var2 <= 0) - { - if (var2 < -32) - var2 = -32; - L_var_out = (L_var1 >> (Word16)-var2); - } - else - { - for (; var2 > 0; var2--) - { - if (L_var1 > (Word32) 0X3fffffffL) - { - L_var_out = MAX_32; - break; - } - else - { - if (L_var1 < (Word32) 0xc0000000L) - { - //Overflow = 1; - L_var_out = MIN_32; - break; - } - } - L_var1 *= 2; - L_var_out = L_var1; - } - } - return (L_var_out); -} - -static_vo Word32 L_shl2(Word32 L_var1, Word16 var2) -{ - Word32 L_var_out = 0L; - - for (; var2 > 0; var2--) - { - if (L_var1 > (Word32) 0X3fffffffL) - { - L_var_out = MAX_32; - break; - } - else - { - if (L_var1 < (Word32) 0xc0000000L) - { - L_var_out = MIN_32; - break; - } - } - L_var1 <<=1 ; - L_var_out = L_var1; - } - return (L_var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : L_shr | -| | -| Purpose : | -| | -| Arithmetically shift the 32 bit input L_var1 right var2 positions with | -| sign extension. If var2 is negative, arithmetically shift L_var1 left | -| by -var2 and zero fill the -var2 LSB of the result. Saturate the result | -| in case of underflows or overflows. | -| | -| Complexity weight : 2 | -| | -| Inputs : | -| | -| L_var1 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | -| | -| var2 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| L_var_out | -| 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | -|___________________________________________________________________________| -*/ - -static_vo Word32 L_shr (Word32 L_var1, Word16 var2) -{ - Word32 L_var_out; - if (var2 < 0) - { - if (var2 < -32) - var2 = -32; - L_var_out = L_shl2(L_var1, (Word16)-var2); - } - else - { - if (var2 >= 31) - { - L_var_out = (L_var1 < 0L) ? -1 : 0; - } - else - { - if (L_var1 < 0) - { - L_var_out = ~((~L_var1) >> var2); - } - else - { - L_var_out = L_var1 >> var2; - } - } - } - return (L_var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : L_shr_r | -| | -| Purpose : | -| | -| Same as L_shr(L_var1,var2) but with rounding. Saturate the result in | -| case of underflows or overflows : | -| - If var2 is greater than zero : | -| if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))| -| is equal to zero | -| then | -| L_shr_r(L_var1,var2) = L_shr(L_var1,var2) | -| else | -| L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1) | -| - If var2 is less than or equal to zero : | -| L_shr_r(L_var1,var2) = L_shr(L_var1,var2). | -| | -| Complexity weight : 3 | -| | -| Inputs : | -| | -| L_var1 | -| 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= var1 <= 0x7fff ffff. | -| | -| var2 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| L_var_out | -| 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= var_out <= 0x7fff ffff. | -|___________________________________________________________________________| -*/ - -static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2) -{ - Word32 L_var_out; - if (var2 > 31) - { - L_var_out = 0; - } - else - { - L_var_out = L_shr (L_var1, var2); - if (var2 > 0) - { - if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0) - { - L_var_out++; - } - } - } - return (L_var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : norm_s | -| | -| Purpose : | -| | -| Produces the number of left shift needed to normalize the 16 bit varia- | -| ble var1 for positive values on the interval with minimum of 16384 and | -| maximum of 32767, and for negative values on the interval with minimum | -| of -32768 and maximum of -16384; in order to normalize the result, the | -| following operation must be done : | -| norm_var1 = shl(var1,norm_s(var1)). | -| | -| Complexity weight : 15 | -| | -| Inputs : | -| | -| var1 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| var_out | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0x0000 0000 <= var_out <= 0x0000 000f. | -|___________________________________________________________________________| -*/ - -static_vo Word16 norm_s (Word16 var1) -{ - Word16 var_out = 0; - if (var1 == 0) - { - var_out = 0; - } - else - { - if (var1 == -1) - { - var_out = 15; - } - else - { - if (var1 < 0) - { - var1 = (Word16)~var1; - } - for (var_out = 0; var1 < 0x4000; var_out++) - { - var1 <<= 1; - } - } - } - return (var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : div_s | -| | -| Purpose : | -| | -| Produces a result which is the fractional integer division of var1 by | -| var2; var1 and var2 must be positive and var2 must be greater or equal | -| to var1; the result is positive (leading bit equal to 0) and truncated | -| to 16 bits. | -| If var1 = var2 then div(var1,var2) = 32767. | -| | -| Complexity weight : 18 | -| | -| Inputs : | -| | -| var1 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0x0000 0000 <= var1 <= var2 and var2 != 0. | -| | -| var2 | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : var1 <= var2 <= 0x0000 7fff and var2 != 0. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| var_out | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0x0000 0000 <= var_out <= 0x0000 7fff. | -| It's a Q15 value (point between b15 and b14). | -|___________________________________________________________________________| -*/ - -static_vo Word16 div_s (Word16 var1, Word16 var2) -{ - Word16 var_out = 0; - Word16 iteration; - Word32 L_num; - Word32 L_denom; - if ((var1 < 0) || (var2 < 0)) - { - var_out = MAX_16; - return var_out; - } - if (var2 == 0) - { - var_out = MAX_16; - return var_out; - } - if (var1 == 0) - { - var_out = 0; - } - else - { - if (var1 == var2) - { - var_out = MAX_16; - } - else - { - L_num = L_deposit_l (var1); - L_denom = L_deposit_l(var2); - for (iteration = 0; iteration < 15; iteration++) - { - var_out <<= 1; - L_num <<= 1; - if (L_num >= L_denom) - { - L_num -= L_denom; - var_out += 1; - } - } - } - } - return (var_out); -} - -/*___________________________________________________________________________ -| | -| Function Name : norm_l | -| | -| Purpose : | -| | -| Produces the number of left shifts needed to normalize the 32 bit varia-| -| ble L_var1 for positive values on the interval with minimum of | -| 1073741824 and maximum of 2147483647, and for negative values on the in-| -| terval with minimum of -2147483648 and maximum of -1073741824; in order | -| to normalize the result, the following operation must be done : | -| norm_L_var1 = L_shl(L_var1,norm_l(L_var1)). | -| | -| Complexity weight : 30 | -| | -| Inputs : | -| | -| L_var1 | -| 32 bit long signed integer (Word32) whose value falls in the | -| range : 0x8000 0000 <= var1 <= 0x7fff ffff. | -| | -| Outputs : | -| | -| none | -| | -| Return Value : | -| | -| var_out | -| 16 bit short signed integer (Word16) whose value falls in the | -| range : 0x0000 0000 <= var_out <= 0x0000 001f. | -|___________________________________________________________________________| -*/ - -static_vo Word16 norm_l (Word32 L_var1) -{ - Word16 var_out = 0; - if (L_var1 != 0) - { - var_out = 31; - if (L_var1 != (Word32) 0xffffffffL) - { - L_var1 ^= (L_var1 >>31); - for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++) - { - L_var1 <<= 1; - } - } - } - return (var_out); -} - -#endif //__BASIC_OP_H__ - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +#ifndef __BASIC_OP_H__ +#define __BASIC_OP_H__ + +#include +#include +#include "typedef.h" + +#define MAX_32 (Word32)0x7fffffffL +#define MIN_32 (Word32)0x80000000L + +#define MAX_16 (Word16)+32767 /* 0x7fff */ +#define MIN_16 (Word16)-32768 /* 0x8000 */ + + +#ifdef LINUX +#define static_vo static __inline__ +#else +#define static_vo static __inline +#endif + +#define saturate(L_var1) (((L_var1) > 0X00007fffL) ? (MAX_16): (((L_var1) < (Word32) 0xffff8000L) ? (MIN_16): ((L_var1) & 0xffff))) + +#define abs_s(x) ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16)) /* Short abs, 1 */ +#define L_deposit_h(x) (((Word32)(x)) << 16) /* 16 bit var1 -> MSB, 2 */ +#define L_deposit_l(x) ((Word32)(x)) /* 16 bit var1 -> LSB, 2 */ +#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32) /* Long abs, 3*/ +#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1)))) /* Short negate, 1*/ +#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1))) /* Long negate, 2*/ + + +#define extract_h(a) ((Word16)(a >> 16)) +#define extract_l(x) (Word16)((x)) +#define add1(a,b) (a + b) +#define vo_L_msu(a,b,c) ( a - (( b * c ) << 1) ) +#define vo_mult32(a, b) ((a) * (b)) +#define vo_mult(a,b) (( a * b ) >> 15 ) +#define vo_L_mult(a,b) (((a) * (b)) << 1) +#define vo_shr_r(var1, var2) ((var1+((Word16)(1L<<(var2-1))))>>var2) +#define vo_sub(a,b) (a - b) +#define vo_L_deposit_h(a) ((Word32)((a) << 16)) +#define vo_round(a) ((a + 0x00008000) >> 16) +#define vo_extract_l(a) ((Word16)(a)) +#define vo_L_add(a,b) (a + b) +#define vo_L_sub(a,b) (a - b) +#define vo_mult_r(a,b) ((( a * b ) + 0x4000 ) >> 15 ) +#define vo_negate(a) (-a) +#define vo_L_shr_r(L_var1, var2) ((L_var1+((Word32)(1L<<(var2-1))))>>var2) + + +/*___________________________________________________________________________ +| | +| Prototypes for basic arithmetic operators | +|___________________________________________________________________________| +*/ +static_vo Word16 add (Word16 var1, Word16 var2); /* Short add,1 */ +static_vo Word16 sub (Word16 var1, Word16 var2); /* Short sub,1 */ +static_vo Word16 shl (Word16 var1, Word16 var2); /* Short shift left, 1 */ +static_vo Word16 shr (Word16 var1, Word16 var2); /* Short shift right, 1 */ +static_vo Word16 mult (Word16 var1, Word16 var2); /* Short mult, 1 */ +static_vo Word32 L_mult (Word16 var1, Word16 var2); /* Long mult, 1 */ +static_vo Word16 voround (Word32 L_var1); /* Round, 1 */ +static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2); /* Mac, 1 */ +static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2); /* Msu, 1 */ +static_vo Word32 L_add (Word32 L_var1, Word32 L_var2); /* Long add, 2 */ +static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2); /* Long sub, 2 */ +static_vo Word16 mult_r (Word16 var1, Word16 var2); /* Mult with round, 2 */ +static_vo Word32 L_shl2(Word32 L_var1, Word16 var2); /* var2 > 0*/ +static_vo Word32 L_shl (Word32 L_var1, Word16 var2); /* Long shift left, 2 */ +static_vo Word32 L_shr (Word32 L_var1, Word16 var2); /* Long shift right, 2*/ +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 */ + +/*___________________________________________________________________________ +| | +| Functions | +|___________________________________________________________________________| +*/ +/*___________________________________________________________________________ +| | +| Function Name : add | +| | +| Purpose : | +| | +| Performs the addition (var1+var2) with overflow control and saturation;| +| the 16 bit result is set at +32767 when overflow occurs or at -32768 | +| when underflow occurs. | +| | +| Complexity weight : 1 | +| | +| Inputs : | +| | +| var1 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| var_out | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | +|___________________________________________________________________________| +*/ +static_vo Word16 add (Word16 var1, Word16 var2) +{ + Word16 var_out; + Word32 L_sum; + L_sum = (Word32) var1 + var2; + var_out = saturate (L_sum); + return (var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : sub | +| | +| Purpose : | +| | +| Performs the subtraction (var1+var2) with overflow control and satu- | +| ration; the 16 bit result is set at +32767 when overflow occurs or at | +| -32768 when underflow occurs. | +| | +| Complexity weight : 1 | +| | +| Inputs : | +| | +| var1 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| var_out | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | +|___________________________________________________________________________| +*/ + +static_vo Word16 sub (Word16 var1, Word16 var2) +{ + Word16 var_out; + Word32 L_diff; + L_diff = (Word32) var1 - var2; + var_out = saturate (L_diff); + return (var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : shl | +| | +| Purpose : | +| | +| Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill| +| the var2 LSB of the result. If var2 is negative, arithmetically shift | +| var1 right by -var2 with sign extension. Saturate the result in case of | +| underflows or overflows. | +| | +| Complexity weight : 1 | +| | +| Inputs : | +| | +| var1 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| var_out | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | +|___________________________________________________________________________| +*/ + +static_vo Word16 shl (Word16 var1, Word16 var2) +{ + Word16 var_out; + Word32 result; + if (var2 < 0) + { + if (var2 < -16) + var2 = -16; + var_out = var1 >> ((Word16)-var2); + } + else + { + result = (Word32) var1 *((Word32) 1 << var2); + if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result))) + { + var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16); + } + else + { + var_out = extract_l (result); + } + } + return (var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : shr | +| | +| Purpose : | +| | +| Arithmetically shift the 16 bit input var1 right var2 positions with | +| sign extension. If var2 is negative, arithmetically shift var1 left by | +| -var2 with sign extension. Saturate the result in case of underflows or | +| overflows. | +| | +| Complexity weight : 1 | +| | +| Inputs : | +| | +| var1 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| var_out | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | +|___________________________________________________________________________| +*/ + +static_vo Word16 shr (Word16 var1, Word16 var2) +{ + Word16 var_out; + if (var2 < 0) + { + if (var2 < -16) + var2 = -16; + var_out = shl(var1, (Word16)-var2); + } + else + { + if (var2 >= 15) + { + var_out = (Word16)((var1 < 0) ? -1 : 0); + } + else + { + if (var1 < 0) + { + var_out = (Word16)(~((~var1) >> var2)); + } + else + { + var_out = (Word16)(var1 >> var2); + } + } + } + return (var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : mult | +| | +| Purpose : | +| | +| Performs the multiplication of var1 by var2 and gives a 16 bit result | +| which is scaled i.e.: | +| mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and | +| mult(-32768,-32768) = 32767. | +| | +| Complexity weight : 1 | +| | +| Inputs : | +| | +| var1 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| var_out | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | +|___________________________________________________________________________| +*/ + +static_vo Word16 mult (Word16 var1, Word16 var2) +{ + Word16 var_out; + Word32 L_product; + L_product = (Word32) var1 *(Word32) var2; + L_product = (L_product & (Word32) 0xffff8000L) >> 15; + if (L_product & (Word32) 0x00010000L) + L_product = L_product | (Word32) 0xffff0000L; + var_out = saturate (L_product); + return (var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : L_mult | +| | +| Purpose : | +| | +| L_mult is the 32 bit result of the multiplication of var1 times var2 | +| with one shift left i.e.: | +| L_mult(var1,var2) = L_shl((var1 times var2),1) and | +| L_mult(-32768,-32768) = 2147483647. | +| | +| Complexity weight : 1 | +| | +| Inputs : | +| | +| var1 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| L_var_out | +| 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | +|___________________________________________________________________________| +*/ + +static_vo Word32 L_mult (Word16 var1, Word16 var2) +{ + Word32 L_var_out; + L_var_out = (Word32) var1 *(Word32) var2; + if (L_var_out != (Word32) 0x40000000L) + { + L_var_out *= 2; + } + else + { + L_var_out = MAX_32; + } + return (L_var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : round | +| | +| Purpose : | +| | +| Round the lower 16 bits of the 32 bit input number into the MS 16 bits | +| with saturation. Shift the resulting bits right by 16 and return the 16 | +| bit number: | +| round(L_var1) = extract_h(L_add(L_var1,32768)) | +| | +| Complexity weight : 1 | +| | +| Inputs : | +| | +| L_var1 | +| 32 bit long signed integer (Word32 ) whose value falls in the | +| range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| var_out | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | +|___________________________________________________________________________| +*/ + +static_vo Word16 voround (Word32 L_var1) +{ + Word16 var_out; + Word32 L_rounded; + L_rounded = L_add (L_var1, (Word32) 0x00008000L); + var_out = extract_h (L_rounded); + return (var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : L_mac | +| | +| Purpose : | +| | +| Multiply var1 by var2 and shift the result left by 1. Add the 32 bit | +| result to L_var3 with saturation, return a 32 bit result: | +| L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)). | +| | +| Complexity weight : 1 | +| | +| Inputs : | +| | +| L_var3 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | +| | +| var1 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| L_var_out | +| 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | +|___________________________________________________________________________| +*/ + +static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2) +{ + Word32 L_var_out; + Word32 L_product; + L_product = ((var1 * var2) << 1); + L_var_out = L_add (L_var3, L_product); + return (L_var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : L_msu | +| | +| Purpose : | +| | +| Multiply var1 by var2 and shift the result left by 1. Subtract the 32 | +| bit result to L_var3 with saturation, return a 32 bit result: | +| L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)). | +| | +| Complexity weight : 1 | +| | +| Inputs : | +| | +| L_var3 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | +| | +| var1 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| L_var_out | +| 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | +|___________________________________________________________________________| +*/ + +static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2) +{ + Word32 L_var_out; + Word32 L_product; + L_product = (var1 * var2)<<1; + L_var_out = L_sub (L_var3, L_product); + return (L_var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : L_add | +| | +| Purpose : | +| | +| 32 bits addition of the two 32 bits variables (L_var1+L_var2) with | +| overflow control and saturation; the result is set at +2147483647 when | +| overflow occurs or at -2147483648 when underflow occurs. | +| | +| Complexity weight : 2 | +| | +| Inputs : | +| | +| L_var1 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | +| | +| L_var2 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| L_var_out | +| 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | +|___________________________________________________________________________| +*/ + +static_vo Word32 L_add (Word32 L_var1, Word32 L_var2) +{ + Word32 L_var_out; + L_var_out = L_var1 + L_var2; + if (((L_var1 ^ L_var2) & MIN_32) == 0) + { + if ((L_var_out ^ L_var1) & MIN_32) + { + L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32; + } + } + return (L_var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : L_sub | +| | +| Purpose : | +| | +| 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with | +| overflow control and saturation; the result is set at +2147483647 when | +| overflow occurs or at -2147483648 when underflow occurs. | +| | +| Complexity weight : 2 | +| | +| Inputs : | +| | +| L_var1 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | +| | +| L_var2 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| L_var_out | +| 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | +|___________________________________________________________________________| +*/ + +static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2) +{ + Word32 L_var_out; + L_var_out = L_var1 - L_var2; + if (((L_var1 ^ L_var2) & MIN_32) != 0) + { + if ((L_var_out ^ L_var1) & MIN_32) + { + L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32; + } + } + return (L_var_out); +} + + +/*___________________________________________________________________________ +| | +| Function Name : mult_r | +| | +| Purpose : | +| | +| Same as mult with rounding, i.e.: | +| mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and | +| mult_r(-32768,-32768) = 32767. | +| | +| Complexity weight : 2 | +| | +| Inputs : | +| | +| var1 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| var_out | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var_out <= 0x0000 7fff. | +|___________________________________________________________________________| +*/ + +static_vo Word16 mult_r (Word16 var1, Word16 var2) +{ + Word16 var_out; + Word32 L_product_arr; + L_product_arr = (Word32) var1 *(Word32) var2; /* product */ + L_product_arr += (Word32) 0x00004000L; /* round */ + L_product_arr &= (Word32) 0xffff8000L; + L_product_arr >>= 15; /* shift */ + if (L_product_arr & (Word32) 0x00010000L) /* sign extend when necessary */ + { + L_product_arr |= (Word32) 0xffff0000L; + } + var_out = saturate (L_product_arr); + return (var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : L_shl | +| | +| Purpose : | +| | +| Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero | +| fill the var2 LSB of the result. If var2 is negative, arithmetically | +| shift L_var1 right by -var2 with sign extension. Saturate the result in | +| case of underflows or overflows. | +| | +| Complexity weight : 2 | +| | +| Inputs : | +| | +| L_var1 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| L_var_out | +| 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | +|___________________________________________________________________________| +*/ + +static_vo Word32 L_shl (Word32 L_var1, Word16 var2) +{ + Word32 L_var_out = 0L; + if (var2 <= 0) + { + if (var2 < -32) + var2 = -32; + L_var_out = (L_var1 >> (Word16)-var2); + } + else + { + for (; var2 > 0; var2--) + { + if (L_var1 > (Word32) 0X3fffffffL) + { + L_var_out = MAX_32; + break; + } + else + { + if (L_var1 < (Word32) 0xc0000000L) + { + //Overflow = 1; + L_var_out = MIN_32; + break; + } + } + L_var1 *= 2; + L_var_out = L_var1; + } + } + return (L_var_out); +} + +static_vo Word32 L_shl2(Word32 L_var1, Word16 var2) +{ + Word32 L_var_out = 0L; + + for (; var2 > 0; var2--) + { + if (L_var1 > (Word32) 0X3fffffffL) + { + L_var_out = MAX_32; + break; + } + else + { + if (L_var1 < (Word32) 0xc0000000L) + { + L_var_out = MIN_32; + break; + } + } + L_var1 <<=1 ; + L_var_out = L_var1; + } + return (L_var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : L_shr | +| | +| Purpose : | +| | +| Arithmetically shift the 32 bit input L_var1 right var2 positions with | +| sign extension. If var2 is negative, arithmetically shift L_var1 left | +| by -var2 and zero fill the -var2 LSB of the result. Saturate the result | +| in case of underflows or overflows. | +| | +| Complexity weight : 2 | +| | +| Inputs : | +| | +| L_var1 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| L_var_out | +| 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | +|___________________________________________________________________________| +*/ + +static_vo Word32 L_shr (Word32 L_var1, Word16 var2) +{ + Word32 L_var_out; + if (var2 < 0) + { + if (var2 < -32) + var2 = -32; + L_var_out = L_shl2(L_var1, (Word16)-var2); + } + else + { + if (var2 >= 31) + { + L_var_out = (L_var1 < 0L) ? -1 : 0; + } + else + { + if (L_var1 < 0) + { + L_var_out = ~((~L_var1) >> var2); + } + else + { + L_var_out = L_var1 >> var2; + } + } + } + return (L_var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : L_shr_r | +| | +| Purpose : | +| | +| Same as L_shr(L_var1,var2) but with rounding. Saturate the result in | +| case of underflows or overflows : | +| - If var2 is greater than zero : | +| if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))| +| is equal to zero | +| then | +| L_shr_r(L_var1,var2) = L_shr(L_var1,var2) | +| else | +| L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1) | +| - If var2 is less than or equal to zero : | +| L_shr_r(L_var1,var2) = L_shr(L_var1,var2). | +| | +| Complexity weight : 3 | +| | +| Inputs : | +| | +| L_var1 | +| 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= var1 <= 0x7fff ffff. | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| L_var_out | +| 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= var_out <= 0x7fff ffff. | +|___________________________________________________________________________| +*/ + +static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2) +{ + Word32 L_var_out; + if (var2 > 31) + { + L_var_out = 0; + } + else + { + L_var_out = L_shr (L_var1, var2); + if (var2 > 0) + { + if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0) + { + L_var_out++; + } + } + } + return (L_var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : norm_s | +| | +| Purpose : | +| | +| Produces the number of left shift needed to normalize the 16 bit varia- | +| ble var1 for positive values on the interval with minimum of 16384 and | +| maximum of 32767, and for negative values on the interval with minimum | +| of -32768 and maximum of -16384; in order to normalize the result, the | +| following operation must be done : | +| norm_var1 = shl(var1,norm_s(var1)). | +| | +| Complexity weight : 15 | +| | +| Inputs : | +| | +| var1 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0xffff 8000 <= var1 <= 0x0000 7fff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| var_out | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0x0000 0000 <= var_out <= 0x0000 000f. | +|___________________________________________________________________________| +*/ + +static_vo Word16 norm_s (Word16 var1) +{ + Word16 var_out = 0; + if (var1 == 0) + { + var_out = 0; + } + else + { + if (var1 == -1) + { + var_out = 15; + } + else + { + if (var1 < 0) + { + var1 = (Word16)~var1; + } + for (var_out = 0; var1 < 0x4000; var_out++) + { + var1 <<= 1; + } + } + } + return (var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : div_s | +| | +| Purpose : | +| | +| Produces a result which is the fractional integer division of var1 by | +| var2; var1 and var2 must be positive and var2 must be greater or equal | +| to var1; the result is positive (leading bit equal to 0) and truncated | +| to 16 bits. | +| If var1 = var2 then div(var1,var2) = 32767. | +| | +| Complexity weight : 18 | +| | +| Inputs : | +| | +| var1 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0x0000 0000 <= var1 <= var2 and var2 != 0. | +| | +| var2 | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : var1 <= var2 <= 0x0000 7fff and var2 != 0. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| var_out | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0x0000 0000 <= var_out <= 0x0000 7fff. | +| It's a Q15 value (point between b15 and b14). | +|___________________________________________________________________________| +*/ + +static_vo Word16 div_s (Word16 var1, Word16 var2) +{ + Word16 var_out = 0; + Word16 iteration; + Word32 L_num; + Word32 L_denom; + if ((var1 < 0) || (var2 < 0)) + { + var_out = MAX_16; + return var_out; + } + if (var2 == 0) + { + var_out = MAX_16; + return var_out; + } + if (var1 == 0) + { + var_out = 0; + } + else + { + if (var1 == var2) + { + var_out = MAX_16; + } + else + { + L_num = L_deposit_l (var1); + L_denom = L_deposit_l(var2); + for (iteration = 0; iteration < 15; iteration++) + { + var_out <<= 1; + L_num <<= 1; + if (L_num >= L_denom) + { + L_num -= L_denom; + var_out += 1; + } + } + } + } + return (var_out); +} + +/*___________________________________________________________________________ +| | +| Function Name : norm_l | +| | +| Purpose : | +| | +| Produces the number of left shifts needed to normalize the 32 bit varia-| +| ble L_var1 for positive values on the interval with minimum of | +| 1073741824 and maximum of 2147483647, and for negative values on the in-| +| terval with minimum of -2147483648 and maximum of -1073741824; in order | +| to normalize the result, the following operation must be done : | +| norm_L_var1 = L_shl(L_var1,norm_l(L_var1)). | +| | +| Complexity weight : 30 | +| | +| Inputs : | +| | +| L_var1 | +| 32 bit long signed integer (Word32) whose value falls in the | +| range : 0x8000 0000 <= var1 <= 0x7fff ffff. | +| | +| Outputs : | +| | +| none | +| | +| Return Value : | +| | +| var_out | +| 16 bit short signed integer (Word16) whose value falls in the | +| range : 0x0000 0000 <= var_out <= 0x0000 001f. | +|___________________________________________________________________________| +*/ + +static_vo Word16 norm_l (Word32 L_var1) +{ + Word16 var_out = 0; + if (L_var1 != 0) + { + var_out = 31; + if (L_var1 != (Word32) 0xffffffffL) + { + L_var1 ^= (L_var1 >>31); + for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++) + { + L_var1 <<= 1; + } + } + } + return (var_out); +} + +#endif //__BASIC_OP_H__ + diff --git a/media/libstagefright/codecs/amrwbenc/inc/bits.h b/media/libstagefright/codecs/amrwbenc/inc/bits.h index 77146de..e880684 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/bits.h +++ b/media/libstagefright/codecs/amrwbenc/inc/bits.h @@ -1,92 +1,92 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*--------------------------------------------------------------------------* -* BITS.H * -*--------------------------------------------------------------------------* -* Number of bits for different modes * -*--------------------------------------------------------------------------*/ - -#ifndef __BITS_H__ -#define __BITS_H__ - -#include -#include "typedef.h" -#include "cnst.h" -#include "cod_main.h" - -#define NBBITS_7k 132 /* 6.60k */ -#define NBBITS_9k 177 /* 8.85k */ -#define NBBITS_12k 253 /* 12.65k */ -#define NBBITS_14k 285 /* 14.25k */ -#define NBBITS_16k 317 /* 15.85k */ -#define NBBITS_18k 365 /* 18.25k */ -#define NBBITS_20k 397 /* 19.85k */ -#define NBBITS_23k 461 /* 23.05k */ -#define NBBITS_24k 477 /* 23.85k */ - -#define NBBITS_SID 35 -#define NB_BITS_MAX NBBITS_24k - -#define BIT_0 (Word16)-127 -#define BIT_1 (Word16)127 -#define BIT_0_ITU (Word16)0x007F -#define BIT_1_ITU (Word16)0x0081 - -#define SIZE_MAX1 (3+NB_BITS_MAX) /* serial size max */ -#define TX_FRAME_TYPE (Word16)0x6b21 -#define RX_FRAME_TYPE (Word16)0x6b20 - -static const Word16 nb_of_bits[NUM_OF_MODES] = { - NBBITS_7k, - NBBITS_9k, - NBBITS_12k, - NBBITS_14k, - NBBITS_16k, - NBBITS_18k, - NBBITS_20k, - NBBITS_23k, - NBBITS_24k, - NBBITS_SID -}; - -/*typedef struct -{ -Word16 sid_update_counter; -Word16 sid_handover_debt; -Word16 prev_ft; -} TX_State; -*/ - -//typedef struct -//{ -// Word16 prev_ft; -// Word16 prev_mode; -//} RX_State; - -int PackBits(Word16 prms[], Word16 coding_mode, Word16 mode, Coder_State *st); - - -void Parm_serial( - Word16 value, /* input : parameter value */ - Word16 no_of_bits, /* input : number of bits */ - Word16 ** prms - ); - - -#endif //__BITS_H__ - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*--------------------------------------------------------------------------* +* BITS.H * +*--------------------------------------------------------------------------* +* Number of bits for different modes * +*--------------------------------------------------------------------------*/ + +#ifndef __BITS_H__ +#define __BITS_H__ + +#include +#include "typedef.h" +#include "cnst.h" +#include "cod_main.h" + +#define NBBITS_7k 132 /* 6.60k */ +#define NBBITS_9k 177 /* 8.85k */ +#define NBBITS_12k 253 /* 12.65k */ +#define NBBITS_14k 285 /* 14.25k */ +#define NBBITS_16k 317 /* 15.85k */ +#define NBBITS_18k 365 /* 18.25k */ +#define NBBITS_20k 397 /* 19.85k */ +#define NBBITS_23k 461 /* 23.05k */ +#define NBBITS_24k 477 /* 23.85k */ + +#define NBBITS_SID 35 +#define NB_BITS_MAX NBBITS_24k + +#define BIT_0 (Word16)-127 +#define BIT_1 (Word16)127 +#define BIT_0_ITU (Word16)0x007F +#define BIT_1_ITU (Word16)0x0081 + +#define SIZE_MAX1 (3+NB_BITS_MAX) /* serial size max */ +#define TX_FRAME_TYPE (Word16)0x6b21 +#define RX_FRAME_TYPE (Word16)0x6b20 + +static const Word16 nb_of_bits[NUM_OF_MODES] = { + NBBITS_7k, + NBBITS_9k, + NBBITS_12k, + NBBITS_14k, + NBBITS_16k, + NBBITS_18k, + NBBITS_20k, + NBBITS_23k, + NBBITS_24k, + NBBITS_SID +}; + +/*typedef struct +{ +Word16 sid_update_counter; +Word16 sid_handover_debt; +Word16 prev_ft; +} TX_State; +*/ + +//typedef struct +//{ +// Word16 prev_ft; +// Word16 prev_mode; +//} RX_State; + +int PackBits(Word16 prms[], Word16 coding_mode, Word16 mode, Coder_State *st); + + +void Parm_serial( + Word16 value, /* input : parameter value */ + Word16 no_of_bits, /* input : number of bits */ + Word16 ** prms + ); + + +#endif //__BITS_H__ + diff --git a/media/libstagefright/codecs/amrwbenc/inc/cnst.h b/media/libstagefright/codecs/amrwbenc/inc/cnst.h index ffdbd88..5395d2d 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/cnst.h +++ b/media/libstagefright/codecs/amrwbenc/inc/cnst.h @@ -1,81 +1,81 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*--------------------------------------------------------------------------* - * CNST.H * - *--------------------------------------------------------------------------* - * Codec constant parameters (coder and decoder) * - *--------------------------------------------------------------------------*/ - -#ifndef __CNST_H__ -#define __CNST_H__ - -#define L_FRAME16k 320 /* Frame size at 16kHz */ -#define L_FRAME 256 /* Frame size */ -#define L_SUBFR16k 80 /* Subframe size at 16kHz */ - -#define L_SUBFR 64 /* Subframe size */ -#define NB_SUBFR 4 /* Number of subframe per frame */ - -#define L_NEXT 64 /* Overhead in LP analysis */ -#define L_WINDOW 384 /* window size in LP analysis */ -#define L_TOTAL 384 /* Total size of speech buffer. */ -#define M 16 /* Order of LP filter */ -#define M16k 20 - -#define L_FILT16k 15 /* Delay of down-sampling filter */ -#define L_FILT 12 /* Delay of up-sampling filter */ - -#define GP_CLIP 15565 /* Pitch gain clipping = 0.95 Q14 */ -#define PIT_SHARP 27853 /* pitch sharpening factor = 0.85 Q15 */ - -#define PIT_MIN 34 /* Minimum pitch lag with resolution 1/4 */ -#define PIT_FR2 128 /* Minimum pitch lag with resolution 1/2 */ -#define PIT_FR1_9b 160 /* Minimum pitch lag with resolution 1 */ -#define PIT_FR1_8b 92 /* Minimum pitch lag with resolution 1 */ -#define PIT_MAX 231 /* Maximum pitch lag */ -#define L_INTERPOL (16+1) /* Length of filter for interpolation */ - -#define OPL_DECIM 2 /* Decimation in open-loop pitch analysis */ - -#define PREEMPH_FAC 22282 /* preemphasis factor (0.68 in Q15) */ -#define GAMMA1 30147 /* Weighting factor (numerator) (0.92 in Q15) */ -#define TILT_FAC 22282 /* tilt factor (denominator) (0.68 in Q15) */ - -#define Q_MAX 8 /* scaling max for signal (see syn_filt_32) */ - -#define RANDOM_INITSEED 21845 /* own random init value */ - -#define L_MEANBUF 3 -#define ONE_PER_MEANBUF 10923 - -#define MODE_7k 0 -#define MODE_9k 1 -#define MODE_12k 2 -#define MODE_14k 3 -#define MODE_16k 4 -#define MODE_18k 5 -#define MODE_20k 6 -#define MODE_23k 7 -#define MODE_24k 8 -#define MRDTX 9 -#define NUM_OF_MODES 10 /* see bits.h for bits definition */ - -#define EHF_MASK (Word16)0x0008 /* homing frame pattern */ - -#endif //__CNST_H__ - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*--------------------------------------------------------------------------* + * CNST.H * + *--------------------------------------------------------------------------* + * Codec constant parameters (coder and decoder) * + *--------------------------------------------------------------------------*/ + +#ifndef __CNST_H__ +#define __CNST_H__ + +#define L_FRAME16k 320 /* Frame size at 16kHz */ +#define L_FRAME 256 /* Frame size */ +#define L_SUBFR16k 80 /* Subframe size at 16kHz */ + +#define L_SUBFR 64 /* Subframe size */ +#define NB_SUBFR 4 /* Number of subframe per frame */ + +#define L_NEXT 64 /* Overhead in LP analysis */ +#define L_WINDOW 384 /* window size in LP analysis */ +#define L_TOTAL 384 /* Total size of speech buffer. */ +#define M 16 /* Order of LP filter */ +#define M16k 20 + +#define L_FILT16k 15 /* Delay of down-sampling filter */ +#define L_FILT 12 /* Delay of up-sampling filter */ + +#define GP_CLIP 15565 /* Pitch gain clipping = 0.95 Q14 */ +#define PIT_SHARP 27853 /* pitch sharpening factor = 0.85 Q15 */ + +#define PIT_MIN 34 /* Minimum pitch lag with resolution 1/4 */ +#define PIT_FR2 128 /* Minimum pitch lag with resolution 1/2 */ +#define PIT_FR1_9b 160 /* Minimum pitch lag with resolution 1 */ +#define PIT_FR1_8b 92 /* Minimum pitch lag with resolution 1 */ +#define PIT_MAX 231 /* Maximum pitch lag */ +#define L_INTERPOL (16+1) /* Length of filter for interpolation */ + +#define OPL_DECIM 2 /* Decimation in open-loop pitch analysis */ + +#define PREEMPH_FAC 22282 /* preemphasis factor (0.68 in Q15) */ +#define GAMMA1 30147 /* Weighting factor (numerator) (0.92 in Q15) */ +#define TILT_FAC 22282 /* tilt factor (denominator) (0.68 in Q15) */ + +#define Q_MAX 8 /* scaling max for signal (see syn_filt_32) */ + +#define RANDOM_INITSEED 21845 /* own random init value */ + +#define L_MEANBUF 3 +#define ONE_PER_MEANBUF 10923 + +#define MODE_7k 0 +#define MODE_9k 1 +#define MODE_12k 2 +#define MODE_14k 3 +#define MODE_16k 4 +#define MODE_18k 5 +#define MODE_20k 6 +#define MODE_23k 7 +#define MODE_24k 8 +#define MRDTX 9 +#define NUM_OF_MODES 10 /* see bits.h for bits definition */ + +#define EHF_MASK (Word16)0x0008 /* homing frame pattern */ + +#endif //__CNST_H__ + diff --git a/media/libstagefright/codecs/amrwbenc/inc/cod_main.h b/media/libstagefright/codecs/amrwbenc/inc/cod_main.h index 1fd5787..53ca55e 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/cod_main.h +++ b/media/libstagefright/codecs/amrwbenc/inc/cod_main.h @@ -1,103 +1,103 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*--------------------------------------------------------------------------* - * COD_MAIN.H * - *--------------------------------------------------------------------------* - * Static memory in the encoder * - *--------------------------------------------------------------------------*/ -#ifndef __COD_MAIN_H__ -#define __COD_MAIN_H__ - -#include "cnst.h" /* coder constant parameters */ - -#include "wb_vad.h" -#include "dtx.h" -#include "stream.h" -#include "voAMRWB.h" - -typedef struct -{ - Word16 mem_decim[2 * L_FILT16k]; /* speech decimated filter memory */ - Word16 mem_sig_in[6]; /* hp50 filter memory */ - Word16 mem_preemph; /* speech preemph filter memory */ - Word16 old_speech[L_TOTAL - L_FRAME]; /* old speech vector at 12.8kHz */ - Word16 old_wsp[PIT_MAX / OPL_DECIM]; /* old decimated weighted speech vector */ - Word16 old_exc[PIT_MAX + L_INTERPOL]; /* old excitation vector */ - Word16 mem_levinson[M + 2]; /* levinson routine memory */ - Word16 ispold[M]; /* old isp (immittance spectral pairs) */ - Word16 ispold_q[M]; /* quantized old isp */ - Word16 past_isfq[M]; /* past isf quantizer */ - Word16 mem_wsp; /* wsp vector memory */ - Word16 mem_decim2[3]; /* wsp decimation filter memory */ - Word16 mem_w0; /* target vector memory */ - Word16 mem_syn[M]; /* synthesis memory */ - Word16 tilt_code; /* tilt of code */ - Word16 old_wsp_max; /* old wsp maximum value */ - Word16 old_wsp_shift; /* old wsp shift */ - Word16 Q_old; /* old scaling factor */ - Word16 Q_max[2]; /* old maximum scaling factor */ - Word16 gp_clip[2]; /* gain of pitch clipping memory */ - Word16 qua_gain[4]; /* gain quantizer memory */ - - Word16 old_T0_med; - Word16 ol_gain; - Word16 ada_w; - Word16 ol_wght_flg; - Word16 old_ol_lag[5]; - Word16 hp_wsp_mem[9]; - Word16 old_hp_wsp[L_FRAME / OPL_DECIM + (PIT_MAX / OPL_DECIM)]; - VadVars *vadSt; - dtx_encState *dtx_encSt; - Word16 first_frame; - Word16 isfold[M]; /* old isf (frequency domain) */ - Word32 L_gc_thres; /* threshold for noise enhancer */ - Word16 mem_syn_hi[M]; /* modified synthesis memory (MSB) */ - Word16 mem_syn_lo[M]; /* modified synthesis memory (LSB) */ - Word16 mem_deemph; /* speech deemph filter memory */ - Word16 mem_sig_out[6]; /* hp50 filter memory for synthesis */ - Word16 mem_hp400[6]; /* hp400 filter memory for synthesis */ - Word16 mem_oversamp[2 * L_FILT]; /* synthesis oversampled filter memory */ - Word16 mem_syn_hf[M]; /* HF synthesis memory */ - Word16 mem_hf[2 * L_FILT16k]; /* HF band-pass filter memory */ - Word16 mem_hf2[2 * L_FILT16k]; /* HF band-pass filter memory */ - Word16 seed2; /* random memory for HF generation */ - Word16 vad_hist; - Word16 gain_alpha; - /* TX_State structure */ - Word16 sid_update_counter; - Word16 sid_handover_debt; - Word16 prev_ft; - Word16 allow_dtx; - /*some input/output buffer parameters */ - unsigned char *inputStream; - int inputSize; - VOAMRWBMODE mode; - VOAMRWBFRAMETYPE frameType; - unsigned short *outputStream; - int outputSize; - FrameStream *stream; - VO_MEM_OPERATOR *pvoMemop; - VO_MEM_OPERATOR voMemoprator; - VO_PTR hCheck; -} Coder_State; - -typedef void* HAMRENC; - -#endif //__COD_MAIN_H__ - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*--------------------------------------------------------------------------* + * COD_MAIN.H * + *--------------------------------------------------------------------------* + * Static memory in the encoder * + *--------------------------------------------------------------------------*/ +#ifndef __COD_MAIN_H__ +#define __COD_MAIN_H__ + +#include "cnst.h" /* coder constant parameters */ + +#include "wb_vad.h" +#include "dtx.h" +#include "stream.h" +#include "voAMRWB.h" + +typedef struct +{ + Word16 mem_decim[2 * L_FILT16k]; /* speech decimated filter memory */ + Word16 mem_sig_in[6]; /* hp50 filter memory */ + Word16 mem_preemph; /* speech preemph filter memory */ + Word16 old_speech[L_TOTAL - L_FRAME]; /* old speech vector at 12.8kHz */ + Word16 old_wsp[PIT_MAX / OPL_DECIM]; /* old decimated weighted speech vector */ + Word16 old_exc[PIT_MAX + L_INTERPOL]; /* old excitation vector */ + Word16 mem_levinson[M + 2]; /* levinson routine memory */ + Word16 ispold[M]; /* old isp (immittance spectral pairs) */ + Word16 ispold_q[M]; /* quantized old isp */ + Word16 past_isfq[M]; /* past isf quantizer */ + Word16 mem_wsp; /* wsp vector memory */ + Word16 mem_decim2[3]; /* wsp decimation filter memory */ + Word16 mem_w0; /* target vector memory */ + Word16 mem_syn[M]; /* synthesis memory */ + Word16 tilt_code; /* tilt of code */ + Word16 old_wsp_max; /* old wsp maximum value */ + Word16 old_wsp_shift; /* old wsp shift */ + Word16 Q_old; /* old scaling factor */ + Word16 Q_max[2]; /* old maximum scaling factor */ + Word16 gp_clip[2]; /* gain of pitch clipping memory */ + Word16 qua_gain[4]; /* gain quantizer memory */ + + Word16 old_T0_med; + Word16 ol_gain; + Word16 ada_w; + Word16 ol_wght_flg; + Word16 old_ol_lag[5]; + Word16 hp_wsp_mem[9]; + Word16 old_hp_wsp[L_FRAME / OPL_DECIM + (PIT_MAX / OPL_DECIM)]; + VadVars *vadSt; + dtx_encState *dtx_encSt; + Word16 first_frame; + Word16 isfold[M]; /* old isf (frequency domain) */ + Word32 L_gc_thres; /* threshold for noise enhancer */ + Word16 mem_syn_hi[M]; /* modified synthesis memory (MSB) */ + Word16 mem_syn_lo[M]; /* modified synthesis memory (LSB) */ + Word16 mem_deemph; /* speech deemph filter memory */ + Word16 mem_sig_out[6]; /* hp50 filter memory for synthesis */ + Word16 mem_hp400[6]; /* hp400 filter memory for synthesis */ + Word16 mem_oversamp[2 * L_FILT]; /* synthesis oversampled filter memory */ + Word16 mem_syn_hf[M]; /* HF synthesis memory */ + Word16 mem_hf[2 * L_FILT16k]; /* HF band-pass filter memory */ + Word16 mem_hf2[2 * L_FILT16k]; /* HF band-pass filter memory */ + Word16 seed2; /* random memory for HF generation */ + Word16 vad_hist; + Word16 gain_alpha; + /* TX_State structure */ + Word16 sid_update_counter; + Word16 sid_handover_debt; + Word16 prev_ft; + Word16 allow_dtx; + /*some input/output buffer parameters */ + unsigned char *inputStream; + int inputSize; + VOAMRWBMODE mode; + VOAMRWBFRAMETYPE frameType; + unsigned short *outputStream; + int outputSize; + FrameStream *stream; + VO_MEM_OPERATOR *pvoMemop; + VO_MEM_OPERATOR voMemoprator; + VO_PTR hCheck; +} Coder_State; + +typedef void* HAMRENC; + +#endif //__COD_MAIN_H__ + + diff --git a/media/libstagefright/codecs/amrwbenc/inc/dtx.h b/media/libstagefright/codecs/amrwbenc/inc/dtx.h index e52c2d0..0bdda67 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/dtx.h +++ b/media/libstagefright/codecs/amrwbenc/inc/dtx.h @@ -1,115 +1,115 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*--------------------------------------------------------------------------* - * DTX.H * - *--------------------------------------------------------------------------* - * Static memory, constants and frametypes for the DTX * - *--------------------------------------------------------------------------*/ - -#ifndef __DTX_H__ -#define __DTX_H__ - -#define DTX_MAX_EMPTY_THRESH 50 -#define DTX_HIST_SIZE 8 -#define DTX_HIST_SIZE_MIN_ONE 7 -#define DTX_ELAPSED_FRAMES_THRESH (24 + 7 -1) -#define DTX_HANG_CONST 7 /* yields eight frames of SP HANGOVER */ -#define INV_MED_THRESH 14564 -#define ISF_GAP 128 /* 50 */ -#define ONE_MINUS_ISF_GAP 16384 - ISF_GAP -#define ISF_GAP 128 -#define ISF_DITH_GAP 448 -#define ISF_FACTOR_LOW 256 -#define ISF_FACTOR_STEP 2 -#define GAIN_THR 180 -#define GAIN_FACTOR 75 - -typedef struct -{ - Word16 isf_hist[M * DTX_HIST_SIZE]; - Word16 log_en_hist[DTX_HIST_SIZE]; - Word16 hist_ptr; - Word16 log_en_index; - Word16 cng_seed; - /* DTX handler stuff */ - Word16 dtxHangoverCount; - Word16 decAnaElapsedCount; - Word32 D[28]; - Word32 sumD[DTX_HIST_SIZE]; -} dtx_encState; - -#define SPEECH 0 -#define DTX 1 -#define DTX_MUTE 2 - -#define TX_SPEECH 0 -#define TX_SID_FIRST 1 -#define TX_SID_UPDATE 2 -#define TX_NO_DATA 3 - -#define RX_SPEECH_GOOD 0 -#define RX_SPEECH_PROBABLY_DEGRADED 1 -#define RX_SPEECH_LOST 2 -#define RX_SPEECH_BAD 3 -#define RX_SID_FIRST 4 -#define RX_SID_UPDATE 5 -#define RX_SID_BAD 6 -#define RX_NO_DATA 7 - -/***************************************************************************** - * - * DEFINITION OF DATA TYPES - *****************************************************************************/ - -Word16 dtx_enc_init(dtx_encState ** st, Word16 isf_init[], VO_MEM_OPERATOR *pMemOP); -Word16 dtx_enc_reset(dtx_encState * st, Word16 isf_init[]); -void dtx_enc_exit(dtx_encState ** st, VO_MEM_OPERATOR *pMemOP); - -Word16 dtx_enc( - dtx_encState * st, /* i/o : State struct */ - Word16 isf[M], /* o : CN ISF vector */ - Word16 * exc2, /* o : CN excitation */ - Word16 ** prms -); - -Word16 dtx_buffer( - dtx_encState * st, /* i/o : State struct */ - Word16 isf_new[], /* i : isf vector */ - Word32 enr, /* i : residual energy (in L_FRAME) */ - Word16 codec_mode -); - -void tx_dtx_handler(dtx_encState * st, /* i/o : State struct */ - Word16 vad_flag, /* i : vad decision */ - Word16 * usedMode /* i/o : mode changed or not */ -); - -void Qisf_ns( - Word16 * isf1, /* input : ISF in the frequency domain (0..0.5) */ - Word16 * isf_q, /* output: quantized ISF */ - Word16 * indice /* output: quantization indices */ -); - - -void Disf_ns( - Word16 * indice, /* input: quantization indices */ - Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */ -); - -#endif //__DTX_H__ - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*--------------------------------------------------------------------------* + * DTX.H * + *--------------------------------------------------------------------------* + * Static memory, constants and frametypes for the DTX * + *--------------------------------------------------------------------------*/ + +#ifndef __DTX_H__ +#define __DTX_H__ + +#define DTX_MAX_EMPTY_THRESH 50 +#define DTX_HIST_SIZE 8 +#define DTX_HIST_SIZE_MIN_ONE 7 +#define DTX_ELAPSED_FRAMES_THRESH (24 + 7 -1) +#define DTX_HANG_CONST 7 /* yields eight frames of SP HANGOVER */ +#define INV_MED_THRESH 14564 +#define ISF_GAP 128 /* 50 */ +#define ONE_MINUS_ISF_GAP 16384 - ISF_GAP +#define ISF_GAP 128 +#define ISF_DITH_GAP 448 +#define ISF_FACTOR_LOW 256 +#define ISF_FACTOR_STEP 2 +#define GAIN_THR 180 +#define GAIN_FACTOR 75 + +typedef struct +{ + Word16 isf_hist[M * DTX_HIST_SIZE]; + Word16 log_en_hist[DTX_HIST_SIZE]; + Word16 hist_ptr; + Word16 log_en_index; + Word16 cng_seed; + /* DTX handler stuff */ + Word16 dtxHangoverCount; + Word16 decAnaElapsedCount; + Word32 D[28]; + Word32 sumD[DTX_HIST_SIZE]; +} dtx_encState; + +#define SPEECH 0 +#define DTX 1 +#define DTX_MUTE 2 + +#define TX_SPEECH 0 +#define TX_SID_FIRST 1 +#define TX_SID_UPDATE 2 +#define TX_NO_DATA 3 + +#define RX_SPEECH_GOOD 0 +#define RX_SPEECH_PROBABLY_DEGRADED 1 +#define RX_SPEECH_LOST 2 +#define RX_SPEECH_BAD 3 +#define RX_SID_FIRST 4 +#define RX_SID_UPDATE 5 +#define RX_SID_BAD 6 +#define RX_NO_DATA 7 + +/***************************************************************************** + * + * DEFINITION OF DATA TYPES + *****************************************************************************/ + +Word16 dtx_enc_init(dtx_encState ** st, Word16 isf_init[], VO_MEM_OPERATOR *pMemOP); +Word16 dtx_enc_reset(dtx_encState * st, Word16 isf_init[]); +void dtx_enc_exit(dtx_encState ** st, VO_MEM_OPERATOR *pMemOP); + +Word16 dtx_enc( + dtx_encState * st, /* i/o : State struct */ + Word16 isf[M], /* o : CN ISF vector */ + Word16 * exc2, /* o : CN excitation */ + Word16 ** prms +); + +Word16 dtx_buffer( + dtx_encState * st, /* i/o : State struct */ + Word16 isf_new[], /* i : isf vector */ + Word32 enr, /* i : residual energy (in L_FRAME) */ + Word16 codec_mode +); + +void tx_dtx_handler(dtx_encState * st, /* i/o : State struct */ + Word16 vad_flag, /* i : vad decision */ + Word16 * usedMode /* i/o : mode changed or not */ +); + +void Qisf_ns( + Word16 * isf1, /* input : ISF in the frequency domain (0..0.5) */ + Word16 * isf_q, /* output: quantized ISF */ + Word16 * indice /* output: quantization indices */ +); + + +void Disf_ns( + Word16 * indice, /* input: quantization indices */ + Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */ +); + +#endif //__DTX_H__ + diff --git a/media/libstagefright/codecs/amrwbenc/inc/grid100.tab b/media/libstagefright/codecs/amrwbenc/inc/grid100.tab index efee18d..658d28d 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/grid100.tab +++ b/media/libstagefright/codecs/amrwbenc/inc/grid100.tab @@ -1,53 +1,53 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - - -/*-------------------------------------------------------------* - * Table for az_isp() * - * * - * Vector grid[] is in Q15 * - * * - * grid[0] = 1.0; * - * grid[grid_points+1] = -1.0; * - * for (i = 1; i < grid_points; i++) * - * grid[i] = cos((6.283185307*i)/(2.0*grid_points)); * - * * - *-------------------------------------------------------------*/ - -/* Version 101 points */ - -#define GRID_POINTS 100 - -const Word16 vogrid[GRID_POINTS+1] ={ - 32767, 32751, 32703, 32622, 32509, 32364, - 32187, 31978, 31738, 31466, 31164, 30830, - 30466, 30072, 29649, 29196, 28714, 28204, - 27666, 27101, 26509, 25891, 25248, 24579, - 23886, 23170, 22431, 21669, 20887, 20083, - 19260, 18418, 17557, 16680, 15786, 14876, - 13951, 13013, 12062, 11099, 10125, 9141, - 8149, 7148, 6140, 5126, 4106, 3083, - 2057, 1029, 0, -1029, -2057, -3083, - -4106, -5126, -6140, -7148, -8149, -9141, - -10125, -11099, -12062, -13013, -13951, -14876, - -15786, -16680, -17557, -18418, -19260, -20083, - -20887, -21669, -22431, -23170, -23886, -24579, - -25248, -25891, -26509, -27101, -27666, -28204, - -28714, -29196, -29649, -30072, -30466, -30830, - -31164, -31466, -31738, -31978, -32187, -32364, - -32509, -32622, -32703, -32751, -32760}; - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + + +/*-------------------------------------------------------------* + * Table for az_isp() * + * * + * Vector grid[] is in Q15 * + * * + * grid[0] = 1.0; * + * grid[grid_points+1] = -1.0; * + * for (i = 1; i < grid_points; i++) * + * grid[i] = cos((6.283185307*i)/(2.0*grid_points)); * + * * + *-------------------------------------------------------------*/ + +/* Version 101 points */ + +#define GRID_POINTS 100 + +const Word16 vogrid[GRID_POINTS+1] ={ + 32767, 32751, 32703, 32622, 32509, 32364, + 32187, 31978, 31738, 31466, 31164, 30830, + 30466, 30072, 29649, 29196, 28714, 28204, + 27666, 27101, 26509, 25891, 25248, 24579, + 23886, 23170, 22431, 21669, 20887, 20083, + 19260, 18418, 17557, 16680, 15786, 14876, + 13951, 13013, 12062, 11099, 10125, 9141, + 8149, 7148, 6140, 5126, 4106, 3083, + 2057, 1029, 0, -1029, -2057, -3083, + -4106, -5126, -6140, -7148, -8149, -9141, + -10125, -11099, -12062, -13013, -13951, -14876, + -15786, -16680, -17557, -18418, -19260, -20083, + -20887, -21669, -22431, -23170, -23886, -24579, + -25248, -25891, -26509, -27101, -27666, -28204, + -28714, -29196, -29649, -30072, -30466, -30830, + -31164, -31466, -31738, -31978, -32187, -32364, + -32509, -32622, -32703, -32751, -32760}; + diff --git a/media/libstagefright/codecs/amrwbenc/inc/ham_wind.tab b/media/libstagefright/codecs/amrwbenc/inc/ham_wind.tab index 91f8690..560a997 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/ham_wind.tab +++ b/media/libstagefright/codecs/amrwbenc/inc/ham_wind.tab @@ -1,73 +1,73 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/* Hamming_cos window for LPC analysis. */ -/* Create with function hamm_cos(window,384-128,128) */ - -#define L_WINDOW 384 - -const Word16 vo_window[L_WINDOW] = { - 2621, 2622, 2626, 2632, 2640, 2650, 2662, 2677, - 2694, 2714, 2735, 2759, 2785, 2814, 2844, 2877, - 2912, 2949, 2989, 3031, 3075, 3121, 3169, 3220, - 3273, 3328, 3385, 3444, 3506, 3569, 3635, 3703, - 3773, 3845, 3919, 3996, 4074, 4155, 4237, 4321, - 4408, 4496, 4587, 4680, 4774, 4870, 4969, 5069, - 5171, 5275, 5381, 5489, 5599, 5710, 5824, 5939, - 6056, 6174, 6295, 6417, 6541, 6666, 6793, 6922, - 7052, 7185, 7318, 7453, 7590, 7728, 7868, 8009, - 8152, 8296, 8442, 8589, 8737, 8887, 9038, 9191, - 9344, 9499, 9655, 9813, 9971, 10131, 10292, 10454, - 10617, 10781, 10946, 11113, 11280, 11448, 11617, 11787, - 11958, 12130, 12303, 12476, 12650, 12825, 13001, 13178, - 13355, 13533, 13711, 13890, 14070, 14250, 14431, 14612, - 14793, 14975, 15158, 15341, 15524, 15708, 15891, 16076, - 16260, 16445, 16629, 16814, 16999, 17185, 17370, 17555, - 17740, 17926, 18111, 18296, 18481, 18666, 18851, 19036, - 19221, 19405, 19589, 19773, 19956, 20139, 20322, 20504, - 20686, 20867, 21048, 21229, 21408, 21588, 21767, 21945, - 22122, 22299, 22475, 22651, 22825, 22999, 23172, 23344, - 23516, 23686, 23856, 24025, 24192, 24359, 24525, 24689, - 24853, 25016, 25177, 25337, 25496, 25654, 25811, 25967, - 26121, 26274, 26426, 26576, 26725, 26873, 27019, 27164, - 27308, 27450, 27590, 27729, 27867, 28003, 28137, 28270, - 28401, 28531, 28659, 28785, 28910, 29033, 29154, 29274, - 29391, 29507, 29622, 29734, 29845, 29953, 30060, 30165, - 30268, 30370, 30469, 30566, 30662, 30755, 30847, 30936, - 31024, 31109, 31193, 31274, 31354, 31431, 31506, 31579, - 31651, 31719, 31786, 31851, 31914, 31974, 32032, 32088, - 32142, 32194, 32243, 32291, 32336, 32379, 32419, 32458, - 32494, 32528, 32560, 32589, 32617, 32642, 32664, 32685, - 32703, 32719, 32733, 32744, 32753, 32760, 32764, 32767, - 32767, 32765, 32757, 32745, 32727, 32705, 32678, 32646, - 32609, 32567, 32520, 32468, 32411, 32349, 32283, 32211, - 32135, 32054, 31968, 31877, 31781, 31681, 31575, 31465, - 31351, 31231, 31107, 30978, 30844, 30706, 30563, 30415, - 30263, 30106, 29945, 29779, 29609, 29434, 29255, 29071, - 28883, 28691, 28494, 28293, 28087, 27878, 27664, 27446, - 27224, 26997, 26767, 26533, 26294, 26052, 25806, 25555, - 25301, 25043, 24782, 24516, 24247, 23974, 23698, 23418, - 23134, 22847, 22557, 22263, 21965, 21665, 21361, 21054, - 20743, 20430, 20113, 19794, 19471, 19146, 18817, 18486, - 18152, 17815, 17476, 17134, 16789, 16442, 16092, 15740, - 15385, 15028, 14669, 14308, 13944, 13579, 13211, 12841, - 12470, 12096, 11721, 11344, 10965, 10584, 10202, 9819, - 9433, 9047, 8659, 8270, 7879, 7488, 7095, 6701, - 6306, 5910, 5514, 5116, 4718, 4319, 3919, 3519, - 3118, 2716, 2315, 1913, 1510, 1108, 705, 302}; - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/* Hamming_cos window for LPC analysis. */ +/* Create with function hamm_cos(window,384-128,128) */ + +#define L_WINDOW 384 + +const Word16 vo_window[L_WINDOW] = { + 2621, 2622, 2626, 2632, 2640, 2650, 2662, 2677, + 2694, 2714, 2735, 2759, 2785, 2814, 2844, 2877, + 2912, 2949, 2989, 3031, 3075, 3121, 3169, 3220, + 3273, 3328, 3385, 3444, 3506, 3569, 3635, 3703, + 3773, 3845, 3919, 3996, 4074, 4155, 4237, 4321, + 4408, 4496, 4587, 4680, 4774, 4870, 4969, 5069, + 5171, 5275, 5381, 5489, 5599, 5710, 5824, 5939, + 6056, 6174, 6295, 6417, 6541, 6666, 6793, 6922, + 7052, 7185, 7318, 7453, 7590, 7728, 7868, 8009, + 8152, 8296, 8442, 8589, 8737, 8887, 9038, 9191, + 9344, 9499, 9655, 9813, 9971, 10131, 10292, 10454, + 10617, 10781, 10946, 11113, 11280, 11448, 11617, 11787, + 11958, 12130, 12303, 12476, 12650, 12825, 13001, 13178, + 13355, 13533, 13711, 13890, 14070, 14250, 14431, 14612, + 14793, 14975, 15158, 15341, 15524, 15708, 15891, 16076, + 16260, 16445, 16629, 16814, 16999, 17185, 17370, 17555, + 17740, 17926, 18111, 18296, 18481, 18666, 18851, 19036, + 19221, 19405, 19589, 19773, 19956, 20139, 20322, 20504, + 20686, 20867, 21048, 21229, 21408, 21588, 21767, 21945, + 22122, 22299, 22475, 22651, 22825, 22999, 23172, 23344, + 23516, 23686, 23856, 24025, 24192, 24359, 24525, 24689, + 24853, 25016, 25177, 25337, 25496, 25654, 25811, 25967, + 26121, 26274, 26426, 26576, 26725, 26873, 27019, 27164, + 27308, 27450, 27590, 27729, 27867, 28003, 28137, 28270, + 28401, 28531, 28659, 28785, 28910, 29033, 29154, 29274, + 29391, 29507, 29622, 29734, 29845, 29953, 30060, 30165, + 30268, 30370, 30469, 30566, 30662, 30755, 30847, 30936, + 31024, 31109, 31193, 31274, 31354, 31431, 31506, 31579, + 31651, 31719, 31786, 31851, 31914, 31974, 32032, 32088, + 32142, 32194, 32243, 32291, 32336, 32379, 32419, 32458, + 32494, 32528, 32560, 32589, 32617, 32642, 32664, 32685, + 32703, 32719, 32733, 32744, 32753, 32760, 32764, 32767, + 32767, 32765, 32757, 32745, 32727, 32705, 32678, 32646, + 32609, 32567, 32520, 32468, 32411, 32349, 32283, 32211, + 32135, 32054, 31968, 31877, 31781, 31681, 31575, 31465, + 31351, 31231, 31107, 30978, 30844, 30706, 30563, 30415, + 30263, 30106, 29945, 29779, 29609, 29434, 29255, 29071, + 28883, 28691, 28494, 28293, 28087, 27878, 27664, 27446, + 27224, 26997, 26767, 26533, 26294, 26052, 25806, 25555, + 25301, 25043, 24782, 24516, 24247, 23974, 23698, 23418, + 23134, 22847, 22557, 22263, 21965, 21665, 21361, 21054, + 20743, 20430, 20113, 19794, 19471, 19146, 18817, 18486, + 18152, 17815, 17476, 17134, 16789, 16442, 16092, 15740, + 15385, 15028, 14669, 14308, 13944, 13579, 13211, 12841, + 12470, 12096, 11721, 11344, 10965, 10584, 10202, 9819, + 9433, 9047, 8659, 8270, 7879, 7488, 7095, 6701, + 6306, 5910, 5514, 5116, 4718, 4319, 3919, 3519, + 3118, 2716, 2315, 1913, 1510, 1108, 705, 302}; + + diff --git a/media/libstagefright/codecs/amrwbenc/inc/homing.tab b/media/libstagefright/codecs/amrwbenc/inc/homing.tab index 2963da7..edcccdd 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/homing.tab +++ b/media/libstagefright/codecs/amrwbenc/inc/homing.tab @@ -1,123 +1,123 @@ - -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - - -#define DHF_PARMS_MAX 32 /* homing frame pattern */ -#define NUM_OF_SPMODES 9 - -#define PRML 15 -#define PRMN_7k NBBITS_7k/PRML + 1 -#define PRMN_9k NBBITS_9k/PRML + 1 -#define PRMN_12k NBBITS_12k/PRML + 1 -#define PRMN_14k NBBITS_14k/PRML + 1 -#define PRMN_16k NBBITS_16k/PRML + 1 -#define PRMN_18k NBBITS_18k/PRML + 1 -#define PRMN_20k NBBITS_20k/PRML + 1 -#define PRMN_23k NBBITS_23k/PRML + 1 -#define PRMN_24k NBBITS_24k/PRML + 1 - -static const Word16 dfh_M7k[PRMN_7k] = -{ - 3168, 29954, 29213, 16121, - 64, 13440, 30624, 16430, - 19008 -}; - -static const Word16 dfh_M9k[PRMN_9k] = -{ - 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, - 13948 -}; - -static const Word16 dfh_M14k[PRMN_14k] = -{ - 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, - 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, - 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, - 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, - 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, - 18026, 22047, 16681, 3968 -}; - - - + +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + + +#define DHF_PARMS_MAX 32 /* homing frame pattern */ +#define NUM_OF_SPMODES 9 + +#define PRML 15 +#define PRMN_7k NBBITS_7k/PRML + 1 +#define PRMN_9k NBBITS_9k/PRML + 1 +#define PRMN_12k NBBITS_12k/PRML + 1 +#define PRMN_14k NBBITS_14k/PRML + 1 +#define PRMN_16k NBBITS_16k/PRML + 1 +#define PRMN_18k NBBITS_18k/PRML + 1 +#define PRMN_20k NBBITS_20k/PRML + 1 +#define PRMN_23k NBBITS_23k/PRML + 1 +#define PRMN_24k NBBITS_24k/PRML + 1 + +static const Word16 dfh_M7k[PRMN_7k] = +{ + 3168, 29954, 29213, 16121, + 64, 13440, 30624, 16430, + 19008 +}; + +static const Word16 dfh_M9k[PRMN_9k] = +{ + 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, + 13948 +}; + +static const Word16 dfh_M14k[PRMN_14k] = +{ + 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, + 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, + 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, + 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, + 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, + 18026, 22047, 16681, 3968 +}; + + + diff --git a/media/libstagefright/codecs/amrwbenc/inc/isp_isf.tab b/media/libstagefright/codecs/amrwbenc/inc/isp_isf.tab index ff20e38..2322845 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/isp_isf.tab +++ b/media/libstagefright/codecs/amrwbenc/inc/isp_isf.tab @@ -1,62 +1,62 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*-----------------------------------------------------* - | Tables for function Isf_isp() and Isp_isf() | - *-----------------------------------------------------*/ - -/* table of cos(x) in Q15 */ - -const static Word16 table[129] = { - 32767, - 32758, 32729, 32679, 32610, 32522, 32413, 32286, 32138, - 31972, 31786, 31581, 31357, 31114, 30853, 30572, 30274, - 29957, 29622, 29269, 28899, 28511, 28106, 27684, 27246, - 26791, 26320, 25833, 25330, 24812, 24279, 23732, 23170, - 22595, 22006, 21403, 20788, 20160, 19520, 18868, 18205, - 17531, 16846, 16151, 15447, 14733, 14010, 13279, 12540, - 11793, 11039, 10279, 9512, 8740, 7962, 7180, 6393, - 5602, 4808, 4011, 3212, 2411, 1608, 804, 0, - -804, -1608, -2411, -3212, -4011, -4808, -5602, -6393, - -7180, -7962, -8740, -9512, -10279, -11039, -11793, -12540, - -13279, -14010, -14733, -15447, -16151, -16846, -17531, -18205, - -18868, -19520, -20160, -20788, -21403, -22006, -22595, -23170, - -23732, -24279, -24812, -25330, -25833, -26320, -26791, -27246, - -27684, -28106, -28511, -28899, -29269, -29622, -29957, -30274, - -30572, -30853, -31114, -31357, -31581, -31786, -31972, -32138, - -32286, -32413, -32522, -32610, -32679, -32729, -32758, -32768}; - -/* slope in Q11 used to compute y = acos(x) */ - -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, - -576, -557, -538, -521, -506, -492, -479, -466, - -456, -445, -435, -426, -417, -410, -402, -395, - -389, -383, -377, -372, -367, -363, -359, -355, - -351, -348, -345, -342, -340, -337, -335, -333, - -331, -330, -329, -328, -327, -326, -326, -326, - -326, -326, -326, -327, -328, -329, -330, -331, - -333, -335, -337, -340, -342, -345, -348, -351, - -355, -359, -363, -367, -372, -377, -383, -389, - -395, -402, -410, -417, -426, -435, -445, -456, - -466, -479, -492, -506, -521, -538, -557, -576, - -599, -621, -647, -676, -708, -743, -783, -827, - -880, -933, -1004, -1079, -1170, -1279, -1409, -1579, - -1771, -2064, -2405, -2979, -3799, -5243, -9039, -26214}; - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*-----------------------------------------------------* + | Tables for function Isf_isp() and Isp_isf() | + *-----------------------------------------------------*/ + +/* table of cos(x) in Q15 */ + +const static Word16 table[129] = { + 32767, + 32758, 32729, 32679, 32610, 32522, 32413, 32286, 32138, + 31972, 31786, 31581, 31357, 31114, 30853, 30572, 30274, + 29957, 29622, 29269, 28899, 28511, 28106, 27684, 27246, + 26791, 26320, 25833, 25330, 24812, 24279, 23732, 23170, + 22595, 22006, 21403, 20788, 20160, 19520, 18868, 18205, + 17531, 16846, 16151, 15447, 14733, 14010, 13279, 12540, + 11793, 11039, 10279, 9512, 8740, 7962, 7180, 6393, + 5602, 4808, 4011, 3212, 2411, 1608, 804, 0, + -804, -1608, -2411, -3212, -4011, -4808, -5602, -6393, + -7180, -7962, -8740, -9512, -10279, -11039, -11793, -12540, + -13279, -14010, -14733, -15447, -16151, -16846, -17531, -18205, + -18868, -19520, -20160, -20788, -21403, -22006, -22595, -23170, + -23732, -24279, -24812, -25330, -25833, -26320, -26791, -27246, + -27684, -28106, -28511, -28899, -29269, -29622, -29957, -30274, + -30572, -30853, -31114, -31357, -31581, -31786, -31972, -32138, + -32286, -32413, -32522, -32610, -32679, -32729, -32758, -32768}; + +/* slope in Q11 used to compute y = acos(x) */ + +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, + -576, -557, -538, -521, -506, -492, -479, -466, + -456, -445, -435, -426, -417, -410, -402, -395, + -389, -383, -377, -372, -367, -363, -359, -355, + -351, -348, -345, -342, -340, -337, -335, -333, + -331, -330, -329, -328, -327, -326, -326, -326, + -326, -326, -326, -327, -328, -329, -330, -331, + -333, -335, -337, -340, -342, -345, -348, -351, + -355, -359, -363, -367, -372, -377, -383, -389, + -395, -402, -410, -417, -426, -435, -445, -456, + -466, -479, -492, -506, -521, -538, -557, -576, + -599, -621, -647, -676, -708, -743, -783, -827, + -880, -933, -1004, -1079, -1170, -1279, -1409, -1579, + -1771, -2064, -2405, -2979, -3799, -5243, -9039, -26214}; + diff --git a/media/libstagefright/codecs/amrwbenc/inc/lag_wind.tab b/media/libstagefright/codecs/amrwbenc/inc/lag_wind.tab index 4175d66..9c73357 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/lag_wind.tab +++ b/media/libstagefright/codecs/amrwbenc/inc/lag_wind.tab @@ -1,81 +1,81 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*-----------------------------------------------------* - | Table of lag_window for autocorrelation. | - | noise floor = 1.0001 = (0.9999 on r[1] ..r[16]) | - | Bandwidth expansion = 60 Hz | - | Sampling frequency = 12800 Hz | - | | - | Special double precision format. See "math_op.c" | - | | - | lag_wind[0] = 1.00000000 (not stored) | - | lag_wind[1] = 0.99946642 | - | lag_wind[2] = 0.99816680 | - | lag_wind[3] = 0.99600452 | - | lag_wind[4] = 0.99298513 | - | lag_wind[5] = 0.98911655 | - | lag_wind[6] = 0.98440880 | - | lag_wind[7] = 0.97887397 | - | lag_wind[8] = 0.97252619 | - | lag_wind[9] = 0.96538186 | - | lag_wind[10]= 0.95745903 | - | lag_wind[11]= 0.94877797 | - | lag_wind[12]= 0.93936038 | - | lag_wind[13]= 0.92922986 | - | lag_wind[14]= 0.91841155 | - | lag_wind[15]= 0.90693212 | - | lag_wind[16]= 0.89481968 | - ------------------------------------------------------*/ - -#define M 16 - -static Word16 volag_h[M] = { - 32750, - 32707, - 32637, - 32538, - 32411, - 32257, - 32075, - 31867, - 31633, - 31374, - 31089, - 30780, - 30449, - 30094, - 29718, - 29321}; - -static Word16 volag_l[M] = { - 16896, - 30464, - 2496, - 4480, - 12160, - 3520, - 24320, - 24192, - 20736, - 576, - 18240, - 31488, - 128, - 16704, - 11520, - 14784}; +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*-----------------------------------------------------* + | Table of lag_window for autocorrelation. | + | noise floor = 1.0001 = (0.9999 on r[1] ..r[16]) | + | Bandwidth expansion = 60 Hz | + | Sampling frequency = 12800 Hz | + | | + | Special double precision format. See "math_op.c" | + | | + | lag_wind[0] = 1.00000000 (not stored) | + | lag_wind[1] = 0.99946642 | + | lag_wind[2] = 0.99816680 | + | lag_wind[3] = 0.99600452 | + | lag_wind[4] = 0.99298513 | + | lag_wind[5] = 0.98911655 | + | lag_wind[6] = 0.98440880 | + | lag_wind[7] = 0.97887397 | + | lag_wind[8] = 0.97252619 | + | lag_wind[9] = 0.96538186 | + | lag_wind[10]= 0.95745903 | + | lag_wind[11]= 0.94877797 | + | lag_wind[12]= 0.93936038 | + | lag_wind[13]= 0.92922986 | + | lag_wind[14]= 0.91841155 | + | lag_wind[15]= 0.90693212 | + | lag_wind[16]= 0.89481968 | + ------------------------------------------------------*/ + +#define M 16 + +static Word16 volag_h[M] = { + 32750, + 32707, + 32637, + 32538, + 32411, + 32257, + 32075, + 31867, + 31633, + 31374, + 31089, + 30780, + 30449, + 30094, + 29718, + 29321}; + +static Word16 volag_l[M] = { + 16896, + 30464, + 2496, + 4480, + 12160, + 3520, + 24320, + 24192, + 20736, + 576, + 18240, + 31488, + 128, + 16704, + 11520, + 14784}; diff --git a/media/libstagefright/codecs/amrwbenc/inc/log2.h b/media/libstagefright/codecs/amrwbenc/inc/log2.h index 91bdbec..6a35019 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/log2.h +++ b/media/libstagefright/codecs/amrwbenc/inc/log2.h @@ -1,62 +1,62 @@ - -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/******************************************************************************** -* -* File : log2.h -* Purpose : Computes log2(L_x) -* -******************************************************************************** -*/ -#ifndef __LOG2_H__ -#define __LOG2_H__ - -/* -******************************************************************************** -* INCLUDE FILES -******************************************************************************** -*/ -#include "typedef.h" - -/* -******************************************************************************** -* DEFINITION OF DATA TYPES -******************************************************************************** -*/ - -/* -******************************************************************************** -* DECLARATION OF PROTOTYPES -******************************************************************************** -*/ -void Log2 ( - Word32 L_x, /* (i) : input value */ - Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */ - Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1)*/ - ); - -void Log2_norm ( - Word32 L_x, /* (i) : input value (normalized) */ - Word16 exp, /* (i) : norm_l (L_x) */ - Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */ - Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */ - ); - -#endif //__LOG2_H__ - - + +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/******************************************************************************** +* +* File : log2.h +* Purpose : Computes log2(L_x) +* +******************************************************************************** +*/ +#ifndef __LOG2_H__ +#define __LOG2_H__ + +/* +******************************************************************************** +* INCLUDE FILES +******************************************************************************** +*/ +#include "typedef.h" + +/* +******************************************************************************** +* DEFINITION OF DATA TYPES +******************************************************************************** +*/ + +/* +******************************************************************************** +* DECLARATION OF PROTOTYPES +******************************************************************************** +*/ +void Log2 ( + Word32 L_x, /* (i) : input value */ + Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */ + Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1)*/ + ); + +void Log2_norm ( + Word32 L_x, /* (i) : input value (normalized) */ + Word16 exp, /* (i) : norm_l (L_x) */ + Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */ + Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */ + ); + +#endif //__LOG2_H__ + + diff --git a/media/libstagefright/codecs/amrwbenc/inc/log2_tab.h b/media/libstagefright/codecs/amrwbenc/inc/log2_tab.h index 7761ae6..85fa73c 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/log2_tab.h +++ b/media/libstagefright/codecs/amrwbenc/inc/log2_tab.h @@ -1,35 +1,35 @@ - -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - - -/******************************************************************************* -* -* File : log2.tab -* Purpose : Table for routine Log2(). -* $Id $ -* -******************************************************************************** -*/ -static const Word16 table[33] = -{ - 0, 1455, 2866, 4236, 5568, 6863, 8124, 9352, 10549, 11716, - 12855, 13967, 15054, 16117, 17156, 18172, 19167, 20142, 21097, 22033, - 22951, 23852, 24735, 25603, 26455, 27291, 28113, 28922, 29716, 30497, - 31266, 32023, 32767 -}; - + +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + + +/******************************************************************************* +* +* File : log2.tab +* Purpose : Table for routine Log2(). +* $Id $ +* +******************************************************************************** +*/ +static const Word16 table[33] = +{ + 0, 1455, 2866, 4236, 5568, 6863, 8124, 9352, 10549, 11716, + 12855, 13967, 15054, 16117, 17156, 18172, 19167, 20142, 21097, 22033, + 22951, 23852, 24735, 25603, 26455, 27291, 28113, 28922, 29716, 30497, + 31266, 32023, 32767 +}; + diff --git a/media/libstagefright/codecs/amrwbenc/inc/main.h b/media/libstagefright/codecs/amrwbenc/inc/main.h index d7e7c67..3a6f963 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/main.h +++ b/media/libstagefright/codecs/amrwbenc/inc/main.h @@ -1,45 +1,45 @@ - -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*--------------------------------------------------------------------------* - * MAIN.H * - *--------------------------------------------------------------------------* - * Main functions * - *--------------------------------------------------------------------------*/ - -#ifndef __MAIN_H__ -#define __MAIN_H__ - -void coder( - Word16 * mode, /* input : used mode */ - Word16 speech16k[], /* input : 320 new speech samples (at 16 kHz) */ - Word16 prms[], /* output: output parameters */ - Word16 * ser_size, /* output: bit rate of the used mode */ - void *spe_state, /* i/o : State structure */ - Word16 allow_dtx /* input : DTX ON/OFF */ -); - - - -void Reset_encoder(void *st, Word16 reset_all); - - -Word16 encoder_homing_frame_test(Word16 input_frame[]); - -#endif //__MAIN_H__ - + +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*--------------------------------------------------------------------------* + * MAIN.H * + *--------------------------------------------------------------------------* + * Main functions * + *--------------------------------------------------------------------------*/ + +#ifndef __MAIN_H__ +#define __MAIN_H__ + +void coder( + Word16 * mode, /* input : used mode */ + Word16 speech16k[], /* input : 320 new speech samples (at 16 kHz) */ + Word16 prms[], /* output: output parameters */ + Word16 * ser_size, /* output: bit rate of the used mode */ + void *spe_state, /* i/o : State structure */ + Word16 allow_dtx /* input : DTX ON/OFF */ +); + + + +void Reset_encoder(void *st, Word16 reset_all); + + +Word16 encoder_homing_frame_test(Word16 input_frame[]); + +#endif //__MAIN_H__ + diff --git a/media/libstagefright/codecs/amrwbenc/inc/math_op.h b/media/libstagefright/codecs/amrwbenc/inc/math_op.h index 25e29f7..7b6196b 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/math_op.h +++ b/media/libstagefright/codecs/amrwbenc/inc/math_op.h @@ -1,55 +1,55 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*--------------------------------------------------------------------------* - * MATH_OP.H * - *--------------------------------------------------------------------------* - * Mathematical operations * - *--------------------------------------------------------------------------*/ - -#ifndef __MATH_OP_H__ -#define __MATH_OP_H__ - -Word32 Isqrt( /* (o) Q31 : output value (range: 0<=val<1) */ - Word32 L_x /* (i) Q0 : input value (range: 0<=val<=7fffffff) */ - ); - -void Isqrt_n( - Word32 * frac, /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */ - Word16 * exp /* (i/o) : exponent (value = frac x 2^exponent) */ - ); - -Word32 Pow2( /* (o) Q0 : result (range: 0<=val<=0x7fffffff) */ - Word16 exponant, /* (i) Q0 : Integer part. (range: 0<=val<=30) */ - Word16 fraction /* (i) Q15 : Fractionnal part. (range: 0.0<=val<1.0) */ - ); - -Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */ - Word16 x[], /* (i) 12bits: x vector */ - Word16 y[], /* (i) 12bits: y vector */ - Word16 lg, /* (i) : vector length */ - Word16 * exp /* (o) : exponent of result (0..+30) */ - ); - -Word32 Dot_product12_asm( /* (o) Q31: normalized result (1 < val <= -1) */ - Word16 x[], /* (i) 12bits: x vector */ - Word16 y[], /* (i) 12bits: y vector */ - Word16 lg, /* (i) : vector length */ - Word16 * exp /* (o) : exponent of result (0..+30) */ - ); -#endif //__MATH_OP_H__ - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*--------------------------------------------------------------------------* + * MATH_OP.H * + *--------------------------------------------------------------------------* + * Mathematical operations * + *--------------------------------------------------------------------------*/ + +#ifndef __MATH_OP_H__ +#define __MATH_OP_H__ + +Word32 Isqrt( /* (o) Q31 : output value (range: 0<=val<1) */ + Word32 L_x /* (i) Q0 : input value (range: 0<=val<=7fffffff) */ + ); + +void Isqrt_n( + Word32 * frac, /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */ + Word16 * exp /* (i/o) : exponent (value = frac x 2^exponent) */ + ); + +Word32 Pow2( /* (o) Q0 : result (range: 0<=val<=0x7fffffff) */ + Word16 exponant, /* (i) Q0 : Integer part. (range: 0<=val<=30) */ + Word16 fraction /* (i) Q15 : Fractionnal part. (range: 0.0<=val<1.0) */ + ); + +Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */ + Word16 x[], /* (i) 12bits: x vector */ + Word16 y[], /* (i) 12bits: y vector */ + Word16 lg, /* (i) : vector length */ + Word16 * exp /* (o) : exponent of result (0..+30) */ + ); + +Word32 Dot_product12_asm( /* (o) Q31: normalized result (1 < val <= -1) */ + Word16 x[], /* (i) 12bits: x vector */ + Word16 y[], /* (i) 12bits: y vector */ + Word16 lg, /* (i) : vector length */ + Word16 * exp /* (o) : exponent of result (0..+30) */ + ); +#endif //__MATH_OP_H__ + diff --git a/media/libstagefright/codecs/amrwbenc/inc/mem_align.h b/media/libstagefright/codecs/amrwbenc/inc/mem_align.h index d6ddec3..442786a 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/mem_align.h +++ b/media/libstagefright/codecs/amrwbenc/inc/mem_align.h @@ -1,35 +1,35 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: mem_align.h - - Content: Memory alloc alignments functions - -*******************************************************************************/ - -#ifndef __VO_MEM_ALIGN_H__ -#define __VO_MEM_ALIGN_H__ - -#include "voMem.h" -#include "typedef.h" - -extern void *mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID); -extern void mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID); - -#endif /* __VO_MEM_ALIGN_H__ */ - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: mem_align.h + + Content: Memory alloc alignments functions + +*******************************************************************************/ + +#ifndef __VO_MEM_ALIGN_H__ +#define __VO_MEM_ALIGN_H__ + +#include "voMem.h" +#include "typedef.h" + +extern void *mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID); +extern void mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID); + +#endif /* __VO_MEM_ALIGN_H__ */ + + + diff --git a/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab b/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab index ffc86a1..5f85dd0 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab +++ b/media/libstagefright/codecs/amrwbenc/inc/mime_io.tab @@ -1,368 +1,368 @@ - -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -#include -#include "typedef.h" - -static UWord8 toc_byte[16] = {0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x34, 0x3C, - 0x44, 0x4C, 0x54, 0x5C, 0x64, 0x6C, 0x74, 0x7C}; - -/* number of speech bits for all modes */ -static Word16 unpacked_size[16] = {132, 177, 253, 285, 317, 365, 397, 461, - 477, 35, 0, 0, 0, 0, 0, 0}; - -/* size of packed frame for each mode, excluding TOC byte */ -static Word16 packed_size[16] = {17, 23, 32, 36, 40, 46, 50, 58, - 60, 5, 0, 0, 0, 0, 0, 0}; - -/* number of unused speech bits in packed format for each mode */ -static Word16 unused_size[16] = {4, 7, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0}; - -/* sorting tables for all modes */ - -static Word16 sort_660[132] = { - 0, 5, 6, 7, 61, 84, 107, 130, 62, 85, - 8, 4, 37, 38, 39, 40, 58, 81, 104, 127, - 60, 83, 106, 129, 108, 131, 128, 41, 42, 80, - 126, 1, 3, 57, 103, 82, 105, 59, 2, 63, - 109, 110, 86, 19, 22, 23, 64, 87, 18, 20, - 21, 17, 13, 88, 43, 89, 65, 111, 14, 24, - 25, 26, 27, 28, 15, 16, 44, 90, 66, 112, - 9, 11, 10, 12, 67, 113, 29, 30, 31, 32, - 34, 33, 35, 36, 45, 51, 68, 74, 91, 97, - 114, 120, 46, 69, 92, 115, 52, 75, 98, 121, - 47, 70, 93, 116, 53, 76, 99, 122, 48, 71, - 94, 117, 54, 77, 100, 123, 49, 72, 95, 118, - 55, 78, 101, 124, 50, 73, 96, 119, 56, 79, - 102, 125 -}; - -static Word16 sort_885[177] = { - 0, 4, 6, 7, 5, 3, 47, 48, 49, 112, - 113, 114, 75, 106, 140, 171, 80, 111, 145, 176, - 77, 108, 142, 173, 78, 109, 143, 174, 79, 110, - 144, 175, 76, 107, 141, 172, 50, 115, 51, 2, - 1, 81, 116, 146, 19, 21, 12, 17, 18, 20, - 16, 25, 13, 10, 14, 24, 23, 22, 26, 8, - 15, 52, 117, 31, 82, 147, 9, 33, 11, 83, - 148, 53, 118, 28, 27, 84, 149, 34, 35, 29, - 46, 32, 30, 54, 119, 37, 36, 39, 38, 40, - 85, 150, 41, 42, 43, 44, 45, 55, 60, 65, - 70, 86, 91, 96, 101, 120, 125, 130, 135, 151, - 156, 161, 166, 56, 87, 121, 152, 61, 92, 126, - 157, 66, 97, 131, 162, 71, 102, 136, 167, 57, - 88, 122, 153, 62, 93, 127, 158, 67, 98, 132, - 163, 72, 103, 137, 168, 58, 89, 123, 154, 63, - 94, 128, 159, 68, 99, 133, 164, 73, 104, 138, - 169, 59, 90, 124, 155, 64, 95, 129, 160, 69, - 100, 134, 165, 74, 105, 139, 170 -}; - -static Word16 sort_1265[253] = { - 0, 4, 6, 93, 143, 196, 246, 7, 5, 3, - 47, 48, 49, 50, 51, 150, 151, 152, 153, 154, - 94, 144, 197, 247, 99, 149, 202, 252, 96, 146, - 199, 249, 97, 147, 200, 250, 100, 203, 98, 148, - 201, 251, 95, 145, 198, 248, 52, 2, 1, 101, - 204, 155, 19, 21, 12, 17, 18, 20, 16, 25, - 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, - 156, 31, 102, 205, 9, 33, 11, 103, 206, 54, - 157, 28, 27, 104, 207, 34, 35, 29, 46, 32, - 30, 55, 158, 37, 36, 39, 38, 40, 105, 208, - 41, 42, 43, 44, 45, 56, 106, 159, 209, 57, - 66, 75, 84, 107, 116, 125, 134, 160, 169, 178, - 187, 210, 219, 228, 237, 58, 108, 161, 211, 62, - 112, 165, 215, 67, 117, 170, 220, 71, 121, 174, - 224, 76, 126, 179, 229, 80, 130, 183, 233, 85, - 135, 188, 238, 89, 139, 192, 242, 59, 109, 162, - 212, 63, 113, 166, 216, 68, 118, 171, 221, 72, - 122, 175, 225, 77, 127, 180, 230, 81, 131, 184, - 234, 86, 136, 189, 239, 90, 140, 193, 243, 60, - 110, 163, 213, 64, 114, 167, 217, 69, 119, 172, - 222, 73, 123, 176, 226, 78, 128, 181, 231, 82, - 132, 185, 235, 87, 137, 190, 240, 91, 141, 194, - 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 -}; - -static Word16 sort_1425[285] = { - 0, 4, 6, 101, 159, 220, 278, 7, 5, 3, - 47, 48, 49, 50, 51, 166, 167, 168, 169, 170, - 102, 160, 221, 279, 107, 165, 226, 284, 104, 162, - 223, 281, 105, 163, 224, 282, 108, 227, 106, 164, - 225, 283, 103, 161, 222, 280, 52, 2, 1, 109, - 228, 171, 19, 21, 12, 17, 18, 20, 16, 25, - 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, - 172, 31, 110, 229, 9, 33, 11, 111, 230, 54, - 173, 28, 27, 112, 231, 34, 35, 29, 46, 32, - 30, 55, 174, 37, 36, 39, 38, 40, 113, 232, - 41, 42, 43, 44, 45, 56, 114, 175, 233, 62, - 120, 181, 239, 75, 133, 194, 252, 57, 115, 176, - 234, 63, 121, 182, 240, 70, 128, 189, 247, 76, - 134, 195, 253, 83, 141, 202, 260, 92, 150, 211, - 269, 84, 142, 203, 261, 93, 151, 212, 270, 85, - 143, 204, 262, 94, 152, 213, 271, 86, 144, 205, - 263, 95, 153, 214, 272, 64, 122, 183, 241, 77, - 135, 196, 254, 65, 123, 184, 242, 78, 136, 197, - 255, 87, 145, 206, 264, 96, 154, 215, 273, 58, - 116, 177, 235, 66, 124, 185, 243, 71, 129, 190, - 248, 79, 137, 198, 256, 88, 146, 207, 265, 97, - 155, 216, 274, 59, 117, 178, 236, 67, 125, 186, - 244, 72, 130, 191, 249, 80, 138, 199, 257, 89, - 147, 208, 266, 98, 156, 217, 275, 60, 118, 179, - 237, 68, 126, 187, 245, 73, 131, 192, 250, 81, - 139, 200, 258, 90, 148, 209, 267, 99, 157, 218, - 276, 61, 119, 180, 238, 69, 127, 188, 246, 74, - 132, 193, 251, 82, 140, 201, 259, 91, 149, 210, - 268, 100, 158, 219, 277 -}; - -static Word16 sort_1585[317] = { - 0, 4, 6, 109, 175, 244, 310, 7, 5, 3, - 47, 48, 49, 50, 51, 182, 183, 184, 185, 186, - 110, 176, 245, 311, 115, 181, 250, 316, 112, 178, - 247, 313, 113, 179, 248, 314, 116, 251, 114, 180, - 249, 315, 111, 177, 246, 312, 52, 2, 1, 117, - 252, 187, 19, 21, 12, 17, 18, 20, 16, 25, - 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, - 188, 31, 118, 253, 9, 33, 11, 119, 254, 54, - 189, 28, 27, 120, 255, 34, 35, 29, 46, 32, - 30, 55, 190, 37, 36, 39, 38, 40, 121, 256, - 41, 42, 43, 44, 45, 56, 122, 191, 257, 63, - 129, 198, 264, 76, 142, 211, 277, 89, 155, 224, - 290, 102, 168, 237, 303, 57, 123, 192, 258, 70, - 136, 205, 271, 83, 149, 218, 284, 96, 162, 231, - 297, 62, 128, 197, 263, 75, 141, 210, 276, 88, - 154, 223, 289, 101, 167, 236, 302, 58, 124, 193, - 259, 71, 137, 206, 272, 84, 150, 219, 285, 97, - 163, 232, 298, 59, 125, 194, 260, 64, 130, 199, - 265, 67, 133, 202, 268, 72, 138, 207, 273, 77, - 143, 212, 278, 80, 146, 215, 281, 85, 151, 220, - 286, 90, 156, 225, 291, 93, 159, 228, 294, 98, - 164, 233, 299, 103, 169, 238, 304, 106, 172, 241, - 307, 60, 126, 195, 261, 65, 131, 200, 266, 68, - 134, 203, 269, 73, 139, 208, 274, 78, 144, 213, - 279, 81, 147, 216, 282, 86, 152, 221, 287, 91, - 157, 226, 292, 94, 160, 229, 295, 99, 165, 234, - 300, 104, 170, 239, 305, 107, 173, 242, 308, 61, - 127, 196, 262, 66, 132, 201, 267, 69, 135, 204, - 270, 74, 140, 209, 275, 79, 145, 214, 280, 82, - 148, 217, 283, 87, 153, 222, 288, 92, 158, 227, - 293, 95, 161, 230, 296, 100, 166, 235, 301, 105, - 171, 240, 306, 108, 174, 243, 309 -}; - -static Word16 sort_1825[365] = { - 0, 4, 6, 121, 199, 280, 358, 7, 5, 3, - 47, 48, 49, 50, 51, 206, 207, 208, 209, 210, - 122, 200, 281, 359, 127, 205, 286, 364, 124, 202, - 283, 361, 125, 203, 284, 362, 128, 287, 126, 204, - 285, 363, 123, 201, 282, 360, 52, 2, 1, 129, - 288, 211, 19, 21, 12, 17, 18, 20, 16, 25, - 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, - 212, 31, 130, 289, 9, 33, 11, 131, 290, 54, - 213, 28, 27, 132, 291, 34, 35, 29, 46, 32, - 30, 55, 214, 37, 36, 39, 38, 40, 133, 292, - 41, 42, 43, 44, 45, 56, 134, 215, 293, 198, - 299, 136, 120, 138, 60, 279, 58, 62, 357, 139, - 140, 295, 156, 57, 219, 297, 63, 217, 137, 170, - 300, 222, 64, 106, 61, 78, 294, 92, 142, 141, - 135, 221, 296, 301, 343, 59, 298, 184, 329, 315, - 220, 216, 265, 251, 218, 237, 352, 223, 157, 86, - 171, 87, 164, 351, 111, 302, 65, 178, 115, 323, - 72, 192, 101, 179, 93, 73, 193, 151, 337, 309, - 143, 274, 69, 324, 165, 150, 97, 338, 110, 310, - 330, 273, 68, 107, 175, 245, 114, 79, 113, 189, - 246, 259, 174, 71, 185, 96, 344, 100, 322, 83, - 334, 316, 333, 252, 161, 348, 147, 82, 269, 232, - 260, 308, 353, 347, 163, 231, 306, 320, 188, 270, - 146, 177, 266, 350, 256, 85, 149, 116, 191, 160, - 238, 258, 336, 305, 255, 88, 224, 99, 339, 230, - 228, 227, 272, 242, 241, 319, 233, 311, 102, 74, - 180, 275, 66, 194, 152, 325, 172, 247, 244, 261, - 117, 158, 166, 354, 75, 144, 108, 312, 94, 186, - 303, 80, 234, 89, 195, 112, 340, 181, 345, 317, - 326, 276, 239, 167, 118, 313, 70, 355, 327, 253, - 190, 176, 271, 104, 98, 153, 103, 90, 76, 267, - 277, 248, 225, 262, 182, 84, 154, 235, 335, 168, - 331, 196, 341, 249, 162, 307, 148, 349, 263, 321, - 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 -}; - -static Word16 sort_1985[397] = { - 0, 4, 6, 129, 215, 304, 390, 7, 5, 3, - 47, 48, 49, 50, 51, 222, 223, 224, 225, 226, - 130, 216, 305, 391, 135, 221, 310, 396, 132, 218, - 307, 393, 133, 219, 308, 394, 136, 311, 134, 220, - 309, 395, 131, 217, 306, 392, 52, 2, 1, 137, - 312, 227, 19, 21, 12, 17, 18, 20, 16, 25, - 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, - 228, 31, 138, 313, 9, 33, 11, 139, 314, 54, - 229, 28, 27, 140, 315, 34, 35, 29, 46, 32, - 30, 55, 230, 37, 36, 39, 38, 40, 141, 316, - 41, 42, 43, 44, 45, 56, 142, 231, 317, 63, - 73, 92, 340, 82, 324, 149, 353, 159, 334, 165, - 338, 178, 163, 254, 77, 168, 257, 153, 343, 57, - 248, 238, 79, 252, 166, 67, 80, 201, 101, 267, - 143, 164, 341, 255, 339, 187, 376, 318, 78, 328, - 362, 115, 232, 242, 253, 290, 276, 62, 58, 158, - 68, 93, 179, 319, 148, 169, 154, 72, 385, 329, - 333, 344, 102, 83, 144, 233, 323, 124, 243, 192, - 354, 237, 64, 247, 202, 209, 150, 116, 335, 268, - 239, 299, 188, 196, 298, 94, 195, 258, 123, 363, - 384, 109, 325, 371, 170, 370, 84, 110, 295, 180, - 74, 210, 191, 106, 291, 205, 367, 381, 377, 206, - 355, 122, 119, 120, 383, 160, 105, 108, 277, 380, - 294, 284, 285, 345, 208, 269, 249, 366, 386, 300, - 297, 259, 125, 369, 197, 97, 194, 286, 211, 281, - 280, 183, 372, 87, 155, 283, 59, 348, 327, 184, - 76, 111, 330, 203, 349, 69, 98, 152, 145, 189, - 66, 320, 337, 173, 358, 251, 198, 174, 263, 262, - 126, 241, 193, 88, 388, 117, 95, 387, 112, 359, - 287, 244, 103, 272, 301, 171, 162, 234, 273, 127, - 373, 181, 292, 85, 378, 302, 121, 107, 364, 346, - 356, 212, 278, 213, 65, 382, 288, 207, 113, 175, - 99, 296, 374, 368, 199, 260, 185, 336, 331, 161, - 270, 264, 250, 240, 75, 350, 151, 60, 89, 321, - 156, 274, 360, 326, 70, 282, 167, 146, 352, 81, - 91, 389, 266, 245, 177, 235, 190, 256, 204, 342, - 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 -}; - -static Word16 sort_2305[461] = { - 0, 4, 6, 145, 247, 352, 454, 7, 5, 3, - 47, 48, 49, 50, 51, 254, 255, 256, 257, 258, - 146, 248, 353, 455, 151, 253, 358, 460, 148, 250, - 355, 457, 149, 251, 356, 458, 152, 359, 150, 252, - 357, 459, 147, 249, 354, 456, 52, 2, 1, 153, - 360, 259, 19, 21, 12, 17, 18, 20, 16, 25, - 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, - 260, 31, 154, 361, 9, 33, 11, 155, 362, 54, - 261, 28, 27, 156, 363, 34, 35, 29, 46, 32, - 30, 55, 262, 37, 36, 39, 38, 40, 157, 364, - 41, 42, 43, 44, 45, 56, 158, 263, 365, 181, - 192, 170, 79, 57, 399, 90, 159, 297, 377, 366, - 275, 68, 183, 388, 286, 194, 299, 92 , 70, 182, - 401, 172, 59, 91, 58, 400, 368, 161, 81, 160, - 264, 171, 80, 389, 390, 378, 379, 193, 298, 69, - 266, 265, 367, 277, 288, 276, 287, 184, 60, 195, - 82, 93, 71, 369, 402, 173, 162, 444, 300, 391, - 98, 76, 278, 61, 267, 374, 135, 411, 167, 102, - 380, 200, 87, 178, 65, 94, 204, 124, 72, 342, - 189, 305, 381, 396, 433, 301, 226, 407, 289, 237, - 113, 215, 185, 128, 309, 403, 116, 320, 196, 331, - 370, 422, 174, 64, 392, 83, 425, 219, 134, 188, - 432, 112, 427, 139, 279, 163, 436, 208, 447, 218, - 236, 229, 97, 294, 385, 230, 166, 268, 177, 443, - 225, 426, 101, 272, 138, 127, 290, 117, 347, 199, - 414, 95, 140, 240, 410, 395, 209, 129, 283, 346, - 105, 241, 437, 86, 308, 448, 203, 345, 186, 107, - 220, 415, 334, 319, 106, 313, 118, 123, 73, 207, - 421, 214, 384, 373, 438, 62, 371, 341, 75, 449, - 168, 323, 164, 242, 416, 324, 304, 197, 335, 404, - 271, 63, 191, 325, 96, 169, 231, 280, 312, 187, - 406, 84, 201, 100, 67, 382, 175, 336, 202, 330, - 269, 393, 376, 383, 293, 307, 409, 179, 285, 314, - 302, 372, 398, 190, 180, 89, 99, 103, 232, 78, - 88, 77, 136, 387, 165, 198, 394, 125, 176, 428, - 74, 375, 238, 227, 66, 273, 282, 141, 306, 412, - 114, 85, 130, 348, 119, 291, 296, 386, 233, 397, - 303, 405, 284, 445, 423, 221, 210, 205, 450, 108, - 274, 434, 216, 343, 337, 142, 243, 321, 408, 451, - 310, 292, 120, 109, 281, 439, 270, 429, 332, 295, - 418, 211, 315, 222, 326, 131, 430, 244, 327, 349, - 417, 316, 143, 338, 440, 234, 110, 212, 452, 245, - 121, 419, 350, 223, 132, 441, 328, 413, 317, 339, - 126, 104, 137, 446, 344, 239, 435, 115, 333, 206, - 322, 217, 228, 424, 453, 311, 351, 111, 442, 224, - 213, 122, 431, 340, 235, 246, 133, 144, 420, 329, - 318 -}; - -static Word16 sort_2385[477] = { - 0, 4, 6, 145, 251, 360, 466, 7, 5, 3, - 47, 48, 49, 50, 51, 262, 263, 264, 265, 266, - 146, 252, 361, 467, 151, 257, 366, 472, 148, 254, - 363, 469, 149, 255, 364, 470, 156, 371, 150, 256, - 365, 471, 147, 253, 362, 468, 52, 2, 1, 157, - 372, 267, 19, 21, 12, 17, 18, 20, 16, 25, - 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, - 268, 31, 152, 153, 154, 155, 258, 259, 260, 261, - 367, 368, 369, 370, 473, 474, 475, 476, 158, 373, - 9, 33, 11, 159, 374, 54, 269, 28, 27, 160, - 375, 34, 35, 29, 46, 32, 30, 55, 270, 37, - 36, 39, 38, 40, 161, 376, 41, 42, 43, 44, - 45, 56, 162, 271, 377, 185, 196, 174, 79, 57, - 411, 90, 163, 305, 389, 378, 283, 68, 187, 400, - 294, 198, 307, 92, 70, 186, 413, 176, 59, 91, - 58, 412, 380, 165, 81, 164, 272, 175, 80, 401, - 402, 390, 391, 197, 306, 69, 274, 273, 379, 285, - 296, 284, 295, 188, 60, 199, 82, 93, 71, 381, - 414, 177, 166, 456, 308, 403, 98, 76, 286, 61, - 275, 386, 135, 423, 171, 102, 392, 204, 87, 182, - 65, 94, 208, 124, 72, 350, 193, 313, 393, 408, - 445, 309, 230, 419, 297, 241, 113, 219, 189, 128, - 317, 415, 116, 328, 200, 339, 382, 434, 178, 64, - 404, 83, 437, 223, 134, 192, 444, 112, 439, 139, - 287, 167, 448, 212, 459, 222, 240, 233, 97, 302, - 397, 234, 170, 276, 181, 455, 229, 438, 101, 280, - 138, 127, 298, 117, 355, 203, 426, 95, 140, 244, - 422, 407, 213, 129, 291, 354, 105, 245, 449, 86, - 316, 460, 207, 353, 190, 107, 224, 427, 342, 327, - 106, 321, 118, 123, 73, 211, 433, 218, 396, 385, - 450, 62, 383, 349, 75, 461, 172, 331, 168, 246, - 428, 332, 312, 201, 343, 416, 279, 63, 195, 333, - 96, 173, 235, 288, 320, 191, 418, 84, 205, 100, - 67, 394, 179, 344, 206, 338, 277, 405, 388, 395, - 301, 315, 421, 183, 293, 322, 310, 384, 410, 194, - 184, 89, 99, 103, 236, 78, 88, 77, 136, 399, - 169, 202, 406, 125, 180, 440, 74, 387, 242, 231, - 66, 281, 290, 141, 314, 424, 114, 85, 130, 356, - 119, 299, 304, 398, 237, 409, 311, 417, 292, 457, - 435, 225, 214, 209, 462, 108, 282, 446, 220, 351, - 345, 142, 247, 329, 420, 463, 318, 300, 120, 109, - 289, 451, 278, 441, 340, 303, 430, 215, 323, 226, - 334, 131, 442, 248, 335, 357, 429, 324, 143, 346, - 452, 238, 110, 216, 464, 249, 121, 431, 358, 227, - 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 -}; - -static Word16 sort_SID[35] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34 -}; - -/* pointer table for bit sorting tables */ -static Word16 *sort_ptr[16] = { sort_660, sort_885, sort_1265, sort_1425, sort_1585, sort_1825, sort_1985, sort_2305, - sort_2385, sort_SID, NULL, NULL, NULL, NULL, NULL, NULL}; - - - - + +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +#include +#include "typedef.h" + +static UWord8 toc_byte[16] = {0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x34, 0x3C, + 0x44, 0x4C, 0x54, 0x5C, 0x64, 0x6C, 0x74, 0x7C}; + +/* number of speech bits for all modes */ +static Word16 unpacked_size[16] = {132, 177, 253, 285, 317, 365, 397, 461, + 477, 35, 0, 0, 0, 0, 0, 0}; + +/* size of packed frame for each mode, excluding TOC byte */ +static Word16 packed_size[16] = {17, 23, 32, 36, 40, 46, 50, 58, + 60, 5, 0, 0, 0, 0, 0, 0}; + +/* number of unused speech bits in packed format for each mode */ +static Word16 unused_size[16] = {4, 7, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0}; + +/* sorting tables for all modes */ + +static Word16 sort_660[132] = { + 0, 5, 6, 7, 61, 84, 107, 130, 62, 85, + 8, 4, 37, 38, 39, 40, 58, 81, 104, 127, + 60, 83, 106, 129, 108, 131, 128, 41, 42, 80, + 126, 1, 3, 57, 103, 82, 105, 59, 2, 63, + 109, 110, 86, 19, 22, 23, 64, 87, 18, 20, + 21, 17, 13, 88, 43, 89, 65, 111, 14, 24, + 25, 26, 27, 28, 15, 16, 44, 90, 66, 112, + 9, 11, 10, 12, 67, 113, 29, 30, 31, 32, + 34, 33, 35, 36, 45, 51, 68, 74, 91, 97, + 114, 120, 46, 69, 92, 115, 52, 75, 98, 121, + 47, 70, 93, 116, 53, 76, 99, 122, 48, 71, + 94, 117, 54, 77, 100, 123, 49, 72, 95, 118, + 55, 78, 101, 124, 50, 73, 96, 119, 56, 79, + 102, 125 +}; + +static Word16 sort_885[177] = { + 0, 4, 6, 7, 5, 3, 47, 48, 49, 112, + 113, 114, 75, 106, 140, 171, 80, 111, 145, 176, + 77, 108, 142, 173, 78, 109, 143, 174, 79, 110, + 144, 175, 76, 107, 141, 172, 50, 115, 51, 2, + 1, 81, 116, 146, 19, 21, 12, 17, 18, 20, + 16, 25, 13, 10, 14, 24, 23, 22, 26, 8, + 15, 52, 117, 31, 82, 147, 9, 33, 11, 83, + 148, 53, 118, 28, 27, 84, 149, 34, 35, 29, + 46, 32, 30, 54, 119, 37, 36, 39, 38, 40, + 85, 150, 41, 42, 43, 44, 45, 55, 60, 65, + 70, 86, 91, 96, 101, 120, 125, 130, 135, 151, + 156, 161, 166, 56, 87, 121, 152, 61, 92, 126, + 157, 66, 97, 131, 162, 71, 102, 136, 167, 57, + 88, 122, 153, 62, 93, 127, 158, 67, 98, 132, + 163, 72, 103, 137, 168, 58, 89, 123, 154, 63, + 94, 128, 159, 68, 99, 133, 164, 73, 104, 138, + 169, 59, 90, 124, 155, 64, 95, 129, 160, 69, + 100, 134, 165, 74, 105, 139, 170 +}; + +static Word16 sort_1265[253] = { + 0, 4, 6, 93, 143, 196, 246, 7, 5, 3, + 47, 48, 49, 50, 51, 150, 151, 152, 153, 154, + 94, 144, 197, 247, 99, 149, 202, 252, 96, 146, + 199, 249, 97, 147, 200, 250, 100, 203, 98, 148, + 201, 251, 95, 145, 198, 248, 52, 2, 1, 101, + 204, 155, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 156, 31, 102, 205, 9, 33, 11, 103, 206, 54, + 157, 28, 27, 104, 207, 34, 35, 29, 46, 32, + 30, 55, 158, 37, 36, 39, 38, 40, 105, 208, + 41, 42, 43, 44, 45, 56, 106, 159, 209, 57, + 66, 75, 84, 107, 116, 125, 134, 160, 169, 178, + 187, 210, 219, 228, 237, 58, 108, 161, 211, 62, + 112, 165, 215, 67, 117, 170, 220, 71, 121, 174, + 224, 76, 126, 179, 229, 80, 130, 183, 233, 85, + 135, 188, 238, 89, 139, 192, 242, 59, 109, 162, + 212, 63, 113, 166, 216, 68, 118, 171, 221, 72, + 122, 175, 225, 77, 127, 180, 230, 81, 131, 184, + 234, 86, 136, 189, 239, 90, 140, 193, 243, 60, + 110, 163, 213, 64, 114, 167, 217, 69, 119, 172, + 222, 73, 123, 176, 226, 78, 128, 181, 231, 82, + 132, 185, 235, 87, 137, 190, 240, 91, 141, 194, + 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 +}; + +static Word16 sort_1425[285] = { + 0, 4, 6, 101, 159, 220, 278, 7, 5, 3, + 47, 48, 49, 50, 51, 166, 167, 168, 169, 170, + 102, 160, 221, 279, 107, 165, 226, 284, 104, 162, + 223, 281, 105, 163, 224, 282, 108, 227, 106, 164, + 225, 283, 103, 161, 222, 280, 52, 2, 1, 109, + 228, 171, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 172, 31, 110, 229, 9, 33, 11, 111, 230, 54, + 173, 28, 27, 112, 231, 34, 35, 29, 46, 32, + 30, 55, 174, 37, 36, 39, 38, 40, 113, 232, + 41, 42, 43, 44, 45, 56, 114, 175, 233, 62, + 120, 181, 239, 75, 133, 194, 252, 57, 115, 176, + 234, 63, 121, 182, 240, 70, 128, 189, 247, 76, + 134, 195, 253, 83, 141, 202, 260, 92, 150, 211, + 269, 84, 142, 203, 261, 93, 151, 212, 270, 85, + 143, 204, 262, 94, 152, 213, 271, 86, 144, 205, + 263, 95, 153, 214, 272, 64, 122, 183, 241, 77, + 135, 196, 254, 65, 123, 184, 242, 78, 136, 197, + 255, 87, 145, 206, 264, 96, 154, 215, 273, 58, + 116, 177, 235, 66, 124, 185, 243, 71, 129, 190, + 248, 79, 137, 198, 256, 88, 146, 207, 265, 97, + 155, 216, 274, 59, 117, 178, 236, 67, 125, 186, + 244, 72, 130, 191, 249, 80, 138, 199, 257, 89, + 147, 208, 266, 98, 156, 217, 275, 60, 118, 179, + 237, 68, 126, 187, 245, 73, 131, 192, 250, 81, + 139, 200, 258, 90, 148, 209, 267, 99, 157, 218, + 276, 61, 119, 180, 238, 69, 127, 188, 246, 74, + 132, 193, 251, 82, 140, 201, 259, 91, 149, 210, + 268, 100, 158, 219, 277 +}; + +static Word16 sort_1585[317] = { + 0, 4, 6, 109, 175, 244, 310, 7, 5, 3, + 47, 48, 49, 50, 51, 182, 183, 184, 185, 186, + 110, 176, 245, 311, 115, 181, 250, 316, 112, 178, + 247, 313, 113, 179, 248, 314, 116, 251, 114, 180, + 249, 315, 111, 177, 246, 312, 52, 2, 1, 117, + 252, 187, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 188, 31, 118, 253, 9, 33, 11, 119, 254, 54, + 189, 28, 27, 120, 255, 34, 35, 29, 46, 32, + 30, 55, 190, 37, 36, 39, 38, 40, 121, 256, + 41, 42, 43, 44, 45, 56, 122, 191, 257, 63, + 129, 198, 264, 76, 142, 211, 277, 89, 155, 224, + 290, 102, 168, 237, 303, 57, 123, 192, 258, 70, + 136, 205, 271, 83, 149, 218, 284, 96, 162, 231, + 297, 62, 128, 197, 263, 75, 141, 210, 276, 88, + 154, 223, 289, 101, 167, 236, 302, 58, 124, 193, + 259, 71, 137, 206, 272, 84, 150, 219, 285, 97, + 163, 232, 298, 59, 125, 194, 260, 64, 130, 199, + 265, 67, 133, 202, 268, 72, 138, 207, 273, 77, + 143, 212, 278, 80, 146, 215, 281, 85, 151, 220, + 286, 90, 156, 225, 291, 93, 159, 228, 294, 98, + 164, 233, 299, 103, 169, 238, 304, 106, 172, 241, + 307, 60, 126, 195, 261, 65, 131, 200, 266, 68, + 134, 203, 269, 73, 139, 208, 274, 78, 144, 213, + 279, 81, 147, 216, 282, 86, 152, 221, 287, 91, + 157, 226, 292, 94, 160, 229, 295, 99, 165, 234, + 300, 104, 170, 239, 305, 107, 173, 242, 308, 61, + 127, 196, 262, 66, 132, 201, 267, 69, 135, 204, + 270, 74, 140, 209, 275, 79, 145, 214, 280, 82, + 148, 217, 283, 87, 153, 222, 288, 92, 158, 227, + 293, 95, 161, 230, 296, 100, 166, 235, 301, 105, + 171, 240, 306, 108, 174, 243, 309 +}; + +static Word16 sort_1825[365] = { + 0, 4, 6, 121, 199, 280, 358, 7, 5, 3, + 47, 48, 49, 50, 51, 206, 207, 208, 209, 210, + 122, 200, 281, 359, 127, 205, 286, 364, 124, 202, + 283, 361, 125, 203, 284, 362, 128, 287, 126, 204, + 285, 363, 123, 201, 282, 360, 52, 2, 1, 129, + 288, 211, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 212, 31, 130, 289, 9, 33, 11, 131, 290, 54, + 213, 28, 27, 132, 291, 34, 35, 29, 46, 32, + 30, 55, 214, 37, 36, 39, 38, 40, 133, 292, + 41, 42, 43, 44, 45, 56, 134, 215, 293, 198, + 299, 136, 120, 138, 60, 279, 58, 62, 357, 139, + 140, 295, 156, 57, 219, 297, 63, 217, 137, 170, + 300, 222, 64, 106, 61, 78, 294, 92, 142, 141, + 135, 221, 296, 301, 343, 59, 298, 184, 329, 315, + 220, 216, 265, 251, 218, 237, 352, 223, 157, 86, + 171, 87, 164, 351, 111, 302, 65, 178, 115, 323, + 72, 192, 101, 179, 93, 73, 193, 151, 337, 309, + 143, 274, 69, 324, 165, 150, 97, 338, 110, 310, + 330, 273, 68, 107, 175, 245, 114, 79, 113, 189, + 246, 259, 174, 71, 185, 96, 344, 100, 322, 83, + 334, 316, 333, 252, 161, 348, 147, 82, 269, 232, + 260, 308, 353, 347, 163, 231, 306, 320, 188, 270, + 146, 177, 266, 350, 256, 85, 149, 116, 191, 160, + 238, 258, 336, 305, 255, 88, 224, 99, 339, 230, + 228, 227, 272, 242, 241, 319, 233, 311, 102, 74, + 180, 275, 66, 194, 152, 325, 172, 247, 244, 261, + 117, 158, 166, 354, 75, 144, 108, 312, 94, 186, + 303, 80, 234, 89, 195, 112, 340, 181, 345, 317, + 326, 276, 239, 167, 118, 313, 70, 355, 327, 253, + 190, 176, 271, 104, 98, 153, 103, 90, 76, 267, + 277, 248, 225, 262, 182, 84, 154, 235, 335, 168, + 331, 196, 341, 249, 162, 307, 148, 349, 263, 321, + 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 +}; + +static Word16 sort_1985[397] = { + 0, 4, 6, 129, 215, 304, 390, 7, 5, 3, + 47, 48, 49, 50, 51, 222, 223, 224, 225, 226, + 130, 216, 305, 391, 135, 221, 310, 396, 132, 218, + 307, 393, 133, 219, 308, 394, 136, 311, 134, 220, + 309, 395, 131, 217, 306, 392, 52, 2, 1, 137, + 312, 227, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 228, 31, 138, 313, 9, 33, 11, 139, 314, 54, + 229, 28, 27, 140, 315, 34, 35, 29, 46, 32, + 30, 55, 230, 37, 36, 39, 38, 40, 141, 316, + 41, 42, 43, 44, 45, 56, 142, 231, 317, 63, + 73, 92, 340, 82, 324, 149, 353, 159, 334, 165, + 338, 178, 163, 254, 77, 168, 257, 153, 343, 57, + 248, 238, 79, 252, 166, 67, 80, 201, 101, 267, + 143, 164, 341, 255, 339, 187, 376, 318, 78, 328, + 362, 115, 232, 242, 253, 290, 276, 62, 58, 158, + 68, 93, 179, 319, 148, 169, 154, 72, 385, 329, + 333, 344, 102, 83, 144, 233, 323, 124, 243, 192, + 354, 237, 64, 247, 202, 209, 150, 116, 335, 268, + 239, 299, 188, 196, 298, 94, 195, 258, 123, 363, + 384, 109, 325, 371, 170, 370, 84, 110, 295, 180, + 74, 210, 191, 106, 291, 205, 367, 381, 377, 206, + 355, 122, 119, 120, 383, 160, 105, 108, 277, 380, + 294, 284, 285, 345, 208, 269, 249, 366, 386, 300, + 297, 259, 125, 369, 197, 97, 194, 286, 211, 281, + 280, 183, 372, 87, 155, 283, 59, 348, 327, 184, + 76, 111, 330, 203, 349, 69, 98, 152, 145, 189, + 66, 320, 337, 173, 358, 251, 198, 174, 263, 262, + 126, 241, 193, 88, 388, 117, 95, 387, 112, 359, + 287, 244, 103, 272, 301, 171, 162, 234, 273, 127, + 373, 181, 292, 85, 378, 302, 121, 107, 364, 346, + 356, 212, 278, 213, 65, 382, 288, 207, 113, 175, + 99, 296, 374, 368, 199, 260, 185, 336, 331, 161, + 270, 264, 250, 240, 75, 350, 151, 60, 89, 321, + 156, 274, 360, 326, 70, 282, 167, 146, 352, 81, + 91, 389, 266, 245, 177, 235, 190, 256, 204, 342, + 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 +}; + +static Word16 sort_2305[461] = { + 0, 4, 6, 145, 247, 352, 454, 7, 5, 3, + 47, 48, 49, 50, 51, 254, 255, 256, 257, 258, + 146, 248, 353, 455, 151, 253, 358, 460, 148, 250, + 355, 457, 149, 251, 356, 458, 152, 359, 150, 252, + 357, 459, 147, 249, 354, 456, 52, 2, 1, 153, + 360, 259, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 260, 31, 154, 361, 9, 33, 11, 155, 362, 54, + 261, 28, 27, 156, 363, 34, 35, 29, 46, 32, + 30, 55, 262, 37, 36, 39, 38, 40, 157, 364, + 41, 42, 43, 44, 45, 56, 158, 263, 365, 181, + 192, 170, 79, 57, 399, 90, 159, 297, 377, 366, + 275, 68, 183, 388, 286, 194, 299, 92 , 70, 182, + 401, 172, 59, 91, 58, 400, 368, 161, 81, 160, + 264, 171, 80, 389, 390, 378, 379, 193, 298, 69, + 266, 265, 367, 277, 288, 276, 287, 184, 60, 195, + 82, 93, 71, 369, 402, 173, 162, 444, 300, 391, + 98, 76, 278, 61, 267, 374, 135, 411, 167, 102, + 380, 200, 87, 178, 65, 94, 204, 124, 72, 342, + 189, 305, 381, 396, 433, 301, 226, 407, 289, 237, + 113, 215, 185, 128, 309, 403, 116, 320, 196, 331, + 370, 422, 174, 64, 392, 83, 425, 219, 134, 188, + 432, 112, 427, 139, 279, 163, 436, 208, 447, 218, + 236, 229, 97, 294, 385, 230, 166, 268, 177, 443, + 225, 426, 101, 272, 138, 127, 290, 117, 347, 199, + 414, 95, 140, 240, 410, 395, 209, 129, 283, 346, + 105, 241, 437, 86, 308, 448, 203, 345, 186, 107, + 220, 415, 334, 319, 106, 313, 118, 123, 73, 207, + 421, 214, 384, 373, 438, 62, 371, 341, 75, 449, + 168, 323, 164, 242, 416, 324, 304, 197, 335, 404, + 271, 63, 191, 325, 96, 169, 231, 280, 312, 187, + 406, 84, 201, 100, 67, 382, 175, 336, 202, 330, + 269, 393, 376, 383, 293, 307, 409, 179, 285, 314, + 302, 372, 398, 190, 180, 89, 99, 103, 232, 78, + 88, 77, 136, 387, 165, 198, 394, 125, 176, 428, + 74, 375, 238, 227, 66, 273, 282, 141, 306, 412, + 114, 85, 130, 348, 119, 291, 296, 386, 233, 397, + 303, 405, 284, 445, 423, 221, 210, 205, 450, 108, + 274, 434, 216, 343, 337, 142, 243, 321, 408, 451, + 310, 292, 120, 109, 281, 439, 270, 429, 332, 295, + 418, 211, 315, 222, 326, 131, 430, 244, 327, 349, + 417, 316, 143, 338, 440, 234, 110, 212, 452, 245, + 121, 419, 350, 223, 132, 441, 328, 413, 317, 339, + 126, 104, 137, 446, 344, 239, 435, 115, 333, 206, + 322, 217, 228, 424, 453, 311, 351, 111, 442, 224, + 213, 122, 431, 340, 235, 246, 133, 144, 420, 329, + 318 +}; + +static Word16 sort_2385[477] = { + 0, 4, 6, 145, 251, 360, 466, 7, 5, 3, + 47, 48, 49, 50, 51, 262, 263, 264, 265, 266, + 146, 252, 361, 467, 151, 257, 366, 472, 148, 254, + 363, 469, 149, 255, 364, 470, 156, 371, 150, 256, + 365, 471, 147, 253, 362, 468, 52, 2, 1, 157, + 372, 267, 19, 21, 12, 17, 18, 20, 16, 25, + 13, 10, 14, 24, 23, 22, 26, 8, 15, 53, + 268, 31, 152, 153, 154, 155, 258, 259, 260, 261, + 367, 368, 369, 370, 473, 474, 475, 476, 158, 373, + 9, 33, 11, 159, 374, 54, 269, 28, 27, 160, + 375, 34, 35, 29, 46, 32, 30, 55, 270, 37, + 36, 39, 38, 40, 161, 376, 41, 42, 43, 44, + 45, 56, 162, 271, 377, 185, 196, 174, 79, 57, + 411, 90, 163, 305, 389, 378, 283, 68, 187, 400, + 294, 198, 307, 92, 70, 186, 413, 176, 59, 91, + 58, 412, 380, 165, 81, 164, 272, 175, 80, 401, + 402, 390, 391, 197, 306, 69, 274, 273, 379, 285, + 296, 284, 295, 188, 60, 199, 82, 93, 71, 381, + 414, 177, 166, 456, 308, 403, 98, 76, 286, 61, + 275, 386, 135, 423, 171, 102, 392, 204, 87, 182, + 65, 94, 208, 124, 72, 350, 193, 313, 393, 408, + 445, 309, 230, 419, 297, 241, 113, 219, 189, 128, + 317, 415, 116, 328, 200, 339, 382, 434, 178, 64, + 404, 83, 437, 223, 134, 192, 444, 112, 439, 139, + 287, 167, 448, 212, 459, 222, 240, 233, 97, 302, + 397, 234, 170, 276, 181, 455, 229, 438, 101, 280, + 138, 127, 298, 117, 355, 203, 426, 95, 140, 244, + 422, 407, 213, 129, 291, 354, 105, 245, 449, 86, + 316, 460, 207, 353, 190, 107, 224, 427, 342, 327, + 106, 321, 118, 123, 73, 211, 433, 218, 396, 385, + 450, 62, 383, 349, 75, 461, 172, 331, 168, 246, + 428, 332, 312, 201, 343, 416, 279, 63, 195, 333, + 96, 173, 235, 288, 320, 191, 418, 84, 205, 100, + 67, 394, 179, 344, 206, 338, 277, 405, 388, 395, + 301, 315, 421, 183, 293, 322, 310, 384, 410, 194, + 184, 89, 99, 103, 236, 78, 88, 77, 136, 399, + 169, 202, 406, 125, 180, 440, 74, 387, 242, 231, + 66, 281, 290, 141, 314, 424, 114, 85, 130, 356, + 119, 299, 304, 398, 237, 409, 311, 417, 292, 457, + 435, 225, 214, 209, 462, 108, 282, 446, 220, 351, + 345, 142, 247, 329, 420, 463, 318, 300, 120, 109, + 289, 451, 278, 441, 340, 303, 430, 215, 323, 226, + 334, 131, 442, 248, 335, 357, 429, 324, 143, 346, + 452, 238, 110, 216, 464, 249, 121, 431, 358, 227, + 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 +}; + +static Word16 sort_SID[35] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34 +}; + +/* pointer table for bit sorting tables */ +static Word16 *sort_ptr[16] = { sort_660, sort_885, sort_1265, sort_1425, sort_1585, sort_1825, sort_1985, sort_2305, + sort_2385, sort_SID, NULL, NULL, NULL, NULL, NULL, NULL}; + + + + diff --git a/media/libstagefright/codecs/amrwbenc/inc/oper_32b.h b/media/libstagefright/codecs/amrwbenc/inc/oper_32b.h index 4159d84..7a0f564 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/oper_32b.h +++ b/media/libstagefright/codecs/amrwbenc/inc/oper_32b.h @@ -1,31 +1,31 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/* Double precision operations */ -/* $Id$ */ - -#ifndef __OPER_32B_H__ -#define __OPER_32B_H__ - -void VO_L_Extract (Word32 L_32, Word16 *hi, Word16 *lo); -Word32 L_Comp (Word16 hi, Word16 lo); -Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2); -Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n); -Word32 Div_32 (Word32 L_num, Word16 denom_hi, Word16 denom_lo); - -#endif //__OPER_32B_H__ - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/* Double precision operations */ +/* $Id$ */ + +#ifndef __OPER_32B_H__ +#define __OPER_32B_H__ + +void VO_L_Extract (Word32 L_32, Word16 *hi, Word16 *lo); +Word32 L_Comp (Word16 hi, Word16 lo); +Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2); +Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n); +Word32 Div_32 (Word32 L_num, Word16 denom_hi, Word16 denom_lo); + +#endif //__OPER_32B_H__ + diff --git a/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h b/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h index 27c4c7e..4a13f16 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h +++ b/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h @@ -1,52 +1,52 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*--------------------------------------------------------------------------* - * P_MED_O.H * - *--------------------------------------------------------------------------* - * Median open-loop lag search * - *--------------------------------------------------------------------------*/ - -#ifndef __P_MED_O_H__ -#define __P_MED_O_H__ - -Word16 Pitch_med_ol( /* output: open loop pitch lag */ - Word16 wsp[], /* input : signal used to compute the open loop pitch */ - /* wsp[-pit_max] to wsp[-1] should be known */ - Word16 L_min, /* input : minimum pitch lag */ - Word16 L_max, /* input : maximum pitch lag */ - Word16 L_frame, /* input : length of frame to compute pitch */ - Word16 L_0, /* input : old_ open-loop pitch */ - Word16 * gain, /* output: normalize correlation of hp_wsp for the Lag */ - Word16 * hp_wsp_mem, /* i:o : memory of the hypass filter for hp_wsp[] (lg=9) */ - Word16 * old_hp_wsp, /* i:o : hypass wsp[] */ - Word16 wght_flg /* input : is weighting function used */ - ); - -Word16 Med_olag( /* output : median of 5 previous open-loop lags */ - Word16 prev_ol_lag, /* input : previous open-loop lag */ - Word16 old_ol_lag[5] - ); - -void Hp_wsp( - Word16 wsp[], /* i : wsp[] signal */ - Word16 hp_wsp[], /* o : hypass wsp[] */ - Word16 lg, /* i : lenght of signal */ - Word16 mem[] /* i/o : filter memory [9] */ - ); - -#endif //__P_MED_O_H__ - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*--------------------------------------------------------------------------* + * P_MED_O.H * + *--------------------------------------------------------------------------* + * Median open-loop lag search * + *--------------------------------------------------------------------------*/ + +#ifndef __P_MED_O_H__ +#define __P_MED_O_H__ + +Word16 Pitch_med_ol( /* output: open loop pitch lag */ + Word16 wsp[], /* input : signal used to compute the open loop pitch */ + /* wsp[-pit_max] to wsp[-1] should be known */ + Word16 L_min, /* input : minimum pitch lag */ + Word16 L_max, /* input : maximum pitch lag */ + Word16 L_frame, /* input : length of frame to compute pitch */ + Word16 L_0, /* input : old_ open-loop pitch */ + Word16 * gain, /* output: normalize correlation of hp_wsp for the Lag */ + Word16 * hp_wsp_mem, /* i:o : memory of the hypass filter for hp_wsp[] (lg=9) */ + Word16 * old_hp_wsp, /* i:o : hypass wsp[] */ + Word16 wght_flg /* input : is weighting function used */ + ); + +Word16 Med_olag( /* output : median of 5 previous open-loop lags */ + Word16 prev_ol_lag, /* input : previous open-loop lag */ + Word16 old_ol_lag[5] + ); + +void Hp_wsp( + Word16 wsp[], /* i : wsp[] signal */ + Word16 hp_wsp[], /* o : hypass wsp[] */ + Word16 lg, /* i : lenght of signal */ + Word16 mem[] /* i/o : filter memory [9] */ + ); + +#endif //__P_MED_O_H__ + diff --git a/media/libstagefright/codecs/amrwbenc/inc/p_med_ol.tab b/media/libstagefright/codecs/amrwbenc/inc/p_med_ol.tab index 14bd1d5..d74ec8e 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/p_med_ol.tab +++ b/media/libstagefright/codecs/amrwbenc/inc/p_med_ol.tab @@ -1,47 +1,47 @@ - -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*-----------------------------------------------------* - | Table for function Pitch_med_ol() | - *-----------------------------------------------------*/ - - static Word16 corrweight[199]= { - - 10772, 10794, 10816, 10839, 10862, 10885, 10908, 10932, 10955, 10980, - 11004, 11029, 11054, 11079, 11105, 11131, 11157, 11183, 11210, 11238, - 11265, 11293, 11322, 11350, 11379, 11409, 11439, 11469, 11500, 11531, - 11563, 11595, 11628, 11661, 11694, 11728, 11763, 11798, 11834, 11870, - 11907, 11945, 11983, 12022, 12061, 12101, 12142, 12184, 12226, 12270, - 12314, 12358, 12404, 12451, 12498, 12547, 12596, 12647, 12699, 12751, - 12805, 12861, 12917, 12975, 13034, 13095, 13157, 13221, 13286, 13353, - 13422, 13493, 13566, 13641, 13719, 13798, 13880, 13965, 14053, 14143, - 14237, 14334, 14435, 14539, 14648, 14761, 14879, 15002, 15130, 15265, - 15406, 15554, 15710, 15874, 16056, 16384, 16384, 16384, 16384, 16384, - 16384, 16384, 16056, 15874, 15710, 15554, 15406, 15265, 15130, 15002, - 14879, 14761, 14648, 14539, 14435, 14334, 14237, 14143, 14053, 13965, - 13880, 13798, 13719, 13641, 13566, 13493, 13422, 13353, 13286, 13221, - 13157, 13095, 13034, 12975, 12917, 12861, 12805, 12751, 12699, 12647, - 12596, 12547, 12498, 12451, 12404, 12358, 12314, 12270, 12226, 12184, - 12142, 12101, 12061, 12022, 11983, 11945, 11907, 11870, 11834, 11798, - 11763, 11728, 11694, 11661, 11628, 11595, 11563, 11531, 11500, 11469, - 11439, 11409, 11379, 11350, 11322, 11293, 11265, 11238, 11210, 11183, - 11157, 11131, 11105, 11079, 11054, 11029, 11004, 10980, 10955, 10932, - 10908, 10885, 10862, 10839, 10816, 10794, 10772, 10750, 10728}; - - - + +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*-----------------------------------------------------* + | Table for function Pitch_med_ol() | + *-----------------------------------------------------*/ + + static Word16 corrweight[199]= { + + 10772, 10794, 10816, 10839, 10862, 10885, 10908, 10932, 10955, 10980, + 11004, 11029, 11054, 11079, 11105, 11131, 11157, 11183, 11210, 11238, + 11265, 11293, 11322, 11350, 11379, 11409, 11439, 11469, 11500, 11531, + 11563, 11595, 11628, 11661, 11694, 11728, 11763, 11798, 11834, 11870, + 11907, 11945, 11983, 12022, 12061, 12101, 12142, 12184, 12226, 12270, + 12314, 12358, 12404, 12451, 12498, 12547, 12596, 12647, 12699, 12751, + 12805, 12861, 12917, 12975, 13034, 13095, 13157, 13221, 13286, 13353, + 13422, 13493, 13566, 13641, 13719, 13798, 13880, 13965, 14053, 14143, + 14237, 14334, 14435, 14539, 14648, 14761, 14879, 15002, 15130, 15265, + 15406, 15554, 15710, 15874, 16056, 16384, 16384, 16384, 16384, 16384, + 16384, 16384, 16056, 15874, 15710, 15554, 15406, 15265, 15130, 15002, + 14879, 14761, 14648, 14539, 14435, 14334, 14237, 14143, 14053, 13965, + 13880, 13798, 13719, 13641, 13566, 13493, 13422, 13353, 13286, 13221, + 13157, 13095, 13034, 12975, 12917, 12861, 12805, 12751, 12699, 12647, + 12596, 12547, 12498, 12451, 12404, 12358, 12314, 12270, 12226, 12184, + 12142, 12101, 12061, 12022, 11983, 11945, 11907, 11870, 11834, 11798, + 11763, 11728, 11694, 11661, 11628, 11595, 11563, 11531, 11500, 11469, + 11439, 11409, 11379, 11350, 11322, 11293, 11265, 11238, 11210, 11183, + 11157, 11131, 11105, 11079, 11054, 11029, 11004, 10980, 10955, 10932, + 10908, 10885, 10862, 10839, 10816, 10794, 10772, 10750, 10728}; + + + diff --git a/media/libstagefright/codecs/amrwbenc/inc/q_gain2.tab b/media/libstagefright/codecs/amrwbenc/inc/q_gain2.tab index 1a0deee..bc36489 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/q_gain2.tab +++ b/media/libstagefright/codecs/amrwbenc/inc/q_gain2.tab @@ -1,228 +1,228 @@ - -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*------------------------------------------------------* - * Tables for function q_gain2() * - * * - * g_pitch(Q14), g_code(Q11) * - * * - * pitch gain are ordered in table to reduce complexity * - * during quantization of gains. * - *------------------------------------------------------*/ - -#define nb_qua_gain6b 64 /* Number of quantization level */ -#define nb_qua_gain7b 128 /* Number of quantization level */ - - -static Word16 t_qua_gain6b[64*2] = { - 1566, 1332, - 1577, 3557, - 3071, 6490, - 4193, 10163, - 4496, 2534, - 5019, 4488, - 5586, 15614, - 5725, 1422, - 6453, 580, - 6724, 6831, - 7657, 3527, - 8072, 2099, - 8232, 5319, - 8827, 8775, - 9740, 2868, - 9856, 1465, - 10087, 12488, - 10241, 4453, - 10859, 6618, - 11321, 3587, - 11417, 1800, - 11643, 2428, - 11718, 988, - 12312, 5093, - 12523, 8413, - 12574, 26214, - 12601, 3396, - 13172, 1623, - 13285, 2423, - 13418, 6087, - 13459, 12810, - 13656, 3607, - 14111, 4521, - 14144, 1229, - 14425, 1871, - 14431, 7234, - 14445, 2834, - 14628, 10036, - 14860, 17496, - 15161, 3629, - 15209, 5819, - 15299, 2256, - 15518, 4722, - 15663, 1060, - 15759, 7972, - 15939, 11964, - 16020, 2996, - 16086, 1707, - 16521, 4254, - 16576, 6224, - 16894, 2380, - 16906, 681, - 17213, 8406, - 17610, 3418, - 17895, 5269, - 18168, 11748, - 18230, 1575, - 18607, 32767, - 18728, 21684, - 19137, 2543, - 19422, 6577, - 19446, 4097, - 19450, 9056, - 20371, 14885}; - -static Word16 t_qua_gain7b[128*2] = { - 204, 441, - 464, 1977, - 869, 1077, - 1072, 3062, - 1281, 4759, - 1647, 1539, - 1845, 7020, - 1853, 634, - 1995, 2336, - 2351, 15400, - 2661, 1165, - 2702, 3900, - 2710, 10133, - 3195, 1752, - 3498, 2624, - 3663, 849, - 3984, 5697, - 4214, 3399, - 4415, 1304, - 4695, 2056, - 5376, 4558, - 5386, 676, - 5518, 23554, - 5567, 7794, - 5644, 3061, - 5672, 1513, - 5957, 2338, - 6533, 1060, - 6804, 5998, - 6820, 1767, - 6937, 3837, - 7277, 414, - 7305, 2665, - 7466, 11304, - 7942, 794, - 8007, 1982, - 8007, 1366, - 8326, 3105, - 8336, 4810, - 8708, 7954, - 8989, 2279, - 9031, 1055, - 9247, 3568, - 9283, 1631, - 9654, 6311, - 9811, 2605, - 10120, 683, - 10143, 4179, - 10245, 1946, - 10335, 1218, - 10468, 9960, - 10651, 3000, - 10951, 1530, - 10969, 5290, - 11203, 2305, - 11325, 3562, - 11771, 6754, - 11839, 1849, - 11941, 4495, - 11954, 1298, - 11975, 15223, - 11977, 883, - 11986, 2842, - 12438, 2141, - 12593, 3665, - 12636, 8367, - 12658, 1594, - 12886, 2628, - 12984, 4942, - 13146, 1115, - 13224, 524, - 13341, 3163, - 13399, 1923, - 13549, 5961, - 13606, 1401, - 13655, 2399, - 13782, 3909, - 13868, 10923, - 14226, 1723, - 14232, 2939, - 14278, 7528, - 14439, 4598, - 14451, 984, - 14458, 2265, - 14792, 1403, - 14818, 3445, - 14899, 5709, - 15017, 15362, - 15048, 1946, - 15069, 2655, - 15405, 9591, - 15405, 4079, - 15570, 7183, - 15687, 2286, - 15691, 1624, - 15699, 3068, - 15772, 5149, - 15868, 1205, - 15970, 696, - 16249, 3584, - 16338, 1917, - 16424, 2560, - 16483, 4438, - 16529, 6410, - 16620, 11966, - 16839, 8780, - 17030, 3050, - 17033, 18325, - 17092, 1568, - 17123, 5197, - 17351, 2113, - 17374, 980, - 17566, 26214, - 17609, 3912, - 17639, 32767, - 18151, 7871, - 18197, 2516, - 18202, 5649, - 18679, 3283, - 18930, 1370, - 19271, 13757, - 19317, 4120, - 19460, 1973, - 19654, 10018, - 19764, 6792, - 19912, 5135, - 20040, 2841, - 21234, 19833}; - - + +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*------------------------------------------------------* + * Tables for function q_gain2() * + * * + * g_pitch(Q14), g_code(Q11) * + * * + * pitch gain are ordered in table to reduce complexity * + * during quantization of gains. * + *------------------------------------------------------*/ + +#define nb_qua_gain6b 64 /* Number of quantization level */ +#define nb_qua_gain7b 128 /* Number of quantization level */ + + +static Word16 t_qua_gain6b[64*2] = { + 1566, 1332, + 1577, 3557, + 3071, 6490, + 4193, 10163, + 4496, 2534, + 5019, 4488, + 5586, 15614, + 5725, 1422, + 6453, 580, + 6724, 6831, + 7657, 3527, + 8072, 2099, + 8232, 5319, + 8827, 8775, + 9740, 2868, + 9856, 1465, + 10087, 12488, + 10241, 4453, + 10859, 6618, + 11321, 3587, + 11417, 1800, + 11643, 2428, + 11718, 988, + 12312, 5093, + 12523, 8413, + 12574, 26214, + 12601, 3396, + 13172, 1623, + 13285, 2423, + 13418, 6087, + 13459, 12810, + 13656, 3607, + 14111, 4521, + 14144, 1229, + 14425, 1871, + 14431, 7234, + 14445, 2834, + 14628, 10036, + 14860, 17496, + 15161, 3629, + 15209, 5819, + 15299, 2256, + 15518, 4722, + 15663, 1060, + 15759, 7972, + 15939, 11964, + 16020, 2996, + 16086, 1707, + 16521, 4254, + 16576, 6224, + 16894, 2380, + 16906, 681, + 17213, 8406, + 17610, 3418, + 17895, 5269, + 18168, 11748, + 18230, 1575, + 18607, 32767, + 18728, 21684, + 19137, 2543, + 19422, 6577, + 19446, 4097, + 19450, 9056, + 20371, 14885}; + +static Word16 t_qua_gain7b[128*2] = { + 204, 441, + 464, 1977, + 869, 1077, + 1072, 3062, + 1281, 4759, + 1647, 1539, + 1845, 7020, + 1853, 634, + 1995, 2336, + 2351, 15400, + 2661, 1165, + 2702, 3900, + 2710, 10133, + 3195, 1752, + 3498, 2624, + 3663, 849, + 3984, 5697, + 4214, 3399, + 4415, 1304, + 4695, 2056, + 5376, 4558, + 5386, 676, + 5518, 23554, + 5567, 7794, + 5644, 3061, + 5672, 1513, + 5957, 2338, + 6533, 1060, + 6804, 5998, + 6820, 1767, + 6937, 3837, + 7277, 414, + 7305, 2665, + 7466, 11304, + 7942, 794, + 8007, 1982, + 8007, 1366, + 8326, 3105, + 8336, 4810, + 8708, 7954, + 8989, 2279, + 9031, 1055, + 9247, 3568, + 9283, 1631, + 9654, 6311, + 9811, 2605, + 10120, 683, + 10143, 4179, + 10245, 1946, + 10335, 1218, + 10468, 9960, + 10651, 3000, + 10951, 1530, + 10969, 5290, + 11203, 2305, + 11325, 3562, + 11771, 6754, + 11839, 1849, + 11941, 4495, + 11954, 1298, + 11975, 15223, + 11977, 883, + 11986, 2842, + 12438, 2141, + 12593, 3665, + 12636, 8367, + 12658, 1594, + 12886, 2628, + 12984, 4942, + 13146, 1115, + 13224, 524, + 13341, 3163, + 13399, 1923, + 13549, 5961, + 13606, 1401, + 13655, 2399, + 13782, 3909, + 13868, 10923, + 14226, 1723, + 14232, 2939, + 14278, 7528, + 14439, 4598, + 14451, 984, + 14458, 2265, + 14792, 1403, + 14818, 3445, + 14899, 5709, + 15017, 15362, + 15048, 1946, + 15069, 2655, + 15405, 9591, + 15405, 4079, + 15570, 7183, + 15687, 2286, + 15691, 1624, + 15699, 3068, + 15772, 5149, + 15868, 1205, + 15970, 696, + 16249, 3584, + 16338, 1917, + 16424, 2560, + 16483, 4438, + 16529, 6410, + 16620, 11966, + 16839, 8780, + 17030, 3050, + 17033, 18325, + 17092, 1568, + 17123, 5197, + 17351, 2113, + 17374, 980, + 17566, 26214, + 17609, 3912, + 17639, 32767, + 18151, 7871, + 18197, 2516, + 18202, 5649, + 18679, 3283, + 18930, 1370, + 19271, 13757, + 19317, 4120, + 19460, 1973, + 19654, 10018, + 19764, 6792, + 19912, 5135, + 20040, 2841, + 21234, 19833}; + + diff --git a/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h b/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h index baf5525..b5d5280 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h +++ b/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h @@ -1,66 +1,66 @@ - -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*--------------------------------------------------------------------------* - * Q_PULSE.H * - *--------------------------------------------------------------------------* - * Coding and decoding of algebraic codebook * - *--------------------------------------------------------------------------*/ - -#ifndef __Q_PULSE_H__ -#define __Q_PULSE_H__ - -#include "typedef.h" - -Word32 quant_1p_N1( /* (o) return (N+1) bits */ - Word16 pos, /* (i) position of the pulse */ - Word16 N); /* (i) number of bits for position */ - -Word32 quant_2p_2N1( /* (o) return (2*N)+1 bits */ - Word16 pos1, /* (i) position of the pulse 1 */ - Word16 pos2, /* (i) position of the pulse 2 */ - Word16 N); /* (i) number of bits for position */ - -Word32 quant_3p_3N1( /* (o) return (3*N)+1 bits */ - Word16 pos1, /* (i) position of the pulse 1 */ - Word16 pos2, /* (i) position of the pulse 2 */ - Word16 pos3, /* (i) position of the pulse 3 */ - Word16 N); /* (i) number of bits for position */ - -Word32 quant_4p_4N1( /* (o) return (4*N)+1 bits */ - Word16 pos1, /* (i) position of the pulse 1 */ - Word16 pos2, /* (i) position of the pulse 2 */ - Word16 pos3, /* (i) position of the pulse 3 */ - Word16 pos4, /* (i) position of the pulse 4 */ - Word16 N); /* (i) number of bits for position */ - -Word32 quant_4p_4N( /* (o) return 4*N bits */ - Word16 pos[], /* (i) position of the pulse 1..4 */ - Word16 N); /* (i) number of bits for position */ - -Word32 quant_5p_5N( /* (o) return 5*N bits */ - Word16 pos[], /* (i) position of the pulse 1..5 */ - Word16 N); /* (i) number of bits for position */ - -Word32 quant_6p_6N_2( /* (o) return (6*N)-2 bits */ - Word16 pos[], /* (i) position of the pulse 1..6 */ - Word16 N); /* (i) number of bits for position */ - - -#endif //__Q_PULSE_H__ - + +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*--------------------------------------------------------------------------* + * Q_PULSE.H * + *--------------------------------------------------------------------------* + * Coding and decoding of algebraic codebook * + *--------------------------------------------------------------------------*/ + +#ifndef __Q_PULSE_H__ +#define __Q_PULSE_H__ + +#include "typedef.h" + +Word32 quant_1p_N1( /* (o) return (N+1) bits */ + Word16 pos, /* (i) position of the pulse */ + Word16 N); /* (i) number of bits for position */ + +Word32 quant_2p_2N1( /* (o) return (2*N)+1 bits */ + Word16 pos1, /* (i) position of the pulse 1 */ + Word16 pos2, /* (i) position of the pulse 2 */ + Word16 N); /* (i) number of bits for position */ + +Word32 quant_3p_3N1( /* (o) return (3*N)+1 bits */ + Word16 pos1, /* (i) position of the pulse 1 */ + Word16 pos2, /* (i) position of the pulse 2 */ + Word16 pos3, /* (i) position of the pulse 3 */ + Word16 N); /* (i) number of bits for position */ + +Word32 quant_4p_4N1( /* (o) return (4*N)+1 bits */ + Word16 pos1, /* (i) position of the pulse 1 */ + Word16 pos2, /* (i) position of the pulse 2 */ + Word16 pos3, /* (i) position of the pulse 3 */ + Word16 pos4, /* (i) position of the pulse 4 */ + Word16 N); /* (i) number of bits for position */ + +Word32 quant_4p_4N( /* (o) return 4*N bits */ + Word16 pos[], /* (i) position of the pulse 1..4 */ + Word16 N); /* (i) number of bits for position */ + +Word32 quant_5p_5N( /* (o) return 5*N bits */ + Word16 pos[], /* (i) position of the pulse 1..5 */ + Word16 N); /* (i) number of bits for position */ + +Word32 quant_6p_6N_2( /* (o) return (6*N)-2 bits */ + Word16 pos[], /* (i) position of the pulse 1..6 */ + Word16 N); /* (i) number of bits for position */ + + +#endif //__Q_PULSE_H__ + diff --git a/media/libstagefright/codecs/amrwbenc/inc/qisf_ns.tab b/media/libstagefright/codecs/amrwbenc/inc/qisf_ns.tab index 52f0daf..43c47e9 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/qisf_ns.tab +++ b/media/libstagefright/codecs/amrwbenc/inc/qisf_ns.tab @@ -1,347 +1,347 @@ - -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*-------------------------------------------------------------------* - * qisf_ns.h - *-------------------------------------------------------------------* - * Quantization tables for split by 5 VQ of ISFs for a background noise database - * Version whith no prediction - *-------------------------------------------------------------------*/ - -#define ORDER 16 /* order of linear prediction filter */ -#define ISF_GAP 128 - -#define SIZE_BK_NOISE1 64 -#define SIZE_BK_NOISE2 64 -#define SIZE_BK_NOISE3 64 -#define SIZE_BK_NOISE4 32 -#define SIZE_BK_NOISE5 32 - - -/* means of ISFs */ - static Word16 mean_isf_noise[ORDER] = { - - 478, 1100, 2213, 3267, 4219, 5222, 6198, 7240, - 8229, 9153, 10098, 11108, 12144, 13184, 14165, 3803}; - - -/* 28 bits */ -/*-------------------------------------------------------------------* - * isf codebooks: split-by-5 VQ * - * * - * codebook vector dimension number of vectors * - * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ * - * 1 2 64 * - * 2 3 64 * - * 3 3 64 * - * 4 4 32 * - * 5 4 32 * - *-------------------------------------------------------------------*/ - -/*------------------------------------------------* - * 1st split: isf0 to isf1 - *------------------------------------------------*/ - - - static Word16 dico1_isf_noise[SIZE_BK_NOISE1*2] = { - - -269, -673, - -222, -537, - -233, -430, - -138, -451, - -212, -331, - -192, -241, - -87, -231, - -191, -128, - -70, -106, - -164, -6, - 74, -179, - 27, -33, - -102, 74, - -162, 115, - -94, 172, - -6, 130, - -143, 234, - 14, 218, - -65, 270, - 88, 182, - -124, 341, - -44, 381, - 38, 335, - 117, 274, - -112, 454, - 74, 431, - -5, 488, - 175, 384, - -83, 561, - 122, 529, - 21, 601, - 229, 481, - 231, 303, - 226, 608, - 300, 372, - 210, 187, - 306, 265, - 328, 473, - 382, 331, - 371, 132, - 139, 58, - 365, 21, - 250, -82, - 443, 218, - 483, 110, - 426, 415, - 579, 222, - 518, 333, - 573, 448, - 455, 529, - 685, 329, - 332, 580, - 595, 593, - 468, 645, - 762, 517, - 326, 709, - 485, 793, - 130, 684, - 671, 737, - 354, 876, - 88, 806, - -65, 706, - -35, 1016, - 266, 1123}; - - -/*------------------------------------------------* - * 2nd split: isf2 to isf4 - *------------------------------------------------*/ - - static Word16 dico2_isf_noise[SIZE_BK_NOISE2*3] = { - - -824, -884, -949, - -805, -456, -418, - -442, -438, -541, - -217, -578, -793, - -168, -444, -582, - -287, -492, -274, - -552, -297, -300, - -163, -333, -358, - -370, -232, -232, - -175, -358, -159, - -381, -21, -357, - -184, -159, -162, - -53, -191, -280, - 18, -267, -215, - -138, 61, -283, - 71, -95, -294, - 13, -156, -546, - 0, -83, -79, - 44, 97, -316, - 178, -52, -213, - 222, -261, -422, - 237, -118, -44, - 141, 145, -132, - 363, 81, -287, - 213, 65, 34, - -107, 94, -5, - 91, -29, 126, - -355, 51, -41, - -219, -76, 145, - -63, 100, 244, - -719, 44, 27, - -572, -124, 155, - -423, 133, 315, - -917, 71, 224, - -268, 318, 131, - -93, -190, 420, - -97, 122, 491, - -79, 317, 355, - 130, 100, 325, - 86, -293, 210, - 133, 258, 161, - 176, -73, 465, - 195, 300, 384, - 348, 22, 221, - 376, 183, 409, - 377, 286, 202, - 242, 213, 659, - 257, 565, 248, - 344, 408, -76, - 405, 440, 509, - 612, 385, 379, - 536, 607, 216, - -56, 582, 192, - 100, 517, 567, - -365, 448, 445, - 728, 347, 10, - 505, 357, 759, - 636, 582, 658, - 335, 517, 852, - 378, 809, 572, - -195, 878, 829, - 529, 707, 987, - 918, 726, 392, - 1250, 997, 1063}; - -/*------------------------------------------------* - * 3rd split: isf5 to isf7 - *------------------------------------------------*/ - - static Word16 dico3_isf_noise[SIZE_BK_NOISE3*3] = { - - -805, -838, -774, - -522, -627, -828, - -477, -486, -603, - -295, -481, -634, - -366, -384, -393, - -186, -414, -396, - -237, -394, -106, - -252, -202, -275, - -61, -177, -442, - -84, -198, -199, - -179, -125, -31, - -72, -47, -163, - -298, -220, 215, - -64, -168, 251, - -133, 156, -59, - -30, -2, 127, - 54, 66, -61, - -233, 21, 251, - 209, -50, 32, - 33, 194, 136, - -117, -18, 475, - 202, 46, 309, - 256, 185, 53, - 35, 200, 390, - 200, 263, 242, - -216, 302, 294, - 128, 358, 0, - 19, 431, 287, - 224, 447, 280, - 367, 165, 213, - 397, 314, 319, - 383, 379, 75, - 277, 325, 462, - 394, 505, 334, - 251, 98, -213, - 450, 153, 448, - 565, 226, 76, - 470, 383, 502, - 635, 390, 278, - 237, 135, 620, - 342, 401, 649, - 331, 551, 518, - 130, 418, 592, - 531, 306, 737, - 729, 389, 580, - 497, 557, 699, - 296, 383, 874, - 283, 624, 759, - 126, 622, 476, - 559, 595, 472, - 382, 770, 616, - 719, 613, 745, - 540, 639, 928, - 517, 826, 801, - 684, 811, 604, - 752, 786, 857, - 933, 661, 350, - 694, 450, 1061, - 562, 911, 1051, - 824, 813, 1104, - 758, 1047, 882, - 1140, 917, 889, - 1039, 1246, 1426, - 1483, 1666, 1876}; - -/*------------------------------------------------* - * 4th split: isf8 to isf11 - *------------------------------------------------*/ - - static Word16 dico4_isf_noise[SIZE_BK_NOISE4*4] = { - - -776, -854, -891, -920, - -552, -610, -663, -741, - -321, -370, -476, -565, - 274, -160, -456, 201, - 265, 67, -160, -306, - -8, -210, 79, 272, - 163, 236, 307, 308, - 578, 317, 64, 298, - -9, 197, 342, 620, - 343, 232, 314, 622, - 173, 149, 548, 527, - 356, 370, 481, 376, - 135, 444, 488, 556, - 391, 471, 487, 653, - 228, 424, 576, 835, - 422, 372, 722, 682, - 295, 673, 693, 635, - 539, 596, 590, 449, - 475, 618, 659, 818, - 735, 517, 491, 673, - 602, 346, 257, 877, - 625, 635, 849, 720, - 727, 818, 698, 595, - 653, 481, 690, 1139, - 814, 762, 704, 908, - 507, 747, 898, 936, - 848, 855, 924, 785, - 646, 1037, 882, 795, - 772, 845, 1024, 1151, - 1133, 983, 818, 921, - 940, 1068, 1252, 1302, - 1588, 1767, 1718, 1513}; - -/*------------------------------------------------* - * 5th split: isf12 to isf15 - *------------------------------------------------*/ - - static Word16 dico5_isf_noise[SIZE_BK_NOISE5*4] = { - -810, -879, -945, -254, - 248, 184, 671, 128, - 288, 703, 918, 99, - 658, 558, 662, 219, - 552, 585, 910, 208, - 559, 804, 759, 119, - 606, 774, 921, -139, - 782, 761, 748, 208, - 756, 708, 983, 56, - 544, 864, 1010, 152, - 737, 698, 987, 299, - 771, 924, 879, 103, - 536, 785, 961, 405, - 667, 916, 801, 328, - 738, 705, 773, 439, - 823, 871, 992, 355, - 640, 1004, 1052, 369, - 724, 822, 949, 597, - 415, 655, 729, 482, - 1009, 896, 793, 363, - 908, 803, 687, -25, - 1016, 838, 1011, 189, - 947, 1112, 942, 222, - 914, 1049, 981, 527, - 956, 987, 1011, -120, - 781, 1049, 1121, 92, - 1178, 1053, 884, 47, - 1123, 1059, 1182, 118, - 933, 972, 1277, 357, - 1109, 918, 1101, 503, - 1039, 1286, 1220, 317, - 1351, 1207, 1010, 326}; - + +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*-------------------------------------------------------------------* + * qisf_ns.h + *-------------------------------------------------------------------* + * Quantization tables for split by 5 VQ of ISFs for a background noise database + * Version whith no prediction + *-------------------------------------------------------------------*/ + +#define ORDER 16 /* order of linear prediction filter */ +#define ISF_GAP 128 + +#define SIZE_BK_NOISE1 64 +#define SIZE_BK_NOISE2 64 +#define SIZE_BK_NOISE3 64 +#define SIZE_BK_NOISE4 32 +#define SIZE_BK_NOISE5 32 + + +/* means of ISFs */ + static Word16 mean_isf_noise[ORDER] = { + + 478, 1100, 2213, 3267, 4219, 5222, 6198, 7240, + 8229, 9153, 10098, 11108, 12144, 13184, 14165, 3803}; + + +/* 28 bits */ +/*-------------------------------------------------------------------* + * isf codebooks: split-by-5 VQ * + * * + * codebook vector dimension number of vectors * + * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ * + * 1 2 64 * + * 2 3 64 * + * 3 3 64 * + * 4 4 32 * + * 5 4 32 * + *-------------------------------------------------------------------*/ + +/*------------------------------------------------* + * 1st split: isf0 to isf1 + *------------------------------------------------*/ + + + static Word16 dico1_isf_noise[SIZE_BK_NOISE1*2] = { + + -269, -673, + -222, -537, + -233, -430, + -138, -451, + -212, -331, + -192, -241, + -87, -231, + -191, -128, + -70, -106, + -164, -6, + 74, -179, + 27, -33, + -102, 74, + -162, 115, + -94, 172, + -6, 130, + -143, 234, + 14, 218, + -65, 270, + 88, 182, + -124, 341, + -44, 381, + 38, 335, + 117, 274, + -112, 454, + 74, 431, + -5, 488, + 175, 384, + -83, 561, + 122, 529, + 21, 601, + 229, 481, + 231, 303, + 226, 608, + 300, 372, + 210, 187, + 306, 265, + 328, 473, + 382, 331, + 371, 132, + 139, 58, + 365, 21, + 250, -82, + 443, 218, + 483, 110, + 426, 415, + 579, 222, + 518, 333, + 573, 448, + 455, 529, + 685, 329, + 332, 580, + 595, 593, + 468, 645, + 762, 517, + 326, 709, + 485, 793, + 130, 684, + 671, 737, + 354, 876, + 88, 806, + -65, 706, + -35, 1016, + 266, 1123}; + + +/*------------------------------------------------* + * 2nd split: isf2 to isf4 + *------------------------------------------------*/ + + static Word16 dico2_isf_noise[SIZE_BK_NOISE2*3] = { + + -824, -884, -949, + -805, -456, -418, + -442, -438, -541, + -217, -578, -793, + -168, -444, -582, + -287, -492, -274, + -552, -297, -300, + -163, -333, -358, + -370, -232, -232, + -175, -358, -159, + -381, -21, -357, + -184, -159, -162, + -53, -191, -280, + 18, -267, -215, + -138, 61, -283, + 71, -95, -294, + 13, -156, -546, + 0, -83, -79, + 44, 97, -316, + 178, -52, -213, + 222, -261, -422, + 237, -118, -44, + 141, 145, -132, + 363, 81, -287, + 213, 65, 34, + -107, 94, -5, + 91, -29, 126, + -355, 51, -41, + -219, -76, 145, + -63, 100, 244, + -719, 44, 27, + -572, -124, 155, + -423, 133, 315, + -917, 71, 224, + -268, 318, 131, + -93, -190, 420, + -97, 122, 491, + -79, 317, 355, + 130, 100, 325, + 86, -293, 210, + 133, 258, 161, + 176, -73, 465, + 195, 300, 384, + 348, 22, 221, + 376, 183, 409, + 377, 286, 202, + 242, 213, 659, + 257, 565, 248, + 344, 408, -76, + 405, 440, 509, + 612, 385, 379, + 536, 607, 216, + -56, 582, 192, + 100, 517, 567, + -365, 448, 445, + 728, 347, 10, + 505, 357, 759, + 636, 582, 658, + 335, 517, 852, + 378, 809, 572, + -195, 878, 829, + 529, 707, 987, + 918, 726, 392, + 1250, 997, 1063}; + +/*------------------------------------------------* + * 3rd split: isf5 to isf7 + *------------------------------------------------*/ + + static Word16 dico3_isf_noise[SIZE_BK_NOISE3*3] = { + + -805, -838, -774, + -522, -627, -828, + -477, -486, -603, + -295, -481, -634, + -366, -384, -393, + -186, -414, -396, + -237, -394, -106, + -252, -202, -275, + -61, -177, -442, + -84, -198, -199, + -179, -125, -31, + -72, -47, -163, + -298, -220, 215, + -64, -168, 251, + -133, 156, -59, + -30, -2, 127, + 54, 66, -61, + -233, 21, 251, + 209, -50, 32, + 33, 194, 136, + -117, -18, 475, + 202, 46, 309, + 256, 185, 53, + 35, 200, 390, + 200, 263, 242, + -216, 302, 294, + 128, 358, 0, + 19, 431, 287, + 224, 447, 280, + 367, 165, 213, + 397, 314, 319, + 383, 379, 75, + 277, 325, 462, + 394, 505, 334, + 251, 98, -213, + 450, 153, 448, + 565, 226, 76, + 470, 383, 502, + 635, 390, 278, + 237, 135, 620, + 342, 401, 649, + 331, 551, 518, + 130, 418, 592, + 531, 306, 737, + 729, 389, 580, + 497, 557, 699, + 296, 383, 874, + 283, 624, 759, + 126, 622, 476, + 559, 595, 472, + 382, 770, 616, + 719, 613, 745, + 540, 639, 928, + 517, 826, 801, + 684, 811, 604, + 752, 786, 857, + 933, 661, 350, + 694, 450, 1061, + 562, 911, 1051, + 824, 813, 1104, + 758, 1047, 882, + 1140, 917, 889, + 1039, 1246, 1426, + 1483, 1666, 1876}; + +/*------------------------------------------------* + * 4th split: isf8 to isf11 + *------------------------------------------------*/ + + static Word16 dico4_isf_noise[SIZE_BK_NOISE4*4] = { + + -776, -854, -891, -920, + -552, -610, -663, -741, + -321, -370, -476, -565, + 274, -160, -456, 201, + 265, 67, -160, -306, + -8, -210, 79, 272, + 163, 236, 307, 308, + 578, 317, 64, 298, + -9, 197, 342, 620, + 343, 232, 314, 622, + 173, 149, 548, 527, + 356, 370, 481, 376, + 135, 444, 488, 556, + 391, 471, 487, 653, + 228, 424, 576, 835, + 422, 372, 722, 682, + 295, 673, 693, 635, + 539, 596, 590, 449, + 475, 618, 659, 818, + 735, 517, 491, 673, + 602, 346, 257, 877, + 625, 635, 849, 720, + 727, 818, 698, 595, + 653, 481, 690, 1139, + 814, 762, 704, 908, + 507, 747, 898, 936, + 848, 855, 924, 785, + 646, 1037, 882, 795, + 772, 845, 1024, 1151, + 1133, 983, 818, 921, + 940, 1068, 1252, 1302, + 1588, 1767, 1718, 1513}; + +/*------------------------------------------------* + * 5th split: isf12 to isf15 + *------------------------------------------------*/ + + static Word16 dico5_isf_noise[SIZE_BK_NOISE5*4] = { + -810, -879, -945, -254, + 248, 184, 671, 128, + 288, 703, 918, 99, + 658, 558, 662, 219, + 552, 585, 910, 208, + 559, 804, 759, 119, + 606, 774, 921, -139, + 782, 761, 748, 208, + 756, 708, 983, 56, + 544, 864, 1010, 152, + 737, 698, 987, 299, + 771, 924, 879, 103, + 536, 785, 961, 405, + 667, 916, 801, 328, + 738, 705, 773, 439, + 823, 871, 992, 355, + 640, 1004, 1052, 369, + 724, 822, 949, 597, + 415, 655, 729, 482, + 1009, 896, 793, 363, + 908, 803, 687, -25, + 1016, 838, 1011, 189, + 947, 1112, 942, 222, + 914, 1049, 981, 527, + 956, 987, 1011, -120, + 781, 1049, 1121, 92, + 1178, 1053, 884, 47, + 1123, 1059, 1182, 118, + 933, 972, 1277, 357, + 1109, 918, 1101, 503, + 1039, 1286, 1220, 317, + 1351, 1207, 1010, 326}; + diff --git a/media/libstagefright/codecs/amrwbenc/inc/qpisf_2s.tab b/media/libstagefright/codecs/amrwbenc/inc/qpisf_2s.tab index 4d869a4..b6b4e81 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/qpisf_2s.tab +++ b/media/libstagefright/codecs/amrwbenc/inc/qpisf_2s.tab @@ -1,1360 +1,1360 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*-------------------------------------------------------------------* - * qpisf_2s.h - *-------------------------------------------------------------------* - * Quantization tables for two-stage of ISFs (split by 2 in 1st stage) - * Version whith prediction MU = 0.25 - *-------------------------------------------------------------------*/ - -#define ORDER 16 /* order of linear prediction filter */ -#define ISF_GAP 128 /* 50 Hz */ -#define N_SURV 4 - -#define SIZE_BK1 256 -#define SIZE_BK2 256 -#define SIZE_BK21 64 -#define SIZE_BK22 128 -#define SIZE_BK23 128 -#define SIZE_BK24 32 -#define SIZE_BK25 32 - -#define SIZE_BK21_36b 128 -#define SIZE_BK22_36b 128 -#define SIZE_BK23_36b 64 - -/* means of ISFs */ -static Word16 mean_isf[ORDER] = { - - 738, 1326, 2336, 3578, 4596, 5662, 6711, 7730, - 8750, 9753, 10705, 11728, 12833, 13971, 15043, 4037}; - -/* 46 bits */ -/*-------------------------------------------------------------------* - * isf codebooks: two-stage VQ with split-by-5 in 2nd stage * - * * - * codebook vector dimension number of vectors * - * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ * - * 1_1 9 256 * - * 1_2 7 256 * - * 2_1 3 64 * - * 2_2 3 128 * - * 2_3 3 128 * - * 2_4 3 32 * - * 2_5 4 32 * - *-------------------------------------------------------------------*/ - -/*------------------------------------------------* - * 1st stage codebook; 1st split: isf0 to isf8 - *------------------------------------------------*/ - -static Word16 dico1_isf[SIZE_BK1*9] = { - - 579, 1081, 1035, 390, 3, -263, -198, -82, 38, - 18, -68, -12, 313, 761, 405, 249, 111, -76, - 740, 1263, 1292, 1006, 997, 1019, 1017, 976, 923, - -91, 827, 948, 648, 613, 535, 522, 490, 421, - 41, -44, -281, -472, 652, 534, 193, 135, -90, - 41, -121, -356, -60, 663, 307, 61, -48, -344, - 557, 946, 1049, 867, 846, 990, 1112, 1262, 1241, - -118, -204, 328, 512, 870, 793, 610, 402, 186, - 156, 293, 74, -338, -475, -897, -594, -161, -497, - 226, 131, -138, 307, 169, -271, -164, -387, -624, - 62, -32, -61, -252, -541, -828, -1027, -523, -662, - 102, -61, 141, 112, -270, -251, -541, 25, -150, - 6, -132, -356, -686, -96, -322, -522, -31, -326, - -36, -209, -521, -229, 307, -132, -5, -99, -384, - 60, -51, -237, -668, -973, -407, -708, -75, -172, - 26, -138, -266, 111, -302, 43, -278, -356, -359, - 570, 822, 496, -154, -312, -92, 137, 279, 371, - -146, 368, 409, 68, 6, 77, 167, 202, 162, - 633, 898, 996, 756, 662, 683, 783, 909, 996, - -103, 294, 607, 415, 483, 462, 480, 431, 408, - -120, -338, -612, -524, 584, 331, 92, 433, 276, - -178, -293, -154, -41, 269, 100, -9, 213, 160, - 830, 736, 278, 820, 1254, 686, 712, 1039, 473, - -218, -304, 463, 454, 397, 273, 202, 286, 273, - -232, 7, 6, -388, -472, -427, -378, -167, -100, - -294, -183, 134, -47, 101, -88, -84, -117, -3, - 57, 17, -202, -634, -989, -1119, -533, 176, -36, - 120, -28, 23, 111, -319, 318, -22, -77, 266, - -271, -464, -434, -658, -640, -385, -385, -99, -69, - -198, -259, -266, -44, -39, -139, -137, 171, 66, - 9, -145, -377, -846, -1000, -111, -325, 342, 135, - -81, -286, -380, 192, -57, 307, 76, -24, -140, - 677, 702, 247, 56, 249, 141, -105, -236, -99, - 36, -39, -69, 348, 198, -93, 322, 91, -72, - 503, 885, 1508, 1307, 1282, 1172, 1119, 1209, 1061, - 416, 719, 989, 1227, 1001, 1052, 954, 741, 1044, - -127, -376, -657, 139, 623, 223, 501, 306, 220, - -113, -384, -796, 504, 438, 85, 213, -83, -194, - 585, 1132, 1233, 1091, 1247, 1433, 1512, 1448, 1314, - -174, -422, 7, 1155, 1089, 1182, 1003, 945, 806, - 8, -126, -317, -103, -351, -695, -98, -268, -537, - 33, -103, -290, 167, -39, -407, 44, -208, -375, - 104, -23, -64, -291, -637, -851, -1084, -61, -112, - -75, -306, -434, 218, -148, -354, -680, -133, -216, - -121, -377, -718, -97, -130, -361, -156, -379, -599, - -56, -254, -586, 235, 157, -214, 11, -260, -149, - -124, -267, -397, -580, -593, -527, -805, -385, 346, - -193, -440, -708, -351, -141, -255, -499, -147, -185, - 448, 660, 494, 208, 509, 461, 338, 291, 149, - -223, 88, 335, 159, 212, 191, 286, 308, 205, - -31, 469, 803, 659, 619, 658, 843, 987, 1113, - -171, -242, 514, 362, 295, 524, 552, 694, 585, - -64, -308, -448, -21, 284, 786, 446, 289, 92, - -218, -390, -7, 169, 206, 330, 352, 408, 358, - -36, 702, 959, 859, 861, 1115, 1269, 1357, 1305, - -133, -341, -65, 678, 417, 440, 486, 518, 780, - 33, -44, -191, -344, -461, -755, -201, 217, -31, - -353, -547, -44, 123, -61, -68, -79, 29, 60, - 73, -57, -406, -766, -1243, -1203, 240, 400, 165, - -73, -282, -601, -213, -171, -375, 332, 35, -103, - -29, -207, -553, -476, -638, -908, 172, -22, -135, - -192, -239, -164, -103, -111, -47, 153, 125, 110, - -1, -203, -570, -1030, -1424, -535, 155, 1, 147, - -333, -653, -865, -197, -158, -21, -44, 95, 108, - 389, 588, 490, 33, -237, -524, -628, -136, -260, - 40, -177, -462, 453, 862, 380, 131, -130, -405, - 842, 1678, 1841, 1549, 1474, 1256, 1082, 905, 742, - 370, 1216, 1768, 1633, 1212, 636, 22, -330, 71, - -76, -281, -741, -742, 898, 619, 277, 71, -222, - -32, -265, -556, -25, 994, 682, 305, 126, -165, - 73, 738, 893, 968, 993, 1768, 2273, 1840, 1391, - -69, -349, -585, 234, 1158, 903, 626, 510, 251, - -1, -99, -272, -210, -603, -351, -540, -811, -383, - -16, -230, -504, 410, 149, -205, -343, -651, -639, - 103, -9, -227, -205, -562, -781, -1079, -1208, -156, - 143, 63, -135, -67, -317, -602, -784, -1154, -640, - -144, -391, -674, -622, -200, -254, -660, -947, -395, - -40, -250, -625, 27, 543, 94, -131, -386, -673, - -123, -371, -757, -451, -564, -614, -415, -711, -35, - -116, -309, -593, -268, 239, -33, -338, -650, -135, - 94, 251, 554, 57, -312, -423, -154, -57, 235, - -268, -71, 381, 114, -44, -87, 125, 173, 133, - 1513, 1714, 1238, 534, 276, 315, 461, 459, 508, - -131, -19, 1149, 670, 486, 356, 309, 369, 296, - -223, -501, -899, -722, -70, 6, 131, 310, 394, - -99, -303, -517, 249, 64, -53, 135, -11, 453, - -147, -399, -730, -401, 817, 738, 802, 749, 575, - -154, -435, -739, 800, 593, 366, 529, 318, 326, - -224, 45, -39, -387, -515, -518, -608, -384, -321, - -315, -377, 143, -101, -113, -377, -177, -144, -12, - 117, 40, -239, -651, -1051, -581, -737, -990, -328, - 26, -50, -157, -23, -453, -283, -531, -546, 192, - -252, -501, -743, -589, -627, -499, -328, -118, -72, - -324, -494, -244, -306, -144, -177, -262, -135, -78, - -36, -234, -519, -961, -1290, -314, -479, -371, -45, - -95, -292, -535, -8, -300, 112, -164, -277, 198, - -99, -128, 880, 836, 579, 351, 23, -95, -217, - -27, -258, 124, 1011, 597, 425, 144, 7, -73, - 421, 1293, 1640, 1623, 1742, 1617, 1499, 1284, 1006, - -95, 752, 1680, 1569, 1618, 1436, 1200, 980, 712, - -69, -300, -683, -435, 1132, 899, 504, 332, 109, - -74, -323, -637, 563, 1074, 608, 371, 105, -49, - -78, 831, 1194, 1110, 1378, 1481, 1492, 1365, 1217, - -259, -121, 1440, 1334, 1628, 1490, 1438, 1223, 933, - -82, -306, -613, -222, -378, -675, -545, -671, -845, - 53, -124, -347, 422, 52, -125, -270, -529, 9, - 79, -89, -320, -662, -999, -1199, -1243, -676, -297, - -68, -273, -611, 137, -146, -397, -627, -845, -220, - -112, -346, -797, -826, 234, -132, -188, -278, -522, - -159, -405, -734, -419, 293, 74, -167, -167, 184, - -153, -437, -833, -1080, -336, -472, -561, -340, -253, - -169, -423, -820, -904, -131, -19, -346, -604, 31, - 33, -31, 312, 62, -148, 49, -59, 564, 486, - -306, -333, 194, -44, 67, 72, 147, 205, 243, - -207, -49, 1360, 983, 969, 991, 1014, 1110, 973, - -211, -172, 883, 627, 711, 674, 705, 798, 746, - -88, -325, -763, -974, 687, 908, 514, 382, 172, - -292, -612, -805, 63, 131, 270, 259, 352, 348, - -235, -84, 955, 818, 1120, 1289, 1559, 1480, 1285, - -180, -461, -614, 657, 691, 745, 854, 783, 713, - -97, -309, -477, -614, -777, -734, -768, -526, -472, - -344, -476, -35, -169, 49, -77, -150, -240, -141, - -52, -268, -639, -919, -1278, -1113, -342, -333, -151, - -68, -242, -585, -73, -209, -478, -159, -429, 133, - -197, -499, -1005, -1268, -272, -224, -105, -67, 17, - -363, -618, -414, -116, -62, 20, 10, 116, 108, - -195, -475, -906, -1260, -891, -441, -277, -142, -28, - -226, -519, -950, -700, -275, -266, -116, -105, 82, - 404, 511, 520, 327, 17, -194, -333, -536, -586, - -114, -130, 276, 237, 204, 342, 135, -16, -111, - 670, 1208, 1168, 860, 742, 601, 528, 403, 309, - 397, 621, 966, 752, 579, 398, 400, 329, 252, - 191, 180, -137, -467, 272, 106, -95, 17, -192, - -80, -290, -626, 194, 598, 196, 21, -281, 77, - 510, 864, 1108, 807, 939, 902, 925, 717, 481, - 137, 367, 534, 764, 670, 382, 296, 153, 84, - 303, 497, 144, -85, -125, -539, -482, -464, -764, - 233, 347, 68, -147, 169, -210, -242, -226, -482, - 307, 422, 154, -175, -386, -722, -724, -904, -1015, - 309, 308, 160, -60, -470, -420, -598, -791, -219, - 68, 121, -137, -560, -146, -446, -515, -494, -729, - 130, 53, -227, 46, 474, 32, -161, -192, -490, - 213, 164, -71, -465, -876, -161, -456, -587, -48, - 218, 117, 39, 177, -194, -88, -226, -418, 50, - 210, 547, 569, 279, 121, -44, -50, 10, -84, - 58, 140, 182, -5, 267, 117, 106, 211, 198, - 539, 835, 913, 719, 617, 544, 591, 565, 642, - 153, 559, 872, 460, 222, 108, 188, 180, 183, - 158, 119, 284, -153, -271, 229, 87, 110, -57, - -183, 82, 118, 21, 13, 40, 118, 191, 185, - 162, 889, 654, 108, -34, 244, 488, 561, 532, - 163, 56, 609, 341, 50, 329, 68, 266, 218, - 100, 206, 18, -304, -107, -436, -487, -65, -306, - -86, 154, 134, -30, -45, -73, -104, -80, -96, - 245, 330, 10, -440, -849, -1082, 79, 40, -265, - 196, 372, 272, -181, -493, -389, 275, 80, -59, - 2, -12, -246, -505, -100, -436, 21, -187, -431, - -221, -48, 36, -271, -186, -147, -109, 26, 71, - 213, 140, 72, -351, -620, -84, -363, 69, 46, - 91, 167, -3, -95, -99, -105, -48, 114, 147, - 259, 249, 172, 607, 406, 52, 59, -189, -320, - 115, -85, -54, 574, 128, 226, -59, -253, 130, - -62, 1033, 1308, 1035, 1127, 1098, 1029, 961, 823, - 39, 364, 757, 940, 728, 660, 659, 583, 770, - -115, -338, -760, -471, 394, 37, 441, 178, 6, - -57, -305, -525, 796, 453, 188, -4, -114, 248, - 71, 444, 797, 731, 1096, 1157, 1222, 1029, 811, - 135, 359, 551, 425, 749, 815, 874, 704, 502, - 132, 247, 0, -206, -449, -750, -258, -514, -633, - 248, 249, 91, 121, -195, -499, -90, -282, -435, - 78, 20, -277, -623, -983, -1224, -415, -458, -639, - 347, 509, 208, -179, -464, -728, -76, -237, -486, - -103, -343, -756, -713, -265, -609, -191, -398, -636, - -121, -383, -749, 567, 252, -36, -354, -417, -50, - 204, 100, -149, -650, -1081, -47, -7, -263, 111, - -46, -180, -267, -324, -562, -394, -692, 398, 292, - 482, 670, 683, 624, 442, 165, 116, 36, -149, - 108, 247, 291, 247, 355, 122, 109, 224, 296, - -14, 945, 990, 801, 755, 815, 847, 913, 892, - 292, 349, 725, 482, 388, 329, 429, 620, 667, - -34, 197, 213, -127, 84, 494, 620, 575, 375, - 126, 207, 172, 167, 362, 202, 296, 395, 455, - -6, 250, 539, 467, 636, 801, 1149, 1287, 1118, - 27, 240, 369, 280, 440, 411, 634, 892, 953, - 159, 170, -58, -395, -797, -690, 77, -211, -334, - -5, -28, -13, -74, -335, -603, 300, 88, -205, - 82, -33, -364, -698, -1203, -1153, 110, -146, -289, - 113, 1, -243, -588, -994, -496, 414, 160, 42, - -56, -247, -440, -693, -996, -479, 11, -178, -357, - -151, -353, -327, -211, -340, 141, 65, 425, 453, - 34, -169, -455, -932, -1215, 138, 499, 256, 324, - 68, 139, -15, -547, -478, 17, 306, 502, 481, - -32, -134, 445, 129, -143, -244, -503, -507, -599, - 61, -140, -345, 496, 458, -2, 20, -227, -514, - 394, 1765, 1666, 1339, 1117, 806, 642, 479, 380, - 215, 519, 920, 1053, 1090, 791, 528, 290, 155, - -54, -233, -647, -602, 639, 294, -2, -167, -442, - -78, -315, -791, -113, 820, 403, 158, -116, -356, - 529, 1851, 2003, 1228, 622, -41, -416, 344, 819, - -105, -379, -236, 1224, 893, 749, 568, 356, 214, - -17, -199, -144, 50, -283, -247, -578, -846, -1087, - 69, -11, -381, -206, 209, -284, -387, -416, -716, - 39, -5, -145, -374, -682, -909, -1074, -1169, -1066, - 287, 226, 67, -221, -662, -171, -421, -642, -707, - -132, -348, -538, -448, -20, -4, -354, -748, -933, - 4, -75, -289, -598, 317, 52, -208, -297, -559, - -88, -264, -358, -589, -631, -248, -523, -822, -1071, - 70, -8, 54, -314, -515, 92, -146, -274, -493, - 199, 62, 391, 158, -141, 71, -219, -203, -207, - 152, 40, 329, 162, -29, 48, -149, 108, 127, - 635, 1058, 883, 492, 372, 312, 317, 274, 241, - 267, 722, 1256, 882, 625, 248, 8, -81, -60, - -58, -138, -291, -600, -12, -2, -39, 147, 117, - -107, -345, -513, 459, 76, 92, -272, 388, 262, - 362, 516, 203, -409, -716, -831, -331, 185, 209, - -117, -391, -298, 671, 292, 538, 257, 166, -38, - -102, -319, -194, -283, -573, -262, -579, -219, -444, - -235, 78, 11, -168, -101, -229, -263, -321, -123, - 70, 50, -170, -599, -996, -588, -263, -516, -455, - 394, 363, 229, -136, -538, 21, -183, -348, -201, - -124, -368, -640, -879, -847, -209, -409, -494, -515, - -127, -341, -541, -425, -510, -10, -252, -473, -291, - 84, -69, -201, -676, -868, 103, -311, -132, -320, - 5, -173, -188, -297, -628, 197, -57, 7, -11, - 49, -160, 56, 558, 111, 33, -311, -440, -463, - -1, -246, -307, 862, 453, 139, -170, -355, -232, - 279, 966, 1642, 1478, 1463, 1123, 795, 525, 339, - -197, -38, 1702, 1331, 1252, 950, 692, 504, 426, - -108, -344, -861, -1172, 444, 354, 88, -46, -220, - -53, -321, -494, 1113, 744, 364, 198, -34, -75, - 457, 955, 1177, 1214, 1427, 1457, 1345, 917, 539, - -69, 199, 897, 1140, 1343, 1183, 977, 742, 522, - 122, 44, -269, 27, -155, -562, -307, -590, -773, - 154, 42, -160, 252, -129, -305, -471, -733, -371, - 135, 185, -82, -416, -722, -913, -504, -743, -880, - 149, 214, -84, -329, -680, -835, -426, -661, -81, - -128, -380, -735, -998, -337, 17, -182, -467, -697, - -84, -290, -510, -592, 13, 440, 154, -38, -279, - 70, -61, -246, -727, -1047, -80, -381, -535, -704, - 178, -2, -146, -670, -938, 482, 138, 63, 65, - -11, 15, 772, 443, 142, -20, -209, -126, -161, - -32, -249, 95, 552, 124, 30, -343, 82, -86, - 148, 751, 1515, 1105, 867, 606, 474, 448, 399, - -163, -257, 899, 1097, 906, 751, 502, 390, 294, - -51, -258, -447, -806, -368, 763, 464, 364, 183, - -166, -374, -367, 87, 35, 399, 418, 856, 833, - -205, -310, 588, 778, 785, 1065, 1118, 1245, 1157, - -173, -312, 107, 345, 400, 790, 870, 1113, 1001, - -7, -120, -387, -410, -614, -943, -226, -384, -491, - -203, -288, -51, -331, -90, -178, -408, -573, -338, - 56, -29, -273, -627, -1041, -798, -247, -467, 148, - 66, -2, -205, -205, -575, -349, -57, -352, -58, - -45, -225, -471, -924, -497, 77, -32, 44, -135, - -277, -491, -497, -502, -424, -202, -137, 77, 96, - 26, -179, -469, -1008, -1260, 262, -35, -132, -259, - -66, -232, -447, -533, -789, -191, -100, -267, 364}; - -/*------------------------------------------------* - * 1st stage codebook; 2nd split: isf9 to isf15 - *------------------------------------------------*/ - -static Word16 dico2_isf[SIZE_BK2*7] = { - - 1357, 1313, 1136, 784, 438, 181, 145, - 636, 648, 667, 568, 442, 217, 362, - 427, 440, 674, 524, 332, 117, -417, - 121, 295, 468, 465, 230, 44, -221, - -147, -240, 149, 80, 390, 278, 106, - -418, -556, 552, 511, 235, 144, -95, - 43, 193, 274, 150, 67, 34, -273, - -43, -126, 171, 416, 282, 63, -354, - -372, -86, -344, -108, -94, -182, -89, - -600, -840, -200, 465, 258, -11, -253, - -48, 329, 97, -290, -543, -795, -354, - -570, -117, 187, 10, -133, -416, -76, - -618, -129, -247, -371, 45, -76, 277, - -1022, -1079, 126, 474, 254, 127, 52, - -281, 76, -167, -361, -283, -551, -283, - -119, -52, -1, 134, -32, -204, -415, - 1064, 827, 637, 684, 464, 209, 12, - 482, 416, 449, 371, 335, 294, 194, - 719, 576, 365, 135, 113, 91, -199, - 298, 176, 493, 366, 194, 163, 36, - -35, -236, -259, -36, -4, 99, 152, - -98, -306, -27, 228, 90, 111, -86, - 91, 13, -211, -258, -106, 86, -64, - 73, -35, -57, -31, 162, 35, -192, - -109, -335, -629, -66, -61, -128, 322, - -495, -669, -728, 193, 31, -220, 122, - 324, 95, -89, -91, -409, -710, -154, - 0, -234, 92, 33, -343, -609, -220, - -343, -408, -476, -655, -153, 82, 222, - -490, -745, -255, 49, -48, 135, -127, - 119, -67, -328, -390, -272, -545, -56, - -57, -130, -10, -7, -164, -47, -22, - 984, 1064, 961, 568, 210, -27, 16, - 811, 691, 754, 514, 224, -35, 166, - 662, 704, 618, 386, 57, -211, -257, - 510, 359, 418, 393, 91, -144, -18, - -193, -31, -27, 223, 89, -143, 24, - -112, -98, 471, 319, 185, 3, 175, - 252, 146, -47, 272, 48, -211, -234, - 146, 69, 203, 364, 68, -52, 51, - -259, -478, -697, -349, -758, -501, 63, - -501, -769, -289, 79, -311, -497, -106, - 251, 53, -235, -469, -895, -884, 145, - -416, -551, 140, -133, -523, -775, 44, - -326, -423, -713, -497, -86, -431, 99, - -757, -772, -160, -76, -46, -32, 379, - 85, -35, -200, -401, -663, -1040, -247, - -180, -330, -92, -376, 27, -183, -110, - 1279, 1086, 781, 502, 324, 164, 157, - 682, 466, 449, 277, 146, 28, 409, - 635, 472, 390, 107, -232, -538, -139, - 196, 396, 332, 213, 209, -29, -81, - 150, -95, -312, 76, -77, -320, -50, - 46, 9, 47, 175, 139, 30, 384, - 218, 206, -24, -250, -96, -276, -183, - 26, 119, 38, 14, -4, -133, -52, - -477, -614, -987, -715, -631, -813, 200, - -744, -1009, -1065, -745, -631, -171, 18, - -137, -251, -483, -613, -980, -1203, 12, - -605, -767, -562, -686, -1088, -515, 58, - -202, -428, -782, -1072, -96, -234, -179, - -480, -709, -1070, -897, -131, -92, 321, - -145, -193, -512, -729, -572, -765, -210, - -331, -585, -525, -631, -281, -208, -303, - 1165, 1104, 939, 828, 716, 426, 155, - 6, -109, 820, 778, 415, 113, -27, - 381, 339, 314, 265, 121, -9, -474, - -373, 47, 584, 442, 99, -231, -113, - -496, -38, -285, 262, 305, 170, 4, - -587, -556, 69, 66, 471, 354, 13, - -138, 70, -18, 106, 67, 167, -302, - -445, -141, 185, 191, 151, 83, -133, - -257, -521, -720, -198, 134, -46, -182, - -819, -1168, -777, 512, 359, 95, -113, - 137, -2, -74, -138, -401, -114, -371, - -242, -466, 204, 223, -31, -212, -192, - -532, -637, -466, -686, 256, 277, -139, - -1141, -1244, -381, -75, -54, 14, 88, - -311, 115, -143, -499, -343, 124, -416, - -616, -147, -135, 43, -4, 121, -369, - 835, 783, 641, 390, 355, 350, 64, - 72, 194, 443, 467, 436, 219, 372, - 464, 369, 192, 4, -156, -72, -226, - 57, 206, 303, 205, 188, 101, 265, - -40, -205, -488, -184, 276, 64, -26, - -217, -433, -297, 137, 328, 308, -289, - 378, 81, -308, -465, 57, -37, 227, - -100, 24, -36, -151, 199, 8, 143, - -426, -697, -1059, -133, 388, 161, 321, - -644, -1023, -1271, 39, 66, -123, 70, - 372, 177, -173, -556, -553, -304, -189, - -117, -369, -425, -122, -462, -152, -73, - -649, -850, -1189, -767, 497, 360, 222, - -798, -1139, -1455, -190, 430, 234, 179, - 42, -94, -405, -692, 38, -202, -246, - -169, -366, -290, -88, -64, 32, -292, - 1010, 923, 938, 710, 465, 230, 342, - 217, 300, 1054, 675, 68, -458, -179, - 78, 453, 316, 18, -237, -496, -243, - 167, 21, 424, 215, -91, -303, -170, - -290, -81, -70, -67, 40, 54, -59, - -353, -427, -90, 53, 94, 9, 54, - -28, 318, 283, 15, -240, -58, 79, - -75, -121, 229, 35, 58, 6, -133, - -351, -514, -744, -834, -705, -137, 164, - -1124, -1388, -1055, -230, -73, 40, 36, - -163, -233, -532, -785, -1170, -697, 96, - -788, -959, -246, -430, -624, -165, -8, - -856, -540, -630, -907, -337, -70, 76, - -937, -1042, -659, -733, -208, 199, -26, - -523, 78, -98, -501, -869, -890, -81, - -624, -703, -45, -348, -25, 87, -186, - 1005, 823, 546, 249, 90, -22, 207, - 298, 397, 381, 319, 200, 62, 303, - 473, 379, 133, -247, -632, -441, 75, - 284, 208, 391, 115, -25, 44, 95, - -72, 79, -95, -63, -129, -293, 203, - -164, -349, 115, 122, 69, -1, 378, - 348, 170, 99, 58, -179, -302, 188, - -190, -2, 150, 23, -51, -11, 216, - -615, -863, -1090, -1427, -802, -48, -6, - -961, -1276, -1548, -727, -58, 56, 223, - -124, -255, -561, -988, -1277, -148, -82, - -480, -660, -891, -1191, -1339, -325, 20, - -621, -917, -1296, -1350, 264, 289, 50, - -844, -1022, -1345, -1329, -293, 46, 278, - -260, -468, -829, -1176, -533, -560, -78, - -215, -484, -822, -1233, -791, 15, -138, - 1301, 1317, 1262, 1048, 716, 357, -64, - 578, 824, 925, 802, 630, 362, 102, - 470, 925, 767, 514, 327, 190, -112, - 225, 492, 495, 437, 598, 384, -45, - 43, 82, -42, 175, 519, 342, -64, - -304, -154, 159, 576, 403, 221, 327, - 214, 244, 122, -62, 312, 92, -160, - 218, 208, 310, 268, 306, 323, -199, - -285, -269, -79, -124, -143, -153, 236, - -205, -384, -426, 344, 59, -185, -184, - -272, 247, 126, -210, -518, -468, 78, - -99, -120, 502, 160, -280, -557, 304, - -423, -17, -283, -443, 215, 212, -140, - -564, -684, -228, 510, 361, 130, 323, - -428, 335, 98, -65, 36, -215, -246, - -362, 51, 364, -16, -234, 150, -165, - 914, 883, 751, 653, 676, 464, -153, - 631, 545, 535, 720, 596, 360, -81, - 783, 712, 512, 439, 341, 251, -391, - 497, 417, 249, 372, 295, 173, -193, - 128, -110, -385, 93, 39, 173, -231, - 216, -59, -253, 462, 389, 154, 69, - 455, 270, -4, -337, -49, 233, -322, - 307, 143, 53, 218, 128, 236, -156, - -37, -186, -240, -411, -110, 9, 399, - -140, -365, -628, 258, 380, 214, 277, - 131, 454, 177, -285, -520, 108, -214, - 77, -141, 201, -123, -490, -131, 60, - -14, -194, -521, -741, 273, 362, -33, - -362, -566, -287, -228, 161, 237, 317, - -269, 195, -75, -375, -204, 11, 77, - -128, -264, -156, -223, -475, 265, 27, - 1238, 1147, 916, 689, 432, 210, -280, - 800, 664, 879, 726, 411, 160, -164, - 454, 686, 536, 275, 147, 46, 111, - 303, 486, 512, 355, 241, 181, -69, - 79, 92, 29, 147, 233, 52, 17, - -171, 289, 131, 439, 271, 3, -10, - 413, 241, 144, 174, 155, -2, 14, - 58, 217, 247, 219, 149, 175, -18, - 228, -8, -240, -206, -513, -191, 202, - -96, -272, -454, 33, -300, -575, 46, - -10, -108, -246, -347, -770, -535, 9, - -326, -430, -61, -321, -704, -299, 201, - -1, -280, -603, -419, -185, 18, -36, - -516, -522, -379, -291, -181, -97, 27, - -159, -313, -525, -224, -510, -831, -197, - -292, -459, -59, -310, -562, -143, -351, - 1066, 912, 631, 389, 207, 86, -224, - 596, 512, 596, 505, 314, 122, -48, - 787, 861, 441, -93, -303, 33, -190, - 257, 469, 337, 51, 15, 298, -93, - 295, 73, -119, 25, 36, 23, 108, - -28, -3, -32, 114, 21, 185, 107, - 482, 305, 15, -279, -319, 52, 96, - 226, 46, 115, 72, -136, 133, -125, - 18, -207, -559, -590, -503, -482, 321, - -571, -789, -951, -172, -441, -538, 113, - 181, 14, -310, -641, -1001, -202, 159, - -136, -393, -433, -513, -911, -144, -22, - 72, -265, -706, -954, -159, 53, 332, - -338, -591, -852, -383, -395, 56, 44, - 43, -158, -464, -897, -631, -157, -294, - -161, -128, -328, -573, -483, -125, 11, - 1017, 906, 1051, 1005, 679, 341, -102, - 359, 334, 1567, 1314, 723, 105, 10, - -65, 726, 529, 301, 220, 43, -273, - -510, 436, 719, 566, 358, 179, 114, - -560, 298, 133, -120, 342, 225, 14, - -899, -101, 217, 617, 400, 146, -58, - -41, 352, 82, -196, 39, 121, -167, - -212, 59, 447, 284, 423, 250, -169, - -371, -484, -596, 30, -41, 249, 22, - -372, -650, -794, 477, 445, 216, -79, - -352, 275, 17, -443, -929, 92, 19, - -699, -696, 431, 264, -49, -310, 182, - -978, -217, -430, -400, 101, 261, 72, - -929, -889, -357, -13, 463, 378, 236, - -826, 56, 30, -299, -360, -128, -51, - -878, -299, -111, 75, 65, 36, 3, - 817, 368, -25, 354, 697, 591, -173, - 309, 212, 222, 751, 484, 140, -56, - 593, 379, 70, -8, 258, 180, 110, - 165, -46, 255, 297, 219, 273, 105, - 160, -70, -358, -181, 379, 330, 319, - -238, -369, -198, 740, 580, 319, -143, - 201, 109, -202, -456, 328, 276, -141, - 203, 170, 111, 42, 207, 360, 188, - -345, -399, -513, -233, 650, 422, 81, - -635, -961, -1220, 463, 539, 204, 209, - 202, -25, -194, -498, -787, 193, -143, - -449, -538, 195, -106, -331, 68, 62, - -228, -477, -840, -576, 317, 128, 283, - -671, -937, -807, -114, 391, 335, -62, - 246, 2, -314, -679, -303, 180, -88, - -107, -272, 90, -198, -28, 290, -112, - 885, 1149, 1021, 712, 496, 281, -83, - 269, 492, 787, 643, 347, 70, 124, - 336, 636, 499, 92, -229, -179, 191, - 26, 402, 564, 340, 149, -11, 135, - -440, 561, 470, 204, -72, -186, 140, - -720, 14, 355, 229, 68, -133, 465, - 110, 310, 103, 12, 106, 29, 158, - -178, 113, 161, 142, 121, 115, 27, - -651, -414, -645, -152, -164, -13, -429, - -639, -944, -681, -104, -81, 52, -189, - -663, -164, -316, -683, -954, -205, -83, - -609, -669, -172, -517, -694, 283, -80, - -646, -152, -383, -678, -246, -40, -143, - -747, -796, -745, -390, -98, 43, 275, - -599, -199, -398, -433, -436, -538, 31, - -1107, -568, -376, -265, -126, -21, 1, - 847, 573, 308, 392, 305, 101, 55, - 273, 293, 201, 267, 346, 201, 123, - 727, 480, 226, 2, -65, -138, 164, - 273, 208, 173, 292, 12, 253, 174, - 340, 207, 180, 88, 116, 46, 475, - -460, -166, -30, 13, 110, 173, 396, - 137, 88, 43, -137, -94, 34, 284, - 96, -14, 226, 40, 63, 70, 130, - -467, -735, -1012, -1174, -307, 305, -67, - -612, -920, -1146, -567, -8, 92, -25, - -182, -271, -492, -754, -857, 287, -75, - -494, -787, -689, -683, -709, 137, -326, - -288, -550, -903, -1105, 334, 321, -62, - -354, -653, -834, -445, 1, 377, -152, - -162, -306, -608, -937, -297, 247, -192, - -234, -477, -244, -488, -266, 342, -332}; - -/*---------------------------------------------------* - * 2nd stage codebook; 1st split: isf2_0 to isf2_2 - *---------------------------------------------------*/ - - -static Word16 dico21_isf[SIZE_BK21*3] = { - - 329, 409, 249, - -33, 505, 160, - -29, -14, 582, - -262, 127, 354, - 145, 237, 175, - -152, 245, 122, - 27, 42, 340, - -84, -93, 311, - 285, 222, -156, - 47, -43, -504, - 234, 121, 385, - 104, -317, 45, - 176, 195, 8, - 104, -59, -94, - 177, 53, 192, - -34, -127, 152, - 570, 277, -34, - -67, -329, -639, - -157, -272, 462, - -177, -462, 198, - 322, 179, 115, - -386, 171, 19, - 19, -12, 195, - -120, -252, 201, - 304, 36, -336, - -128, -221, -380, - 171, -185, 296, - -242, -312, 23, - 198, 39, 16, - -3, -177, -111, - 111, -93, 76, - -92, -223, 4, - 177, 406, -44, - -168, 380, -149, - -4, 273, 331, - -420, 513, 277, - 21, 247, 47, - -58, 131, -2, - -3, 134, 180, - -145, 40, 175, - 189, 74, -145, - -27, -45, -325, - 370, -114, -21, - -83, -415, -173, - 77, 95, -51, - -40, -30, -67, - 71, 88, 86, - -35, -98, 14, - 69, 197, -334, - -196, 79, -231, - -348, -137, 218, - -352, -89, -85, - 47, 201, -130, - -165, 37, -15, - -43, 3, 86, - -161, -108, 79, - 83, 21, -237, - -81, -149, -238, - 150, -186, -251, - -186, -249, -162, - -19, 66, -139, - -26, -50, -181, - 24, 11, 0, - -130, -105, -98}; - - - -/*---------------------------------------------------* - * 2nd stage codebook; 2nd split: isf2_3 to isf2_5 - *---------------------------------------------------*/ - - -static Word16 dico22_isf[SIZE_BK22*3] = { - - -127, 310, 42, - -242, 197, 5, - -151, 84, -17, - -214, 127, -149, - -247, -131, 159, - -268, -267, -95, - -217, 1, -79, - -271, -80, -185, - -45, 436, 159, - 165, 199, 391, - -33, 81, 187, - -66, -42, 355, - -298, -57, 343, - -108, -537, 226, - -144, -23, 193, - 176, -402, 87, - 53, 296, 25, - -84, 253, -104, - -58, 105, -126, - -169, 174, -314, - -48, 44, -294, - -164, -417, -242, - -139, 3, -194, - -155, -207, -211, - 119, 322, 213, - 333, 50, 380, - 237, 247, -2, - 466, -16, 201, - 238, -255, -107, - 67, -440, -149, - 122, -88, -139, - 88, -247, -73, - -41, 231, 167, - -62, 155, 16, - -65, 16, 77, - -68, -2, -63, - -151, -300, 160, - -18, -333, 54, - -56, -94, 5, - 2, -190, 14, - 92, 148, 209, - 108, 9, 272, - 108, 35, 110, - 142, -85, 145, - 47, -157, 279, - 3, -320, 246, - 43, -72, 68, - 86, -217, 135, - 36, 140, 79, - 56, 175, -49, - 26, 45, 3, - 73, 55, -101, - 109, -183, -242, - -4, -283, -242, - 48, -68, -48, - -6, -153, -122, - 161, 196, 96, - 232, 80, 190, - 165, 97, 11, - 258, -31, 71, - 267, -77, -91, - 311, -209, 87, - 152, -14, -22, - 150, -149, 9, - -324, 557, 187, - -384, 307, 46, - -251, 27, 77, - -365, 77, -52, - -482, -84, 160, - -424, -515, -64, - -294, -120, -4, - -476, -116, -109, - -97, 318, 365, - 106, 627, 445, - -190, 120, 287, - -146, 65, 619, - -427, 242, 363, - -361, -371, 432, - -347, 102, 168, - -629, 195, -14, - -65, 476, -47, - -297, 320, -168, - -55, 356, -264, - -391, 82, -286, - -51, -31, -556, - -178, -399, -586, - -205, -49, -360, - -343, -238, -337, - 220, 457, 58, - 561, 467, 259, - 340, 270, -168, - 450, 77, -280, - 60, 167, -413, - 133, -252, -492, - 216, 157, -290, - 282, 0, -495, - -226, 293, 183, - -157, 135, 122, - -158, -59, 39, - -133, -118, -97, - -332, -309, 113, - -160, -425, -6, - -149, -211, 24, - -80, -277, -90, - -11, 125, 338, - 130, -71, 465, - 5, -45, 184, - 237, -95, 253, - -139, -197, 297, - -19, -300, 511, - -63, -152, 139, - 250, -289, 336, - 124, 339, -150, - 34, 176, -208, - 171, 166, -116, - 94, 38, -229, - 75, -65, -339, - -78, -205, -385, - 0, -30, -163, - -56, -110, -242, - 321, 244, 194, - 505, 238, -1, - 317, 116, 65, - 309, 88, -74, - 452, -51, -50, - 334, -217, -290, - 211, 41, -152, - 238, -55, -260}; - - -/*---------------------------------------------------* - * 2nd stage codebook; 3rd split: isf2_6 to isf2_8 - *---------------------------------------------------*/ - - -static Word16 dico23_isf[SIZE_BK23*3] = { - - -10, 151, 359, - 136, 298, 223, - 255, -104, 290, - 423, 6, 183, - -270, -269, -98, - -52, -82, 13, - -82, -274, -97, - 90, -246, -72, - -299, -70, 421, - -88, 365, 430, - 187, -318, 381, - 380, 37, 488, - -373, -316, 79, - -308, -101, 5, - -135, -451, 8, - 72, -421, -154, - 180, 170, -121, - 62, 177, -40, - 326, 80, -105, - 248, 263, -5, - -168, -181, -221, - -2, -23, -158, - -14, -149, -121, - 119, -91, -147, - 119, 332, -153, - 49, 303, 34, - 442, -55, -69, - 217, 454, 58, - -359, -187, -375, - -42, 50, -274, - -8, -267, -249, - 85, -86, -346, - -77, -40, 345, - 89, 134, 219, - 156, -80, 160, - 108, 40, 116, - -158, -206, 29, - 5, -32, 175, - -65, -158, 146, - 55, -78, 73, - -114, -222, 353, - -47, 81, 211, - 49, -151, 268, - 105, 4, 302, - -263, -132, 183, - -151, -28, 201, - -177, -307, 166, - 101, -221, 130, - 74, 58, -98, - 32, 44, 13, - 194, 30, -142, - 170, 96, 8, - -136, -119, -91, - -65, 8, -55, - 3, -188, 12, - 45, -63, -49, - 149, -21, -19, - 24, 144, 95, - 254, -22, 60, - 161, 196, 96, - -158, -61, 48, - -70, 33, 82, - -23, -321, 58, - 155, -147, 5, - -364, 328, 77, - -21, 453, 173, - -108, 82, 630, - 367, 263, 208, - -300, -62, -176, - -205, 143, -158, - -169, -410, -264, - 257, -269, -100, - -636, 289, -2, - -292, 627, 173, - -382, -363, 387, - 248, 524, 447, - -521, -111, -107, - -395, 118, -274, - -343, -680, -125, - -172, -447, -663, - 75, 148, -367, - -79, 263, -94, - 249, 148, -286, - 380, 271, -162, - -142, -4, -186, - -57, 111, -125, - -35, -108, -254, - 100, 29, -242, - -80, 303, -264, - -78, 464, -57, - 248, -22, -494, - 661, 662, 44, - -193, -40, -330, - -178, 145, -337, - -90, -199, -400, - -40, -23, -498, - -192, 114, 315, - -41, 244, 190, - 88, -97, 485, - 241, 80, 212, - -246, 40, 87, - -156, 147, 134, - -2, -334, 239, - 308, -203, 110, - -459, 251, 422, - -218, 310, 228, - -86, -346, 654, - 184, 175, 425, - -481, -63, 169, - -349, 117, 188, - -125, -560, 310, - 158, -416, 94, - 46, 171, -192, - -63, 157, 14, - 256, -35, -271, - 322, 123, 53, - -214, 4, -76, - -156, 86, -18, - 128, -197, -232, - 265, -90, -98, - -308, 332, -145, - -131, 308, 58, - 509, 59, -339, - 562, 196, -14, - -378, 100, -47, - -234, 202, 1, - 104, -270, -493, - 319, -210, -325}; - - -/*---------------------------------------------------* - * 2nd stage codebook; 4th split: isf2_9 to isf2_11 - *---------------------------------------------------*/ - -static Word16 dico24_isf[SIZE_BK24*3] = { - - -79, -89, -4, - -171, 77, -211, - 160, -193, 98, - 120, -103, 323, - 32, -22, -129, - 72, 78, -268, - 182, -76, -66, - 309, 99, -145, - -229, -157, -84, - -383, 98, -71, - -90, -352, 12, - -284, -178, 178, - -65, -125, -166, - -87, -175, -351, - 42, -198, -48, - 154, -140, -243, - -77, 18, 108, - -39, 355, 91, - 87, 8, 155, - -4, 158, 239, - 128, 95, -54, - 7, 246, -124, - 258, 15, 89, - 206, 216, 98, - -201, 9, 18, - -312, 233, 204, - -39, -174, 155, - -144, -9, 284, - -57, 70, -69, - -157, 187, 18, - 54, -30, 23, - 24, 135, 55}; - - -/*---------------------------------------------------* - * 2nd stage codebook; 5th split: isf2_12 to isf2_15 - *---------------------------------------------------*/ - -static Word16 dico25_isf[SIZE_BK25*4] = { - - 169, 142, -119, 115, - 206, -20, 94, 226, - -106, 313, -21, 16, - -62, 161, 71, 255, - -89, 101, -185, 125, - 72, -30, -201, 344, - -258, 33, -8, 81, - -104, -154, 72, 296, - 144, -68, -268, -25, - 81, -78, -87, 106, - 22, 155, -186, -119, - -46, -28, 27, 91, - -114, -37, -175, -33, - -94, -222, -189, 122, - -132, -119, -191, -270, - -172, -173, 18, -43, - 279, 135, -42, -128, - 187, -86, 229, -138, - 159, 240, 140, 46, - 69, 25, 227, 77, - 21, 115, 13, 8, - 68, -248, 126, 81, - -150, 137, 207, -9, - -154, -133, 289, 67, - 143, -37, -86, -326, - 180, -32, 19, -23, - 26, 168, 116, -233, - -32, -26, 118, -78, - 3, -8, -45, -115, - 57, -215, -54, -83, - -209, 112, -22, -167, - -91, -151, 168, -262}; - - - - /* 36 bit */ -/*-------------------------------------------------------------------* - * isf codebooks: two-stage VQ with split-by-3 in 2nd stage * - * 1st stage is kept the same as the 46 bit quantizer * - * * - * codebook vector dimension number of vectors * - * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ * - * 1_1 9 256 * - * 1_2 7 256 * - * 2_1 5 128 * - * 2_2 4 128 * - * 2_3 7 64 * - *-------------------------------------------------------------------*/ - -static Word16 dico21_isf_36b[SIZE_BK21_36b*5] = { - - -52, -96, 212, 315, -73, - 82, -204, 363, 136, -197, - -126, -331, 183, 218, 143, - -49, -41, 557, 230, 72, - 2, -73, 163, 377, 221, - 133, 111, 278, 215, -110, - -102, -20, 284, 113, 273, - 84, 319, 290, 18, 85, - -25, -5, 125, 132, -204, - -38, -5, 286, -9, -356, - -140, -256, 92, 117, -189, - -144, 191, 313, 51, -98, - 167, -10, 44, 247, 36, - 381, 197, 238, 74, 6, - 38, -408, 29, -3, -85, - 92, 266, 157, -25, -200, - 161, -121, 70, 84, -140, - -16, -86, 112, -94, -189, - -269, -270, 351, 107, -24, - -68, -67, 492, -103, -155, - -53, -131, 62, 122, 10, - 135, 84, 283, -55, -120, - -12, -219, 331, -81, 167, - 220, -136, 147, -172, -42, - 140, -95, -109, -88, -194, - 0, -2, -4, -33, -381, - -66, -217, 152, -186, -402, - 244, 108, 156, -140, -395, - 113, -136, -196, 110, -24, - 214, 118, 11, -64, -131, - -110, -286, -6, -332, 16, - 94, 97, 79, -291, -205, - -5, -39, -20, 252, -96, - 76, 174, 101, 163, 61, - -69, -239, -55, 399, 6, - -115, 319, 164, 275, 196, - -15, 36, -47, 331, 121, - 226, 209, 271, 325, 184, - 13, -80, -218, 471, 353, - 288, 378, 16, -51, 251, - 174, 116, 52, 149, -279, - 235, 276, 39, 120, -48, - 0, -108, -108, 241, -339, - -93, 534, 45, 33, -87, - 194, 149, -71, 405, -44, - 409, 370, 81, -186, -154, - 25, -102, -448, 124, -173, - 22, 408, -110, -310, -214, - -26, 23, -83, 114, 14, - -110, 164, 52, 223, -82, - 37, -25, -263, 306, -15, - -466, 415, 292, 165, -18, - 29, -19, -171, 155, 182, - 179, 144, -27, 231, 258, - -103, -247, -396, 238, 113, - 375, -154, -109, -4, 156, - 98, 85, -292, -5, -124, - 116, 139, -116, -98, -294, - -14, -83, -278, -117, -378, - 106, 33, -106, -344, -484, - 119, 17, -412, 138, 166, - 384, 101, -204, 88, -156, - -121, -284, -300, -1, -166, - 280, 33, -152, -313, -81, - -37, 22, 229, 153, 37, - -60, -83, 236, -8, -41, - -169, -228, 126, -20, 363, - -235, 17, 364, -156, 156, - -25, -30, 72, 144, 156, - 153, -26, 256, 97, 144, - -21, -37, 48, -65, 250, - 63, 77, 273, -128, 124, - -129, -26, 40, 9, -115, - -6, 82, 38, -90, -182, - -336, -13, 28, 158, 91, - -30, 241, 137, -170, -17, - 146, 14, -11, 33, 61, - 192, 197, 54, -84, 85, - 23, -200, -78, -29, 140, - 122, 237, 106, -341, 136, - -57, -142, -85, -16, -74, - -59, -90, -8, -187, -20, - -211, -267, 216, -179, -110, - -50, -7, 220, -267, -70, - -57, -42, -17, -15, 71, - 32, 21, 63, -137, 33, - -137, -175, 104, -68, 97, - -67, -43, 133, -301, 221, - -116, -200, -81, -92, -272, - -64, -41, -54, -244, -220, - -287, -242, -50, -87, -89, - -245, 236, 102, -166, -295, - 66, 24, -162, -71, 95, - 66, 136, -90, -220, -36, - -98, -161, -222, -188, 29, - -18, 18, -19, -415, 9, - 49, 61, 100, 39, -56, - -111, 82, 135, -31, 52, - -90, -153, -93, 189, 182, - -214, 295, 119, -74, 284, - 2, 137, 37, 47, 182, - 92, 117, 184, -53, 373, - -21, -14, -35, 136, 391, - 146, 129, -164, -28, 333, - 92, 80, -84, 100, -134, - -8, 217, -32, 3, -47, - -151, 251, -215, 142, 92, - -224, 310, -172, -275, 98, - 159, 155, -177, 112, 53, - 205, 27, 8, -240, 192, - 169, 120, -319, -201, 106, - 11, 36, -86, -237, 455, - -109, -154, -163, 174, -55, - -38, 32, -101, -78, -59, - -205, -321, -97, 69, 79, - -310, 44, 18, -185, 34, - -115, -20, -148, -39, 203, - -29, 154, -30, -158, 166, - -45, -131, -317, -24, 363, - -165, -205, -112, -222, 265, - -32, -44, -150, 54, -193, - -6, -38, -255, -169, -115, - -266, 87, -189, -36, -169, - -60, -87, -266, -436, -170, - -68, -81, -278, 24, 38, - -23, -19, -155, -256, 141, - -61, -226, -565, -175, 71, - 9, -29, -237, -515, 263}; - -static Word16 dico22_isf_36b[SIZE_BK22_36b*4] = { - - -298, -6, 95, 31, - -213, -87, -122, 261, - 4, -49, 208, 14, - -129, -110, 30, 118, - -214, 258, 110, -235, - -41, -18, -126, 120, - 103, 65, 127, -37, - 126, -36, -24, 25, - -138, -67, -278, -186, - -164, -194, -201, 78, - -211, -87, -51, -221, - -174, -79, -94, -39, - 23, -6, -157, -240, - 22, -110, -153, -68, - 148, -5, -2, -149, - -1, -135, -39, -179, - 68, 360, -117, -15, - 137, 47, -278, 146, - 136, 260, 135, 65, - 61, 116, -45, 97, - 231, 379, 87, -120, - 338, 177, -272, 3, - 266, 156, 28, -69, - 260, 84, -85, 86, - -266, 154, -256, -182, - -17, -65, -304, -6, - -40, 175, -151, -180, - -27, 27, -87, -63, - 121, 114, -166, -469, - 159, -66, -323, -231, - 214, 152, -141, -212, - 137, 36, -184, -51, - -282, -237, 40, 10, - -48, -235, -37, 251, - -54, -323, 136, 29, - -88, -174, 213, 198, - -390, 99, -63, -375, - 107, -169, -164, 424, - 69, -111, 141, -167, - 74, -129, 65, 144, - -353, -207, -205, -109, - -160, -386, -355, 98, - -176, -493, -20, -143, - -252, -432, -2, 216, - -90, -174, -168, -411, - 13, -284, -229, -160, - -87, -279, 34, -251, - -75, -263, -58, -42, - 420, 53, -211, -358, - 384, -35, -374, 396, - 68, -228, 323, -2, - 167, -307, 192, 194, - 459, 329, -5, -332, - 375, 79, -7, 313, - 282, -124, 200, -92, - 271, -162, -70, 180, - -157, -298, -514, -309, - 58, -163, -546, 18, - 124, -364, 167, -238, - 83, -411, -117, 96, - 140, -112, -388, -624, - 259, -133, -317, 41, - 163, -130, -64, -334, - 226, -165, -124, -110, - -466, -61, 6, 229, - -153, 205, -145, 242, - -159, 48, 195, 148, - -58, 28, 31, 279, - -303, 185, 279, -4, - -61, 197, 59, 86, - -114, 123, 168, -52, - 35, 36, 100, 126, - -407, 102, -77, -40, - -338, -1, -342, 156, - -179, 105, -34, -97, - -185, 84, -35, 108, - -133, 107, -91, -357, - -180, 54, -229, 24, - -44, 47, 47, -182, - -66, 13, 45, 4, - -339, 251, 64, 226, - -42, 101, -350, 275, - -99, 398, 142, 121, - 111, 12, -102, 260, - 0, 505, 260, -94, - 161, 285, -96, 224, - -4, 206, 314, 33, - 167, 139, 88, 204, - -235, 316, -60, -25, - -8, -150, -312, 201, - -36, 292, 61, -104, - -40, 174, -162, 42, - -21, 402, -29, -351, - 21, 152, -360, -93, - 57, 191, 212, -196, - 76, 158, -21, -69, - -328, -185, 331, 119, - -53, 285, 56, 337, - -107, -24, 405, 29, - -18, 137, 272, 277, - -255, 22, 173, -191, - 295, 322, 325, 302, - 21, -27, 332, -178, - 119, 13, 271, 129, - -455, -180, 116, -191, - -227, 62, -148, 524, - -176, -287, 282, -157, - -243, 13, 199, 430, - -59, -49, 115, -365, - 72, -172, -137, 93, - -138, -126, 141, -84, - 5, -124, 38, -20, - -258, 311, 601, 213, - 94, 130, -61, 502, - -1, -157, 485, 313, - 146, -74, 158, 345, - 276, 135, 280, -57, - 490, 252, 99, 43, - 267, -74, 429, 105, - 278, -23, 119, 94, - -542, 488, 257, -115, - -84, -244, -438, 478, - -113, -545, 387, 101, - -95, -306, 111, 498, - 95, 166, 22, -301, - 420, -15, -58, -78, - 270, 29, 122, -282, - 160, -240, 50, -38}; - -static Word16 dico23_isf_36b[SIZE_BK23_36b*7] = { - - 81, -18, 68, -27, -122, -280, -4, - 45, -177, 209, -30, -136, -74, 131, - -44, 101, -75, -88, -48, -137, -54, - -245, -28, 63, -18, -112, -103, 58, - -79, -6, 220, -65, 114, -35, -50, - 109, -65, 143, -114, 129, 76, 125, - 166, 90, -61, -242, 186, -74, -43, - -46, -92, 49, -227, 24, -155, 39, - 67, 85, 99, -42, 53, -184, -281, - 142, -122, 0, 21, -142, -15, -17, - 223, 92, -21, -48, -82, -14, -167, - 51, -37, -243, -30, -90, 18, -56, - 54, 105, 74, 86, 69, 13, -101, - 196, 72, -89, 43, 65, 19, 39, - 121, 34, 131, -82, 25, 213, -156, - 101, -102, -136, -21, 57, 214, 22, - 36, -124, 205, 204, 58, -156, -83, - 83, -117, 137, 137, 85, 116, 44, - -92, -148, -68, 11, -102, -197, -220, - -76, -185, -58, 132, -26, -183, 85, - -7, -31, -2, 23, 205, -151, 10, - -27, -37, -5, -18, 292, 131, 1, - 117, -168, 9, -93, 80, -59, -125, - -182, -244, 98, -24, 135, -22, 94, - 221, 97, 106, 42, 43, -160, 83, - 25, -64, -21, 6, 14, -15, 154, - 126, 15, -140, 150, -10, -207, -114, - 79, -63, -211, -70, -28, -217, 165, - 46, 38, -22, 281, 132, -62, 109, - 112, 54, -112, -93, 208, 27, 296, - 115, 10, -147, 41, 216, 42, -276, - 50, -115, -254, 167, 117, -2, 61, - 17, 144, 34, -72, -186, -150, 272, - -29, -66, -89, -95, -149, 129, 251, - 122, 0, -50, -234, -91, 36, 26, - -105, -102, -88, -121, -236, -7, -11, - -204, 109, 5, -191, 105, -15, 163, - -80, 32, -24, -209, 41, 294, 70, - -106, -94, -204, -118, 120, -50, -37, - -82, -241, 46, -131, -29, 150, -55, - 33, 155, 120, -89, -8, 7, 62, - 213, 82, 61, 18, -161, 144, 152, - 30, 131, 65, -87, -255, -17, -107, - -8, 85, -64, 51, -162, 223, -53, - -134, 261, 69, -56, 218, 72, -111, - 2, 155, -113, -87, 49, 85, -28, - -163, 42, -1, -196, 7, 39, -245, - 14, -137, -79, 11, -160, 202, -293, - -94, 33, 208, 100, 56, -44, 326, - -78, -41, 232, 13, -142, 227, 80, - -16, -87, 201, 33, -133, 15, -183, - -58, -192, -47, 184, -128, 133, 99, - -205, 11, -155, 78, 52, 72, 141, - -246, 26, 99, 151, 59, 115, -64, - -79, -47, -16, -14, 6, 47, -43, - -72, -178, -27, 162, 112, 43, -174, - -175, 238, 186, 71, -54, -188, -76, - -225, 233, 39, -39, -158, 122, 44, - -26, 43, 84, 130, -93, -51, 22, - 3, 92, -150, 136, -182, -57, 97, - -131, 179, -78, 80, 91, -165, 90, - -2, 148, 15, 130, 65, 175, 117, - -138, 114, -137, 132, 3, -10, -186, - 140, -4, -37, 254, -62, 92, -109}; - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*-------------------------------------------------------------------* + * qpisf_2s.h + *-------------------------------------------------------------------* + * Quantization tables for two-stage of ISFs (split by 2 in 1st stage) + * Version whith prediction MU = 0.25 + *-------------------------------------------------------------------*/ + +#define ORDER 16 /* order of linear prediction filter */ +#define ISF_GAP 128 /* 50 Hz */ +#define N_SURV 4 + +#define SIZE_BK1 256 +#define SIZE_BK2 256 +#define SIZE_BK21 64 +#define SIZE_BK22 128 +#define SIZE_BK23 128 +#define SIZE_BK24 32 +#define SIZE_BK25 32 + +#define SIZE_BK21_36b 128 +#define SIZE_BK22_36b 128 +#define SIZE_BK23_36b 64 + +/* means of ISFs */ +static Word16 mean_isf[ORDER] = { + + 738, 1326, 2336, 3578, 4596, 5662, 6711, 7730, + 8750, 9753, 10705, 11728, 12833, 13971, 15043, 4037}; + +/* 46 bits */ +/*-------------------------------------------------------------------* + * isf codebooks: two-stage VQ with split-by-5 in 2nd stage * + * * + * codebook vector dimension number of vectors * + * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ * + * 1_1 9 256 * + * 1_2 7 256 * + * 2_1 3 64 * + * 2_2 3 128 * + * 2_3 3 128 * + * 2_4 3 32 * + * 2_5 4 32 * + *-------------------------------------------------------------------*/ + +/*------------------------------------------------* + * 1st stage codebook; 1st split: isf0 to isf8 + *------------------------------------------------*/ + +static Word16 dico1_isf[SIZE_BK1*9] = { + + 579, 1081, 1035, 390, 3, -263, -198, -82, 38, + 18, -68, -12, 313, 761, 405, 249, 111, -76, + 740, 1263, 1292, 1006, 997, 1019, 1017, 976, 923, + -91, 827, 948, 648, 613, 535, 522, 490, 421, + 41, -44, -281, -472, 652, 534, 193, 135, -90, + 41, -121, -356, -60, 663, 307, 61, -48, -344, + 557, 946, 1049, 867, 846, 990, 1112, 1262, 1241, + -118, -204, 328, 512, 870, 793, 610, 402, 186, + 156, 293, 74, -338, -475, -897, -594, -161, -497, + 226, 131, -138, 307, 169, -271, -164, -387, -624, + 62, -32, -61, -252, -541, -828, -1027, -523, -662, + 102, -61, 141, 112, -270, -251, -541, 25, -150, + 6, -132, -356, -686, -96, -322, -522, -31, -326, + -36, -209, -521, -229, 307, -132, -5, -99, -384, + 60, -51, -237, -668, -973, -407, -708, -75, -172, + 26, -138, -266, 111, -302, 43, -278, -356, -359, + 570, 822, 496, -154, -312, -92, 137, 279, 371, + -146, 368, 409, 68, 6, 77, 167, 202, 162, + 633, 898, 996, 756, 662, 683, 783, 909, 996, + -103, 294, 607, 415, 483, 462, 480, 431, 408, + -120, -338, -612, -524, 584, 331, 92, 433, 276, + -178, -293, -154, -41, 269, 100, -9, 213, 160, + 830, 736, 278, 820, 1254, 686, 712, 1039, 473, + -218, -304, 463, 454, 397, 273, 202, 286, 273, + -232, 7, 6, -388, -472, -427, -378, -167, -100, + -294, -183, 134, -47, 101, -88, -84, -117, -3, + 57, 17, -202, -634, -989, -1119, -533, 176, -36, + 120, -28, 23, 111, -319, 318, -22, -77, 266, + -271, -464, -434, -658, -640, -385, -385, -99, -69, + -198, -259, -266, -44, -39, -139, -137, 171, 66, + 9, -145, -377, -846, -1000, -111, -325, 342, 135, + -81, -286, -380, 192, -57, 307, 76, -24, -140, + 677, 702, 247, 56, 249, 141, -105, -236, -99, + 36, -39, -69, 348, 198, -93, 322, 91, -72, + 503, 885, 1508, 1307, 1282, 1172, 1119, 1209, 1061, + 416, 719, 989, 1227, 1001, 1052, 954, 741, 1044, + -127, -376, -657, 139, 623, 223, 501, 306, 220, + -113, -384, -796, 504, 438, 85, 213, -83, -194, + 585, 1132, 1233, 1091, 1247, 1433, 1512, 1448, 1314, + -174, -422, 7, 1155, 1089, 1182, 1003, 945, 806, + 8, -126, -317, -103, -351, -695, -98, -268, -537, + 33, -103, -290, 167, -39, -407, 44, -208, -375, + 104, -23, -64, -291, -637, -851, -1084, -61, -112, + -75, -306, -434, 218, -148, -354, -680, -133, -216, + -121, -377, -718, -97, -130, -361, -156, -379, -599, + -56, -254, -586, 235, 157, -214, 11, -260, -149, + -124, -267, -397, -580, -593, -527, -805, -385, 346, + -193, -440, -708, -351, -141, -255, -499, -147, -185, + 448, 660, 494, 208, 509, 461, 338, 291, 149, + -223, 88, 335, 159, 212, 191, 286, 308, 205, + -31, 469, 803, 659, 619, 658, 843, 987, 1113, + -171, -242, 514, 362, 295, 524, 552, 694, 585, + -64, -308, -448, -21, 284, 786, 446, 289, 92, + -218, -390, -7, 169, 206, 330, 352, 408, 358, + -36, 702, 959, 859, 861, 1115, 1269, 1357, 1305, + -133, -341, -65, 678, 417, 440, 486, 518, 780, + 33, -44, -191, -344, -461, -755, -201, 217, -31, + -353, -547, -44, 123, -61, -68, -79, 29, 60, + 73, -57, -406, -766, -1243, -1203, 240, 400, 165, + -73, -282, -601, -213, -171, -375, 332, 35, -103, + -29, -207, -553, -476, -638, -908, 172, -22, -135, + -192, -239, -164, -103, -111, -47, 153, 125, 110, + -1, -203, -570, -1030, -1424, -535, 155, 1, 147, + -333, -653, -865, -197, -158, -21, -44, 95, 108, + 389, 588, 490, 33, -237, -524, -628, -136, -260, + 40, -177, -462, 453, 862, 380, 131, -130, -405, + 842, 1678, 1841, 1549, 1474, 1256, 1082, 905, 742, + 370, 1216, 1768, 1633, 1212, 636, 22, -330, 71, + -76, -281, -741, -742, 898, 619, 277, 71, -222, + -32, -265, -556, -25, 994, 682, 305, 126, -165, + 73, 738, 893, 968, 993, 1768, 2273, 1840, 1391, + -69, -349, -585, 234, 1158, 903, 626, 510, 251, + -1, -99, -272, -210, -603, -351, -540, -811, -383, + -16, -230, -504, 410, 149, -205, -343, -651, -639, + 103, -9, -227, -205, -562, -781, -1079, -1208, -156, + 143, 63, -135, -67, -317, -602, -784, -1154, -640, + -144, -391, -674, -622, -200, -254, -660, -947, -395, + -40, -250, -625, 27, 543, 94, -131, -386, -673, + -123, -371, -757, -451, -564, -614, -415, -711, -35, + -116, -309, -593, -268, 239, -33, -338, -650, -135, + 94, 251, 554, 57, -312, -423, -154, -57, 235, + -268, -71, 381, 114, -44, -87, 125, 173, 133, + 1513, 1714, 1238, 534, 276, 315, 461, 459, 508, + -131, -19, 1149, 670, 486, 356, 309, 369, 296, + -223, -501, -899, -722, -70, 6, 131, 310, 394, + -99, -303, -517, 249, 64, -53, 135, -11, 453, + -147, -399, -730, -401, 817, 738, 802, 749, 575, + -154, -435, -739, 800, 593, 366, 529, 318, 326, + -224, 45, -39, -387, -515, -518, -608, -384, -321, + -315, -377, 143, -101, -113, -377, -177, -144, -12, + 117, 40, -239, -651, -1051, -581, -737, -990, -328, + 26, -50, -157, -23, -453, -283, -531, -546, 192, + -252, -501, -743, -589, -627, -499, -328, -118, -72, + -324, -494, -244, -306, -144, -177, -262, -135, -78, + -36, -234, -519, -961, -1290, -314, -479, -371, -45, + -95, -292, -535, -8, -300, 112, -164, -277, 198, + -99, -128, 880, 836, 579, 351, 23, -95, -217, + -27, -258, 124, 1011, 597, 425, 144, 7, -73, + 421, 1293, 1640, 1623, 1742, 1617, 1499, 1284, 1006, + -95, 752, 1680, 1569, 1618, 1436, 1200, 980, 712, + -69, -300, -683, -435, 1132, 899, 504, 332, 109, + -74, -323, -637, 563, 1074, 608, 371, 105, -49, + -78, 831, 1194, 1110, 1378, 1481, 1492, 1365, 1217, + -259, -121, 1440, 1334, 1628, 1490, 1438, 1223, 933, + -82, -306, -613, -222, -378, -675, -545, -671, -845, + 53, -124, -347, 422, 52, -125, -270, -529, 9, + 79, -89, -320, -662, -999, -1199, -1243, -676, -297, + -68, -273, -611, 137, -146, -397, -627, -845, -220, + -112, -346, -797, -826, 234, -132, -188, -278, -522, + -159, -405, -734, -419, 293, 74, -167, -167, 184, + -153, -437, -833, -1080, -336, -472, -561, -340, -253, + -169, -423, -820, -904, -131, -19, -346, -604, 31, + 33, -31, 312, 62, -148, 49, -59, 564, 486, + -306, -333, 194, -44, 67, 72, 147, 205, 243, + -207, -49, 1360, 983, 969, 991, 1014, 1110, 973, + -211, -172, 883, 627, 711, 674, 705, 798, 746, + -88, -325, -763, -974, 687, 908, 514, 382, 172, + -292, -612, -805, 63, 131, 270, 259, 352, 348, + -235, -84, 955, 818, 1120, 1289, 1559, 1480, 1285, + -180, -461, -614, 657, 691, 745, 854, 783, 713, + -97, -309, -477, -614, -777, -734, -768, -526, -472, + -344, -476, -35, -169, 49, -77, -150, -240, -141, + -52, -268, -639, -919, -1278, -1113, -342, -333, -151, + -68, -242, -585, -73, -209, -478, -159, -429, 133, + -197, -499, -1005, -1268, -272, -224, -105, -67, 17, + -363, -618, -414, -116, -62, 20, 10, 116, 108, + -195, -475, -906, -1260, -891, -441, -277, -142, -28, + -226, -519, -950, -700, -275, -266, -116, -105, 82, + 404, 511, 520, 327, 17, -194, -333, -536, -586, + -114, -130, 276, 237, 204, 342, 135, -16, -111, + 670, 1208, 1168, 860, 742, 601, 528, 403, 309, + 397, 621, 966, 752, 579, 398, 400, 329, 252, + 191, 180, -137, -467, 272, 106, -95, 17, -192, + -80, -290, -626, 194, 598, 196, 21, -281, 77, + 510, 864, 1108, 807, 939, 902, 925, 717, 481, + 137, 367, 534, 764, 670, 382, 296, 153, 84, + 303, 497, 144, -85, -125, -539, -482, -464, -764, + 233, 347, 68, -147, 169, -210, -242, -226, -482, + 307, 422, 154, -175, -386, -722, -724, -904, -1015, + 309, 308, 160, -60, -470, -420, -598, -791, -219, + 68, 121, -137, -560, -146, -446, -515, -494, -729, + 130, 53, -227, 46, 474, 32, -161, -192, -490, + 213, 164, -71, -465, -876, -161, -456, -587, -48, + 218, 117, 39, 177, -194, -88, -226, -418, 50, + 210, 547, 569, 279, 121, -44, -50, 10, -84, + 58, 140, 182, -5, 267, 117, 106, 211, 198, + 539, 835, 913, 719, 617, 544, 591, 565, 642, + 153, 559, 872, 460, 222, 108, 188, 180, 183, + 158, 119, 284, -153, -271, 229, 87, 110, -57, + -183, 82, 118, 21, 13, 40, 118, 191, 185, + 162, 889, 654, 108, -34, 244, 488, 561, 532, + 163, 56, 609, 341, 50, 329, 68, 266, 218, + 100, 206, 18, -304, -107, -436, -487, -65, -306, + -86, 154, 134, -30, -45, -73, -104, -80, -96, + 245, 330, 10, -440, -849, -1082, 79, 40, -265, + 196, 372, 272, -181, -493, -389, 275, 80, -59, + 2, -12, -246, -505, -100, -436, 21, -187, -431, + -221, -48, 36, -271, -186, -147, -109, 26, 71, + 213, 140, 72, -351, -620, -84, -363, 69, 46, + 91, 167, -3, -95, -99, -105, -48, 114, 147, + 259, 249, 172, 607, 406, 52, 59, -189, -320, + 115, -85, -54, 574, 128, 226, -59, -253, 130, + -62, 1033, 1308, 1035, 1127, 1098, 1029, 961, 823, + 39, 364, 757, 940, 728, 660, 659, 583, 770, + -115, -338, -760, -471, 394, 37, 441, 178, 6, + -57, -305, -525, 796, 453, 188, -4, -114, 248, + 71, 444, 797, 731, 1096, 1157, 1222, 1029, 811, + 135, 359, 551, 425, 749, 815, 874, 704, 502, + 132, 247, 0, -206, -449, -750, -258, -514, -633, + 248, 249, 91, 121, -195, -499, -90, -282, -435, + 78, 20, -277, -623, -983, -1224, -415, -458, -639, + 347, 509, 208, -179, -464, -728, -76, -237, -486, + -103, -343, -756, -713, -265, -609, -191, -398, -636, + -121, -383, -749, 567, 252, -36, -354, -417, -50, + 204, 100, -149, -650, -1081, -47, -7, -263, 111, + -46, -180, -267, -324, -562, -394, -692, 398, 292, + 482, 670, 683, 624, 442, 165, 116, 36, -149, + 108, 247, 291, 247, 355, 122, 109, 224, 296, + -14, 945, 990, 801, 755, 815, 847, 913, 892, + 292, 349, 725, 482, 388, 329, 429, 620, 667, + -34, 197, 213, -127, 84, 494, 620, 575, 375, + 126, 207, 172, 167, 362, 202, 296, 395, 455, + -6, 250, 539, 467, 636, 801, 1149, 1287, 1118, + 27, 240, 369, 280, 440, 411, 634, 892, 953, + 159, 170, -58, -395, -797, -690, 77, -211, -334, + -5, -28, -13, -74, -335, -603, 300, 88, -205, + 82, -33, -364, -698, -1203, -1153, 110, -146, -289, + 113, 1, -243, -588, -994, -496, 414, 160, 42, + -56, -247, -440, -693, -996, -479, 11, -178, -357, + -151, -353, -327, -211, -340, 141, 65, 425, 453, + 34, -169, -455, -932, -1215, 138, 499, 256, 324, + 68, 139, -15, -547, -478, 17, 306, 502, 481, + -32, -134, 445, 129, -143, -244, -503, -507, -599, + 61, -140, -345, 496, 458, -2, 20, -227, -514, + 394, 1765, 1666, 1339, 1117, 806, 642, 479, 380, + 215, 519, 920, 1053, 1090, 791, 528, 290, 155, + -54, -233, -647, -602, 639, 294, -2, -167, -442, + -78, -315, -791, -113, 820, 403, 158, -116, -356, + 529, 1851, 2003, 1228, 622, -41, -416, 344, 819, + -105, -379, -236, 1224, 893, 749, 568, 356, 214, + -17, -199, -144, 50, -283, -247, -578, -846, -1087, + 69, -11, -381, -206, 209, -284, -387, -416, -716, + 39, -5, -145, -374, -682, -909, -1074, -1169, -1066, + 287, 226, 67, -221, -662, -171, -421, -642, -707, + -132, -348, -538, -448, -20, -4, -354, -748, -933, + 4, -75, -289, -598, 317, 52, -208, -297, -559, + -88, -264, -358, -589, -631, -248, -523, -822, -1071, + 70, -8, 54, -314, -515, 92, -146, -274, -493, + 199, 62, 391, 158, -141, 71, -219, -203, -207, + 152, 40, 329, 162, -29, 48, -149, 108, 127, + 635, 1058, 883, 492, 372, 312, 317, 274, 241, + 267, 722, 1256, 882, 625, 248, 8, -81, -60, + -58, -138, -291, -600, -12, -2, -39, 147, 117, + -107, -345, -513, 459, 76, 92, -272, 388, 262, + 362, 516, 203, -409, -716, -831, -331, 185, 209, + -117, -391, -298, 671, 292, 538, 257, 166, -38, + -102, -319, -194, -283, -573, -262, -579, -219, -444, + -235, 78, 11, -168, -101, -229, -263, -321, -123, + 70, 50, -170, -599, -996, -588, -263, -516, -455, + 394, 363, 229, -136, -538, 21, -183, -348, -201, + -124, -368, -640, -879, -847, -209, -409, -494, -515, + -127, -341, -541, -425, -510, -10, -252, -473, -291, + 84, -69, -201, -676, -868, 103, -311, -132, -320, + 5, -173, -188, -297, -628, 197, -57, 7, -11, + 49, -160, 56, 558, 111, 33, -311, -440, -463, + -1, -246, -307, 862, 453, 139, -170, -355, -232, + 279, 966, 1642, 1478, 1463, 1123, 795, 525, 339, + -197, -38, 1702, 1331, 1252, 950, 692, 504, 426, + -108, -344, -861, -1172, 444, 354, 88, -46, -220, + -53, -321, -494, 1113, 744, 364, 198, -34, -75, + 457, 955, 1177, 1214, 1427, 1457, 1345, 917, 539, + -69, 199, 897, 1140, 1343, 1183, 977, 742, 522, + 122, 44, -269, 27, -155, -562, -307, -590, -773, + 154, 42, -160, 252, -129, -305, -471, -733, -371, + 135, 185, -82, -416, -722, -913, -504, -743, -880, + 149, 214, -84, -329, -680, -835, -426, -661, -81, + -128, -380, -735, -998, -337, 17, -182, -467, -697, + -84, -290, -510, -592, 13, 440, 154, -38, -279, + 70, -61, -246, -727, -1047, -80, -381, -535, -704, + 178, -2, -146, -670, -938, 482, 138, 63, 65, + -11, 15, 772, 443, 142, -20, -209, -126, -161, + -32, -249, 95, 552, 124, 30, -343, 82, -86, + 148, 751, 1515, 1105, 867, 606, 474, 448, 399, + -163, -257, 899, 1097, 906, 751, 502, 390, 294, + -51, -258, -447, -806, -368, 763, 464, 364, 183, + -166, -374, -367, 87, 35, 399, 418, 856, 833, + -205, -310, 588, 778, 785, 1065, 1118, 1245, 1157, + -173, -312, 107, 345, 400, 790, 870, 1113, 1001, + -7, -120, -387, -410, -614, -943, -226, -384, -491, + -203, -288, -51, -331, -90, -178, -408, -573, -338, + 56, -29, -273, -627, -1041, -798, -247, -467, 148, + 66, -2, -205, -205, -575, -349, -57, -352, -58, + -45, -225, -471, -924, -497, 77, -32, 44, -135, + -277, -491, -497, -502, -424, -202, -137, 77, 96, + 26, -179, -469, -1008, -1260, 262, -35, -132, -259, + -66, -232, -447, -533, -789, -191, -100, -267, 364}; + +/*------------------------------------------------* + * 1st stage codebook; 2nd split: isf9 to isf15 + *------------------------------------------------*/ + +static Word16 dico2_isf[SIZE_BK2*7] = { + + 1357, 1313, 1136, 784, 438, 181, 145, + 636, 648, 667, 568, 442, 217, 362, + 427, 440, 674, 524, 332, 117, -417, + 121, 295, 468, 465, 230, 44, -221, + -147, -240, 149, 80, 390, 278, 106, + -418, -556, 552, 511, 235, 144, -95, + 43, 193, 274, 150, 67, 34, -273, + -43, -126, 171, 416, 282, 63, -354, + -372, -86, -344, -108, -94, -182, -89, + -600, -840, -200, 465, 258, -11, -253, + -48, 329, 97, -290, -543, -795, -354, + -570, -117, 187, 10, -133, -416, -76, + -618, -129, -247, -371, 45, -76, 277, + -1022, -1079, 126, 474, 254, 127, 52, + -281, 76, -167, -361, -283, -551, -283, + -119, -52, -1, 134, -32, -204, -415, + 1064, 827, 637, 684, 464, 209, 12, + 482, 416, 449, 371, 335, 294, 194, + 719, 576, 365, 135, 113, 91, -199, + 298, 176, 493, 366, 194, 163, 36, + -35, -236, -259, -36, -4, 99, 152, + -98, -306, -27, 228, 90, 111, -86, + 91, 13, -211, -258, -106, 86, -64, + 73, -35, -57, -31, 162, 35, -192, + -109, -335, -629, -66, -61, -128, 322, + -495, -669, -728, 193, 31, -220, 122, + 324, 95, -89, -91, -409, -710, -154, + 0, -234, 92, 33, -343, -609, -220, + -343, -408, -476, -655, -153, 82, 222, + -490, -745, -255, 49, -48, 135, -127, + 119, -67, -328, -390, -272, -545, -56, + -57, -130, -10, -7, -164, -47, -22, + 984, 1064, 961, 568, 210, -27, 16, + 811, 691, 754, 514, 224, -35, 166, + 662, 704, 618, 386, 57, -211, -257, + 510, 359, 418, 393, 91, -144, -18, + -193, -31, -27, 223, 89, -143, 24, + -112, -98, 471, 319, 185, 3, 175, + 252, 146, -47, 272, 48, -211, -234, + 146, 69, 203, 364, 68, -52, 51, + -259, -478, -697, -349, -758, -501, 63, + -501, -769, -289, 79, -311, -497, -106, + 251, 53, -235, -469, -895, -884, 145, + -416, -551, 140, -133, -523, -775, 44, + -326, -423, -713, -497, -86, -431, 99, + -757, -772, -160, -76, -46, -32, 379, + 85, -35, -200, -401, -663, -1040, -247, + -180, -330, -92, -376, 27, -183, -110, + 1279, 1086, 781, 502, 324, 164, 157, + 682, 466, 449, 277, 146, 28, 409, + 635, 472, 390, 107, -232, -538, -139, + 196, 396, 332, 213, 209, -29, -81, + 150, -95, -312, 76, -77, -320, -50, + 46, 9, 47, 175, 139, 30, 384, + 218, 206, -24, -250, -96, -276, -183, + 26, 119, 38, 14, -4, -133, -52, + -477, -614, -987, -715, -631, -813, 200, + -744, -1009, -1065, -745, -631, -171, 18, + -137, -251, -483, -613, -980, -1203, 12, + -605, -767, -562, -686, -1088, -515, 58, + -202, -428, -782, -1072, -96, -234, -179, + -480, -709, -1070, -897, -131, -92, 321, + -145, -193, -512, -729, -572, -765, -210, + -331, -585, -525, -631, -281, -208, -303, + 1165, 1104, 939, 828, 716, 426, 155, + 6, -109, 820, 778, 415, 113, -27, + 381, 339, 314, 265, 121, -9, -474, + -373, 47, 584, 442, 99, -231, -113, + -496, -38, -285, 262, 305, 170, 4, + -587, -556, 69, 66, 471, 354, 13, + -138, 70, -18, 106, 67, 167, -302, + -445, -141, 185, 191, 151, 83, -133, + -257, -521, -720, -198, 134, -46, -182, + -819, -1168, -777, 512, 359, 95, -113, + 137, -2, -74, -138, -401, -114, -371, + -242, -466, 204, 223, -31, -212, -192, + -532, -637, -466, -686, 256, 277, -139, + -1141, -1244, -381, -75, -54, 14, 88, + -311, 115, -143, -499, -343, 124, -416, + -616, -147, -135, 43, -4, 121, -369, + 835, 783, 641, 390, 355, 350, 64, + 72, 194, 443, 467, 436, 219, 372, + 464, 369, 192, 4, -156, -72, -226, + 57, 206, 303, 205, 188, 101, 265, + -40, -205, -488, -184, 276, 64, -26, + -217, -433, -297, 137, 328, 308, -289, + 378, 81, -308, -465, 57, -37, 227, + -100, 24, -36, -151, 199, 8, 143, + -426, -697, -1059, -133, 388, 161, 321, + -644, -1023, -1271, 39, 66, -123, 70, + 372, 177, -173, -556, -553, -304, -189, + -117, -369, -425, -122, -462, -152, -73, + -649, -850, -1189, -767, 497, 360, 222, + -798, -1139, -1455, -190, 430, 234, 179, + 42, -94, -405, -692, 38, -202, -246, + -169, -366, -290, -88, -64, 32, -292, + 1010, 923, 938, 710, 465, 230, 342, + 217, 300, 1054, 675, 68, -458, -179, + 78, 453, 316, 18, -237, -496, -243, + 167, 21, 424, 215, -91, -303, -170, + -290, -81, -70, -67, 40, 54, -59, + -353, -427, -90, 53, 94, 9, 54, + -28, 318, 283, 15, -240, -58, 79, + -75, -121, 229, 35, 58, 6, -133, + -351, -514, -744, -834, -705, -137, 164, + -1124, -1388, -1055, -230, -73, 40, 36, + -163, -233, -532, -785, -1170, -697, 96, + -788, -959, -246, -430, -624, -165, -8, + -856, -540, -630, -907, -337, -70, 76, + -937, -1042, -659, -733, -208, 199, -26, + -523, 78, -98, -501, -869, -890, -81, + -624, -703, -45, -348, -25, 87, -186, + 1005, 823, 546, 249, 90, -22, 207, + 298, 397, 381, 319, 200, 62, 303, + 473, 379, 133, -247, -632, -441, 75, + 284, 208, 391, 115, -25, 44, 95, + -72, 79, -95, -63, -129, -293, 203, + -164, -349, 115, 122, 69, -1, 378, + 348, 170, 99, 58, -179, -302, 188, + -190, -2, 150, 23, -51, -11, 216, + -615, -863, -1090, -1427, -802, -48, -6, + -961, -1276, -1548, -727, -58, 56, 223, + -124, -255, -561, -988, -1277, -148, -82, + -480, -660, -891, -1191, -1339, -325, 20, + -621, -917, -1296, -1350, 264, 289, 50, + -844, -1022, -1345, -1329, -293, 46, 278, + -260, -468, -829, -1176, -533, -560, -78, + -215, -484, -822, -1233, -791, 15, -138, + 1301, 1317, 1262, 1048, 716, 357, -64, + 578, 824, 925, 802, 630, 362, 102, + 470, 925, 767, 514, 327, 190, -112, + 225, 492, 495, 437, 598, 384, -45, + 43, 82, -42, 175, 519, 342, -64, + -304, -154, 159, 576, 403, 221, 327, + 214, 244, 122, -62, 312, 92, -160, + 218, 208, 310, 268, 306, 323, -199, + -285, -269, -79, -124, -143, -153, 236, + -205, -384, -426, 344, 59, -185, -184, + -272, 247, 126, -210, -518, -468, 78, + -99, -120, 502, 160, -280, -557, 304, + -423, -17, -283, -443, 215, 212, -140, + -564, -684, -228, 510, 361, 130, 323, + -428, 335, 98, -65, 36, -215, -246, + -362, 51, 364, -16, -234, 150, -165, + 914, 883, 751, 653, 676, 464, -153, + 631, 545, 535, 720, 596, 360, -81, + 783, 712, 512, 439, 341, 251, -391, + 497, 417, 249, 372, 295, 173, -193, + 128, -110, -385, 93, 39, 173, -231, + 216, -59, -253, 462, 389, 154, 69, + 455, 270, -4, -337, -49, 233, -322, + 307, 143, 53, 218, 128, 236, -156, + -37, -186, -240, -411, -110, 9, 399, + -140, -365, -628, 258, 380, 214, 277, + 131, 454, 177, -285, -520, 108, -214, + 77, -141, 201, -123, -490, -131, 60, + -14, -194, -521, -741, 273, 362, -33, + -362, -566, -287, -228, 161, 237, 317, + -269, 195, -75, -375, -204, 11, 77, + -128, -264, -156, -223, -475, 265, 27, + 1238, 1147, 916, 689, 432, 210, -280, + 800, 664, 879, 726, 411, 160, -164, + 454, 686, 536, 275, 147, 46, 111, + 303, 486, 512, 355, 241, 181, -69, + 79, 92, 29, 147, 233, 52, 17, + -171, 289, 131, 439, 271, 3, -10, + 413, 241, 144, 174, 155, -2, 14, + 58, 217, 247, 219, 149, 175, -18, + 228, -8, -240, -206, -513, -191, 202, + -96, -272, -454, 33, -300, -575, 46, + -10, -108, -246, -347, -770, -535, 9, + -326, -430, -61, -321, -704, -299, 201, + -1, -280, -603, -419, -185, 18, -36, + -516, -522, -379, -291, -181, -97, 27, + -159, -313, -525, -224, -510, -831, -197, + -292, -459, -59, -310, -562, -143, -351, + 1066, 912, 631, 389, 207, 86, -224, + 596, 512, 596, 505, 314, 122, -48, + 787, 861, 441, -93, -303, 33, -190, + 257, 469, 337, 51, 15, 298, -93, + 295, 73, -119, 25, 36, 23, 108, + -28, -3, -32, 114, 21, 185, 107, + 482, 305, 15, -279, -319, 52, 96, + 226, 46, 115, 72, -136, 133, -125, + 18, -207, -559, -590, -503, -482, 321, + -571, -789, -951, -172, -441, -538, 113, + 181, 14, -310, -641, -1001, -202, 159, + -136, -393, -433, -513, -911, -144, -22, + 72, -265, -706, -954, -159, 53, 332, + -338, -591, -852, -383, -395, 56, 44, + 43, -158, -464, -897, -631, -157, -294, + -161, -128, -328, -573, -483, -125, 11, + 1017, 906, 1051, 1005, 679, 341, -102, + 359, 334, 1567, 1314, 723, 105, 10, + -65, 726, 529, 301, 220, 43, -273, + -510, 436, 719, 566, 358, 179, 114, + -560, 298, 133, -120, 342, 225, 14, + -899, -101, 217, 617, 400, 146, -58, + -41, 352, 82, -196, 39, 121, -167, + -212, 59, 447, 284, 423, 250, -169, + -371, -484, -596, 30, -41, 249, 22, + -372, -650, -794, 477, 445, 216, -79, + -352, 275, 17, -443, -929, 92, 19, + -699, -696, 431, 264, -49, -310, 182, + -978, -217, -430, -400, 101, 261, 72, + -929, -889, -357, -13, 463, 378, 236, + -826, 56, 30, -299, -360, -128, -51, + -878, -299, -111, 75, 65, 36, 3, + 817, 368, -25, 354, 697, 591, -173, + 309, 212, 222, 751, 484, 140, -56, + 593, 379, 70, -8, 258, 180, 110, + 165, -46, 255, 297, 219, 273, 105, + 160, -70, -358, -181, 379, 330, 319, + -238, -369, -198, 740, 580, 319, -143, + 201, 109, -202, -456, 328, 276, -141, + 203, 170, 111, 42, 207, 360, 188, + -345, -399, -513, -233, 650, 422, 81, + -635, -961, -1220, 463, 539, 204, 209, + 202, -25, -194, -498, -787, 193, -143, + -449, -538, 195, -106, -331, 68, 62, + -228, -477, -840, -576, 317, 128, 283, + -671, -937, -807, -114, 391, 335, -62, + 246, 2, -314, -679, -303, 180, -88, + -107, -272, 90, -198, -28, 290, -112, + 885, 1149, 1021, 712, 496, 281, -83, + 269, 492, 787, 643, 347, 70, 124, + 336, 636, 499, 92, -229, -179, 191, + 26, 402, 564, 340, 149, -11, 135, + -440, 561, 470, 204, -72, -186, 140, + -720, 14, 355, 229, 68, -133, 465, + 110, 310, 103, 12, 106, 29, 158, + -178, 113, 161, 142, 121, 115, 27, + -651, -414, -645, -152, -164, -13, -429, + -639, -944, -681, -104, -81, 52, -189, + -663, -164, -316, -683, -954, -205, -83, + -609, -669, -172, -517, -694, 283, -80, + -646, -152, -383, -678, -246, -40, -143, + -747, -796, -745, -390, -98, 43, 275, + -599, -199, -398, -433, -436, -538, 31, + -1107, -568, -376, -265, -126, -21, 1, + 847, 573, 308, 392, 305, 101, 55, + 273, 293, 201, 267, 346, 201, 123, + 727, 480, 226, 2, -65, -138, 164, + 273, 208, 173, 292, 12, 253, 174, + 340, 207, 180, 88, 116, 46, 475, + -460, -166, -30, 13, 110, 173, 396, + 137, 88, 43, -137, -94, 34, 284, + 96, -14, 226, 40, 63, 70, 130, + -467, -735, -1012, -1174, -307, 305, -67, + -612, -920, -1146, -567, -8, 92, -25, + -182, -271, -492, -754, -857, 287, -75, + -494, -787, -689, -683, -709, 137, -326, + -288, -550, -903, -1105, 334, 321, -62, + -354, -653, -834, -445, 1, 377, -152, + -162, -306, -608, -937, -297, 247, -192, + -234, -477, -244, -488, -266, 342, -332}; + +/*---------------------------------------------------* + * 2nd stage codebook; 1st split: isf2_0 to isf2_2 + *---------------------------------------------------*/ + + +static Word16 dico21_isf[SIZE_BK21*3] = { + + 329, 409, 249, + -33, 505, 160, + -29, -14, 582, + -262, 127, 354, + 145, 237, 175, + -152, 245, 122, + 27, 42, 340, + -84, -93, 311, + 285, 222, -156, + 47, -43, -504, + 234, 121, 385, + 104, -317, 45, + 176, 195, 8, + 104, -59, -94, + 177, 53, 192, + -34, -127, 152, + 570, 277, -34, + -67, -329, -639, + -157, -272, 462, + -177, -462, 198, + 322, 179, 115, + -386, 171, 19, + 19, -12, 195, + -120, -252, 201, + 304, 36, -336, + -128, -221, -380, + 171, -185, 296, + -242, -312, 23, + 198, 39, 16, + -3, -177, -111, + 111, -93, 76, + -92, -223, 4, + 177, 406, -44, + -168, 380, -149, + -4, 273, 331, + -420, 513, 277, + 21, 247, 47, + -58, 131, -2, + -3, 134, 180, + -145, 40, 175, + 189, 74, -145, + -27, -45, -325, + 370, -114, -21, + -83, -415, -173, + 77, 95, -51, + -40, -30, -67, + 71, 88, 86, + -35, -98, 14, + 69, 197, -334, + -196, 79, -231, + -348, -137, 218, + -352, -89, -85, + 47, 201, -130, + -165, 37, -15, + -43, 3, 86, + -161, -108, 79, + 83, 21, -237, + -81, -149, -238, + 150, -186, -251, + -186, -249, -162, + -19, 66, -139, + -26, -50, -181, + 24, 11, 0, + -130, -105, -98}; + + + +/*---------------------------------------------------* + * 2nd stage codebook; 2nd split: isf2_3 to isf2_5 + *---------------------------------------------------*/ + + +static Word16 dico22_isf[SIZE_BK22*3] = { + + -127, 310, 42, + -242, 197, 5, + -151, 84, -17, + -214, 127, -149, + -247, -131, 159, + -268, -267, -95, + -217, 1, -79, + -271, -80, -185, + -45, 436, 159, + 165, 199, 391, + -33, 81, 187, + -66, -42, 355, + -298, -57, 343, + -108, -537, 226, + -144, -23, 193, + 176, -402, 87, + 53, 296, 25, + -84, 253, -104, + -58, 105, -126, + -169, 174, -314, + -48, 44, -294, + -164, -417, -242, + -139, 3, -194, + -155, -207, -211, + 119, 322, 213, + 333, 50, 380, + 237, 247, -2, + 466, -16, 201, + 238, -255, -107, + 67, -440, -149, + 122, -88, -139, + 88, -247, -73, + -41, 231, 167, + -62, 155, 16, + -65, 16, 77, + -68, -2, -63, + -151, -300, 160, + -18, -333, 54, + -56, -94, 5, + 2, -190, 14, + 92, 148, 209, + 108, 9, 272, + 108, 35, 110, + 142, -85, 145, + 47, -157, 279, + 3, -320, 246, + 43, -72, 68, + 86, -217, 135, + 36, 140, 79, + 56, 175, -49, + 26, 45, 3, + 73, 55, -101, + 109, -183, -242, + -4, -283, -242, + 48, -68, -48, + -6, -153, -122, + 161, 196, 96, + 232, 80, 190, + 165, 97, 11, + 258, -31, 71, + 267, -77, -91, + 311, -209, 87, + 152, -14, -22, + 150, -149, 9, + -324, 557, 187, + -384, 307, 46, + -251, 27, 77, + -365, 77, -52, + -482, -84, 160, + -424, -515, -64, + -294, -120, -4, + -476, -116, -109, + -97, 318, 365, + 106, 627, 445, + -190, 120, 287, + -146, 65, 619, + -427, 242, 363, + -361, -371, 432, + -347, 102, 168, + -629, 195, -14, + -65, 476, -47, + -297, 320, -168, + -55, 356, -264, + -391, 82, -286, + -51, -31, -556, + -178, -399, -586, + -205, -49, -360, + -343, -238, -337, + 220, 457, 58, + 561, 467, 259, + 340, 270, -168, + 450, 77, -280, + 60, 167, -413, + 133, -252, -492, + 216, 157, -290, + 282, 0, -495, + -226, 293, 183, + -157, 135, 122, + -158, -59, 39, + -133, -118, -97, + -332, -309, 113, + -160, -425, -6, + -149, -211, 24, + -80, -277, -90, + -11, 125, 338, + 130, -71, 465, + 5, -45, 184, + 237, -95, 253, + -139, -197, 297, + -19, -300, 511, + -63, -152, 139, + 250, -289, 336, + 124, 339, -150, + 34, 176, -208, + 171, 166, -116, + 94, 38, -229, + 75, -65, -339, + -78, -205, -385, + 0, -30, -163, + -56, -110, -242, + 321, 244, 194, + 505, 238, -1, + 317, 116, 65, + 309, 88, -74, + 452, -51, -50, + 334, -217, -290, + 211, 41, -152, + 238, -55, -260}; + + +/*---------------------------------------------------* + * 2nd stage codebook; 3rd split: isf2_6 to isf2_8 + *---------------------------------------------------*/ + + +static Word16 dico23_isf[SIZE_BK23*3] = { + + -10, 151, 359, + 136, 298, 223, + 255, -104, 290, + 423, 6, 183, + -270, -269, -98, + -52, -82, 13, + -82, -274, -97, + 90, -246, -72, + -299, -70, 421, + -88, 365, 430, + 187, -318, 381, + 380, 37, 488, + -373, -316, 79, + -308, -101, 5, + -135, -451, 8, + 72, -421, -154, + 180, 170, -121, + 62, 177, -40, + 326, 80, -105, + 248, 263, -5, + -168, -181, -221, + -2, -23, -158, + -14, -149, -121, + 119, -91, -147, + 119, 332, -153, + 49, 303, 34, + 442, -55, -69, + 217, 454, 58, + -359, -187, -375, + -42, 50, -274, + -8, -267, -249, + 85, -86, -346, + -77, -40, 345, + 89, 134, 219, + 156, -80, 160, + 108, 40, 116, + -158, -206, 29, + 5, -32, 175, + -65, -158, 146, + 55, -78, 73, + -114, -222, 353, + -47, 81, 211, + 49, -151, 268, + 105, 4, 302, + -263, -132, 183, + -151, -28, 201, + -177, -307, 166, + 101, -221, 130, + 74, 58, -98, + 32, 44, 13, + 194, 30, -142, + 170, 96, 8, + -136, -119, -91, + -65, 8, -55, + 3, -188, 12, + 45, -63, -49, + 149, -21, -19, + 24, 144, 95, + 254, -22, 60, + 161, 196, 96, + -158, -61, 48, + -70, 33, 82, + -23, -321, 58, + 155, -147, 5, + -364, 328, 77, + -21, 453, 173, + -108, 82, 630, + 367, 263, 208, + -300, -62, -176, + -205, 143, -158, + -169, -410, -264, + 257, -269, -100, + -636, 289, -2, + -292, 627, 173, + -382, -363, 387, + 248, 524, 447, + -521, -111, -107, + -395, 118, -274, + -343, -680, -125, + -172, -447, -663, + 75, 148, -367, + -79, 263, -94, + 249, 148, -286, + 380, 271, -162, + -142, -4, -186, + -57, 111, -125, + -35, -108, -254, + 100, 29, -242, + -80, 303, -264, + -78, 464, -57, + 248, -22, -494, + 661, 662, 44, + -193, -40, -330, + -178, 145, -337, + -90, -199, -400, + -40, -23, -498, + -192, 114, 315, + -41, 244, 190, + 88, -97, 485, + 241, 80, 212, + -246, 40, 87, + -156, 147, 134, + -2, -334, 239, + 308, -203, 110, + -459, 251, 422, + -218, 310, 228, + -86, -346, 654, + 184, 175, 425, + -481, -63, 169, + -349, 117, 188, + -125, -560, 310, + 158, -416, 94, + 46, 171, -192, + -63, 157, 14, + 256, -35, -271, + 322, 123, 53, + -214, 4, -76, + -156, 86, -18, + 128, -197, -232, + 265, -90, -98, + -308, 332, -145, + -131, 308, 58, + 509, 59, -339, + 562, 196, -14, + -378, 100, -47, + -234, 202, 1, + 104, -270, -493, + 319, -210, -325}; + + +/*---------------------------------------------------* + * 2nd stage codebook; 4th split: isf2_9 to isf2_11 + *---------------------------------------------------*/ + +static Word16 dico24_isf[SIZE_BK24*3] = { + + -79, -89, -4, + -171, 77, -211, + 160, -193, 98, + 120, -103, 323, + 32, -22, -129, + 72, 78, -268, + 182, -76, -66, + 309, 99, -145, + -229, -157, -84, + -383, 98, -71, + -90, -352, 12, + -284, -178, 178, + -65, -125, -166, + -87, -175, -351, + 42, -198, -48, + 154, -140, -243, + -77, 18, 108, + -39, 355, 91, + 87, 8, 155, + -4, 158, 239, + 128, 95, -54, + 7, 246, -124, + 258, 15, 89, + 206, 216, 98, + -201, 9, 18, + -312, 233, 204, + -39, -174, 155, + -144, -9, 284, + -57, 70, -69, + -157, 187, 18, + 54, -30, 23, + 24, 135, 55}; + + +/*---------------------------------------------------* + * 2nd stage codebook; 5th split: isf2_12 to isf2_15 + *---------------------------------------------------*/ + +static Word16 dico25_isf[SIZE_BK25*4] = { + + 169, 142, -119, 115, + 206, -20, 94, 226, + -106, 313, -21, 16, + -62, 161, 71, 255, + -89, 101, -185, 125, + 72, -30, -201, 344, + -258, 33, -8, 81, + -104, -154, 72, 296, + 144, -68, -268, -25, + 81, -78, -87, 106, + 22, 155, -186, -119, + -46, -28, 27, 91, + -114, -37, -175, -33, + -94, -222, -189, 122, + -132, -119, -191, -270, + -172, -173, 18, -43, + 279, 135, -42, -128, + 187, -86, 229, -138, + 159, 240, 140, 46, + 69, 25, 227, 77, + 21, 115, 13, 8, + 68, -248, 126, 81, + -150, 137, 207, -9, + -154, -133, 289, 67, + 143, -37, -86, -326, + 180, -32, 19, -23, + 26, 168, 116, -233, + -32, -26, 118, -78, + 3, -8, -45, -115, + 57, -215, -54, -83, + -209, 112, -22, -167, + -91, -151, 168, -262}; + + + + /* 36 bit */ +/*-------------------------------------------------------------------* + * isf codebooks: two-stage VQ with split-by-3 in 2nd stage * + * 1st stage is kept the same as the 46 bit quantizer * + * * + * codebook vector dimension number of vectors * + * ~~~~~~~~ ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ * + * 1_1 9 256 * + * 1_2 7 256 * + * 2_1 5 128 * + * 2_2 4 128 * + * 2_3 7 64 * + *-------------------------------------------------------------------*/ + +static Word16 dico21_isf_36b[SIZE_BK21_36b*5] = { + + -52, -96, 212, 315, -73, + 82, -204, 363, 136, -197, + -126, -331, 183, 218, 143, + -49, -41, 557, 230, 72, + 2, -73, 163, 377, 221, + 133, 111, 278, 215, -110, + -102, -20, 284, 113, 273, + 84, 319, 290, 18, 85, + -25, -5, 125, 132, -204, + -38, -5, 286, -9, -356, + -140, -256, 92, 117, -189, + -144, 191, 313, 51, -98, + 167, -10, 44, 247, 36, + 381, 197, 238, 74, 6, + 38, -408, 29, -3, -85, + 92, 266, 157, -25, -200, + 161, -121, 70, 84, -140, + -16, -86, 112, -94, -189, + -269, -270, 351, 107, -24, + -68, -67, 492, -103, -155, + -53, -131, 62, 122, 10, + 135, 84, 283, -55, -120, + -12, -219, 331, -81, 167, + 220, -136, 147, -172, -42, + 140, -95, -109, -88, -194, + 0, -2, -4, -33, -381, + -66, -217, 152, -186, -402, + 244, 108, 156, -140, -395, + 113, -136, -196, 110, -24, + 214, 118, 11, -64, -131, + -110, -286, -6, -332, 16, + 94, 97, 79, -291, -205, + -5, -39, -20, 252, -96, + 76, 174, 101, 163, 61, + -69, -239, -55, 399, 6, + -115, 319, 164, 275, 196, + -15, 36, -47, 331, 121, + 226, 209, 271, 325, 184, + 13, -80, -218, 471, 353, + 288, 378, 16, -51, 251, + 174, 116, 52, 149, -279, + 235, 276, 39, 120, -48, + 0, -108, -108, 241, -339, + -93, 534, 45, 33, -87, + 194, 149, -71, 405, -44, + 409, 370, 81, -186, -154, + 25, -102, -448, 124, -173, + 22, 408, -110, -310, -214, + -26, 23, -83, 114, 14, + -110, 164, 52, 223, -82, + 37, -25, -263, 306, -15, + -466, 415, 292, 165, -18, + 29, -19, -171, 155, 182, + 179, 144, -27, 231, 258, + -103, -247, -396, 238, 113, + 375, -154, -109, -4, 156, + 98, 85, -292, -5, -124, + 116, 139, -116, -98, -294, + -14, -83, -278, -117, -378, + 106, 33, -106, -344, -484, + 119, 17, -412, 138, 166, + 384, 101, -204, 88, -156, + -121, -284, -300, -1, -166, + 280, 33, -152, -313, -81, + -37, 22, 229, 153, 37, + -60, -83, 236, -8, -41, + -169, -228, 126, -20, 363, + -235, 17, 364, -156, 156, + -25, -30, 72, 144, 156, + 153, -26, 256, 97, 144, + -21, -37, 48, -65, 250, + 63, 77, 273, -128, 124, + -129, -26, 40, 9, -115, + -6, 82, 38, -90, -182, + -336, -13, 28, 158, 91, + -30, 241, 137, -170, -17, + 146, 14, -11, 33, 61, + 192, 197, 54, -84, 85, + 23, -200, -78, -29, 140, + 122, 237, 106, -341, 136, + -57, -142, -85, -16, -74, + -59, -90, -8, -187, -20, + -211, -267, 216, -179, -110, + -50, -7, 220, -267, -70, + -57, -42, -17, -15, 71, + 32, 21, 63, -137, 33, + -137, -175, 104, -68, 97, + -67, -43, 133, -301, 221, + -116, -200, -81, -92, -272, + -64, -41, -54, -244, -220, + -287, -242, -50, -87, -89, + -245, 236, 102, -166, -295, + 66, 24, -162, -71, 95, + 66, 136, -90, -220, -36, + -98, -161, -222, -188, 29, + -18, 18, -19, -415, 9, + 49, 61, 100, 39, -56, + -111, 82, 135, -31, 52, + -90, -153, -93, 189, 182, + -214, 295, 119, -74, 284, + 2, 137, 37, 47, 182, + 92, 117, 184, -53, 373, + -21, -14, -35, 136, 391, + 146, 129, -164, -28, 333, + 92, 80, -84, 100, -134, + -8, 217, -32, 3, -47, + -151, 251, -215, 142, 92, + -224, 310, -172, -275, 98, + 159, 155, -177, 112, 53, + 205, 27, 8, -240, 192, + 169, 120, -319, -201, 106, + 11, 36, -86, -237, 455, + -109, -154, -163, 174, -55, + -38, 32, -101, -78, -59, + -205, -321, -97, 69, 79, + -310, 44, 18, -185, 34, + -115, -20, -148, -39, 203, + -29, 154, -30, -158, 166, + -45, -131, -317, -24, 363, + -165, -205, -112, -222, 265, + -32, -44, -150, 54, -193, + -6, -38, -255, -169, -115, + -266, 87, -189, -36, -169, + -60, -87, -266, -436, -170, + -68, -81, -278, 24, 38, + -23, -19, -155, -256, 141, + -61, -226, -565, -175, 71, + 9, -29, -237, -515, 263}; + +static Word16 dico22_isf_36b[SIZE_BK22_36b*4] = { + + -298, -6, 95, 31, + -213, -87, -122, 261, + 4, -49, 208, 14, + -129, -110, 30, 118, + -214, 258, 110, -235, + -41, -18, -126, 120, + 103, 65, 127, -37, + 126, -36, -24, 25, + -138, -67, -278, -186, + -164, -194, -201, 78, + -211, -87, -51, -221, + -174, -79, -94, -39, + 23, -6, -157, -240, + 22, -110, -153, -68, + 148, -5, -2, -149, + -1, -135, -39, -179, + 68, 360, -117, -15, + 137, 47, -278, 146, + 136, 260, 135, 65, + 61, 116, -45, 97, + 231, 379, 87, -120, + 338, 177, -272, 3, + 266, 156, 28, -69, + 260, 84, -85, 86, + -266, 154, -256, -182, + -17, -65, -304, -6, + -40, 175, -151, -180, + -27, 27, -87, -63, + 121, 114, -166, -469, + 159, -66, -323, -231, + 214, 152, -141, -212, + 137, 36, -184, -51, + -282, -237, 40, 10, + -48, -235, -37, 251, + -54, -323, 136, 29, + -88, -174, 213, 198, + -390, 99, -63, -375, + 107, -169, -164, 424, + 69, -111, 141, -167, + 74, -129, 65, 144, + -353, -207, -205, -109, + -160, -386, -355, 98, + -176, -493, -20, -143, + -252, -432, -2, 216, + -90, -174, -168, -411, + 13, -284, -229, -160, + -87, -279, 34, -251, + -75, -263, -58, -42, + 420, 53, -211, -358, + 384, -35, -374, 396, + 68, -228, 323, -2, + 167, -307, 192, 194, + 459, 329, -5, -332, + 375, 79, -7, 313, + 282, -124, 200, -92, + 271, -162, -70, 180, + -157, -298, -514, -309, + 58, -163, -546, 18, + 124, -364, 167, -238, + 83, -411, -117, 96, + 140, -112, -388, -624, + 259, -133, -317, 41, + 163, -130, -64, -334, + 226, -165, -124, -110, + -466, -61, 6, 229, + -153, 205, -145, 242, + -159, 48, 195, 148, + -58, 28, 31, 279, + -303, 185, 279, -4, + -61, 197, 59, 86, + -114, 123, 168, -52, + 35, 36, 100, 126, + -407, 102, -77, -40, + -338, -1, -342, 156, + -179, 105, -34, -97, + -185, 84, -35, 108, + -133, 107, -91, -357, + -180, 54, -229, 24, + -44, 47, 47, -182, + -66, 13, 45, 4, + -339, 251, 64, 226, + -42, 101, -350, 275, + -99, 398, 142, 121, + 111, 12, -102, 260, + 0, 505, 260, -94, + 161, 285, -96, 224, + -4, 206, 314, 33, + 167, 139, 88, 204, + -235, 316, -60, -25, + -8, -150, -312, 201, + -36, 292, 61, -104, + -40, 174, -162, 42, + -21, 402, -29, -351, + 21, 152, -360, -93, + 57, 191, 212, -196, + 76, 158, -21, -69, + -328, -185, 331, 119, + -53, 285, 56, 337, + -107, -24, 405, 29, + -18, 137, 272, 277, + -255, 22, 173, -191, + 295, 322, 325, 302, + 21, -27, 332, -178, + 119, 13, 271, 129, + -455, -180, 116, -191, + -227, 62, -148, 524, + -176, -287, 282, -157, + -243, 13, 199, 430, + -59, -49, 115, -365, + 72, -172, -137, 93, + -138, -126, 141, -84, + 5, -124, 38, -20, + -258, 311, 601, 213, + 94, 130, -61, 502, + -1, -157, 485, 313, + 146, -74, 158, 345, + 276, 135, 280, -57, + 490, 252, 99, 43, + 267, -74, 429, 105, + 278, -23, 119, 94, + -542, 488, 257, -115, + -84, -244, -438, 478, + -113, -545, 387, 101, + -95, -306, 111, 498, + 95, 166, 22, -301, + 420, -15, -58, -78, + 270, 29, 122, -282, + 160, -240, 50, -38}; + +static Word16 dico23_isf_36b[SIZE_BK23_36b*7] = { + + 81, -18, 68, -27, -122, -280, -4, + 45, -177, 209, -30, -136, -74, 131, + -44, 101, -75, -88, -48, -137, -54, + -245, -28, 63, -18, -112, -103, 58, + -79, -6, 220, -65, 114, -35, -50, + 109, -65, 143, -114, 129, 76, 125, + 166, 90, -61, -242, 186, -74, -43, + -46, -92, 49, -227, 24, -155, 39, + 67, 85, 99, -42, 53, -184, -281, + 142, -122, 0, 21, -142, -15, -17, + 223, 92, -21, -48, -82, -14, -167, + 51, -37, -243, -30, -90, 18, -56, + 54, 105, 74, 86, 69, 13, -101, + 196, 72, -89, 43, 65, 19, 39, + 121, 34, 131, -82, 25, 213, -156, + 101, -102, -136, -21, 57, 214, 22, + 36, -124, 205, 204, 58, -156, -83, + 83, -117, 137, 137, 85, 116, 44, + -92, -148, -68, 11, -102, -197, -220, + -76, -185, -58, 132, -26, -183, 85, + -7, -31, -2, 23, 205, -151, 10, + -27, -37, -5, -18, 292, 131, 1, + 117, -168, 9, -93, 80, -59, -125, + -182, -244, 98, -24, 135, -22, 94, + 221, 97, 106, 42, 43, -160, 83, + 25, -64, -21, 6, 14, -15, 154, + 126, 15, -140, 150, -10, -207, -114, + 79, -63, -211, -70, -28, -217, 165, + 46, 38, -22, 281, 132, -62, 109, + 112, 54, -112, -93, 208, 27, 296, + 115, 10, -147, 41, 216, 42, -276, + 50, -115, -254, 167, 117, -2, 61, + 17, 144, 34, -72, -186, -150, 272, + -29, -66, -89, -95, -149, 129, 251, + 122, 0, -50, -234, -91, 36, 26, + -105, -102, -88, -121, -236, -7, -11, + -204, 109, 5, -191, 105, -15, 163, + -80, 32, -24, -209, 41, 294, 70, + -106, -94, -204, -118, 120, -50, -37, + -82, -241, 46, -131, -29, 150, -55, + 33, 155, 120, -89, -8, 7, 62, + 213, 82, 61, 18, -161, 144, 152, + 30, 131, 65, -87, -255, -17, -107, + -8, 85, -64, 51, -162, 223, -53, + -134, 261, 69, -56, 218, 72, -111, + 2, 155, -113, -87, 49, 85, -28, + -163, 42, -1, -196, 7, 39, -245, + 14, -137, -79, 11, -160, 202, -293, + -94, 33, 208, 100, 56, -44, 326, + -78, -41, 232, 13, -142, 227, 80, + -16, -87, 201, 33, -133, 15, -183, + -58, -192, -47, 184, -128, 133, 99, + -205, 11, -155, 78, 52, 72, 141, + -246, 26, 99, 151, 59, 115, -64, + -79, -47, -16, -14, 6, 47, -43, + -72, -178, -27, 162, 112, 43, -174, + -175, 238, 186, 71, -54, -188, -76, + -225, 233, 39, -39, -158, 122, 44, + -26, 43, 84, 130, -93, -51, 22, + 3, 92, -150, 136, -182, -57, 97, + -131, 179, -78, 80, 91, -165, 90, + -2, 148, 15, 130, 65, 175, 117, + -138, 114, -137, 132, 3, -10, -186, + 140, -4, -37, 254, -62, 92, -109}; + + diff --git a/media/libstagefright/codecs/amrwbenc/inc/stream.h b/media/libstagefright/codecs/amrwbenc/inc/stream.h index edbc13a..3e5336a 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/stream.h +++ b/media/libstagefright/codecs/amrwbenc/inc/stream.h @@ -1,47 +1,47 @@ - -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*********************************************************************** -File: stream.h - -Contains: VOME API Buffer Operator Implement Header - -************************************************************************/ -#ifndef __STREAM_H__ -#define __STREAM_H__ - -#include "voMem.h" -#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)) - -typedef struct{ - unsigned char *set_ptr; - unsigned char *frame_ptr; - unsigned char *frame_ptr_bk; - int set_len; - int framebuffer_len; - int frame_storelen; - int used_len; -}FrameStream; - -void voAWB_UpdateFrameBuffer(FrameStream *stream, VO_MEM_OPERATOR *pMemOP); -void voAWB_InitFrameBuffer(FrameStream *stream); -void voAWB_FlushFrameBuffer(FrameStream *stream); -#endif //__STREAM_H__ - + +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*********************************************************************** +File: stream.h + +Contains: VOME API Buffer Operator Implement Header + +************************************************************************/ +#ifndef __STREAM_H__ +#define __STREAM_H__ + +#include "voMem.h" +#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)) + +typedef struct{ + unsigned char *set_ptr; + unsigned char *frame_ptr; + unsigned char *frame_ptr_bk; + int set_len; + int framebuffer_len; + int frame_storelen; + int used_len; +}FrameStream; + +void voAWB_UpdateFrameBuffer(FrameStream *stream, VO_MEM_OPERATOR *pMemOP); +void voAWB_InitFrameBuffer(FrameStream *stream); +void voAWB_FlushFrameBuffer(FrameStream *stream); +#endif //__STREAM_H__ + diff --git a/media/libstagefright/codecs/amrwbenc/inc/typedef.h b/media/libstagefright/codecs/amrwbenc/inc/typedef.h index aa8c098..533e68b 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/typedef.h +++ b/media/libstagefright/codecs/amrwbenc/inc/typedef.h @@ -1,65 +1,65 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* -* File : typedef.c -* Purpose : Basic types. -* -************************************************************************/ - -#ifndef __TYPEDEF_H__ -#define __TYPEDEF_H__ - -#undef ORIGINAL_TYPEDEF_H /* define to get "original" ETSI version - of typedef.h */ - -#ifdef ORIGINAL_TYPEDEF_H -/* - * 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; -typedef long Word32; -typedef int Flag; - -#elif defined(__sun) -typedef signed char Word8; -typedef short Word16; -typedef long Word32; -typedef int Flag; - -#elif defined(__unix__) || defined(__unix) -typedef signed char Word8; -typedef short Word16; -typedef int Word32; -typedef int Flag; - -#endif -#else /* not original typedef.h */ - -/* - * use (improved) type definition file typdefs.h and add a "Flag" type - */ -#include "typedefs.h" -typedef int Flag; - -#endif - -#endif //__TYPEDEF_H__ - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* +* File : typedef.c +* Purpose : Basic types. +* +************************************************************************/ + +#ifndef __TYPEDEF_H__ +#define __TYPEDEF_H__ + +#undef ORIGINAL_TYPEDEF_H /* define to get "original" ETSI version + of typedef.h */ + +#ifdef ORIGINAL_TYPEDEF_H +/* + * 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; +typedef long Word32; +typedef int Flag; + +#elif defined(__sun) +typedef signed char Word8; +typedef short Word16; +typedef long Word32; +typedef int Flag; + +#elif defined(__unix__) || defined(__unix) +typedef signed char Word8; +typedef short Word16; +typedef int Word32; +typedef int Flag; + +#endif +#else /* not original typedef.h */ + +/* + * use (improved) type definition file typdefs.h and add a "Flag" type + */ +#include "typedefs.h" +typedef int Flag; + +#endif + +#endif //__TYPEDEF_H__ + diff --git a/media/libstagefright/codecs/amrwbenc/inc/typedefs.h b/media/libstagefright/codecs/amrwbenc/inc/typedefs.h index 28b657e..f30d255 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/typedefs.h +++ b/media/libstagefright/codecs/amrwbenc/inc/typedefs.h @@ -1,211 +1,211 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/* -* -* File : typedefs.h -* Description : Definition of platform independent data -* types and constants -* -* -* The following platform independent data types and corresponding -* preprocessor (#define) constants are defined: -* -* defined type meaning corresponding constants -* ---------------------------------------------------------- -* Char character (none) -* Bool boolean true, false -* Word8 8-bit signed minWord8, maxWord8 -* UWord8 8-bit unsigned minUWord8, maxUWord8 -* Word16 16-bit signed minWord16, maxWord16 -* UWord16 16-bit unsigned minUWord16, maxUWord16 -* Word32 32-bit signed minWord32, maxWord32 -* UWord32 32-bit unsigned minUWord32, maxUWord32 -* Float floating point minFloat, maxFloat -* -* -* The following compile switches are #defined: -* -* PLATFORM string indicating platform progam is compiled on -* possible values: "OSF", "PC", "SUN" -* -* 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 -* -******************************************************************************** -*/ - -#ifndef __TYPEDEFS_H__ -#define __TYPEDEFS_H__ - -/* -******************************************************************************** -* INCLUDE FILES -******************************************************************************** -*/ -#include -#include - - - -/* -******************************************************************************** -* DEFINITION OF CONSTANTS -******************************************************************************** -*/ -/* - ********* define char type - */ -typedef char Char; - -/* - ********* define 8 bit signed/unsigned types & constants - */ -#if SCHAR_MAX == 127 -typedef signed char Word8; -#define minWord8 SCHAR_MIN -#define maxWord8 SCHAR_MAX - -typedef unsigned char UWord8; -#define minUWord8 0 -#define maxUWord8 UCHAR_MAX -#else -#error cannot find 8-bit type -#endif - - -/* - ********* define 16 bit signed/unsigned types & constants - */ -#if INT_MAX == 32767 -typedef int Word16; -#define minWord16 INT_MIN -#define maxWord16 INT_MAX -typedef unsigned int UWord16; -#define minUWord16 0 -#define maxUWord16 UINT_MAX -#elif SHRT_MAX == 32767 -typedef short Word16; -#define minWord16 SHRT_MIN -#define maxWord16 SHRT_MAX -typedef unsigned short UWord16; -#define minUWord16 0 -#define maxUWord16 USHRT_MAX -#else -#error cannot find 16-bit type -#endif - - -/* - ********* define 32 bit signed/unsigned types & constants - */ -#if INT_MAX == 2147483647 -typedef int Word32; -#define minWord32 INT_MIN -#define maxWord32 INT_MAX -typedef unsigned int UWord32; -#define minUWord32 0 -#define maxUWord32 UINT_MAX -#elif LONG_MAX == 2147483647 -typedef long Word32; -#define minWord32 LONG_MIN -#define maxWord32 LONG_MAX -typedef unsigned long UWord32; -#define minUWord32 0 -#define maxUWord32 ULONG_MAX -#else -#error cannot find 32-bit type -#endif - -/* - ********* define floating point type & constants - */ -/* use "#if 0" below if Float should be double; - use "#if 1" below if Float should be float - */ -#if 0 -typedef float Float; -#define maxFloat FLT_MAX -#define minFloat FLT_MIN -#else -typedef double Float; -#define maxFloat DBL_MAX -#define minFloat DBL_MIN -#endif - -/* - ********* define complex type - */ -typedef struct { - Float r; /* real part */ - Float i; /* imaginary part */ -} CPX; - -/* - ********* define boolean type - */ -typedef int Bool; -#define false 0 -#define true 1 - -/* ******Avoid function multiple definition****** */ -#define Autocorr voAWB_Autocorr -#define Convolve voAWB_Convolve -#define cor_h_x voAWB_cor_h_x -#define dtx_enc_init voAWB_dtx_enc_init -#define dtx_enc_reset voAWB_dtx_enc_reset -#define dtx_enc_exit voAWB_dtx_enc_exit -#define dtx_enc voAWB_dtx_enc -#define dtx_buffer voAWB_dtx_buffer -#define tx_dtx_handler voAWB_tx_dtx_handler -#define G_pitch voAWB_G_pitch -#define Isp_Az voAWB_Isp_Az -#define Lag_window voAWB_Lag_window -#define Log2_norm voAWB_Log2_norm -#define Log2 voAWB_Log2 -#define Pow2 voAWB_Pow2 -#define L_Comp voAWB_L_Comp -#define Mpy_32 voAWB_Mpy_32 -#define Mpy_32_16 voAWB_Mpy_32_16 -#define Div_32 voAWB_Div_32 -#define Pit_shrp voAWB_Pit_shrp -#define Qisf_ns voAWB_Qisf_ns -#define Disf_ns voAWB_Disf_ns -#define Residu voAWB_Residu -#define Syn_filt voAWB_Syn_filt -#define Set_zero voAWB_Set_zero -#define Copy voAWB_Copy -#define voice_factor voAWB_voice_factor -#define Syn_filt_32 voAWB_Syn_filt_32 -#define Isf_isp voAWB_Isf_isp -#define Levinson voAWB_Levinson -#define median5 voAWB_median5 -#define Pred_lt4 voAWB_Pred_lt4 -#define Reorder_isf voAWB_Reorder_isf -#define Dpisf_2s_36b voAWB_Dpisf_2s_36b -#define Dpisf_2s_46b voAWB_Dpisf_2s_46b -#define Dot_product12 voAWB_Dot_product12 -#define mem_malloc voAWB_mem_malloc -#define mem_free voAWB_mem_free -/******************************************************/ - -#endif //#define __TYPEDEFS_H__ - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/* +* +* File : typedefs.h +* Description : Definition of platform independent data +* types and constants +* +* +* The following platform independent data types and corresponding +* preprocessor (#define) constants are defined: +* +* defined type meaning corresponding constants +* ---------------------------------------------------------- +* Char character (none) +* Bool boolean true, false +* Word8 8-bit signed minWord8, maxWord8 +* UWord8 8-bit unsigned minUWord8, maxUWord8 +* Word16 16-bit signed minWord16, maxWord16 +* UWord16 16-bit unsigned minUWord16, maxUWord16 +* Word32 32-bit signed minWord32, maxWord32 +* UWord32 32-bit unsigned minUWord32, maxUWord32 +* Float floating point minFloat, maxFloat +* +* +* The following compile switches are #defined: +* +* PLATFORM string indicating platform progam is compiled on +* possible values: "OSF", "PC", "SUN" +* +* 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 +* +******************************************************************************** +*/ + +#ifndef __TYPEDEFS_H__ +#define __TYPEDEFS_H__ + +/* +******************************************************************************** +* INCLUDE FILES +******************************************************************************** +*/ +#include +#include + + + +/* +******************************************************************************** +* DEFINITION OF CONSTANTS +******************************************************************************** +*/ +/* + ********* define char type + */ +typedef char Char; + +/* + ********* define 8 bit signed/unsigned types & constants + */ +#if SCHAR_MAX == 127 +typedef signed char Word8; +#define minWord8 SCHAR_MIN +#define maxWord8 SCHAR_MAX + +typedef unsigned char UWord8; +#define minUWord8 0 +#define maxUWord8 UCHAR_MAX +#else +#error cannot find 8-bit type +#endif + + +/* + ********* define 16 bit signed/unsigned types & constants + */ +#if INT_MAX == 32767 +typedef int Word16; +#define minWord16 INT_MIN +#define maxWord16 INT_MAX +typedef unsigned int UWord16; +#define minUWord16 0 +#define maxUWord16 UINT_MAX +#elif SHRT_MAX == 32767 +typedef short Word16; +#define minWord16 SHRT_MIN +#define maxWord16 SHRT_MAX +typedef unsigned short UWord16; +#define minUWord16 0 +#define maxUWord16 USHRT_MAX +#else +#error cannot find 16-bit type +#endif + + +/* + ********* define 32 bit signed/unsigned types & constants + */ +#if INT_MAX == 2147483647 +typedef int Word32; +#define minWord32 INT_MIN +#define maxWord32 INT_MAX +typedef unsigned int UWord32; +#define minUWord32 0 +#define maxUWord32 UINT_MAX +#elif LONG_MAX == 2147483647 +typedef long Word32; +#define minWord32 LONG_MIN +#define maxWord32 LONG_MAX +typedef unsigned long UWord32; +#define minUWord32 0 +#define maxUWord32 ULONG_MAX +#else +#error cannot find 32-bit type +#endif + +/* + ********* define floating point type & constants + */ +/* use "#if 0" below if Float should be double; + use "#if 1" below if Float should be float + */ +#if 0 +typedef float Float; +#define maxFloat FLT_MAX +#define minFloat FLT_MIN +#else +typedef double Float; +#define maxFloat DBL_MAX +#define minFloat DBL_MIN +#endif + +/* + ********* define complex type + */ +typedef struct { + Float r; /* real part */ + Float i; /* imaginary part */ +} CPX; + +/* + ********* define boolean type + */ +typedef int Bool; +#define false 0 +#define true 1 + +/* ******Avoid function multiple definition****** */ +#define Autocorr voAWB_Autocorr +#define Convolve voAWB_Convolve +#define cor_h_x voAWB_cor_h_x +#define dtx_enc_init voAWB_dtx_enc_init +#define dtx_enc_reset voAWB_dtx_enc_reset +#define dtx_enc_exit voAWB_dtx_enc_exit +#define dtx_enc voAWB_dtx_enc +#define dtx_buffer voAWB_dtx_buffer +#define tx_dtx_handler voAWB_tx_dtx_handler +#define G_pitch voAWB_G_pitch +#define Isp_Az voAWB_Isp_Az +#define Lag_window voAWB_Lag_window +#define Log2_norm voAWB_Log2_norm +#define Log2 voAWB_Log2 +#define Pow2 voAWB_Pow2 +#define L_Comp voAWB_L_Comp +#define Mpy_32 voAWB_Mpy_32 +#define Mpy_32_16 voAWB_Mpy_32_16 +#define Div_32 voAWB_Div_32 +#define Pit_shrp voAWB_Pit_shrp +#define Qisf_ns voAWB_Qisf_ns +#define Disf_ns voAWB_Disf_ns +#define Residu voAWB_Residu +#define Syn_filt voAWB_Syn_filt +#define Set_zero voAWB_Set_zero +#define Copy voAWB_Copy +#define voice_factor voAWB_voice_factor +#define Syn_filt_32 voAWB_Syn_filt_32 +#define Isf_isp voAWB_Isf_isp +#define Levinson voAWB_Levinson +#define median5 voAWB_median5 +#define Pred_lt4 voAWB_Pred_lt4 +#define Reorder_isf voAWB_Reorder_isf +#define Dpisf_2s_36b voAWB_Dpisf_2s_36b +#define Dpisf_2s_46b voAWB_Dpisf_2s_46b +#define Dot_product12 voAWB_Dot_product12 +#define mem_malloc voAWB_mem_malloc +#define mem_free voAWB_mem_free +/******************************************************/ + +#endif //#define __TYPEDEFS_H__ + diff --git a/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h b/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h index b733afe..6822f48 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h +++ b/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h @@ -1,78 +1,78 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*-------------------------------------------------------------------* - * WB_VAD.H * - *-------------------------------------------------------------------* - * Functions and static memory for Voice Activity Detection. * - *-------------------------------------------------------------------*/ - -#ifndef __WB_VAD_H__ -#define __WB_VAD_H__ - -/****************************************************************************** - * INCLUDE FILES - ******************************************************************************/ -#include "typedef.h" -#include "wb_vad_c.h" -#include "voMem.h" - -/****************************************************************************** - * DEFINITION OF DATA TYPES - ******************************************************************************/ - -typedef struct -{ - Word16 bckr_est[COMPLEN]; /* background noise estimate */ - Word16 ave_level[COMPLEN]; /* averaged input components for stationary */ - /* estimation */ - Word16 old_level[COMPLEN]; /* input levels of the previous frame */ - Word16 sub_level[COMPLEN]; /* input levels calculated at the end of a frame (lookahead) */ - Word16 a_data5[F_5TH_CNT][2]; /* memory for the filter bank */ - Word16 a_data3[F_3TH_CNT]; /* memory for the filter bank */ - - Word16 burst_count; /* counts length of a speech burst */ - Word16 hang_count; /* hangover counter */ - Word16 stat_count; /* stationary counter */ - - /* Note that each of the following two variables holds 15 flags. Each flag reserves 1 bit of the - * variable. The newest flag is in the bit 15 (assuming that LSB is bit 1 and MSB is bit 16). */ - Word16 vadreg; /* flags for intermediate VAD decisions */ - Word16 tone_flag; /* tone detection flags */ - - Word16 sp_est_cnt; /* counter for speech level estimation */ - Word16 sp_max; /* maximum level */ - Word16 sp_max_cnt; /* counts frames that contains speech */ - Word16 speech_level; /* estimated speech level */ - Word32 prev_pow_sum; /* power of previous frame */ - -} VadVars; - -/******************************************************************************** - * - * DECLARATION OF PROTOTYPES - ********************************************************************************/ - -Word16 wb_vad_init(VadVars ** st, VO_MEM_OPERATOR *pMemOP); -Word16 wb_vad_reset(VadVars * st); -void wb_vad_exit(VadVars ** st, VO_MEM_OPERATOR *pMemOP); -void wb_vad_tone_detection(VadVars * st, Word16 p_gain); -Word16 wb_vad(VadVars * st, Word16 in_buf[]); - -#endif //__WB_VAD_H__ - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*-------------------------------------------------------------------* + * WB_VAD.H * + *-------------------------------------------------------------------* + * Functions and static memory for Voice Activity Detection. * + *-------------------------------------------------------------------*/ + +#ifndef __WB_VAD_H__ +#define __WB_VAD_H__ + +/****************************************************************************** + * INCLUDE FILES + ******************************************************************************/ +#include "typedef.h" +#include "wb_vad_c.h" +#include "voMem.h" + +/****************************************************************************** + * DEFINITION OF DATA TYPES + ******************************************************************************/ + +typedef struct +{ + Word16 bckr_est[COMPLEN]; /* background noise estimate */ + Word16 ave_level[COMPLEN]; /* averaged input components for stationary */ + /* estimation */ + Word16 old_level[COMPLEN]; /* input levels of the previous frame */ + Word16 sub_level[COMPLEN]; /* input levels calculated at the end of a frame (lookahead) */ + Word16 a_data5[F_5TH_CNT][2]; /* memory for the filter bank */ + Word16 a_data3[F_3TH_CNT]; /* memory for the filter bank */ + + Word16 burst_count; /* counts length of a speech burst */ + Word16 hang_count; /* hangover counter */ + Word16 stat_count; /* stationary counter */ + + /* Note that each of the following two variables holds 15 flags. Each flag reserves 1 bit of the + * variable. The newest flag is in the bit 15 (assuming that LSB is bit 1 and MSB is bit 16). */ + Word16 vadreg; /* flags for intermediate VAD decisions */ + Word16 tone_flag; /* tone detection flags */ + + Word16 sp_est_cnt; /* counter for speech level estimation */ + Word16 sp_max; /* maximum level */ + Word16 sp_max_cnt; /* counts frames that contains speech */ + Word16 speech_level; /* estimated speech level */ + Word32 prev_pow_sum; /* power of previous frame */ + +} VadVars; + +/******************************************************************************** + * + * DECLARATION OF PROTOTYPES + ********************************************************************************/ + +Word16 wb_vad_init(VadVars ** st, VO_MEM_OPERATOR *pMemOP); +Word16 wb_vad_reset(VadVars * st); +void wb_vad_exit(VadVars ** st, VO_MEM_OPERATOR *pMemOP); +void wb_vad_tone_detection(VadVars * st, Word16 p_gain); +Word16 wb_vad(VadVars * st, Word16 in_buf[]); + +#endif //__WB_VAD_H__ + + diff --git a/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h b/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h index 39ef506..04fd318 100644 --- a/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h +++ b/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h @@ -1,109 +1,109 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*-------------------------------------------------------------------* - * WB_VAD_C.H * - *-------------------------------------------------------------------* - * Constants for Voice Activity Detection. * - *-------------------------------------------------------------------*/ - -#ifndef __WB_VAD_C_H__ -#define __WB_VAD_C_H__ - -#define FRAME_LEN 256 /* Length (samples) of the input frame */ -#define COMPLEN 12 /* Number of sub-bands used by VAD */ - -#define UNIRSHFT 7 /* = log2(MAX_16/UNITY), UNITY = 256 */ -#define SCALE 128 /* (UNITY*UNITY)/512 */ - -#define TONE_THR (Word16)(0.65*MAX_16) /* Threshold for tone detection */ - -/* constants for speech level estimation */ -#define SP_EST_COUNT 80 -#define SP_ACTIVITY_COUNT 25 -#define ALPHA_SP_UP (Word16)((1.0 - 0.85)*MAX_16) -#define ALPHA_SP_DOWN (Word16)((1.0 - 0.85)*MAX_16) - -#define NOM_LEVEL 2050 /* about -26 dBov Q15 */ -#define SPEECH_LEVEL_INIT NOM_LEVEL /* initial speech level */ -#define MIN_SPEECH_LEVEL1 (Word16)(NOM_LEVEL * 0.063) /* NOM_LEVEL -24 dB */ -#define MIN_SPEECH_LEVEL2 (Word16)(NOM_LEVEL * 0.2) /* NOM_LEVEL -14 dB */ -#define MIN_SPEECH_SNR 4096 /* 0 dB, lowest SNR estimation, Q12 */ - -/* Time constants for background spectrum update */ -#define ALPHA_UP1 (Word16)((1.0 - 0.95)*MAX_16) /* Normal update, upwards: */ -#define ALPHA_DOWN1 (Word16)((1.0 - 0.936)*MAX_16) /* Normal update, downwards */ -#define ALPHA_UP2 (Word16)((1.0 - 0.985)*MAX_16) /* Forced update, upwards */ -#define ALPHA_DOWN2 (Word16)((1.0 - 0.943)*MAX_16) /* Forced update, downwards */ -#define ALPHA3 (Word16)((1.0 - 0.95)*MAX_16) /* Update downwards */ -#define ALPHA4 (Word16)((1.0 - 0.9)*MAX_16) /* For stationary estimation */ -#define ALPHA5 (Word16)((1.0 - 0.5)*MAX_16) /* For stationary estimation */ - -/* Constants for VAD threshold */ -#define THR_MIN (Word16)(1.6*SCALE) /* Minimum threshold */ -#define THR_HIGH (Word16)(6*SCALE) /* Highest threshold */ -#define THR_LOW (Word16)(1.7*SCALE) /* Lowest threshold */ -#define NO_P1 31744 /* ilog2(1), Noise level for highest threshold */ -#define NO_P2 19786 /* ilog2(0.1*MAX_16), Noise level for lowest threshold */ -#define NO_SLOPE (Word16)(MAX_16*(float)(THR_LOW-THR_HIGH)/(float)(NO_P2-NO_P1)) - -#define SP_CH_MIN (Word16)(-0.75*SCALE) -#define SP_CH_MAX (Word16)(0.75*SCALE) -#define SP_P1 22527 /* ilog2(NOM_LEVEL/4) */ -#define SP_P2 17832 /* ilog2(NOM_LEVEL*4) */ -#define SP_SLOPE (Word16)(MAX_16*(float)(SP_CH_MAX-SP_CH_MIN)/(float)(SP_P2-SP_P1)) - -/* Constants for hangover length */ -#define HANG_HIGH 12 /* longest hangover */ -#define HANG_LOW 2 /* shortest hangover */ -#define HANG_P1 THR_LOW /* threshold for longest hangover */ -#define HANG_P2 (Word16)(4*SCALE) /* threshold for shortest hangover */ -#define HANG_SLOPE (Word16)(MAX_16*(float)(HANG_LOW-HANG_HIGH)/(float)(HANG_P2-HANG_P1)) - -/* Constants for burst length */ -#define BURST_HIGH 8 /* longest burst length */ -#define BURST_LOW 3 /* shortest burst length */ -#define BURST_P1 THR_HIGH /* threshold for longest burst */ -#define BURST_P2 THR_LOW /* threshold for shortest burst */ -#define BURST_SLOPE (Word16)(MAX_16*(float)(BURST_LOW-BURST_HIGH)/(float)(BURST_P2-BURST_P1)) - -/* Parameters for background spectrum recovery function */ -#define STAT_COUNT 20 /* threshold of stationary detection counter */ - -#define STAT_THR_LEVEL 184 /* Threshold level for stationarity detection */ -#define STAT_THR 1000 /* Threshold for stationarity detection */ - -/* Limits for background noise estimate */ -#define NOISE_MIN 40 /* minimum */ -#define NOISE_MAX 20000 /* maximum */ -#define NOISE_INIT 150 /* initial */ - -/* Thresholds for signal power (now calculated on 2 frames) */ -#define VAD_POW_LOW (Word32)30000L /* If input power is lower than this, VAD is set to 0 */ -#define POW_TONE_THR (Word32)686080L /* If input power is lower,tone detection flag is ignored */ - -/* Constants for the filter bank */ -#define COEFF3 13363 /* coefficient for the 3rd order filter */ -#define COEFF5_1 21955 /* 1st coefficient the for 5th order filter */ -#define COEFF5_2 6390 /* 2nd coefficient the for 5th order filter */ -#define F_5TH_CNT 5 /* number of 5th order filters */ -#define F_3TH_CNT 6 /* number of 3th order filters */ - -#endif //__WB_VAD_C_H__ - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*-------------------------------------------------------------------* + * WB_VAD_C.H * + *-------------------------------------------------------------------* + * Constants for Voice Activity Detection. * + *-------------------------------------------------------------------*/ + +#ifndef __WB_VAD_C_H__ +#define __WB_VAD_C_H__ + +#define FRAME_LEN 256 /* Length (samples) of the input frame */ +#define COMPLEN 12 /* Number of sub-bands used by VAD */ + +#define UNIRSHFT 7 /* = log2(MAX_16/UNITY), UNITY = 256 */ +#define SCALE 128 /* (UNITY*UNITY)/512 */ + +#define TONE_THR (Word16)(0.65*MAX_16) /* Threshold for tone detection */ + +/* constants for speech level estimation */ +#define SP_EST_COUNT 80 +#define SP_ACTIVITY_COUNT 25 +#define ALPHA_SP_UP (Word16)((1.0 - 0.85)*MAX_16) +#define ALPHA_SP_DOWN (Word16)((1.0 - 0.85)*MAX_16) + +#define NOM_LEVEL 2050 /* about -26 dBov Q15 */ +#define SPEECH_LEVEL_INIT NOM_LEVEL /* initial speech level */ +#define MIN_SPEECH_LEVEL1 (Word16)(NOM_LEVEL * 0.063) /* NOM_LEVEL -24 dB */ +#define MIN_SPEECH_LEVEL2 (Word16)(NOM_LEVEL * 0.2) /* NOM_LEVEL -14 dB */ +#define MIN_SPEECH_SNR 4096 /* 0 dB, lowest SNR estimation, Q12 */ + +/* Time constants for background spectrum update */ +#define ALPHA_UP1 (Word16)((1.0 - 0.95)*MAX_16) /* Normal update, upwards: */ +#define ALPHA_DOWN1 (Word16)((1.0 - 0.936)*MAX_16) /* Normal update, downwards */ +#define ALPHA_UP2 (Word16)((1.0 - 0.985)*MAX_16) /* Forced update, upwards */ +#define ALPHA_DOWN2 (Word16)((1.0 - 0.943)*MAX_16) /* Forced update, downwards */ +#define ALPHA3 (Word16)((1.0 - 0.95)*MAX_16) /* Update downwards */ +#define ALPHA4 (Word16)((1.0 - 0.9)*MAX_16) /* For stationary estimation */ +#define ALPHA5 (Word16)((1.0 - 0.5)*MAX_16) /* For stationary estimation */ + +/* Constants for VAD threshold */ +#define THR_MIN (Word16)(1.6*SCALE) /* Minimum threshold */ +#define THR_HIGH (Word16)(6*SCALE) /* Highest threshold */ +#define THR_LOW (Word16)(1.7*SCALE) /* Lowest threshold */ +#define NO_P1 31744 /* ilog2(1), Noise level for highest threshold */ +#define NO_P2 19786 /* ilog2(0.1*MAX_16), Noise level for lowest threshold */ +#define NO_SLOPE (Word16)(MAX_16*(float)(THR_LOW-THR_HIGH)/(float)(NO_P2-NO_P1)) + +#define SP_CH_MIN (Word16)(-0.75*SCALE) +#define SP_CH_MAX (Word16)(0.75*SCALE) +#define SP_P1 22527 /* ilog2(NOM_LEVEL/4) */ +#define SP_P2 17832 /* ilog2(NOM_LEVEL*4) */ +#define SP_SLOPE (Word16)(MAX_16*(float)(SP_CH_MAX-SP_CH_MIN)/(float)(SP_P2-SP_P1)) + +/* Constants for hangover length */ +#define HANG_HIGH 12 /* longest hangover */ +#define HANG_LOW 2 /* shortest hangover */ +#define HANG_P1 THR_LOW /* threshold for longest hangover */ +#define HANG_P2 (Word16)(4*SCALE) /* threshold for shortest hangover */ +#define HANG_SLOPE (Word16)(MAX_16*(float)(HANG_LOW-HANG_HIGH)/(float)(HANG_P2-HANG_P1)) + +/* Constants for burst length */ +#define BURST_HIGH 8 /* longest burst length */ +#define BURST_LOW 3 /* shortest burst length */ +#define BURST_P1 THR_HIGH /* threshold for longest burst */ +#define BURST_P2 THR_LOW /* threshold for shortest burst */ +#define BURST_SLOPE (Word16)(MAX_16*(float)(BURST_LOW-BURST_HIGH)/(float)(BURST_P2-BURST_P1)) + +/* Parameters for background spectrum recovery function */ +#define STAT_COUNT 20 /* threshold of stationary detection counter */ + +#define STAT_THR_LEVEL 184 /* Threshold level for stationarity detection */ +#define STAT_THR 1000 /* Threshold for stationarity detection */ + +/* Limits for background noise estimate */ +#define NOISE_MIN 40 /* minimum */ +#define NOISE_MAX 20000 /* maximum */ +#define NOISE_INIT 150 /* initial */ + +/* Thresholds for signal power (now calculated on 2 frames) */ +#define VAD_POW_LOW (Word32)30000L /* If input power is lower than this, VAD is set to 0 */ +#define POW_TONE_THR (Word32)686080L /* If input power is lower,tone detection flag is ignored */ + +/* Constants for the filter bank */ +#define COEFF3 13363 /* coefficient for the 3rd order filter */ +#define COEFF5_1 21955 /* 1st coefficient the for 5th order filter */ +#define COEFF5_2 6390 /* 2nd coefficient the for 5th order filter */ +#define F_5TH_CNT 5 /* number of 5th order filters */ +#define F_3TH_CNT 6 /* number of 3th order filters */ + +#endif //__WB_VAD_C_H__ + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s index 0eb5e9f..c1c74e6 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s @@ -1,104 +1,104 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ - -@void Deemph_32( -@ Word16 x_hi[], /* (i) : input signal (bit31..16) */ -@ Word16 x_lo[], /* (i) : input signal (bit15..4) */ -@ Word16 y[], /* (o) : output signal (x16) */ -@ Word16 mu, /* (i) Q15 : deemphasis factor */ -@ Word16 L, /* (i) : vector size */ -@ Word16 * mem /* (i/o) : memory (y[-1]) */ -@ ) - -@x_hi RN R0 -@x_lo RN R1 -@y[] RN R2 -@*mem RN R3 - - .section .text - .global Deemph_32_asm - -Deemph_32_asm: - - 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] - LDR r5, =22282 @r5---mu - MOV r11, #0x8000 - - @y[0] - MOV r10, r6, LSL #16 @L_tmp = x_hi[0]<<16 - MOV r8, r5, ASR #1 @fac = mu >> 1 - LDR r5, [r3] - 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] - QDADD r10, r10, r9 - 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) - - - MOV r10, r6, LSL #16 - ADD r12, r10, r7, LSL #4 - STRH r14, [r2], #2 @update y[0] - MOV r10, r12, LSL #3 - MUL r9, r14, r8 - QDADD r10, r10, r9 - MOV r12, r10, LSL #1 - QADD r10, r12, r11 - MOV r14, r10, ASR #16 @y[1] = round(L_tmp) - -LOOP: - LDRSH r6, [r0], #2 @load x_hi[] - LDRSH r7, [r1], #2 - STRH r14, [r2], #2 - MOV r10, r6, LSL #16 - ADD r12, r10, r7, LSL #4 - MUL r9, r14, r8 - MOV r10, r12, LSL #3 - QDADD r10, r10, r9 - LDRSH r6, [r0], #2 @load x_hi[] - MOV r12, r10, LSL #1 - QADD r10, r12, r11 - LDRSH r7, [r1], #2 - MOV r14, r10, ASR #16 - - MOV r10, r6, LSL #16 - ADD r12, r10, r7, LSL #4 - STRH r14, [r2], #2 - MUL r9, r14, r8 - MOV r10, r12, LSL #3 - QDADD r10, r10, r9 - ADD r4, r4, #2 - MOV r12, r10, LSL #1 - QADD r10, r12, r11 - CMP r4, #64 - MOV r14, r10, ASR #16 - - BLT LOOP - STR r14, [r3] - STRH r14, [r2] - - LDMFD r13!, {r4 - r12, r15} - - @ENDP - .END - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ + +@void Deemph_32( +@ Word16 x_hi[], /* (i) : input signal (bit31..16) */ +@ Word16 x_lo[], /* (i) : input signal (bit15..4) */ +@ Word16 y[], /* (o) : output signal (x16) */ +@ Word16 mu, /* (i) Q15 : deemphasis factor */ +@ Word16 L, /* (i) : vector size */ +@ Word16 * mem /* (i/o) : memory (y[-1]) */ +@ ) + +@x_hi RN R0 +@x_lo RN R1 +@y[] RN R2 +@*mem RN R3 + + .section .text + .global Deemph_32_asm + +Deemph_32_asm: + + 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] + LDR r5, =22282 @r5---mu + MOV r11, #0x8000 + + @y[0] + MOV r10, r6, LSL #16 @L_tmp = x_hi[0]<<16 + MOV r8, r5, ASR #1 @fac = mu >> 1 + LDR r5, [r3] + 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] + QDADD r10, r10, r9 + 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) + + + MOV r10, r6, LSL #16 + ADD r12, r10, r7, LSL #4 + STRH r14, [r2], #2 @update y[0] + MOV r10, r12, LSL #3 + MUL r9, r14, r8 + QDADD r10, r10, r9 + MOV r12, r10, LSL #1 + QADD r10, r12, r11 + MOV r14, r10, ASR #16 @y[1] = round(L_tmp) + +LOOP: + LDRSH r6, [r0], #2 @load x_hi[] + LDRSH r7, [r1], #2 + STRH r14, [r2], #2 + MOV r10, r6, LSL #16 + ADD r12, r10, r7, LSL #4 + MUL r9, r14, r8 + MOV r10, r12, LSL #3 + QDADD r10, r10, r9 + LDRSH r6, [r0], #2 @load x_hi[] + MOV r12, r10, LSL #1 + QADD r10, r12, r11 + LDRSH r7, [r1], #2 + MOV r14, r10, ASR #16 + + MOV r10, r6, LSL #16 + ADD r12, r10, r7, LSL #4 + STRH r14, [r2], #2 + MUL r9, r14, r8 + MOV r10, r12, LSL #3 + QDADD r10, r10, r9 + ADD r4, r4, #2 + MOV r12, r10, LSL #1 + QADD r10, r12, r11 + CMP r4, #64 + MOV r14, r10, ASR #16 + + BLT LOOP + STR r14, [r3] + STRH r14, [r2] + + LDMFD r13!, {r4 - r12, r15} + + @ENDP + .END + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s index 0383269..02bdcab 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s @@ -1,80 +1,80 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@ -@Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */ -@ Word16 x[], /* (i) 12bits: x vector */ -@ Word16 y[], /* (i) 12bits: y vector */ -@ Word16 lg, /* (i) : vector length */ -@ Word16 * exp /* (o) : exponent of result (0..+30) */ -@) -@**************************************************************** -@ x[] --- r0 -@ y[] --- r1 -@ lg --- r2 -@ *exp --- r3 - - .section .text - .global Dot_product12_asm - -Dot_product12_asm: - - STMFD r13!, {r4 - r12, r14} - MOV r4, #0 @ L_sum = 0 - MOV r5, #0 @ i = 0 - -LOOP: - LDR r6, [r0], #4 - LDR r7, [r1], #4 - LDR r8, [r0], #4 - SMLABB r4, r6, r7, r4 - LDR r9, [r1], #4 - SMLATT r4, r6, r7, r4 - - LDR r6, [r0], #4 - SMLABB r4, r8, r9, r4 - - LDR r7, [r1], #4 - SMLATT r4, r8, r9, r4 - LDR r8, [r0], #4 - - SMLABB r4, r6, r7, r4 - LDR r9, [r1], #4 - SMLATT r4, r6, r7, r4 - ADD r5, r5, #8 - SMLABB r4, r8, r9, r4 - 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 - - CMP r12, #0 - RSBLT r4, r12, #0 - CLZ r10, r4 - 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] - -Dot_product12_end: - - LDMFD r13!, {r4 - r12, r15} - @ENDFUNC - .END - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@ +@Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */ +@ Word16 x[], /* (i) 12bits: x vector */ +@ Word16 y[], /* (i) 12bits: y vector */ +@ Word16 lg, /* (i) : vector length */ +@ Word16 * exp /* (o) : exponent of result (0..+30) */ +@) +@**************************************************************** +@ x[] --- r0 +@ y[] --- r1 +@ lg --- r2 +@ *exp --- r3 + + .section .text + .global Dot_product12_asm + +Dot_product12_asm: + + STMFD r13!, {r4 - r12, r14} + MOV r4, #0 @ L_sum = 0 + MOV r5, #0 @ i = 0 + +LOOP: + LDR r6, [r0], #4 + LDR r7, [r1], #4 + LDR r8, [r0], #4 + SMLABB r4, r6, r7, r4 + LDR r9, [r1], #4 + SMLATT r4, r6, r7, r4 + + LDR r6, [r0], #4 + SMLABB r4, r8, r9, r4 + + LDR r7, [r1], #4 + SMLATT r4, r8, r9, r4 + LDR r8, [r0], #4 + + SMLABB r4, r6, r7, r4 + LDR r9, [r1], #4 + SMLATT r4, r6, r7, r4 + ADD r5, r5, #8 + SMLABB r4, r8, r9, r4 + 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 + + CMP r12, #0 + RSBLT r4, r12, #0 + CLZ r10, r4 + 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] + +Dot_product12_end: + + LDMFD r13!, {r4 - r12, r15} + @ENDFUNC + .END + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s index e6ebd73..1ce2a85 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s @@ -1,185 +1,185 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ - -@**********************************************************************/ -@void Filt_6k_7k( -@ Word16 signal[], /* input: signal */ -@ Word16 lg, /* input: length of input */ -@ Word16 mem[] /* in/out: memory (size=30) */ -@) -@****************************************************************** -@ r0 --- signal[] -@ r1 --- lg -@ r2 --- mem[] - - .section .text - .global Filt_6k_7k_asm - .extern voAWB_Copy - .extern fir_6k_7k - -Filt_6k_7k_asm: - - 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 - MOV r5, r2 @ copy mem[] address - - MOV r1, r13 - MOV r0, r2 - MOV r2, #30 @ L_FIR - 1 - BL voAWB_Copy @ memcpy(x, mem, (L_FIR - 1)<<1) - - LDR r10, Lable1 @ get fir_7k address - - 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] -LOOP1: - LDRSH r8, [r7], #2 - LDRSH r9, [r7], #2 - MOV r8, r8, ASR #2 - MOV r9, r9, ASR #2 - LDRSH r11, [r7], #2 - LDRSH r12, [r7], #2 - MOV r11, r11, ASR #2 - MOV r12, r12, ASR #2 - STRH r8, [r6], #2 - STRH r9, [r6], #2 - STRH r11, [r6], #2 - STRH r12, [r6], #2 - LDRSH r8, [r7], #2 - LDRSH r9, [r7], #2 - MOV r8, r8, ASR #2 - MOV r9, r9, ASR #2 - LDRSH r11, [r7], #2 - LDRSH r12, [r7], #2 - MOV r11, r11, ASR #2 - MOV r12, r12, ASR #2 - STRH r8, [r6], #2 - STRH r9, [r6], #2 - STRH r11, [r6], #2 - STRH r12, [r6], #2 - ADD r14, r14, #8 - CMP r14, #80 - 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 -LOOP2: - LDR r0, [r10] - - LDRSH r1, [r4] @ load x[i] - LDRSH r2, [r4, #60] @ load x[i + 30] - LDRSH r6, [r4, #2] @ load x[i + 1] - LDRSH r7, [r4, #58] @ load x[i + 29] - ADD r1, r1, r2 @ x[i] + x[i + 30] - ADD r6, r6, r7 @ x[i + 1] + x[i + 29] - LDRSH r8, [r4, #4] @ load x[i + 2] - LDRSH r9, [r4, #56] @ load x[i + 28] - - SMULBB r14, r1, r0 @ (x[i] + x[i + 30]) * fir_7k[0] - ADD r8, r8, r9 @ x[i + 2] + x[i + 28] - SMLABT r14, r6, r0, r14 @ (x[i + 1] + x[i + 29]) * fir_7k[1] - - LDR r0, [r10, #4] - LDRSH r1, [r4, #6] @ load x[i+3] - LDRSH r2, [r4, #54] @ load x[i+27] - LDRSH r6, [r4, #8] @ load x[i+4] - LDRSH r7, [r4, #52] @ load x[i+26] - ADD r1, r1, r2 @ x[i+3] + x[i+27] - ADD r6, r6, r7 @ x[i+4] + x[i+26] - SMLABB r14, r8, r0, r14 @ (x[i + 2] + x[i + 28]) * fir_7k[2] - 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] - - 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 r7, [r4, #46] @ x[i+23] - SMLABT r14, r8, r0, r14 @ (x[i+5] + x[i+25]) * fir_7k[5] - LDR r0, [r10, #12] - ADD r1, r1, r2 @ (x[i+6] + x[i+24]) - 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] - LDR r0, [r10, #16] - LDRSH r1, [r4, #18] @ x[i+9] - LDRSH r2, [r4, #42] @ x[i+21] - LDRSH r6, [r4, #20] @ x[i+10] - LDRSH r7, [r4, #40] @ x[i+20] - ADD r8, r8, r9 @ (x[i+8] + x[i+22]) - ADD r1, r1, r2 @ (x[i+9] + x[i+21]) - ADD r6, r6, r7 @ (x[i+10] + x[i+20]) - SMLABB r14, r8, r0, r14 @ (x[i+8] + x[i+22]) * fir_7k[8] - LDRSH r8, [r4, #22] @ x[i+11] - LDRSH r9, [r4, #38] @ x[i+19] - SMLABT r14, r1, r0, r14 @ (x[i+9] + x[i+21]) * fir_7k[9] - LDR r0, [r10, #20] - LDRSH r1, [r4, #24] @ x[i+12] - 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]) - 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] - ADD r1, r1, r2 @ x[i+12] + x[i+18] - 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] - SMLABT r14, r6, r0, r14 @ (x[i+13] + x[i+17]) * fir_7k[13] - 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] - - ADD r5, r5, #1 - ADD r14, r14, #0x4000 - ADD r4, r4, #2 - MOV r1, r14, ASR #15 - CMP r5, #80 - STRH r1, [r3], #2 @signal[i] = (L_tmp + 0x4000) >> 15 - 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} - -Lable1: - .word fir_6k_7k - @ENDFUNC - .END - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ + +@**********************************************************************/ +@void Filt_6k_7k( +@ Word16 signal[], /* input: signal */ +@ Word16 lg, /* input: length of input */ +@ Word16 mem[] /* in/out: memory (size=30) */ +@) +@****************************************************************** +@ r0 --- signal[] +@ r1 --- lg +@ r2 --- mem[] + + .section .text + .global Filt_6k_7k_asm + .extern voAWB_Copy + .extern fir_6k_7k + +Filt_6k_7k_asm: + + 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 + MOV r5, r2 @ copy mem[] address + + MOV r1, r13 + MOV r0, r2 + MOV r2, #30 @ L_FIR - 1 + BL voAWB_Copy @ memcpy(x, mem, (L_FIR - 1)<<1) + + LDR r10, Lable1 @ get fir_7k address + + 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] +LOOP1: + LDRSH r8, [r7], #2 + LDRSH r9, [r7], #2 + MOV r8, r8, ASR #2 + MOV r9, r9, ASR #2 + LDRSH r11, [r7], #2 + LDRSH r12, [r7], #2 + MOV r11, r11, ASR #2 + MOV r12, r12, ASR #2 + STRH r8, [r6], #2 + STRH r9, [r6], #2 + STRH r11, [r6], #2 + STRH r12, [r6], #2 + LDRSH r8, [r7], #2 + LDRSH r9, [r7], #2 + MOV r8, r8, ASR #2 + MOV r9, r9, ASR #2 + LDRSH r11, [r7], #2 + LDRSH r12, [r7], #2 + MOV r11, r11, ASR #2 + MOV r12, r12, ASR #2 + STRH r8, [r6], #2 + STRH r9, [r6], #2 + STRH r11, [r6], #2 + STRH r12, [r6], #2 + ADD r14, r14, #8 + CMP r14, #80 + 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 +LOOP2: + LDR r0, [r10] + + LDRSH r1, [r4] @ load x[i] + LDRSH r2, [r4, #60] @ load x[i + 30] + LDRSH r6, [r4, #2] @ load x[i + 1] + LDRSH r7, [r4, #58] @ load x[i + 29] + ADD r1, r1, r2 @ x[i] + x[i + 30] + ADD r6, r6, r7 @ x[i + 1] + x[i + 29] + LDRSH r8, [r4, #4] @ load x[i + 2] + LDRSH r9, [r4, #56] @ load x[i + 28] + + SMULBB r14, r1, r0 @ (x[i] + x[i + 30]) * fir_7k[0] + ADD r8, r8, r9 @ x[i + 2] + x[i + 28] + SMLABT r14, r6, r0, r14 @ (x[i + 1] + x[i + 29]) * fir_7k[1] + + LDR r0, [r10, #4] + LDRSH r1, [r4, #6] @ load x[i+3] + LDRSH r2, [r4, #54] @ load x[i+27] + LDRSH r6, [r4, #8] @ load x[i+4] + LDRSH r7, [r4, #52] @ load x[i+26] + ADD r1, r1, r2 @ x[i+3] + x[i+27] + ADD r6, r6, r7 @ x[i+4] + x[i+26] + SMLABB r14, r8, r0, r14 @ (x[i + 2] + x[i + 28]) * fir_7k[2] + 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] + + 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 r7, [r4, #46] @ x[i+23] + SMLABT r14, r8, r0, r14 @ (x[i+5] + x[i+25]) * fir_7k[5] + LDR r0, [r10, #12] + ADD r1, r1, r2 @ (x[i+6] + x[i+24]) + 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] + LDR r0, [r10, #16] + LDRSH r1, [r4, #18] @ x[i+9] + LDRSH r2, [r4, #42] @ x[i+21] + LDRSH r6, [r4, #20] @ x[i+10] + LDRSH r7, [r4, #40] @ x[i+20] + ADD r8, r8, r9 @ (x[i+8] + x[i+22]) + ADD r1, r1, r2 @ (x[i+9] + x[i+21]) + ADD r6, r6, r7 @ (x[i+10] + x[i+20]) + SMLABB r14, r8, r0, r14 @ (x[i+8] + x[i+22]) * fir_7k[8] + LDRSH r8, [r4, #22] @ x[i+11] + LDRSH r9, [r4, #38] @ x[i+19] + SMLABT r14, r1, r0, r14 @ (x[i+9] + x[i+21]) * fir_7k[9] + LDR r0, [r10, #20] + LDRSH r1, [r4, #24] @ x[i+12] + 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]) + 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] + ADD r1, r1, r2 @ x[i+12] + x[i+18] + 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] + SMLABT r14, r6, r0, r14 @ (x[i+13] + x[i+17]) * fir_7k[13] + 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] + + ADD r5, r5, #1 + ADD r14, r14, #0x4000 + ADD r4, r4, #2 + MOV r1, r14, ASR #15 + CMP r5, #80 + STRH r1, [r3], #2 @signal[i] = (L_tmp + 0x4000) >> 15 + 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} + +Lable1: + .word fir_6k_7k + @ENDFUNC + .END + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s index 6416634..70464e4 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s @@ -1,226 +1,226 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@ -@void Syn_filt_32( -@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ -@ Word16 m, /* (i) : order of LP filter */ -@ Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ -@ Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ -@ Word16 sig_hi[], /* (o) /16 : synthesis high */ -@ Word16 sig_lo[], /* (o) /16 : synthesis low */ -@ Word16 lg /* (i) : size of filtering */ -@) -@*************************************************************** -@ -@ a[] --- r0 -@ m --- r1 -@ exc[] --- r2 -@ Qnew --- r3 -@ sig_hi[] --- r4 -@ sig_lo[] --- r5 -@ lg --- r6 - - .section .text - .global Syn_filt_32_asm - -Syn_filt_32_asm: - - STMFD r13!, {r4 - r12, r14} - LDR r4, [r13, #40] @ get sig_hi[] address - LDR r5, [r13, #44] @ get sig_lo[] address - - LDRSH r6, [r0] @ load Aq[0] - ADD r7, r3, #4 @ 4 + Q_new - MOV r3, r6, ASR r7 @ a0 = Aq[0] >> (4 + Q_new) - - LDR r14, =0xffff - LDRSH r6, [r0, #2] @ load Aq[1] - LDRSH r7, [r0, #4] @ load Aq[2] - LDRSH r8, [r0, #6] @ load Aq[3] - LDRSH r9, [r0, #8] @ load Aq[4] - AND r6, r6, r14 - 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 r11, [r13, #-8] - - LDRSH r6, [r0, #10] @ load Aq[5] - LDRSH r7, [r0, #12] @ load Aq[6] - LDRSH r8, [r0, #14] @ load Aq[7] - LDRSH r9, [r0, #16] @ load Aq[8] - AND r6, r6, r14 - AND r8, r8, r14 - ORR r10, r6, r7, LSL #16 @ Aq[6] -- Aq[5] - ORR r11, r8, r9, LSL #16 @ Aq[8] -- Aq[7] - STR r10, [r13, #-12] - STR r11, [r13, #-16] - - LDRSH r6, [r0, #18] @ load Aq[9] - 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 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] - - LDRSH r6, [r0, #26] @ load Aq[13] - LDRSH r7, [r0, #28] @ load Aq[14] - LDRSH r8, [r0, #30] @ load Aq[15] - LDRSH r9, [r0, #32] @ load Aq[16] - AND r6, r6, r14 - AND r8, r8, r14 - ORR r10, r6, r7, LSL #16 @ Aq[14] -- Aq[13] - ORR r11, r8, r9, LSL #16 @ Aq[16] -- Aq[15] - STR r10, [r13, #-28] - STR r11, [r13, #-32] - - MOV r8, #0 @ i = 0 - -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] - LDRSH r9, [r5, #-6] @ load sig_lo[i-3] - LDRSH r10, [r5, #-8] @ load sig_lo[i-4] - - SMULBB r12, r6, r11 @ sig_lo[i-1] * Aq[1] - - LDRSH r6, [r5, #-10] @ load sig_lo[i-5] - SMLABT r12, r7, r11, r12 @ sig_lo[i-2] * Aq[2] - LDR r11, [r13, #-8] @ Aq[4] -- Aq[3] - LDRSH r7, [r5, #-12] @ load sig_lo[i-6] - SMLABB r12, r9, r11, r12 @ sig_lo[i-3] * Aq[3] - LDRSH r9, [r5, #-14] @ load sig_lo[i-7] - SMLABT r12, r10, r11, r12 @ sig_lo[i-4] * Aq[4] - LDR r11, [r13, #-12] @ Aq[6] -- Aq[5] - LDRSH r10, [r5, #-16] @ load sig_lo[i-8] - SMLABB r12, r6, r11, r12 @ sig_lo[i-5] * Aq[5] - LDRSH r6, [r5, #-18] @ load sig_lo[i-9] - SMLABT r12, r7, r11, r12 @ sig_lo[i-6] * Aq[6] - LDR r11, [r13, #-16] @ Aq[8] -- Aq[7] - LDRSH r7, [r5, #-20] @ load sig_lo[i-10] - SMLABB r12, r9, r11, r12 @ sig_lo[i-7] * Aq[7] - LDRSH r9, [r5, #-22] @ load sig_lo[i-11] - SMLABT r12, r10, r11, r12 @ sig_lo[i-8] * Aq[8] - LDR r11, [r13, #-20] @ Aq[10] -- Aq[9] - LDRSH r10,[r5, #-24] @ load sig_lo[i-12] - SMLABB r12, r6, r11, r12 @ sig_lo[i-9] * Aq[9] - LDRSH r6, [r5, #-26] @ load sig_lo[i-13] - SMLABT r12, r7, r11, r12 @ sig_lo[i-10] * Aq[10] - LDR r11, [r13, #-24] @ Aq[12] -- Aq[11] - LDRSH r7, [r5, #-28] @ load sig_lo[i-14] - SMLABB r12, r9, r11, r12 @ sig_lo[i-11] * Aq[11] - LDRSH r9, [r5, #-30] @ load sig_lo[i-15] - SMLABT r12, r10, r11, r12 @ sig_lo[i-12] * Aq[12] - - LDR r11, [r13, #-28] @ Aq[14] -- Aq[13] - 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] - 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 - 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 - - - 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] - 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] - LDRSH r6, [r4, #-10] @ load sig_hi[i-5] - SMLABT r12, r7, r11, r12 @ sig_hi[i-2] * Aq[2] - - LDR r11, [r13, #-8] @ Aq[4] -- Aq[3] - LDRSH r7, [r4, #-12] @ load sig_hi[i-6] - - SMLABB r12, r9, r11, r12 @ sig_hi[i-3] * Aq[3] - LDRSH r9, [r4, #-14] @ load sig_hi[i-7] - - SMLABT r12, r10, r11, r12 @ sig_hi[i-4] * Aq[4] - - LDR r11, [r13, #-12] @ Aq[6] -- Aq[5] - LDRSH r10, [r4, #-16] @ load sig_hi[i-8] - - SMLABB r12, r6, r11, r12 @ sig_hi[i-5] * Aq[5] - - LDRSH r6, [r4, #-18] @ load sig_hi[i-9] - SMLABT r12, r7, r11, r12 @ sig_hi[i-6] * Aq[6] - - LDR r11, [r13, #-16] @ Aq[8] -- Aq[7] - LDRSH r7, [r4, #-20] @ load sig_hi[i-10] - - SMLABB r12, r9, r11, r12 @ sig_hi[i-7] * Aq[7] - - LDRSH r9, [r4, #-22] @ load sig_hi[i-11] - - SMLABT r12, r10, r11, r12 @ sig_hi[i-8] * Aq[8] - - LDR r11, [r13, #-20] @ Aq[10] -- Aq[9] - LDRSH r10,[r4, #-24] @ load sig_hi[i-12] - - SMLABB r12, r6, r11, r12 @ sig_hi[i-9] * Aq[9] - LDRSH r6, [r4, #-26] @ load sig_hi[i-13] - SMLABT r12, r7, r11, r12 @ sig_hi[i-10] * Aq[10] - - LDR r11, [r13, #-24] @ Aq[12] -- Aq[11] - LDRSH r7, [r4, #-28] @ load sig_hi[i-14] - SMLABB r12, r9, r11, r12 @ sig_hi[i-11] * Aq[11] - LDRSH r9, [r4, #-30] @ load sig_hi[i-15] - SMLABT r12, r10, r11, r12 @ sig_hi[i-12] * Aq[12] - - LDR r11, [r13, #-28] @ Aq[14] -- Aq[13] - 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] - ADD r6, r12, r12 @ r12 << 1 - 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 - STRH r7, [r4], #2 @ sig_hi[i] = L_tmp >> 16 - SUB r9, r14, r7, LSL #12 @ sig_lo[i] = L_tmp - (sig_hi[i] << 12) - - ADD r8, r8, #1 - STRH r9, [r5], #2 - CMP r8, #64 - BLT LOOP - -Syn_filt_32_end: - - LDMFD r13!, {r4 - r12, r15} - @ENDFUNC - .END - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@ +@void Syn_filt_32( +@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ +@ Word16 m, /* (i) : order of LP filter */ +@ Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ +@ Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ +@ Word16 sig_hi[], /* (o) /16 : synthesis high */ +@ Word16 sig_lo[], /* (o) /16 : synthesis low */ +@ Word16 lg /* (i) : size of filtering */ +@) +@*************************************************************** +@ +@ a[] --- r0 +@ m --- r1 +@ exc[] --- r2 +@ Qnew --- r3 +@ sig_hi[] --- r4 +@ sig_lo[] --- r5 +@ lg --- r6 + + .section .text + .global Syn_filt_32_asm + +Syn_filt_32_asm: + + STMFD r13!, {r4 - r12, r14} + LDR r4, [r13, #40] @ get sig_hi[] address + LDR r5, [r13, #44] @ get sig_lo[] address + + LDRSH r6, [r0] @ load Aq[0] + ADD r7, r3, #4 @ 4 + Q_new + MOV r3, r6, ASR r7 @ a0 = Aq[0] >> (4 + Q_new) + + LDR r14, =0xffff + LDRSH r6, [r0, #2] @ load Aq[1] + LDRSH r7, [r0, #4] @ load Aq[2] + LDRSH r8, [r0, #6] @ load Aq[3] + LDRSH r9, [r0, #8] @ load Aq[4] + AND r6, r6, r14 + 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 r11, [r13, #-8] + + LDRSH r6, [r0, #10] @ load Aq[5] + LDRSH r7, [r0, #12] @ load Aq[6] + LDRSH r8, [r0, #14] @ load Aq[7] + LDRSH r9, [r0, #16] @ load Aq[8] + AND r6, r6, r14 + AND r8, r8, r14 + ORR r10, r6, r7, LSL #16 @ Aq[6] -- Aq[5] + ORR r11, r8, r9, LSL #16 @ Aq[8] -- Aq[7] + STR r10, [r13, #-12] + STR r11, [r13, #-16] + + LDRSH r6, [r0, #18] @ load Aq[9] + 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 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] + + LDRSH r6, [r0, #26] @ load Aq[13] + LDRSH r7, [r0, #28] @ load Aq[14] + LDRSH r8, [r0, #30] @ load Aq[15] + LDRSH r9, [r0, #32] @ load Aq[16] + AND r6, r6, r14 + AND r8, r8, r14 + ORR r10, r6, r7, LSL #16 @ Aq[14] -- Aq[13] + ORR r11, r8, r9, LSL #16 @ Aq[16] -- Aq[15] + STR r10, [r13, #-28] + STR r11, [r13, #-32] + + MOV r8, #0 @ i = 0 + +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] + LDRSH r9, [r5, #-6] @ load sig_lo[i-3] + LDRSH r10, [r5, #-8] @ load sig_lo[i-4] + + SMULBB r12, r6, r11 @ sig_lo[i-1] * Aq[1] + + LDRSH r6, [r5, #-10] @ load sig_lo[i-5] + SMLABT r12, r7, r11, r12 @ sig_lo[i-2] * Aq[2] + LDR r11, [r13, #-8] @ Aq[4] -- Aq[3] + LDRSH r7, [r5, #-12] @ load sig_lo[i-6] + SMLABB r12, r9, r11, r12 @ sig_lo[i-3] * Aq[3] + LDRSH r9, [r5, #-14] @ load sig_lo[i-7] + SMLABT r12, r10, r11, r12 @ sig_lo[i-4] * Aq[4] + LDR r11, [r13, #-12] @ Aq[6] -- Aq[5] + LDRSH r10, [r5, #-16] @ load sig_lo[i-8] + SMLABB r12, r6, r11, r12 @ sig_lo[i-5] * Aq[5] + LDRSH r6, [r5, #-18] @ load sig_lo[i-9] + SMLABT r12, r7, r11, r12 @ sig_lo[i-6] * Aq[6] + LDR r11, [r13, #-16] @ Aq[8] -- Aq[7] + LDRSH r7, [r5, #-20] @ load sig_lo[i-10] + SMLABB r12, r9, r11, r12 @ sig_lo[i-7] * Aq[7] + LDRSH r9, [r5, #-22] @ load sig_lo[i-11] + SMLABT r12, r10, r11, r12 @ sig_lo[i-8] * Aq[8] + LDR r11, [r13, #-20] @ Aq[10] -- Aq[9] + LDRSH r10,[r5, #-24] @ load sig_lo[i-12] + SMLABB r12, r6, r11, r12 @ sig_lo[i-9] * Aq[9] + LDRSH r6, [r5, #-26] @ load sig_lo[i-13] + SMLABT r12, r7, r11, r12 @ sig_lo[i-10] * Aq[10] + LDR r11, [r13, #-24] @ Aq[12] -- Aq[11] + LDRSH r7, [r5, #-28] @ load sig_lo[i-14] + SMLABB r12, r9, r11, r12 @ sig_lo[i-11] * Aq[11] + LDRSH r9, [r5, #-30] @ load sig_lo[i-15] + SMLABT r12, r10, r11, r12 @ sig_lo[i-12] * Aq[12] + + LDR r11, [r13, #-28] @ Aq[14] -- Aq[13] + 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] + 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 + 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 + + + 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] + 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] + LDRSH r6, [r4, #-10] @ load sig_hi[i-5] + SMLABT r12, r7, r11, r12 @ sig_hi[i-2] * Aq[2] + + LDR r11, [r13, #-8] @ Aq[4] -- Aq[3] + LDRSH r7, [r4, #-12] @ load sig_hi[i-6] + + SMLABB r12, r9, r11, r12 @ sig_hi[i-3] * Aq[3] + LDRSH r9, [r4, #-14] @ load sig_hi[i-7] + + SMLABT r12, r10, r11, r12 @ sig_hi[i-4] * Aq[4] + + LDR r11, [r13, #-12] @ Aq[6] -- Aq[5] + LDRSH r10, [r4, #-16] @ load sig_hi[i-8] + + SMLABB r12, r6, r11, r12 @ sig_hi[i-5] * Aq[5] + + LDRSH r6, [r4, #-18] @ load sig_hi[i-9] + SMLABT r12, r7, r11, r12 @ sig_hi[i-6] * Aq[6] + + LDR r11, [r13, #-16] @ Aq[8] -- Aq[7] + LDRSH r7, [r4, #-20] @ load sig_hi[i-10] + + SMLABB r12, r9, r11, r12 @ sig_hi[i-7] * Aq[7] + + LDRSH r9, [r4, #-22] @ load sig_hi[i-11] + + SMLABT r12, r10, r11, r12 @ sig_hi[i-8] * Aq[8] + + LDR r11, [r13, #-20] @ Aq[10] -- Aq[9] + LDRSH r10,[r4, #-24] @ load sig_hi[i-12] + + SMLABB r12, r6, r11, r12 @ sig_hi[i-9] * Aq[9] + LDRSH r6, [r4, #-26] @ load sig_hi[i-13] + SMLABT r12, r7, r11, r12 @ sig_hi[i-10] * Aq[10] + + LDR r11, [r13, #-24] @ Aq[12] -- Aq[11] + LDRSH r7, [r4, #-28] @ load sig_hi[i-14] + SMLABB r12, r9, r11, r12 @ sig_hi[i-11] * Aq[11] + LDRSH r9, [r4, #-30] @ load sig_hi[i-15] + SMLABT r12, r10, r11, r12 @ sig_hi[i-12] * Aq[12] + + LDR r11, [r13, #-28] @ Aq[14] -- Aq[13] + 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] + ADD r6, r12, r12 @ r12 << 1 + 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 + STRH r7, [r4], #2 @ sig_hi[i] = L_tmp >> 16 + SUB r9, r14, r7, LSL #12 @ sig_lo[i] = L_tmp - (sig_hi[i] << 12) + + ADD r8, r8, #1 + STRH r9, [r5], #2 + CMP r8, #64 + BLT LOOP + +Syn_filt_32_end: + + LDMFD r13!, {r4 - r12, r15} + @ENDFUNC + .END + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s index 441b984..8f32733 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s @@ -1,151 +1,151 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@static void cor_h_vec_012( -@ Word16 h[], /* (i) scaled impulse response */ -@ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ -@ Word16 track, /* (i) track to use */ -@ Word16 sign[], /* (i) sign vector */ -@ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ -@ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ -@ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ -@) -@r0 ---- h[] -@r1 ---- vec[] -@r2 ---- track -@r3 ---- sign[] -@r4 ---- rrixix[][NB_POS] -@r5 ---- cor_1[] -@r6 ---- cor_2[] - - - .section .text - .global cor_h_vec_012_asm - -cor_h_vec_012_asm: - - STMFD r13!, {r4 - r12, r14} - LDR r4, [r13, #40] @load rrixix[][NB_POS] - ADD r7, r4, r2, LSL #5 @r7 --- p0 = rrixix[track] - MOV r4, #0 @i=0 - - @r0 --- h[], r1 --- vec[], r2 --- pos - @r3 --- sign[], r4 --- i, r7 --- p0 -LOOPi: - MOV r5, #0 @L_sum1 = 0 - MOV r6, #0 @L_sum2 = 0 - ADD r9, r1, r2, LSL #1 @p2 = &vec[pos] - MOV r10, r0 @p1 = h - RSB r11, r2, #62 @j=62-pos - -LOOPj1: - 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 - BGE LOOPj1 - - LDRSH r12, [r10], #2 @*p1++ - MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2) - MLA r5, r12, r14, r5 - MOV r14, #0x8000 - MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) - ADD r10, r6, r14 - ADD r9, r5, r14 - MOV r5, r9, ASR #16 - MOV r6, r10, ASR #16 - ADD r9, r3, r2, LSL #1 @address of sign[pos] - ADD r8, r7, #32 - LDRSH r10, [r9], #2 @sign[pos] - LDRSH r11, [r9] @sign[pos + 1] - MUL r12, r5, r10 - MUL r14, r6, r11 - MOV r5, r12, ASR #15 - MOV r6, r14, ASR #15 - LDR r9, [r13, #44] - LDR r12, [r13, #48] - LDRSH r10, [r7], #2 @*p0++ - LDRSH r11, [r8] @*p3++ - ADD r9, r9, r4, LSL #1 - ADD r12, r12, r4, LSL #1 - ADD r5, r5, r10 - ADD r6, r6, r11 - STRH r5, [r9] - 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] - MOV r10, r0 @p1 = h - RSB r11, r2, #62 @j=62-pos - ADD r4, r4, #1 @i++ - -LOOPj2: - 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 - BGE LOOPj2 - - LDRSH r12, [r10], #2 @*p1++ - MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2) - MLA r5, r12, r14, r5 - MOV r14, #0x8000 - MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) - ADD r10, r6, r14 - ADD r9, r5, r14 - - MOV r5, r9, ASR #16 - MOV r6, r10, ASR #16 - ADD r9, r3, r2, LSL #1 @address of sign[pos] - ADD r8, r7, #32 - LDRSH r10, [r9], #2 @sign[pos] - LDRSH r11, [r9] @sign[pos + 1] - MUL r12, r5, r10 - MUL r14, r6, r11 - MOV r5, r12, ASR #15 - MOV r6, r14, ASR #15 - LDR r9, [r13, #44] - LDR r12, [r13, #48] - LDRSH r10, [r7], #2 @*p0++ - LDRSH r11, [r8] @*p3++ - ADD r9, r9, r4, LSL #1 - ADD r12, r12, r4, LSL #1 - ADD r5, r5, r10 - ADD r6, r6, r11 - STRH r5, [r9] - STRH r6, [r12] - 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 - - - - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@static void cor_h_vec_012( +@ Word16 h[], /* (i) scaled impulse response */ +@ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ +@ Word16 track, /* (i) track to use */ +@ Word16 sign[], /* (i) sign vector */ +@ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ +@ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ +@ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ +@) +@r0 ---- h[] +@r1 ---- vec[] +@r2 ---- track +@r3 ---- sign[] +@r4 ---- rrixix[][NB_POS] +@r5 ---- cor_1[] +@r6 ---- cor_2[] + + + .section .text + .global cor_h_vec_012_asm + +cor_h_vec_012_asm: + + STMFD r13!, {r4 - r12, r14} + LDR r4, [r13, #40] @load rrixix[][NB_POS] + ADD r7, r4, r2, LSL #5 @r7 --- p0 = rrixix[track] + MOV r4, #0 @i=0 + + @r0 --- h[], r1 --- vec[], r2 --- pos + @r3 --- sign[], r4 --- i, r7 --- p0 +LOOPi: + MOV r5, #0 @L_sum1 = 0 + MOV r6, #0 @L_sum2 = 0 + ADD r9, r1, r2, LSL #1 @p2 = &vec[pos] + MOV r10, r0 @p1 = h + RSB r11, r2, #62 @j=62-pos + +LOOPj1: + 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 + BGE LOOPj1 + + LDRSH r12, [r10], #2 @*p1++ + MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2) + MLA r5, r12, r14, r5 + MOV r14, #0x8000 + MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) + ADD r10, r6, r14 + ADD r9, r5, r14 + MOV r5, r9, ASR #16 + MOV r6, r10, ASR #16 + ADD r9, r3, r2, LSL #1 @address of sign[pos] + ADD r8, r7, #32 + LDRSH r10, [r9], #2 @sign[pos] + LDRSH r11, [r9] @sign[pos + 1] + MUL r12, r5, r10 + MUL r14, r6, r11 + MOV r5, r12, ASR #15 + MOV r6, r14, ASR #15 + LDR r9, [r13, #44] + LDR r12, [r13, #48] + LDRSH r10, [r7], #2 @*p0++ + LDRSH r11, [r8] @*p3++ + ADD r9, r9, r4, LSL #1 + ADD r12, r12, r4, LSL #1 + ADD r5, r5, r10 + ADD r6, r6, r11 + STRH r5, [r9] + 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] + MOV r10, r0 @p1 = h + RSB r11, r2, #62 @j=62-pos + ADD r4, r4, #1 @i++ + +LOOPj2: + 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 + BGE LOOPj2 + + LDRSH r12, [r10], #2 @*p1++ + MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2) + MLA r5, r12, r14, r5 + MOV r14, #0x8000 + MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) + ADD r10, r6, r14 + ADD r9, r5, r14 + + MOV r5, r9, ASR #16 + MOV r6, r10, ASR #16 + ADD r9, r3, r2, LSL #1 @address of sign[pos] + ADD r8, r7, #32 + LDRSH r10, [r9], #2 @sign[pos] + LDRSH r11, [r9] @sign[pos + 1] + MUL r12, r5, r10 + MUL r14, r6, r11 + MOV r5, r12, ASR #15 + MOV r6, r14, ASR #15 + LDR r9, [r13, #44] + LDR r12, [r13, #48] + LDRSH r10, [r7], #2 @*p0++ + LDRSH r11, [r8] @*p3++ + ADD r9, r9, r4, LSL #1 + ADD r12, r12, r4, LSL #1 + ADD r5, r5, r10 + ADD r6, r6, r11 + STRH r5, [r9] + STRH r6, [r12] + 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 + + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s index d5dd8f0..d7b4509 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s @@ -1,460 +1,460 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@ -@void Pred_lt4( -@ Word16 exc[], /* in/out: excitation buffer */ -@ Word16 T0, /* input : integer pitch lag */ -@ Word16 frac, /* input : fraction of lag */ -@ Word16 L_subfr /* input : subframe size */ -@ ) - -@****************************** -@ ARM Register -@****************************** -@ r0 --- exc[] -@ r1 --- T0 -@ r2 --- frac -@ r3 --- L_subfr - - .section .text - .global pred_lt4_asm - .extern inter4_2 - -pred_lt4_asm: - - 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 - CMP r2, #0 - ADDLT r2, r2, #4 @frac += UP_SAMP - SUBLT r5, r5, #2 @x-- - SUB r5, r5, #30 @x -= 15 - RSB r4, r2, #3 @k = 3 - frac - LDR r6, Table - MOV r8, r4, LSL #6 - @MOV r7, #0 @j = 0 - ADD r8, r6, r8 @ptr2 = &(inter4_2[k][0]) - - MOV r1, r5 - MOV r5, #0x8000 - MOV r14, #21 -@ used register - @r0 --- exc[] r1 --- x r7 --- j r8 --- ptr2 r5 --- 0x8000 -THREE_LOOP: - - @MOV r1, r5 @ptr1 = x - MOV r2, r8 @ptr = ptr2 - LDR r3, [r2], #4 @h[0], h[1] - LDRSH r4, [r1], #2 @x[0] - LDRSH r6, [r1], #2 @x[1] - LDRSH r9, [r1], #2 @x[2] - - SMULBB r10, r4, r3 @x[0] * h[0] - SMULBB r11, r6, r3 @x[1] * h[0] - SMULBB r12, r9, r3 @x[2] * h[0] - - LDRSH r4, [r1], #2 @x[3] - SMLABT r10, r6, r3, r10 @x[1] * h[1] - SMLABT r11, r9, r3, r11 @x[2] * h[1] - SMLABT r12, r4, r3, r12 @x[3] * h[1] - - LDR r3, [r2], #4 @h[2], h[3] - LDRSH r6, [r1], #2 @x[4] - SMLABB r10, r9, r3, r10 @x[2] * h[2] - SMLABB r11, r4, r3, r11 @x[3] * h[2] - SMLABB r12, r6, r3, r12 @x[4] * h[2] - - LDRSH r9, [r1], #2 @x[5] - SMLABT r10, r4, r3, r10 @x[3] * h[3] - SMLABT r11, r6, r3, r11 @x[4] * h[3] - SMLABT r12, r9, r3, r12 @x[5] * h[3] - - LDR r3, [r2], #4 @h[4], h[5] - LDRSH r4, [r1], #2 @x[6] - SMLABB r10, r6, r3, r10 @x[4] * h[4] - SMLABB r11, r9, r3, r11 @x[5] * h[4] - SMLABB r12, r4, r3, r12 @x[6] * h[4] - - LDRSH r6, [r1], #2 @x[7] - SMLABT r10, r9, r3, r10 @x[5] * h[5] - SMLABT r11, r4, r3, r11 @x[6] * h[5] - SMLABT r12, r6, r3, r12 @x[7] * h[5] - - LDR r3, [r2], #4 @h[6], h[7] - LDRSH r9, [r1], #2 @x[8] - SMLABB r10, r4, r3, r10 @x[6] * h[6] - SMLABB r11, r6, r3, r11 @x[7] * h[6] - SMLABB r12, r9, r3, r12 @x[8] * h[6] - - LDRSH r4, [r1], #2 @x[9] - SMLABT r10, r6, r3, r10 @x[7] * h[7] - SMLABT r11, r9, r3, r11 @x[8] * h[7] - SMLABT r12, r4, r3, r12 @x[9] * h[7] - - LDR r3, [r2], #4 @h[8], h[9] - LDRSH r6, [r1], #2 @x[10] - SMLABB r10, r9, r3, r10 @x[8] * h[8] - SMLABB r11, r4, r3, r11 @x[9] * h[8] - SMLABB r12, r6, r3, r12 @x[10] * h[8] - - LDRSH r9, [r1], #2 @x[11] - SMLABT r10, r4, r3, r10 @x[9] * h[9] - SMLABT r11, r6, r3, r11 @x[10] * h[9] - SMLABT r12, r9, r3, r12 @x[11] * h[9] - - LDR r3, [r2], #4 @h[10], h[11] - LDRSH r4, [r1], #2 @x[12] - SMLABB r10, r6, r3, r10 @x[10] * h[10] - SMLABB r11, r9, r3, r11 @x[11] * h[10] - SMLABB r12, r4, r3, r12 @x[12] * h[10] - - LDRSH r6, [r1], #2 @x[13] - SMLABT r10, r9, r3, r10 @x[11] * h[11] - SMLABT r11, r4, r3, r11 @x[12] * h[11] - SMLABT r12, r6, r3, r12 @x[13] * h[11] - - LDR r3, [r2], #4 @h[12], h[13] - LDRSH r9, [r1], #2 @x[14] - SMLABB r10, r4, r3, r10 @x[12] * h[12] - SMLABB r11, r6, r3, r11 @x[13] * h[12] - SMLABB r12, r9, r3, r12 @x[14] * h[12] - - LDRSH r4, [r1], #2 @x[15] - SMLABT r10, r6, r3, r10 @x[13] * h[13] - SMLABT r11, r9, r3, r11 @x[14] * h[13] - SMLABT r12, r4, r3, r12 @x[15] * h[13] - - LDR r3, [r2], #4 @h[14], h[15] - LDRSH r6, [r1], #2 @x[16] - SMLABB r10, r9, r3, r10 @x[14] * h[14] - SMLABB r11, r4, r3, r11 @x[15] * h[14] - SMLABB r12, r6, r3, r12 @x[16] * h[14] - - LDRSH r9, [r1], #2 @x[17] - SMLABT r10, r4, r3, r10 @x[15] * h[15] - SMLABT r11, r6, r3, r11 @x[16] * h[15] - SMLABT r12, r9, r3, r12 @x[17] * h[15] - - LDR r3, [r2], #4 @h[16], h[17] - LDRSH r4, [r1], #2 @x[18] - SMLABB r10, r6, r3, r10 @x[16] * h[16] - SMLABB r11, r9, r3, r11 @x[17] * h[16] - SMLABB r12, r4, r3, r12 @x[18] * h[16] - - LDRSH r6, [r1], #2 @x[19] - SMLABT r10, r9, r3, r10 @x[17] * h[17] - SMLABT r11, r4, r3, r11 @x[18] * h[17] - SMLABT r12, r6, r3, r12 @x[19] * h[17] - - LDR r3, [r2], #4 @h[18], h[19] - LDRSH r9, [r1], #2 @x[20] - SMLABB r10, r4, r3, r10 @x[18] * h[18] - SMLABB r11, r6, r3, r11 @x[19] * h[18] - SMLABB r12, r9, r3, r12 @x[20] * h[18] - - LDRSH r4, [r1], #2 @x[21] - SMLABT r10, r6, r3, r10 @x[19] * h[19] - SMLABT r11, r9, r3, r11 @x[20] * h[19] - SMLABT r12, r4, r3, r12 @x[21] * h[19] - - LDR r3, [r2], #4 @h[20], h[21] - LDRSH r6, [r1], #2 @x[22] - SMLABB r10, r9, r3, r10 @x[20] * h[20] - SMLABB r11, r4, r3, r11 @x[21] * h[20] - SMLABB r12, r6, r3, r12 @x[22] * h[20] - - LDRSH r9, [r1], #2 @x[23] - SMLABT r10, r4, r3, r10 @x[21] * h[21] - SMLABT r11, r6, r3, r11 @x[22] * h[21] - SMLABT r12, r9, r3, r12 @x[23] * h[21] - - LDR r3, [r2], #4 @h[22], h[23] - LDRSH r4, [r1], #2 @x[24] - SMLABB r10, r6, r3, r10 @x[22] * h[22] - SMLABB r11, r9, r3, r11 @x[23] * h[22] - SMLABB r12, r4, r3, r12 @x[24] * h[22] - - LDRSH r6, [r1], #2 @x[25] - SMLABT r10, r9, r3, r10 @x[23] * h[23] - SMLABT r11, r4, r3, r11 @x[24] * h[23] - SMLABT r12, r6, r3, r12 @x[25] * h[23] - - LDR r3, [r2], #4 @h[24], h[25] - LDRSH r9, [r1], #2 @x[26] - SMLABB r10, r4, r3, r10 @x[24] * h[24] - SMLABB r11, r6, r3, r11 @x[25] * h[24] - SMLABB r12, r9, r3, r12 @x[26] * h[24] - - LDRSH r4, [r1], #2 @x[27] - SMLABT r10, r6, r3, r10 @x[25] * h[25] - SMLABT r11, r9, r3, r11 @x[26] * h[25] - SMLABT r12, r4, r3, r12 @x[27] * h[25] - - LDR r3, [r2], #4 @h[26], h[27] - LDRSH r6, [r1], #2 @x[28] - SMLABB r10, r9, r3, r10 @x[26] * h[26] - SMLABB r11, r4, r3, r11 @x[27] * h[26] - SMLABB r12, r6, r3, r12 @x[28] * h[26] - - LDRSH r9, [r1], #2 @x[29] - SMLABT r10, r4, r3, r10 @x[27] * h[27] - SMLABT r11, r6, r3, r11 @x[28] * h[27] - SMLABT r12, r9, r3, r12 @x[29] * h[27] - - LDR r3, [r2], #4 @h[28], h[29] - LDRSH r4, [r1], #2 @x[30] - SMLABB r10, r6, r3, r10 @x[28] * h[28] - SMLABB r11, r9, r3, r11 @x[29] * h[28] - SMLABB r12, r4, r3, r12 @x[30] * h[28] - - LDRSH r6, [r1], #2 @x[31] - SMLABT r10, r9, r3, r10 @x[29] * h[29] - SMLABT r11, r4, r3, r11 @x[30] * h[29] - SMLABT r12, r6, r3, r12 @x[31] * h[29] - - LDR r3, [r2], #4 @h[30], h[31] - LDRSH r9, [r1], #2 @x[32] - SMLABB r10, r4, r3, r10 @x[30] * h[30] - SMLABB r11, r6, r3, r11 @x[31] * h[30] - SMLABB r12, r9, r3, r12 @x[32] * h[30] - - LDRSH r4, [r1], #-60 @x[33] - SMLABT r10, r6, r3, r10 @x[31] * h[31] - SMLABT r11, r9, r3, r11 @x[32] * h[31] - SMLABT r12, r4, r3, r12 @x[33] * h[31] - - @SSAT r10, #32, r10, LSL #2 - @SSAT r11, #32, r11, LSL #2 - @SSAT r12, #32, r12, LSL #2 - - MOV r10, r10, LSL #1 - MOV r11, r11, LSL #1 - MOV r12, r12, LSL #1 - - QADD r10, r10, r10 - QADD r11, r11, r11 - QADD r12, r12, r12 - - QADD r10, r10, r5 - QADD r11, r11, r5 - QADD r12, r12, r5 - - SUBS r14, r14, #1 - - MOV r10, r10, ASR #16 - MOV r11, r11, ASR #16 - MOV r12, r12, ASR #16 - - STRH r10, [r0], #2 - STRH r11, [r0], #2 - STRH r12, [r0], #2 - BNE THREE_LOOP - - MOV r2, r8 @ptr = ptr2 - -Last2LOOP: - - LDR r3, [r2], #4 @h[0], h[1] - LDRSH r4, [r1], #2 @x[0] - LDRSH r6, [r1], #2 @x[1] - LDRSH r9, [r1], #2 @x[2] - - SMULBB r10, r4, r3 @x[0] * h[0] - SMULBB r11, r6, r3 @x[1] * h[0] - - SMLABT r10, r6, r3, r10 @x[1] * h[1] - SMLABT r11, r9, r3, r11 @x[2] * h[1] - - LDR r3, [r2], #4 @h[2], h[3] - LDRSH r4, [r1], #2 @x[3] - LDRSH r6, [r1], #2 @x[4] - - 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] - - LDR r3, [r2], #4 @h[4], h[5] - LDRSH r9, [r1], #2 @x[5] - LDRSH r4, [r1], #2 @x[6] - - SMLABB r10, r6, r3, r10 @x[4] * h[4] - SMLABB r11, r9, r3, r11 @x[5] * h[4] - - SMLABT r10, r9, r3, r10 @x[5] * h[5] - SMLABT r11, r4, r3, r11 @x[6] * h[5] - - LDR r3, [r2], #4 @h[6], h[7] - LDRSH r6, [r1], #2 @x[7] - LDRSH r9, [r1], #2 @x[8] - - SMLABB r10, r4, r3, r10 @x[6] * h[6] - SMLABB r11, r6, r3, r11 @x[7] * h[6] - - SMLABT r10, r6, r3, r10 @x[7] * h[7] - SMLABT r11, r9, r3, r11 @x[8] * h[7] - - LDR r3, [r2], #4 @h[8], h[9] - LDRSH r4, [r1], #2 @x[9] - LDRSH r6, [r1], #2 @x[10] - - SMLABB r10, r9, r3, r10 @x[8] * h[8] - SMLABB r11, r4, r3, r11 @x[9] * h[8] - - SMLABT r10, r4, r3, r10 @x[9] * h[9] - SMLABT r11, r6, r3, r11 @x[10] * h[9] - - LDR r3, [r2], #4 @h[10], h[11] - LDRSH r9, [r1], #2 @x[11] - LDRSH r4, [r1], #2 @x[12] - - SMLABB r10, r6, r3, r10 @x[10] * h[10] - SMLABB r11, r9, r3, r11 @x[11] * h[10] - - SMLABT r10, r9, r3, r10 @x[11] * h[11] - SMLABT r11, r4, r3, r11 @x[12] * h[11] - - LDR r3, [r2], #4 @h[12], h[13] - LDRSH r6, [r1], #2 @x[13] - LDRSH r9, [r1], #2 @x[14] - - SMLABB r10, r4, r3, r10 @x[12] * h[12] - SMLABB r11, r6, r3, r11 @x[13] * h[12] - - SMLABT r10, r6, r3, r10 @x[13] * h[13] - SMLABT r11, r9, r3, r11 @x[14] * h[13] - - LDR r3, [r2], #4 @h[14], h[15] - LDRSH r4, [r1], #2 @x[15] - LDRSH r6, [r1], #2 @x[16] - - SMLABB r10, r9, r3, r10 @x[14] * h[14] - SMLABB r11, r4, r3, r11 @x[15] * h[14] - - SMLABT r10, r4, r3, r10 @x[15] * h[15] - SMLABT r11, r6, r3, r11 @x[16] * h[15] - - LDR r3, [r2], #4 @h[16], h[17] - LDRSH r9, [r1], #2 @x[17] - LDRSH r4, [r1], #2 @x[18] - - SMLABB r10, r6, r3, r10 @x[16] * h[16] - SMLABB r11, r9, r3, r11 @x[17] * h[16] - - SMLABT r10, r9, r3, r10 @x[17] * h[17] - SMLABT r11, r4, r3, r11 @x[18] * h[17] - - LDR r3, [r2], #4 @h[18], h[19] - LDRSH r6, [r1], #2 @x[19] - LDRSH r9, [r1], #2 @x[20] - - SMLABB r10, r4, r3, r10 @x[18] * h[18] - SMLABB r11, r6, r3, r11 @x[19] * h[18] - - SMLABT r10, r6, r3, r10 @x[19] * h[19] - SMLABT r11, r9, r3, r11 @x[20] * h[19] - - LDR r3, [r2], #4 @h[20], h[21] - LDRSH r4, [r1], #2 @x[21] - LDRSH r6, [r1], #2 @x[22] - - SMLABB r10, r9, r3, r10 @x[20] * h[20] - SMLABB r11, r4, r3, r11 @x[21] * h[20] - - SMLABT r10, r4, r3, r10 @x[21] * h[21] - SMLABT r11, r6, r3, r11 @x[22] * h[21] - - LDR r3, [r2], #4 @h[22], h[23] - LDRSH r9, [r1], #2 @x[23] - LDRSH r4, [r1], #2 @x[24] - - SMLABB r10, r6, r3, r10 @x[22] * h[22] - SMLABB r11, r9, r3, r11 @x[23] * h[22] - - SMLABT r10, r9, r3, r10 @x[23] * h[23] - SMLABT r11, r4, r3, r11 @x[24] * h[23] - - LDR r3, [r2], #4 @h[24], h[25] - LDRSH r6, [r1], #2 @x[25] - LDRSH r9, [r1], #2 @x[26] - - SMLABB r10, r4, r3, r10 @x[24] * h[24] - SMLABB r11, r6, r3, r11 @x[25] * h[24] - - SMLABT r10, r6, r3, r10 @x[25] * h[25] - SMLABT r11, r9, r3, r11 @x[26] * h[25] - - LDR r3, [r2], #4 @h[26], h[27] - LDRSH r4, [r1], #2 @x[27] - LDRSH r6, [r1], #2 @x[28] - - SMLABB r10, r9, r3, r10 @x[26] * h[26] - SMLABB r11, r4, r3, r11 @x[27] * h[26] - - SMLABT r10, r4, r3, r10 @x[27] * h[27] - SMLABT r11, r6, r3, r11 @x[28] * h[27] - - LDR r3, [r2], #4 @h[28], h[29] - LDRSH r9, [r1], #2 @x[29] - LDRSH r4, [r1], #2 @x[30] - - SMLABB r10, r6, r3, r10 @x[28] * h[28] - SMLABB r11, r9, r3, r11 @x[29] * h[28] - - SMLABT r10, r9, r3, r10 @x[29] * h[29] - SMLABT r11, r4, r3, r11 @x[30] * h[29] - - LDR r3, [r2], #4 @h[30], h[31] - LDRSH r6, [r1], #2 @x[31] - LDRSH r9, [r1], #2 @x[32] - - SMLABB r10, r4, r3, r10 @x[30] * h[30] - SMLABB r11, r6, r3, r11 @x[31] * h[30] - - SMLABT r10, r6, r3, r10 @x[31] * h[31] - SMLABT r11, r9, r3, r11 @x[32] * h[31] - - @SSAT r10, #32, r10, LSL #2 - @SSAT r11, #32, r11, LSL #2 - MOV r10, r10, LSL #1 - MOV r11, r11, LSL #1 - - QADD r10, r10, r10 - QADD r11, r11, r11 - - QADD r10, r10, r5 - QADD r11, r11, r5 - - MOV r10, r10, ASR #16 - MOV r11, r11, ASR #16 - - STRH r10, [r0], #2 - STRH r11, [r0], #2 - - -pred_lt4_end: - LDMFD r13!, {r4 - r12, r15} - -Table: - .word inter4_2 - @ENDFUNC - .END - - - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@ +@void Pred_lt4( +@ Word16 exc[], /* in/out: excitation buffer */ +@ Word16 T0, /* input : integer pitch lag */ +@ Word16 frac, /* input : fraction of lag */ +@ Word16 L_subfr /* input : subframe size */ +@ ) + +@****************************** +@ ARM Register +@****************************** +@ r0 --- exc[] +@ r1 --- T0 +@ r2 --- frac +@ r3 --- L_subfr + + .section .text + .global pred_lt4_asm + .extern inter4_2 + +pred_lt4_asm: + + 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 + CMP r2, #0 + ADDLT r2, r2, #4 @frac += UP_SAMP + SUBLT r5, r5, #2 @x-- + SUB r5, r5, #30 @x -= 15 + RSB r4, r2, #3 @k = 3 - frac + LDR r6, Table + MOV r8, r4, LSL #6 + @MOV r7, #0 @j = 0 + ADD r8, r6, r8 @ptr2 = &(inter4_2[k][0]) + + MOV r1, r5 + MOV r5, #0x8000 + MOV r14, #21 +@ used register + @r0 --- exc[] r1 --- x r7 --- j r8 --- ptr2 r5 --- 0x8000 +THREE_LOOP: + + @MOV r1, r5 @ptr1 = x + MOV r2, r8 @ptr = ptr2 + LDR r3, [r2], #4 @h[0], h[1] + LDRSH r4, [r1], #2 @x[0] + LDRSH r6, [r1], #2 @x[1] + LDRSH r9, [r1], #2 @x[2] + + SMULBB r10, r4, r3 @x[0] * h[0] + SMULBB r11, r6, r3 @x[1] * h[0] + SMULBB r12, r9, r3 @x[2] * h[0] + + LDRSH r4, [r1], #2 @x[3] + SMLABT r10, r6, r3, r10 @x[1] * h[1] + SMLABT r11, r9, r3, r11 @x[2] * h[1] + SMLABT r12, r4, r3, r12 @x[3] * h[1] + + LDR r3, [r2], #4 @h[2], h[3] + LDRSH r6, [r1], #2 @x[4] + SMLABB r10, r9, r3, r10 @x[2] * h[2] + SMLABB r11, r4, r3, r11 @x[3] * h[2] + SMLABB r12, r6, r3, r12 @x[4] * h[2] + + LDRSH r9, [r1], #2 @x[5] + SMLABT r10, r4, r3, r10 @x[3] * h[3] + SMLABT r11, r6, r3, r11 @x[4] * h[3] + SMLABT r12, r9, r3, r12 @x[5] * h[3] + + LDR r3, [r2], #4 @h[4], h[5] + LDRSH r4, [r1], #2 @x[6] + SMLABB r10, r6, r3, r10 @x[4] * h[4] + SMLABB r11, r9, r3, r11 @x[5] * h[4] + SMLABB r12, r4, r3, r12 @x[6] * h[4] + + LDRSH r6, [r1], #2 @x[7] + SMLABT r10, r9, r3, r10 @x[5] * h[5] + SMLABT r11, r4, r3, r11 @x[6] * h[5] + SMLABT r12, r6, r3, r12 @x[7] * h[5] + + LDR r3, [r2], #4 @h[6], h[7] + LDRSH r9, [r1], #2 @x[8] + SMLABB r10, r4, r3, r10 @x[6] * h[6] + SMLABB r11, r6, r3, r11 @x[7] * h[6] + SMLABB r12, r9, r3, r12 @x[8] * h[6] + + LDRSH r4, [r1], #2 @x[9] + SMLABT r10, r6, r3, r10 @x[7] * h[7] + SMLABT r11, r9, r3, r11 @x[8] * h[7] + SMLABT r12, r4, r3, r12 @x[9] * h[7] + + LDR r3, [r2], #4 @h[8], h[9] + LDRSH r6, [r1], #2 @x[10] + SMLABB r10, r9, r3, r10 @x[8] * h[8] + SMLABB r11, r4, r3, r11 @x[9] * h[8] + SMLABB r12, r6, r3, r12 @x[10] * h[8] + + LDRSH r9, [r1], #2 @x[11] + SMLABT r10, r4, r3, r10 @x[9] * h[9] + SMLABT r11, r6, r3, r11 @x[10] * h[9] + SMLABT r12, r9, r3, r12 @x[11] * h[9] + + LDR r3, [r2], #4 @h[10], h[11] + LDRSH r4, [r1], #2 @x[12] + SMLABB r10, r6, r3, r10 @x[10] * h[10] + SMLABB r11, r9, r3, r11 @x[11] * h[10] + SMLABB r12, r4, r3, r12 @x[12] * h[10] + + LDRSH r6, [r1], #2 @x[13] + SMLABT r10, r9, r3, r10 @x[11] * h[11] + SMLABT r11, r4, r3, r11 @x[12] * h[11] + SMLABT r12, r6, r3, r12 @x[13] * h[11] + + LDR r3, [r2], #4 @h[12], h[13] + LDRSH r9, [r1], #2 @x[14] + SMLABB r10, r4, r3, r10 @x[12] * h[12] + SMLABB r11, r6, r3, r11 @x[13] * h[12] + SMLABB r12, r9, r3, r12 @x[14] * h[12] + + LDRSH r4, [r1], #2 @x[15] + SMLABT r10, r6, r3, r10 @x[13] * h[13] + SMLABT r11, r9, r3, r11 @x[14] * h[13] + SMLABT r12, r4, r3, r12 @x[15] * h[13] + + LDR r3, [r2], #4 @h[14], h[15] + LDRSH r6, [r1], #2 @x[16] + SMLABB r10, r9, r3, r10 @x[14] * h[14] + SMLABB r11, r4, r3, r11 @x[15] * h[14] + SMLABB r12, r6, r3, r12 @x[16] * h[14] + + LDRSH r9, [r1], #2 @x[17] + SMLABT r10, r4, r3, r10 @x[15] * h[15] + SMLABT r11, r6, r3, r11 @x[16] * h[15] + SMLABT r12, r9, r3, r12 @x[17] * h[15] + + LDR r3, [r2], #4 @h[16], h[17] + LDRSH r4, [r1], #2 @x[18] + SMLABB r10, r6, r3, r10 @x[16] * h[16] + SMLABB r11, r9, r3, r11 @x[17] * h[16] + SMLABB r12, r4, r3, r12 @x[18] * h[16] + + LDRSH r6, [r1], #2 @x[19] + SMLABT r10, r9, r3, r10 @x[17] * h[17] + SMLABT r11, r4, r3, r11 @x[18] * h[17] + SMLABT r12, r6, r3, r12 @x[19] * h[17] + + LDR r3, [r2], #4 @h[18], h[19] + LDRSH r9, [r1], #2 @x[20] + SMLABB r10, r4, r3, r10 @x[18] * h[18] + SMLABB r11, r6, r3, r11 @x[19] * h[18] + SMLABB r12, r9, r3, r12 @x[20] * h[18] + + LDRSH r4, [r1], #2 @x[21] + SMLABT r10, r6, r3, r10 @x[19] * h[19] + SMLABT r11, r9, r3, r11 @x[20] * h[19] + SMLABT r12, r4, r3, r12 @x[21] * h[19] + + LDR r3, [r2], #4 @h[20], h[21] + LDRSH r6, [r1], #2 @x[22] + SMLABB r10, r9, r3, r10 @x[20] * h[20] + SMLABB r11, r4, r3, r11 @x[21] * h[20] + SMLABB r12, r6, r3, r12 @x[22] * h[20] + + LDRSH r9, [r1], #2 @x[23] + SMLABT r10, r4, r3, r10 @x[21] * h[21] + SMLABT r11, r6, r3, r11 @x[22] * h[21] + SMLABT r12, r9, r3, r12 @x[23] * h[21] + + LDR r3, [r2], #4 @h[22], h[23] + LDRSH r4, [r1], #2 @x[24] + SMLABB r10, r6, r3, r10 @x[22] * h[22] + SMLABB r11, r9, r3, r11 @x[23] * h[22] + SMLABB r12, r4, r3, r12 @x[24] * h[22] + + LDRSH r6, [r1], #2 @x[25] + SMLABT r10, r9, r3, r10 @x[23] * h[23] + SMLABT r11, r4, r3, r11 @x[24] * h[23] + SMLABT r12, r6, r3, r12 @x[25] * h[23] + + LDR r3, [r2], #4 @h[24], h[25] + LDRSH r9, [r1], #2 @x[26] + SMLABB r10, r4, r3, r10 @x[24] * h[24] + SMLABB r11, r6, r3, r11 @x[25] * h[24] + SMLABB r12, r9, r3, r12 @x[26] * h[24] + + LDRSH r4, [r1], #2 @x[27] + SMLABT r10, r6, r3, r10 @x[25] * h[25] + SMLABT r11, r9, r3, r11 @x[26] * h[25] + SMLABT r12, r4, r3, r12 @x[27] * h[25] + + LDR r3, [r2], #4 @h[26], h[27] + LDRSH r6, [r1], #2 @x[28] + SMLABB r10, r9, r3, r10 @x[26] * h[26] + SMLABB r11, r4, r3, r11 @x[27] * h[26] + SMLABB r12, r6, r3, r12 @x[28] * h[26] + + LDRSH r9, [r1], #2 @x[29] + SMLABT r10, r4, r3, r10 @x[27] * h[27] + SMLABT r11, r6, r3, r11 @x[28] * h[27] + SMLABT r12, r9, r3, r12 @x[29] * h[27] + + LDR r3, [r2], #4 @h[28], h[29] + LDRSH r4, [r1], #2 @x[30] + SMLABB r10, r6, r3, r10 @x[28] * h[28] + SMLABB r11, r9, r3, r11 @x[29] * h[28] + SMLABB r12, r4, r3, r12 @x[30] * h[28] + + LDRSH r6, [r1], #2 @x[31] + SMLABT r10, r9, r3, r10 @x[29] * h[29] + SMLABT r11, r4, r3, r11 @x[30] * h[29] + SMLABT r12, r6, r3, r12 @x[31] * h[29] + + LDR r3, [r2], #4 @h[30], h[31] + LDRSH r9, [r1], #2 @x[32] + SMLABB r10, r4, r3, r10 @x[30] * h[30] + SMLABB r11, r6, r3, r11 @x[31] * h[30] + SMLABB r12, r9, r3, r12 @x[32] * h[30] + + LDRSH r4, [r1], #-60 @x[33] + SMLABT r10, r6, r3, r10 @x[31] * h[31] + SMLABT r11, r9, r3, r11 @x[32] * h[31] + SMLABT r12, r4, r3, r12 @x[33] * h[31] + + @SSAT r10, #32, r10, LSL #2 + @SSAT r11, #32, r11, LSL #2 + @SSAT r12, #32, r12, LSL #2 + + MOV r10, r10, LSL #1 + MOV r11, r11, LSL #1 + MOV r12, r12, LSL #1 + + QADD r10, r10, r10 + QADD r11, r11, r11 + QADD r12, r12, r12 + + QADD r10, r10, r5 + QADD r11, r11, r5 + QADD r12, r12, r5 + + SUBS r14, r14, #1 + + MOV r10, r10, ASR #16 + MOV r11, r11, ASR #16 + MOV r12, r12, ASR #16 + + STRH r10, [r0], #2 + STRH r11, [r0], #2 + STRH r12, [r0], #2 + BNE THREE_LOOP + + MOV r2, r8 @ptr = ptr2 + +Last2LOOP: + + LDR r3, [r2], #4 @h[0], h[1] + LDRSH r4, [r1], #2 @x[0] + LDRSH r6, [r1], #2 @x[1] + LDRSH r9, [r1], #2 @x[2] + + SMULBB r10, r4, r3 @x[0] * h[0] + SMULBB r11, r6, r3 @x[1] * h[0] + + SMLABT r10, r6, r3, r10 @x[1] * h[1] + SMLABT r11, r9, r3, r11 @x[2] * h[1] + + LDR r3, [r2], #4 @h[2], h[3] + LDRSH r4, [r1], #2 @x[3] + LDRSH r6, [r1], #2 @x[4] + + 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] + + LDR r3, [r2], #4 @h[4], h[5] + LDRSH r9, [r1], #2 @x[5] + LDRSH r4, [r1], #2 @x[6] + + SMLABB r10, r6, r3, r10 @x[4] * h[4] + SMLABB r11, r9, r3, r11 @x[5] * h[4] + + SMLABT r10, r9, r3, r10 @x[5] * h[5] + SMLABT r11, r4, r3, r11 @x[6] * h[5] + + LDR r3, [r2], #4 @h[6], h[7] + LDRSH r6, [r1], #2 @x[7] + LDRSH r9, [r1], #2 @x[8] + + SMLABB r10, r4, r3, r10 @x[6] * h[6] + SMLABB r11, r6, r3, r11 @x[7] * h[6] + + SMLABT r10, r6, r3, r10 @x[7] * h[7] + SMLABT r11, r9, r3, r11 @x[8] * h[7] + + LDR r3, [r2], #4 @h[8], h[9] + LDRSH r4, [r1], #2 @x[9] + LDRSH r6, [r1], #2 @x[10] + + SMLABB r10, r9, r3, r10 @x[8] * h[8] + SMLABB r11, r4, r3, r11 @x[9] * h[8] + + SMLABT r10, r4, r3, r10 @x[9] * h[9] + SMLABT r11, r6, r3, r11 @x[10] * h[9] + + LDR r3, [r2], #4 @h[10], h[11] + LDRSH r9, [r1], #2 @x[11] + LDRSH r4, [r1], #2 @x[12] + + SMLABB r10, r6, r3, r10 @x[10] * h[10] + SMLABB r11, r9, r3, r11 @x[11] * h[10] + + SMLABT r10, r9, r3, r10 @x[11] * h[11] + SMLABT r11, r4, r3, r11 @x[12] * h[11] + + LDR r3, [r2], #4 @h[12], h[13] + LDRSH r6, [r1], #2 @x[13] + LDRSH r9, [r1], #2 @x[14] + + SMLABB r10, r4, r3, r10 @x[12] * h[12] + SMLABB r11, r6, r3, r11 @x[13] * h[12] + + SMLABT r10, r6, r3, r10 @x[13] * h[13] + SMLABT r11, r9, r3, r11 @x[14] * h[13] + + LDR r3, [r2], #4 @h[14], h[15] + LDRSH r4, [r1], #2 @x[15] + LDRSH r6, [r1], #2 @x[16] + + SMLABB r10, r9, r3, r10 @x[14] * h[14] + SMLABB r11, r4, r3, r11 @x[15] * h[14] + + SMLABT r10, r4, r3, r10 @x[15] * h[15] + SMLABT r11, r6, r3, r11 @x[16] * h[15] + + LDR r3, [r2], #4 @h[16], h[17] + LDRSH r9, [r1], #2 @x[17] + LDRSH r4, [r1], #2 @x[18] + + SMLABB r10, r6, r3, r10 @x[16] * h[16] + SMLABB r11, r9, r3, r11 @x[17] * h[16] + + SMLABT r10, r9, r3, r10 @x[17] * h[17] + SMLABT r11, r4, r3, r11 @x[18] * h[17] + + LDR r3, [r2], #4 @h[18], h[19] + LDRSH r6, [r1], #2 @x[19] + LDRSH r9, [r1], #2 @x[20] + + SMLABB r10, r4, r3, r10 @x[18] * h[18] + SMLABB r11, r6, r3, r11 @x[19] * h[18] + + SMLABT r10, r6, r3, r10 @x[19] * h[19] + SMLABT r11, r9, r3, r11 @x[20] * h[19] + + LDR r3, [r2], #4 @h[20], h[21] + LDRSH r4, [r1], #2 @x[21] + LDRSH r6, [r1], #2 @x[22] + + SMLABB r10, r9, r3, r10 @x[20] * h[20] + SMLABB r11, r4, r3, r11 @x[21] * h[20] + + SMLABT r10, r4, r3, r10 @x[21] * h[21] + SMLABT r11, r6, r3, r11 @x[22] * h[21] + + LDR r3, [r2], #4 @h[22], h[23] + LDRSH r9, [r1], #2 @x[23] + LDRSH r4, [r1], #2 @x[24] + + SMLABB r10, r6, r3, r10 @x[22] * h[22] + SMLABB r11, r9, r3, r11 @x[23] * h[22] + + SMLABT r10, r9, r3, r10 @x[23] * h[23] + SMLABT r11, r4, r3, r11 @x[24] * h[23] + + LDR r3, [r2], #4 @h[24], h[25] + LDRSH r6, [r1], #2 @x[25] + LDRSH r9, [r1], #2 @x[26] + + SMLABB r10, r4, r3, r10 @x[24] * h[24] + SMLABB r11, r6, r3, r11 @x[25] * h[24] + + SMLABT r10, r6, r3, r10 @x[25] * h[25] + SMLABT r11, r9, r3, r11 @x[26] * h[25] + + LDR r3, [r2], #4 @h[26], h[27] + LDRSH r4, [r1], #2 @x[27] + LDRSH r6, [r1], #2 @x[28] + + SMLABB r10, r9, r3, r10 @x[26] * h[26] + SMLABB r11, r4, r3, r11 @x[27] * h[26] + + SMLABT r10, r4, r3, r10 @x[27] * h[27] + SMLABT r11, r6, r3, r11 @x[28] * h[27] + + LDR r3, [r2], #4 @h[28], h[29] + LDRSH r9, [r1], #2 @x[29] + LDRSH r4, [r1], #2 @x[30] + + SMLABB r10, r6, r3, r10 @x[28] * h[28] + SMLABB r11, r9, r3, r11 @x[29] * h[28] + + SMLABT r10, r9, r3, r10 @x[29] * h[29] + SMLABT r11, r4, r3, r11 @x[30] * h[29] + + LDR r3, [r2], #4 @h[30], h[31] + LDRSH r6, [r1], #2 @x[31] + LDRSH r9, [r1], #2 @x[32] + + SMLABB r10, r4, r3, r10 @x[30] * h[30] + SMLABB r11, r6, r3, r11 @x[31] * h[30] + + SMLABT r10, r6, r3, r10 @x[31] * h[31] + SMLABT r11, r9, r3, r11 @x[32] * h[31] + + @SSAT r10, #32, r10, LSL #2 + @SSAT r11, #32, r11, LSL #2 + MOV r10, r10, LSL #1 + MOV r11, r11, LSL #1 + + QADD r10, r10, r10 + QADD r11, r11, r11 + + QADD r10, r10, r5 + QADD r11, r11, r5 + + MOV r10, r10, ASR #16 + MOV r11, r11, ASR #16 + + STRH r10, [r0], #2 + STRH r11, [r0], #2 + + +pred_lt4_end: + LDMFD r13!, {r4 - r12, r15} + +Table: + .word inter4_2 + @ENDFUNC + .END + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s index 060d9c7..86b3bd6 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s @@ -1,228 +1,228 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@ -@void Residu( -@ Word16 a[], /* (i) Q12 : prediction coefficients */ -@ Word16 x[], /* (i) : speech (values x[-m..-1] are needed */ -@ Word16 y[], /* (o) x2 : residual signal */ -@ Word16 lg /* (i) : size of filtering */ -@ ) -@a[] --- r0 -@x[] --- r1 -@y[] --- r2 -@lg --- r3 - - .section .text - .global Residu_opt - -Residu_opt: - - STMFD r13!, {r4 - r12, r14} - - LDRH r5, [r0], #2 - LDRH r6, [r0], #2 - 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 - - LDRH r8, [r0], #2 - LDRH r9, [r0], #2 - ORR r8, r9, r8, LSL #16 @r8 --- a6, a7 - - LDRH r9, [r0], #2 - LDRH r10, [r0], #2 - ORR r9, r10, r9, LSL #16 @r9 --- a8, a9 - - LDRH r10, [r0], #2 - LDRH r11, [r0], #2 - ORR r10, r11, r10, LSL #16 @r10 --- a10, a11 - - 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 - LDRH r4, [r0], #2 @load a16 - MOV r14, r3, ASR #2 @one loop get 4 outputs - ADD r1, r1, #4 - MOV r0, r2 - ORR r14, r4, r14, LSL #16 @r14 --- loopnum, a16 - -residu_loop: - - LDR r10, [r1], #-4 @r10 --- x[3], x[2] - 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 - SMULTB r11, r5, r10 @i3(0) --- r11 = x[2] * a0 - SMULTT r12, r5, r10 @i4(0) --- r12 = x[3] * a0 - - SMLABB r4, r5, r2, r4 @i2(1) --- r4 += x[0] * a1 - SMLABT r11, r5, r2, r11 @i3(1) --- r11 += x[1] * a0 - SMLABB r12, r5, r10, r12 @i4(1) --- r12 += x[2] * a1 - - 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 - - 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 - - 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) - SMLABT r11,r7, r2, r11 @ i3 (5) - SMLATT r12,r8, r2, r12 @ i4 (6) - SMLATB r3, r7, r2, r3 @ i1 (4) - 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) - SMLABT r11,r8, r2, r11 @ i3 (7) - SMLATT r12,r9, r2, r12 @ i4 (8) - SMLATB r3, r8, r2, r3 @ i1 (6) - SMLABB r4, r8, r2, r4 @ i2 (7) - 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) - SMLABT r11,r9, r2, r11 @ i3 (9) - SMLATT r12,r10, r2, r12 @ i4 (10) - SMLATB r3, r9, r2, r3 @ i1 (8) - SMLABB r4, r9, r2, r4 @ i2 (9) - 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) - SMLABT r11,r10, r2, r11 @ i3 (11) - SMLATT r12,r8, r2, r12 @ i4 (12) - SMLATB r3, r10, r2, r3 @ i1 (10) - SMLABB r4, r10, r2, r4 @ i2 (11) - 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) - SMLABT r11,r8, r2, r11 @ i3 (13) - SMLATT r12,r9, r2, r12 @ i4 (14) - SMLATB r3, r8, r2, r3 @ i1 (12) - 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) - SMLATT r4, r9, r2, r4 @ i2 (14) - SMLABT r11,r9, r2, r11 @ i3 (15) - SMLABT r12,r14, r2, r12 @ i4 (16) - SMLATB r3, r9, r2, r3 @ i1 (14) - 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 - - - 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 -end: - LDMFD r13!, {r8 -r12} - LDMFD r13!, {r4 -r12,pc} - - @ENDFUNC - .END - - - - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@ +@void Residu( +@ Word16 a[], /* (i) Q12 : prediction coefficients */ +@ Word16 x[], /* (i) : speech (values x[-m..-1] are needed */ +@ Word16 y[], /* (o) x2 : residual signal */ +@ Word16 lg /* (i) : size of filtering */ +@ ) +@a[] --- r0 +@x[] --- r1 +@y[] --- r2 +@lg --- r3 + + .section .text + .global Residu_opt + +Residu_opt: + + STMFD r13!, {r4 - r12, r14} + + LDRH r5, [r0], #2 + LDRH r6, [r0], #2 + 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 + + LDRH r8, [r0], #2 + LDRH r9, [r0], #2 + ORR r8, r9, r8, LSL #16 @r8 --- a6, a7 + + LDRH r9, [r0], #2 + LDRH r10, [r0], #2 + ORR r9, r10, r9, LSL #16 @r9 --- a8, a9 + + LDRH r10, [r0], #2 + LDRH r11, [r0], #2 + ORR r10, r11, r10, LSL #16 @r10 --- a10, a11 + + 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 + LDRH r4, [r0], #2 @load a16 + MOV r14, r3, ASR #2 @one loop get 4 outputs + ADD r1, r1, #4 + MOV r0, r2 + ORR r14, r4, r14, LSL #16 @r14 --- loopnum, a16 + +residu_loop: + + LDR r10, [r1], #-4 @r10 --- x[3], x[2] + 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 + SMULTB r11, r5, r10 @i3(0) --- r11 = x[2] * a0 + SMULTT r12, r5, r10 @i4(0) --- r12 = x[3] * a0 + + SMLABB r4, r5, r2, r4 @i2(1) --- r4 += x[0] * a1 + SMLABT r11, r5, r2, r11 @i3(1) --- r11 += x[1] * a0 + SMLABB r12, r5, r10, r12 @i4(1) --- r12 += x[2] * a1 + + 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 + + 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 + + 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) + SMLABT r11,r7, r2, r11 @ i3 (5) + SMLATT r12,r8, r2, r12 @ i4 (6) + SMLATB r3, r7, r2, r3 @ i1 (4) + 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) + SMLABT r11,r8, r2, r11 @ i3 (7) + SMLATT r12,r9, r2, r12 @ i4 (8) + SMLATB r3, r8, r2, r3 @ i1 (6) + SMLABB r4, r8, r2, r4 @ i2 (7) + 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) + SMLABT r11,r9, r2, r11 @ i3 (9) + SMLATT r12,r10, r2, r12 @ i4 (10) + SMLATB r3, r9, r2, r3 @ i1 (8) + SMLABB r4, r9, r2, r4 @ i2 (9) + 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) + SMLABT r11,r10, r2, r11 @ i3 (11) + SMLATT r12,r8, r2, r12 @ i4 (12) + SMLATB r3, r10, r2, r3 @ i1 (10) + SMLABB r4, r10, r2, r4 @ i2 (11) + 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) + SMLABT r11,r8, r2, r11 @ i3 (13) + SMLATT r12,r9, r2, r12 @ i4 (14) + SMLATB r3, r8, r2, r3 @ i1 (12) + 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) + SMLATT r4, r9, r2, r4 @ i2 (14) + SMLABT r11,r9, r2, r11 @ i3 (15) + SMLABT r12,r14, r2, r12 @ i4 (16) + SMLATB r3, r9, r2, r3 @ i1 (14) + 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 + + + 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 +end: + LDMFD r13!, {r8 -r12} + LDMFD r13!, {r4 -r12,pc} + + @ENDFUNC + .END + + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s index aa9f464..f83e688 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s @@ -1,75 +1,75 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@ -@void Scale_sig( -@ Word16 x[], /* (i/o) : signal to scale */ -@ Word16 lg, /* (i) : size of x[] */ -@ Word16 exp /* (i) : exponent: x = round(x << exp) */ -@ ) -@ -@r0 --- x[] -@r1 --- lg -@r2 --- exp - - .section .text - .global Scale_sig_opt - -Scale_sig_opt: - - STMFD r13!, {r4 - r12, r14} - SUB r3, r1, #1 @i = lg - 1 - CMP r2, #0 @Compare exp and 0 - RSB r7, r2, #0 @exp = -exp - ADD r10, r2, #16 @16 + exp - ADD r4, r0, r3, LSL #1 @x[i] address - MOV r8, #0x7fffffff - MOV r9, #0x8000 - BLE LOOP2 - -LOOP1: - - LDRSH r5, [r4] @load x[i] - MOV r12, r5, LSL r10 - TEQ r5, r12, ASR r10 - EORNE r12, r8, r5, ASR #31 - SUBS r3, r3, #1 - QADD r11, r12, r9 - MOV r12, r11, ASR #16 - STRH r12, [r4], #-2 - BGE LOOP1 - BL The_end - -LOOP2: - - LDRSH r5, [r4] @load x[i] - MOV r6, r5, LSL #16 @L_tmp = x[i] << 16 - MOV r5, r6, ASR r7 @L_tmp >>= exp - QADD r11, r5, r9 - MOV r12, r11, ASR #16 - SUBS r3, r3, #1 - STRH r12, [r4], #-2 - BGE LOOP2 - -The_end: - LDMFD r13!, {r4 - r12, r15} - - @ENDFUNC - .END - - - - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@ +@void Scale_sig( +@ Word16 x[], /* (i/o) : signal to scale */ +@ Word16 lg, /* (i) : size of x[] */ +@ Word16 exp /* (i) : exponent: x = round(x << exp) */ +@ ) +@ +@r0 --- x[] +@r1 --- lg +@r2 --- exp + + .section .text + .global Scale_sig_opt + +Scale_sig_opt: + + STMFD r13!, {r4 - r12, r14} + SUB r3, r1, #1 @i = lg - 1 + CMP r2, #0 @Compare exp and 0 + RSB r7, r2, #0 @exp = -exp + ADD r10, r2, #16 @16 + exp + ADD r4, r0, r3, LSL #1 @x[i] address + MOV r8, #0x7fffffff + MOV r9, #0x8000 + BLE LOOP2 + +LOOP1: + + LDRSH r5, [r4] @load x[i] + MOV r12, r5, LSL r10 + TEQ r5, r12, ASR r10 + EORNE r12, r8, r5, ASR #31 + SUBS r3, r3, #1 + QADD r11, r12, r9 + MOV r12, r11, ASR #16 + STRH r12, [r4], #-2 + BGE LOOP1 + BL The_end + +LOOP2: + + LDRSH r5, [r4] @load x[i] + MOV r6, r5, LSL #16 @L_tmp = x[i] << 16 + MOV r5, r6, ASR r7 @L_tmp >>= exp + QADD r11, r5, r9 + MOV r12, r11, ASR #16 + SUBS r3, r3, #1 + STRH r12, [r4], #-2 + BGE LOOP2 + +The_end: + LDMFD r13!, {r4 - r12, r15} + + @ENDFUNC + .END + + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s index e05e9e0..f4700cd 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s @@ -1,238 +1,238 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@**********************************************************************/ -@void Syn_filt( -@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ -@ Word16 x[], /* (i) : input signal */ -@ Word16 y[], /* (o) : output signal */ -@ Word16 mem[], /* (i/o) : memory associated with this filtering. */ -@) -@*********************************************************************** -@ a[] --- r0 -@ x[] --- r1 -@ y[] --- r2 -@ mem[] --- r3 -@ m --- 16 lg --- 80 update --- 1 - - .section .text - .global Syn_filt_asm - .extern voAWB_Copy - -Syn_filt_asm: - - 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 r7, [r4], #2 - LDRH r8, [r4], #2 - LDRH r9, [r4], #2 - LDRH r10, [r4], #2 - LDRH r11, [r4], #2 - LDRH r12, [r4], #2 - LDRH r14, [r4], #2 - - STRH r6, [r5], #2 - STRH r7, [r5], #2 - STRH r8, [r5], #2 - STRH r9, [r5], #2 - STRH r10, [r5], #2 - STRH r11, [r5], #2 - STRH r12, [r5], #2 - STRH r14, [r5], #2 - - LDRH r6, [r4], #2 - LDRH r7, [r4], #2 - LDRH r8, [r4], #2 - LDRH r9, [r4], #2 - LDRH r10, [r4], #2 - LDRH r11, [r4], #2 - LDRH r12, [r4], #2 - LDRH r14, [r4], #2 - - STRH r6, [r5], #2 - STRH r7, [r5], #2 - STRH r8, [r5], #2 - STRH r9, [r5], #2 - STRH r10, [r5], #2 - STRH r11, [r5], #2 - STRH r12, [r5], #2 - STRH r14, [r5], #2 - - LDRSH r5, [r0] @ load a[0] - MOV r8, #0 @ i = 0 - MOV r5, r5, ASR #1 @ a0 = a[0] >> 1 - @MOV r4, r13 - @ load all a[] - - LDR r14, =0xffff - LDRSH r6, [r0, #2] @ load a[1] - LDRSH r7, [r0, #4] @ load a[2] - LDRSH r9, [r0, #6] @ load a[3] - LDRSH r11,[r0, #8] @ load a[4] - AND r6, r6, 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 - 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] - - 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 - 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] - - 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 - 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] - - ADD r4, r13, #32 -LOOP: - LDRSH r6, [r1], #2 @ load x[i] - ADD r10, r4, r8, LSL #1 @ temp_p = yy + i - - MUL r0, r5, r6 @ L_tmp = x[i] * a0 - @ for(j = 1@ j <= m, j+=8) - LDR r7, [r13, #-4] @ -a[2] -a[1] - LDRSH r9, [r10, #-2] @ *(temp_p - 1) - LDRSH r12, [r10, #-4] @ *(temp_p - 2) - - - SMULBB r14, r9, r7 @ -a[1] * (*(temp_p -1)) - - LDRSH r6, [r10, #-6] @ *(temp_p - 3) - - SMLABT r14, r12, r7, r14 @ -a[2] * (*(temp_p - 2)) - - LDR r7, [r13, #-8] @ -a[4] -a[3] - LDRSH r11, [r10, #-8] @ *(temp_p - 4) - - 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)) - - LDR r7, [r13, #-12] @ -a[6] -a[5] - LDRSH r12, [r10, #-12] @ *(temp_p - 6) - - SMLABB r14, r9, r7, r14 @ -a[5] * (*(temp_p -5)) - - LDRSH r6, [r10, #-14] @ *(temp_p - 7) - - SMLABT r14, r12, r7, r14 @ -a[6] * (*(temp_p - 6)) - - 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)) - - LDR r7, [r13, #-20] @ -a[10] -a[9] - LDRSH r12, [r10, #-20] @ *(temp_p - 10) - - SMLABB r14, r9, r7, r14 @ -a[9] * (*(temp_p -9)) - - LDRSH r6, [r10, #-22] @ *(temp_p - 11) - - SMLABT r14, r12, r7, r14 @ -a[10] * (*(temp_p - 10)) - - LDR r7, [r13, #-24] @ -a[12] -a[11] - LDRSH r11, [r10, #-24] @ *(temp_p - 12) - - SMLABB r14, r6, r7, r14 @ -a[11] * (*(temp_p -11)) - - LDRSH r9, [r10, #-26] @ *(temp_p - 13) - - 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) - - SMLABT r14, r12, r7, r14 @ -a[14] * (*(temp_p - 14)) - - LDR r7, [r13, #-32] @ -a[16] -a[15] - LDRSH r11, [r10, #-32] @ *(temp_p - 16) - - SMLABB r14, r6, r7, r14 @ -a[15] * (*(temp_p -15)) - - 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 - 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 - -Syn_filt_asm_end: - - ADD r13, r13, #700 - LDMFD r13!, {r4 - r12, r15} - @ENDFUNC - .END - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@**********************************************************************/ +@void Syn_filt( +@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ +@ Word16 x[], /* (i) : input signal */ +@ Word16 y[], /* (o) : output signal */ +@ Word16 mem[], /* (i/o) : memory associated with this filtering. */ +@) +@*********************************************************************** +@ a[] --- r0 +@ x[] --- r1 +@ y[] --- r2 +@ mem[] --- r3 +@ m --- 16 lg --- 80 update --- 1 + + .section .text + .global Syn_filt_asm + .extern voAWB_Copy + +Syn_filt_asm: + + 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 r7, [r4], #2 + LDRH r8, [r4], #2 + LDRH r9, [r4], #2 + LDRH r10, [r4], #2 + LDRH r11, [r4], #2 + LDRH r12, [r4], #2 + LDRH r14, [r4], #2 + + STRH r6, [r5], #2 + STRH r7, [r5], #2 + STRH r8, [r5], #2 + STRH r9, [r5], #2 + STRH r10, [r5], #2 + STRH r11, [r5], #2 + STRH r12, [r5], #2 + STRH r14, [r5], #2 + + LDRH r6, [r4], #2 + LDRH r7, [r4], #2 + LDRH r8, [r4], #2 + LDRH r9, [r4], #2 + LDRH r10, [r4], #2 + LDRH r11, [r4], #2 + LDRH r12, [r4], #2 + LDRH r14, [r4], #2 + + STRH r6, [r5], #2 + STRH r7, [r5], #2 + STRH r8, [r5], #2 + STRH r9, [r5], #2 + STRH r10, [r5], #2 + STRH r11, [r5], #2 + STRH r12, [r5], #2 + STRH r14, [r5], #2 + + LDRSH r5, [r0] @ load a[0] + MOV r8, #0 @ i = 0 + MOV r5, r5, ASR #1 @ a0 = a[0] >> 1 + @MOV r4, r13 + @ load all a[] + + LDR r14, =0xffff + LDRSH r6, [r0, #2] @ load a[1] + LDRSH r7, [r0, #4] @ load a[2] + LDRSH r9, [r0, #6] @ load a[3] + LDRSH r11,[r0, #8] @ load a[4] + AND r6, r6, 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 + 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] + + 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 + 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] + + 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 + 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] + + ADD r4, r13, #32 +LOOP: + LDRSH r6, [r1], #2 @ load x[i] + ADD r10, r4, r8, LSL #1 @ temp_p = yy + i + + MUL r0, r5, r6 @ L_tmp = x[i] * a0 + @ for(j = 1@ j <= m, j+=8) + LDR r7, [r13, #-4] @ -a[2] -a[1] + LDRSH r9, [r10, #-2] @ *(temp_p - 1) + LDRSH r12, [r10, #-4] @ *(temp_p - 2) + + + SMULBB r14, r9, r7 @ -a[1] * (*(temp_p -1)) + + LDRSH r6, [r10, #-6] @ *(temp_p - 3) + + SMLABT r14, r12, r7, r14 @ -a[2] * (*(temp_p - 2)) + + LDR r7, [r13, #-8] @ -a[4] -a[3] + LDRSH r11, [r10, #-8] @ *(temp_p - 4) + + 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)) + + LDR r7, [r13, #-12] @ -a[6] -a[5] + LDRSH r12, [r10, #-12] @ *(temp_p - 6) + + SMLABB r14, r9, r7, r14 @ -a[5] * (*(temp_p -5)) + + LDRSH r6, [r10, #-14] @ *(temp_p - 7) + + SMLABT r14, r12, r7, r14 @ -a[6] * (*(temp_p - 6)) + + 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)) + + LDR r7, [r13, #-20] @ -a[10] -a[9] + LDRSH r12, [r10, #-20] @ *(temp_p - 10) + + SMLABB r14, r9, r7, r14 @ -a[9] * (*(temp_p -9)) + + LDRSH r6, [r10, #-22] @ *(temp_p - 11) + + SMLABT r14, r12, r7, r14 @ -a[10] * (*(temp_p - 10)) + + LDR r7, [r13, #-24] @ -a[12] -a[11] + LDRSH r11, [r10, #-24] @ *(temp_p - 12) + + SMLABB r14, r6, r7, r14 @ -a[11] * (*(temp_p -11)) + + LDRSH r9, [r10, #-26] @ *(temp_p - 13) + + 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) + + SMLABT r14, r12, r7, r14 @ -a[14] * (*(temp_p - 14)) + + LDR r7, [r13, #-32] @ -a[16] -a[15] + LDRSH r11, [r10, #-32] @ *(temp_p - 16) + + SMLABB r14, r6, r7, r14 @ -a[15] * (*(temp_p -15)) + + 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 + 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 + +Syn_filt_asm_end: + + ADD r13, r13, #700 + LDMFD r13!, {r4 - r12, r15} + @ENDFUNC + .END + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s index acb60c3..2afc146 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s @@ -1,102 +1,102 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@ -@void Deemph_32( -@ Word16 x_hi[], /* (i) : input signal (bit31..16) */ -@ Word16 x_lo[], /* (i) : input signal (bit15..4) */ -@ Word16 y[], /* (o) : output signal (x16) */ -@ Word16 mu, /* (i) Q15 : deemphasis factor */ -@ Word16 L, /* (i) : vector size */ -@ Word16 * mem /* (i/o) : memory (y[-1]) */ -@ ) - -@x_hi RN R0 -@x_lo RN R1 -@y[] RN R2 -@*mem RN R3 - - .section .text - .global Deemph_32_asm - -Deemph_32_asm: - - 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] - LDR r5, =22282 @r5---mu - MOV r11, #0x8000 - - @y[0] - MOV r10, r6, LSL #16 @L_tmp = x_hi[0]<<16 - MOV r8, r5, ASR #1 @fac = mu >> 1 - LDR r5, [r3] - 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] - QDADD r10, r10, r9 - 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) - - - MOV r10, r6, LSL #16 - ADD r12, r10, r7, LSL #4 - STRH r14, [r2], #2 @update y[0] - MOV r10, r12, LSL #3 - MUL r9, r14, r8 - QDADD r10, r10, r9 - MOV r12, r10, LSL #1 - QADD r10, r12, r11 - MOV r14, r10, ASR #16 @y[1] = round(L_tmp) - -LOOP: - LDRSH r6, [r0], #2 @load x_hi[] - LDRSH r7, [r1], #2 - STRH r14, [r2], #2 - MOV r10, r6, LSL #16 - ADD r12, r10, r7, LSL #4 - MUL r9, r14, r8 - MOV r10, r12, LSL #3 - QDADD r10, r10, r9 - LDRSH r6, [r0], #2 @load x_hi[] - MOV r12, r10, LSL #1 - QADD r10, r12, r11 - LDRSH r7, [r1], #2 - MOV r14, r10, ASR #16 - - MOV r10, r6, LSL #16 - ADD r12, r10, r7, LSL #4 - STRH r14, [r2], #2 - MUL r9, r14, r8 - MOV r10, r12, LSL #3 - QDADD r10, r10, r9 - ADD r4, r4, #2 - MOV r12, r10, LSL #1 - QADD r10, r12, r11 - CMP r4, #64 - MOV r14, r10, ASR #16 - - BLT LOOP - STR r14, [r3] - STRH r14, [r2] - - LDMFD r13!, {r4 - r12, r15} - - .END - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@ +@void Deemph_32( +@ Word16 x_hi[], /* (i) : input signal (bit31..16) */ +@ Word16 x_lo[], /* (i) : input signal (bit15..4) */ +@ Word16 y[], /* (o) : output signal (x16) */ +@ Word16 mu, /* (i) Q15 : deemphasis factor */ +@ Word16 L, /* (i) : vector size */ +@ Word16 * mem /* (i/o) : memory (y[-1]) */ +@ ) + +@x_hi RN R0 +@x_lo RN R1 +@y[] RN R2 +@*mem RN R3 + + .section .text + .global Deemph_32_asm + +Deemph_32_asm: + + 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] + LDR r5, =22282 @r5---mu + MOV r11, #0x8000 + + @y[0] + MOV r10, r6, LSL #16 @L_tmp = x_hi[0]<<16 + MOV r8, r5, ASR #1 @fac = mu >> 1 + LDR r5, [r3] + 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] + QDADD r10, r10, r9 + 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) + + + MOV r10, r6, LSL #16 + ADD r12, r10, r7, LSL #4 + STRH r14, [r2], #2 @update y[0] + MOV r10, r12, LSL #3 + MUL r9, r14, r8 + QDADD r10, r10, r9 + MOV r12, r10, LSL #1 + QADD r10, r12, r11 + MOV r14, r10, ASR #16 @y[1] = round(L_tmp) + +LOOP: + LDRSH r6, [r0], #2 @load x_hi[] + LDRSH r7, [r1], #2 + STRH r14, [r2], #2 + MOV r10, r6, LSL #16 + ADD r12, r10, r7, LSL #4 + MUL r9, r14, r8 + MOV r10, r12, LSL #3 + QDADD r10, r10, r9 + LDRSH r6, [r0], #2 @load x_hi[] + MOV r12, r10, LSL #1 + QADD r10, r12, r11 + LDRSH r7, [r1], #2 + MOV r14, r10, ASR #16 + + MOV r10, r6, LSL #16 + ADD r12, r10, r7, LSL #4 + STRH r14, [r2], #2 + MUL r9, r14, r8 + MOV r10, r12, LSL #3 + QDADD r10, r10, r9 + ADD r4, r4, #2 + MOV r12, r10, LSL #1 + QADD r10, r12, r11 + CMP r4, #64 + MOV r14, r10, ASR #16 + + BLT LOOP + STR r14, [r3] + STRH r14, [r2] + + LDMFD r13!, {r4 - r12, r15} + + .END + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s index 07ca344..678f1d0 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s @@ -1,127 +1,127 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@ -@**********************************************************************/ -@Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */ -@ Word16 x[], /* (i) 12bits: x vector */ -@ Word16 y[], /* (i) 12bits: y vector */ -@ Word16 lg, /* (i) : vector length */ -@ Word16 * exp /* (o) : exponent of result (0..+30) */ -@) -@************************************************************************ -@ x[] --- r0 -@ y[] --- r1 -@ lg --- r2 -@ *exp --- r3 - - .section .text - .global Dot_product12_asm - -Dot_product12_asm: - - STMFD r13!, {r4 - r12, r14} - CMP r0, r1 - BEQ LOOP_EQ - - VLD1.S16 {Q0, Q1}, [r0]! @load 16 Word16 x[] - VLD1.S16 {Q2, Q3}, [r0]! @load 16 Word16 x[] - VLD1.S16 {Q4, Q5}, [r0]! @load 16 Word16 x[] - VLD1.S16 {Q6, Q7}, [r0]! @load 16 Word16 x[] - VLD1.S16 {Q8, Q9}, [r1]! @load 16 Word16 y[] - VLD1.S16 {Q10, Q11}, [r1]! @load 16 Word16 y[] - VLD1.S16 {Q12, Q13}, [r1]! @load 16 Word16 y[] - - VMULL.S16 Q15, D16, D0 - 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 - VMLAL.S16 Q15, D21, D5 - VMLAL.S16 Q15, D22, D6 - VMLAL.S16 Q15, D23, D7 - VMLAL.S16 Q15, D24, D8 - VMLAL.S16 Q15, D25, D9 - VMLAL.S16 Q15, D26, D10 - VMLAL.S16 Q15, D27, D11 - VMLAL.S16 Q15, D0, D12 - VMLAL.S16 Q15, D1, D13 - VMLAL.S16 Q15, D2, D14 - VMLAL.S16 Q15, D3, D15 - - CMP r2, #64 - BEQ Lable1 - 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 - BL Lable1 - -LOOP_EQ: - VLD1.S16 {Q0, Q1}, [r0]! - VLD1.S16 {Q2, Q3}, [r0]! - VLD1.S16 {Q4, Q5}, [r0]! - VLD1.S16 {Q6, Q7}, [r0]! - VMULL.S16 Q15, D0, D0 - VMLAL.S16 Q15, D1, D1 - VMLAL.S16 Q15, D2, D2 - VMLAL.S16 Q15, D3, D3 - VMLAL.S16 Q15, D4, D4 - VMLAL.S16 Q15, D5, D5 - VMLAL.S16 Q15, D6, D6 - VMLAL.S16 Q15, D7, D7 - VMLAL.S16 Q15, D8, D8 - VMLAL.S16 Q15, D9, D9 - VMLAL.S16 Q15, D10, D10 - VMLAL.S16 Q15, D11, D11 - VMLAL.S16 Q15, D12, D12 - VMLAL.S16 Q15, D13, D13 - VMLAL.S16 Q15, D14, D14 - VMLAL.S16 Q15, D15, D15 - - CMP r2, #64 - BEQ Lable1 - VLD1.S16 {Q0, Q1}, [r0]! - VMLAL.S16 Q15, D0, D0 - VMLAL.S16 Q15, D1, D1 - VMLAL.S16 Q15, D2, D2 - VMLAL.S16 Q15, D3, D3 - -Lable1: - - VQADD.S32 D30, D30, D31 - VPADD.S32 D30, D30, D30 - VMOV.S32 r12, D30[0] - - ADD r12, r12, r12 - ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1 - MOV r4, r12 - CMP r12, #0 - RSBLT r4, r12, #0 - CLZ r10, r4 - 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] - -Dot_product12_end: - - LDMFD r13!, {r4 - r12, r15} - - .END - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@ +@**********************************************************************/ +@Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */ +@ Word16 x[], /* (i) 12bits: x vector */ +@ Word16 y[], /* (i) 12bits: y vector */ +@ Word16 lg, /* (i) : vector length */ +@ Word16 * exp /* (o) : exponent of result (0..+30) */ +@) +@************************************************************************ +@ x[] --- r0 +@ y[] --- r1 +@ lg --- r2 +@ *exp --- r3 + + .section .text + .global Dot_product12_asm + +Dot_product12_asm: + + STMFD r13!, {r4 - r12, r14} + CMP r0, r1 + BEQ LOOP_EQ + + VLD1.S16 {Q0, Q1}, [r0]! @load 16 Word16 x[] + VLD1.S16 {Q2, Q3}, [r0]! @load 16 Word16 x[] + VLD1.S16 {Q4, Q5}, [r0]! @load 16 Word16 x[] + VLD1.S16 {Q6, Q7}, [r0]! @load 16 Word16 x[] + VLD1.S16 {Q8, Q9}, [r1]! @load 16 Word16 y[] + VLD1.S16 {Q10, Q11}, [r1]! @load 16 Word16 y[] + VLD1.S16 {Q12, Q13}, [r1]! @load 16 Word16 y[] + + VMULL.S16 Q15, D16, D0 + 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 + VMLAL.S16 Q15, D21, D5 + VMLAL.S16 Q15, D22, D6 + VMLAL.S16 Q15, D23, D7 + VMLAL.S16 Q15, D24, D8 + VMLAL.S16 Q15, D25, D9 + VMLAL.S16 Q15, D26, D10 + VMLAL.S16 Q15, D27, D11 + VMLAL.S16 Q15, D0, D12 + VMLAL.S16 Q15, D1, D13 + VMLAL.S16 Q15, D2, D14 + VMLAL.S16 Q15, D3, D15 + + CMP r2, #64 + BEQ Lable1 + 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 + BL Lable1 + +LOOP_EQ: + VLD1.S16 {Q0, Q1}, [r0]! + VLD1.S16 {Q2, Q3}, [r0]! + VLD1.S16 {Q4, Q5}, [r0]! + VLD1.S16 {Q6, Q7}, [r0]! + VMULL.S16 Q15, D0, D0 + VMLAL.S16 Q15, D1, D1 + VMLAL.S16 Q15, D2, D2 + VMLAL.S16 Q15, D3, D3 + VMLAL.S16 Q15, D4, D4 + VMLAL.S16 Q15, D5, D5 + VMLAL.S16 Q15, D6, D6 + VMLAL.S16 Q15, D7, D7 + VMLAL.S16 Q15, D8, D8 + VMLAL.S16 Q15, D9, D9 + VMLAL.S16 Q15, D10, D10 + VMLAL.S16 Q15, D11, D11 + VMLAL.S16 Q15, D12, D12 + VMLAL.S16 Q15, D13, D13 + VMLAL.S16 Q15, D14, D14 + VMLAL.S16 Q15, D15, D15 + + CMP r2, #64 + BEQ Lable1 + VLD1.S16 {Q0, Q1}, [r0]! + VMLAL.S16 Q15, D0, D0 + VMLAL.S16 Q15, D1, D1 + VMLAL.S16 Q15, D2, D2 + VMLAL.S16 Q15, D3, D3 + +Lable1: + + VQADD.S32 D30, D30, D31 + VPADD.S32 D30, D30, D30 + VMOV.S32 r12, D30[0] + + ADD r12, r12, r12 + ADD r12, r12, #1 @ L_sum = (L_sum << 1) + 1 + MOV r4, r12 + CMP r12, #0 + RSBLT r4, r12, #0 + CLZ r10, r4 + 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] + +Dot_product12_end: + + LDMFD r13!, {r4 - r12, r15} + + .END + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s index 1880024..5389a1c 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s @@ -1,228 +1,228 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@ -@**********************************************************************/ -@void Filt_6k_7k( -@ Word16 signal[], /* input: signal */ -@ Word16 lg, /* input: length of input */ -@ Word16 mem[] /* in/out: memory (size=30) */ -@) -@*********************************************************************** -@ r0 --- signal[] -@ r1 --- lg -@ r2 --- mem[] - - .section .text - .global Filt_6k_7k_asm - .extern fir_6k_7k - -Filt_6k_7k_asm: - - 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 - - MOV r0, r2 - MOV r1, r13 - - VLD1.S16 {D0, D1, D2, D3}, [r0]! - VLD1.S16 {D4, D5, D6, D7}, [r0]! - - VST1.S16 {D0, D1, D2, D3}, [r1]! - VST1.S16 {D4, D5, D6}, [r1]! - VST1.S16 D7[0], [r1]! - VST1.S16 D7[1], [r1]! - - - - 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] - @for (i = lg - 1@ i >= 0@ i--) - @{ - @ x[i + L_FIR - 1] = signal[i] >> 2@ - @} - VLD1.S16 {Q0, Q1}, [r7]! @ signal[0] ~ signal[15] - VLD1.S16 {Q2, Q3}, [r7]! @ signal[16] ~ signal[31] - VLD1.S16 {Q4, Q5}, [r7]! @ signal[32] ~ signal[47] - VLD1.S16 {Q6, Q7}, [r7]! @ signal[48] ~ signal[63] - VLD1.S16 {Q8, Q9}, [r7]! @ signal[64] ~ signal[79] - VSHR.S16 Q10, Q0, #2 - VSHR.S16 Q11, Q1, #2 - VSHR.S16 Q12, Q2, #2 - VSHR.S16 Q13, Q3, #2 - VST1.S16 {Q10, Q11}, [r6]! - VSHR.S16 Q0, Q4, #2 - VSHR.S16 Q1, Q5, #2 - VSHR.S16 Q10, Q6, #2 - VSHR.S16 Q11, Q7, #2 - VSHR.S16 Q2, Q8, #2 - VSHR.S16 Q3, Q9, #2 - VST1.S16 {Q12, Q13}, [r6]! - VST1.S16 {Q0, Q1}, [r6]! - VST1.S16 {Q10, Q11}, [r6]! - VST1.S16 {Q2, Q3}, [r6]! - - 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 - - @ 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] - VMOV.S16 D7[3], r5 @set fir_6k_7K = 0 - - 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 - -LOOP_6K7K: - - 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] - VEXT.8 Q5,Q5,Q6,#2 - VMLAL.S16 Q9,D12,D4[0] - VMLAL.S16 Q10,D13,D5[0] - VMLAL.S16 Q11,D13,D4[0] - VMLAL.S16 Q12,D14,D5[0] - VEXT.8 Q6,Q6,Q7,#2 - VMLAL.S16 Q9,D14,D6[0] - VMLAL.S16 Q10,D15,D7[0] - VMLAL.S16 Q11,D15,D6[0] - VMLAL.S16 Q12,D16,D7[0] - VEXT.8 Q7,Q7,Q8,#2 - - VMLAL.S16 Q9,D8,D0[1] - VMLAL.S16 Q10,D9,D1[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] - VEXT.8 Q5,Q5,Q6,#2 - VMLAL.S16 Q9,D12,D4[1] - VMLAL.S16 Q10,D13,D5[1] - VMLAL.S16 Q11,D13,D4[1] - VMLAL.S16 Q12,D14,D5[1] - VEXT.8 Q6,Q6,Q7,#2 - VMLAL.S16 Q9,D14,D6[1] - VMLAL.S16 Q10,D15,D7[1] - VMLAL.S16 Q11,D15,D6[1] - VMLAL.S16 Q12,D16,D7[1] - VEXT.8 Q7,Q7,Q8,#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] - 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] - VEXT.8 Q5,Q5,Q6,#2 - VMLAL.S16 Q9,D12,D4[2] - VMLAL.S16 Q10,D13,D5[2] - VMLAL.S16 Q11,D13,D4[2] - VMLAL.S16 Q12,D14,D5[2] - VEXT.8 Q6,Q6,Q7,#2 - VMLAL.S16 Q9,D14,D6[2] - VMLAL.S16 Q10,D15,D7[2] - VMLAL.S16 Q11,D15,D6[2] - VMLAL.S16 Q12,D16,D7[2] - VEXT.8 Q7,Q7,Q8,#2 - - VMLAL.S16 Q9,D8,D0[3] - VMLAL.S16 Q10,D9,D1[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] - VEXT.8 Q5,Q5,Q6,#2 - VMLAL.S16 Q9,D12,D4[3] - VMLAL.S16 Q10,D13,D5[3] - VMLAL.S16 Q11,D13,D4[3] - VMLAL.S16 Q12,D14,D5[3] - VEXT.8 Q6,Q6,Q7,#2 - VMLAL.S16 Q9,D14,D6[3] - VMLAL.S16 Q10,D15,D7[3] - VMLAL.S16 Q11,D15,D6[3] - VMLAL.S16 Q12,D16,D7[3] - VEXT.8 Q7,Q7,Q8,#2 - - VMOV.S16 D8,D9 - VEXT.8 Q8,Q8,Q15,#2 - VMOV.S16 D9,D10 - VADD.S32 Q9,Q9,Q10 - VMOV.S16 D10,D11 - VMOV.S16 D11,D12 - VADD.S32 Q11,Q11,Q12 - VMOV.S16 D12,D13 - VQRSHRN.S32 D28,Q9,#15 - VMOV.S16 D13,D14 - VMOV.S16 D14,D15 - VQRSHRN.S32 D29,Q11,#15 - VMOV.S16 D15,D16 - - VLD1.S16 {Q8},[r4]! - ADD r5, r5, #8 - CMP r5, #80 - VST1.S16 {D28,D29},[r3]! - BLT LOOP_6K7K - - ADD r0, r13, #160 @x + lg - MOV r1, r12 - @LDR r1, [sp, #-4] @mem address - - VLD1.S16 {D0, D1, D2, D3}, [r0]! - VLD1.S16 {D4, D5, D6, D7}, [r0]! - - VST1.S16 {D0, D1, D2, D3}, [r1]! - 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} - -Lable1: - .word fir_6k_7k - @ENDFUNC - .END - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@ +@**********************************************************************/ +@void Filt_6k_7k( +@ Word16 signal[], /* input: signal */ +@ Word16 lg, /* input: length of input */ +@ Word16 mem[] /* in/out: memory (size=30) */ +@) +@*********************************************************************** +@ r0 --- signal[] +@ r1 --- lg +@ r2 --- mem[] + + .section .text + .global Filt_6k_7k_asm + .extern fir_6k_7k + +Filt_6k_7k_asm: + + 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 + + MOV r0, r2 + MOV r1, r13 + + VLD1.S16 {D0, D1, D2, D3}, [r0]! + VLD1.S16 {D4, D5, D6, D7}, [r0]! + + VST1.S16 {D0, D1, D2, D3}, [r1]! + VST1.S16 {D4, D5, D6}, [r1]! + VST1.S16 D7[0], [r1]! + VST1.S16 D7[1], [r1]! + + + + 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] + @for (i = lg - 1@ i >= 0@ i--) + @{ + @ x[i + L_FIR - 1] = signal[i] >> 2@ + @} + VLD1.S16 {Q0, Q1}, [r7]! @ signal[0] ~ signal[15] + VLD1.S16 {Q2, Q3}, [r7]! @ signal[16] ~ signal[31] + VLD1.S16 {Q4, Q5}, [r7]! @ signal[32] ~ signal[47] + VLD1.S16 {Q6, Q7}, [r7]! @ signal[48] ~ signal[63] + VLD1.S16 {Q8, Q9}, [r7]! @ signal[64] ~ signal[79] + VSHR.S16 Q10, Q0, #2 + VSHR.S16 Q11, Q1, #2 + VSHR.S16 Q12, Q2, #2 + VSHR.S16 Q13, Q3, #2 + VST1.S16 {Q10, Q11}, [r6]! + VSHR.S16 Q0, Q4, #2 + VSHR.S16 Q1, Q5, #2 + VSHR.S16 Q10, Q6, #2 + VSHR.S16 Q11, Q7, #2 + VSHR.S16 Q2, Q8, #2 + VSHR.S16 Q3, Q9, #2 + VST1.S16 {Q12, Q13}, [r6]! + VST1.S16 {Q0, Q1}, [r6]! + VST1.S16 {Q10, Q11}, [r6]! + VST1.S16 {Q2, Q3}, [r6]! + + 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 + + @ 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] + VMOV.S16 D7[3], r5 @set fir_6k_7K = 0 + + 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 + +LOOP_6K7K: + + 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] + VEXT.8 Q5,Q5,Q6,#2 + VMLAL.S16 Q9,D12,D4[0] + VMLAL.S16 Q10,D13,D5[0] + VMLAL.S16 Q11,D13,D4[0] + VMLAL.S16 Q12,D14,D5[0] + VEXT.8 Q6,Q6,Q7,#2 + VMLAL.S16 Q9,D14,D6[0] + VMLAL.S16 Q10,D15,D7[0] + VMLAL.S16 Q11,D15,D6[0] + VMLAL.S16 Q12,D16,D7[0] + VEXT.8 Q7,Q7,Q8,#2 + + VMLAL.S16 Q9,D8,D0[1] + VMLAL.S16 Q10,D9,D1[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] + VEXT.8 Q5,Q5,Q6,#2 + VMLAL.S16 Q9,D12,D4[1] + VMLAL.S16 Q10,D13,D5[1] + VMLAL.S16 Q11,D13,D4[1] + VMLAL.S16 Q12,D14,D5[1] + VEXT.8 Q6,Q6,Q7,#2 + VMLAL.S16 Q9,D14,D6[1] + VMLAL.S16 Q10,D15,D7[1] + VMLAL.S16 Q11,D15,D6[1] + VMLAL.S16 Q12,D16,D7[1] + VEXT.8 Q7,Q7,Q8,#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] + 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] + VEXT.8 Q5,Q5,Q6,#2 + VMLAL.S16 Q9,D12,D4[2] + VMLAL.S16 Q10,D13,D5[2] + VMLAL.S16 Q11,D13,D4[2] + VMLAL.S16 Q12,D14,D5[2] + VEXT.8 Q6,Q6,Q7,#2 + VMLAL.S16 Q9,D14,D6[2] + VMLAL.S16 Q10,D15,D7[2] + VMLAL.S16 Q11,D15,D6[2] + VMLAL.S16 Q12,D16,D7[2] + VEXT.8 Q7,Q7,Q8,#2 + + VMLAL.S16 Q9,D8,D0[3] + VMLAL.S16 Q10,D9,D1[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] + VEXT.8 Q5,Q5,Q6,#2 + VMLAL.S16 Q9,D12,D4[3] + VMLAL.S16 Q10,D13,D5[3] + VMLAL.S16 Q11,D13,D4[3] + VMLAL.S16 Q12,D14,D5[3] + VEXT.8 Q6,Q6,Q7,#2 + VMLAL.S16 Q9,D14,D6[3] + VMLAL.S16 Q10,D15,D7[3] + VMLAL.S16 Q11,D15,D6[3] + VMLAL.S16 Q12,D16,D7[3] + VEXT.8 Q7,Q7,Q8,#2 + + VMOV.S16 D8,D9 + VEXT.8 Q8,Q8,Q15,#2 + VMOV.S16 D9,D10 + VADD.S32 Q9,Q9,Q10 + VMOV.S16 D10,D11 + VMOV.S16 D11,D12 + VADD.S32 Q11,Q11,Q12 + VMOV.S16 D12,D13 + VQRSHRN.S32 D28,Q9,#15 + VMOV.S16 D13,D14 + VMOV.S16 D14,D15 + VQRSHRN.S32 D29,Q11,#15 + VMOV.S16 D15,D16 + + VLD1.S16 {Q8},[r4]! + ADD r5, r5, #8 + CMP r5, #80 + VST1.S16 {D28,D29},[r3]! + BLT LOOP_6K7K + + ADD r0, r13, #160 @x + lg + MOV r1, r12 + @LDR r1, [sp, #-4] @mem address + + VLD1.S16 {D0, D1, D2, D3}, [r0]! + VLD1.S16 {D4, D5, D6, D7}, [r0]! + + VST1.S16 {D0, D1, D2, D3}, [r1]! + 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} + +Lable1: + .word fir_6k_7k + @ENDFUNC + .END + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s index cb1764f..1e65efa 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s @@ -1,133 +1,133 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@ -@**********************************************************************/ -@void Syn_filt_32( -@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ -@ Word16 m, /* (i) : order of LP filter */ -@ Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ -@ Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ -@ Word16 sig_hi[], /* (o) /16 : synthesis high */ -@ Word16 sig_lo[], /* (o) /16 : synthesis low */ -@ Word16 lg /* (i) : size of filtering */ -@) -@*********************************************************************** -@ a[] --- r0 -@ m --- r1 -@ exc[] --- r2 -@ Qnew --- r3 -@ sig_hi[] --- r4 -@ sig_lo[] --- r5 -@ lg --- r6 - - .section .text - .global Syn_filt_32_asm - -Syn_filt_32_asm: - - STMFD r13!, {r4 - r12, r14} - LDR r4, [r13, #40] @ get sig_hi[] address - LDR r5, [r13, #44] @ get sig_lo[] address - - LDRSH r6, [r0], #2 @ load Aq[0] - ADD r7, r3, #4 @ 4 + Q_new - MOV r3, r6, ASR r7 @ a0 = Aq[0] >> (4 + Q_new) - - 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] - - MOV r8, #0 @ i = 0 - - VLD1.S16 {D4, D5, D6, D7}, [r10]! @ sig_hi[-16] ~ sig_hi[-1] - VREV64.16 D0, D0 - 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 - VDUP.S32 Q15, r8 - -SYN_LOOP: - - LDRSH r6, [r2], #2 @exc[i] - @L_tmp = L_msu(L_tmp, sig_lo[i - j], a[j])@ - VMULL.S16 Q10, D8, D3 - VEXT.8 D8, D8, D9, #2 - VMLAL.S16 Q10, D9, D2 - VMLAL.S16 Q10, D10, D1 - VMLAL.S16 Q10, D11, D0 - - 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 - @L_tmp = L_msu(L_tmp, sig_hi[i - j], a[j])@ - - VMLAL.S16 Q11, D6, D1 - VEXT.8 D4, D4, D5, #2 - VMLAL.S16 Q11, D7, D0 - - - VEXT.8 D5, D5, D6, #2 - VEXT.8 D6, D6, D7, #2 - - VPADD.S32 D28, D22, D23 - VPADD.S32 D29, D28, D28 - MOV r14, r12, LSL #1 @exc[i] * a0 << 1 - VDUP.S32 Q11, D29[0] @result2 - - - - VSHR.S32 Q10, Q10, #11 @result1 >>= 11 - VSHL.S32 Q11, Q11, #1 @result2 <<= 1 - VDUP.S32 Q12, r14 - VADD.S32 Q12, Q12, Q10 @L_tmp = L_tmp - (result1 >>= 11) - (result2 <<= 1) - VSUB.S32 Q12, Q12, Q11 - - VSHL.S32 Q12, Q12, #3 @L_tmp <<= 3 - - - VSHRN.S32 D20, Q12, #16 @sig_hi[i] = L_tmp >> 16@ - VMOV.S16 r10, D20[0] - VSHR.S32 Q12, Q12, #4 @L_tmp >>= 4 - VEXT.8 D7, D7, D20, #2 - STRH r10, [r4], #2 @store sig_hi[i] - VMOV.S32 r11, D24[0] @r11 --- L_tmp >>= 4 - ADD r8, r8, #1 - SUB r12, r11, r10, LSL #12 - @MOV r11, r12, ASR #16 @sig_lo[i] - VDUP.S16 D21, r12 - VEXT.8 D11, D11, D21, #2 - STRH r12, [r5], #2 @stroe sig_lo[i] - - CMP r8, #64 - BLT SYN_LOOP - -Syn_filt_32_end: - - LDMFD r13!, {r4 - r12, r15} - @ENDFUNC - .END - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@ +@**********************************************************************/ +@void Syn_filt_32( +@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ +@ Word16 m, /* (i) : order of LP filter */ +@ Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ +@ Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ +@ Word16 sig_hi[], /* (o) /16 : synthesis high */ +@ Word16 sig_lo[], /* (o) /16 : synthesis low */ +@ Word16 lg /* (i) : size of filtering */ +@) +@*********************************************************************** +@ a[] --- r0 +@ m --- r1 +@ exc[] --- r2 +@ Qnew --- r3 +@ sig_hi[] --- r4 +@ sig_lo[] --- r5 +@ lg --- r6 + + .section .text + .global Syn_filt_32_asm + +Syn_filt_32_asm: + + STMFD r13!, {r4 - r12, r14} + LDR r4, [r13, #40] @ get sig_hi[] address + LDR r5, [r13, #44] @ get sig_lo[] address + + LDRSH r6, [r0], #2 @ load Aq[0] + ADD r7, r3, #4 @ 4 + Q_new + MOV r3, r6, ASR r7 @ a0 = Aq[0] >> (4 + Q_new) + + 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] + + MOV r8, #0 @ i = 0 + + VLD1.S16 {D4, D5, D6, D7}, [r10]! @ sig_hi[-16] ~ sig_hi[-1] + VREV64.16 D0, D0 + 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 + VDUP.S32 Q15, r8 + +SYN_LOOP: + + LDRSH r6, [r2], #2 @exc[i] + @L_tmp = L_msu(L_tmp, sig_lo[i - j], a[j])@ + VMULL.S16 Q10, D8, D3 + VEXT.8 D8, D8, D9, #2 + VMLAL.S16 Q10, D9, D2 + VMLAL.S16 Q10, D10, D1 + VMLAL.S16 Q10, D11, D0 + + 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 + @L_tmp = L_msu(L_tmp, sig_hi[i - j], a[j])@ + + VMLAL.S16 Q11, D6, D1 + VEXT.8 D4, D4, D5, #2 + VMLAL.S16 Q11, D7, D0 + + + VEXT.8 D5, D5, D6, #2 + VEXT.8 D6, D6, D7, #2 + + VPADD.S32 D28, D22, D23 + VPADD.S32 D29, D28, D28 + MOV r14, r12, LSL #1 @exc[i] * a0 << 1 + VDUP.S32 Q11, D29[0] @result2 + + + + VSHR.S32 Q10, Q10, #11 @result1 >>= 11 + VSHL.S32 Q11, Q11, #1 @result2 <<= 1 + VDUP.S32 Q12, r14 + VADD.S32 Q12, Q12, Q10 @L_tmp = L_tmp - (result1 >>= 11) - (result2 <<= 1) + VSUB.S32 Q12, Q12, Q11 + + VSHL.S32 Q12, Q12, #3 @L_tmp <<= 3 + + + VSHRN.S32 D20, Q12, #16 @sig_hi[i] = L_tmp >> 16@ + VMOV.S16 r10, D20[0] + VSHR.S32 Q12, Q12, #4 @L_tmp >>= 4 + VEXT.8 D7, D7, D20, #2 + STRH r10, [r4], #2 @store sig_hi[i] + VMOV.S32 r11, D24[0] @r11 --- L_tmp >>= 4 + ADD r8, r8, #1 + SUB r12, r11, r10, LSL #12 + @MOV r11, r12, ASR #16 @sig_lo[i] + VDUP.S16 D21, r12 + VEXT.8 D11, D11, D21, #2 + STRH r12, [r5], #2 @stroe sig_lo[i] + + CMP r8, #64 + BLT SYN_LOOP + +Syn_filt_32_end: + + LDMFD r13!, {r4 - r12, r15} + @ENDFUNC + .END + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s index 2e339db..c314a88 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s @@ -1,151 +1,151 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@ -@static void cor_h_vec_012( -@ Word16 h[], /* (i) scaled impulse response */ -@ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ -@ Word16 track, /* (i) track to use */ -@ Word16 sign[], /* (i) sign vector */ -@ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ -@ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ -@ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ -@) -@r0 ---- h[] -@r1 ---- vec[] -@r2 ---- track -@r3 ---- sign[] -@r4 ---- rrixix[][NB_POS] -@r5 ---- cor_1[] -@r6 ---- cor_2[] - - .section .text - .global cor_h_vec_012_asm - -cor_h_vec_012_asm: - - STMFD r13!, {r4 - r12, r14} - LDR r4, [r13, #40] @load rrixix[][NB_POS] - ADD r7, r4, r2, LSL #5 @r7 --- p0 = rrixix[track] - MOV r4, #0 @i=0 - - @r0 --- h[], r1 --- vec[], r2 --- pos - @r3 --- sign[], r4 --- i, r7 --- p0 - -LOOPi: - MOV r5, #0 @L_sum1 = 0 - MOV r6, #0 @L_sum2 = 0 - ADD r9, r1, r2, LSL #1 @p2 = &vec[pos] - MOV r10, r0 @p1 = h - RSB r11, r2, #62 @j=62-pos - -LOOPj1: - 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 - BGE LOOPj1 - - LDRSH r12, [r10], #2 @*p1++ - MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2) - MLA r5, r12, r14, r5 - MOV r14, #0x8000 - MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) - ADD r10, r6, r14 - ADD r9, r5, r14 - MOV r5, r9, ASR #16 - MOV r6, r10, ASR #16 - ADD r9, r3, r2, LSL #1 @address of sign[pos] - ADD r8, r7, #32 - LDRSH r10, [r9], #2 @sign[pos] - LDRSH r11, [r9] @sign[pos + 1] - MUL r12, r5, r10 - MUL r14, r6, r11 - MOV r5, r12, ASR #15 - MOV r6, r14, ASR #15 - LDR r9, [r13, #44] - LDR r12, [r13, #48] - LDRSH r10, [r7], #2 @*p0++ - LDRSH r11, [r8] @*p3++ - ADD r9, r9, r4, LSL #1 - ADD r12, r12, r4, LSL #1 - ADD r5, r5, r10 - ADD r6, r6, r11 - STRH r5, [r9] - 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] - MOV r10, r0 @p1 = h - RSB r11, r2, #62 @j=62-pos - ADD r4, r4, #1 @i++ - -LOOPj2: - 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 - BGE LOOPj2 - - LDRSH r12, [r10], #2 @*p1++ - MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2) - MLA r5, r12, r14, r5 - MOV r14, #0x8000 - MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) - ADD r10, r6, r14 - ADD r9, r5, r14 - - MOV r5, r9, ASR #16 - MOV r6, r10, ASR #16 - ADD r9, r3, r2, LSL #1 @address of sign[pos] - ADD r8, r7, #32 - LDRSH r10, [r9], #2 @sign[pos] - LDRSH r11, [r9] @sign[pos + 1] - MUL r12, r5, r10 - MUL r14, r6, r11 - MOV r5, r12, ASR #15 - MOV r6, r14, ASR #15 - LDR r9, [r13, #44] - LDR r12, [r13, #48] - LDRSH r10, [r7], #2 @*p0++ - LDRSH r11, [r8] @*p3++ - ADD r9, r9, r4, LSL #1 - ADD r12, r12, r4, LSL #1 - ADD r5, r5, r10 - ADD r6, r6, r11 - STRH r5, [r9] - STRH r6, [r12] - ADD r4, r4, #1 @i+1 - ADD r2, r2, #4 @pos += STEP - CMP r4, #16 - - BLT LOOPi - -the_end: - LDMFD r13!, {r4 - r12, r15} - - .END - - - - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@ +@static void cor_h_vec_012( +@ Word16 h[], /* (i) scaled impulse response */ +@ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ +@ Word16 track, /* (i) track to use */ +@ Word16 sign[], /* (i) sign vector */ +@ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ +@ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ +@ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ +@) +@r0 ---- h[] +@r1 ---- vec[] +@r2 ---- track +@r3 ---- sign[] +@r4 ---- rrixix[][NB_POS] +@r5 ---- cor_1[] +@r6 ---- cor_2[] + + .section .text + .global cor_h_vec_012_asm + +cor_h_vec_012_asm: + + STMFD r13!, {r4 - r12, r14} + LDR r4, [r13, #40] @load rrixix[][NB_POS] + ADD r7, r4, r2, LSL #5 @r7 --- p0 = rrixix[track] + MOV r4, #0 @i=0 + + @r0 --- h[], r1 --- vec[], r2 --- pos + @r3 --- sign[], r4 --- i, r7 --- p0 + +LOOPi: + MOV r5, #0 @L_sum1 = 0 + MOV r6, #0 @L_sum2 = 0 + ADD r9, r1, r2, LSL #1 @p2 = &vec[pos] + MOV r10, r0 @p1 = h + RSB r11, r2, #62 @j=62-pos + +LOOPj1: + 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 + BGE LOOPj1 + + LDRSH r12, [r10], #2 @*p1++ + MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2) + MLA r5, r12, r14, r5 + MOV r14, #0x8000 + MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) + ADD r10, r6, r14 + ADD r9, r5, r14 + MOV r5, r9, ASR #16 + MOV r6, r10, ASR #16 + ADD r9, r3, r2, LSL #1 @address of sign[pos] + ADD r8, r7, #32 + LDRSH r10, [r9], #2 @sign[pos] + LDRSH r11, [r9] @sign[pos + 1] + MUL r12, r5, r10 + MUL r14, r6, r11 + MOV r5, r12, ASR #15 + MOV r6, r14, ASR #15 + LDR r9, [r13, #44] + LDR r12, [r13, #48] + LDRSH r10, [r7], #2 @*p0++ + LDRSH r11, [r8] @*p3++ + ADD r9, r9, r4, LSL #1 + ADD r12, r12, r4, LSL #1 + ADD r5, r5, r10 + ADD r6, r6, r11 + STRH r5, [r9] + 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] + MOV r10, r0 @p1 = h + RSB r11, r2, #62 @j=62-pos + ADD r4, r4, #1 @i++ + +LOOPj2: + 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 + BGE LOOPj2 + + LDRSH r12, [r10], #2 @*p1++ + MOV r6, r6, LSL #2 @L_sum2 = (L_sum2 << 2) + MLA r5, r12, r14, r5 + MOV r14, #0x8000 + MOV r5, r5, LSL #2 @L_sum1 = (L_sum1 << 2) + ADD r10, r6, r14 + ADD r9, r5, r14 + + MOV r5, r9, ASR #16 + MOV r6, r10, ASR #16 + ADD r9, r3, r2, LSL #1 @address of sign[pos] + ADD r8, r7, #32 + LDRSH r10, [r9], #2 @sign[pos] + LDRSH r11, [r9] @sign[pos + 1] + MUL r12, r5, r10 + MUL r14, r6, r11 + MOV r5, r12, ASR #15 + MOV r6, r14, ASR #15 + LDR r9, [r13, #44] + LDR r12, [r13, #48] + LDRSH r10, [r7], #2 @*p0++ + LDRSH r11, [r8] @*p3++ + ADD r9, r9, r4, LSL #1 + ADD r12, r12, r4, LSL #1 + ADD r5, r5, r10 + ADD r6, r6, r11 + STRH r5, [r9] + STRH r6, [r12] + ADD r4, r4, #1 @i+1 + ADD r2, r2, #4 @pos += STEP + CMP r4, #16 + + BLT LOOPi + +the_end: + LDMFD r13!, {r4 - r12, r15} + + .END + + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s index 3b8853f..dffb750 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s @@ -1,100 +1,100 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@ -@void Pred_lt4( -@ Word16 exc[], /* in/out: excitation buffer */ -@ Word16 T0, /* input : integer pitch lag */ -@ Word16 frac, /* input : fraction of lag */ -@ Word16 L_subfr /* input : subframe size */ -@) -@*********************************************************************** -@ r0 --- exc[] -@ r1 --- T0 -@ r2 --- frac -@ r3 --- L_subfr - - .section .text - .global pred_lt4_asm - .extern inter4_2 - -pred_lt4_asm: - - STMFD r13!, {r4 - r12, r14} - SUB r4, r0, r1, LSL #1 @ x = exc - T0 - RSB r2, r2, #0 @ frac = - frac - SUB r4, r4, #30 @ x -= L_INTERPOL2 - 1 - CMP r2, #0 - ADDLT r2, r2, #4 @ frac += UP_SAMP - SUBLT r4, r4, #2 @ x-- - - LDR r11, Lable1 - RSB r2, r2, #3 @ k = UP_SAMP - 1 - frac - MOV r8, #0 @ j = 0 - ADD r11, r11, r2, LSL #6 @ get inter4_2[k][] - - VLD1.S16 {Q0, Q1}, [r11]! - VLD1.S16 {Q2, Q3}, [r11]! - - MOV r6, #0x8000 - - VLD1.S16 {Q4, Q5}, [r4]! @load 16 x[] - VLD1.S16 {Q6, Q7}, [r4]! @load 16 x[] - -LOOP: - VQDMULL.S16 Q15, D8, D0 - VQDMLAL.S16 Q15, D9, D1 - VQDMLAL.S16 Q15, D10, D2 - VQDMLAL.S16 Q15, D11, D3 - - VQDMLAL.S16 Q15, D12, D4 - VQDMLAL.S16 Q15, D13, D5 - VQDMLAL.S16 Q15, D14, D6 - VQDMLAL.S16 Q15, D15, D7 - - LDRSH r12, [r4], #2 - - VEXT.S16 D8, D8, D9, #1 - VEXT.S16 D9, D9, D10, #1 - VEXT.S16 D10, D10, D11, #1 - VEXT.S16 D11, D11, D12, #1 - VDUP.S16 D24, r12 - VEXT.S16 D12, D12, D13, #1 - VEXT.S16 D13, D13, D14, #1 - - VQADD.S32 D30, D30, D31 - MOV r11, #0x8000 - VPADD.S32 D30, D30, D30 - ADD r8, r8, #1 - VMOV.S32 r12, D30[0] - VEXT.S16 D14, D14, D15, #1 - - QADD r1, r12, r12 @ L_sum = (L_sum << 2) - VEXT.S16 D15, D15, D24, #1 - QADD r5, r1, r6 - MOV r1, r5, ASR #16 - CMP r8, r3 - STRH r1, [r0], #2 @ exc[j] = (L_sum + 0x8000) >> 16 - BLT LOOP - -pred_lt4_end: - - LDMFD r13!, {r4 - r12, r15} - -Lable1: - .word inter4_2 - @ENDFUNC - .END - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@ +@void Pred_lt4( +@ Word16 exc[], /* in/out: excitation buffer */ +@ Word16 T0, /* input : integer pitch lag */ +@ Word16 frac, /* input : fraction of lag */ +@ Word16 L_subfr /* input : subframe size */ +@) +@*********************************************************************** +@ r0 --- exc[] +@ r1 --- T0 +@ r2 --- frac +@ r3 --- L_subfr + + .section .text + .global pred_lt4_asm + .extern inter4_2 + +pred_lt4_asm: + + STMFD r13!, {r4 - r12, r14} + SUB r4, r0, r1, LSL #1 @ x = exc - T0 + RSB r2, r2, #0 @ frac = - frac + SUB r4, r4, #30 @ x -= L_INTERPOL2 - 1 + CMP r2, #0 + ADDLT r2, r2, #4 @ frac += UP_SAMP + SUBLT r4, r4, #2 @ x-- + + LDR r11, Lable1 + RSB r2, r2, #3 @ k = UP_SAMP - 1 - frac + MOV r8, #0 @ j = 0 + ADD r11, r11, r2, LSL #6 @ get inter4_2[k][] + + VLD1.S16 {Q0, Q1}, [r11]! + VLD1.S16 {Q2, Q3}, [r11]! + + MOV r6, #0x8000 + + VLD1.S16 {Q4, Q5}, [r4]! @load 16 x[] + VLD1.S16 {Q6, Q7}, [r4]! @load 16 x[] + +LOOP: + VQDMULL.S16 Q15, D8, D0 + VQDMLAL.S16 Q15, D9, D1 + VQDMLAL.S16 Q15, D10, D2 + VQDMLAL.S16 Q15, D11, D3 + + VQDMLAL.S16 Q15, D12, D4 + VQDMLAL.S16 Q15, D13, D5 + VQDMLAL.S16 Q15, D14, D6 + VQDMLAL.S16 Q15, D15, D7 + + LDRSH r12, [r4], #2 + + VEXT.S16 D8, D8, D9, #1 + VEXT.S16 D9, D9, D10, #1 + VEXT.S16 D10, D10, D11, #1 + VEXT.S16 D11, D11, D12, #1 + VDUP.S16 D24, r12 + VEXT.S16 D12, D12, D13, #1 + VEXT.S16 D13, D13, D14, #1 + + VQADD.S32 D30, D30, D31 + MOV r11, #0x8000 + VPADD.S32 D30, D30, D30 + ADD r8, r8, #1 + VMOV.S32 r12, D30[0] + VEXT.S16 D14, D14, D15, #1 + + QADD r1, r12, r12 @ L_sum = (L_sum << 2) + VEXT.S16 D15, D15, D24, #1 + QADD r5, r1, r6 + MOV r1, r5, ASR #16 + CMP r8, r3 + STRH r1, [r0], #2 @ exc[j] = (L_sum + 0x8000) >> 16 + BLT LOOP + +pred_lt4_end: + + LDMFD r13!, {r4 - r12, r15} + +Lable1: + .word inter4_2 + @ENDFUNC + .END + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s index 14957d8..bbd354d 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s @@ -1,138 +1,138 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@ -@**********************************************************************/ -@void Scale_sig( -@ Word16 x[], /* (i/o) : signal to scale */ -@ Word16 lg, /* (i) : size of x[] */ -@ Word16 exp /* (i) : exponent: x = round(x << exp) */ -@) -@*********************************************************************** -@ x[] --- r0 -@ lg --- r1 -@ exp --- r2 - - .section .text - .global Scale_sig_opt - -Scale_sig_opt: - - STMFD r13!, {r4 - r12, r14} - MOV r4, #4 - VMOV.S32 Q15, #0x8000 - VDUP.S32 Q14, r2 - MOV r5, r0 @ copy x[] address - CMP r1, #64 - MOVEQ r4, #1 - BEQ LOOP - CMP r1, #128 - MOVEQ r4, #2 - BEQ LOOP - CMP r1, #256 - BEQ LOOP - CMP r1, #80 - MOVEQ r4, #1 - BEQ LOOP1 - -LOOP1: - VLD1.S16 {Q0, Q1}, [r5]! @load 16 Word16 x[] - VSHLL.S16 Q10, D0, #16 - VSHLL.S16 Q11, D1, #16 - VSHLL.S16 Q12, D2, #16 - VSHLL.S16 Q13, D3, #16 - VSHL.S32 Q10, Q10, Q14 - VSHL.S32 Q11, Q11, Q14 - VSHL.S32 Q12, Q12, Q14 - VSHL.S32 Q13, Q13, Q14 - VADDHN.S32 D16, Q10, Q15 - VADDHN.S32 D17, Q11, Q15 - VADDHN.S32 D18, Q12, Q15 - VADDHN.S32 D19, Q13, Q15 - VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] - -LOOP: - VLD1.S16 {Q0, Q1}, [r5]! @load 16 Word16 x[] - VLD1.S16 {Q2, Q3}, [r5]! @load 16 Word16 x[] - VLD1.S16 {Q4, Q5}, [r5]! @load 16 Word16 x[] - VLD1.S16 {Q6, Q7}, [r5]! @load 16 Word16 x[] - - VSHLL.S16 Q8, D0, #16 - VSHLL.S16 Q9, D1, #16 - VSHLL.S16 Q10, D2, #16 - VSHLL.S16 Q11, D3, #16 - VSHL.S32 Q8, Q8, Q14 - VSHL.S32 Q9, Q9, Q14 - VSHL.S32 Q10, Q10, Q14 - VSHL.S32 Q11, Q11, Q14 - VADDHN.S32 D16, Q8, Q15 - VADDHN.S32 D17, Q9, Q15 - VADDHN.S32 D18, Q10, Q15 - VADDHN.S32 D19, Q11, Q15 - VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] - - - VSHLL.S16 Q12, D4, #16 - VSHLL.S16 Q13, D5, #16 - VSHLL.S16 Q10, D6, #16 - VSHLL.S16 Q11, D7, #16 - VSHL.S32 Q12, Q12, Q14 - VSHL.S32 Q13, Q13, Q14 - VSHL.S32 Q10, Q10, Q14 - VSHL.S32 Q11, Q11, Q14 - VADDHN.S32 D16, Q12, Q15 - VADDHN.S32 D17, Q13, Q15 - VADDHN.S32 D18, Q10, Q15 - VADDHN.S32 D19, Q11, Q15 - VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] - - VSHLL.S16 Q10, D8, #16 - VSHLL.S16 Q11, D9, #16 - VSHLL.S16 Q12, D10, #16 - VSHLL.S16 Q13, D11, #16 - VSHL.S32 Q10, Q10, Q14 - VSHL.S32 Q11, Q11, Q14 - VSHL.S32 Q12, Q12, Q14 - VSHL.S32 Q13, Q13, Q14 - VADDHN.S32 D16, Q10, Q15 - VADDHN.S32 D17, Q11, Q15 - VADDHN.S32 D18, Q12, Q15 - VADDHN.S32 D19, Q13, Q15 - VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] - - VSHLL.S16 Q10, D12, #16 - VSHLL.S16 Q11, D13, #16 - VSHLL.S16 Q12, D14, #16 - VSHLL.S16 Q13, D15, #16 - VSHL.S32 Q10, Q10, Q14 - VSHL.S32 Q11, Q11, Q14 - VSHL.S32 Q12, Q12, Q14 - VSHL.S32 Q13, Q13, Q14 - VADDHN.S32 D16, Q10, Q15 - VADDHN.S32 D17, Q11, Q15 - VADDHN.S32 D18, Q12, Q15 - VADDHN.S32 D19, Q13, Q15 - VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] - SUBS r4, r4, #1 - BGT LOOP - - -Scale_sig_asm_end: - - LDMFD r13!, {r4 - r12, r15} - @ENDFUNC - .END - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@ +@**********************************************************************/ +@void Scale_sig( +@ Word16 x[], /* (i/o) : signal to scale */ +@ Word16 lg, /* (i) : size of x[] */ +@ Word16 exp /* (i) : exponent: x = round(x << exp) */ +@) +@*********************************************************************** +@ x[] --- r0 +@ lg --- r1 +@ exp --- r2 + + .section .text + .global Scale_sig_opt + +Scale_sig_opt: + + STMFD r13!, {r4 - r12, r14} + MOV r4, #4 + VMOV.S32 Q15, #0x8000 + VDUP.S32 Q14, r2 + MOV r5, r0 @ copy x[] address + CMP r1, #64 + MOVEQ r4, #1 + BEQ LOOP + CMP r1, #128 + MOVEQ r4, #2 + BEQ LOOP + CMP r1, #256 + BEQ LOOP + CMP r1, #80 + MOVEQ r4, #1 + BEQ LOOP1 + +LOOP1: + VLD1.S16 {Q0, Q1}, [r5]! @load 16 Word16 x[] + VSHLL.S16 Q10, D0, #16 + VSHLL.S16 Q11, D1, #16 + VSHLL.S16 Q12, D2, #16 + VSHLL.S16 Q13, D3, #16 + VSHL.S32 Q10, Q10, Q14 + VSHL.S32 Q11, Q11, Q14 + VSHL.S32 Q12, Q12, Q14 + VSHL.S32 Q13, Q13, Q14 + VADDHN.S32 D16, Q10, Q15 + VADDHN.S32 D17, Q11, Q15 + VADDHN.S32 D18, Q12, Q15 + VADDHN.S32 D19, Q13, Q15 + VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] + +LOOP: + VLD1.S16 {Q0, Q1}, [r5]! @load 16 Word16 x[] + VLD1.S16 {Q2, Q3}, [r5]! @load 16 Word16 x[] + VLD1.S16 {Q4, Q5}, [r5]! @load 16 Word16 x[] + VLD1.S16 {Q6, Q7}, [r5]! @load 16 Word16 x[] + + VSHLL.S16 Q8, D0, #16 + VSHLL.S16 Q9, D1, #16 + VSHLL.S16 Q10, D2, #16 + VSHLL.S16 Q11, D3, #16 + VSHL.S32 Q8, Q8, Q14 + VSHL.S32 Q9, Q9, Q14 + VSHL.S32 Q10, Q10, Q14 + VSHL.S32 Q11, Q11, Q14 + VADDHN.S32 D16, Q8, Q15 + VADDHN.S32 D17, Q9, Q15 + VADDHN.S32 D18, Q10, Q15 + VADDHN.S32 D19, Q11, Q15 + VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] + + + VSHLL.S16 Q12, D4, #16 + VSHLL.S16 Q13, D5, #16 + VSHLL.S16 Q10, D6, #16 + VSHLL.S16 Q11, D7, #16 + VSHL.S32 Q12, Q12, Q14 + VSHL.S32 Q13, Q13, Q14 + VSHL.S32 Q10, Q10, Q14 + VSHL.S32 Q11, Q11, Q14 + VADDHN.S32 D16, Q12, Q15 + VADDHN.S32 D17, Q13, Q15 + VADDHN.S32 D18, Q10, Q15 + VADDHN.S32 D19, Q11, Q15 + VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] + + VSHLL.S16 Q10, D8, #16 + VSHLL.S16 Q11, D9, #16 + VSHLL.S16 Q12, D10, #16 + VSHLL.S16 Q13, D11, #16 + VSHL.S32 Q10, Q10, Q14 + VSHL.S32 Q11, Q11, Q14 + VSHL.S32 Q12, Q12, Q14 + VSHL.S32 Q13, Q13, Q14 + VADDHN.S32 D16, Q10, Q15 + VADDHN.S32 D17, Q11, Q15 + VADDHN.S32 D18, Q12, Q15 + VADDHN.S32 D19, Q13, Q15 + VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] + + VSHLL.S16 Q10, D12, #16 + VSHLL.S16 Q11, D13, #16 + VSHLL.S16 Q12, D14, #16 + VSHLL.S16 Q13, D15, #16 + VSHL.S32 Q10, Q10, Q14 + VSHL.S32 Q11, Q11, Q14 + VSHL.S32 Q12, Q12, Q14 + VSHL.S32 Q13, Q13, Q14 + VADDHN.S32 D16, Q10, Q15 + VADDHN.S32 D17, Q11, Q15 + VADDHN.S32 D18, Q12, Q15 + VADDHN.S32 D19, Q13, Q15 + VST1.S16 {Q8, Q9}, [r0]! @store 16 Word16 x[] + SUBS r4, r4, #1 + BGT LOOP + + +Scale_sig_asm_end: + + LDMFD r13!, {r4 - r12, r15} + @ENDFUNC + .END + + diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s index dc3d4a8..db4559c 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s @@ -1,106 +1,106 @@ -@/* -@ ** Copyright 2003-2010, VisualOn, Inc. -@ ** -@ ** Licensed under the Apache License, Version 2.0 (the "License"); -@ ** you may not use this file except in compliance with the License. -@ ** You may obtain a copy of the License at -@ ** -@ ** http://www.apache.org/licenses/LICENSE-2.0 -@ ** -@ ** Unless required by applicable law or agreed to in writing, software -@ ** distributed under the License is distributed on an "AS IS" BASIS, -@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@ ** See the License for the specific language governing permissions and -@ ** limitations under the License. -@ */ -@ -@void Syn_filt( -@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ -@ Word16 x[], /* (i) : input signal */ -@ Word16 y[], /* (o) : output signal */ -@ Word16 mem[], /* (i/o) : memory associated with this filtering. */ -@) -@*********************************************************************** -@ a[] --- r0 -@ x[] --- r1 -@ y[] --- r2 -@ mem[] --- r3 -@ m --- 16 lg --- 80 update --- 1 - - .section .text - .global Syn_filt_asm - -Syn_filt_asm: - - 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]@ - @} - VLD1.S16 {D0, D1, D2, D3}, [r4]! @load 16 mems - VST1.S16 {D0, D1, D2, D3}, [r5]! @store 16 mem[] to *yy - - LDRSH r5, [r0], #2 @ load a[0] - MOV r8, #0 @ i = 0 - MOV r5, r5, ASR #1 @ a0 = a[0] >> 1 - VMOV.S16 D8[0], r5 - @ load all a[] - VLD1.S16 {D0, D1, D2, D3}, [r0]! @ load a[1] ~ a[16] - VREV64.16 D0, D0 - VREV64.16 D1, D1 - VREV64.16 D2, D2 - VREV64.16 D3, D3 - MOV r8, #0 @ loop times - MOV r10, r13 @ temp = y_buf - ADD r4, r13, #32 @ yy[i] address - - VLD1.S16 {D4, D5, D6, D7}, [r10]! @ first 16 temp_p - -SYN_LOOP: - - LDRSH r6, [r1], #2 @ load x[i] - MUL r12, r6, r5 @ L_tmp = x[i] * a0 - ADD r10, r4, r8, LSL #1 @ y[i], yy[i] address - - VDUP.S32 Q10, r12 - VMULL.S16 Q5, D3, D4 - VMLAL.S16 Q5, D2, D5 - VMLAL.S16 Q5, D1, D6 - VMLAL.S16 Q5, D0, D7 - VEXT.8 D4, D4, D5, #2 - VEXT.8 D5, D5, D6, #2 - VEXT.8 D6, D6, D7, #2 - VPADD.S32 D12, D10, D11 - ADD r8, r8, #1 - VPADD.S32 D10, D12, D12 - - VDUP.S32 Q7, D10[0] - - VSUB.S32 Q9, Q10, Q7 - VQRSHRN.S32 D20, Q9, #12 - VMOV.S16 r9, D20[0] - VEXT.8 D7, D7, D20, #2 - CMP r8, #80 - STRH r9, [r10] @ yy[i] - STRH r9, [r2], #2 @ y[i] - - BLT SYN_LOOP - - @ update mem[] - ADD r5, r13, #160 @ yy[64] address - VLD1.S16 {D0, D1, D2, D3}, [r5]! - VST1.S16 {D0, D1, D2, D3}, [r3]! - -Syn_filt_asm_end: - - ADD r13, r13, #700 - LDMFD r13!, {r4 - r12, r15} - @ENDFUNC - .END - - +@/* +@ ** Copyright 2003-2010, VisualOn, Inc. +@ ** +@ ** Licensed under the Apache License, Version 2.0 (the "License"); +@ ** you may not use this file except in compliance with the License. +@ ** You may obtain a copy of the License at +@ ** +@ ** http://www.apache.org/licenses/LICENSE-2.0 +@ ** +@ ** Unless required by applicable law or agreed to in writing, software +@ ** distributed under the License is distributed on an "AS IS" BASIS, +@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@ ** See the License for the specific language governing permissions and +@ ** limitations under the License. +@ */ +@ +@void Syn_filt( +@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ +@ Word16 x[], /* (i) : input signal */ +@ Word16 y[], /* (o) : output signal */ +@ Word16 mem[], /* (i/o) : memory associated with this filtering. */ +@) +@*********************************************************************** +@ a[] --- r0 +@ x[] --- r1 +@ y[] --- r2 +@ mem[] --- r3 +@ m --- 16 lg --- 80 update --- 1 + + .section .text + .global Syn_filt_asm + +Syn_filt_asm: + + 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]@ + @} + VLD1.S16 {D0, D1, D2, D3}, [r4]! @load 16 mems + VST1.S16 {D0, D1, D2, D3}, [r5]! @store 16 mem[] to *yy + + LDRSH r5, [r0], #2 @ load a[0] + MOV r8, #0 @ i = 0 + MOV r5, r5, ASR #1 @ a0 = a[0] >> 1 + VMOV.S16 D8[0], r5 + @ load all a[] + VLD1.S16 {D0, D1, D2, D3}, [r0]! @ load a[1] ~ a[16] + VREV64.16 D0, D0 + VREV64.16 D1, D1 + VREV64.16 D2, D2 + VREV64.16 D3, D3 + MOV r8, #0 @ loop times + MOV r10, r13 @ temp = y_buf + ADD r4, r13, #32 @ yy[i] address + + VLD1.S16 {D4, D5, D6, D7}, [r10]! @ first 16 temp_p + +SYN_LOOP: + + LDRSH r6, [r1], #2 @ load x[i] + MUL r12, r6, r5 @ L_tmp = x[i] * a0 + ADD r10, r4, r8, LSL #1 @ y[i], yy[i] address + + VDUP.S32 Q10, r12 + VMULL.S16 Q5, D3, D4 + VMLAL.S16 Q5, D2, D5 + VMLAL.S16 Q5, D1, D6 + VMLAL.S16 Q5, D0, D7 + VEXT.8 D4, D4, D5, #2 + VEXT.8 D5, D5, D6, #2 + VEXT.8 D6, D6, D7, #2 + VPADD.S32 D12, D10, D11 + ADD r8, r8, #1 + VPADD.S32 D10, D12, D12 + + VDUP.S32 Q7, D10[0] + + VSUB.S32 Q9, Q10, Q7 + VQRSHRN.S32 D20, Q9, #12 + VMOV.S16 r9, D20[0] + VEXT.8 D7, D7, D20, #2 + CMP r8, #80 + STRH r9, [r10] @ yy[i] + STRH r9, [r2], #2 @ y[i] + + BLT SYN_LOOP + + @ update mem[] + ADD r5, r13, #160 @ yy[64] address + VLD1.S16 {D0, D1, D2, D3}, [r5]! + VST1.S16 {D0, D1, D2, D3}, [r3]! + +Syn_filt_asm_end: + + ADD r13, r13, #700 + LDMFD r13!, {r4 - r12, r15} + @ENDFUNC + .END + + diff --git a/media/libstagefright/codecs/amrwbenc/src/autocorr.c b/media/libstagefright/codecs/amrwbenc/src/autocorr.c index 33ed670..9baa937 100644 --- a/media/libstagefright/codecs/amrwbenc/src/autocorr.c +++ b/media/libstagefright/codecs/amrwbenc/src/autocorr.c @@ -1,127 +1,127 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - - -/*********************************************************************** -* File: autocorr.c * -* * -* Description:Compute autocorrelations of signal with windowing * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "oper_32b.h" -#include "acelp.h" -#include "ham_wind.tab" - -void Autocorr( - Word16 x[], /* (i) : Input signal */ - Word16 m, /* (i) : LPC order */ - Word16 r_h[], /* (o) Q15: Autocorrelations (msb) */ - Word16 r_l[] /* (o) : Autocorrelations (lsb) */ - ) -{ - Word32 i, norm, shift; - Word16 y[L_WINDOW]; - Word32 L_sum, L_sum1, L_tmp, F_LEN; - Word16 *p1,*p2,*p3; - const Word16 *p4; - /* Windowing of signal */ - p1 = x; - p4 = vo_window; - p3 = y; - - for (i = 0; i < L_WINDOW; i+=4) - { - *p3++ = vo_mult_r((*p1++), (*p4++)); - *p3++ = vo_mult_r((*p1++), (*p4++)); - *p3++ = vo_mult_r((*p1++), (*p4++)); - *p3++ = vo_mult_r((*p1++), (*p4++)); - } - - /* calculate energy of signal */ - L_sum = vo_L_deposit_h(16); /* sqrt(256), avoid overflow after rounding */ - for (i = 0; i < L_WINDOW; i++) - { - L_tmp = vo_L_mult(y[i], y[i]); - L_tmp = (L_tmp >> 8); - L_sum += L_tmp; - } - - /* scale signal to avoid overflow in autocorrelation */ - norm = norm_l(L_sum); - shift = 4 - (norm >> 1); - if(shift > 0) - { - p1 = y; - for (i = 0; i < L_WINDOW; i+=4) - { - *p1 = vo_shr_r(*p1, shift); - p1++; - *p1 = vo_shr_r(*p1, shift); - p1++; - *p1 = vo_shr_r(*p1, shift); - p1++; - *p1 = vo_shr_r(*p1, shift); - p1++; - } - } - - /* Compute and normalize r[0] */ - L_sum = 1; - for (i = 0; i < L_WINDOW; i+=4) - { - L_sum += vo_L_mult(y[i], y[i]); - L_sum += vo_L_mult(y[i+1], y[i+1]); - L_sum += vo_L_mult(y[i+2], y[i+2]); - L_sum += vo_L_mult(y[i+3], y[i+3]); - } - - norm = norm_l(L_sum); - L_sum = (L_sum << norm); - - r_h[0] = L_sum >> 16; - r_l[0] = (L_sum & 0xffff)>>1; - - /* Compute r[1] to r[m] */ - for (i = 1; i <= 8; i++) - { - L_sum1 = 0; - L_sum = 0; - F_LEN = (Word32)(L_WINDOW - 2*i); - p1 = y; - p2 = y + (2*i)-1; - do{ - L_sum1 += *p1 * *p2++; - L_sum += *p1++ * *p2; - }while(--F_LEN!=0); - - L_sum1 += *p1 * *p2++; - - L_sum1 = L_sum1<> 15; - r_l[(2*i)-1] = L_sum1 & 0x00007fff; - r_h[(2*i)] = L_sum >> 15; - r_l[(2*i)] = L_sum & 0x00007fff; - } - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + + +/*********************************************************************** +* File: autocorr.c * +* * +* Description:Compute autocorrelations of signal with windowing * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "acelp.h" +#include "ham_wind.tab" + +void Autocorr( + Word16 x[], /* (i) : Input signal */ + Word16 m, /* (i) : LPC order */ + Word16 r_h[], /* (o) Q15: Autocorrelations (msb) */ + Word16 r_l[] /* (o) : Autocorrelations (lsb) */ + ) +{ + Word32 i, norm, shift; + Word16 y[L_WINDOW]; + Word32 L_sum, L_sum1, L_tmp, F_LEN; + Word16 *p1,*p2,*p3; + const Word16 *p4; + /* Windowing of signal */ + p1 = x; + p4 = vo_window; + p3 = y; + + for (i = 0; i < L_WINDOW; i+=4) + { + *p3++ = vo_mult_r((*p1++), (*p4++)); + *p3++ = vo_mult_r((*p1++), (*p4++)); + *p3++ = vo_mult_r((*p1++), (*p4++)); + *p3++ = vo_mult_r((*p1++), (*p4++)); + } + + /* calculate energy of signal */ + L_sum = vo_L_deposit_h(16); /* sqrt(256), avoid overflow after rounding */ + for (i = 0; i < L_WINDOW; i++) + { + L_tmp = vo_L_mult(y[i], y[i]); + L_tmp = (L_tmp >> 8); + L_sum += L_tmp; + } + + /* scale signal to avoid overflow in autocorrelation */ + norm = norm_l(L_sum); + shift = 4 - (norm >> 1); + if(shift > 0) + { + p1 = y; + for (i = 0; i < L_WINDOW; i+=4) + { + *p1 = vo_shr_r(*p1, shift); + p1++; + *p1 = vo_shr_r(*p1, shift); + p1++; + *p1 = vo_shr_r(*p1, shift); + p1++; + *p1 = vo_shr_r(*p1, shift); + p1++; + } + } + + /* Compute and normalize r[0] */ + L_sum = 1; + for (i = 0; i < L_WINDOW; i+=4) + { + L_sum += vo_L_mult(y[i], y[i]); + L_sum += vo_L_mult(y[i+1], y[i+1]); + L_sum += vo_L_mult(y[i+2], y[i+2]); + L_sum += vo_L_mult(y[i+3], y[i+3]); + } + + norm = norm_l(L_sum); + L_sum = (L_sum << norm); + + r_h[0] = L_sum >> 16; + r_l[0] = (L_sum & 0xffff)>>1; + + /* Compute r[1] to r[m] */ + for (i = 1; i <= 8; i++) + { + L_sum1 = 0; + L_sum = 0; + F_LEN = (Word32)(L_WINDOW - 2*i); + p1 = y; + p2 = y + (2*i)-1; + do{ + L_sum1 += *p1 * *p2++; + L_sum += *p1++ * *p2; + }while(--F_LEN!=0); + + L_sum1 += *p1 * *p2++; + + L_sum1 = L_sum1<> 15; + r_l[(2*i)-1] = L_sum1 & 0x00007fff; + r_h[(2*i)] = L_sum >> 15; + r_l[(2*i)] = L_sum & 0x00007fff; + } + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/az_isp.c b/media/libstagefright/codecs/amrwbenc/src/az_isp.c index 8259f91..9333d19 100644 --- a/media/libstagefright/codecs/amrwbenc/src/az_isp.c +++ b/media/libstagefright/codecs/amrwbenc/src/az_isp.c @@ -1,268 +1,268 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: az_isp.c -* -* Description: -*-----------------------------------------------------------------------* -* Compute the ISPs from the LPC coefficients (order=M) * -*-----------------------------------------------------------------------* -* * -* The ISPs are the roots of the two polynomials F1(z) and F2(z) * -* defined as * -* F1(z) = A(z) + z^-m A(z^-1) * -* and F2(z) = A(z) - z^-m A(z^-1) * -* * -* For a even order m=2n, F1(z) has M/2 conjugate roots on the unit * -* circle and F2(z) has M/2-1 conjugate roots on the unit circle in * -* addition to two roots at 0 and pi. * -* * -* For a 16th order LP analysis, F1(z) and F2(z) can be written as * -* * -* F1(z) = (1 + a[M]) PRODUCT (1 - 2 cos(w_i) z^-1 + z^-2 ) * -* i=0,2,4,6,8,10,12,14 * -* * -* F2(z) = (1 - a[M]) (1 - z^-2) PRODUCT (1 - 2 cos(w_i) z^-1 + z^-2 ) * -* i=1,3,5,7,9,11,13 * -* * -* The ISPs are the M-1 frequencies w_i, i=0...M-2 plus the last * -* predictor coefficient a[M]. * -*-----------------------------------------------------------------------* - -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "oper_32b.h" -#include "stdio.h" -#include "grid100.tab" - -#define M 16 -#define NC (M/2) - -/* local function */ -static __inline Word16 Chebps2(Word16 x, Word16 f[], Word32 n); - -void Az_isp( - Word16 a[], /* (i) Q12 : predictor coefficients */ - Word16 isp[], /* (o) Q15 : Immittance spectral pairs */ - Word16 old_isp[] /* (i) : old isp[] (in case not found M roots) */ - ) -{ - Word32 i, j, nf, ip, order; - Word16 xlow, ylow, xhigh, yhigh, xmid, ymid, xint; - Word16 x, y, sign, exp; - Word16 *coef; - Word16 f1[NC + 1], f2[NC]; - Word32 t0; - /*-------------------------------------------------------------* - * find the sum and diff polynomials F1(z) and F2(z) * - * F1(z) = [A(z) + z^M A(z^-1)] * - * F2(z) = [A(z) - z^M A(z^-1)]/(1-z^-2) * - * * - * for (i=0; i> 1) + (xhigh >> 1); /* xmid = (xlow + xhigh)/2 */ - ymid = Chebps2(xmid, coef, order); - if ((ylow * ymid) <= (Word32) 0) - { - yhigh = ymid; - xhigh = xmid; - } else - { - ylow = ymid; - xlow = xmid; - } - } - /*-------------------------------------------------------------* - * Linear interpolation * - * xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow); * - *-------------------------------------------------------------*/ - x = xhigh - xlow; - y = yhigh - ylow; - if (y == 0) - { - xint = xlow; - } else - { - sign = y; - y = abs_s(y); - exp = norm_s(y); - y = y << exp; - y = div_s((Word16) 16383, y); - t0 = x * y; - t0 = (t0 >> (19 - exp)); - y = vo_extract_l(t0); /* y= (xhigh-xlow)/(yhigh-ylow) in Q11 */ - if (sign < 0) - y = -y; - t0 = ylow * y; /* result in Q26 */ - t0 = (t0 >> 10); /* result in Q15 */ - xint = vo_sub(xlow, vo_extract_l(t0)); /* xint = xlow - ylow*y */ - } - isp[nf] = xint; - xlow = xint; - nf++; - if (ip == 0) - { - ip = 1; - coef = f2; - order = NC - 1; - } else - { - ip = 0; - coef = f1; - order = NC; - } - ylow = Chebps2(xlow, coef, order); - } - } - /* Check if M-1 roots found */ - if(nf < M - 1) - { - for (i = 0; i < M; i++) - { - isp[i] = old_isp[i]; - } - } else - { - isp[M - 1] = a[M] << 3; /* From Q12 to Q15 with saturation */ - } - return; -} - -/*--------------------------------------------------------------* -* function Chebps2: * -* ~~~~~~~ * -* Evaluates the Chebishev polynomial series * -*--------------------------------------------------------------* -* * -* The polynomial order is * -* n = M/2 (M is the prediction order) * -* The polynomial is given by * -* C(x) = f(0)T_n(x) + f(1)T_n-1(x) + ... +f(n-1)T_1(x) + f(n)/2 * -* Arguments: * -* x: input value of evaluation; x = cos(frequency) in Q15 * -* f[]: coefficients of the pol. in Q11 * -* n: order of the pol. * -* * -* The value of C(x) is returned. (Satured to +-1.99 in Q14) * -* * -*--------------------------------------------------------------*/ - -static __inline Word16 Chebps2(Word16 x, Word16 f[], Word32 n) -{ - Word32 i, cheb; - Word16 b0_h, b0_l, b1_h, b1_l, b2_h, b2_l; - Word32 t0; - - /* Note: All computation are done in Q24. */ - - t0 = f[0] << 13; - b2_h = t0 >> 16; - b2_l = (t0 & 0xffff)>>1; - - t0 = ((b2_h * x)<<1) + (((b2_l * x)>>15)<<1); - t0 <<= 1; - t0 += (f[1] << 13); /* + f[1] in Q24 */ - - b1_h = t0 >> 16; - b1_l = (t0 & 0xffff) >> 1; - - for (i = 2; i < n; i++) - { - t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1); - - t0 += (b2_h * (-16384))<<1; - t0 += (f[i] << 12); - t0 <<= 1; - t0 -= (b2_l << 1); /* t0 = 2.0*x*b1 - b2 + f[i]; */ - - b0_h = t0 >> 16; - b0_l = (t0 & 0xffff) >> 1; - - b2_l = b1_l; /* b2 = b1; */ - b2_h = b1_h; - b1_l = b0_l; /* b1 = b0; */ - b1_h = b0_h; - } - - t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1); - t0 += (b2_h * (-32768))<<1; /* t0 = x*b1 - b2 */ - t0 -= (b2_l << 1); - t0 += (f[n] << 12); /* t0 = x*b1 - b2 + f[i]/2 */ - - t0 = L_shl2(t0, 6); /* Q24 to Q30 with saturation */ - - cheb = extract_h(t0); /* Result in Q14 */ - - if (cheb == -32768) - { - cheb = -32767; /* to avoid saturation in Az_isp */ - } - return (cheb); -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: az_isp.c +* +* Description: +*-----------------------------------------------------------------------* +* Compute the ISPs from the LPC coefficients (order=M) * +*-----------------------------------------------------------------------* +* * +* The ISPs are the roots of the two polynomials F1(z) and F2(z) * +* defined as * +* F1(z) = A(z) + z^-m A(z^-1) * +* and F2(z) = A(z) - z^-m A(z^-1) * +* * +* For a even order m=2n, F1(z) has M/2 conjugate roots on the unit * +* circle and F2(z) has M/2-1 conjugate roots on the unit circle in * +* addition to two roots at 0 and pi. * +* * +* For a 16th order LP analysis, F1(z) and F2(z) can be written as * +* * +* F1(z) = (1 + a[M]) PRODUCT (1 - 2 cos(w_i) z^-1 + z^-2 ) * +* i=0,2,4,6,8,10,12,14 * +* * +* F2(z) = (1 - a[M]) (1 - z^-2) PRODUCT (1 - 2 cos(w_i) z^-1 + z^-2 ) * +* i=1,3,5,7,9,11,13 * +* * +* The ISPs are the M-1 frequencies w_i, i=0...M-2 plus the last * +* predictor coefficient a[M]. * +*-----------------------------------------------------------------------* + +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "stdio.h" +#include "grid100.tab" + +#define M 16 +#define NC (M/2) + +/* local function */ +static __inline Word16 Chebps2(Word16 x, Word16 f[], Word32 n); + +void Az_isp( + Word16 a[], /* (i) Q12 : predictor coefficients */ + Word16 isp[], /* (o) Q15 : Immittance spectral pairs */ + Word16 old_isp[] /* (i) : old isp[] (in case not found M roots) */ + ) +{ + Word32 i, j, nf, ip, order; + Word16 xlow, ylow, xhigh, yhigh, xmid, ymid, xint; + Word16 x, y, sign, exp; + Word16 *coef; + Word16 f1[NC + 1], f2[NC]; + Word32 t0; + /*-------------------------------------------------------------* + * find the sum and diff polynomials F1(z) and F2(z) * + * F1(z) = [A(z) + z^M A(z^-1)] * + * F2(z) = [A(z) - z^M A(z^-1)]/(1-z^-2) * + * * + * for (i=0; i> 1) + (xhigh >> 1); /* xmid = (xlow + xhigh)/2 */ + ymid = Chebps2(xmid, coef, order); + if ((ylow * ymid) <= (Word32) 0) + { + yhigh = ymid; + xhigh = xmid; + } else + { + ylow = ymid; + xlow = xmid; + } + } + /*-------------------------------------------------------------* + * Linear interpolation * + * xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow); * + *-------------------------------------------------------------*/ + x = xhigh - xlow; + y = yhigh - ylow; + if (y == 0) + { + xint = xlow; + } else + { + sign = y; + y = abs_s(y); + exp = norm_s(y); + y = y << exp; + y = div_s((Word16) 16383, y); + t0 = x * y; + t0 = (t0 >> (19 - exp)); + y = vo_extract_l(t0); /* y= (xhigh-xlow)/(yhigh-ylow) in Q11 */ + if (sign < 0) + y = -y; + t0 = ylow * y; /* result in Q26 */ + t0 = (t0 >> 10); /* result in Q15 */ + xint = vo_sub(xlow, vo_extract_l(t0)); /* xint = xlow - ylow*y */ + } + isp[nf] = xint; + xlow = xint; + nf++; + if (ip == 0) + { + ip = 1; + coef = f2; + order = NC - 1; + } else + { + ip = 0; + coef = f1; + order = NC; + } + ylow = Chebps2(xlow, coef, order); + } + } + /* Check if M-1 roots found */ + if(nf < M - 1) + { + for (i = 0; i < M; i++) + { + isp[i] = old_isp[i]; + } + } else + { + isp[M - 1] = a[M] << 3; /* From Q12 to Q15 with saturation */ + } + return; +} + +/*--------------------------------------------------------------* +* function Chebps2: * +* ~~~~~~~ * +* Evaluates the Chebishev polynomial series * +*--------------------------------------------------------------* +* * +* The polynomial order is * +* n = M/2 (M is the prediction order) * +* The polynomial is given by * +* C(x) = f(0)T_n(x) + f(1)T_n-1(x) + ... +f(n-1)T_1(x) + f(n)/2 * +* Arguments: * +* x: input value of evaluation; x = cos(frequency) in Q15 * +* f[]: coefficients of the pol. in Q11 * +* n: order of the pol. * +* * +* The value of C(x) is returned. (Satured to +-1.99 in Q14) * +* * +*--------------------------------------------------------------*/ + +static __inline Word16 Chebps2(Word16 x, Word16 f[], Word32 n) +{ + Word32 i, cheb; + Word16 b0_h, b0_l, b1_h, b1_l, b2_h, b2_l; + Word32 t0; + + /* Note: All computation are done in Q24. */ + + t0 = f[0] << 13; + b2_h = t0 >> 16; + b2_l = (t0 & 0xffff)>>1; + + t0 = ((b2_h * x)<<1) + (((b2_l * x)>>15)<<1); + t0 <<= 1; + t0 += (f[1] << 13); /* + f[1] in Q24 */ + + b1_h = t0 >> 16; + b1_l = (t0 & 0xffff) >> 1; + + for (i = 2; i < n; i++) + { + t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1); + + t0 += (b2_h * (-16384))<<1; + t0 += (f[i] << 12); + t0 <<= 1; + t0 -= (b2_l << 1); /* t0 = 2.0*x*b1 - b2 + f[i]; */ + + b0_h = t0 >> 16; + b0_l = (t0 & 0xffff) >> 1; + + b2_l = b1_l; /* b2 = b1; */ + b2_h = b1_h; + b1_l = b0_l; /* b1 = b0; */ + b1_h = b0_h; + } + + t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1); + t0 += (b2_h * (-32768))<<1; /* t0 = x*b1 - b2 */ + t0 -= (b2_l << 1); + t0 += (f[n] << 12); /* t0 = x*b1 - b2 + f[i]/2 */ + + t0 = L_shl2(t0, 6); /* Q24 to Q30 with saturation */ + + cheb = extract_h(t0); /* Result in Q14 */ + + if (cheb == -32768) + { + cheb = -32767; /* to avoid saturation in Az_isp */ + } + return (cheb); +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/bits.c b/media/libstagefright/codecs/amrwbenc/src/bits.c index 90d1a00..61cac3d 100644 --- a/media/libstagefright/codecs/amrwbenc/src/bits.c +++ b/media/libstagefright/codecs/amrwbenc/src/bits.c @@ -1,210 +1,210 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** - File: bits.c - - Description: Performs bit stream manipulation - -************************************************************************/ - -#include -#include -#include "typedef.h" -#include "basic_op.h" -#include "cnst.h" -#include "bits.h" -#include "acelp.h" -#include "dtx.h" -#include "mime_io.tab" - - -int PackBits(Word16 prms[], /* i: analysis parameters */ - Word16 coding_mode, /* i: coding bit-stream ratio mode */ - Word16 mode, /* i: coding bit-stream ratio mode*/ - Coder_State *st /*i/o: coder global parameters struct */ - ) -{ - Word16 i, frame_type; - UWord8 temp; - UWord8 *stream_ptr; - Word16 bitstreamformat = st->frameType; - - unsigned short* dataOut = st->outputStream; - - if (coding_mode == MRDTX) - { - st->sid_update_counter--; - - if (st->prev_ft == TX_SPEECH) - { - frame_type = TX_SID_FIRST; - st->sid_update_counter = 3; - } else - { - if ((st->sid_handover_debt > 0) && (st->sid_update_counter > 2)) - { - /* ensure extra updates are properly delayed after a possible SID_FIRST */ - frame_type = TX_SID_UPDATE; - st->sid_handover_debt--; - } else - { - if (st->sid_update_counter == 0) - { - frame_type = TX_SID_UPDATE; - st->sid_update_counter = 8; - } else - { - frame_type = TX_NO_DATA; - } - } - } - } else - { - st->sid_update_counter = 8; - frame_type = TX_SPEECH; - } - st->prev_ft = frame_type; - - if(bitstreamformat == 0) /* default file format */ - { - *(dataOut) = TX_FRAME_TYPE; - *(dataOut + 1) = frame_type; - *(dataOut + 2) = mode; - for (i = 0; i < nb_of_bits[coding_mode]; i++) - { - *(dataOut + 3 + i) = prms[i]; - } - return (3 + nb_of_bits[coding_mode])<<1; - } else - { - if (bitstreamformat == 1) /* ITU file format */ - { - *(dataOut) = 0x6b21; - if(frame_type != TX_NO_DATA && frame_type != TX_SID_FIRST) - { - *(dataOut + 1) = nb_of_bits[coding_mode]; - for (i = 0; i < nb_of_bits[coding_mode]; i++) - { - if(prms[i] == BIT_0){ - *(dataOut + 2 + i) = BIT_0_ITU; - } - else{ - *(dataOut + 2 + i) = BIT_1_ITU; - } - } - return (2 + nb_of_bits[coding_mode])<<1; - } else - { - *(dataOut + 1) = 0; - return 2<<1; - } - } else /* MIME/storage file format */ - { -#define MRSID 9 - /* change mode index in case of SID frame */ - if (coding_mode == MRDTX) - { - coding_mode = MRSID; - if (frame_type == TX_SID_FIRST) - { - for (i = 0; i < NBBITS_SID; i++) prms[i] = BIT_0; - } - } - /* -> force NO_DATA frame */ - if (coding_mode < 0 || coding_mode > 15 || (coding_mode > MRSID && coding_mode < 14)) - { - coding_mode = 15; - } - /* mark empty frames between SID updates as NO_DATA frames */ - if (coding_mode == MRSID && frame_type == TX_NO_DATA) - { - coding_mode = 15; - } - /* set pointer for packed frame, note that we handle data as bytes */ - stream_ptr = (UWord8*)dataOut; - /* insert table of contents (ToC) byte at the beginning of the packet */ - *stream_ptr = toc_byte[coding_mode]; - stream_ptr++; - temp = 0; - /* sort and pack AMR-WB speech or SID bits */ - for (i = 1; i < unpacked_size[coding_mode] + 1; i++) - { - if (prms[sort_ptr[coding_mode][i-1]] == BIT_1) - { - temp++; - } - if (i&0x7) - { - temp <<= 1; - } - else - { - *stream_ptr = temp; - stream_ptr++; - temp = 0; - } - } - /* insert SID type indication and speech mode in case of SID frame */ - if (coding_mode == MRSID) - { - if (frame_type == TX_SID_UPDATE) - { - temp++; - } - temp <<= 4; - temp += mode & 0x000F; - } - /* insert unused bits (zeros) at the tail of the last byte */ - if (unused_size[coding_mode]) - { - temp <<= (unused_size[coding_mode] - 1); - } - *stream_ptr = temp; - /* write packed frame into file (1 byte added to cover ToC entry) */ - return (1 + packed_size[coding_mode]); - } - } -} - -/*-----------------------------------------------------* -* Parm_serial -> convert parameters to serial stream * -*-----------------------------------------------------*/ - -void Parm_serial( - Word16 value, /* input : parameter value */ - Word16 no_of_bits, /* input : number of bits */ - Word16 ** prms - ) -{ - Word16 i, bit; - *prms += no_of_bits; - for (i = 0; i < no_of_bits; i++) - { - bit = (Word16) (value & 0x0001); /* get lsb */ - if (bit == 0) - *--(*prms) = BIT_0; - else - *--(*prms) = BIT_1; - value >>= 1; - } - *prms += no_of_bits; - return; -} - - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** + File: bits.c + + Description: Performs bit stream manipulation + +************************************************************************/ + +#include +#include +#include "typedef.h" +#include "basic_op.h" +#include "cnst.h" +#include "bits.h" +#include "acelp.h" +#include "dtx.h" +#include "mime_io.tab" + + +int PackBits(Word16 prms[], /* i: analysis parameters */ + Word16 coding_mode, /* i: coding bit-stream ratio mode */ + Word16 mode, /* i: coding bit-stream ratio mode*/ + Coder_State *st /*i/o: coder global parameters struct */ + ) +{ + Word16 i, frame_type; + UWord8 temp; + UWord8 *stream_ptr; + Word16 bitstreamformat = st->frameType; + + unsigned short* dataOut = st->outputStream; + + if (coding_mode == MRDTX) + { + st->sid_update_counter--; + + if (st->prev_ft == TX_SPEECH) + { + frame_type = TX_SID_FIRST; + st->sid_update_counter = 3; + } else + { + if ((st->sid_handover_debt > 0) && (st->sid_update_counter > 2)) + { + /* ensure extra updates are properly delayed after a possible SID_FIRST */ + frame_type = TX_SID_UPDATE; + st->sid_handover_debt--; + } else + { + if (st->sid_update_counter == 0) + { + frame_type = TX_SID_UPDATE; + st->sid_update_counter = 8; + } else + { + frame_type = TX_NO_DATA; + } + } + } + } else + { + st->sid_update_counter = 8; + frame_type = TX_SPEECH; + } + st->prev_ft = frame_type; + + if(bitstreamformat == 0) /* default file format */ + { + *(dataOut) = TX_FRAME_TYPE; + *(dataOut + 1) = frame_type; + *(dataOut + 2) = mode; + for (i = 0; i < nb_of_bits[coding_mode]; i++) + { + *(dataOut + 3 + i) = prms[i]; + } + return (3 + nb_of_bits[coding_mode])<<1; + } else + { + if (bitstreamformat == 1) /* ITU file format */ + { + *(dataOut) = 0x6b21; + if(frame_type != TX_NO_DATA && frame_type != TX_SID_FIRST) + { + *(dataOut + 1) = nb_of_bits[coding_mode]; + for (i = 0; i < nb_of_bits[coding_mode]; i++) + { + if(prms[i] == BIT_0){ + *(dataOut + 2 + i) = BIT_0_ITU; + } + else{ + *(dataOut + 2 + i) = BIT_1_ITU; + } + } + return (2 + nb_of_bits[coding_mode])<<1; + } else + { + *(dataOut + 1) = 0; + return 2<<1; + } + } else /* MIME/storage file format */ + { +#define MRSID 9 + /* change mode index in case of SID frame */ + if (coding_mode == MRDTX) + { + coding_mode = MRSID; + if (frame_type == TX_SID_FIRST) + { + for (i = 0; i < NBBITS_SID; i++) prms[i] = BIT_0; + } + } + /* -> force NO_DATA frame */ + if (coding_mode < 0 || coding_mode > 15 || (coding_mode > MRSID && coding_mode < 14)) + { + coding_mode = 15; + } + /* mark empty frames between SID updates as NO_DATA frames */ + if (coding_mode == MRSID && frame_type == TX_NO_DATA) + { + coding_mode = 15; + } + /* set pointer for packed frame, note that we handle data as bytes */ + stream_ptr = (UWord8*)dataOut; + /* insert table of contents (ToC) byte at the beginning of the packet */ + *stream_ptr = toc_byte[coding_mode]; + stream_ptr++; + temp = 0; + /* sort and pack AMR-WB speech or SID bits */ + for (i = 1; i < unpacked_size[coding_mode] + 1; i++) + { + if (prms[sort_ptr[coding_mode][i-1]] == BIT_1) + { + temp++; + } + if (i&0x7) + { + temp <<= 1; + } + else + { + *stream_ptr = temp; + stream_ptr++; + temp = 0; + } + } + /* insert SID type indication and speech mode in case of SID frame */ + if (coding_mode == MRSID) + { + if (frame_type == TX_SID_UPDATE) + { + temp++; + } + temp <<= 4; + temp += mode & 0x000F; + } + /* insert unused bits (zeros) at the tail of the last byte */ + if (unused_size[coding_mode]) + { + temp <<= (unused_size[coding_mode] - 1); + } + *stream_ptr = temp; + /* write packed frame into file (1 byte added to cover ToC entry) */ + return (1 + packed_size[coding_mode]); + } + } +} + +/*-----------------------------------------------------* +* Parm_serial -> convert parameters to serial stream * +*-----------------------------------------------------*/ + +void Parm_serial( + Word16 value, /* input : parameter value */ + Word16 no_of_bits, /* input : number of bits */ + Word16 ** prms + ) +{ + Word16 i, bit; + *prms += no_of_bits; + for (i = 0; i < no_of_bits; i++) + { + bit = (Word16) (value & 0x0001); /* get lsb */ + if (bit == 0) + *--(*prms) = BIT_0; + else + *--(*prms) = BIT_1; + value >>= 1; + } + *prms += no_of_bits; + return; +} + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c b/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c index 39fc4c5..80990d9 100644 --- a/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c +++ b/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c @@ -1,297 +1,297 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/************************************************************************ -* File: c2t64fx.c * -* * -* Description:Performs algebraic codebook search for 6.60kbits mode* -* * -*************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "math_op.h" -#include "acelp.h" -#include "cnst.h" - -#define NB_TRACK 2 -#define STEP 2 -#define NB_POS 32 -#define MSIZE 1024 - -/************************************************************************* -* Function: ACELP_2t64_fx() * -* * -* 12 bits algebraic codebook. * -* 2 tracks x 32 positions per track = 64 samples. * -* * -* 12 bits --> 2 pulses in a frame of 64 samples. * -* * -* All pulses can have two (2) possible amplitudes: +1 or -1. * -* Each pulse can have 32 possible positions. * -**************************************************************************/ - -void ACELP_2t64_fx( - Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */ - Word16 cn[], /* (i) <12b : residual after long term prediction */ - Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */ - Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */ - Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */ - Word16 * index /* (o) : index (12): 5+1+5+1 = 11 bits. */ - ) -{ - Word32 i, j, k, i0, i1, ix, iy, pos, pos2; - Word16 ps, psk, ps1, ps2, alpk, alp1, alp2, sq; - Word16 alp, val, exp, k_cn, k_dn; - Word16 *p0, *p1, *p2, *psign; - Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf; - - Word16 sign[L_SUBFR], vec[L_SUBFR], dn2[L_SUBFR]; - Word16 h_buf[4 * L_SUBFR] = {0}; - Word16 rrixix[NB_TRACK][NB_POS]; - Word16 rrixiy[MSIZE]; - Word32 s, cor; - - /*----------------------------------------------------------------* - * Find sign for each pulse position. * - *----------------------------------------------------------------*/ - alp = 8192; /* alp = 2.0 (Q12) */ - - /* calculate energy for normalization of cn[] and dn[] */ - /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */ -#ifdef ASM_OPT /* asm optimization branch */ - s = Dot_product12_asm(cn, cn, L_SUBFR, &exp); -#else - s = Dot_product12(cn, cn, L_SUBFR, &exp); -#endif - - Isqrt_n(&s, &exp); - s = L_shl(s, add1(exp, 5)); - k_cn = vo_round(s); - - /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */ -#ifdef ASM_OPT /* asm optimization branch */ - s = Dot_product12_asm(dn, dn, L_SUBFR, &exp); -#else - s = Dot_product12(dn, dn, L_SUBFR, &exp); -#endif - - Isqrt_n(&s, &exp); - k_dn = vo_round(L_shl(s, (exp + 8))); /* k_dn = 256..4096 */ - k_dn = vo_mult_r(alp, k_dn); /* alp in Q12 */ - - /* mix normalized cn[] and dn[] */ - p0 = cn; - p1 = dn; - p2 = dn2; - - for (i = 0; i < L_SUBFR/4; i++) - { - s = (k_cn* (*p0++))+(k_dn * (*p1++)); - *p2++ = s >> 7; - s = (k_cn* (*p0++))+(k_dn * (*p1++)); - *p2++ = s >> 7; - s = (k_cn* (*p0++))+(k_dn * (*p1++)); - *p2++ = s >> 7; - s = (k_cn* (*p0++))+(k_dn * (*p1++)); - *p2++ = s >> 7; - } - - /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[] */ - for (i = 0; i < L_SUBFR; i ++) - { - val = dn[i]; - ps = dn2[i]; - if (ps >= 0) - { - sign[i] = 32767; /* sign = +1 (Q12) */ - vec[i] = -32768; - } else - { - sign[i] = -32768; /* sign = -1 (Q12) */ - vec[i] = 32767; - dn[i] = -val; - } - } - /*------------------------------------------------------------* - * Compute h_inv[i]. * - *------------------------------------------------------------*/ - /* impulse response buffer for fast computation */ - h = h_buf + L_SUBFR; - h_inv = h + (L_SUBFR<<1); - - for (i = 0; i < L_SUBFR; i++) - { - h[i] = H[i]; - h_inv[i] = vo_negate(h[i]); - } - - /*------------------------------------------------------------* - * Compute rrixix[][] needed for the codebook search. * - * Result is multiplied by 0.5 * - *------------------------------------------------------------*/ - /* Init pointers to last position of rrixix[] */ - p0 = &rrixix[0][NB_POS - 1]; - p1 = &rrixix[1][NB_POS - 1]; - - ptr_h1 = h; - cor = 0x00010000L; /* for rounding */ - for (i = 0; i < NB_POS; i++) - { - cor += ((*ptr_h1) * (*ptr_h1) << 1); - ptr_h1++; - *p1-- = (extract_h(cor) >> 1); - cor += ((*ptr_h1) * (*ptr_h1) << 1); - ptr_h1++; - *p0-- = (extract_h(cor) >> 1); - } - - /*------------------------------------------------------------* - * Compute rrixiy[][] needed for the codebook search. * - *------------------------------------------------------------*/ - pos = MSIZE - 1; - pos2 = MSIZE - 2; - ptr_hf = h + 1; - - for (k = 0; k < NB_POS; k++) - { - p1 = &rrixiy[pos]; - p0 = &rrixiy[pos2]; - cor = 0x00008000L; /* for rounding */ - ptr_h1 = h; - ptr_h2 = ptr_hf; - - for (i = (k + 1); i < NB_POS; i++) - { - cor += ((*ptr_h1) * (*ptr_h2))<<1; - ptr_h1++; - ptr_h2++; - *p1 = extract_h(cor); - cor += ((*ptr_h1) * (*ptr_h2))<<1; - ptr_h1++; - ptr_h2++; - *p0 = extract_h(cor); - - p1 -= (NB_POS + 1); - p0 -= (NB_POS + 1); - } - cor += ((*ptr_h1) * (*ptr_h2))<<1; - ptr_h1++; - ptr_h2++; - *p1 = extract_h(cor); - - pos -= NB_POS; - pos2--; - ptr_hf += STEP; - } - - /*------------------------------------------------------------* - * Modification of rrixiy[][] to take signs into account. * - *------------------------------------------------------------*/ - p0 = rrixiy; - for (i = 0; i < L_SUBFR; i += STEP) - { - psign = sign; - if (psign[i] < 0) - { - psign = vec; - } - for (j = 1; j < L_SUBFR; j += STEP) - { - *p0 = vo_mult(*p0, psign[j]); - p0++; - } - } - /*-------------------------------------------------------------------* - * search 2 pulses: * - * ~@~~~~~~~~~~~~~~ * - * 32 pos x 32 pos = 1024 tests (all combinaisons is tested) * - *-------------------------------------------------------------------*/ - p0 = rrixix[0]; - p1 = rrixix[1]; - p2 = rrixiy; - - psk = -1; - alpk = 1; - ix = 0; - iy = 1; - - for (i0 = 0; i0 < L_SUBFR; i0 += STEP) - { - ps1 = dn[i0]; - alp1 = (*p0++); - pos = -1; - for (i1 = 1; i1 < L_SUBFR; i1 += STEP) - { - ps2 = add1(ps1, dn[i1]); - alp2 = add1(alp1, add1(*p1++, *p2++)); - sq = vo_mult(ps2, ps2); - s = vo_L_mult(alpk, sq) - ((psk * alp2)<<1); - if (s > 0) - { - psk = sq; - alpk = alp2; - pos = i1; - } - } - p1 -= NB_POS; - if (pos >= 0) - { - ix = i0; - iy = pos; - } - } - /*-------------------------------------------------------------------* - * Build the codeword, the filtered codeword and index of codevector.* - *-------------------------------------------------------------------*/ - - for (i = 0; i < L_SUBFR; i++) - { - code[i] = 0; - } - - i0 = (ix >> 1); /* pos of pulse 1 (0..31) */ - i1 = (iy >> 1); /* pos of pulse 2 (0..31) */ - if (sign[ix] > 0) - { - code[ix] = 512; /* codeword in Q9 format */ - p0 = h - ix; - } else - { - code[ix] = -512; - i0 += NB_POS; - p0 = h_inv - ix; - } - if (sign[iy] > 0) - { - code[iy] = 512; - p1 = h - iy; - } else - { - code[iy] = -512; - i1 += NB_POS; - p1 = h_inv - iy; - } - *index = add1((i0 << 6), i1); - for (i = 0; i < L_SUBFR; i++) - { - y[i] = vo_shr_r(add1((*p0++), (*p1++)), 3); - } - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/************************************************************************ +* File: c2t64fx.c * +* * +* Description:Performs algebraic codebook search for 6.60kbits mode* +* * +*************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "math_op.h" +#include "acelp.h" +#include "cnst.h" + +#define NB_TRACK 2 +#define STEP 2 +#define NB_POS 32 +#define MSIZE 1024 + +/************************************************************************* +* Function: ACELP_2t64_fx() * +* * +* 12 bits algebraic codebook. * +* 2 tracks x 32 positions per track = 64 samples. * +* * +* 12 bits --> 2 pulses in a frame of 64 samples. * +* * +* All pulses can have two (2) possible amplitudes: +1 or -1. * +* Each pulse can have 32 possible positions. * +**************************************************************************/ + +void ACELP_2t64_fx( + Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */ + Word16 cn[], /* (i) <12b : residual after long term prediction */ + Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */ + Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */ + Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */ + Word16 * index /* (o) : index (12): 5+1+5+1 = 11 bits. */ + ) +{ + Word32 i, j, k, i0, i1, ix, iy, pos, pos2; + Word16 ps, psk, ps1, ps2, alpk, alp1, alp2, sq; + Word16 alp, val, exp, k_cn, k_dn; + Word16 *p0, *p1, *p2, *psign; + Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf; + + Word16 sign[L_SUBFR], vec[L_SUBFR], dn2[L_SUBFR]; + Word16 h_buf[4 * L_SUBFR] = {0}; + Word16 rrixix[NB_TRACK][NB_POS]; + Word16 rrixiy[MSIZE]; + Word32 s, cor; + + /*----------------------------------------------------------------* + * Find sign for each pulse position. * + *----------------------------------------------------------------*/ + alp = 8192; /* alp = 2.0 (Q12) */ + + /* calculate energy for normalization of cn[] and dn[] */ + /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */ +#ifdef ASM_OPT /* asm optimization branch */ + s = Dot_product12_asm(cn, cn, L_SUBFR, &exp); +#else + s = Dot_product12(cn, cn, L_SUBFR, &exp); +#endif + + Isqrt_n(&s, &exp); + s = L_shl(s, add1(exp, 5)); + k_cn = vo_round(s); + + /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */ +#ifdef ASM_OPT /* asm optimization branch */ + s = Dot_product12_asm(dn, dn, L_SUBFR, &exp); +#else + s = Dot_product12(dn, dn, L_SUBFR, &exp); +#endif + + Isqrt_n(&s, &exp); + k_dn = vo_round(L_shl(s, (exp + 8))); /* k_dn = 256..4096 */ + k_dn = vo_mult_r(alp, k_dn); /* alp in Q12 */ + + /* mix normalized cn[] and dn[] */ + p0 = cn; + p1 = dn; + p2 = dn2; + + for (i = 0; i < L_SUBFR/4; i++) + { + s = (k_cn* (*p0++))+(k_dn * (*p1++)); + *p2++ = s >> 7; + s = (k_cn* (*p0++))+(k_dn * (*p1++)); + *p2++ = s >> 7; + s = (k_cn* (*p0++))+(k_dn * (*p1++)); + *p2++ = s >> 7; + s = (k_cn* (*p0++))+(k_dn * (*p1++)); + *p2++ = s >> 7; + } + + /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[] */ + for (i = 0; i < L_SUBFR; i ++) + { + val = dn[i]; + ps = dn2[i]; + if (ps >= 0) + { + sign[i] = 32767; /* sign = +1 (Q12) */ + vec[i] = -32768; + } else + { + sign[i] = -32768; /* sign = -1 (Q12) */ + vec[i] = 32767; + dn[i] = -val; + } + } + /*------------------------------------------------------------* + * Compute h_inv[i]. * + *------------------------------------------------------------*/ + /* impulse response buffer for fast computation */ + h = h_buf + L_SUBFR; + h_inv = h + (L_SUBFR<<1); + + for (i = 0; i < L_SUBFR; i++) + { + h[i] = H[i]; + h_inv[i] = vo_negate(h[i]); + } + + /*------------------------------------------------------------* + * Compute rrixix[][] needed for the codebook search. * + * Result is multiplied by 0.5 * + *------------------------------------------------------------*/ + /* Init pointers to last position of rrixix[] */ + p0 = &rrixix[0][NB_POS - 1]; + p1 = &rrixix[1][NB_POS - 1]; + + ptr_h1 = h; + cor = 0x00010000L; /* for rounding */ + for (i = 0; i < NB_POS; i++) + { + cor += ((*ptr_h1) * (*ptr_h1) << 1); + ptr_h1++; + *p1-- = (extract_h(cor) >> 1); + cor += ((*ptr_h1) * (*ptr_h1) << 1); + ptr_h1++; + *p0-- = (extract_h(cor) >> 1); + } + + /*------------------------------------------------------------* + * Compute rrixiy[][] needed for the codebook search. * + *------------------------------------------------------------*/ + pos = MSIZE - 1; + pos2 = MSIZE - 2; + ptr_hf = h + 1; + + for (k = 0; k < NB_POS; k++) + { + p1 = &rrixiy[pos]; + p0 = &rrixiy[pos2]; + cor = 0x00008000L; /* for rounding */ + ptr_h1 = h; + ptr_h2 = ptr_hf; + + for (i = (k + 1); i < NB_POS; i++) + { + cor += ((*ptr_h1) * (*ptr_h2))<<1; + ptr_h1++; + ptr_h2++; + *p1 = extract_h(cor); + cor += ((*ptr_h1) * (*ptr_h2))<<1; + ptr_h1++; + ptr_h2++; + *p0 = extract_h(cor); + + p1 -= (NB_POS + 1); + p0 -= (NB_POS + 1); + } + cor += ((*ptr_h1) * (*ptr_h2))<<1; + ptr_h1++; + ptr_h2++; + *p1 = extract_h(cor); + + pos -= NB_POS; + pos2--; + ptr_hf += STEP; + } + + /*------------------------------------------------------------* + * Modification of rrixiy[][] to take signs into account. * + *------------------------------------------------------------*/ + p0 = rrixiy; + for (i = 0; i < L_SUBFR; i += STEP) + { + psign = sign; + if (psign[i] < 0) + { + psign = vec; + } + for (j = 1; j < L_SUBFR; j += STEP) + { + *p0 = vo_mult(*p0, psign[j]); + p0++; + } + } + /*-------------------------------------------------------------------* + * search 2 pulses: * + * ~@~~~~~~~~~~~~~~ * + * 32 pos x 32 pos = 1024 tests (all combinaisons is tested) * + *-------------------------------------------------------------------*/ + p0 = rrixix[0]; + p1 = rrixix[1]; + p2 = rrixiy; + + psk = -1; + alpk = 1; + ix = 0; + iy = 1; + + for (i0 = 0; i0 < L_SUBFR; i0 += STEP) + { + ps1 = dn[i0]; + alp1 = (*p0++); + pos = -1; + for (i1 = 1; i1 < L_SUBFR; i1 += STEP) + { + ps2 = add1(ps1, dn[i1]); + alp2 = add1(alp1, add1(*p1++, *p2++)); + sq = vo_mult(ps2, ps2); + s = vo_L_mult(alpk, sq) - ((psk * alp2)<<1); + if (s > 0) + { + psk = sq; + alpk = alp2; + pos = i1; + } + } + p1 -= NB_POS; + if (pos >= 0) + { + ix = i0; + iy = pos; + } + } + /*-------------------------------------------------------------------* + * Build the codeword, the filtered codeword and index of codevector.* + *-------------------------------------------------------------------*/ + + for (i = 0; i < L_SUBFR; i++) + { + code[i] = 0; + } + + i0 = (ix >> 1); /* pos of pulse 1 (0..31) */ + i1 = (iy >> 1); /* pos of pulse 2 (0..31) */ + if (sign[ix] > 0) + { + code[ix] = 512; /* codeword in Q9 format */ + p0 = h - ix; + } else + { + code[ix] = -512; + i0 += NB_POS; + p0 = h_inv - ix; + } + if (sign[iy] > 0) + { + code[iy] = 512; + p1 = h - iy; + } else + { + code[iy] = -512; + i1 += NB_POS; + p1 = h_inv - iy; + } + *index = add1((i0 << 6), i1); + for (i = 0; i < L_SUBFR; i++) + { + y[i] = vo_shr_r(add1((*p0++), (*p1++)), 3); + } + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c b/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c index 27ba95d..17f3d47 100644 --- a/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c +++ b/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c @@ -1,1043 +1,1043 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: c4t64fx.c * -* * -* Description:Performs algebraic codebook search for higher modes * -* * -************************************************************************/ - -/************************************************************************ -* Function: ACELP_4t64_fx() * -* * -* 20, 36, 44, 52, 64, 72, 88 bits algebraic codebook. * -* 4 tracks x 16 positions per track = 64 samples. * -* * -* 20 bits --> 4 pulses in a frame of 64 samples. * -* 36 bits --> 8 pulses in a frame of 64 samples. * -* 44 bits --> 10 pulses in a frame of 64 samples. * -* 52 bits --> 12 pulses in a frame of 64 samples. * -* 64 bits --> 16 pulses in a frame of 64 samples. * -* 72 bits --> 18 pulses in a frame of 64 samples. * -* 88 bits --> 24 pulses in a frame of 64 samples. * -* * -* All pulses can have two (2) possible amplitudes: +1 or -1. * -* Each pulse can have sixteen (16) possible positions. * -*************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "math_op.h" -#include "acelp.h" -#include "cnst.h" - -#include "q_pulse.h" - -static Word16 tipos[36] = { - 0, 1, 2, 3, /* starting point &ipos[0], 1st iter */ - 1, 2, 3, 0, /* starting point &ipos[4], 2nd iter */ - 2, 3, 0, 1, /* starting point &ipos[8], 3rd iter */ - 3, 0, 1, 2, /* starting point &ipos[12], 4th iter */ - 0, 1, 2, 3, - 1, 2, 3, 0, - 2, 3, 0, 1, - 3, 0, 1, 2, - 0, 1, 2, 3}; /* end point for 24 pulses &ipos[35], 4th iter */ - -#define NB_PULSE_MAX 24 - -#define L_SUBFR 64 -#define NB_TRACK 4 -#define STEP 4 -#define NB_POS 16 -#define MSIZE 256 -#define NB_MAX 8 -#define NPMAXPT ((NB_PULSE_MAX+NB_TRACK-1)/NB_TRACK) - -/* Private functions */ -void cor_h_vec_012( - Word16 h[], /* (i) scaled impulse response */ - Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ - Word16 track, /* (i) track to use */ - Word16 sign[], /* (i) sign vector */ - Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ - Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ - Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ - ); - -void cor_h_vec_012_asm( - Word16 h[], /* (i) scaled impulse response */ - Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ - Word16 track, /* (i) track to use */ - Word16 sign[], /* (i) sign vector */ - Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ - Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ - Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ - ); - -void cor_h_vec_30( - Word16 h[], /* (i) scaled impulse response */ - Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ - Word16 track, /* (i) track to use */ - Word16 sign[], /* (i) sign vector */ - Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ - Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ - Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ - ); - -void search_ixiy( - Word16 nb_pos_ix, /* (i) nb of pos for pulse 1 (1..8) */ - Word16 track_x, /* (i) track of pulse 1 */ - Word16 track_y, /* (i) track of pulse 2 */ - Word16 * ps, /* (i/o) correlation of all fixed pulses */ - Word16 * alp, /* (i/o) energy of all fixed pulses */ - Word16 * ix, /* (o) position of pulse 1 */ - Word16 * iy, /* (o) position of pulse 2 */ - Word16 dn[], /* (i) corr. between target and h[] */ - Word16 dn2[], /* (i) vector of selected positions */ - Word16 cor_x[], /* (i) corr. of pulse 1 with fixed pulses */ - Word16 cor_y[], /* (i) corr. of pulse 2 with fixed pulses */ - Word16 rrixiy[][MSIZE] /* (i) corr. of pulse 1 with pulse 2 */ - ); - - -void ACELP_4t64_fx( - Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */ - Word16 cn[], /* (i) <12b : residual after long term prediction */ - Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */ - Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */ - Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */ - Word16 nbbits, /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits */ - Word16 ser_size, /* (i) : bit rate */ - Word16 _index[] /* (o) : index (20): 5+5+5+5 = 20 bits. */ - /* (o) : index (36): 9+9+9+9 = 36 bits. */ - /* (o) : index (44): 13+9+13+9 = 44 bits. */ - /* (o) : index (52): 13+13+13+13 = 52 bits. */ - /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits. */ - /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits. */ - /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */ - ) -{ - Word32 i, j, k; - Word16 st, ix, iy, pos, index, track, nb_pulse, nbiter, j_temp; - Word16 psk, ps, alpk, alp, val, k_cn, k_dn, exp; - Word16 *p0, *p1, *p2, *p3, *psign; - Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf, h_shift; - Word32 s, cor, L_tmp, L_index; - Word16 dn2[L_SUBFR], sign[L_SUBFR], vec[L_SUBFR]; - Word16 ind[NPMAXPT * NB_TRACK]; - Word16 codvec[NB_PULSE_MAX], nbpos[10]; - Word16 cor_x[NB_POS], cor_y[NB_POS], pos_max[NB_TRACK]; - Word16 h_buf[4 * L_SUBFR]; - Word16 rrixix[NB_TRACK][NB_POS], rrixiy[NB_TRACK][MSIZE]; - Word16 ipos[NB_PULSE_MAX]; - - switch (nbbits) - { - case 20: /* 20 bits, 4 pulses, 4 tracks */ - nbiter = 4; /* 4x16x16=1024 loop */ - alp = 8192; /* alp = 2.0 (Q12) */ - nb_pulse = 4; - nbpos[0] = 4; - nbpos[1] = 8; - break; - case 36: /* 36 bits, 8 pulses, 4 tracks */ - nbiter = 4; /* 4x20x16=1280 loop */ - alp = 4096; /* alp = 1.0 (Q12) */ - nb_pulse = 8; - nbpos[0] = 4; - nbpos[1] = 8; - nbpos[2] = 8; - break; - case 44: /* 44 bits, 10 pulses, 4 tracks */ - nbiter = 4; /* 4x26x16=1664 loop */ - alp = 4096; /* alp = 1.0 (Q12) */ - nb_pulse = 10; - nbpos[0] = 4; - nbpos[1] = 6; - nbpos[2] = 8; - nbpos[3] = 8; - break; - case 52: /* 52 bits, 12 pulses, 4 tracks */ - nbiter = 4; /* 4x26x16=1664 loop */ - alp = 4096; /* alp = 1.0 (Q12) */ - nb_pulse = 12; - nbpos[0] = 4; - nbpos[1] = 6; - nbpos[2] = 8; - nbpos[3] = 8; - break; - case 64: /* 64 bits, 16 pulses, 4 tracks */ - nbiter = 3; /* 3x36x16=1728 loop */ - alp = 3277; /* alp = 0.8 (Q12) */ - nb_pulse = 16; - nbpos[0] = 4; - nbpos[1] = 4; - nbpos[2] = 6; - nbpos[3] = 6; - nbpos[4] = 8; - nbpos[5] = 8; - break; - case 72: /* 72 bits, 18 pulses, 4 tracks */ - nbiter = 3; /* 3x35x16=1680 loop */ - alp = 3072; /* alp = 0.75 (Q12) */ - nb_pulse = 18; - nbpos[0] = 2; - nbpos[1] = 3; - nbpos[2] = 4; - nbpos[3] = 5; - nbpos[4] = 6; - nbpos[5] = 7; - nbpos[6] = 8; - break; - case 88: /* 88 bits, 24 pulses, 4 tracks */ - if(ser_size > 462) - nbiter = 1; - else - nbiter = 2; /* 2x53x16=1696 loop */ - - alp = 2048; /* alp = 0.5 (Q12) */ - nb_pulse = 24; - nbpos[0] = 2; - nbpos[1] = 2; - nbpos[2] = 3; - nbpos[3] = 4; - nbpos[4] = 5; - nbpos[5] = 6; - nbpos[6] = 7; - nbpos[7] = 8; - nbpos[8] = 8; - nbpos[9] = 8; - break; - default: - nbiter = 0; - alp = 0; - nb_pulse = 0; - } - - for (i = 0; i < nb_pulse; i++) - { - codvec[i] = i; - } - - /*----------------------------------------------------------------* - * Find sign for each pulse position. * - *----------------------------------------------------------------*/ - /* calculate energy for normalization of cn[] and dn[] */ - /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */ -#ifdef ASM_OPT /* asm optimization branch */ - s = Dot_product12_asm(cn, cn, L_SUBFR, &exp); -#else - s = Dot_product12(cn, cn, L_SUBFR, &exp); -#endif - - Isqrt_n(&s, &exp); - s = L_shl(s, (exp + 5)); - k_cn = extract_h(L_add(s, 0x8000)); - - /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */ -#ifdef ASM_OPT /* asm optimization branch */ - s = Dot_product12_asm(dn, dn, L_SUBFR, &exp); -#else - s = Dot_product12(dn, dn, L_SUBFR, &exp); -#endif - - Isqrt_n(&s, &exp); - k_dn = (L_shl(s, (exp + 5 + 3)) + 0x8000) >> 16; /* k_dn = 256..4096 */ - k_dn = vo_mult_r(alp, k_dn); /* alp in Q12 */ - - /* mix normalized cn[] and dn[] */ - p0 = cn; - p1 = dn; - p2 = dn2; - - for (i = 0; i < L_SUBFR/4; i++) - { - s = (k_cn* (*p0++))+(k_dn * (*p1++)); - *p2++ = s >> 7; - s = (k_cn* (*p0++))+(k_dn * (*p1++)); - *p2++ = s >> 7; - s = (k_cn* (*p0++))+(k_dn * (*p1++)); - *p2++ = s >> 7; - s = (k_cn* (*p0++))+(k_dn * (*p1++)); - *p2++ = s >> 7; - } - - /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[] */ - for(i = 0; i < L_SUBFR; i++) - { - val = dn[i]; - ps = dn2[i]; - if (ps >= 0) - { - sign[i] = 32767; /* sign = +1 (Q12) */ - vec[i] = -32768; - } else - { - sign[i] = -32768; /* sign = -1 (Q12) */ - vec[i] = 32767; - dn[i] = -val; - dn2[i] = -ps; - } - } - /*----------------------------------------------------------------* - * Select NB_MAX position per track according to max of dn2[]. * - *----------------------------------------------------------------*/ - pos = 0; - for (i = 0; i < NB_TRACK; i++) - { - for (k = 0; k < NB_MAX; k++) - { - ps = -1; - for (j = i; j < L_SUBFR; j += STEP) - { - if(dn2[j] > ps) - { - ps = dn2[j]; - pos = j; - } - } - dn2[pos] = (k - NB_MAX); /* dn2 < 0 when position is selected */ - if (k == 0) - { - pos_max[i] = pos; - } - } - } - - /*--------------------------------------------------------------* - * Scale h[] to avoid overflow and to get maximum of precision * - * on correlation. * - * * - * Maximum of h[] (h[0]) is fixed to 2048 (MAX16 / 16). * - * ==> This allow addition of 16 pulses without saturation. * - * * - * Energy worst case (on resonant impulse response), * - * - energy of h[] is approximately MAX/16. * - * - During search, the energy is divided by 8 to avoid * - * overflow on "alp". (energy of h[] = MAX/128). * - * ==> "alp" worst case detected is 22854 on sinusoidal wave. * - *--------------------------------------------------------------*/ - - /* impulse response buffer for fast computation */ - - h = h_buf; - h_inv = h_buf + (2 * L_SUBFR); - L_tmp = 0; - for (i = 0; i < L_SUBFR; i++) - { - *h++ = 0; - *h_inv++ = 0; - L_tmp += (H[i] * H[i]) << 1; - } - /* scale h[] down (/2) when energy of h[] is high with many pulses used */ - val = extract_h(L_tmp); - h_shift = 0; - - if ((nb_pulse >= 12) && (val > 1024)) - { - h_shift = 1; - } - p0 = H; - p1 = h; - p2 = h_inv; - - for (i = 0; i < L_SUBFR/4; i++) - { - *p1 = *p0++ >> h_shift; - *p2++ = -(*p1++); - *p1 = *p0++ >> h_shift; - *p2++ = -(*p1++); - *p1 = *p0++ >> h_shift; - *p2++ = -(*p1++); - *p1 = *p0++ >> h_shift; - *p2++ = -(*p1++); - } - - /*------------------------------------------------------------* - * Compute rrixix[][] needed for the codebook search. * - * This algorithm compute impulse response energy of all * - * positions (16) in each track (4). Total = 4x16 = 64. * - *------------------------------------------------------------*/ - - /* storage order --> i3i3, i2i2, i1i1, i0i0 */ - - /* Init pointers to last position of rrixix[] */ - p0 = &rrixix[0][NB_POS - 1]; - p1 = &rrixix[1][NB_POS - 1]; - p2 = &rrixix[2][NB_POS - 1]; - p3 = &rrixix[3][NB_POS - 1]; - - ptr_h1 = h; - cor = 0x00008000L; /* for rounding */ - for (i = 0; i < NB_POS; i++) - { - cor += vo_L_mult((*ptr_h1), (*ptr_h1)); - ptr_h1++; - *p3-- = extract_h(cor); - cor += vo_L_mult((*ptr_h1), (*ptr_h1)); - ptr_h1++; - *p2-- = extract_h(cor); - cor += vo_L_mult((*ptr_h1), (*ptr_h1)); - ptr_h1++; - *p1-- = extract_h(cor); - cor += vo_L_mult((*ptr_h1), (*ptr_h1)); - ptr_h1++; - *p0-- = extract_h(cor); - } - - /*------------------------------------------------------------* - * Compute rrixiy[][] needed for the codebook search. * - * This algorithm compute correlation between 2 pulses * - * (2 impulses responses) in 4 possible adjacents tracks. * - * (track 0-1, 1-2, 2-3 and 3-0). Total = 4x16x16 = 1024. * - *------------------------------------------------------------*/ - - /* storage order --> i2i3, i1i2, i0i1, i3i0 */ - - pos = MSIZE - 1; - ptr_hf = h + 1; - - for (k = 0; k < NB_POS; k++) - { - p3 = &rrixiy[2][pos]; - p2 = &rrixiy[1][pos]; - p1 = &rrixiy[0][pos]; - p0 = &rrixiy[3][pos - NB_POS]; - - cor = 0x00008000L; /* for rounding */ - ptr_h1 = h; - ptr_h2 = ptr_hf; - - for (i = k + 1; i < NB_POS; i++) - { - cor += vo_L_mult((*ptr_h1), (*ptr_h2)); - ptr_h1++; - ptr_h2++; - *p3 = extract_h(cor); - cor += vo_L_mult((*ptr_h1), (*ptr_h2)); - ptr_h1++; - ptr_h2++; - *p2 = extract_h(cor); - cor += vo_L_mult((*ptr_h1), (*ptr_h2)); - ptr_h1++; - ptr_h2++; - *p1 = extract_h(cor); - cor += vo_L_mult((*ptr_h1), (*ptr_h2)); - ptr_h1++; - ptr_h2++; - *p0 = extract_h(cor); - - p3 -= (NB_POS + 1); - p2 -= (NB_POS + 1); - p1 -= (NB_POS + 1); - p0 -= (NB_POS + 1); - } - cor += vo_L_mult((*ptr_h1), (*ptr_h2)); - ptr_h1++; - ptr_h2++; - *p3 = extract_h(cor); - cor += vo_L_mult((*ptr_h1), (*ptr_h2)); - ptr_h1++; - ptr_h2++; - *p2 = extract_h(cor); - cor += vo_L_mult((*ptr_h1), (*ptr_h2)); - ptr_h1++; - ptr_h2++; - *p1 = extract_h(cor); - - pos -= NB_POS; - ptr_hf += STEP; - } - - /* storage order --> i3i0, i2i3, i1i2, i0i1 */ - - pos = MSIZE - 1; - ptr_hf = h + 3; - - for (k = 0; k < NB_POS; k++) - { - p3 = &rrixiy[3][pos]; - p2 = &rrixiy[2][pos - 1]; - p1 = &rrixiy[1][pos - 1]; - p0 = &rrixiy[0][pos - 1]; - - cor = 0x00008000L; /* for rounding */ - ptr_h1 = h; - ptr_h2 = ptr_hf; - - for (i = k + 1; i < NB_POS; i++) - { - cor += vo_L_mult((*ptr_h1), (*ptr_h2)); - ptr_h1++; - ptr_h2++; - *p3 = extract_h(cor); - cor += vo_L_mult((*ptr_h1), (*ptr_h2)); - ptr_h1++; - ptr_h2++; - *p2 = extract_h(cor); - cor += vo_L_mult((*ptr_h1), (*ptr_h2)); - ptr_h1++; - ptr_h2++; - *p1 = extract_h(cor); - cor += vo_L_mult((*ptr_h1), (*ptr_h2)); - ptr_h1++; - ptr_h2++; - *p0 = extract_h(cor); - - p3 -= (NB_POS + 1); - p2 -= (NB_POS + 1); - p1 -= (NB_POS + 1); - p0 -= (NB_POS + 1); - } - cor += vo_L_mult((*ptr_h1), (*ptr_h2)); - ptr_h1++; - ptr_h2++; - *p3 = extract_h(cor); - - pos--; - ptr_hf += STEP; - } - - /*------------------------------------------------------------* - * Modification of rrixiy[][] to take signs into account. * - *------------------------------------------------------------*/ - - p0 = &rrixiy[0][0]; - - for (k = 0; k < NB_TRACK; k++) - { - j_temp = (k + 1)&0x03; - for (i = k; i < L_SUBFR; i += STEP) - { - psign = sign; - if (psign[i] < 0) - { - psign = vec; - } - j = j_temp; - for (; j < L_SUBFR; j += STEP) - { - *p0 = vo_mult(*p0, psign[j]); - p0++; - } - } - } - - /*-------------------------------------------------------------------* - * Deep first search * - *-------------------------------------------------------------------*/ - - psk = -1; - alpk = 1; - - for (k = 0; k < nbiter; k++) - { - j_temp = k<<2; - for (i = 0; i < nb_pulse; i++) - ipos[i] = tipos[j_temp + i]; - - if(nbbits == 20) - { - pos = 0; - ps = 0; - alp = 0; - for (i = 0; i < L_SUBFR; i++) - { - vec[i] = 0; - } - } else if ((nbbits == 36) || (nbbits == 44)) - { - /* first stage: fix 2 pulses */ - pos = 2; - - ix = ind[0] = pos_max[ipos[0]]; - iy = ind[1] = pos_max[ipos[1]]; - ps = dn[ix] + dn[iy]; - i = ix >> 2; /* ix / STEP */ - j = iy >> 2; /* iy / STEP */ - s = rrixix[ipos[0]][i] << 13; - s += rrixix[ipos[1]][j] << 13; - i = (i << 4) + j; /* (ix/STEP)*NB_POS + (iy/STEP) */ - s += rrixiy[ipos[0]][i] << 14; - alp = (s + 0x8000) >> 16; - if (sign[ix] < 0) - p0 = h_inv - ix; - else - p0 = h - ix; - if (sign[iy] < 0) - p1 = h_inv - iy; - else - p1 = h - iy; - - for (i = 0; i < L_SUBFR; i++) - { - vec[i] = (*p0++) + (*p1++); - } - - if(nbbits == 44) - { - ipos[8] = 0; - ipos[9] = 1; - } - } else - { - /* first stage: fix 4 pulses */ - pos = 4; - - ix = ind[0] = pos_max[ipos[0]]; - iy = ind[1] = pos_max[ipos[1]]; - i = ind[2] = pos_max[ipos[2]]; - j = ind[3] = pos_max[ipos[3]]; - ps = add1(add1(add1(dn[ix], dn[iy]), dn[i]), dn[j]); - - if (sign[ix] < 0) - p0 = h_inv - ix; - else - p0 = h - ix; - - if (sign[iy] < 0) - p1 = h_inv - iy; - else - p1 = h - iy; - - if (sign[i] < 0) - p2 = h_inv - i; - else - p2 = h - i; - - if (sign[j] < 0) - p3 = h_inv - j; - else - p3 = h - j; - - L_tmp = 0L; - for(i = 0; i < L_SUBFR; i++) - { - vec[i] = add1(add1(add1(*p0++, *p1++), *p2++), *p3++); - L_tmp += (vec[i] * vec[i]) << 1; - } - - alp = ((L_tmp >> 3) + 0x8000) >> 16; - - if(nbbits == 72) - { - ipos[16] = 0; - ipos[17] = 1; - } - } - - /* other stages of 2 pulses */ - - for (j = pos, st = 0; j < nb_pulse; j += 2, st++) - { - /*--------------------------------------------------* - * Calculate correlation of all possible positions * - * of the next 2 pulses with previous fixed pulses. * - * Each pulse can have 16 possible positions. * - *--------------------------------------------------*/ - if(ipos[j] == 3) - { - cor_h_vec_30(h, vec, ipos[j], sign, rrixix, cor_x, cor_y); - } - else - { -#ifdef ASM_OPT /* asm optimization branch */ - cor_h_vec_012_asm(h, vec, ipos[j], sign, rrixix, cor_x, cor_y); -#else - cor_h_vec_012(h, vec, ipos[j], sign, rrixix, cor_x, cor_y); -#endif - } - /*--------------------------------------------------* - * Find best positions of 2 pulses. * - *--------------------------------------------------*/ - search_ixiy(nbpos[st], ipos[j], ipos[j + 1], &ps, &alp, - &ix, &iy, dn, dn2, cor_x, cor_y, rrixiy); - - ind[j] = ix; - ind[j + 1] = iy; - - if (sign[ix] < 0) - p0 = h_inv - ix; - else - p0 = h - ix; - if (sign[iy] < 0) - p1 = h_inv - iy; - else - p1 = h - iy; - - for (i = 0; i < L_SUBFR; i+=4) - { - vec[i] += add1((*p0++), (*p1++)); - vec[i+1] += add1((*p0++), (*p1++)); - vec[i+2] += add1((*p0++), (*p1++)); - vec[i+3] += add1((*p0++), (*p1++)); - } - } - /* memorise the best codevector */ - ps = vo_mult(ps, ps); - s = vo_L_msu(vo_L_mult(alpk, ps), psk, alp); - if (s > 0) - { - psk = ps; - alpk = alp; - for (i = 0; i < nb_pulse; i++) - { - codvec[i] = ind[i]; - } - for (i = 0; i < L_SUBFR; i++) - { - y[i] = vec[i]; - } - } - } - /*-------------------------------------------------------------------* - * Build the codeword, the filtered codeword and index of codevector.* - *-------------------------------------------------------------------*/ - for (i = 0; i < NPMAXPT * NB_TRACK; i++) - { - ind[i] = -1; - } - for (i = 0; i < L_SUBFR; i++) - { - code[i] = 0; - y[i] = vo_shr_r(y[i], 3); /* Q12 to Q9 */ - } - val = (512 >> h_shift); /* codeword in Q9 format */ - for (k = 0; k < nb_pulse; k++) - { - i = codvec[k]; /* read pulse position */ - j = sign[i]; /* read sign */ - index = i >> 2; /* index = pos of pulse (0..15) */ - track = (Word16) (i & 0x03); /* track = i % NB_TRACK (0..3) */ - - if (j > 0) - { - code[i] += val; - codvec[k] += 128; - } else - { - code[i] -= val; - index += NB_POS; - } - - i = (Word16)((vo_L_mult(track, NPMAXPT) >> 1)); - - while (ind[i] >= 0) - { - i += 1; - } - ind[i] = index; - } - - k = 0; - /* Build index of codevector */ - if(nbbits == 20) - { - for (track = 0; track < NB_TRACK; track++) - { - _index[track] = (Word16)(quant_1p_N1(ind[k], 4)); - k += NPMAXPT; - } - } else if(nbbits == 36) - { - for (track = 0; track < NB_TRACK; track++) - { - _index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4)); - k += NPMAXPT; - } - } else if(nbbits == 44) - { - for (track = 0; track < NB_TRACK - 2; track++) - { - _index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4)); - k += NPMAXPT; - } - for (track = 2; track < NB_TRACK; track++) - { - _index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4)); - k += NPMAXPT; - } - } else if(nbbits == 52) - { - for (track = 0; track < NB_TRACK; track++) - { - _index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4)); - k += NPMAXPT; - } - } else if(nbbits == 64) - { - for (track = 0; track < NB_TRACK; track++) - { - L_index = quant_4p_4N(&ind[k], 4); - _index[track] = (Word16)((L_index >> 14) & 3); - _index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF); - k += NPMAXPT; - } - } else if(nbbits == 72) - { - for (track = 0; track < NB_TRACK - 2; track++) - { - L_index = quant_5p_5N(&ind[k], 4); - _index[track] = (Word16)((L_index >> 10) & 0x03FF); - _index[track + NB_TRACK] = (Word16)(L_index & 0x03FF); - k += NPMAXPT; - } - for (track = 2; track < NB_TRACK; track++) - { - L_index = quant_4p_4N(&ind[k], 4); - _index[track] = (Word16)((L_index >> 14) & 3); - _index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF); - k += NPMAXPT; - } - } else if(nbbits == 88) - { - for (track = 0; track < NB_TRACK; track++) - { - L_index = quant_6p_6N_2(&ind[k], 4); - _index[track] = (Word16)((L_index >> 11) & 0x07FF); - _index[track + NB_TRACK] = (Word16)(L_index & 0x07FF); - k += NPMAXPT; - } - } - return; -} - - -/*-------------------------------------------------------------------* - * Function cor_h_vec() * - * ~~~~~~~~~~~~~~~~~~~~~ * - * Compute correlations of h[] with vec[] for the specified track. * - *-------------------------------------------------------------------*/ -void cor_h_vec_30( - Word16 h[], /* (i) scaled impulse response */ - Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ - Word16 track, /* (i) track to use */ - Word16 sign[], /* (i) sign vector */ - Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ - Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ - Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ - ) -{ - Word32 i, j, pos, corr; - Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y; - Word32 L_sum1,L_sum2; - cor_x = cor_1; - cor_y = cor_2; - p0 = rrixix[track]; - p3 = rrixix[0]; - pos = track; - - for (i = 0; i < NB_POS; i+=2) - { - L_sum1 = L_sum2 = 0L; - p1 = h; - p2 = &vec[pos]; - for (j=pos;j < L_SUBFR; j++) - { - L_sum1 += *p1 * *p2; - p2-=3; - L_sum2 += *p1++ * *p2; - p2+=4; - } - p2-=3; - L_sum2 += *p1++ * *p2++; - L_sum2 += *p1++ * *p2++; - L_sum2 += *p1++ * *p2++; - - L_sum1 = (L_sum1 << 2); - L_sum2 = (L_sum2 << 2); - - corr = vo_round(L_sum1); - *cor_x++ = vo_mult(corr, sign[pos]) + (*p0++); - corr = vo_round(L_sum2); - *cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++); - pos += STEP; - - L_sum1 = L_sum2 = 0L; - p1 = h; - p2 = &vec[pos]; - for (j=pos;j < L_SUBFR; j++) - { - L_sum1 += *p1 * *p2; - p2-=3; - L_sum2 += *p1++ * *p2; - p2+=4; - } - p2-=3; - L_sum2 += *p1++ * *p2++; - L_sum2 += *p1++ * *p2++; - L_sum2 += *p1++ * *p2++; - - L_sum1 = (L_sum1 << 2); - L_sum2 = (L_sum2 << 2); - - corr = vo_round(L_sum1); - *cor_x++ = vo_mult(corr, sign[pos]) + (*p0++); - corr = vo_round(L_sum2); - *cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++); - pos += STEP; - } - return; -} - -void cor_h_vec_012( - Word16 h[], /* (i) scaled impulse response */ - Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ - Word16 track, /* (i) track to use */ - Word16 sign[], /* (i) sign vector */ - Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ - Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ - Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ - ) -{ - Word32 i, j, pos, corr; - Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y; - Word32 L_sum1,L_sum2; - cor_x = cor_1; - cor_y = cor_2; - p0 = rrixix[track]; - p3 = rrixix[track+1]; - pos = track; - - for (i = 0; i < NB_POS; i+=2) - { - L_sum1 = L_sum2 = 0L; - p1 = h; - p2 = &vec[pos]; - for (j=62-pos ;j >= 0; j--) - { - L_sum1 += *p1 * *p2++; - L_sum2 += *p1++ * *p2; - } - L_sum1 += *p1 * *p2; - L_sum1 = (L_sum1 << 2); - L_sum2 = (L_sum2 << 2); - - corr = (L_sum1 + 0x8000) >> 16; - cor_x[i] = vo_mult(corr, sign[pos]) + (*p0++); - corr = (L_sum2 + 0x8000) >> 16; - cor_y[i] = vo_mult(corr, sign[pos + 1]) + (*p3++); - pos += STEP; - - L_sum1 = L_sum2 = 0L; - p1 = h; - p2 = &vec[pos]; - for (j= 62-pos;j >= 0; j--) - { - L_sum1 += *p1 * *p2++; - L_sum2 += *p1++ * *p2; - } - L_sum1 += *p1 * *p2; - L_sum1 = (L_sum1 << 2); - L_sum2 = (L_sum2 << 2); - - corr = (L_sum1 + 0x8000) >> 16; - cor_x[i+1] = vo_mult(corr, sign[pos]) + (*p0++); - corr = (L_sum2 + 0x8000) >> 16; - cor_y[i+1] = vo_mult(corr, sign[pos + 1]) + (*p3++); - pos += STEP; - } - return; -} - -/*-------------------------------------------------------------------* - * Function search_ixiy() * - * ~~~~~~~~~~~~~~~~~~~~~~~ * - * Find the best positions of 2 pulses in a subframe. * - *-------------------------------------------------------------------*/ - -void search_ixiy( - Word16 nb_pos_ix, /* (i) nb of pos for pulse 1 (1..8) */ - Word16 track_x, /* (i) track of pulse 1 */ - Word16 track_y, /* (i) track of pulse 2 */ - Word16 * ps, /* (i/o) correlation of all fixed pulses */ - Word16 * alp, /* (i/o) energy of all fixed pulses */ - Word16 * ix, /* (o) position of pulse 1 */ - Word16 * iy, /* (o) position of pulse 2 */ - Word16 dn[], /* (i) corr. between target and h[] */ - Word16 dn2[], /* (i) vector of selected positions */ - Word16 cor_x[], /* (i) corr. of pulse 1 with fixed pulses */ - Word16 cor_y[], /* (i) corr. of pulse 2 with fixed pulses */ - Word16 rrixiy[][MSIZE] /* (i) corr. of pulse 1 with pulse 2 */ - ) -{ - Word32 x, y, pos, thres_ix; - Word16 ps1, ps2, sq, sqk; - Word16 alp_16, alpk; - Word16 *p0, *p1, *p2; - Word32 s, alp0, alp1, alp2; - - p0 = cor_x; - p1 = cor_y; - p2 = rrixiy[track_x]; - - thres_ix = nb_pos_ix - NB_MAX; - - alp0 = L_deposit_h(*alp); - alp0 = (alp0 + 0x00008000L); /* for rounding */ - - sqk = -1; - alpk = 1; - - for (x = track_x; x < L_SUBFR; x += STEP) - { - ps1 = *ps + dn[x]; - alp1 = alp0 + ((*p0++)<<13); - - if (dn2[x] < thres_ix) - { - pos = -1; - for (y = track_y; y < L_SUBFR; y += STEP) - { - ps2 = add1(ps1, dn[y]); - - alp2 = alp1 + ((*p1++)<<13); - alp2 = alp2 + ((*p2++)<<14); - alp_16 = extract_h(alp2); - sq = vo_mult(ps2, ps2); - s = vo_L_mult(alpk, sq) - ((sqk * alp_16)<<1); - - if (s > 0) - { - sqk = sq; - alpk = alp_16; - pos = y; - } - } - p1 -= NB_POS; - - if (pos >= 0) - { - *ix = x; - *iy = pos; - } - } else - { - p2 += NB_POS; - } - } - - *ps = add1(*ps, add1(dn[*ix], dn[*iy])); - *alp = alpk; - - return; -} - - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: c4t64fx.c * +* * +* Description:Performs algebraic codebook search for higher modes * +* * +************************************************************************/ + +/************************************************************************ +* Function: ACELP_4t64_fx() * +* * +* 20, 36, 44, 52, 64, 72, 88 bits algebraic codebook. * +* 4 tracks x 16 positions per track = 64 samples. * +* * +* 20 bits --> 4 pulses in a frame of 64 samples. * +* 36 bits --> 8 pulses in a frame of 64 samples. * +* 44 bits --> 10 pulses in a frame of 64 samples. * +* 52 bits --> 12 pulses in a frame of 64 samples. * +* 64 bits --> 16 pulses in a frame of 64 samples. * +* 72 bits --> 18 pulses in a frame of 64 samples. * +* 88 bits --> 24 pulses in a frame of 64 samples. * +* * +* All pulses can have two (2) possible amplitudes: +1 or -1. * +* Each pulse can have sixteen (16) possible positions. * +*************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "math_op.h" +#include "acelp.h" +#include "cnst.h" + +#include "q_pulse.h" + +static Word16 tipos[36] = { + 0, 1, 2, 3, /* starting point &ipos[0], 1st iter */ + 1, 2, 3, 0, /* starting point &ipos[4], 2nd iter */ + 2, 3, 0, 1, /* starting point &ipos[8], 3rd iter */ + 3, 0, 1, 2, /* starting point &ipos[12], 4th iter */ + 0, 1, 2, 3, + 1, 2, 3, 0, + 2, 3, 0, 1, + 3, 0, 1, 2, + 0, 1, 2, 3}; /* end point for 24 pulses &ipos[35], 4th iter */ + +#define NB_PULSE_MAX 24 + +#define L_SUBFR 64 +#define NB_TRACK 4 +#define STEP 4 +#define NB_POS 16 +#define MSIZE 256 +#define NB_MAX 8 +#define NPMAXPT ((NB_PULSE_MAX+NB_TRACK-1)/NB_TRACK) + +/* Private functions */ +void cor_h_vec_012( + Word16 h[], /* (i) scaled impulse response */ + Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ + Word16 track, /* (i) track to use */ + Word16 sign[], /* (i) sign vector */ + Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ + Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ + Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ + ); + +void cor_h_vec_012_asm( + Word16 h[], /* (i) scaled impulse response */ + Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ + Word16 track, /* (i) track to use */ + Word16 sign[], /* (i) sign vector */ + Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ + Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ + Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ + ); + +void cor_h_vec_30( + Word16 h[], /* (i) scaled impulse response */ + Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ + Word16 track, /* (i) track to use */ + Word16 sign[], /* (i) sign vector */ + Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ + Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ + Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ + ); + +void search_ixiy( + Word16 nb_pos_ix, /* (i) nb of pos for pulse 1 (1..8) */ + Word16 track_x, /* (i) track of pulse 1 */ + Word16 track_y, /* (i) track of pulse 2 */ + Word16 * ps, /* (i/o) correlation of all fixed pulses */ + Word16 * alp, /* (i/o) energy of all fixed pulses */ + Word16 * ix, /* (o) position of pulse 1 */ + Word16 * iy, /* (o) position of pulse 2 */ + Word16 dn[], /* (i) corr. between target and h[] */ + Word16 dn2[], /* (i) vector of selected positions */ + Word16 cor_x[], /* (i) corr. of pulse 1 with fixed pulses */ + Word16 cor_y[], /* (i) corr. of pulse 2 with fixed pulses */ + Word16 rrixiy[][MSIZE] /* (i) corr. of pulse 1 with pulse 2 */ + ); + + +void ACELP_4t64_fx( + Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */ + Word16 cn[], /* (i) <12b : residual after long term prediction */ + Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */ + Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */ + Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */ + Word16 nbbits, /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits */ + Word16 ser_size, /* (i) : bit rate */ + Word16 _index[] /* (o) : index (20): 5+5+5+5 = 20 bits. */ + /* (o) : index (36): 9+9+9+9 = 36 bits. */ + /* (o) : index (44): 13+9+13+9 = 44 bits. */ + /* (o) : index (52): 13+13+13+13 = 52 bits. */ + /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits. */ + /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits. */ + /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */ + ) +{ + Word32 i, j, k; + Word16 st, ix, iy, pos, index, track, nb_pulse, nbiter, j_temp; + Word16 psk, ps, alpk, alp, val, k_cn, k_dn, exp; + Word16 *p0, *p1, *p2, *p3, *psign; + Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf, h_shift; + Word32 s, cor, L_tmp, L_index; + Word16 dn2[L_SUBFR], sign[L_SUBFR], vec[L_SUBFR]; + Word16 ind[NPMAXPT * NB_TRACK]; + Word16 codvec[NB_PULSE_MAX], nbpos[10]; + Word16 cor_x[NB_POS], cor_y[NB_POS], pos_max[NB_TRACK]; + Word16 h_buf[4 * L_SUBFR]; + Word16 rrixix[NB_TRACK][NB_POS], rrixiy[NB_TRACK][MSIZE]; + Word16 ipos[NB_PULSE_MAX]; + + switch (nbbits) + { + case 20: /* 20 bits, 4 pulses, 4 tracks */ + nbiter = 4; /* 4x16x16=1024 loop */ + alp = 8192; /* alp = 2.0 (Q12) */ + nb_pulse = 4; + nbpos[0] = 4; + nbpos[1] = 8; + break; + case 36: /* 36 bits, 8 pulses, 4 tracks */ + nbiter = 4; /* 4x20x16=1280 loop */ + alp = 4096; /* alp = 1.0 (Q12) */ + nb_pulse = 8; + nbpos[0] = 4; + nbpos[1] = 8; + nbpos[2] = 8; + break; + case 44: /* 44 bits, 10 pulses, 4 tracks */ + nbiter = 4; /* 4x26x16=1664 loop */ + alp = 4096; /* alp = 1.0 (Q12) */ + nb_pulse = 10; + nbpos[0] = 4; + nbpos[1] = 6; + nbpos[2] = 8; + nbpos[3] = 8; + break; + case 52: /* 52 bits, 12 pulses, 4 tracks */ + nbiter = 4; /* 4x26x16=1664 loop */ + alp = 4096; /* alp = 1.0 (Q12) */ + nb_pulse = 12; + nbpos[0] = 4; + nbpos[1] = 6; + nbpos[2] = 8; + nbpos[3] = 8; + break; + case 64: /* 64 bits, 16 pulses, 4 tracks */ + nbiter = 3; /* 3x36x16=1728 loop */ + alp = 3277; /* alp = 0.8 (Q12) */ + nb_pulse = 16; + nbpos[0] = 4; + nbpos[1] = 4; + nbpos[2] = 6; + nbpos[3] = 6; + nbpos[4] = 8; + nbpos[5] = 8; + break; + case 72: /* 72 bits, 18 pulses, 4 tracks */ + nbiter = 3; /* 3x35x16=1680 loop */ + alp = 3072; /* alp = 0.75 (Q12) */ + nb_pulse = 18; + nbpos[0] = 2; + nbpos[1] = 3; + nbpos[2] = 4; + nbpos[3] = 5; + nbpos[4] = 6; + nbpos[5] = 7; + nbpos[6] = 8; + break; + case 88: /* 88 bits, 24 pulses, 4 tracks */ + if(ser_size > 462) + nbiter = 1; + else + nbiter = 2; /* 2x53x16=1696 loop */ + + alp = 2048; /* alp = 0.5 (Q12) */ + nb_pulse = 24; + nbpos[0] = 2; + nbpos[1] = 2; + nbpos[2] = 3; + nbpos[3] = 4; + nbpos[4] = 5; + nbpos[5] = 6; + nbpos[6] = 7; + nbpos[7] = 8; + nbpos[8] = 8; + nbpos[9] = 8; + break; + default: + nbiter = 0; + alp = 0; + nb_pulse = 0; + } + + for (i = 0; i < nb_pulse; i++) + { + codvec[i] = i; + } + + /*----------------------------------------------------------------* + * Find sign for each pulse position. * + *----------------------------------------------------------------*/ + /* calculate energy for normalization of cn[] and dn[] */ + /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */ +#ifdef ASM_OPT /* asm optimization branch */ + s = Dot_product12_asm(cn, cn, L_SUBFR, &exp); +#else + s = Dot_product12(cn, cn, L_SUBFR, &exp); +#endif + + Isqrt_n(&s, &exp); + s = L_shl(s, (exp + 5)); + k_cn = extract_h(L_add(s, 0x8000)); + + /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */ +#ifdef ASM_OPT /* asm optimization branch */ + s = Dot_product12_asm(dn, dn, L_SUBFR, &exp); +#else + s = Dot_product12(dn, dn, L_SUBFR, &exp); +#endif + + Isqrt_n(&s, &exp); + k_dn = (L_shl(s, (exp + 5 + 3)) + 0x8000) >> 16; /* k_dn = 256..4096 */ + k_dn = vo_mult_r(alp, k_dn); /* alp in Q12 */ + + /* mix normalized cn[] and dn[] */ + p0 = cn; + p1 = dn; + p2 = dn2; + + for (i = 0; i < L_SUBFR/4; i++) + { + s = (k_cn* (*p0++))+(k_dn * (*p1++)); + *p2++ = s >> 7; + s = (k_cn* (*p0++))+(k_dn * (*p1++)); + *p2++ = s >> 7; + s = (k_cn* (*p0++))+(k_dn * (*p1++)); + *p2++ = s >> 7; + s = (k_cn* (*p0++))+(k_dn * (*p1++)); + *p2++ = s >> 7; + } + + /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[] */ + for(i = 0; i < L_SUBFR; i++) + { + val = dn[i]; + ps = dn2[i]; + if (ps >= 0) + { + sign[i] = 32767; /* sign = +1 (Q12) */ + vec[i] = -32768; + } else + { + sign[i] = -32768; /* sign = -1 (Q12) */ + vec[i] = 32767; + dn[i] = -val; + dn2[i] = -ps; + } + } + /*----------------------------------------------------------------* + * Select NB_MAX position per track according to max of dn2[]. * + *----------------------------------------------------------------*/ + pos = 0; + for (i = 0; i < NB_TRACK; i++) + { + for (k = 0; k < NB_MAX; k++) + { + ps = -1; + for (j = i; j < L_SUBFR; j += STEP) + { + if(dn2[j] > ps) + { + ps = dn2[j]; + pos = j; + } + } + dn2[pos] = (k - NB_MAX); /* dn2 < 0 when position is selected */ + if (k == 0) + { + pos_max[i] = pos; + } + } + } + + /*--------------------------------------------------------------* + * Scale h[] to avoid overflow and to get maximum of precision * + * on correlation. * + * * + * Maximum of h[] (h[0]) is fixed to 2048 (MAX16 / 16). * + * ==> This allow addition of 16 pulses without saturation. * + * * + * Energy worst case (on resonant impulse response), * + * - energy of h[] is approximately MAX/16. * + * - During search, the energy is divided by 8 to avoid * + * overflow on "alp". (energy of h[] = MAX/128). * + * ==> "alp" worst case detected is 22854 on sinusoidal wave. * + *--------------------------------------------------------------*/ + + /* impulse response buffer for fast computation */ + + h = h_buf; + h_inv = h_buf + (2 * L_SUBFR); + L_tmp = 0; + for (i = 0; i < L_SUBFR; i++) + { + *h++ = 0; + *h_inv++ = 0; + L_tmp += (H[i] * H[i]) << 1; + } + /* scale h[] down (/2) when energy of h[] is high with many pulses used */ + val = extract_h(L_tmp); + h_shift = 0; + + if ((nb_pulse >= 12) && (val > 1024)) + { + h_shift = 1; + } + p0 = H; + p1 = h; + p2 = h_inv; + + for (i = 0; i < L_SUBFR/4; i++) + { + *p1 = *p0++ >> h_shift; + *p2++ = -(*p1++); + *p1 = *p0++ >> h_shift; + *p2++ = -(*p1++); + *p1 = *p0++ >> h_shift; + *p2++ = -(*p1++); + *p1 = *p0++ >> h_shift; + *p2++ = -(*p1++); + } + + /*------------------------------------------------------------* + * Compute rrixix[][] needed for the codebook search. * + * This algorithm compute impulse response energy of all * + * positions (16) in each track (4). Total = 4x16 = 64. * + *------------------------------------------------------------*/ + + /* storage order --> i3i3, i2i2, i1i1, i0i0 */ + + /* Init pointers to last position of rrixix[] */ + p0 = &rrixix[0][NB_POS - 1]; + p1 = &rrixix[1][NB_POS - 1]; + p2 = &rrixix[2][NB_POS - 1]; + p3 = &rrixix[3][NB_POS - 1]; + + ptr_h1 = h; + cor = 0x00008000L; /* for rounding */ + for (i = 0; i < NB_POS; i++) + { + cor += vo_L_mult((*ptr_h1), (*ptr_h1)); + ptr_h1++; + *p3-- = extract_h(cor); + cor += vo_L_mult((*ptr_h1), (*ptr_h1)); + ptr_h1++; + *p2-- = extract_h(cor); + cor += vo_L_mult((*ptr_h1), (*ptr_h1)); + ptr_h1++; + *p1-- = extract_h(cor); + cor += vo_L_mult((*ptr_h1), (*ptr_h1)); + ptr_h1++; + *p0-- = extract_h(cor); + } + + /*------------------------------------------------------------* + * Compute rrixiy[][] needed for the codebook search. * + * This algorithm compute correlation between 2 pulses * + * (2 impulses responses) in 4 possible adjacents tracks. * + * (track 0-1, 1-2, 2-3 and 3-0). Total = 4x16x16 = 1024. * + *------------------------------------------------------------*/ + + /* storage order --> i2i3, i1i2, i0i1, i3i0 */ + + pos = MSIZE - 1; + ptr_hf = h + 1; + + for (k = 0; k < NB_POS; k++) + { + p3 = &rrixiy[2][pos]; + p2 = &rrixiy[1][pos]; + p1 = &rrixiy[0][pos]; + p0 = &rrixiy[3][pos - NB_POS]; + + cor = 0x00008000L; /* for rounding */ + ptr_h1 = h; + ptr_h2 = ptr_hf; + + for (i = k + 1; i < NB_POS; i++) + { + cor += vo_L_mult((*ptr_h1), (*ptr_h2)); + ptr_h1++; + ptr_h2++; + *p3 = extract_h(cor); + cor += vo_L_mult((*ptr_h1), (*ptr_h2)); + ptr_h1++; + ptr_h2++; + *p2 = extract_h(cor); + cor += vo_L_mult((*ptr_h1), (*ptr_h2)); + ptr_h1++; + ptr_h2++; + *p1 = extract_h(cor); + cor += vo_L_mult((*ptr_h1), (*ptr_h2)); + ptr_h1++; + ptr_h2++; + *p0 = extract_h(cor); + + p3 -= (NB_POS + 1); + p2 -= (NB_POS + 1); + p1 -= (NB_POS + 1); + p0 -= (NB_POS + 1); + } + cor += vo_L_mult((*ptr_h1), (*ptr_h2)); + ptr_h1++; + ptr_h2++; + *p3 = extract_h(cor); + cor += vo_L_mult((*ptr_h1), (*ptr_h2)); + ptr_h1++; + ptr_h2++; + *p2 = extract_h(cor); + cor += vo_L_mult((*ptr_h1), (*ptr_h2)); + ptr_h1++; + ptr_h2++; + *p1 = extract_h(cor); + + pos -= NB_POS; + ptr_hf += STEP; + } + + /* storage order --> i3i0, i2i3, i1i2, i0i1 */ + + pos = MSIZE - 1; + ptr_hf = h + 3; + + for (k = 0; k < NB_POS; k++) + { + p3 = &rrixiy[3][pos]; + p2 = &rrixiy[2][pos - 1]; + p1 = &rrixiy[1][pos - 1]; + p0 = &rrixiy[0][pos - 1]; + + cor = 0x00008000L; /* for rounding */ + ptr_h1 = h; + ptr_h2 = ptr_hf; + + for (i = k + 1; i < NB_POS; i++) + { + cor += vo_L_mult((*ptr_h1), (*ptr_h2)); + ptr_h1++; + ptr_h2++; + *p3 = extract_h(cor); + cor += vo_L_mult((*ptr_h1), (*ptr_h2)); + ptr_h1++; + ptr_h2++; + *p2 = extract_h(cor); + cor += vo_L_mult((*ptr_h1), (*ptr_h2)); + ptr_h1++; + ptr_h2++; + *p1 = extract_h(cor); + cor += vo_L_mult((*ptr_h1), (*ptr_h2)); + ptr_h1++; + ptr_h2++; + *p0 = extract_h(cor); + + p3 -= (NB_POS + 1); + p2 -= (NB_POS + 1); + p1 -= (NB_POS + 1); + p0 -= (NB_POS + 1); + } + cor += vo_L_mult((*ptr_h1), (*ptr_h2)); + ptr_h1++; + ptr_h2++; + *p3 = extract_h(cor); + + pos--; + ptr_hf += STEP; + } + + /*------------------------------------------------------------* + * Modification of rrixiy[][] to take signs into account. * + *------------------------------------------------------------*/ + + p0 = &rrixiy[0][0]; + + for (k = 0; k < NB_TRACK; k++) + { + j_temp = (k + 1)&0x03; + for (i = k; i < L_SUBFR; i += STEP) + { + psign = sign; + if (psign[i] < 0) + { + psign = vec; + } + j = j_temp; + for (; j < L_SUBFR; j += STEP) + { + *p0 = vo_mult(*p0, psign[j]); + p0++; + } + } + } + + /*-------------------------------------------------------------------* + * Deep first search * + *-------------------------------------------------------------------*/ + + psk = -1; + alpk = 1; + + for (k = 0; k < nbiter; k++) + { + j_temp = k<<2; + for (i = 0; i < nb_pulse; i++) + ipos[i] = tipos[j_temp + i]; + + if(nbbits == 20) + { + pos = 0; + ps = 0; + alp = 0; + for (i = 0; i < L_SUBFR; i++) + { + vec[i] = 0; + } + } else if ((nbbits == 36) || (nbbits == 44)) + { + /* first stage: fix 2 pulses */ + pos = 2; + + ix = ind[0] = pos_max[ipos[0]]; + iy = ind[1] = pos_max[ipos[1]]; + ps = dn[ix] + dn[iy]; + i = ix >> 2; /* ix / STEP */ + j = iy >> 2; /* iy / STEP */ + s = rrixix[ipos[0]][i] << 13; + s += rrixix[ipos[1]][j] << 13; + i = (i << 4) + j; /* (ix/STEP)*NB_POS + (iy/STEP) */ + s += rrixiy[ipos[0]][i] << 14; + alp = (s + 0x8000) >> 16; + if (sign[ix] < 0) + p0 = h_inv - ix; + else + p0 = h - ix; + if (sign[iy] < 0) + p1 = h_inv - iy; + else + p1 = h - iy; + + for (i = 0; i < L_SUBFR; i++) + { + vec[i] = (*p0++) + (*p1++); + } + + if(nbbits == 44) + { + ipos[8] = 0; + ipos[9] = 1; + } + } else + { + /* first stage: fix 4 pulses */ + pos = 4; + + ix = ind[0] = pos_max[ipos[0]]; + iy = ind[1] = pos_max[ipos[1]]; + i = ind[2] = pos_max[ipos[2]]; + j = ind[3] = pos_max[ipos[3]]; + ps = add1(add1(add1(dn[ix], dn[iy]), dn[i]), dn[j]); + + if (sign[ix] < 0) + p0 = h_inv - ix; + else + p0 = h - ix; + + if (sign[iy] < 0) + p1 = h_inv - iy; + else + p1 = h - iy; + + if (sign[i] < 0) + p2 = h_inv - i; + else + p2 = h - i; + + if (sign[j] < 0) + p3 = h_inv - j; + else + p3 = h - j; + + L_tmp = 0L; + for(i = 0; i < L_SUBFR; i++) + { + vec[i] = add1(add1(add1(*p0++, *p1++), *p2++), *p3++); + L_tmp += (vec[i] * vec[i]) << 1; + } + + alp = ((L_tmp >> 3) + 0x8000) >> 16; + + if(nbbits == 72) + { + ipos[16] = 0; + ipos[17] = 1; + } + } + + /* other stages of 2 pulses */ + + for (j = pos, st = 0; j < nb_pulse; j += 2, st++) + { + /*--------------------------------------------------* + * Calculate correlation of all possible positions * + * of the next 2 pulses with previous fixed pulses. * + * Each pulse can have 16 possible positions. * + *--------------------------------------------------*/ + if(ipos[j] == 3) + { + cor_h_vec_30(h, vec, ipos[j], sign, rrixix, cor_x, cor_y); + } + else + { +#ifdef ASM_OPT /* asm optimization branch */ + cor_h_vec_012_asm(h, vec, ipos[j], sign, rrixix, cor_x, cor_y); +#else + cor_h_vec_012(h, vec, ipos[j], sign, rrixix, cor_x, cor_y); +#endif + } + /*--------------------------------------------------* + * Find best positions of 2 pulses. * + *--------------------------------------------------*/ + search_ixiy(nbpos[st], ipos[j], ipos[j + 1], &ps, &alp, + &ix, &iy, dn, dn2, cor_x, cor_y, rrixiy); + + ind[j] = ix; + ind[j + 1] = iy; + + if (sign[ix] < 0) + p0 = h_inv - ix; + else + p0 = h - ix; + if (sign[iy] < 0) + p1 = h_inv - iy; + else + p1 = h - iy; + + for (i = 0; i < L_SUBFR; i+=4) + { + vec[i] += add1((*p0++), (*p1++)); + vec[i+1] += add1((*p0++), (*p1++)); + vec[i+2] += add1((*p0++), (*p1++)); + vec[i+3] += add1((*p0++), (*p1++)); + } + } + /* memorise the best codevector */ + ps = vo_mult(ps, ps); + s = vo_L_msu(vo_L_mult(alpk, ps), psk, alp); + if (s > 0) + { + psk = ps; + alpk = alp; + for (i = 0; i < nb_pulse; i++) + { + codvec[i] = ind[i]; + } + for (i = 0; i < L_SUBFR; i++) + { + y[i] = vec[i]; + } + } + } + /*-------------------------------------------------------------------* + * Build the codeword, the filtered codeword and index of codevector.* + *-------------------------------------------------------------------*/ + for (i = 0; i < NPMAXPT * NB_TRACK; i++) + { + ind[i] = -1; + } + for (i = 0; i < L_SUBFR; i++) + { + code[i] = 0; + y[i] = vo_shr_r(y[i], 3); /* Q12 to Q9 */ + } + val = (512 >> h_shift); /* codeword in Q9 format */ + for (k = 0; k < nb_pulse; k++) + { + i = codvec[k]; /* read pulse position */ + j = sign[i]; /* read sign */ + index = i >> 2; /* index = pos of pulse (0..15) */ + track = (Word16) (i & 0x03); /* track = i % NB_TRACK (0..3) */ + + if (j > 0) + { + code[i] += val; + codvec[k] += 128; + } else + { + code[i] -= val; + index += NB_POS; + } + + i = (Word16)((vo_L_mult(track, NPMAXPT) >> 1)); + + while (ind[i] >= 0) + { + i += 1; + } + ind[i] = index; + } + + k = 0; + /* Build index of codevector */ + if(nbbits == 20) + { + for (track = 0; track < NB_TRACK; track++) + { + _index[track] = (Word16)(quant_1p_N1(ind[k], 4)); + k += NPMAXPT; + } + } else if(nbbits == 36) + { + for (track = 0; track < NB_TRACK; track++) + { + _index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4)); + k += NPMAXPT; + } + } else if(nbbits == 44) + { + for (track = 0; track < NB_TRACK - 2; track++) + { + _index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4)); + k += NPMAXPT; + } + for (track = 2; track < NB_TRACK; track++) + { + _index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4)); + k += NPMAXPT; + } + } else if(nbbits == 52) + { + for (track = 0; track < NB_TRACK; track++) + { + _index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4)); + k += NPMAXPT; + } + } else if(nbbits == 64) + { + for (track = 0; track < NB_TRACK; track++) + { + L_index = quant_4p_4N(&ind[k], 4); + _index[track] = (Word16)((L_index >> 14) & 3); + _index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF); + k += NPMAXPT; + } + } else if(nbbits == 72) + { + for (track = 0; track < NB_TRACK - 2; track++) + { + L_index = quant_5p_5N(&ind[k], 4); + _index[track] = (Word16)((L_index >> 10) & 0x03FF); + _index[track + NB_TRACK] = (Word16)(L_index & 0x03FF); + k += NPMAXPT; + } + for (track = 2; track < NB_TRACK; track++) + { + L_index = quant_4p_4N(&ind[k], 4); + _index[track] = (Word16)((L_index >> 14) & 3); + _index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF); + k += NPMAXPT; + } + } else if(nbbits == 88) + { + for (track = 0; track < NB_TRACK; track++) + { + L_index = quant_6p_6N_2(&ind[k], 4); + _index[track] = (Word16)((L_index >> 11) & 0x07FF); + _index[track + NB_TRACK] = (Word16)(L_index & 0x07FF); + k += NPMAXPT; + } + } + return; +} + + +/*-------------------------------------------------------------------* + * Function cor_h_vec() * + * ~~~~~~~~~~~~~~~~~~~~~ * + * Compute correlations of h[] with vec[] for the specified track. * + *-------------------------------------------------------------------*/ +void cor_h_vec_30( + Word16 h[], /* (i) scaled impulse response */ + Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ + Word16 track, /* (i) track to use */ + Word16 sign[], /* (i) sign vector */ + Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ + Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ + Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ + ) +{ + Word32 i, j, pos, corr; + Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y; + Word32 L_sum1,L_sum2; + cor_x = cor_1; + cor_y = cor_2; + p0 = rrixix[track]; + p3 = rrixix[0]; + pos = track; + + for (i = 0; i < NB_POS; i+=2) + { + L_sum1 = L_sum2 = 0L; + p1 = h; + p2 = &vec[pos]; + for (j=pos;j < L_SUBFR; j++) + { + L_sum1 += *p1 * *p2; + p2-=3; + L_sum2 += *p1++ * *p2; + p2+=4; + } + p2-=3; + L_sum2 += *p1++ * *p2++; + L_sum2 += *p1++ * *p2++; + L_sum2 += *p1++ * *p2++; + + L_sum1 = (L_sum1 << 2); + L_sum2 = (L_sum2 << 2); + + corr = vo_round(L_sum1); + *cor_x++ = vo_mult(corr, sign[pos]) + (*p0++); + corr = vo_round(L_sum2); + *cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++); + pos += STEP; + + L_sum1 = L_sum2 = 0L; + p1 = h; + p2 = &vec[pos]; + for (j=pos;j < L_SUBFR; j++) + { + L_sum1 += *p1 * *p2; + p2-=3; + L_sum2 += *p1++ * *p2; + p2+=4; + } + p2-=3; + L_sum2 += *p1++ * *p2++; + L_sum2 += *p1++ * *p2++; + L_sum2 += *p1++ * *p2++; + + L_sum1 = (L_sum1 << 2); + L_sum2 = (L_sum2 << 2); + + corr = vo_round(L_sum1); + *cor_x++ = vo_mult(corr, sign[pos]) + (*p0++); + corr = vo_round(L_sum2); + *cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++); + pos += STEP; + } + return; +} + +void cor_h_vec_012( + Word16 h[], /* (i) scaled impulse response */ + Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */ + Word16 track, /* (i) track to use */ + Word16 sign[], /* (i) sign vector */ + Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */ + Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */ + Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */ + ) +{ + Word32 i, j, pos, corr; + Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y; + Word32 L_sum1,L_sum2; + cor_x = cor_1; + cor_y = cor_2; + p0 = rrixix[track]; + p3 = rrixix[track+1]; + pos = track; + + for (i = 0; i < NB_POS; i+=2) + { + L_sum1 = L_sum2 = 0L; + p1 = h; + p2 = &vec[pos]; + for (j=62-pos ;j >= 0; j--) + { + L_sum1 += *p1 * *p2++; + L_sum2 += *p1++ * *p2; + } + L_sum1 += *p1 * *p2; + L_sum1 = (L_sum1 << 2); + L_sum2 = (L_sum2 << 2); + + corr = (L_sum1 + 0x8000) >> 16; + cor_x[i] = vo_mult(corr, sign[pos]) + (*p0++); + corr = (L_sum2 + 0x8000) >> 16; + cor_y[i] = vo_mult(corr, sign[pos + 1]) + (*p3++); + pos += STEP; + + L_sum1 = L_sum2 = 0L; + p1 = h; + p2 = &vec[pos]; + for (j= 62-pos;j >= 0; j--) + { + L_sum1 += *p1 * *p2++; + L_sum2 += *p1++ * *p2; + } + L_sum1 += *p1 * *p2; + L_sum1 = (L_sum1 << 2); + L_sum2 = (L_sum2 << 2); + + corr = (L_sum1 + 0x8000) >> 16; + cor_x[i+1] = vo_mult(corr, sign[pos]) + (*p0++); + corr = (L_sum2 + 0x8000) >> 16; + cor_y[i+1] = vo_mult(corr, sign[pos + 1]) + (*p3++); + pos += STEP; + } + return; +} + +/*-------------------------------------------------------------------* + * Function search_ixiy() * + * ~~~~~~~~~~~~~~~~~~~~~~~ * + * Find the best positions of 2 pulses in a subframe. * + *-------------------------------------------------------------------*/ + +void search_ixiy( + Word16 nb_pos_ix, /* (i) nb of pos for pulse 1 (1..8) */ + Word16 track_x, /* (i) track of pulse 1 */ + Word16 track_y, /* (i) track of pulse 2 */ + Word16 * ps, /* (i/o) correlation of all fixed pulses */ + Word16 * alp, /* (i/o) energy of all fixed pulses */ + Word16 * ix, /* (o) position of pulse 1 */ + Word16 * iy, /* (o) position of pulse 2 */ + Word16 dn[], /* (i) corr. between target and h[] */ + Word16 dn2[], /* (i) vector of selected positions */ + Word16 cor_x[], /* (i) corr. of pulse 1 with fixed pulses */ + Word16 cor_y[], /* (i) corr. of pulse 2 with fixed pulses */ + Word16 rrixiy[][MSIZE] /* (i) corr. of pulse 1 with pulse 2 */ + ) +{ + Word32 x, y, pos, thres_ix; + Word16 ps1, ps2, sq, sqk; + Word16 alp_16, alpk; + Word16 *p0, *p1, *p2; + Word32 s, alp0, alp1, alp2; + + p0 = cor_x; + p1 = cor_y; + p2 = rrixiy[track_x]; + + thres_ix = nb_pos_ix - NB_MAX; + + alp0 = L_deposit_h(*alp); + alp0 = (alp0 + 0x00008000L); /* for rounding */ + + sqk = -1; + alpk = 1; + + for (x = track_x; x < L_SUBFR; x += STEP) + { + ps1 = *ps + dn[x]; + alp1 = alp0 + ((*p0++)<<13); + + if (dn2[x] < thres_ix) + { + pos = -1; + for (y = track_y; y < L_SUBFR; y += STEP) + { + ps2 = add1(ps1, dn[y]); + + alp2 = alp1 + ((*p1++)<<13); + alp2 = alp2 + ((*p2++)<<14); + alp_16 = extract_h(alp2); + sq = vo_mult(ps2, ps2); + s = vo_L_mult(alpk, sq) - ((sqk * alp_16)<<1); + + if (s > 0) + { + sqk = sq; + alpk = alp_16; + pos = y; + } + } + p1 -= NB_POS; + + if (pos >= 0) + { + *ix = x; + *iy = pos; + } + } else + { + p2 += NB_POS; + } + } + + *ps = add1(*ps, add1(dn[*ix], dn[*iy])); + *alp = alpk; + + return; +} + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/cmnMemory.c b/media/libstagefright/codecs/amrwbenc/src/cmnMemory.c index c17264c..dd7c26d 100644 --- a/media/libstagefright/codecs/amrwbenc/src/cmnMemory.c +++ b/media/libstagefright/codecs/amrwbenc/src/cmnMemory.c @@ -1,73 +1,73 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: cmnMemory.c - - Content: sample code for memory operator implementation - -*******************************************************************************/ -#include "cmnMemory.h" - -#include -#if defined LINUX -#include -#endif - -//VO_MEM_OPERATOR g_memOP; - -VO_U32 cmnMemAlloc (VO_S32 uID, VO_MEM_INFO * pMemInfo) -{ - if (!pMemInfo) - return VO_ERR_INVALID_ARG; - - pMemInfo->VBuffer = malloc (pMemInfo->Size); - return 0; -} - -VO_U32 cmnMemFree (VO_S32 uID, VO_PTR pMem) -{ - free (pMem); - return 0; -} - -VO_U32 cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize) -{ - memset (pBuff, uValue, uSize); - return 0; -} - -VO_U32 cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize) -{ - memcpy (pDest, pSource, uSize); - return 0; -} - -VO_U32 cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize) -{ - return 0; -} - -VO_S32 cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize) -{ - return memcmp(pBuffer1, pBuffer2, uSize); -} - -VO_U32 cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize) -{ - memmove (pDest, pSource, uSize); - return 0; -} - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: cmnMemory.c + + Content: sample code for memory operator implementation + +*******************************************************************************/ +#include "cmnMemory.h" + +#include +#if defined LINUX +#include +#endif + +//VO_MEM_OPERATOR g_memOP; + +VO_U32 cmnMemAlloc (VO_S32 uID, VO_MEM_INFO * pMemInfo) +{ + if (!pMemInfo) + return VO_ERR_INVALID_ARG; + + pMemInfo->VBuffer = malloc (pMemInfo->Size); + return 0; +} + +VO_U32 cmnMemFree (VO_S32 uID, VO_PTR pMem) +{ + free (pMem); + return 0; +} + +VO_U32 cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize) +{ + memset (pBuff, uValue, uSize); + return 0; +} + +VO_U32 cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize) +{ + memcpy (pDest, pSource, uSize); + return 0; +} + +VO_U32 cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize) +{ + return 0; +} + +VO_S32 cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize) +{ + return memcmp(pBuffer1, pBuffer2, uSize); +} + +VO_U32 cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize) +{ + memmove (pDest, pSource, uSize); + return 0; +} + diff --git a/media/libstagefright/codecs/amrwbenc/src/convolve.c b/media/libstagefright/codecs/amrwbenc/src/convolve.c index 66c74d6..4f7fd8a 100644 --- a/media/libstagefright/codecs/amrwbenc/src/convolve.c +++ b/media/libstagefright/codecs/amrwbenc/src/convolve.c @@ -1,109 +1,109 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** - File: convolve.c - - Description:Perform the convolution between two vectors x[] and h[] - and write the result in the vector y[] - -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" - -void Convolve ( - Word16 x[], /* (i) : input vector */ - Word16 h[], /* (i) : impulse response */ - Word16 y[], /* (o) : output vector */ - Word16 L /* (i) : vector size */ - ) -{ - Word32 i, n; - Word16 *tmpH,*tmpX; - Word32 s; - for (n = 0; n < 64;) - { - tmpH = h+n; - tmpX = x; - i=n+1; - s = vo_mult32((*tmpX++), (*tmpH--));i--; - while(i>0) - { - s += vo_mult32((*tmpX++), (*tmpH--)); - s += vo_mult32((*tmpX++), (*tmpH--)); - s += vo_mult32((*tmpX++), (*tmpH--)); - s += vo_mult32((*tmpX++), (*tmpH--)); - i -= 4; - } - y[n] = ((s<<1) + 0x8000)>>16; - n++; - - tmpH = h+n; - tmpX = x; - i=n+1; - s = vo_mult32((*tmpX++), (*tmpH--));i--; - s += vo_mult32((*tmpX++), (*tmpH--));i--; - - while(i>0) - { - s += vo_mult32((*tmpX++), (*tmpH--)); - s += vo_mult32((*tmpX++), (*tmpH--)); - s += vo_mult32((*tmpX++), (*tmpH--)); - s += vo_mult32((*tmpX++), (*tmpH--)); - i -= 4; - } - y[n] = ((s<<1) + 0x8000)>>16; - n++; - - tmpH = h+n; - tmpX = x; - i=n+1; - s = vo_mult32((*tmpX++), (*tmpH--));i--; - s += vo_mult32((*tmpX++), (*tmpH--));i--; - s += vo_mult32((*tmpX++), (*tmpH--));i--; - - while(i>0) - { - s += vo_mult32((*tmpX++), (*tmpH--)); - s += vo_mult32((*tmpX++), (*tmpH--)); - s += vo_mult32((*tmpX++), (*tmpH--)); - s += vo_mult32((*tmpX++), (*tmpH--)); - i -= 4; - } - y[n] = ((s<<1) + 0x8000)>>16; - n++; - - s = 0; - tmpH = h+n; - tmpX = x; - i=n+1; - while(i>0) - { - s += vo_mult32((*tmpX++), (*tmpH--)); - s += vo_mult32((*tmpX++), (*tmpH--)); - s += vo_mult32((*tmpX++), (*tmpH--)); - s += vo_mult32((*tmpX++), (*tmpH--)); - i -= 4; - } - y[n] = ((s<<1) + 0x8000)>>16; - n++; - } - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** + File: convolve.c + + Description:Perform the convolution between two vectors x[] and h[] + and write the result in the vector y[] + +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" + +void Convolve ( + Word16 x[], /* (i) : input vector */ + Word16 h[], /* (i) : impulse response */ + Word16 y[], /* (o) : output vector */ + Word16 L /* (i) : vector size */ + ) +{ + Word32 i, n; + Word16 *tmpH,*tmpX; + Word32 s; + for (n = 0; n < 64;) + { + tmpH = h+n; + tmpX = x; + i=n+1; + s = vo_mult32((*tmpX++), (*tmpH--));i--; + while(i>0) + { + s += vo_mult32((*tmpX++), (*tmpH--)); + s += vo_mult32((*tmpX++), (*tmpH--)); + s += vo_mult32((*tmpX++), (*tmpH--)); + s += vo_mult32((*tmpX++), (*tmpH--)); + i -= 4; + } + y[n] = ((s<<1) + 0x8000)>>16; + n++; + + tmpH = h+n; + tmpX = x; + i=n+1; + s = vo_mult32((*tmpX++), (*tmpH--));i--; + s += vo_mult32((*tmpX++), (*tmpH--));i--; + + while(i>0) + { + s += vo_mult32((*tmpX++), (*tmpH--)); + s += vo_mult32((*tmpX++), (*tmpH--)); + s += vo_mult32((*tmpX++), (*tmpH--)); + s += vo_mult32((*tmpX++), (*tmpH--)); + i -= 4; + } + y[n] = ((s<<1) + 0x8000)>>16; + n++; + + tmpH = h+n; + tmpX = x; + i=n+1; + s = vo_mult32((*tmpX++), (*tmpH--));i--; + s += vo_mult32((*tmpX++), (*tmpH--));i--; + s += vo_mult32((*tmpX++), (*tmpH--));i--; + + while(i>0) + { + s += vo_mult32((*tmpX++), (*tmpH--)); + s += vo_mult32((*tmpX++), (*tmpH--)); + s += vo_mult32((*tmpX++), (*tmpH--)); + s += vo_mult32((*tmpX++), (*tmpH--)); + i -= 4; + } + y[n] = ((s<<1) + 0x8000)>>16; + n++; + + s = 0; + tmpH = h+n; + tmpX = x; + i=n+1; + while(i>0) + { + s += vo_mult32((*tmpX++), (*tmpH--)); + s += vo_mult32((*tmpX++), (*tmpH--)); + s += vo_mult32((*tmpX++), (*tmpH--)); + s += vo_mult32((*tmpX++), (*tmpH--)); + i -= 4; + } + y[n] = ((s<<1) + 0x8000)>>16; + n++; + } + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c b/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c index 3c2e9d5..b645fa3 100644 --- a/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c +++ b/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c @@ -1,127 +1,127 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: cor_h_x.c * -* * -* Description:Compute correlation between target "x[]" and "h[]" * -* Designed for codebook search (24 pulses, 4 tracks, * -* 4 pulses per track, 16 positions in each track) to * -* avoid saturation. * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "math_op.h" - -#define L_SUBFR 64 -#define NB_TRACK 4 -#define STEP 4 - -void cor_h_x( - Word16 h[], /* (i) Q12 : impulse response of weighted synthesis filter */ - Word16 x[], /* (i) Q0 : target vector */ - Word16 dn[] /* (o) <12bit : correlation between target and h[] */ - ) -{ - Word32 i, j; - Word32 L_tmp, y32[L_SUBFR], L_tot; - Word16 *p1, *p2; - Word32 *p3; - Word32 L_max, L_max1, L_max2, L_max3; - /* first keep the result on 32 bits and find absolute maximum */ - L_tot = 1; - L_max = 0; - L_max1 = 0; - L_max2 = 0; - L_max3 = 0; - for (i = 0; i < L_SUBFR; i += STEP) - { - L_tmp = 1; /* 1 -> to avoid null dn[] */ - p1 = &x[i]; - p2 = &h[0]; - for (j = i; j < L_SUBFR; j++) - L_tmp += vo_L_mult(*p1++, *p2++); - - y32[i] = L_tmp; - L_tmp = (L_tmp > 0)? L_tmp:-L_tmp; - if(L_tmp > L_max) - { - L_max = L_tmp; - } - - L_tmp = 1L; - p1 = &x[i+1]; - p2 = &h[0]; - for (j = i+1; j < L_SUBFR; j++) - L_tmp += vo_L_mult(*p1++, *p2++); - - y32[i+1] = L_tmp; - L_tmp = (L_tmp > 0)? L_tmp:-L_tmp; - if(L_tmp > L_max1) - { - L_max1 = L_tmp; - } - - L_tmp = 1; - p1 = &x[i+2]; - p2 = &h[0]; - for (j = i+2; j < L_SUBFR; j++) - L_tmp += vo_L_mult(*p1++, *p2++); - - y32[i+2] = L_tmp; - L_tmp = (L_tmp > 0)? L_tmp:-L_tmp; - if(L_tmp > L_max2) - { - L_max2 = L_tmp; - } - - L_tmp = 1; - p1 = &x[i+3]; - p2 = &h[0]; - for (j = i+3; j < L_SUBFR; j++) - L_tmp += vo_L_mult(*p1++, *p2++); - - y32[i+3] = L_tmp; - L_tmp = (L_tmp > 0)? L_tmp:-L_tmp; - if(L_tmp > L_max3) - { - L_max3 = L_tmp; - } - } - /* tot += 3*max / 8 */ - L_max = ((L_max + L_max1 + L_max2 + L_max3) >> 2); - L_tot = vo_L_add(L_tot, L_max); /* +max/4 */ - L_tot = vo_L_add(L_tot, (L_max >> 1)); /* +max/8 */ - - /* Find the number of right shifts to do on y32[] so that */ - /* 6.0 x sumation of max of dn[] in each track not saturate. */ - j = norm_l(L_tot) - 4; /* 4 -> 16 x tot */ - p1 = dn; - p3 = y32; - for (i = 0; i < L_SUBFR; i+=4) - { - *p1++ = vo_round(L_shl(*p3++, j)); - *p1++ = vo_round(L_shl(*p3++, j)); - *p1++ = vo_round(L_shl(*p3++, j)); - *p1++ = vo_round(L_shl(*p3++, j)); - } - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: cor_h_x.c * +* * +* Description:Compute correlation between target "x[]" and "h[]" * +* Designed for codebook search (24 pulses, 4 tracks, * +* 4 pulses per track, 16 positions in each track) to * +* avoid saturation. * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "math_op.h" + +#define L_SUBFR 64 +#define NB_TRACK 4 +#define STEP 4 + +void cor_h_x( + Word16 h[], /* (i) Q12 : impulse response of weighted synthesis filter */ + Word16 x[], /* (i) Q0 : target vector */ + Word16 dn[] /* (o) <12bit : correlation between target and h[] */ + ) +{ + Word32 i, j; + Word32 L_tmp, y32[L_SUBFR], L_tot; + Word16 *p1, *p2; + Word32 *p3; + Word32 L_max, L_max1, L_max2, L_max3; + /* first keep the result on 32 bits and find absolute maximum */ + L_tot = 1; + L_max = 0; + L_max1 = 0; + L_max2 = 0; + L_max3 = 0; + for (i = 0; i < L_SUBFR; i += STEP) + { + L_tmp = 1; /* 1 -> to avoid null dn[] */ + p1 = &x[i]; + p2 = &h[0]; + for (j = i; j < L_SUBFR; j++) + L_tmp += vo_L_mult(*p1++, *p2++); + + y32[i] = L_tmp; + L_tmp = (L_tmp > 0)? L_tmp:-L_tmp; + if(L_tmp > L_max) + { + L_max = L_tmp; + } + + L_tmp = 1L; + p1 = &x[i+1]; + p2 = &h[0]; + for (j = i+1; j < L_SUBFR; j++) + L_tmp += vo_L_mult(*p1++, *p2++); + + y32[i+1] = L_tmp; + L_tmp = (L_tmp > 0)? L_tmp:-L_tmp; + if(L_tmp > L_max1) + { + L_max1 = L_tmp; + } + + L_tmp = 1; + p1 = &x[i+2]; + p2 = &h[0]; + for (j = i+2; j < L_SUBFR; j++) + L_tmp += vo_L_mult(*p1++, *p2++); + + y32[i+2] = L_tmp; + L_tmp = (L_tmp > 0)? L_tmp:-L_tmp; + if(L_tmp > L_max2) + { + L_max2 = L_tmp; + } + + L_tmp = 1; + p1 = &x[i+3]; + p2 = &h[0]; + for (j = i+3; j < L_SUBFR; j++) + L_tmp += vo_L_mult(*p1++, *p2++); + + y32[i+3] = L_tmp; + L_tmp = (L_tmp > 0)? L_tmp:-L_tmp; + if(L_tmp > L_max3) + { + L_max3 = L_tmp; + } + } + /* tot += 3*max / 8 */ + L_max = ((L_max + L_max1 + L_max2 + L_max3) >> 2); + L_tot = vo_L_add(L_tot, L_max); /* +max/4 */ + L_tot = vo_L_add(L_tot, (L_max >> 1)); /* +max/8 */ + + /* Find the number of right shifts to do on y32[] so that */ + /* 6.0 x sumation of max of dn[] in each track not saturate. */ + j = norm_l(L_tot) - 4; /* 4 -> 16 x tot */ + p1 = dn; + p3 = y32; + for (i = 0; i < L_SUBFR; i+=4) + { + *p1++ = vo_round(L_shl(*p3++, j)); + *p1++ = vo_round(L_shl(*p3++, j)); + *p1++ = vo_round(L_shl(*p3++, j)); + *p1++ = vo_round(L_shl(*p3++, j)); + } + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/decim54.c b/media/libstagefright/codecs/amrwbenc/src/decim54.c index 429a7d6..7bc5576 100644 --- a/media/libstagefright/codecs/amrwbenc/src/decim54.c +++ b/media/libstagefright/codecs/amrwbenc/src/decim54.c @@ -1,146 +1,146 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: decim54.c * -* * -* Description:Decimation of 16kHz signal to 12.8kHz * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "acelp.h" -#include "cnst.h" - -#define FAC5 5 -#define DOWN_FAC 26215 /* 4/5 in Q15 */ - -#define NB_COEF_DOWN 15 - -/* Local functions */ -static void Down_samp( - Word16 * sig, /* input: signal to downsampling */ - Word16 * sig_d, /* output: downsampled signal */ - Word16 L_frame_d /* input: length of output */ - ); - -/* 1/5 resolution interpolation filter (in Q14) */ -/* -1.5dB @ 6kHz, -6dB @ 6.4kHz, -10dB @ 6.6kHz, -20dB @ 6.9kHz, -25dB @ 7kHz, -55dB @ 8kHz */ - -static Word16 fir_down1[4][30] = -{ - {-5, 24, -50, 54, 0, -128, 294, -408, 344, 0, -647, 1505, -2379, 3034, 13107, 3034, -2379, 1505, -647, 0, 344, -408, - 294, -128, 0, 54, -50, 24, -5, 0}, - - {-6, 19, -26, 0, 77, -188, 270, -233, 0, 434, -964, 1366, -1293, 0, 12254, 6575, -2746, 1030, 0, -507, 601, -441, - 198, 0, -95, 99, -58, 18, 0, -1}, - - {-3, 9, 0, -41, 111, -170, 153, 0, -295, 649, -888, 770, 0, -1997, 9894, 9894, -1997, 0, 770, -888, 649, -295, 0, - 153, -170, 111, -41, 0, 9, -3}, - - {-1, 0, 18, -58, 99, -95, 0, 198, -441, 601, -507, 0, 1030, -2746, 6575, 12254, 0, -1293, 1366, -964, 434, 0, - -233, 270, -188, 77, 0, -26, 19, -6} -}; - -void Init_Decim_12k8( - Word16 mem[] /* output: memory (2*NB_COEF_DOWN) set to zeros */ - ) -{ - Set_zero(mem, 2 * NB_COEF_DOWN); - return; -} - -void Decim_12k8( - Word16 sig16k[], /* input: signal to downsampling */ - Word16 lg, /* input: length of input */ - Word16 sig12k8[], /* output: decimated signal */ - Word16 mem[] /* in/out: memory (2*NB_COEF_DOWN) */ - ) -{ - Word16 lg_down; - Word16 signal[L_FRAME16k + (2 * NB_COEF_DOWN)]; - - Copy(mem, signal, 2 * NB_COEF_DOWN); - - Copy(sig16k, signal + (2 * NB_COEF_DOWN), lg); - - lg_down = (lg * DOWN_FAC)>>15; - - Down_samp(signal + NB_COEF_DOWN, sig12k8, lg_down); - - Copy(signal + lg, mem, 2 * NB_COEF_DOWN); - - return; -} - -static void Down_samp( - Word16 * sig, /* input: signal to downsampling */ - Word16 * sig_d, /* output: downsampled signal */ - Word16 L_frame_d /* input: length of output */ - ) -{ - Word32 i, j, frac, pos; - Word16 *x, *y; - Word32 L_sum; - - pos = 0; /* position is in Q2 -> 1/4 resolution */ - for (j = 0; j < L_frame_d; j++) - { - i = (pos >> 2); /* integer part */ - frac = pos & 3; /* fractional part */ - x = sig + i - NB_COEF_DOWN + 1; - y = (Word16 *)(fir_down1 + frac); - - L_sum = vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x++),(*y++)); - L_sum += vo_mult32((*x),(*y)); - - L_sum = L_shl2(L_sum, 2); - sig_d[j] = extract_h(L_add(L_sum, 0x8000)); - pos += FAC5; /* pos + 5/4 */ - } - return; -} - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: decim54.c * +* * +* Description:Decimation of 16kHz signal to 12.8kHz * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "acelp.h" +#include "cnst.h" + +#define FAC5 5 +#define DOWN_FAC 26215 /* 4/5 in Q15 */ + +#define NB_COEF_DOWN 15 + +/* Local functions */ +static void Down_samp( + Word16 * sig, /* input: signal to downsampling */ + Word16 * sig_d, /* output: downsampled signal */ + Word16 L_frame_d /* input: length of output */ + ); + +/* 1/5 resolution interpolation filter (in Q14) */ +/* -1.5dB @ 6kHz, -6dB @ 6.4kHz, -10dB @ 6.6kHz, -20dB @ 6.9kHz, -25dB @ 7kHz, -55dB @ 8kHz */ + +static Word16 fir_down1[4][30] = +{ + {-5, 24, -50, 54, 0, -128, 294, -408, 344, 0, -647, 1505, -2379, 3034, 13107, 3034, -2379, 1505, -647, 0, 344, -408, + 294, -128, 0, 54, -50, 24, -5, 0}, + + {-6, 19, -26, 0, 77, -188, 270, -233, 0, 434, -964, 1366, -1293, 0, 12254, 6575, -2746, 1030, 0, -507, 601, -441, + 198, 0, -95, 99, -58, 18, 0, -1}, + + {-3, 9, 0, -41, 111, -170, 153, 0, -295, 649, -888, 770, 0, -1997, 9894, 9894, -1997, 0, 770, -888, 649, -295, 0, + 153, -170, 111, -41, 0, 9, -3}, + + {-1, 0, 18, -58, 99, -95, 0, 198, -441, 601, -507, 0, 1030, -2746, 6575, 12254, 0, -1293, 1366, -964, 434, 0, + -233, 270, -188, 77, 0, -26, 19, -6} +}; + +void Init_Decim_12k8( + Word16 mem[] /* output: memory (2*NB_COEF_DOWN) set to zeros */ + ) +{ + Set_zero(mem, 2 * NB_COEF_DOWN); + return; +} + +void Decim_12k8( + Word16 sig16k[], /* input: signal to downsampling */ + Word16 lg, /* input: length of input */ + Word16 sig12k8[], /* output: decimated signal */ + Word16 mem[] /* in/out: memory (2*NB_COEF_DOWN) */ + ) +{ + Word16 lg_down; + Word16 signal[L_FRAME16k + (2 * NB_COEF_DOWN)]; + + Copy(mem, signal, 2 * NB_COEF_DOWN); + + Copy(sig16k, signal + (2 * NB_COEF_DOWN), lg); + + lg_down = (lg * DOWN_FAC)>>15; + + Down_samp(signal + NB_COEF_DOWN, sig12k8, lg_down); + + Copy(signal + lg, mem, 2 * NB_COEF_DOWN); + + return; +} + +static void Down_samp( + Word16 * sig, /* input: signal to downsampling */ + Word16 * sig_d, /* output: downsampled signal */ + Word16 L_frame_d /* input: length of output */ + ) +{ + Word32 i, j, frac, pos; + Word16 *x, *y; + Word32 L_sum; + + pos = 0; /* position is in Q2 -> 1/4 resolution */ + for (j = 0; j < L_frame_d; j++) + { + i = (pos >> 2); /* integer part */ + frac = pos & 3; /* fractional part */ + x = sig + i - NB_COEF_DOWN + 1; + y = (Word16 *)(fir_down1 + frac); + + L_sum = vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x++),(*y++)); + L_sum += vo_mult32((*x),(*y)); + + L_sum = L_shl2(L_sum, 2); + sig_d[j] = extract_h(L_add(L_sum, 0x8000)); + pos += FAC5; /* pos + 5/4 */ + } + return; +} + + diff --git a/media/libstagefright/codecs/amrwbenc/src/deemph.c b/media/libstagefright/codecs/amrwbenc/src/deemph.c index 6ad528d..4ee1449 100644 --- a/media/libstagefright/codecs/amrwbenc/src/deemph.c +++ b/media/libstagefright/codecs/amrwbenc/src/deemph.c @@ -1,117 +1,117 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: deemph.c * -* * -* Description:filtering through 1/(1-mu z^ -1) * -* Deemph2 --> signal is divided by 2 * -* Deemph_32 --> for 32 bits signal. * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "math_op.h" - -void Deemph( - Word16 x[], /* (i/o) : input signal overwritten by the output */ - Word16 mu, /* (i) Q15 : deemphasis factor */ - Word16 L, /* (i) : vector size */ - Word16 * mem /* (i/o) : memory (y[-1]) */ - ) -{ - Word32 i; - Word32 L_tmp; - - L_tmp = L_deposit_h(x[0]); - L_tmp = L_mac(L_tmp, *mem, mu); - x[0] = vo_round(L_tmp); - - for (i = 1; i < L; i++) - { - L_tmp = L_deposit_h(x[i]); - L_tmp = L_mac(L_tmp, x[i - 1], mu); - x[i] = voround(L_tmp); - } - - *mem = x[L - 1]; - - return; -} - - -void Deemph2( - Word16 x[], /* (i/o) : input signal overwritten by the output */ - Word16 mu, /* (i) Q15 : deemphasis factor */ - Word16 L, /* (i) : vector size */ - Word16 * mem /* (i/o) : memory (y[-1]) */ - ) -{ - Word32 i; - Word32 L_tmp; - L_tmp = x[0] << 15; - L_tmp += ((*mem) * mu)<<1; - x[0] = (L_tmp + 0x8000)>>16; - for (i = 1; i < L; i++) - { - L_tmp = x[i] << 15; - L_tmp += (x[i - 1] * mu)<<1; - x[i] = (L_tmp + 0x8000)>>16; - } - *mem = x[L - 1]; - return; -} - - -void Deemph_32( - Word16 x_hi[], /* (i) : input signal (bit31..16) */ - Word16 x_lo[], /* (i) : input signal (bit15..4) */ - Word16 y[], /* (o) : output signal (x16) */ - Word16 mu, /* (i) Q15 : deemphasis factor */ - Word16 L, /* (i) : vector size */ - Word16 * mem /* (i/o) : memory (y[-1]) */ - ) -{ - Word16 fac; - Word32 i, L_tmp; - - fac = mu >> 1; /* Q15 --> Q14 */ - - L_tmp = L_deposit_h(x_hi[0]); - L_tmp += (x_lo[0] * 8)<<1; - L_tmp = (L_tmp << 3); - L_tmp += ((*mem) * fac)<<1; - L_tmp = (L_tmp << 1); - y[0] = (L_tmp + 0x8000)>>16; - - for (i = 1; i < L; i++) - { - L_tmp = L_deposit_h(x_hi[i]); - L_tmp += (x_lo[i] * 8)<<1; - L_tmp = (L_tmp << 3); - L_tmp += (y[i - 1] * fac)<<1; - L_tmp = (L_tmp << 1); - y[i] = (L_tmp + 0x8000)>>16; - } - - *mem = y[L - 1]; - - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: deemph.c * +* * +* Description:filtering through 1/(1-mu z^ -1) * +* Deemph2 --> signal is divided by 2 * +* Deemph_32 --> for 32 bits signal. * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "math_op.h" + +void Deemph( + Word16 x[], /* (i/o) : input signal overwritten by the output */ + Word16 mu, /* (i) Q15 : deemphasis factor */ + Word16 L, /* (i) : vector size */ + Word16 * mem /* (i/o) : memory (y[-1]) */ + ) +{ + Word32 i; + Word32 L_tmp; + + L_tmp = L_deposit_h(x[0]); + L_tmp = L_mac(L_tmp, *mem, mu); + x[0] = vo_round(L_tmp); + + for (i = 1; i < L; i++) + { + L_tmp = L_deposit_h(x[i]); + L_tmp = L_mac(L_tmp, x[i - 1], mu); + x[i] = voround(L_tmp); + } + + *mem = x[L - 1]; + + return; +} + + +void Deemph2( + Word16 x[], /* (i/o) : input signal overwritten by the output */ + Word16 mu, /* (i) Q15 : deemphasis factor */ + Word16 L, /* (i) : vector size */ + Word16 * mem /* (i/o) : memory (y[-1]) */ + ) +{ + Word32 i; + Word32 L_tmp; + L_tmp = x[0] << 15; + L_tmp += ((*mem) * mu)<<1; + x[0] = (L_tmp + 0x8000)>>16; + for (i = 1; i < L; i++) + { + L_tmp = x[i] << 15; + L_tmp += (x[i - 1] * mu)<<1; + x[i] = (L_tmp + 0x8000)>>16; + } + *mem = x[L - 1]; + return; +} + + +void Deemph_32( + Word16 x_hi[], /* (i) : input signal (bit31..16) */ + Word16 x_lo[], /* (i) : input signal (bit15..4) */ + Word16 y[], /* (o) : output signal (x16) */ + Word16 mu, /* (i) Q15 : deemphasis factor */ + Word16 L, /* (i) : vector size */ + Word16 * mem /* (i/o) : memory (y[-1]) */ + ) +{ + Word16 fac; + Word32 i, L_tmp; + + fac = mu >> 1; /* Q15 --> Q14 */ + + L_tmp = L_deposit_h(x_hi[0]); + L_tmp += (x_lo[0] * 8)<<1; + L_tmp = (L_tmp << 3); + L_tmp += ((*mem) * fac)<<1; + L_tmp = (L_tmp << 1); + y[0] = (L_tmp + 0x8000)>>16; + + for (i = 1; i < L; i++) + { + L_tmp = L_deposit_h(x_hi[i]); + L_tmp += (x_lo[i] * 8)<<1; + L_tmp = (L_tmp << 3); + L_tmp += (y[i - 1] * fac)<<1; + L_tmp = (L_tmp << 1); + y[i] = (L_tmp + 0x8000)>>16; + } + + *mem = y[L - 1]; + + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/dtx.c b/media/libstagefright/codecs/amrwbenc/src/dtx.c index 02921eb..df53131 100644 --- a/media/libstagefright/codecs/amrwbenc/src/dtx.c +++ b/media/libstagefright/codecs/amrwbenc/src/dtx.c @@ -1,605 +1,605 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: dtx.c * -* * -* Description:DTX functions * -* * -************************************************************************/ - -#include -#include -#include "typedef.h" -#include "basic_op.h" -#include "oper_32b.h" -#include "math_op.h" -#include "cnst.h" -#include "acelp.h" /* prototype of functions */ -#include "bits.h" -#include "dtx.h" -#include "log2.h" -#include "mem_align.h" - -static void aver_isf_history( - Word16 isf_old[], - Word16 indices[], - Word32 isf_aver[] - ); - -static void find_frame_indices( - Word16 isf_old_tx[], - Word16 indices[], - dtx_encState * st - ); - -static Word16 dithering_control( - dtx_encState * st - ); - -/* excitation energy adjustment depending on speech coder mode used, Q7 */ -static Word16 en_adjust[9] = -{ - 230, /* mode0 = 7k : -5.4dB */ - 179, /* mode1 = 9k : -4.2dB */ - 141, /* mode2 = 12k : -3.3dB */ - 128, /* mode3 = 14k : -3.0dB */ - 122, /* mode4 = 16k : -2.85dB */ - 115, /* mode5 = 18k : -2.7dB */ - 115, /* mode6 = 20k : -2.7dB */ - 115, /* mode7 = 23k : -2.7dB */ - 115 /* mode8 = 24k : -2.7dB */ -}; - -/************************************************************************** -* -* Function : dtx_enc_init -* -**************************************************************************/ -Word16 dtx_enc_init(dtx_encState ** st, Word16 isf_init[], VO_MEM_OPERATOR *pMemOP) -{ - dtx_encState *s; - - if (st == (dtx_encState **) NULL) - { - fprintf(stderr, "dtx_enc_init: invalid parameter\n"); - return -1; - } - *st = NULL; - - /* allocate memory */ - if ((s = (dtx_encState *)mem_malloc(pMemOP, sizeof(dtx_encState), 32, VO_INDEX_ENC_AMRWB)) == NULL) - { - fprintf(stderr, "dtx_enc_init: can not malloc state structure\n"); - return -1; - } - dtx_enc_reset(s, isf_init); - *st = s; - return 0; -} - -/************************************************************************** -* -* Function : dtx_enc_reset -* -**************************************************************************/ -Word16 dtx_enc_reset(dtx_encState * st, Word16 isf_init[]) -{ - Word32 i; - - if (st == (dtx_encState *) NULL) - { - fprintf(stderr, "dtx_enc_reset: invalid parameter\n"); - return -1; - } - st->hist_ptr = 0; - st->log_en_index = 0; - - /* Init isf_hist[] */ - for (i = 0; i < DTX_HIST_SIZE; i++) - { - Copy(isf_init, &st->isf_hist[i * M], M); - } - st->cng_seed = RANDOM_INITSEED; - - /* Reset energy history */ - Set_zero(st->log_en_hist, DTX_HIST_SIZE); - - st->dtxHangoverCount = DTX_HANG_CONST; - st->decAnaElapsedCount = 32767; - - for (i = 0; i < 28; i++) - { - st->D[i] = 0; - } - - for (i = 0; i < DTX_HIST_SIZE - 1; i++) - { - st->sumD[i] = 0; - } - - return 1; -} - -/************************************************************************** -* -* Function : dtx_enc_exit -* -**************************************************************************/ -void dtx_enc_exit(dtx_encState ** st, VO_MEM_OPERATOR *pMemOP) -{ - if (st == NULL || *st == NULL) - return; - /* deallocate memory */ - mem_free(pMemOP, *st, VO_INDEX_ENC_AMRWB); - *st = NULL; - return; -} - - -/************************************************************************** -* -* Function : dtx_enc -* -**************************************************************************/ -Word16 dtx_enc( - dtx_encState * st, /* i/o : State struct */ - Word16 isf[M], /* o : CN ISF vector */ - Word16 * exc2, /* o : CN excitation */ - Word16 ** prms - ) -{ - Word32 i, j; - Word16 indice[7]; - Word16 log_en, gain, level, exp, exp0, tmp; - Word16 log_en_int_e, log_en_int_m; - Word32 L_isf[M], ener32, level32; - Word16 isf_order[3]; - Word16 CN_dith; - - /* VOX mode computation of SID parameters */ - log_en = 0; - for (i = 0; i < M; i++) - { - L_isf[i] = 0; - } - /* average energy and isf */ - for (i = 0; i < DTX_HIST_SIZE; i++) - { - /* Division by DTX_HIST_SIZE = 8 has been done in dtx_buffer. log_en is in Q10 */ - log_en = add(log_en, st->log_en_hist[i]); - - } - find_frame_indices(st->isf_hist, isf_order, st); - aver_isf_history(st->isf_hist, isf_order, L_isf); - - for (j = 0; j < M; j++) - { - isf[j] = (Word16)(L_isf[j] >> 3); /* divide by 8 */ - } - - /* quantize logarithmic energy to 6 bits (-6 : 66 dB) which corresponds to -2:22 in log2(E). */ - /* st->log_en_index = (short)( (log_en + 2.0) * 2.625 ); */ - - /* increase dynamics to 7 bits (Q8) */ - log_en = (log_en >> 2); - - /* Add 2 in Q8 = 512 to get log2(E) between 0:24 */ - log_en = add(log_en, 512); - - /* Multiply by 2.625 to get full 6 bit range. 2.625 = 21504 in Q13. The result is in Q6 */ - log_en = mult(log_en, 21504); - - /* Quantize Energy */ - st->log_en_index = shr(log_en, 6); - - if(st->log_en_index > 63) - { - st->log_en_index = 63; - } - if (st->log_en_index < 0) - { - st->log_en_index = 0; - } - /* Quantize ISFs */ - Qisf_ns(isf, isf, indice); - - - Parm_serial(indice[0], 6, prms); - Parm_serial(indice[1], 6, prms); - Parm_serial(indice[2], 6, prms); - Parm_serial(indice[3], 5, prms); - Parm_serial(indice[4], 5, prms); - - Parm_serial((st->log_en_index), 6, prms); - - CN_dith = dithering_control(st); - Parm_serial(CN_dith, 1, prms); - - /* level = (float)( pow( 2.0f, (float)st->log_en_index / 2.625 - 2.0 ) ); */ - /* log2(E) in Q9 (log2(E) lies in between -2:22) */ - log_en = shl(st->log_en_index, 15 - 6); - - /* Divide by 2.625; log_en will be between 0:24 */ - log_en = mult(log_en, 12483); - /* the result corresponds to log2(gain) in Q10 */ - - /* Find integer part */ - log_en_int_e = (log_en >> 10); - - /* Find fractional part */ - log_en_int_m = (Word16) (log_en & 0x3ff); - log_en_int_m = shl(log_en_int_m, 5); - - /* Subtract 2 from log_en in Q9, i.e divide the gain by 2 (energy by 4) */ - /* Add 16 in order to have the result of pow2 in Q16 */ - log_en_int_e = add(log_en_int_e, 16 - 1); - - level32 = Pow2(log_en_int_e, log_en_int_m); /* Q16 */ - exp0 = norm_l(level32); - level32 = (level32 << exp0); /* level in Q31 */ - exp0 = (15 - exp0); - level = extract_h(level32); /* level in Q15 */ - - /* generate white noise vector */ - for (i = 0; i < L_FRAME; i++) - { - exc2[i] = (Random(&(st->cng_seed)) >> 4); - } - - /* gain = level / sqrt(ener) * sqrt(L_FRAME) */ - - /* energy of generated excitation */ - ener32 = Dot_product12(exc2, exc2, L_FRAME, &exp); - - Isqrt_n(&ener32, &exp); - - gain = extract_h(ener32); - - gain = mult(level, gain); /* gain in Q15 */ - - exp = add(exp0, exp); - - /* Multiply by sqrt(L_FRAME)=16, i.e. shift left by 4 */ - exp += 4; - - for (i = 0; i < L_FRAME; i++) - { - tmp = mult(exc2[i], gain); /* Q0 * Q15 */ - exc2[i] = shl(tmp, exp); - } - - return 0; -} - -/************************************************************************** -* -* Function : dtx_buffer Purpose : handles the DTX buffer -* -**************************************************************************/ -Word16 dtx_buffer( - dtx_encState * st, /* i/o : State struct */ - Word16 isf_new[], /* i : isf vector */ - Word32 enr, /* i : residual energy (in L_FRAME) */ - Word16 codec_mode - ) -{ - Word16 log_en; - - Word16 log_en_e; - Word16 log_en_m; - st->hist_ptr = add(st->hist_ptr, 1); - if(st->hist_ptr == DTX_HIST_SIZE) - { - st->hist_ptr = 0; - } - /* copy lsp vector into buffer */ - Copy(isf_new, &st->isf_hist[st->hist_ptr * M], M); - - /* log_en = (float)log10(enr*0.0059322)/(float)log10(2.0f); */ - Log2(enr, &log_en_e, &log_en_m); - - /* convert exponent and mantissa to Word16 Q7. Q7 is used to simplify averaging in dtx_enc */ - log_en = shl(log_en_e, 7); /* Q7 */ - log_en = add(log_en, shr(log_en_m, 15 - 7)); - - /* Find energy per sample by multiplying with 0.0059322, i.e subtract log2(1/0.0059322) = 7.39722 The - * constant 0.0059322 takes into account windowings and analysis length from autocorrelation - * computations; 7.39722 in Q7 = 947 */ - /* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */ - /* log_en = sub( log_en, 947 + en_adjust[codec_mode] ); */ - - /* Find energy per sample (divide by L_FRAME=256), i.e subtract log2(256) = 8.0 (1024 in Q7) */ - /* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */ - - log_en = sub(log_en, add(1024, en_adjust[codec_mode])); - - /* Insert into the buffer */ - st->log_en_hist[st->hist_ptr] = log_en; - return 0; -} - -/************************************************************************** -* -* Function : tx_dtx_handler Purpose : adds extra speech hangover -* to analyze speech on -* the decoding side. -**************************************************************************/ -void tx_dtx_handler(dtx_encState * st, /* i/o : State struct */ - Word16 vad_flag, /* i : vad decision */ - Word16 * usedMode /* i/o : mode changed or not */ - ) -{ - - /* this state machine is in synch with the GSMEFR txDtx machine */ - st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1); - - if (vad_flag != 0) - { - st->dtxHangoverCount = DTX_HANG_CONST; - } else - { /* non-speech */ - if (st->dtxHangoverCount == 0) - { /* out of decoder analysis hangover */ - st->decAnaElapsedCount = 0; - *usedMode = MRDTX; - } else - { /* in possible analysis hangover */ - st->dtxHangoverCount = sub(st->dtxHangoverCount, 1); - - /* decAnaElapsedCount + dtxHangoverCount < DTX_ELAPSED_FRAMES_THRESH */ - if (sub(add(st->decAnaElapsedCount, st->dtxHangoverCount), - DTX_ELAPSED_FRAMES_THRESH) < 0) - { - *usedMode = MRDTX; - /* if short time since decoder update, do not add extra HO */ - } - /* else override VAD and stay in speech mode *usedMode and add extra hangover */ - } - } - - return; -} - - - -static void aver_isf_history( - Word16 isf_old[], - Word16 indices[], - Word32 isf_aver[] - ) -{ - Word32 i, j, k; - Word16 isf_tmp[2 * M]; - Word32 L_tmp; - - /* Memorize in isf_tmp[][] the ISF vectors to be replaced by */ - /* the median ISF vector prior to the averaging */ - for (k = 0; k < 2; k++) - { - if ((indices[k] + 1) != 0) - { - for (i = 0; i < M; i++) - { - isf_tmp[k * M + i] = isf_old[indices[k] * M + i]; - isf_old[indices[k] * M + i] = isf_old[indices[2] * M + i]; - } - } - } - - /* Perform the ISF averaging */ - for (j = 0; j < M; j++) - { - L_tmp = 0; - - for (i = 0; i < DTX_HIST_SIZE; i++) - { - L_tmp = L_add(L_tmp, L_deposit_l(isf_old[i * M + j])); - } - isf_aver[j] = L_tmp; - } - - /* Retrieve from isf_tmp[][] the ISF vectors saved prior to averaging */ - for (k = 0; k < 2; k++) - { - if ((indices[k] + 1) != 0) - { - for (i = 0; i < M; i++) - { - isf_old[indices[k] * M + i] = isf_tmp[k * M + i]; - } - } - } - - return; -} - -static void find_frame_indices( - Word16 isf_old_tx[], - Word16 indices[], - dtx_encState * st - ) -{ - Word32 L_tmp, summin, summax, summax2nd; - Word16 i, j, tmp; - Word16 ptr; - - /* Remove the effect of the oldest frame from the column */ - /* sum sumD[0..DTX_HIST_SIZE-1]. sumD[DTX_HIST_SIZE] is */ - /* not updated since it will be removed later. */ - - tmp = DTX_HIST_SIZE_MIN_ONE; - j = -1; - for (i = 0; i < DTX_HIST_SIZE_MIN_ONE; i++) - { - j = add(j, tmp); - st->sumD[i] = L_sub(st->sumD[i], st->D[j]); - tmp = sub(tmp, 1); - } - - /* Shift the column sum sumD. The element sumD[DTX_HIST_SIZE-1] */ - /* corresponding to the oldest frame is removed. The sum of */ - /* the distances between the latest isf and other isfs, */ - /* i.e. the element sumD[0], will be computed during this call. */ - /* Hence this element is initialized to zero. */ - - for (i = DTX_HIST_SIZE_MIN_ONE; i > 0; i--) - { - st->sumD[i] = st->sumD[i - 1]; - } - st->sumD[0] = 0; - - /* Remove the oldest frame from the distance matrix. */ - /* Note that the distance matrix is replaced by a one- */ - /* dimensional array to save static memory. */ - - tmp = 0; - for (i = 27; i >= 12; i = (Word16) (i - tmp)) - { - tmp = add(tmp, 1); - for (j = tmp; j > 0; j--) - { - st->D[i - j + 1] = st->D[i - j - tmp]; - } - } - - /* Compute the first column of the distance matrix D */ - /* (squared Euclidean distances from isf1[] to isf_old_tx[][]). */ - - ptr = st->hist_ptr; - for (i = 1; i < DTX_HIST_SIZE; i++) - { - /* Compute the distance between the latest isf and the other isfs. */ - ptr = sub(ptr, 1); - if (ptr < 0) - { - ptr = DTX_HIST_SIZE_MIN_ONE; - } - L_tmp = 0; - for (j = 0; j < M; j++) - { - tmp = sub(isf_old_tx[st->hist_ptr * M + j], isf_old_tx[ptr * M + j]); - L_tmp = L_mac(L_tmp, tmp, tmp); - } - st->D[i - 1] = L_tmp; - - /* Update also the column sums. */ - st->sumD[0] = L_add(st->sumD[0], st->D[i - 1]); - st->sumD[i] = L_add(st->sumD[i], st->D[i - 1]); - } - - /* Find the minimum and maximum distances */ - summax = st->sumD[0]; - summin = st->sumD[0]; - indices[0] = 0; - indices[2] = 0; - for (i = 1; i < DTX_HIST_SIZE; i++) - { - if (L_sub(st->sumD[i], summax) > 0) - { - indices[0] = i; - summax = st->sumD[i]; - } - if (L_sub(st->sumD[i], summin) < 0) - { - indices[2] = i; - summin = st->sumD[i]; - } - } - - /* Find the second largest distance */ - summax2nd = -2147483647L; - indices[1] = -1; - for (i = 0; i < DTX_HIST_SIZE; i++) - { - if ((L_sub(st->sumD[i], summax2nd) > 0) && (sub(i, indices[0]) != 0)) - { - indices[1] = i; - summax2nd = st->sumD[i]; - } - } - - for (i = 0; i < 3; i++) - { - indices[i] = sub(st->hist_ptr, indices[i]); - if (indices[i] < 0) - { - indices[i] = add(indices[i], DTX_HIST_SIZE); - } - } - - /* If maximum distance/MED_THRESH is smaller than minimum distance */ - /* then the median ISF vector replacement is not performed */ - tmp = norm_l(summax); - summax = (summax << tmp); - summin = (summin << tmp); - L_tmp = L_mult(voround(summax), INV_MED_THRESH); - if(L_tmp <= summin) - { - indices[0] = -1; - } - /* If second largest distance/MED_THRESH is smaller than */ - /* minimum distance then the median ISF vector replacement is */ - /* not performed */ - summax2nd = L_shl(summax2nd, tmp); - L_tmp = L_mult(voround(summax2nd), INV_MED_THRESH); - if(L_tmp <= summin) - { - indices[1] = -1; - } - return; -} - -static Word16 dithering_control( - dtx_encState * st - ) -{ - Word16 tmp, mean, CN_dith, gain_diff; - Word32 i, ISF_diff; - - /* determine how stationary the spectrum of background noise is */ - ISF_diff = 0; - for (i = 0; i < 8; i++) - { - ISF_diff = L_add(ISF_diff, st->sumD[i]); - } - if ((ISF_diff >> 26) > 0) - { - CN_dith = 1; - } else - { - CN_dith = 0; - } - - /* determine how stationary the energy of background noise is */ - mean = 0; - for (i = 0; i < DTX_HIST_SIZE; i++) - { - mean = add(mean, st->log_en_hist[i]); - } - mean = (mean >> 3); - gain_diff = 0; - for (i = 0; i < DTX_HIST_SIZE; i++) - { - tmp = abs_s(sub(st->log_en_hist[i], mean)); - gain_diff = add(gain_diff, tmp); - } - if (gain_diff > GAIN_THR) - { - CN_dith = 1; - } - return CN_dith; -} +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: dtx.c * +* * +* Description:DTX functions * +* * +************************************************************************/ + +#include +#include +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "math_op.h" +#include "cnst.h" +#include "acelp.h" /* prototype of functions */ +#include "bits.h" +#include "dtx.h" +#include "log2.h" +#include "mem_align.h" + +static void aver_isf_history( + Word16 isf_old[], + Word16 indices[], + Word32 isf_aver[] + ); + +static void find_frame_indices( + Word16 isf_old_tx[], + Word16 indices[], + dtx_encState * st + ); + +static Word16 dithering_control( + dtx_encState * st + ); + +/* excitation energy adjustment depending on speech coder mode used, Q7 */ +static Word16 en_adjust[9] = +{ + 230, /* mode0 = 7k : -5.4dB */ + 179, /* mode1 = 9k : -4.2dB */ + 141, /* mode2 = 12k : -3.3dB */ + 128, /* mode3 = 14k : -3.0dB */ + 122, /* mode4 = 16k : -2.85dB */ + 115, /* mode5 = 18k : -2.7dB */ + 115, /* mode6 = 20k : -2.7dB */ + 115, /* mode7 = 23k : -2.7dB */ + 115 /* mode8 = 24k : -2.7dB */ +}; + +/************************************************************************** +* +* Function : dtx_enc_init +* +**************************************************************************/ +Word16 dtx_enc_init(dtx_encState ** st, Word16 isf_init[], VO_MEM_OPERATOR *pMemOP) +{ + dtx_encState *s; + + if (st == (dtx_encState **) NULL) + { + fprintf(stderr, "dtx_enc_init: invalid parameter\n"); + return -1; + } + *st = NULL; + + /* allocate memory */ + if ((s = (dtx_encState *)mem_malloc(pMemOP, sizeof(dtx_encState), 32, VO_INDEX_ENC_AMRWB)) == NULL) + { + fprintf(stderr, "dtx_enc_init: can not malloc state structure\n"); + return -1; + } + dtx_enc_reset(s, isf_init); + *st = s; + return 0; +} + +/************************************************************************** +* +* Function : dtx_enc_reset +* +**************************************************************************/ +Word16 dtx_enc_reset(dtx_encState * st, Word16 isf_init[]) +{ + Word32 i; + + if (st == (dtx_encState *) NULL) + { + fprintf(stderr, "dtx_enc_reset: invalid parameter\n"); + return -1; + } + st->hist_ptr = 0; + st->log_en_index = 0; + + /* Init isf_hist[] */ + for (i = 0; i < DTX_HIST_SIZE; i++) + { + Copy(isf_init, &st->isf_hist[i * M], M); + } + st->cng_seed = RANDOM_INITSEED; + + /* Reset energy history */ + Set_zero(st->log_en_hist, DTX_HIST_SIZE); + + st->dtxHangoverCount = DTX_HANG_CONST; + st->decAnaElapsedCount = 32767; + + for (i = 0; i < 28; i++) + { + st->D[i] = 0; + } + + for (i = 0; i < DTX_HIST_SIZE - 1; i++) + { + st->sumD[i] = 0; + } + + return 1; +} + +/************************************************************************** +* +* Function : dtx_enc_exit +* +**************************************************************************/ +void dtx_enc_exit(dtx_encState ** st, VO_MEM_OPERATOR *pMemOP) +{ + if (st == NULL || *st == NULL) + return; + /* deallocate memory */ + mem_free(pMemOP, *st, VO_INDEX_ENC_AMRWB); + *st = NULL; + return; +} + + +/************************************************************************** +* +* Function : dtx_enc +* +**************************************************************************/ +Word16 dtx_enc( + dtx_encState * st, /* i/o : State struct */ + Word16 isf[M], /* o : CN ISF vector */ + Word16 * exc2, /* o : CN excitation */ + Word16 ** prms + ) +{ + Word32 i, j; + Word16 indice[7]; + Word16 log_en, gain, level, exp, exp0, tmp; + Word16 log_en_int_e, log_en_int_m; + Word32 L_isf[M], ener32, level32; + Word16 isf_order[3]; + Word16 CN_dith; + + /* VOX mode computation of SID parameters */ + log_en = 0; + for (i = 0; i < M; i++) + { + L_isf[i] = 0; + } + /* average energy and isf */ + for (i = 0; i < DTX_HIST_SIZE; i++) + { + /* Division by DTX_HIST_SIZE = 8 has been done in dtx_buffer. log_en is in Q10 */ + log_en = add(log_en, st->log_en_hist[i]); + + } + find_frame_indices(st->isf_hist, isf_order, st); + aver_isf_history(st->isf_hist, isf_order, L_isf); + + for (j = 0; j < M; j++) + { + isf[j] = (Word16)(L_isf[j] >> 3); /* divide by 8 */ + } + + /* quantize logarithmic energy to 6 bits (-6 : 66 dB) which corresponds to -2:22 in log2(E). */ + /* st->log_en_index = (short)( (log_en + 2.0) * 2.625 ); */ + + /* increase dynamics to 7 bits (Q8) */ + log_en = (log_en >> 2); + + /* Add 2 in Q8 = 512 to get log2(E) between 0:24 */ + log_en = add(log_en, 512); + + /* Multiply by 2.625 to get full 6 bit range. 2.625 = 21504 in Q13. The result is in Q6 */ + log_en = mult(log_en, 21504); + + /* Quantize Energy */ + st->log_en_index = shr(log_en, 6); + + if(st->log_en_index > 63) + { + st->log_en_index = 63; + } + if (st->log_en_index < 0) + { + st->log_en_index = 0; + } + /* Quantize ISFs */ + Qisf_ns(isf, isf, indice); + + + Parm_serial(indice[0], 6, prms); + Parm_serial(indice[1], 6, prms); + Parm_serial(indice[2], 6, prms); + Parm_serial(indice[3], 5, prms); + Parm_serial(indice[4], 5, prms); + + Parm_serial((st->log_en_index), 6, prms); + + CN_dith = dithering_control(st); + Parm_serial(CN_dith, 1, prms); + + /* level = (float)( pow( 2.0f, (float)st->log_en_index / 2.625 - 2.0 ) ); */ + /* log2(E) in Q9 (log2(E) lies in between -2:22) */ + log_en = shl(st->log_en_index, 15 - 6); + + /* Divide by 2.625; log_en will be between 0:24 */ + log_en = mult(log_en, 12483); + /* the result corresponds to log2(gain) in Q10 */ + + /* Find integer part */ + log_en_int_e = (log_en >> 10); + + /* Find fractional part */ + log_en_int_m = (Word16) (log_en & 0x3ff); + log_en_int_m = shl(log_en_int_m, 5); + + /* Subtract 2 from log_en in Q9, i.e divide the gain by 2 (energy by 4) */ + /* Add 16 in order to have the result of pow2 in Q16 */ + log_en_int_e = add(log_en_int_e, 16 - 1); + + level32 = Pow2(log_en_int_e, log_en_int_m); /* Q16 */ + exp0 = norm_l(level32); + level32 = (level32 << exp0); /* level in Q31 */ + exp0 = (15 - exp0); + level = extract_h(level32); /* level in Q15 */ + + /* generate white noise vector */ + for (i = 0; i < L_FRAME; i++) + { + exc2[i] = (Random(&(st->cng_seed)) >> 4); + } + + /* gain = level / sqrt(ener) * sqrt(L_FRAME) */ + + /* energy of generated excitation */ + ener32 = Dot_product12(exc2, exc2, L_FRAME, &exp); + + Isqrt_n(&ener32, &exp); + + gain = extract_h(ener32); + + gain = mult(level, gain); /* gain in Q15 */ + + exp = add(exp0, exp); + + /* Multiply by sqrt(L_FRAME)=16, i.e. shift left by 4 */ + exp += 4; + + for (i = 0; i < L_FRAME; i++) + { + tmp = mult(exc2[i], gain); /* Q0 * Q15 */ + exc2[i] = shl(tmp, exp); + } + + return 0; +} + +/************************************************************************** +* +* Function : dtx_buffer Purpose : handles the DTX buffer +* +**************************************************************************/ +Word16 dtx_buffer( + dtx_encState * st, /* i/o : State struct */ + Word16 isf_new[], /* i : isf vector */ + Word32 enr, /* i : residual energy (in L_FRAME) */ + Word16 codec_mode + ) +{ + Word16 log_en; + + Word16 log_en_e; + Word16 log_en_m; + st->hist_ptr = add(st->hist_ptr, 1); + if(st->hist_ptr == DTX_HIST_SIZE) + { + st->hist_ptr = 0; + } + /* copy lsp vector into buffer */ + Copy(isf_new, &st->isf_hist[st->hist_ptr * M], M); + + /* log_en = (float)log10(enr*0.0059322)/(float)log10(2.0f); */ + Log2(enr, &log_en_e, &log_en_m); + + /* convert exponent and mantissa to Word16 Q7. Q7 is used to simplify averaging in dtx_enc */ + log_en = shl(log_en_e, 7); /* Q7 */ + log_en = add(log_en, shr(log_en_m, 15 - 7)); + + /* Find energy per sample by multiplying with 0.0059322, i.e subtract log2(1/0.0059322) = 7.39722 The + * constant 0.0059322 takes into account windowings and analysis length from autocorrelation + * computations; 7.39722 in Q7 = 947 */ + /* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */ + /* log_en = sub( log_en, 947 + en_adjust[codec_mode] ); */ + + /* Find energy per sample (divide by L_FRAME=256), i.e subtract log2(256) = 8.0 (1024 in Q7) */ + /* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */ + + log_en = sub(log_en, add(1024, en_adjust[codec_mode])); + + /* Insert into the buffer */ + st->log_en_hist[st->hist_ptr] = log_en; + return 0; +} + +/************************************************************************** +* +* Function : tx_dtx_handler Purpose : adds extra speech hangover +* to analyze speech on +* the decoding side. +**************************************************************************/ +void tx_dtx_handler(dtx_encState * st, /* i/o : State struct */ + Word16 vad_flag, /* i : vad decision */ + Word16 * usedMode /* i/o : mode changed or not */ + ) +{ + + /* this state machine is in synch with the GSMEFR txDtx machine */ + st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1); + + if (vad_flag != 0) + { + st->dtxHangoverCount = DTX_HANG_CONST; + } else + { /* non-speech */ + if (st->dtxHangoverCount == 0) + { /* out of decoder analysis hangover */ + st->decAnaElapsedCount = 0; + *usedMode = MRDTX; + } else + { /* in possible analysis hangover */ + st->dtxHangoverCount = sub(st->dtxHangoverCount, 1); + + /* decAnaElapsedCount + dtxHangoverCount < DTX_ELAPSED_FRAMES_THRESH */ + if (sub(add(st->decAnaElapsedCount, st->dtxHangoverCount), + DTX_ELAPSED_FRAMES_THRESH) < 0) + { + *usedMode = MRDTX; + /* if short time since decoder update, do not add extra HO */ + } + /* else override VAD and stay in speech mode *usedMode and add extra hangover */ + } + } + + return; +} + + + +static void aver_isf_history( + Word16 isf_old[], + Word16 indices[], + Word32 isf_aver[] + ) +{ + Word32 i, j, k; + Word16 isf_tmp[2 * M]; + Word32 L_tmp; + + /* Memorize in isf_tmp[][] the ISF vectors to be replaced by */ + /* the median ISF vector prior to the averaging */ + for (k = 0; k < 2; k++) + { + if ((indices[k] + 1) != 0) + { + for (i = 0; i < M; i++) + { + isf_tmp[k * M + i] = isf_old[indices[k] * M + i]; + isf_old[indices[k] * M + i] = isf_old[indices[2] * M + i]; + } + } + } + + /* Perform the ISF averaging */ + for (j = 0; j < M; j++) + { + L_tmp = 0; + + for (i = 0; i < DTX_HIST_SIZE; i++) + { + L_tmp = L_add(L_tmp, L_deposit_l(isf_old[i * M + j])); + } + isf_aver[j] = L_tmp; + } + + /* Retrieve from isf_tmp[][] the ISF vectors saved prior to averaging */ + for (k = 0; k < 2; k++) + { + if ((indices[k] + 1) != 0) + { + for (i = 0; i < M; i++) + { + isf_old[indices[k] * M + i] = isf_tmp[k * M + i]; + } + } + } + + return; +} + +static void find_frame_indices( + Word16 isf_old_tx[], + Word16 indices[], + dtx_encState * st + ) +{ + Word32 L_tmp, summin, summax, summax2nd; + Word16 i, j, tmp; + Word16 ptr; + + /* Remove the effect of the oldest frame from the column */ + /* sum sumD[0..DTX_HIST_SIZE-1]. sumD[DTX_HIST_SIZE] is */ + /* not updated since it will be removed later. */ + + tmp = DTX_HIST_SIZE_MIN_ONE; + j = -1; + for (i = 0; i < DTX_HIST_SIZE_MIN_ONE; i++) + { + j = add(j, tmp); + st->sumD[i] = L_sub(st->sumD[i], st->D[j]); + tmp = sub(tmp, 1); + } + + /* Shift the column sum sumD. The element sumD[DTX_HIST_SIZE-1] */ + /* corresponding to the oldest frame is removed. The sum of */ + /* the distances between the latest isf and other isfs, */ + /* i.e. the element sumD[0], will be computed during this call. */ + /* Hence this element is initialized to zero. */ + + for (i = DTX_HIST_SIZE_MIN_ONE; i > 0; i--) + { + st->sumD[i] = st->sumD[i - 1]; + } + st->sumD[0] = 0; + + /* Remove the oldest frame from the distance matrix. */ + /* Note that the distance matrix is replaced by a one- */ + /* dimensional array to save static memory. */ + + tmp = 0; + for (i = 27; i >= 12; i = (Word16) (i - tmp)) + { + tmp = add(tmp, 1); + for (j = tmp; j > 0; j--) + { + st->D[i - j + 1] = st->D[i - j - tmp]; + } + } + + /* Compute the first column of the distance matrix D */ + /* (squared Euclidean distances from isf1[] to isf_old_tx[][]). */ + + ptr = st->hist_ptr; + for (i = 1; i < DTX_HIST_SIZE; i++) + { + /* Compute the distance between the latest isf and the other isfs. */ + ptr = sub(ptr, 1); + if (ptr < 0) + { + ptr = DTX_HIST_SIZE_MIN_ONE; + } + L_tmp = 0; + for (j = 0; j < M; j++) + { + tmp = sub(isf_old_tx[st->hist_ptr * M + j], isf_old_tx[ptr * M + j]); + L_tmp = L_mac(L_tmp, tmp, tmp); + } + st->D[i - 1] = L_tmp; + + /* Update also the column sums. */ + st->sumD[0] = L_add(st->sumD[0], st->D[i - 1]); + st->sumD[i] = L_add(st->sumD[i], st->D[i - 1]); + } + + /* Find the minimum and maximum distances */ + summax = st->sumD[0]; + summin = st->sumD[0]; + indices[0] = 0; + indices[2] = 0; + for (i = 1; i < DTX_HIST_SIZE; i++) + { + if (L_sub(st->sumD[i], summax) > 0) + { + indices[0] = i; + summax = st->sumD[i]; + } + if (L_sub(st->sumD[i], summin) < 0) + { + indices[2] = i; + summin = st->sumD[i]; + } + } + + /* Find the second largest distance */ + summax2nd = -2147483647L; + indices[1] = -1; + for (i = 0; i < DTX_HIST_SIZE; i++) + { + if ((L_sub(st->sumD[i], summax2nd) > 0) && (sub(i, indices[0]) != 0)) + { + indices[1] = i; + summax2nd = st->sumD[i]; + } + } + + for (i = 0; i < 3; i++) + { + indices[i] = sub(st->hist_ptr, indices[i]); + if (indices[i] < 0) + { + indices[i] = add(indices[i], DTX_HIST_SIZE); + } + } + + /* If maximum distance/MED_THRESH is smaller than minimum distance */ + /* then the median ISF vector replacement is not performed */ + tmp = norm_l(summax); + summax = (summax << tmp); + summin = (summin << tmp); + L_tmp = L_mult(voround(summax), INV_MED_THRESH); + if(L_tmp <= summin) + { + indices[0] = -1; + } + /* If second largest distance/MED_THRESH is smaller than */ + /* minimum distance then the median ISF vector replacement is */ + /* not performed */ + summax2nd = L_shl(summax2nd, tmp); + L_tmp = L_mult(voround(summax2nd), INV_MED_THRESH); + if(L_tmp <= summin) + { + indices[1] = -1; + } + return; +} + +static Word16 dithering_control( + dtx_encState * st + ) +{ + Word16 tmp, mean, CN_dith, gain_diff; + Word32 i, ISF_diff; + + /* determine how stationary the spectrum of background noise is */ + ISF_diff = 0; + for (i = 0; i < 8; i++) + { + ISF_diff = L_add(ISF_diff, st->sumD[i]); + } + if ((ISF_diff >> 26) > 0) + { + CN_dith = 1; + } else + { + CN_dith = 0; + } + + /* determine how stationary the energy of background noise is */ + mean = 0; + for (i = 0; i < DTX_HIST_SIZE; i++) + { + mean = add(mean, st->log_en_hist[i]); + } + mean = (mean >> 3); + gain_diff = 0; + for (i = 0; i < DTX_HIST_SIZE; i++) + { + tmp = abs_s(sub(st->log_en_hist[i], mean)); + gain_diff = add(gain_diff, tmp); + } + if (gain_diff > GAIN_THR) + { + CN_dith = 1; + } + return CN_dith; +} diff --git a/media/libstagefright/codecs/amrwbenc/src/g_pitch.c b/media/libstagefright/codecs/amrwbenc/src/g_pitch.c index 570138e..f5112c5 100644 --- a/media/libstagefright/codecs/amrwbenc/src/g_pitch.c +++ b/media/libstagefright/codecs/amrwbenc/src/g_pitch.c @@ -1,79 +1,79 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: g_pitch.c * -* * -* Description:Compute the gain of pitch. Result in Q12 * -* if(gain < 0) gain = 0 * -* if(gain > 1.2) gain = 1.2 * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "math_op.h" - -Word16 G_pitch( /* (o) Q14 : Gain of pitch lag saturated to 1.2 */ - Word16 xn[], /* (i) : Pitch target. */ - Word16 y1[], /* (i) : filtered adaptive codebook. */ - Word16 g_coeff[], /* : Correlations need for gain quantization. */ - Word16 L_subfr /* : Length of subframe. */ - ) -{ - Word32 i; - Word16 xy, yy, exp_xy, exp_yy, gain; - /* Compute scalar product */ -#ifdef ASM_OPT /* asm optimization branch */ - /* Compute scalar product */ - xy = extract_h(Dot_product12_asm(xn, y1, L_subfr, &exp_xy)); - yy = extract_h(Dot_product12_asm(y1, y1, L_subfr, &exp_yy)); - -#else - /* Compute scalar product */ - xy = extract_h(Dot_product12(xn, y1, L_subfr, &exp_xy)); - yy = extract_h(Dot_product12(y1, y1, L_subfr, &exp_yy)); - -#endif - - g_coeff[0] = yy; - g_coeff[1] = exp_yy; - g_coeff[2] = xy; - g_coeff[3] = exp_xy; - - /* If (xy < 0) gain = 0 */ - if (xy < 0) - return ((Word16) 0); - - /* compute gain = xy/yy */ - - xy >>= 1; /* Be sure xy < yy */ - gain = div_s(xy, yy); - - i = exp_xy; - i -= exp_yy; - - gain = shl(gain, i); - - /* if (gain > 1.2) gain = 1.2 in Q14 */ - if(gain > 19661) - { - gain = 19661; - } - return (gain); -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: g_pitch.c * +* * +* Description:Compute the gain of pitch. Result in Q12 * +* if(gain < 0) gain = 0 * +* if(gain > 1.2) gain = 1.2 * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "math_op.h" + +Word16 G_pitch( /* (o) Q14 : Gain of pitch lag saturated to 1.2 */ + Word16 xn[], /* (i) : Pitch target. */ + Word16 y1[], /* (i) : filtered adaptive codebook. */ + Word16 g_coeff[], /* : Correlations need for gain quantization. */ + Word16 L_subfr /* : Length of subframe. */ + ) +{ + Word32 i; + Word16 xy, yy, exp_xy, exp_yy, gain; + /* Compute scalar product */ +#ifdef ASM_OPT /* asm optimization branch */ + /* Compute scalar product */ + xy = extract_h(Dot_product12_asm(xn, y1, L_subfr, &exp_xy)); + yy = extract_h(Dot_product12_asm(y1, y1, L_subfr, &exp_yy)); + +#else + /* Compute scalar product */ + xy = extract_h(Dot_product12(xn, y1, L_subfr, &exp_xy)); + yy = extract_h(Dot_product12(y1, y1, L_subfr, &exp_yy)); + +#endif + + g_coeff[0] = yy; + g_coeff[1] = exp_yy; + g_coeff[2] = xy; + g_coeff[3] = exp_xy; + + /* If (xy < 0) gain = 0 */ + if (xy < 0) + return ((Word16) 0); + + /* compute gain = xy/yy */ + + xy >>= 1; /* Be sure xy < yy */ + gain = div_s(xy, yy); + + i = exp_xy; + i -= exp_yy; + + gain = shl(gain, i); + + /* if (gain > 1.2) gain = 1.2 in Q14 */ + if(gain > 19661) + { + gain = 19661; + } + return (gain); +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/gpclip.c b/media/libstagefright/codecs/amrwbenc/src/gpclip.c index e23f2f4..24158e3 100644 --- a/media/libstagefright/codecs/amrwbenc/src/gpclip.c +++ b/media/libstagefright/codecs/amrwbenc/src/gpclip.c @@ -1,110 +1,110 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/************************************************************************** -* File: gpclip.c * -* * -* Description:To avoid unstable synthesis on frame erasure, the gain * -* need to be limited(gain pitch < 1.0) when the following * -* case occurs * -* a resonance on LPC filter(lp_disp < 60Hz) * -* a good pitch prediction (lp_gp > 0.95) * -* * -***************************************************************************/ -#include "typedef.h" -#include "basic_op.h" - -#define DIST_ISF_MAX 307 /* 120 Hz (6400Hz=16384) */ -#define DIST_ISF_THRES 154 /* 60 (6400Hz=16384) */ -#define GAIN_PIT_THRES 14746 /* 0.9 in Q14 */ -#define GAIN_PIT_MIN 9830 /* 0.6 in Q14 */ -#define M 16 - - -void Init_gp_clip( - Word16 mem[] /* (o) : memory of gain of pitch clipping algorithm */ - ) -{ - mem[0] = DIST_ISF_MAX; - mem[1] = GAIN_PIT_MIN; -} - - -Word16 Gp_clip( - Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ - ) -{ - Word16 clip = 0; - if ((mem[0] < DIST_ISF_THRES) && (mem[1] > GAIN_PIT_THRES)) - clip = 1; - - return (clip); -} - - -void Gp_clip_test_isf( - Word16 isf[], /* (i) : isf values (in frequency domain) */ - Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ - ) -{ - Word16 dist, dist_min; - Word32 i; - - dist_min = vo_sub(isf[1], isf[0]); - - for (i = 2; i < M - 1; i++) - { - dist = vo_sub(isf[i], isf[i - 1]); - if(dist < dist_min) - { - dist_min = dist; - } - } - - dist = extract_h(L_mac(vo_L_mult(26214, mem[0]), 6554, dist_min)); - - if (dist > DIST_ISF_MAX) - { - dist = DIST_ISF_MAX; - } - mem[0] = dist; - - return; -} - - -void Gp_clip_test_gain_pit( - Word16 gain_pit, /* (i) Q14 : gain of quantized pitch */ - Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ - ) -{ - Word16 gain; - Word32 L_tmp; - L_tmp = (29491 * mem[1])<<1; - L_tmp += (3277 * gain_pit)<<1; - - gain = extract_h(L_tmp); - - if(gain < GAIN_PIT_MIN) - { - gain = GAIN_PIT_MIN; - } - mem[1] = gain; - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/************************************************************************** +* File: gpclip.c * +* * +* Description:To avoid unstable synthesis on frame erasure, the gain * +* need to be limited(gain pitch < 1.0) when the following * +* case occurs * +* a resonance on LPC filter(lp_disp < 60Hz) * +* a good pitch prediction (lp_gp > 0.95) * +* * +***************************************************************************/ +#include "typedef.h" +#include "basic_op.h" + +#define DIST_ISF_MAX 307 /* 120 Hz (6400Hz=16384) */ +#define DIST_ISF_THRES 154 /* 60 (6400Hz=16384) */ +#define GAIN_PIT_THRES 14746 /* 0.9 in Q14 */ +#define GAIN_PIT_MIN 9830 /* 0.6 in Q14 */ +#define M 16 + + +void Init_gp_clip( + Word16 mem[] /* (o) : memory of gain of pitch clipping algorithm */ + ) +{ + mem[0] = DIST_ISF_MAX; + mem[1] = GAIN_PIT_MIN; +} + + +Word16 Gp_clip( + Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ + ) +{ + Word16 clip = 0; + if ((mem[0] < DIST_ISF_THRES) && (mem[1] > GAIN_PIT_THRES)) + clip = 1; + + return (clip); +} + + +void Gp_clip_test_isf( + Word16 isf[], /* (i) : isf values (in frequency domain) */ + Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ + ) +{ + Word16 dist, dist_min; + Word32 i; + + dist_min = vo_sub(isf[1], isf[0]); + + for (i = 2; i < M - 1; i++) + { + dist = vo_sub(isf[i], isf[i - 1]); + if(dist < dist_min) + { + dist_min = dist; + } + } + + dist = extract_h(L_mac(vo_L_mult(26214, mem[0]), 6554, dist_min)); + + if (dist > DIST_ISF_MAX) + { + dist = DIST_ISF_MAX; + } + mem[0] = dist; + + return; +} + + +void Gp_clip_test_gain_pit( + Word16 gain_pit, /* (i) Q14 : gain of quantized pitch */ + Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ + ) +{ + Word16 gain; + Word32 L_tmp; + L_tmp = (29491 * mem[1])<<1; + L_tmp += (3277 * gain_pit)<<1; + + gain = extract_h(L_tmp); + + if(gain < GAIN_PIT_MIN) + { + gain = GAIN_PIT_MIN; + } + mem[1] = gain; + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/homing.c b/media/libstagefright/codecs/amrwbenc/src/homing.c index 015633f..565040f 100644 --- a/media/libstagefright/codecs/amrwbenc/src/homing.c +++ b/media/libstagefright/codecs/amrwbenc/src/homing.c @@ -1,46 +1,46 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: homing.c * -* * -* Description:Performs the homing routines * -* * -************************************************************************/ - -#include "typedef.h" -#include "cnst.h" -#include "basic_op.h" -#include "bits.h" -#include "homing.tab" - -Word16 encoder_homing_frame_test(Word16 input_frame[]) -{ - Word32 i; - Word16 j = 0; - - /* check 320 input samples for matching EHF_MASK: defined in e_homing.h */ - for (i = 0; i < L_FRAME16k; i++) - { - j = (Word16) (input_frame[i] ^ EHF_MASK); - - if (j) - break; - } - - return (Word16) (!j); -} - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: homing.c * +* * +* Description:Performs the homing routines * +* * +************************************************************************/ + +#include "typedef.h" +#include "cnst.h" +#include "basic_op.h" +#include "bits.h" +#include "homing.tab" + +Word16 encoder_homing_frame_test(Word16 input_frame[]) +{ + Word32 i; + Word16 j = 0; + + /* check 320 input samples for matching EHF_MASK: defined in e_homing.h */ + for (i = 0; i < L_FRAME16k; i++) + { + j = (Word16) (input_frame[i] ^ EHF_MASK); + + if (j) + break; + } + + return (Word16) (!j); +} + diff --git a/media/libstagefright/codecs/amrwbenc/src/hp400.c b/media/libstagefright/codecs/amrwbenc/src/hp400.c index 463a53a..fa66f1a 100644 --- a/media/libstagefright/codecs/amrwbenc/src/hp400.c +++ b/media/libstagefright/codecs/amrwbenc/src/hp400.c @@ -1,106 +1,106 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: hp400.c * -* * -* Description: * -* 2nd order high pass filter with cut off frequency at 400 Hz. * -* Designed with cheby2 function in MATLAB. * -* Optimized for fixed-point to get the following frequency response: * -* * -* frequency: 0Hz 100Hz 200Hz 300Hz 400Hz 630Hz 1.5kHz 3kHz * -* dB loss: -infdB -30dB -20dB -10dB -3dB +6dB +1dB 0dB * -* * -* Algorithm: * -* * -* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] * -* + a[1]*y[i-1] + a[2]*y[i-2]; * -* * -* Word16 b[3] = {3660, -7320, 3660}; in Q12 * -* Word16 a[3] = {4096, 7320, -3540}; in Q12 * -* * -* float --> b[3] = {0.893554687, -1.787109375, 0.893554687}; * -* a[3] = {1.000000000, 1.787109375, -0.864257812}; * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "oper_32b.h" -#include "acelp.h" - -/* filter coefficients */ -static Word16 b[3] = {915, -1830, 915}; /* Q12 (/4) */ -static Word16 a[3] = {16384, 29280, -14160}; /* Q12 (x4) */ -/* Initialization of static values */ - -void Init_HP400_12k8(Word16 mem[]) -{ - Set_zero(mem, 6); -} - - -void HP400_12k8( - Word16 signal[], /* input signal / output is divided by 16 */ - Word16 lg, /* lenght of signal */ - Word16 mem[] /* filter memory [6] */ - ) -{ - Word16 x2; - Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1; - Word32 L_tmp; - Word32 num; - y2_hi = *mem++; - y2_lo = *mem++; - y1_hi = *mem++; - y1_lo = *mem++; - x0 = *mem++; - x1 = *mem; - num = (Word32)lg; - do - { - x2 = x1; - x1 = x0; - x0 = *signal; - /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] */ - /* + a[1]*y[i-1] + a[2] * y[i-2]; */ - L_tmp = 8192L; /* rounding to maximise precision */ - L_tmp += y1_lo * a[1]; - L_tmp += y2_lo * a[2]; - L_tmp = L_tmp >> 14; - L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2)* b[0] + x1 * b[1]) << 1; - L_tmp <<= 1; /* coeff Q12 --> Q13 */ - y2_hi = y1_hi; - y2_lo = y1_lo; - y1_hi = (Word16)(L_tmp>>16); - y1_lo = (Word16)((L_tmp & 0xffff)>>1); - - /* signal is divided by 16 to avoid overflow in energy computation */ - *signal++ = (L_tmp + 0x8000) >> 16; - }while(--num !=0); - - *mem-- = x1; - *mem-- = x0; - *mem-- = y1_lo; - *mem-- = y1_hi; - *mem-- = y2_lo; - *mem = y2_hi; - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: hp400.c * +* * +* Description: * +* 2nd order high pass filter with cut off frequency at 400 Hz. * +* Designed with cheby2 function in MATLAB. * +* Optimized for fixed-point to get the following frequency response: * +* * +* frequency: 0Hz 100Hz 200Hz 300Hz 400Hz 630Hz 1.5kHz 3kHz * +* dB loss: -infdB -30dB -20dB -10dB -3dB +6dB +1dB 0dB * +* * +* Algorithm: * +* * +* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] * +* + a[1]*y[i-1] + a[2]*y[i-2]; * +* * +* Word16 b[3] = {3660, -7320, 3660}; in Q12 * +* Word16 a[3] = {4096, 7320, -3540}; in Q12 * +* * +* float --> b[3] = {0.893554687, -1.787109375, 0.893554687}; * +* a[3] = {1.000000000, 1.787109375, -0.864257812}; * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "acelp.h" + +/* filter coefficients */ +static Word16 b[3] = {915, -1830, 915}; /* Q12 (/4) */ +static Word16 a[3] = {16384, 29280, -14160}; /* Q12 (x4) */ +/* Initialization of static values */ + +void Init_HP400_12k8(Word16 mem[]) +{ + Set_zero(mem, 6); +} + + +void HP400_12k8( + Word16 signal[], /* input signal / output is divided by 16 */ + Word16 lg, /* lenght of signal */ + Word16 mem[] /* filter memory [6] */ + ) +{ + Word16 x2; + Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1; + Word32 L_tmp; + Word32 num; + y2_hi = *mem++; + y2_lo = *mem++; + y1_hi = *mem++; + y1_lo = *mem++; + x0 = *mem++; + x1 = *mem; + num = (Word32)lg; + do + { + x2 = x1; + x1 = x0; + x0 = *signal; + /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] */ + /* + a[1]*y[i-1] + a[2] * y[i-2]; */ + L_tmp = 8192L; /* rounding to maximise precision */ + L_tmp += y1_lo * a[1]; + L_tmp += y2_lo * a[2]; + L_tmp = L_tmp >> 14; + L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2)* b[0] + x1 * b[1]) << 1; + L_tmp <<= 1; /* coeff Q12 --> Q13 */ + y2_hi = y1_hi; + y2_lo = y1_lo; + y1_hi = (Word16)(L_tmp>>16); + y1_lo = (Word16)((L_tmp & 0xffff)>>1); + + /* signal is divided by 16 to avoid overflow in energy computation */ + *signal++ = (L_tmp + 0x8000) >> 16; + }while(--num !=0); + + *mem-- = x1; + *mem-- = x0; + *mem-- = y1_lo; + *mem-- = y1_hi; + *mem-- = y2_lo; + *mem = y2_hi; + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/hp50.c b/media/libstagefright/codecs/amrwbenc/src/hp50.c index 53e3d7b..36dd1f1 100644 --- a/media/libstagefright/codecs/amrwbenc/src/hp50.c +++ b/media/libstagefright/codecs/amrwbenc/src/hp50.c @@ -1,106 +1,106 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: hp50.c * -* * -* Description: * -* 2nd order high pass filter with cut off frequency at 31 Hz. * -* Designed with cheby2 function in MATLAB. * -* Optimized for fixed-point to get the following frequency response: * -* * -* frequency: 0Hz 14Hz 24Hz 31Hz 37Hz 41Hz 47Hz * -* dB loss: -infdB -15dB -6dB -3dB -1.5dB -1dB -0.5dB * -* * -* Algorithm: * -* * -* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] * -* + a[1]*y[i-1] + a[2]*y[i-2]; * -* * -* Word16 b[3] = {4053, -8106, 4053}; in Q12 * -* Word16 a[3] = {8192, 16211, -8021}; in Q12 * -* * -* float --> b[3] = {0.989501953, -1.979003906, 0.989501953}; * -* a[3] = {1.000000000, 1.978881836, -0.979125977}; * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "oper_32b.h" -#include "cnst.h" -#include "acelp.h" - -/* filter coefficients */ -static Word16 b[3] = {4053, -8106, 4053}; /* Q12 */ -static Word16 a[3] = {8192, 16211, -8021}; /* Q12 (x2) */ - -/* Initialization of static values */ - -void Init_HP50_12k8(Word16 mem[]) -{ - Set_zero(mem, 6); -} - - -void HP50_12k8( - Word16 signal[], /* input/output signal */ - Word16 lg, /* lenght of signal */ - Word16 mem[] /* filter memory [6] */ - ) -{ - Word16 x2; - Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1; - Word32 L_tmp; - Word32 num; - - y2_hi = *mem++; - y2_lo = *mem++; - y1_hi = *mem++; - y1_lo = *mem++; - x0 = *mem++; - x1 = *mem; - num = (Word32)lg; - do - { - x2 = x1; - x1 = x0; - x0 = *signal; - /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] */ - /* + a[1]*y[i-1] + a[2] * y[i-2]; */ - L_tmp = 8192 ; /* rounding to maximise precision */ - L_tmp += y1_lo * a[1]; - L_tmp += y2_lo * a[2]; - L_tmp = L_tmp >> 14; - L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2) * b[0] + x1 * b[1]) << 1; - L_tmp <<= 2; /* coeff Q12 --> Q13 */ - y2_hi = y1_hi; - y2_lo = y1_lo; - y1_hi = (Word16)(L_tmp>>16); - y1_lo = (Word16)((L_tmp & 0xffff)>>1); - *signal++ = extract_h((L_add((L_tmp<<1), 0x8000))); - }while(--num !=0); - - *mem-- = x1; - *mem-- = x0; - *mem-- = y1_lo; - *mem-- = y1_hi; - *mem-- = y2_lo; - *mem-- = y2_hi; - - return; -} - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: hp50.c * +* * +* Description: * +* 2nd order high pass filter with cut off frequency at 31 Hz. * +* Designed with cheby2 function in MATLAB. * +* Optimized for fixed-point to get the following frequency response: * +* * +* frequency: 0Hz 14Hz 24Hz 31Hz 37Hz 41Hz 47Hz * +* dB loss: -infdB -15dB -6dB -3dB -1.5dB -1dB -0.5dB * +* * +* Algorithm: * +* * +* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] * +* + a[1]*y[i-1] + a[2]*y[i-2]; * +* * +* Word16 b[3] = {4053, -8106, 4053}; in Q12 * +* Word16 a[3] = {8192, 16211, -8021}; in Q12 * +* * +* float --> b[3] = {0.989501953, -1.979003906, 0.989501953}; * +* a[3] = {1.000000000, 1.978881836, -0.979125977}; * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "cnst.h" +#include "acelp.h" + +/* filter coefficients */ +static Word16 b[3] = {4053, -8106, 4053}; /* Q12 */ +static Word16 a[3] = {8192, 16211, -8021}; /* Q12 (x2) */ + +/* Initialization of static values */ + +void Init_HP50_12k8(Word16 mem[]) +{ + Set_zero(mem, 6); +} + + +void HP50_12k8( + Word16 signal[], /* input/output signal */ + Word16 lg, /* lenght of signal */ + Word16 mem[] /* filter memory [6] */ + ) +{ + Word16 x2; + Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1; + Word32 L_tmp; + Word32 num; + + y2_hi = *mem++; + y2_lo = *mem++; + y1_hi = *mem++; + y1_lo = *mem++; + x0 = *mem++; + x1 = *mem; + num = (Word32)lg; + do + { + x2 = x1; + x1 = x0; + x0 = *signal; + /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] */ + /* + a[1]*y[i-1] + a[2] * y[i-2]; */ + L_tmp = 8192 ; /* rounding to maximise precision */ + L_tmp += y1_lo * a[1]; + L_tmp += y2_lo * a[2]; + L_tmp = L_tmp >> 14; + L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2) * b[0] + x1 * b[1]) << 1; + L_tmp <<= 2; /* coeff Q12 --> Q13 */ + y2_hi = y1_hi; + y2_lo = y1_lo; + y1_hi = (Word16)(L_tmp>>16); + y1_lo = (Word16)((L_tmp & 0xffff)>>1); + *signal++ = extract_h((L_add((L_tmp<<1), 0x8000))); + }while(--num !=0); + + *mem-- = x1; + *mem-- = x0; + *mem-- = y1_lo; + *mem-- = y1_hi; + *mem-- = y2_lo; + *mem-- = y2_hi; + + return; +} + + diff --git a/media/libstagefright/codecs/amrwbenc/src/hp6k.c b/media/libstagefright/codecs/amrwbenc/src/hp6k.c index 5ee5b20..578633a 100644 --- a/media/libstagefright/codecs/amrwbenc/src/hp6k.c +++ b/media/libstagefright/codecs/amrwbenc/src/hp6k.c @@ -1,93 +1,93 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: hp6k.c * -* * -* Description:15th order band pass 6kHz to 7kHz FIR filter * -* frequency: 4kHz 5kHz 5.5kHz 6kHz 6.5kHz 7kHz 7.5kHz 8kHz * -* dB loss: -60dB -45dB -13dB -3dB 0dB -3dB -13dB -45dB * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "acelp.h" -#include "cnst.h" - -#define L_FIR 31 - -/* filter coefficients (gain=4.0) */ - -Word16 fir_6k_7k[L_FIR] = -{ - -32, 47, 32, -27, -369, - 1122, -1421, 0, 3798, -8880, - 12349, -10984, 3548, 7766, -18001, - 22118, -18001, 7766, 3548, -10984, - 12349, -8880, 3798, 0, -1421, - 1122, -369, -27, 32, 47, - -32 -}; - - -void Init_Filt_6k_7k(Word16 mem[]) /* mem[30] */ -{ - Set_zero(mem, L_FIR - 1); - return; -} - -void Filt_6k_7k( - Word16 signal[], /* input: signal */ - Word16 lg, /* input: length of input */ - Word16 mem[] /* in/out: memory (size=30) */ - ) -{ - Word16 x[L_SUBFR16k + (L_FIR - 1)]; - Word32 i, L_tmp; - - Copy(mem, x, L_FIR - 1); - for (i = lg - 1; i >= 0; i--) - { - x[i + L_FIR - 1] = signal[i] >> 2; /* gain of filter = 4 */ - } - for (i = 0; i < lg; i++) - { - L_tmp = (x[i] + x[i+ 30]) * fir_6k_7k[0]; - L_tmp += (x[i+1] + x[i + 29]) * fir_6k_7k[1]; - L_tmp += (x[i+2] + x[i + 28]) * fir_6k_7k[2]; - L_tmp += (x[i+3] + x[i + 27]) * fir_6k_7k[3]; - L_tmp += (x[i+4] + x[i + 26]) * fir_6k_7k[4]; - L_tmp += (x[i+5] + x[i + 25]) * fir_6k_7k[5]; - L_tmp += (x[i+6] + x[i + 24]) * fir_6k_7k[6]; - L_tmp += (x[i+7] + x[i + 23]) * fir_6k_7k[7]; - L_tmp += (x[i+8] + x[i + 22]) * fir_6k_7k[8]; - L_tmp += (x[i+9] + x[i + 21]) * fir_6k_7k[9]; - L_tmp += (x[i+10] + x[i + 20]) * fir_6k_7k[10]; - L_tmp += (x[i+11] + x[i + 19]) * fir_6k_7k[11]; - L_tmp += (x[i+12] + x[i + 18]) * fir_6k_7k[12]; - L_tmp += (x[i+13] + x[i + 17]) * fir_6k_7k[13]; - L_tmp += (x[i+14] + x[i + 16]) * fir_6k_7k[14]; - L_tmp += (x[i+15]) * fir_6k_7k[15]; - signal[i] = (L_tmp + 0x4000) >> 15; - } - - Copy(x + lg, mem, L_FIR - 1); - -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: hp6k.c * +* * +* Description:15th order band pass 6kHz to 7kHz FIR filter * +* frequency: 4kHz 5kHz 5.5kHz 6kHz 6.5kHz 7kHz 7.5kHz 8kHz * +* dB loss: -60dB -45dB -13dB -3dB 0dB -3dB -13dB -45dB * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "acelp.h" +#include "cnst.h" + +#define L_FIR 31 + +/* filter coefficients (gain=4.0) */ + +Word16 fir_6k_7k[L_FIR] = +{ + -32, 47, 32, -27, -369, + 1122, -1421, 0, 3798, -8880, + 12349, -10984, 3548, 7766, -18001, + 22118, -18001, 7766, 3548, -10984, + 12349, -8880, 3798, 0, -1421, + 1122, -369, -27, 32, 47, + -32 +}; + + +void Init_Filt_6k_7k(Word16 mem[]) /* mem[30] */ +{ + Set_zero(mem, L_FIR - 1); + return; +} + +void Filt_6k_7k( + Word16 signal[], /* input: signal */ + Word16 lg, /* input: length of input */ + Word16 mem[] /* in/out: memory (size=30) */ + ) +{ + Word16 x[L_SUBFR16k + (L_FIR - 1)]; + Word32 i, L_tmp; + + Copy(mem, x, L_FIR - 1); + for (i = lg - 1; i >= 0; i--) + { + x[i + L_FIR - 1] = signal[i] >> 2; /* gain of filter = 4 */ + } + for (i = 0; i < lg; i++) + { + L_tmp = (x[i] + x[i+ 30]) * fir_6k_7k[0]; + L_tmp += (x[i+1] + x[i + 29]) * fir_6k_7k[1]; + L_tmp += (x[i+2] + x[i + 28]) * fir_6k_7k[2]; + L_tmp += (x[i+3] + x[i + 27]) * fir_6k_7k[3]; + L_tmp += (x[i+4] + x[i + 26]) * fir_6k_7k[4]; + L_tmp += (x[i+5] + x[i + 25]) * fir_6k_7k[5]; + L_tmp += (x[i+6] + x[i + 24]) * fir_6k_7k[6]; + L_tmp += (x[i+7] + x[i + 23]) * fir_6k_7k[7]; + L_tmp += (x[i+8] + x[i + 22]) * fir_6k_7k[8]; + L_tmp += (x[i+9] + x[i + 21]) * fir_6k_7k[9]; + L_tmp += (x[i+10] + x[i + 20]) * fir_6k_7k[10]; + L_tmp += (x[i+11] + x[i + 19]) * fir_6k_7k[11]; + L_tmp += (x[i+12] + x[i + 18]) * fir_6k_7k[12]; + L_tmp += (x[i+13] + x[i + 17]) * fir_6k_7k[13]; + L_tmp += (x[i+14] + x[i + 16]) * fir_6k_7k[14]; + L_tmp += (x[i+15]) * fir_6k_7k[15]; + signal[i] = (L_tmp + 0x4000) >> 15; + } + + Copy(x + lg, mem, L_FIR - 1); + +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c b/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c index 7fb62a4..3510272 100644 --- a/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c +++ b/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c @@ -1,148 +1,148 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: hp_wsp.c * -* Description: * -* 3nd order high pass filter with cut off frequency at 180Hz * -* Algorithm: * -* * -* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] + b[3]*x[i-3] * -* + a[1]*y[i-1] + a[2]*y[i-2] + a[3]*y[i-3]; * -* * -* float a_coef[HP_ORDER]= { * -* -2.64436711600664f, * -* 2.35087386625360f, * -* -0.70001156927424f}; * -* * -* float b_coef[HP_ORDER+1]= { * -* -0.83787057505665f, * -* 2.50975570071058f, * -* -2.50975570071058f, * -* 0.83787057505665f}; * -* * -*************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "oper_32b.h" -#include "acelp.h" - -/* filter coefficients in Q12 */ -static Word16 a[4] = {8192, 21663, -19258, 5734}; -static Word16 b[4] = {-3432, +10280, -10280, +3432}; - -/* Initialization of static values */ -void Init_Hp_wsp(Word16 mem[]) -{ - Set_zero(mem, 9); - - return; -} - -void scale_mem_Hp_wsp(Word16 mem[], Word16 exp) -{ - Word32 i; - Word32 L_tmp; - - for (i = 0; i < 6; i += 2) - { - L_tmp = ((mem[i] << 16) + (mem[i + 1]<<1)); - L_tmp = L_shl(L_tmp, exp); - mem[i] = L_tmp >> 16; - mem[i + 1] = (L_tmp & 0xffff)>>1; - } - - for (i = 6; i < 9; i++) - { - L_tmp = L_deposit_h(mem[i]); /* x[i] */ - L_tmp = L_shl(L_tmp, exp); - mem[i] = vo_round(L_tmp); - } - - return; -} - - -void Hp_wsp( - Word16 wsp[], /* i : wsp[] signal */ - Word16 hp_wsp[], /* o : hypass wsp[] */ - Word16 lg, /* i : lenght of signal */ - Word16 mem[] /* i/o : filter memory [9] */ - ) -{ - Word16 x0, x1, x2, x3; - Word16 y3_hi, y3_lo, y2_hi, y2_lo, y1_hi, y1_lo; - Word32 i, L_tmp; - - y3_hi = mem[0]; - y3_lo = mem[1]; - y2_hi = mem[2]; - y2_lo = mem[3]; - y1_hi = mem[4]; - y1_lo = mem[5]; - x0 = mem[6]; - x1 = mem[7]; - x2 = mem[8]; - - for (i = 0; i < lg; i++) - { - x3 = x2; - x2 = x1; - x1 = x0; - x0 = wsp[i]; - /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] + b[3]*x[i-3] */ - /* + a[1]*y[i-1] + a[2] * y[i-2] + a[3]*y[i-3] */ - - L_tmp = 16384L; /* rounding to maximise precision */ - L_tmp += (y1_lo * a[1])<<1; - L_tmp += (y2_lo * a[2])<<1; - L_tmp += (y3_lo * a[3])<<1; - L_tmp = L_tmp >> 15; - L_tmp += (y1_hi * a[1])<<1; - L_tmp += (y2_hi * a[2])<<1; - L_tmp += (y3_hi * a[3])<<1; - L_tmp += (x0 * b[0])<<1; - L_tmp += (x1 * b[1])<<1; - L_tmp += (x2 * b[2])<<1; - L_tmp += (x3 * b[3])<<1; - - L_tmp = L_tmp << 2; - - y3_hi = y2_hi; - y3_lo = y2_lo; - y2_hi = y1_hi; - y2_lo = y1_lo; - y1_hi = L_tmp >> 16; - y1_lo = (L_tmp & 0xffff) >>1; - - hp_wsp[i] = (L_tmp + 0x4000)>>15; - } - - mem[0] = y3_hi; - mem[1] = y3_lo; - mem[2] = y2_hi; - mem[3] = y2_lo; - mem[4] = y1_hi; - mem[5] = y1_lo; - mem[6] = x0; - mem[7] = x1; - mem[8] = x2; - - return; -} - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: hp_wsp.c * +* Description: * +* 3nd order high pass filter with cut off frequency at 180Hz * +* Algorithm: * +* * +* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] + b[3]*x[i-3] * +* + a[1]*y[i-1] + a[2]*y[i-2] + a[3]*y[i-3]; * +* * +* float a_coef[HP_ORDER]= { * +* -2.64436711600664f, * +* 2.35087386625360f, * +* -0.70001156927424f}; * +* * +* float b_coef[HP_ORDER+1]= { * +* -0.83787057505665f, * +* 2.50975570071058f, * +* -2.50975570071058f, * +* 0.83787057505665f}; * +* * +*************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "acelp.h" + +/* filter coefficients in Q12 */ +static Word16 a[4] = {8192, 21663, -19258, 5734}; +static Word16 b[4] = {-3432, +10280, -10280, +3432}; + +/* Initialization of static values */ +void Init_Hp_wsp(Word16 mem[]) +{ + Set_zero(mem, 9); + + return; +} + +void scale_mem_Hp_wsp(Word16 mem[], Word16 exp) +{ + Word32 i; + Word32 L_tmp; + + for (i = 0; i < 6; i += 2) + { + L_tmp = ((mem[i] << 16) + (mem[i + 1]<<1)); + L_tmp = L_shl(L_tmp, exp); + mem[i] = L_tmp >> 16; + mem[i + 1] = (L_tmp & 0xffff)>>1; + } + + for (i = 6; i < 9; i++) + { + L_tmp = L_deposit_h(mem[i]); /* x[i] */ + L_tmp = L_shl(L_tmp, exp); + mem[i] = vo_round(L_tmp); + } + + return; +} + + +void Hp_wsp( + Word16 wsp[], /* i : wsp[] signal */ + Word16 hp_wsp[], /* o : hypass wsp[] */ + Word16 lg, /* i : lenght of signal */ + Word16 mem[] /* i/o : filter memory [9] */ + ) +{ + Word16 x0, x1, x2, x3; + Word16 y3_hi, y3_lo, y2_hi, y2_lo, y1_hi, y1_lo; + Word32 i, L_tmp; + + y3_hi = mem[0]; + y3_lo = mem[1]; + y2_hi = mem[2]; + y2_lo = mem[3]; + y1_hi = mem[4]; + y1_lo = mem[5]; + x0 = mem[6]; + x1 = mem[7]; + x2 = mem[8]; + + for (i = 0; i < lg; i++) + { + x3 = x2; + x2 = x1; + x1 = x0; + x0 = wsp[i]; + /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] + b[3]*x[i-3] */ + /* + a[1]*y[i-1] + a[2] * y[i-2] + a[3]*y[i-3] */ + + L_tmp = 16384L; /* rounding to maximise precision */ + L_tmp += (y1_lo * a[1])<<1; + L_tmp += (y2_lo * a[2])<<1; + L_tmp += (y3_lo * a[3])<<1; + L_tmp = L_tmp >> 15; + L_tmp += (y1_hi * a[1])<<1; + L_tmp += (y2_hi * a[2])<<1; + L_tmp += (y3_hi * a[3])<<1; + L_tmp += (x0 * b[0])<<1; + L_tmp += (x1 * b[1])<<1; + L_tmp += (x2 * b[2])<<1; + L_tmp += (x3 * b[3])<<1; + + L_tmp = L_tmp << 2; + + y3_hi = y2_hi; + y3_lo = y2_lo; + y2_hi = y1_hi; + y2_lo = y1_lo; + y1_hi = L_tmp >> 16; + y1_lo = (L_tmp & 0xffff) >>1; + + hp_wsp[i] = (L_tmp + 0x4000)>>15; + } + + mem[0] = y3_hi; + mem[1] = y3_lo; + mem[2] = y2_hi; + mem[3] = y2_lo; + mem[4] = y1_hi; + mem[5] = y1_lo; + mem[6] = x0; + mem[7] = x1; + mem[8] = x2; + + return; +} + + diff --git a/media/libstagefright/codecs/amrwbenc/src/int_lpc.c b/media/libstagefright/codecs/amrwbenc/src/int_lpc.c index be1fd0b..88285e8 100644 --- a/media/libstagefright/codecs/amrwbenc/src/int_lpc.c +++ b/media/libstagefright/codecs/amrwbenc/src/int_lpc.c @@ -1,66 +1,66 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: int_lpc.c * -* * -* Description:Interpolation of the LP parameters in 4 subframes. * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "cnst.h" -#include "acelp.h" - -#define MP1 (M+1) - - -void Int_isp( - Word16 isp_old[], /* input : isps from past frame */ - Word16 isp_new[], /* input : isps from present frame */ - Word16 frac[], /* input : fraction for 3 first subfr (Q15) */ - Word16 Az[] /* output: LP coefficients in 4 subframes */ - ) -{ - Word32 i, k; - Word16 fac_old, fac_new; - Word16 isp[M]; - Word32 L_tmp; - - for (k = 0; k < 3; k++) - { - fac_new = frac[k]; - fac_old = (32767 - fac_new) + 1; /* 1.0 - fac_new */ - - for (i = 0; i < M; i++) - { - L_tmp = (isp_old[i] * fac_old)<<1; - L_tmp += (isp_new[i] * fac_new)<<1; - isp[i] = (L_tmp + 0x8000)>>16; - } - Isp_Az(isp, Az, M, 0); - Az += MP1; - } - - /* 4th subframe: isp_new (frac=1.0) */ - Isp_Az(isp_new, Az, M, 0); - - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: int_lpc.c * +* * +* Description:Interpolation of the LP parameters in 4 subframes. * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "cnst.h" +#include "acelp.h" + +#define MP1 (M+1) + + +void Int_isp( + Word16 isp_old[], /* input : isps from past frame */ + Word16 isp_new[], /* input : isps from present frame */ + Word16 frac[], /* input : fraction for 3 first subfr (Q15) */ + Word16 Az[] /* output: LP coefficients in 4 subframes */ + ) +{ + Word32 i, k; + Word16 fac_old, fac_new; + Word16 isp[M]; + Word32 L_tmp; + + for (k = 0; k < 3; k++) + { + fac_new = frac[k]; + fac_old = (32767 - fac_new) + 1; /* 1.0 - fac_new */ + + for (i = 0; i < M; i++) + { + L_tmp = (isp_old[i] * fac_old)<<1; + L_tmp += (isp_new[i] * fac_new)<<1; + isp[i] = (L_tmp + 0x8000)>>16; + } + Isp_Az(isp, Az, M, 0); + Az += MP1; + } + + /* 4th subframe: isp_new (frac=1.0) */ + Isp_Az(isp_new, Az, M, 0); + + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/isp_az.c b/media/libstagefright/codecs/amrwbenc/src/isp_az.c index 7b44d12..c235c5d 100644 --- a/media/libstagefright/codecs/amrwbenc/src/isp_az.c +++ b/media/libstagefright/codecs/amrwbenc/src/isp_az.c @@ -1,247 +1,247 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: isp_az.c * -* * -* Description:Compute the LPC coefficients from isp (order=M) * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "oper_32b.h" -#include "cnst.h" - -#define NC (M/2) -#define NC16k (M16k/2) - -/* local function */ - -static void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n); -static void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n); - -void Isp_Az( - Word16 isp[], /* (i) Q15 : Immittance spectral pairs */ - Word16 a[], /* (o) Q12 : predictor coefficients (order = M) */ - Word16 m, - Word16 adaptive_scaling /* (i) 0 : adaptive scaling disabled */ - /* 1 : adaptive scaling enabled */ - ) -{ - Word32 i, j; - Word16 hi, lo; - Word32 f1[NC16k + 1], f2[NC16k]; - Word16 nc; - Word32 t0; - Word16 q, q_sug; - Word32 tmax; - - nc = (m >> 1); - if(nc > 8) - { - Get_isp_pol_16kHz(&isp[0], f1, nc); - for (i = 0; i <= nc; i++) - { - f1[i] = f1[i] << 2; - } - } else - Get_isp_pol(&isp[0], f1, nc); - - if (nc > 8) - { - Get_isp_pol_16kHz(&isp[1], f2, (nc - 1)); - for (i = 0; i <= nc - 1; i++) - { - f2[i] = f2[i] << 2; - } - } else - Get_isp_pol(&isp[1], f2, (nc - 1)); - - /*-----------------------------------------------------* - * Multiply F2(z) by (1 - z^-2) * - *-----------------------------------------------------*/ - - for (i = (nc - 1); i > 1; i--) - { - f2[i] = vo_L_sub(f2[i], f2[i - 2]); /* f2[i] -= f2[i-2]; */ - } - - /*----------------------------------------------------------* - * Scale F1(z) by (1+isp[m-1]) and F2(z) by (1-isp[m-1]) * - *----------------------------------------------------------*/ - - for (i = 0; i < nc; i++) - { - /* f1[i] *= (1.0 + isp[M-1]); */ - - hi = f1[i] >> 16; - lo = (f1[i] & 0xffff)>>1; - - t0 = Mpy_32_16(hi, lo, isp[m - 1]); - f1[i] = vo_L_add(f1[i], t0); - - /* f2[i] *= (1.0 - isp[M-1]); */ - - hi = f2[i] >> 16; - lo = (f2[i] & 0xffff)>>1; - t0 = Mpy_32_16(hi, lo, isp[m - 1]); - f2[i] = vo_L_sub(f2[i], t0); - } - - /*-----------------------------------------------------* - * A(z) = (F1(z)+F2(z))/2 * - * F1(z) is symmetric and F2(z) is antisymmetric * - *-----------------------------------------------------*/ - - /* a[0] = 1.0; */ - a[0] = 4096; - tmax = 1; - for (i = 1, j = m - 1; i < nc; i++, j--) - { - /* a[i] = 0.5*(f1[i] + f2[i]); */ - - t0 = vo_L_add(f1[i], f2[i]); /* f1[i] + f2[i] */ - tmax |= L_abs(t0); - a[i] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */ - - /* a[j] = 0.5*(f1[i] - f2[i]); */ - - t0 = vo_L_sub(f1[i], f2[i]); /* f1[i] - f2[i] */ - tmax |= L_abs(t0); - a[j] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */ - } - - /* rescale data if overflow has occured and reprocess the loop */ - if(adaptive_scaling == 1) - q = 4 - norm_l(tmax); /* adaptive scaling enabled */ - else - q = 0; /* adaptive scaling disabled */ - - if (q > 0) - { - q_sug = (12 + q); - for (i = 1, j = m - 1; i < nc; i++, j--) - { - /* a[i] = 0.5*(f1[i] + f2[i]); */ - t0 = vo_L_add(f1[i], f2[i]); /* f1[i] + f2[i] */ - a[i] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */ - - /* a[j] = 0.5*(f1[i] - f2[i]); */ - t0 = vo_L_sub(f1[i], f2[i]); /* f1[i] - f2[i] */ - a[j] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */ - } - a[0] = shr(a[0], q); - } - else - { - q_sug = 12; - q = 0; - } - /* a[NC] = 0.5*f1[NC]*(1.0 + isp[M-1]); */ - hi = f1[nc] >> 16; - lo = (f1[nc] & 0xffff)>>1; - t0 = Mpy_32_16(hi, lo, isp[m - 1]); - t0 = vo_L_add(f1[nc], t0); - a[nc] = (Word16)(L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */ - /* a[m] = isp[m-1]; */ - - a[m] = vo_shr_r(isp[m - 1], (3 + q)); /* from Q15 to Q12 */ - return; -} - -/*-----------------------------------------------------------* -* procedure Get_isp_pol: * -* ~~~~~~~~~~~ * -* Find the polynomial F1(z) or F2(z) from the ISPs. * -* This is performed by expanding the product polynomials: * -* * -* F1(z) = product ( 1 - 2 isp_i z^-1 + z^-2 ) * -* i=0,2,4,6,8 * -* F2(z) = product ( 1 - 2 isp_i z^-1 + z^-2 ) * -* i=1,3,5,7 * -* * -* where isp_i are the ISPs in the cosine domain. * -*-----------------------------------------------------------* -* * -* Parameters: * -* isp[] : isp vector (cosine domaine) in Q15 * -* f[] : the coefficients of F1 or F2 in Q23 * -* n : == NC for F1(z); == NC-1 for F2(z) * -*-----------------------------------------------------------*/ - -static void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n) -{ - Word16 hi, lo; - Word32 i, j, t0; - /* All computation in Q23 */ - - f[0] = vo_L_mult(4096, 1024); /* f[0] = 1.0; in Q23 */ - f[1] = vo_L_mult(isp[0], -256); /* f[1] = -2.0*isp[0] in Q23 */ - - f += 2; /* Advance f pointer */ - isp += 2; /* Advance isp pointer */ - for (i = 2; i <= n; i++) - { - *f = f[-2]; - for (j = 1; j < i; j++, f--) - { - hi = f[-1]>>16; - lo = (f[-1] & 0xffff)>>1; - - t0 = Mpy_32_16(hi, lo, *isp); /* t0 = f[-1] * isp */ - t0 = t0 << 1; - *f = vo_L_sub(*f, t0); /* *f -= t0 */ - *f = vo_L_add(*f, f[-2]); /* *f += f[-2] */ - } - *f -= (*isp << 9); /* *f -= isp<<8 */ - f += i; /* Advance f pointer */ - isp += 2; /* Advance isp pointer */ - } - return; -} - -static void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n) -{ - Word16 hi, lo; - Word32 i, j, t0; - - /* All computation in Q23 */ - f[0] = L_mult(4096, 256); /* f[0] = 1.0; in Q23 */ - f[1] = L_mult(isp[0], -64); /* f[1] = -2.0*isp[0] in Q23 */ - - f += 2; /* Advance f pointer */ - isp += 2; /* Advance isp pointer */ - - for (i = 2; i <= n; i++) - { - *f = f[-2]; - for (j = 1; j < i; j++, f--) - { - VO_L_Extract(f[-1], &hi, &lo); - t0 = Mpy_32_16(hi, lo, *isp); /* t0 = f[-1] * isp */ - t0 = L_shl2(t0, 1); - *f = L_sub(*f, t0); /* *f -= t0 */ - *f = L_add(*f, f[-2]); /* *f += f[-2] */ - } - *f = L_msu(*f, *isp, 64); /* *f -= isp<<8 */ - f += i; /* Advance f pointer */ - isp += 2; /* Advance isp pointer */ - } - return; -} - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: isp_az.c * +* * +* Description:Compute the LPC coefficients from isp (order=M) * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "cnst.h" + +#define NC (M/2) +#define NC16k (M16k/2) + +/* local function */ + +static void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n); +static void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n); + +void Isp_Az( + Word16 isp[], /* (i) Q15 : Immittance spectral pairs */ + Word16 a[], /* (o) Q12 : predictor coefficients (order = M) */ + Word16 m, + Word16 adaptive_scaling /* (i) 0 : adaptive scaling disabled */ + /* 1 : adaptive scaling enabled */ + ) +{ + Word32 i, j; + Word16 hi, lo; + Word32 f1[NC16k + 1], f2[NC16k]; + Word16 nc; + Word32 t0; + Word16 q, q_sug; + Word32 tmax; + + nc = (m >> 1); + if(nc > 8) + { + Get_isp_pol_16kHz(&isp[0], f1, nc); + for (i = 0; i <= nc; i++) + { + f1[i] = f1[i] << 2; + } + } else + Get_isp_pol(&isp[0], f1, nc); + + if (nc > 8) + { + Get_isp_pol_16kHz(&isp[1], f2, (nc - 1)); + for (i = 0; i <= nc - 1; i++) + { + f2[i] = f2[i] << 2; + } + } else + Get_isp_pol(&isp[1], f2, (nc - 1)); + + /*-----------------------------------------------------* + * Multiply F2(z) by (1 - z^-2) * + *-----------------------------------------------------*/ + + for (i = (nc - 1); i > 1; i--) + { + f2[i] = vo_L_sub(f2[i], f2[i - 2]); /* f2[i] -= f2[i-2]; */ + } + + /*----------------------------------------------------------* + * Scale F1(z) by (1+isp[m-1]) and F2(z) by (1-isp[m-1]) * + *----------------------------------------------------------*/ + + for (i = 0; i < nc; i++) + { + /* f1[i] *= (1.0 + isp[M-1]); */ + + hi = f1[i] >> 16; + lo = (f1[i] & 0xffff)>>1; + + t0 = Mpy_32_16(hi, lo, isp[m - 1]); + f1[i] = vo_L_add(f1[i], t0); + + /* f2[i] *= (1.0 - isp[M-1]); */ + + hi = f2[i] >> 16; + lo = (f2[i] & 0xffff)>>1; + t0 = Mpy_32_16(hi, lo, isp[m - 1]); + f2[i] = vo_L_sub(f2[i], t0); + } + + /*-----------------------------------------------------* + * A(z) = (F1(z)+F2(z))/2 * + * F1(z) is symmetric and F2(z) is antisymmetric * + *-----------------------------------------------------*/ + + /* a[0] = 1.0; */ + a[0] = 4096; + tmax = 1; + for (i = 1, j = m - 1; i < nc; i++, j--) + { + /* a[i] = 0.5*(f1[i] + f2[i]); */ + + t0 = vo_L_add(f1[i], f2[i]); /* f1[i] + f2[i] */ + tmax |= L_abs(t0); + a[i] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */ + + /* a[j] = 0.5*(f1[i] - f2[i]); */ + + t0 = vo_L_sub(f1[i], f2[i]); /* f1[i] - f2[i] */ + tmax |= L_abs(t0); + a[j] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */ + } + + /* rescale data if overflow has occured and reprocess the loop */ + if(adaptive_scaling == 1) + q = 4 - norm_l(tmax); /* adaptive scaling enabled */ + else + q = 0; /* adaptive scaling disabled */ + + if (q > 0) + { + q_sug = (12 + q); + for (i = 1, j = m - 1; i < nc; i++, j--) + { + /* a[i] = 0.5*(f1[i] + f2[i]); */ + t0 = vo_L_add(f1[i], f2[i]); /* f1[i] + f2[i] */ + a[i] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */ + + /* a[j] = 0.5*(f1[i] - f2[i]); */ + t0 = vo_L_sub(f1[i], f2[i]); /* f1[i] - f2[i] */ + a[j] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */ + } + a[0] = shr(a[0], q); + } + else + { + q_sug = 12; + q = 0; + } + /* a[NC] = 0.5*f1[NC]*(1.0 + isp[M-1]); */ + hi = f1[nc] >> 16; + lo = (f1[nc] & 0xffff)>>1; + t0 = Mpy_32_16(hi, lo, isp[m - 1]); + t0 = vo_L_add(f1[nc], t0); + a[nc] = (Word16)(L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */ + /* a[m] = isp[m-1]; */ + + a[m] = vo_shr_r(isp[m - 1], (3 + q)); /* from Q15 to Q12 */ + return; +} + +/*-----------------------------------------------------------* +* procedure Get_isp_pol: * +* ~~~~~~~~~~~ * +* Find the polynomial F1(z) or F2(z) from the ISPs. * +* This is performed by expanding the product polynomials: * +* * +* F1(z) = product ( 1 - 2 isp_i z^-1 + z^-2 ) * +* i=0,2,4,6,8 * +* F2(z) = product ( 1 - 2 isp_i z^-1 + z^-2 ) * +* i=1,3,5,7 * +* * +* where isp_i are the ISPs in the cosine domain. * +*-----------------------------------------------------------* +* * +* Parameters: * +* isp[] : isp vector (cosine domaine) in Q15 * +* f[] : the coefficients of F1 or F2 in Q23 * +* n : == NC for F1(z); == NC-1 for F2(z) * +*-----------------------------------------------------------*/ + +static void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n) +{ + Word16 hi, lo; + Word32 i, j, t0; + /* All computation in Q23 */ + + f[0] = vo_L_mult(4096, 1024); /* f[0] = 1.0; in Q23 */ + f[1] = vo_L_mult(isp[0], -256); /* f[1] = -2.0*isp[0] in Q23 */ + + f += 2; /* Advance f pointer */ + isp += 2; /* Advance isp pointer */ + for (i = 2; i <= n; i++) + { + *f = f[-2]; + for (j = 1; j < i; j++, f--) + { + hi = f[-1]>>16; + lo = (f[-1] & 0xffff)>>1; + + t0 = Mpy_32_16(hi, lo, *isp); /* t0 = f[-1] * isp */ + t0 = t0 << 1; + *f = vo_L_sub(*f, t0); /* *f -= t0 */ + *f = vo_L_add(*f, f[-2]); /* *f += f[-2] */ + } + *f -= (*isp << 9); /* *f -= isp<<8 */ + f += i; /* Advance f pointer */ + isp += 2; /* Advance isp pointer */ + } + return; +} + +static void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n) +{ + Word16 hi, lo; + Word32 i, j, t0; + + /* All computation in Q23 */ + f[0] = L_mult(4096, 256); /* f[0] = 1.0; in Q23 */ + f[1] = L_mult(isp[0], -64); /* f[1] = -2.0*isp[0] in Q23 */ + + f += 2; /* Advance f pointer */ + isp += 2; /* Advance isp pointer */ + + for (i = 2; i <= n; i++) + { + *f = f[-2]; + for (j = 1; j < i; j++, f--) + { + VO_L_Extract(f[-1], &hi, &lo); + t0 = Mpy_32_16(hi, lo, *isp); /* t0 = f[-1] * isp */ + t0 = L_shl2(t0, 1); + *f = L_sub(*f, t0); /* *f -= t0 */ + *f = L_add(*f, f[-2]); /* *f += f[-2] */ + } + *f = L_msu(*f, *isp, 64); /* *f -= isp<<8 */ + f += i; /* Advance f pointer */ + isp += 2; /* Advance isp pointer */ + } + return; +} + + diff --git a/media/libstagefright/codecs/amrwbenc/src/isp_isf.c b/media/libstagefright/codecs/amrwbenc/src/isp_isf.c index 6c6e389..fbe80eb 100644 --- a/media/libstagefright/codecs/amrwbenc/src/isp_isf.c +++ b/media/libstagefright/codecs/amrwbenc/src/isp_isf.c @@ -1,91 +1,91 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: isp_isf.c * -* * -* Description: * -* Isp_isf Transformation isp to isf * -* Isf_isp Transformation isf to isp * -* * -* The transformation from isp[i] to isf[i] and isf[i] to isp[i] * -* are approximated by a look-up table and interpolation * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "isp_isf.tab" /* Look-up table for transformations */ - -void Isp_isf( - Word16 isp[], /* (i) Q15 : isp[m] (range: -1<=val<1) */ - Word16 isf[], /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */ - Word16 m /* (i) : LPC order */ - ) -{ - Word32 i, ind; - Word32 L_tmp; - ind = 127; /* beging at end of table -1 */ - for (i = (m - 1); i >= 0; i--) - { - if (i >= (m - 2)) - { /* m-2 is a constant */ - ind = 127; /* beging at end of table -1 */ - } - /* find value in table that is just greater than isp[i] */ - while (table[ind] < isp[i]) - ind--; - /* acos(isp[i])= ind*128 + ( ( isp[i]-table[ind] ) * slope[ind] )/2048 */ - L_tmp = vo_L_mult(vo_sub(isp[i], table[ind]), slope[ind]); - isf[i] = vo_round((L_tmp << 4)); /* (isp[i]-table[ind])*slope[ind])>>11 */ - isf[i] = add1(isf[i], (ind << 7)); - } - isf[m - 1] = (isf[m - 1] >> 1); - return; -} - - -void Isf_isp( - Word16 isf[], /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */ - Word16 isp[], /* (o) Q15 : isp[m] (range: -1<=val<1) */ - Word16 m /* (i) : LPC order */ - ) -{ - Word16 offset; - Word32 i, ind, L_tmp; - - for (i = 0; i < m - 1; i++) - { - isp[i] = isf[i]; - } - isp[m - 1] = (isf[m - 1] << 1); - - for (i = 0; i < m; i++) - { - ind = (isp[i] >> 7); /* ind = b7-b15 of isf[i] */ - offset = (Word16) (isp[i] & 0x007f); /* offset = b0-b6 of isf[i] */ - - /* isp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 128 */ - L_tmp = vo_L_mult(vo_sub(table[ind + 1], table[ind]), offset); - isp[i] = add1(table[ind], (Word16)((L_tmp >> 8))); - } - - return; -} - - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: isp_isf.c * +* * +* Description: * +* Isp_isf Transformation isp to isf * +* Isf_isp Transformation isf to isp * +* * +* The transformation from isp[i] to isf[i] and isf[i] to isp[i] * +* are approximated by a look-up table and interpolation * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "isp_isf.tab" /* Look-up table for transformations */ + +void Isp_isf( + Word16 isp[], /* (i) Q15 : isp[m] (range: -1<=val<1) */ + Word16 isf[], /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */ + Word16 m /* (i) : LPC order */ + ) +{ + Word32 i, ind; + Word32 L_tmp; + ind = 127; /* beging at end of table -1 */ + for (i = (m - 1); i >= 0; i--) + { + if (i >= (m - 2)) + { /* m-2 is a constant */ + ind = 127; /* beging at end of table -1 */ + } + /* find value in table that is just greater than isp[i] */ + while (table[ind] < isp[i]) + ind--; + /* acos(isp[i])= ind*128 + ( ( isp[i]-table[ind] ) * slope[ind] )/2048 */ + L_tmp = vo_L_mult(vo_sub(isp[i], table[ind]), slope[ind]); + isf[i] = vo_round((L_tmp << 4)); /* (isp[i]-table[ind])*slope[ind])>>11 */ + isf[i] = add1(isf[i], (ind << 7)); + } + isf[m - 1] = (isf[m - 1] >> 1); + return; +} + + +void Isf_isp( + Word16 isf[], /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */ + Word16 isp[], /* (o) Q15 : isp[m] (range: -1<=val<1) */ + Word16 m /* (i) : LPC order */ + ) +{ + Word16 offset; + Word32 i, ind, L_tmp; + + for (i = 0; i < m - 1; i++) + { + isp[i] = isf[i]; + } + isp[m - 1] = (isf[m - 1] << 1); + + for (i = 0; i < m; i++) + { + ind = (isp[i] >> 7); /* ind = b7-b15 of isf[i] */ + offset = (Word16) (isp[i] & 0x007f); /* offset = b0-b6 of isf[i] */ + + /* isp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 128 */ + L_tmp = vo_L_mult(vo_sub(table[ind + 1], table[ind]), offset); + isp[i] = add1(table[ind], (Word16)((L_tmp >> 8))); + } + + return; +} + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/lag_wind.c b/media/libstagefright/codecs/amrwbenc/src/lag_wind.c index 0397704..49c622c 100644 --- a/media/libstagefright/codecs/amrwbenc/src/lag_wind.c +++ b/media/libstagefright/codecs/amrwbenc/src/lag_wind.c @@ -1,49 +1,49 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: lag_wind.c * -* * -* Description: Lag_windows on autocorrelations * -* r[i] *= lag_wind[i] * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "oper_32b.h" -#include "lag_wind.tab" - - -void Lag_window( - Word16 r_h[], /* (i/o) : Autocorrelations (msb) */ - Word16 r_l[] /* (i/o) : Autocorrelations (lsb) */ - ) -{ - Word32 i; - Word32 x; - - for (i = 1; i <= M; i++) - { - x = Mpy_32(r_h[i], r_l[i], volag_h[i - 1], volag_l[i - 1]); - r_h[i] = x >> 16; - r_l[i] = (x & 0xffff)>>1; - } - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: lag_wind.c * +* * +* Description: Lag_windows on autocorrelations * +* r[i] *= lag_wind[i] * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "lag_wind.tab" + + +void Lag_window( + Word16 r_h[], /* (i/o) : Autocorrelations (msb) */ + Word16 r_l[] /* (i/o) : Autocorrelations (lsb) */ + ) +{ + Word32 i; + Word32 x; + + for (i = 1; i <= M; i++) + { + x = Mpy_32(r_h[i], r_l[i], volag_h[i - 1], volag_l[i - 1]); + r_h[i] = x >> 16; + r_l[i] = (x & 0xffff)>>1; + } + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/levinson.c b/media/libstagefright/codecs/amrwbenc/src/levinson.c index 8bc6f62..a68845f 100644 --- a/media/libstagefright/codecs/amrwbenc/src/levinson.c +++ b/media/libstagefright/codecs/amrwbenc/src/levinson.c @@ -1,250 +1,250 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: levinson.c * -* * -* Description:LEVINSON-DURBIN algorithm in double precision * -* * -************************************************************************/ -/*---------------------------------------------------------------------------* - * LEVINSON.C * - *---------------------------------------------------------------------------* - * * - * LEVINSON-DURBIN algorithm in double precision * - * * - * * - * Algorithm * - * * - * R[i] autocorrelations. * - * A[i] filter coefficients. * - * K reflection coefficients. * - * Alpha prediction gain. * - * * - * Initialization: * - * A[0] = 1 * - * K = -R[1]/R[0] * - * A[1] = K * - * Alpha = R[0] * (1-K**2] * - * * - * Do for i = 2 to M * - * * - * S = SUM ( R[j]*A[i-j] ,j=1,i-1 ) + R[i] * - * * - * K = -S / Alpha * - * * - * An[j] = A[j] + K*A[i-j] for j=1 to i-1 * - * where An[i] = new A[i] * - * An[i]=K * - * * - * Alpha=Alpha * (1-K**2) * - * * - * END * - * * - * Remarks on the dynamics of the calculations. * - * * - * The numbers used are in double precision in the following format : * - * A = AH <<16 + AL<<1. AH and AL are 16 bit signed integers. * - * Since the LSB's also contain a sign bit, this format does not * - * correspond to standard 32 bit integers. We use this format since * - * it allows fast execution of multiplications and divisions. * - * * - * "DPF" will refer to this special format in the following text. * - * See oper_32b.c * - * * - * The R[i] were normalized in routine AUTO (hence, R[i] < 1.0). * - * The K[i] and Alpha are theoretically < 1.0. * - * The A[i], for a sampling frequency of 8 kHz, are in practice * - * always inferior to 16.0. * - * * - * These characteristics allow straigthforward fixed-point * - * implementation. We choose to represent the parameters as * - * follows : * - * * - * R[i] Q31 +- .99.. * - * K[i] Q31 +- .99.. * - * Alpha Normalized -> mantissa in Q31 plus exponent * - * A[i] Q27 +- 15.999.. * - * * - * The additions are performed in 32 bit. For the summation used * - * to calculate the K[i], we multiply numbers in Q31 by numbers * - * in Q27, with the result of the multiplications in Q27, * - * resulting in a dynamic of +- 16. This is sufficient to avoid * - * overflow, since the final result of the summation is * - * necessarily < 1.0 as both the K[i] and Alpha are * - * theoretically < 1.0. * - *___________________________________________________________________________*/ -#include "typedef.h" -#include "basic_op.h" -#include "oper_32b.h" -#include "acelp.h" - -#define M 16 -#define NC (M/2) - -void Init_Levinson( - Word16 * mem /* output :static memory (18 words) */ - ) -{ - Set_zero(mem, 18); /* old_A[0..M-1] = 0, old_rc[0..1] = 0 */ - return; -} - - -void Levinson( - Word16 Rh[], /* (i) : Rh[M+1] Vector of autocorrelations (msb) */ - Word16 Rl[], /* (i) : Rl[M+1] Vector of autocorrelations (lsb) */ - Word16 A[], /* (o) Q12 : A[M] LPC coefficients (m = 16) */ - Word16 rc[], /* (o) Q15 : rc[M] Reflection coefficients. */ - Word16 * mem /* (i/o) :static memory (18 words) */ - ) -{ - Word32 i, j; - Word16 hi, lo; - Word16 Kh, Kl; /* reflection coefficient; hi and lo */ - Word16 alp_h, alp_l, alp_exp; /* Prediction gain; hi lo and exponent */ - Word16 Ah[M + 1], Al[M + 1]; /* LPC coef. in double prec. */ - Word16 Anh[M + 1], Anl[M + 1]; /* LPC coef.for next iteration in double prec. */ - Word32 t0, t1, t2; /* temporary variable */ - Word16 *old_A, *old_rc; - - /* Last A(z) for case of unstable filter */ - old_A = mem; - old_rc = mem + M; - - /* K = A[1] = -R[1] / R[0] */ - - t1 = ((Rh[1] << 16) + (Rl[1] << 1)); /* R[1] in Q31 */ - t2 = L_abs(t1); /* abs R[1] */ - t0 = Div_32(t2, Rh[0], Rl[0]); /* R[1]/R[0] in Q31 */ - if (t1 > 0) - t0 = -t0; /* -R[1]/R[0] */ - - Kh = t0 >> 16; - Kl = (t0 & 0xffff)>>1; - rc[0] = Kh; - t0 = (t0 >> 4); /* A[1] in Q27 */ - - Ah[1] = t0 >> 16; - Al[1] = (t0 & 0xffff)>>1; - - /* Alpha = R[0] * (1-K**2) */ - t0 = Mpy_32(Kh, Kl, Kh, Kl); /* K*K in Q31 */ - t0 = L_abs(t0); /* Some case <0 !! */ - t0 = vo_L_sub((Word32) 0x7fffffffL, t0); /* 1 - K*K in Q31 */ - - hi = t0 >> 16; - lo = (t0 & 0xffff)>>1; - - t0 = Mpy_32(Rh[0], Rl[0], hi, lo); /* Alpha in Q31 */ - - /* Normalize Alpha */ - alp_exp = norm_l(t0); - t0 = (t0 << alp_exp); - - alp_h = t0 >> 16; - alp_l = (t0 & 0xffff)>>1; - /*--------------------------------------* - * ITERATIONS I=2 to M * - *--------------------------------------*/ - for (i = 2; i <= M; i++) - { - /* t0 = SUM ( R[j]*A[i-j] ,j=1,i-1 ) + R[i] */ - t0 = 0; - for (j = 1; j < i; j++) - t0 = vo_L_add(t0, Mpy_32(Rh[j], Rl[j], Ah[i - j], Al[i - j])); - - t0 = t0 << 4; /* result in Q27 -> convert to Q31 */ - /* No overflow possible */ - t1 = ((Rh[i] << 16) + (Rl[i] << 1)); - t0 = vo_L_add(t0, t1); /* add R[i] in Q31 */ - - /* K = -t0 / Alpha */ - t1 = L_abs(t0); - t2 = Div_32(t1, alp_h, alp_l); /* abs(t0)/Alpha */ - if (t0 > 0) - t2 = -t2; /* K =-t0/Alpha */ - t2 = (t2 << alp_exp); /* denormalize; compare to Alpha */ - - Kh = t2 >> 16; - Kl = (t2 & 0xffff)>>1; - - rc[i - 1] = Kh; - /* Test for unstable filter. If unstable keep old A(z) */ - if (abs_s(Kh) > 32750) - { - A[0] = 4096; /* Ai[0] not stored (always 1.0) */ - for (j = 0; j < M; j++) - { - A[j + 1] = old_A[j]; - } - rc[0] = old_rc[0]; /* only two rc coefficients are needed */ - rc[1] = old_rc[1]; - return; - } - /*------------------------------------------* - * Compute new LPC coeff. -> An[i] * - * An[j]= A[j] + K*A[i-j] , j=1 to i-1 * - * An[i]= K * - *------------------------------------------*/ - for (j = 1; j < i; j++) - { - t0 = Mpy_32(Kh, Kl, Ah[i - j], Al[i - j]); - t0 = vo_L_add(t0, ((Ah[j] << 16) + (Al[j] << 1))); - Anh[j] = t0 >> 16; - Anl[j] = (t0 & 0xffff)>>1; - } - t2 = (t2 >> 4); /* t2 = K in Q31 ->convert to Q27 */ - - VO_L_Extract(t2, &Anh[i], &Anl[i]); /* An[i] in Q27 */ - - /* Alpha = Alpha * (1-K**2) */ - t0 = Mpy_32(Kh, Kl, Kh, Kl); /* K*K in Q31 */ - t0 = L_abs(t0); /* Some case <0 !! */ - t0 = vo_L_sub((Word32) 0x7fffffffL, t0); /* 1 - K*K in Q31 */ - hi = t0 >> 16; - lo = (t0 & 0xffff)>>1; - t0 = Mpy_32(alp_h, alp_l, hi, lo); /* Alpha in Q31 */ - - /* Normalize Alpha */ - j = norm_l(t0); - t0 = (t0 << j); - alp_h = t0 >> 16; - alp_l = (t0 & 0xffff)>>1; - alp_exp += j; /* Add normalization to alp_exp */ - - /* A[j] = An[j] */ - for (j = 1; j <= i; j++) - { - Ah[j] = Anh[j]; - Al[j] = Anl[j]; - } - } - /* Truncate A[i] in Q27 to Q12 with rounding */ - A[0] = 4096; - for (i = 1; i <= M; i++) - { - t0 = (Ah[i] << 16) + (Al[i] << 1); - old_A[i - 1] = A[i] = vo_round((t0 << 1)); - } - old_rc[0] = rc[0]; - old_rc[1] = rc[1]; - - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: levinson.c * +* * +* Description:LEVINSON-DURBIN algorithm in double precision * +* * +************************************************************************/ +/*---------------------------------------------------------------------------* + * LEVINSON.C * + *---------------------------------------------------------------------------* + * * + * LEVINSON-DURBIN algorithm in double precision * + * * + * * + * Algorithm * + * * + * R[i] autocorrelations. * + * A[i] filter coefficients. * + * K reflection coefficients. * + * Alpha prediction gain. * + * * + * Initialization: * + * A[0] = 1 * + * K = -R[1]/R[0] * + * A[1] = K * + * Alpha = R[0] * (1-K**2] * + * * + * Do for i = 2 to M * + * * + * S = SUM ( R[j]*A[i-j] ,j=1,i-1 ) + R[i] * + * * + * K = -S / Alpha * + * * + * An[j] = A[j] + K*A[i-j] for j=1 to i-1 * + * where An[i] = new A[i] * + * An[i]=K * + * * + * Alpha=Alpha * (1-K**2) * + * * + * END * + * * + * Remarks on the dynamics of the calculations. * + * * + * The numbers used are in double precision in the following format : * + * A = AH <<16 + AL<<1. AH and AL are 16 bit signed integers. * + * Since the LSB's also contain a sign bit, this format does not * + * correspond to standard 32 bit integers. We use this format since * + * it allows fast execution of multiplications and divisions. * + * * + * "DPF" will refer to this special format in the following text. * + * See oper_32b.c * + * * + * The R[i] were normalized in routine AUTO (hence, R[i] < 1.0). * + * The K[i] and Alpha are theoretically < 1.0. * + * The A[i], for a sampling frequency of 8 kHz, are in practice * + * always inferior to 16.0. * + * * + * These characteristics allow straigthforward fixed-point * + * implementation. We choose to represent the parameters as * + * follows : * + * * + * R[i] Q31 +- .99.. * + * K[i] Q31 +- .99.. * + * Alpha Normalized -> mantissa in Q31 plus exponent * + * A[i] Q27 +- 15.999.. * + * * + * The additions are performed in 32 bit. For the summation used * + * to calculate the K[i], we multiply numbers in Q31 by numbers * + * in Q27, with the result of the multiplications in Q27, * + * resulting in a dynamic of +- 16. This is sufficient to avoid * + * overflow, since the final result of the summation is * + * necessarily < 1.0 as both the K[i] and Alpha are * + * theoretically < 1.0. * + *___________________________________________________________________________*/ +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "acelp.h" + +#define M 16 +#define NC (M/2) + +void Init_Levinson( + Word16 * mem /* output :static memory (18 words) */ + ) +{ + Set_zero(mem, 18); /* old_A[0..M-1] = 0, old_rc[0..1] = 0 */ + return; +} + + +void Levinson( + Word16 Rh[], /* (i) : Rh[M+1] Vector of autocorrelations (msb) */ + Word16 Rl[], /* (i) : Rl[M+1] Vector of autocorrelations (lsb) */ + Word16 A[], /* (o) Q12 : A[M] LPC coefficients (m = 16) */ + Word16 rc[], /* (o) Q15 : rc[M] Reflection coefficients. */ + Word16 * mem /* (i/o) :static memory (18 words) */ + ) +{ + Word32 i, j; + Word16 hi, lo; + Word16 Kh, Kl; /* reflection coefficient; hi and lo */ + Word16 alp_h, alp_l, alp_exp; /* Prediction gain; hi lo and exponent */ + Word16 Ah[M + 1], Al[M + 1]; /* LPC coef. in double prec. */ + Word16 Anh[M + 1], Anl[M + 1]; /* LPC coef.for next iteration in double prec. */ + Word32 t0, t1, t2; /* temporary variable */ + Word16 *old_A, *old_rc; + + /* Last A(z) for case of unstable filter */ + old_A = mem; + old_rc = mem + M; + + /* K = A[1] = -R[1] / R[0] */ + + t1 = ((Rh[1] << 16) + (Rl[1] << 1)); /* R[1] in Q31 */ + t2 = L_abs(t1); /* abs R[1] */ + t0 = Div_32(t2, Rh[0], Rl[0]); /* R[1]/R[0] in Q31 */ + if (t1 > 0) + t0 = -t0; /* -R[1]/R[0] */ + + Kh = t0 >> 16; + Kl = (t0 & 0xffff)>>1; + rc[0] = Kh; + t0 = (t0 >> 4); /* A[1] in Q27 */ + + Ah[1] = t0 >> 16; + Al[1] = (t0 & 0xffff)>>1; + + /* Alpha = R[0] * (1-K**2) */ + t0 = Mpy_32(Kh, Kl, Kh, Kl); /* K*K in Q31 */ + t0 = L_abs(t0); /* Some case <0 !! */ + t0 = vo_L_sub((Word32) 0x7fffffffL, t0); /* 1 - K*K in Q31 */ + + hi = t0 >> 16; + lo = (t0 & 0xffff)>>1; + + t0 = Mpy_32(Rh[0], Rl[0], hi, lo); /* Alpha in Q31 */ + + /* Normalize Alpha */ + alp_exp = norm_l(t0); + t0 = (t0 << alp_exp); + + alp_h = t0 >> 16; + alp_l = (t0 & 0xffff)>>1; + /*--------------------------------------* + * ITERATIONS I=2 to M * + *--------------------------------------*/ + for (i = 2; i <= M; i++) + { + /* t0 = SUM ( R[j]*A[i-j] ,j=1,i-1 ) + R[i] */ + t0 = 0; + for (j = 1; j < i; j++) + t0 = vo_L_add(t0, Mpy_32(Rh[j], Rl[j], Ah[i - j], Al[i - j])); + + t0 = t0 << 4; /* result in Q27 -> convert to Q31 */ + /* No overflow possible */ + t1 = ((Rh[i] << 16) + (Rl[i] << 1)); + t0 = vo_L_add(t0, t1); /* add R[i] in Q31 */ + + /* K = -t0 / Alpha */ + t1 = L_abs(t0); + t2 = Div_32(t1, alp_h, alp_l); /* abs(t0)/Alpha */ + if (t0 > 0) + t2 = -t2; /* K =-t0/Alpha */ + t2 = (t2 << alp_exp); /* denormalize; compare to Alpha */ + + Kh = t2 >> 16; + Kl = (t2 & 0xffff)>>1; + + rc[i - 1] = Kh; + /* Test for unstable filter. If unstable keep old A(z) */ + if (abs_s(Kh) > 32750) + { + A[0] = 4096; /* Ai[0] not stored (always 1.0) */ + for (j = 0; j < M; j++) + { + A[j + 1] = old_A[j]; + } + rc[0] = old_rc[0]; /* only two rc coefficients are needed */ + rc[1] = old_rc[1]; + return; + } + /*------------------------------------------* + * Compute new LPC coeff. -> An[i] * + * An[j]= A[j] + K*A[i-j] , j=1 to i-1 * + * An[i]= K * + *------------------------------------------*/ + for (j = 1; j < i; j++) + { + t0 = Mpy_32(Kh, Kl, Ah[i - j], Al[i - j]); + t0 = vo_L_add(t0, ((Ah[j] << 16) + (Al[j] << 1))); + Anh[j] = t0 >> 16; + Anl[j] = (t0 & 0xffff)>>1; + } + t2 = (t2 >> 4); /* t2 = K in Q31 ->convert to Q27 */ + + VO_L_Extract(t2, &Anh[i], &Anl[i]); /* An[i] in Q27 */ + + /* Alpha = Alpha * (1-K**2) */ + t0 = Mpy_32(Kh, Kl, Kh, Kl); /* K*K in Q31 */ + t0 = L_abs(t0); /* Some case <0 !! */ + t0 = vo_L_sub((Word32) 0x7fffffffL, t0); /* 1 - K*K in Q31 */ + hi = t0 >> 16; + lo = (t0 & 0xffff)>>1; + t0 = Mpy_32(alp_h, alp_l, hi, lo); /* Alpha in Q31 */ + + /* Normalize Alpha */ + j = norm_l(t0); + t0 = (t0 << j); + alp_h = t0 >> 16; + alp_l = (t0 & 0xffff)>>1; + alp_exp += j; /* Add normalization to alp_exp */ + + /* A[j] = An[j] */ + for (j = 1; j <= i; j++) + { + Ah[j] = Anh[j]; + Al[j] = Anl[j]; + } + } + /* Truncate A[i] in Q27 to Q12 with rounding */ + A[0] = 4096; + for (i = 1; i <= M; i++) + { + t0 = (Ah[i] << 16) + (Al[i] << 1); + old_A[i - 1] = A[i] = vo_round((t0 << 1)); + } + old_rc[0] = rc[0]; + old_rc[1] = rc[1]; + + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/log2.c b/media/libstagefright/codecs/amrwbenc/src/log2.c index cd3d815..646d6af 100644 --- a/media/libstagefright/codecs/amrwbenc/src/log2.c +++ b/media/libstagefright/codecs/amrwbenc/src/log2.c @@ -1,111 +1,111 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* * -* File : log2.c * -* Purpose : Computes log2(L_x) * -* * -************************************************************************/ - -#include "log2.h" -/******************************************************************************** -* INCLUDE FILES -*********************************************************************************/ -#include "typedef.h" -#include "basic_op.h" - -/********************************************************************************* -* LOCAL VARIABLES AND TABLES -**********************************************************************************/ -#include "log2_tab.h" /* Table for Log2() */ - -/************************************************************************* -* -* FUNCTION: Log2_norm() -* -* PURPOSE: Computes log2(L_x, exp), where L_x is positive and -* normalized, and exp is the normalisation exponent -* If L_x is negative or zero, the result is 0. -* -* DESCRIPTION: -* The function Log2(L_x) is approximated by a table and linear -* interpolation. The following steps are used to compute Log2(L_x) -* -* 1- exponent = 30-norm_exponent -* 2- i = bit25-b31 of L_x; 32<=i<=63 (because of normalization). -* 3- a = bit10-b24 -* 4- i -=32 -* 5- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2 -* -*************************************************************************/ - -void Log2_norm ( - Word32 L_x, /* (i) : input value (normalized) */ - Word16 exp, /* (i) : norm_l (L_x) */ - Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */ - Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */ - ) -{ - Word16 i, a, tmp; - Word32 L_y; - if (L_x <= (Word32) 0) - { - *exponent = 0; - *fraction = 0; - return; - } - *exponent = (30 - exp); - L_x = (L_x >> 9); - i = extract_h (L_x); /* Extract b25-b31 */ - L_x = (L_x >> 1); - a = (Word16)(L_x); /* Extract b10-b24 of fraction */ - a = (Word16)(a & (Word16)0x7fff); - i -= 32; - L_y = L_deposit_h (table[i]); /* table[i] << 16 */ - tmp = vo_sub(table[i], table[i + 1]); /* table[i] - table[i+1] */ - L_y = vo_L_msu (L_y, tmp, a); /* L_y -= tmp*a*2 */ - *fraction = extract_h (L_y); - - return; -} - -/************************************************************************* -* -* FUNCTION: Log2() -* -* PURPOSE: Computes log2(L_x), where L_x is positive. -* If L_x is negative or zero, the result is 0. -* -* DESCRIPTION: -* normalizes L_x and then calls Log2_norm(). -* -*************************************************************************/ - -void Log2 ( - Word32 L_x, /* (i) : input value */ - Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */ - Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */ - ) -{ - Word16 exp; - - exp = norm_l(L_x); - Log2_norm ((L_x << exp), exp, exponent, fraction); -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* * +* File : log2.c * +* Purpose : Computes log2(L_x) * +* * +************************************************************************/ + +#include "log2.h" +/******************************************************************************** +* INCLUDE FILES +*********************************************************************************/ +#include "typedef.h" +#include "basic_op.h" + +/********************************************************************************* +* LOCAL VARIABLES AND TABLES +**********************************************************************************/ +#include "log2_tab.h" /* Table for Log2() */ + +/************************************************************************* +* +* FUNCTION: Log2_norm() +* +* PURPOSE: Computes log2(L_x, exp), where L_x is positive and +* normalized, and exp is the normalisation exponent +* If L_x is negative or zero, the result is 0. +* +* DESCRIPTION: +* The function Log2(L_x) is approximated by a table and linear +* interpolation. The following steps are used to compute Log2(L_x) +* +* 1- exponent = 30-norm_exponent +* 2- i = bit25-b31 of L_x; 32<=i<=63 (because of normalization). +* 3- a = bit10-b24 +* 4- i -=32 +* 5- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2 +* +*************************************************************************/ + +void Log2_norm ( + Word32 L_x, /* (i) : input value (normalized) */ + Word16 exp, /* (i) : norm_l (L_x) */ + Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */ + Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */ + ) +{ + Word16 i, a, tmp; + Word32 L_y; + if (L_x <= (Word32) 0) + { + *exponent = 0; + *fraction = 0; + return; + } + *exponent = (30 - exp); + L_x = (L_x >> 9); + i = extract_h (L_x); /* Extract b25-b31 */ + L_x = (L_x >> 1); + a = (Word16)(L_x); /* Extract b10-b24 of fraction */ + a = (Word16)(a & (Word16)0x7fff); + i -= 32; + L_y = L_deposit_h (table[i]); /* table[i] << 16 */ + tmp = vo_sub(table[i], table[i + 1]); /* table[i] - table[i+1] */ + L_y = vo_L_msu (L_y, tmp, a); /* L_y -= tmp*a*2 */ + *fraction = extract_h (L_y); + + return; +} + +/************************************************************************* +* +* FUNCTION: Log2() +* +* PURPOSE: Computes log2(L_x), where L_x is positive. +* If L_x is negative or zero, the result is 0. +* +* DESCRIPTION: +* normalizes L_x and then calls Log2_norm(). +* +*************************************************************************/ + +void Log2 ( + Word32 L_x, /* (i) : input value */ + Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */ + Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */ + ) +{ + Word16 exp; + + exp = norm_l(L_x); + Log2_norm ((L_x << exp), exp, exponent, fraction); +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c b/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c index 63b746b..29bd46b 100644 --- a/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c +++ b/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c @@ -1,70 +1,70 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: lp_dec2.c * -* * -* Description:Decimate a vector by 2 with 2nd order fir filter * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "cnst.h" - -#define L_FIR 5 -#define L_MEM (L_FIR-2) - -/* static float h_fir[L_FIR] = {0.13, 0.23, 0.28, 0.23, 0.13}; */ -/* fixed-point: sum of coef = 32767 to avoid overflow on DC */ -static Word16 h_fir[L_FIR] = {4260, 7536, 9175, 7536, 4260}; - -void LP_Decim2( - Word16 x[], /* in/out: signal to process */ - Word16 l, /* input : size of filtering */ - Word16 mem[] /* in/out: memory (size=3) */ - ) -{ - Word16 *p_x, x_buf[L_FRAME + L_MEM]; - Word32 i, j; - Word32 L_tmp; - /* copy initial filter states into buffer */ - p_x = x_buf; - for (i = 0; i < L_MEM; i++) - { - *p_x++ = mem[i]; - mem[i] = x[l - L_MEM + i]; - } - for (i = 0; i < l; i++) - { - *p_x++ = x[i]; - } - for (i = 0, j = 0; i < l; i += 2, j++) - { - p_x = &x_buf[i]; - L_tmp = ((*p_x++) * h_fir[0]); - L_tmp += ((*p_x++) * h_fir[1]); - L_tmp += ((*p_x++) * h_fir[2]); - L_tmp += ((*p_x++) * h_fir[3]); - L_tmp += ((*p_x++) * h_fir[4]); - x[j] = (L_tmp + 0x4000)>>15; - } - return; -} - - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: lp_dec2.c * +* * +* Description:Decimate a vector by 2 with 2nd order fir filter * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "cnst.h" + +#define L_FIR 5 +#define L_MEM (L_FIR-2) + +/* static float h_fir[L_FIR] = {0.13, 0.23, 0.28, 0.23, 0.13}; */ +/* fixed-point: sum of coef = 32767 to avoid overflow on DC */ +static Word16 h_fir[L_FIR] = {4260, 7536, 9175, 7536, 4260}; + +void LP_Decim2( + Word16 x[], /* in/out: signal to process */ + Word16 l, /* input : size of filtering */ + Word16 mem[] /* in/out: memory (size=3) */ + ) +{ + Word16 *p_x, x_buf[L_FRAME + L_MEM]; + Word32 i, j; + Word32 L_tmp; + /* copy initial filter states into buffer */ + p_x = x_buf; + for (i = 0; i < L_MEM; i++) + { + *p_x++ = mem[i]; + mem[i] = x[l - L_MEM + i]; + } + for (i = 0; i < l; i++) + { + *p_x++ = x[i]; + } + for (i = 0, j = 0; i < l; i += 2, j++) + { + p_x = &x_buf[i]; + L_tmp = ((*p_x++) * h_fir[0]); + L_tmp += ((*p_x++) * h_fir[1]); + L_tmp += ((*p_x++) * h_fir[2]); + L_tmp += ((*p_x++) * h_fir[3]); + L_tmp += ((*p_x++) * h_fir[4]); + x[j] = (L_tmp + 0x4000)>>15; + } + return; +} + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/math_op.c b/media/libstagefright/codecs/amrwbenc/src/math_op.c index 1c95ed0..1a7b513 100644 --- a/media/libstagefright/codecs/amrwbenc/src/math_op.c +++ b/media/libstagefright/codecs/amrwbenc/src/math_op.c @@ -1,219 +1,219 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*___________________________________________________________________________ -| | -| This file contains mathematic operations in fixed point. | -| | -| Isqrt() : inverse square root (16 bits precision). | -| Pow2() : 2^x (16 bits precision). | -| Log2() : log2 (16 bits precision). | -| Dot_product() : scalar product of | -| | -| These operations are not standard double precision operations. | -| They are used where low complexity is important and the full 32 bits | -| precision is not necessary. For example, the function Div_32() has a | -| 24 bits precision which is enough for our purposes. | -| | -| In this file, the values use theses representations: | -| | -| Word32 L_32 : standard signed 32 bits format | -| Word16 hi, lo : L_32 = hi<<16 + lo<<1 (DPF - Double Precision Format) | -| Word32 frac, Word16 exp : L_32 = frac << exp-31 (normalised format) | -| Word16 int, frac : L_32 = int.frac (fractional format) | -|___________________________________________________________________________| -*/ -#include "typedef.h" -#include "basic_op.h" -#include "math_op.h" - -/*___________________________________________________________________________ -| | -| Function Name : Isqrt | -| | -| Compute 1/sqrt(L_x). | -| if L_x is negative or zero, result is 1 (7fffffff). | -|---------------------------------------------------------------------------| -| Algorithm: | -| | -| 1- Normalization of L_x. | -| 2- call Isqrt_n(L_x, exponant) | -| 3- L_y = L_x << exponant | -|___________________________________________________________________________| -*/ -Word32 Isqrt( /* (o) Q31 : output value (range: 0<=val<1) */ - Word32 L_x /* (i) Q0 : input value (range: 0<=val<=7fffffff) */ - ) -{ - Word16 exp; - Word32 L_y; - exp = norm_l(L_x); - L_x = (L_x << exp); /* L_x is normalized */ - exp = (31 - exp); - Isqrt_n(&L_x, &exp); - L_y = (L_x << exp); /* denormalization */ - return (L_y); -} - -/*___________________________________________________________________________ -| | -| Function Name : Isqrt_n | -| | -| Compute 1/sqrt(value). | -| if value is negative or zero, result is 1 (frac=7fffffff, exp=0). | -|---------------------------------------------------------------------------| -| Algorithm: | -| | -| The function 1/sqrt(value) is approximated by a table and linear | -| interpolation. | -| | -| 1- If exponant is odd then shift fraction right once. | -| 2- exponant = -((exponant-1)>>1) | -| 3- i = bit25-b30 of fraction, 16 <= i <= 63 ->because of normalization. | -| 4- a = bit10-b24 | -| 5- i -=16 | -| 6- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2 | -|___________________________________________________________________________| -*/ -static Word16 table_isqrt[49] = -{ - 32767, 31790, 30894, 30070, 29309, 28602, 27945, 27330, 26755, 26214, - 25705, 25225, 24770, 24339, 23930, 23541, 23170, 22817, 22479, 22155, - 21845, 21548, 21263, 20988, 20724, 20470, 20225, 19988, 19760, 19539, - 19326, 19119, 18919, 18725, 18536, 18354, 18176, 18004, 17837, 17674, - 17515, 17361, 17211, 17064, 16921, 16782, 16646, 16514, 16384 -}; - -void Isqrt_n( - Word32 * frac, /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */ - Word16 * exp /* (i/o) : exponent (value = frac x 2^exponent) */ - ) -{ - Word16 i, a, tmp; - - if (*frac <= (Word32) 0) - { - *exp = 0; - *frac = 0x7fffffffL; - return; - } - - if((*exp & 1) == 1) /*If exponant odd -> shift right */ - *frac = (*frac) >> 1; - - *exp = negate((*exp - 1) >> 1); - - *frac = (*frac >> 9); - i = extract_h(*frac); /* Extract b25-b31 */ - *frac = (*frac >> 1); - a = (Word16)(*frac); /* Extract b10-b24 */ - a = (Word16) (a & (Word16) 0x7fff); - i -= 16; - *frac = L_deposit_h(table_isqrt[i]); /* table[i] << 16 */ - tmp = vo_sub(table_isqrt[i], table_isqrt[i + 1]); /* table[i] - table[i+1]) */ - *frac = vo_L_msu(*frac, tmp, a); /* frac -= tmp*a*2 */ - - return; -} - -/*___________________________________________________________________________ -| | -| Function Name : Pow2() | -| | -| L_x = pow(2.0, exponant.fraction) (exponant = interger part) | -| = pow(2.0, 0.fraction) << exponant | -|---------------------------------------------------------------------------| -| Algorithm: | -| | -| The function Pow2(L_x) is approximated by a table and linear | -| interpolation. | -| | -| 1- i = bit10-b15 of fraction, 0 <= i <= 31 | -| 2- a = bit0-b9 of fraction | -| 3- L_x = table[i]<<16 - (table[i] - table[i+1]) * a * 2 | -| 4- L_x = L_x >> (30-exponant) (with rounding) | -|___________________________________________________________________________| -*/ -static Word16 table_pow2[33] = -{ - 16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911, - 20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726, - 25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706, - 31379, 32066, 32767 -}; - -Word32 Pow2( /* (o) Q0 : result (range: 0<=val<=0x7fffffff) */ - Word16 exponant, /* (i) Q0 : Integer part. (range: 0<=val<=30) */ - Word16 fraction /* (i) Q15 : Fractionnal part. (range: 0.0<=val<1.0) */ - ) -{ - Word16 exp, i, a, tmp; - Word32 L_x; - - L_x = vo_L_mult(fraction, 32); /* L_x = fraction<<6 */ - i = extract_h(L_x); /* Extract b10-b16 of fraction */ - L_x =L_x >> 1; - a = (Word16)(L_x); /* Extract b0-b9 of fraction */ - a = (Word16) (a & (Word16) 0x7fff); - - L_x = L_deposit_h(table_pow2[i]); /* table[i] << 16 */ - tmp = vo_sub(table_pow2[i], table_pow2[i + 1]); /* table[i] - table[i+1] */ - L_x -= (tmp * a)<<1; /* L_x -= tmp*a*2 */ - - exp = vo_sub(30, exponant); - L_x = vo_L_shr_r(L_x, exp); - - return (L_x); -} - -/*___________________________________________________________________________ -| | -| Function Name : Dot_product12() | -| | -| Compute scalar product of using accumulator. | -| | -| The result is normalized (in Q31) with exponent (0..30). | -|---------------------------------------------------------------------------| -| Algorithm: | -| | -| dot_product = sum(x[i]*y[i]) i=0..N-1 | -|___________________________________________________________________________| -*/ - -Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */ - Word16 x[], /* (i) 12bits: x vector */ - Word16 y[], /* (i) 12bits: y vector */ - Word16 lg, /* (i) : vector length */ - Word16 * exp /* (o) : exponent of result (0..+30) */ - ) -{ - Word16 sft; - Word32 i, L_sum; - L_sum = 0; - for (i = 0; i < lg; i++) - { - L_sum += x[i] * y[i]; - } - L_sum = (L_sum << 1) + 1; - /* Normalize acc in Q31 */ - sft = norm_l(L_sum); - L_sum = L_sum << sft; - *exp = 30 - sft; /* exponent = 0..30 */ - return (L_sum); - -} - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*___________________________________________________________________________ +| | +| This file contains mathematic operations in fixed point. | +| | +| Isqrt() : inverse square root (16 bits precision). | +| Pow2() : 2^x (16 bits precision). | +| Log2() : log2 (16 bits precision). | +| Dot_product() : scalar product of | +| | +| These operations are not standard double precision operations. | +| They are used where low complexity is important and the full 32 bits | +| precision is not necessary. For example, the function Div_32() has a | +| 24 bits precision which is enough for our purposes. | +| | +| In this file, the values use theses representations: | +| | +| Word32 L_32 : standard signed 32 bits format | +| Word16 hi, lo : L_32 = hi<<16 + lo<<1 (DPF - Double Precision Format) | +| Word32 frac, Word16 exp : L_32 = frac << exp-31 (normalised format) | +| Word16 int, frac : L_32 = int.frac (fractional format) | +|___________________________________________________________________________| +*/ +#include "typedef.h" +#include "basic_op.h" +#include "math_op.h" + +/*___________________________________________________________________________ +| | +| Function Name : Isqrt | +| | +| Compute 1/sqrt(L_x). | +| if L_x is negative or zero, result is 1 (7fffffff). | +|---------------------------------------------------------------------------| +| Algorithm: | +| | +| 1- Normalization of L_x. | +| 2- call Isqrt_n(L_x, exponant) | +| 3- L_y = L_x << exponant | +|___________________________________________________________________________| +*/ +Word32 Isqrt( /* (o) Q31 : output value (range: 0<=val<1) */ + Word32 L_x /* (i) Q0 : input value (range: 0<=val<=7fffffff) */ + ) +{ + Word16 exp; + Word32 L_y; + exp = norm_l(L_x); + L_x = (L_x << exp); /* L_x is normalized */ + exp = (31 - exp); + Isqrt_n(&L_x, &exp); + L_y = (L_x << exp); /* denormalization */ + return (L_y); +} + +/*___________________________________________________________________________ +| | +| Function Name : Isqrt_n | +| | +| Compute 1/sqrt(value). | +| if value is negative or zero, result is 1 (frac=7fffffff, exp=0). | +|---------------------------------------------------------------------------| +| Algorithm: | +| | +| The function 1/sqrt(value) is approximated by a table and linear | +| interpolation. | +| | +| 1- If exponant is odd then shift fraction right once. | +| 2- exponant = -((exponant-1)>>1) | +| 3- i = bit25-b30 of fraction, 16 <= i <= 63 ->because of normalization. | +| 4- a = bit10-b24 | +| 5- i -=16 | +| 6- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2 | +|___________________________________________________________________________| +*/ +static Word16 table_isqrt[49] = +{ + 32767, 31790, 30894, 30070, 29309, 28602, 27945, 27330, 26755, 26214, + 25705, 25225, 24770, 24339, 23930, 23541, 23170, 22817, 22479, 22155, + 21845, 21548, 21263, 20988, 20724, 20470, 20225, 19988, 19760, 19539, + 19326, 19119, 18919, 18725, 18536, 18354, 18176, 18004, 17837, 17674, + 17515, 17361, 17211, 17064, 16921, 16782, 16646, 16514, 16384 +}; + +void Isqrt_n( + Word32 * frac, /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */ + Word16 * exp /* (i/o) : exponent (value = frac x 2^exponent) */ + ) +{ + Word16 i, a, tmp; + + if (*frac <= (Word32) 0) + { + *exp = 0; + *frac = 0x7fffffffL; + return; + } + + if((*exp & 1) == 1) /*If exponant odd -> shift right */ + *frac = (*frac) >> 1; + + *exp = negate((*exp - 1) >> 1); + + *frac = (*frac >> 9); + i = extract_h(*frac); /* Extract b25-b31 */ + *frac = (*frac >> 1); + a = (Word16)(*frac); /* Extract b10-b24 */ + a = (Word16) (a & (Word16) 0x7fff); + i -= 16; + *frac = L_deposit_h(table_isqrt[i]); /* table[i] << 16 */ + tmp = vo_sub(table_isqrt[i], table_isqrt[i + 1]); /* table[i] - table[i+1]) */ + *frac = vo_L_msu(*frac, tmp, a); /* frac -= tmp*a*2 */ + + return; +} + +/*___________________________________________________________________________ +| | +| Function Name : Pow2() | +| | +| L_x = pow(2.0, exponant.fraction) (exponant = interger part) | +| = pow(2.0, 0.fraction) << exponant | +|---------------------------------------------------------------------------| +| Algorithm: | +| | +| The function Pow2(L_x) is approximated by a table and linear | +| interpolation. | +| | +| 1- i = bit10-b15 of fraction, 0 <= i <= 31 | +| 2- a = bit0-b9 of fraction | +| 3- L_x = table[i]<<16 - (table[i] - table[i+1]) * a * 2 | +| 4- L_x = L_x >> (30-exponant) (with rounding) | +|___________________________________________________________________________| +*/ +static Word16 table_pow2[33] = +{ + 16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911, + 20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726, + 25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706, + 31379, 32066, 32767 +}; + +Word32 Pow2( /* (o) Q0 : result (range: 0<=val<=0x7fffffff) */ + Word16 exponant, /* (i) Q0 : Integer part. (range: 0<=val<=30) */ + Word16 fraction /* (i) Q15 : Fractionnal part. (range: 0.0<=val<1.0) */ + ) +{ + Word16 exp, i, a, tmp; + Word32 L_x; + + L_x = vo_L_mult(fraction, 32); /* L_x = fraction<<6 */ + i = extract_h(L_x); /* Extract b10-b16 of fraction */ + L_x =L_x >> 1; + a = (Word16)(L_x); /* Extract b0-b9 of fraction */ + a = (Word16) (a & (Word16) 0x7fff); + + L_x = L_deposit_h(table_pow2[i]); /* table[i] << 16 */ + tmp = vo_sub(table_pow2[i], table_pow2[i + 1]); /* table[i] - table[i+1] */ + L_x -= (tmp * a)<<1; /* L_x -= tmp*a*2 */ + + exp = vo_sub(30, exponant); + L_x = vo_L_shr_r(L_x, exp); + + return (L_x); +} + +/*___________________________________________________________________________ +| | +| Function Name : Dot_product12() | +| | +| Compute scalar product of using accumulator. | +| | +| The result is normalized (in Q31) with exponent (0..30). | +|---------------------------------------------------------------------------| +| Algorithm: | +| | +| dot_product = sum(x[i]*y[i]) i=0..N-1 | +|___________________________________________________________________________| +*/ + +Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */ + Word16 x[], /* (i) 12bits: x vector */ + Word16 y[], /* (i) 12bits: y vector */ + Word16 lg, /* (i) : vector length */ + Word16 * exp /* (o) : exponent of result (0..+30) */ + ) +{ + Word16 sft; + Word32 i, L_sum; + L_sum = 0; + for (i = 0; i < lg; i++) + { + L_sum += x[i] * y[i]; + } + L_sum = (L_sum << 1) + 1; + /* Normalize acc in Q31 */ + sft = norm_l(L_sum); + L_sum = L_sum << sft; + *exp = 30 - sft; /* exponent = 0..30 */ + return (L_sum); + +} + + diff --git a/media/libstagefright/codecs/amrwbenc/src/oper_32b.c b/media/libstagefright/codecs/amrwbenc/src/oper_32b.c index 5f1523e..27cad76 100644 --- a/media/libstagefright/codecs/amrwbenc/src/oper_32b.c +++ b/media/libstagefright/codecs/amrwbenc/src/oper_32b.c @@ -1,223 +1,223 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/***************************************************************************** - * This file contains operations in double precision. * - * These operations are not standard double precision operations. * - * They are used where single precision is not enough but the full 32 bits * - * precision is not necessary. For example, the function Div_32() has a * - * 24 bits precision which is enough for our purposes. * - * * - * The double precision numbers use a special representation: * - * * - * L_32 = hi<<16 + lo<<1 * - * * - * L_32 is a 32 bit integer. * - * hi and lo are 16 bit signed integers. * - * As the low part also contains the sign, this allows fast multiplication. * - * * - * 0x8000 0000 <= L_32 <= 0x7fff fffe. * - * * - * We will use DPF (Double Precision Format )in this file to specify * - * this special format. * - ***************************************************************************** -*/ -#include "typedef.h" -#include "basic_op.h" -#include "oper_32b.h" - -/***************************************************************************** - * * - * Function L_Extract() * - * * - * Extract from a 32 bit integer two 16 bit DPF. * - * * - * Arguments: * - * * - * L_32 : 32 bit integer. * - * 0x8000 0000 <= L_32 <= 0x7fff ffff. * - * hi : b16 to b31 of L_32 * - * lo : (L_32 - hi<<16)>>1 * - ***************************************************************************** -*/ - -__inline void VO_L_Extract (Word32 L_32, Word16 *hi, Word16 *lo) -{ - *hi = (Word16)(L_32 >> 16); - *lo = (Word16)((L_32 & 0xffff) >> 1); - return; -} - -/***************************************************************************** - * * - * Function L_Comp() * - * * - * Compose from two 16 bit DPF a 32 bit integer. * - * * - * L_32 = hi<<16 + lo<<1 * - * * - * Arguments: * - * * - * hi msb * - * lo lsf (with sign) * - * * - * Return Value : * - * * - * 32 bit long signed integer (Word32) whose value falls in the * - * range : 0x8000 0000 <= L_32 <= 0x7fff fff0. * - * * - ***************************************************************************** -*/ - -Word32 L_Comp (Word16 hi, Word16 lo) -{ - Word32 L_32; - - L_32 = L_deposit_h (hi); - - return (L_mac (L_32, lo, 1)); /* = hi<<16 + lo<<1 */ -} - -/***************************************************************************** - * Function Mpy_32() * - * * - * Multiply two 32 bit integers (DPF). The result is divided by 2**31 * - * * - * L_32 = (hi1*hi2)<<1 + ( (hi1*lo2)>>15 + (lo1*hi2)>>15 )<<1 * - * * - * This operation can also be viewed as the multiplication of two Q31 * - * number and the result is also in Q31. * - * * - * Arguments: * - * * - * hi1 hi part of first number * - * lo1 lo part of first number * - * hi2 hi part of second number * - * lo2 lo part of second number * - * * - ***************************************************************************** -*/ - -__inline Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2) -{ - Word32 L_32; - L_32 = (hi1 * hi2); - L_32 += (hi1 * lo2) >> 15; - L_32 += (lo1 * hi2) >> 15; - L_32 <<= 1; - - return (L_32); -} - -/***************************************************************************** - * Function Mpy_32_16() * - * * - * Multiply a 16 bit integer by a 32 bit (DPF). The result is divided * - * by 2**15 * - * * - * * - * L_32 = (hi1*lo2)<<1 + ((lo1*lo2)>>15)<<1 * - * * - * Arguments: * - * * - * hi hi part of 32 bit number. * - * lo lo part of 32 bit number. * - * n 16 bit number. * - * * - ***************************************************************************** -*/ - -__inline Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n) -{ - Word32 L_32; - - L_32 = (hi * n)<<1; - L_32 += (((lo * n)>>15)<<1); - - return (L_32); -} - -/***************************************************************************** - * * - * Function Name : Div_32 * - * * - * Purpose : * - * Fractional integer division of two 32 bit numbers. * - * L_num / L_denom. * - * L_num and L_denom must be positive and L_num < L_denom. * - * L_denom = denom_hi<<16 + denom_lo<<1 * - * denom_hi is a normalize number. * - * * - * Inputs : * - * * - * L_num * - * 32 bit long signed integer (Word32) whose value falls in the * - * range : 0x0000 0000 < L_num < L_denom * - * * - * L_denom = denom_hi<<16 + denom_lo<<1 (DPF) * - * * - * denom_hi * - * 16 bit positive normalized integer whose value falls in the * - * range : 0x4000 < hi < 0x7fff * - * denom_lo * - * 16 bit positive integer whose value falls in the * - * range : 0 < lo < 0x7fff * - * * - * Return Value : * - * * - * L_div * - * 32 bit long signed integer (Word32) whose value falls in the * - * range : 0x0000 0000 <= L_div <= 0x7fff ffff. * - * * - * Algorithm: * - * * - * - find = 1/L_denom. * - * First approximation: approx = 1 / denom_hi * - * 1/L_denom = approx * (2.0 - L_denom * approx ) * - * * - * - result = L_num * (1/L_denom) * - ***************************************************************************** -*/ - -Word32 Div_32 (Word32 L_num, Word16 denom_hi, Word16 denom_lo) -{ - Word16 approx, hi, lo, n_hi, n_lo; - Word32 L_32; - - /* First approximation: 1 / L_denom = 1/denom_hi */ - - approx = div_s ((Word16) 0x3fff, denom_hi); - - /* 1/L_denom = approx * (2.0 - L_denom * approx) */ - - L_32 = Mpy_32_16 (denom_hi, denom_lo, approx); - - L_32 = L_sub ((Word32) 0x7fffffffL, L_32); - hi = L_32 >> 16; - lo = (L_32 & 0xffff) >> 1; - - L_32 = Mpy_32_16 (hi, lo, approx); - - /* L_num * (1/L_denom) */ - hi = L_32 >> 16; - lo = (L_32 & 0xffff) >> 1; - VO_L_Extract (L_num, &n_hi, &n_lo); - L_32 = Mpy_32 (n_hi, n_lo, hi, lo); - L_32 = L_shl2(L_32, 2); - - return (L_32); -} - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/***************************************************************************** + * This file contains operations in double precision. * + * These operations are not standard double precision operations. * + * They are used where single precision is not enough but the full 32 bits * + * precision is not necessary. For example, the function Div_32() has a * + * 24 bits precision which is enough for our purposes. * + * * + * The double precision numbers use a special representation: * + * * + * L_32 = hi<<16 + lo<<1 * + * * + * L_32 is a 32 bit integer. * + * hi and lo are 16 bit signed integers. * + * As the low part also contains the sign, this allows fast multiplication. * + * * + * 0x8000 0000 <= L_32 <= 0x7fff fffe. * + * * + * We will use DPF (Double Precision Format )in this file to specify * + * this special format. * + ***************************************************************************** +*/ +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" + +/***************************************************************************** + * * + * Function L_Extract() * + * * + * Extract from a 32 bit integer two 16 bit DPF. * + * * + * Arguments: * + * * + * L_32 : 32 bit integer. * + * 0x8000 0000 <= L_32 <= 0x7fff ffff. * + * hi : b16 to b31 of L_32 * + * lo : (L_32 - hi<<16)>>1 * + ***************************************************************************** +*/ + +__inline void VO_L_Extract (Word32 L_32, Word16 *hi, Word16 *lo) +{ + *hi = (Word16)(L_32 >> 16); + *lo = (Word16)((L_32 & 0xffff) >> 1); + return; +} + +/***************************************************************************** + * * + * Function L_Comp() * + * * + * Compose from two 16 bit DPF a 32 bit integer. * + * * + * L_32 = hi<<16 + lo<<1 * + * * + * Arguments: * + * * + * hi msb * + * lo lsf (with sign) * + * * + * Return Value : * + * * + * 32 bit long signed integer (Word32) whose value falls in the * + * range : 0x8000 0000 <= L_32 <= 0x7fff fff0. * + * * + ***************************************************************************** +*/ + +Word32 L_Comp (Word16 hi, Word16 lo) +{ + Word32 L_32; + + L_32 = L_deposit_h (hi); + + return (L_mac (L_32, lo, 1)); /* = hi<<16 + lo<<1 */ +} + +/***************************************************************************** + * Function Mpy_32() * + * * + * Multiply two 32 bit integers (DPF). The result is divided by 2**31 * + * * + * L_32 = (hi1*hi2)<<1 + ( (hi1*lo2)>>15 + (lo1*hi2)>>15 )<<1 * + * * + * This operation can also be viewed as the multiplication of two Q31 * + * number and the result is also in Q31. * + * * + * Arguments: * + * * + * hi1 hi part of first number * + * lo1 lo part of first number * + * hi2 hi part of second number * + * lo2 lo part of second number * + * * + ***************************************************************************** +*/ + +__inline Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2) +{ + Word32 L_32; + L_32 = (hi1 * hi2); + L_32 += (hi1 * lo2) >> 15; + L_32 += (lo1 * hi2) >> 15; + L_32 <<= 1; + + return (L_32); +} + +/***************************************************************************** + * Function Mpy_32_16() * + * * + * Multiply a 16 bit integer by a 32 bit (DPF). The result is divided * + * by 2**15 * + * * + * * + * L_32 = (hi1*lo2)<<1 + ((lo1*lo2)>>15)<<1 * + * * + * Arguments: * + * * + * hi hi part of 32 bit number. * + * lo lo part of 32 bit number. * + * n 16 bit number. * + * * + ***************************************************************************** +*/ + +__inline Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n) +{ + Word32 L_32; + + L_32 = (hi * n)<<1; + L_32 += (((lo * n)>>15)<<1); + + return (L_32); +} + +/***************************************************************************** + * * + * Function Name : Div_32 * + * * + * Purpose : * + * Fractional integer division of two 32 bit numbers. * + * L_num / L_denom. * + * L_num and L_denom must be positive and L_num < L_denom. * + * L_denom = denom_hi<<16 + denom_lo<<1 * + * denom_hi is a normalize number. * + * * + * Inputs : * + * * + * L_num * + * 32 bit long signed integer (Word32) whose value falls in the * + * range : 0x0000 0000 < L_num < L_denom * + * * + * L_denom = denom_hi<<16 + denom_lo<<1 (DPF) * + * * + * denom_hi * + * 16 bit positive normalized integer whose value falls in the * + * range : 0x4000 < hi < 0x7fff * + * denom_lo * + * 16 bit positive integer whose value falls in the * + * range : 0 < lo < 0x7fff * + * * + * Return Value : * + * * + * L_div * + * 32 bit long signed integer (Word32) whose value falls in the * + * range : 0x0000 0000 <= L_div <= 0x7fff ffff. * + * * + * Algorithm: * + * * + * - find = 1/L_denom. * + * First approximation: approx = 1 / denom_hi * + * 1/L_denom = approx * (2.0 - L_denom * approx ) * + * * + * - result = L_num * (1/L_denom) * + ***************************************************************************** +*/ + +Word32 Div_32 (Word32 L_num, Word16 denom_hi, Word16 denom_lo) +{ + Word16 approx, hi, lo, n_hi, n_lo; + Word32 L_32; + + /* First approximation: 1 / L_denom = 1/denom_hi */ + + approx = div_s ((Word16) 0x3fff, denom_hi); + + /* 1/L_denom = approx * (2.0 - L_denom * approx) */ + + L_32 = Mpy_32_16 (denom_hi, denom_lo, approx); + + L_32 = L_sub ((Word32) 0x7fffffffL, L_32); + hi = L_32 >> 16; + lo = (L_32 & 0xffff) >> 1; + + L_32 = Mpy_32_16 (hi, lo, approx); + + /* L_num * (1/L_denom) */ + hi = L_32 >> 16; + lo = (L_32 & 0xffff) >> 1; + VO_L_Extract (L_num, &n_hi, &n_lo); + L_32 = Mpy_32 (n_hi, n_lo, hi, lo); + L_32 = L_shl2(L_32, 2); + + return (L_32); +} + diff --git a/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c b/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c index 39ee966..08f430f 100644 --- a/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c +++ b/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c @@ -1,256 +1,256 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: p_med_ol.c * -* * -* Description: Compute the open loop pitch lag * -* output: open loop pitch lag * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "acelp.h" -#include "oper_32b.h" -#include "math_op.h" -#include "p_med_ol.tab" - -Word16 Pitch_med_ol( - Word16 wsp[], /* i: signal used to compute the open loop pitch*/ - /* wsp[-pit_max] to wsp[-1] should be known */ - Coder_State *st, /* i/o: codec global structure */ - Word16 L_frame /* i: length of frame to compute pitch */ - ) -{ - Word16 Tm; - Word16 hi, lo; - Word16 *ww, *we, *hp_wsp; - Word16 exp_R0, exp_R1, exp_R2; - Word32 i, j, max, R0, R1, R2; - Word16 *p1, *p2; - Word16 L_min = 17; /* minimum pitch lag: PIT_MIN / OPL_DECIM */ - Word16 L_max = 115; /* maximum pitch lag: PIT_MAX / OPL_DECIM */ - Word16 L_0 = st->old_T0_med; /* old open-loop pitch */ - Word16 *gain = &(st->ol_gain); /* normalize correlation of hp_wsp for the lag */ - Word16 *hp_wsp_mem = st->hp_wsp_mem; /* memory of the hypass filter for hp_wsp[] (lg = 9)*/ - Word16 *old_hp_wsp = st->old_hp_wsp; /* hypass wsp[] */ - Word16 wght_flg = st->ol_wght_flg; /* is weighting function used */ - - ww = &corrweight[198]; - we = &corrweight[98 + L_max - L_0]; - - max = MIN_32; - Tm = 0; - for (i = L_max; i > L_min; i--) - { - /* Compute the correlation */ - R0 = 0; - p1 = wsp; - p2 = &wsp[-i]; - for (j = 0; j < L_frame; j+=4) - { - R0 += vo_L_mult((*p1++), (*p2++)); - R0 += vo_L_mult((*p1++), (*p2++)); - R0 += vo_L_mult((*p1++), (*p2++)); - R0 += vo_L_mult((*p1++), (*p2++)); - } - /* Weighting of the correlation function. */ - hi = R0>>16; - lo = (R0 & 0xffff)>>1; - - R0 = Mpy_32_16(hi, lo, *ww); - ww--; - - if ((L_0 > 0) && (wght_flg > 0)) - { - /* Weight the neighbourhood of the old lag. */ - hi = R0>>16; - lo = (R0 & 0xffff)>>1; - R0 = Mpy_32_16(hi, lo, *we); - we--; - } - if(R0 >= max) - { - max = R0; - Tm = i; - } - } - - /* Hypass the wsp[] vector */ - hp_wsp = old_hp_wsp + L_max; - Hp_wsp(wsp, hp_wsp, L_frame, hp_wsp_mem); - - /* Compute normalize correlation at delay Tm */ - R0 = 0; - R1 = 0; - R2 = 0; - p1 = hp_wsp; - p2 = hp_wsp - Tm; - for (j = 0; j < L_frame; j+=4) - { - R2 += vo_mult32(*p1, *p1); - R1 += vo_mult32(*p2, *p2); - R0 += vo_mult32(*p1++, *p2++); - R2 += vo_mult32(*p1, *p1); - R1 += vo_mult32(*p2, *p2); - R0 += vo_mult32(*p1++, *p2++); - R2 += vo_mult32(*p1, *p1); - R1 += vo_mult32(*p2, *p2); - R0 += vo_mult32(*p1++, *p2++); - R2 += vo_mult32(*p1, *p1); - R1 += vo_mult32(*p2, *p2); - R0 += vo_mult32(*p1++, *p2++); - } - R0 = R0 <<1; - R1 = (R1 <<1) + 1L; - R2 = (R2 <<1) + 1L; - /* gain = R0/ sqrt(R1*R2) */ - - exp_R0 = norm_l(R0); - R0 = (R0 << exp_R0); - - exp_R1 = norm_l(R1); - R1 = (R1 << exp_R1); - - exp_R2 = norm_l(R2); - R2 = (R2 << exp_R2); - - - R1 = vo_L_mult(vo_round(R1), vo_round(R2)); - - i = norm_l(R1); - R1 = (R1 << i); - - exp_R1 += exp_R2; - exp_R1 += i; - exp_R1 = 62 - exp_R1; - - Isqrt_n(&R1, &exp_R1); - - R0 = vo_L_mult(voround(R0), voround(R1)); - exp_R0 = 31 - exp_R0; - exp_R0 += exp_R1; - - *gain = vo_round(L_shl(R0, exp_R0)); - - /* Shitf hp_wsp[] for next frame */ - - for (i = 0; i < L_max; i++) - { - old_hp_wsp[i] = old_hp_wsp[i + L_frame]; - } - - return (Tm); -} - -/************************************************************************ -* Function: median5 * -* * -* Returns the median of the set {X[-2], X[-1],..., X[2]}, * -* whose elements are 16-bit integers. * -* * -* Input: * -* X[-2:2] 16-bit integers. * -* * -* Return: * -* The median of {X[-2], X[-1],..., X[2]}. * -************************************************************************/ - -Word16 median5(Word16 x[]) -{ - Word16 x1, x2, x3, x4, x5; - Word16 tmp; - - x1 = x[-2]; - x2 = x[-1]; - x3 = x[0]; - x4 = x[1]; - x5 = x[2]; - - if (x2 < x1) - { - tmp = x1; - x1 = x2; - x2 = tmp; - } - if (x3 < x1) - { - tmp = x1; - x1 = x3; - x3 = tmp; - } - if (x4 < x1) - { - tmp = x1; - x1 = x4; - x4 = tmp; - } - if (x5 < x1) - { - x5 = x1; - } - if (x3 < x2) - { - tmp = x2; - x2 = x3; - x3 = tmp; - } - if (x4 < x2) - { - tmp = x2; - x2 = x4; - x4 = tmp; - } - if (x5 < x2) - { - x5 = x2; - } - if (x4 < x3) - { - x3 = x4; - } - if (x5 < x3) - { - x3 = x5; - } - return (x3); -} - - -Word16 Med_olag( /* output : median of 5 previous open-loop lags */ - Word16 prev_ol_lag, /* input : previous open-loop lag */ - Word16 old_ol_lag[5] - ) -{ - Word32 i; - - /* Use median of 5 previous open-loop lags as old lag */ - - for (i = 4; i > 0; i--) - { - old_ol_lag[i] = old_ol_lag[i - 1]; - } - - old_ol_lag[0] = prev_ol_lag; - - i = median5(&old_ol_lag[2]); - - return i; - -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: p_med_ol.c * +* * +* Description: Compute the open loop pitch lag * +* output: open loop pitch lag * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "acelp.h" +#include "oper_32b.h" +#include "math_op.h" +#include "p_med_ol.tab" + +Word16 Pitch_med_ol( + Word16 wsp[], /* i: signal used to compute the open loop pitch*/ + /* wsp[-pit_max] to wsp[-1] should be known */ + Coder_State *st, /* i/o: codec global structure */ + Word16 L_frame /* i: length of frame to compute pitch */ + ) +{ + Word16 Tm; + Word16 hi, lo; + Word16 *ww, *we, *hp_wsp; + Word16 exp_R0, exp_R1, exp_R2; + Word32 i, j, max, R0, R1, R2; + Word16 *p1, *p2; + Word16 L_min = 17; /* minimum pitch lag: PIT_MIN / OPL_DECIM */ + Word16 L_max = 115; /* maximum pitch lag: PIT_MAX / OPL_DECIM */ + Word16 L_0 = st->old_T0_med; /* old open-loop pitch */ + Word16 *gain = &(st->ol_gain); /* normalize correlation of hp_wsp for the lag */ + Word16 *hp_wsp_mem = st->hp_wsp_mem; /* memory of the hypass filter for hp_wsp[] (lg = 9)*/ + Word16 *old_hp_wsp = st->old_hp_wsp; /* hypass wsp[] */ + Word16 wght_flg = st->ol_wght_flg; /* is weighting function used */ + + ww = &corrweight[198]; + we = &corrweight[98 + L_max - L_0]; + + max = MIN_32; + Tm = 0; + for (i = L_max; i > L_min; i--) + { + /* Compute the correlation */ + R0 = 0; + p1 = wsp; + p2 = &wsp[-i]; + for (j = 0; j < L_frame; j+=4) + { + R0 += vo_L_mult((*p1++), (*p2++)); + R0 += vo_L_mult((*p1++), (*p2++)); + R0 += vo_L_mult((*p1++), (*p2++)); + R0 += vo_L_mult((*p1++), (*p2++)); + } + /* Weighting of the correlation function. */ + hi = R0>>16; + lo = (R0 & 0xffff)>>1; + + R0 = Mpy_32_16(hi, lo, *ww); + ww--; + + if ((L_0 > 0) && (wght_flg > 0)) + { + /* Weight the neighbourhood of the old lag. */ + hi = R0>>16; + lo = (R0 & 0xffff)>>1; + R0 = Mpy_32_16(hi, lo, *we); + we--; + } + if(R0 >= max) + { + max = R0; + Tm = i; + } + } + + /* Hypass the wsp[] vector */ + hp_wsp = old_hp_wsp + L_max; + Hp_wsp(wsp, hp_wsp, L_frame, hp_wsp_mem); + + /* Compute normalize correlation at delay Tm */ + R0 = 0; + R1 = 0; + R2 = 0; + p1 = hp_wsp; + p2 = hp_wsp - Tm; + for (j = 0; j < L_frame; j+=4) + { + R2 += vo_mult32(*p1, *p1); + R1 += vo_mult32(*p2, *p2); + R0 += vo_mult32(*p1++, *p2++); + R2 += vo_mult32(*p1, *p1); + R1 += vo_mult32(*p2, *p2); + R0 += vo_mult32(*p1++, *p2++); + R2 += vo_mult32(*p1, *p1); + R1 += vo_mult32(*p2, *p2); + R0 += vo_mult32(*p1++, *p2++); + R2 += vo_mult32(*p1, *p1); + R1 += vo_mult32(*p2, *p2); + R0 += vo_mult32(*p1++, *p2++); + } + R0 = R0 <<1; + R1 = (R1 <<1) + 1L; + R2 = (R2 <<1) + 1L; + /* gain = R0/ sqrt(R1*R2) */ + + exp_R0 = norm_l(R0); + R0 = (R0 << exp_R0); + + exp_R1 = norm_l(R1); + R1 = (R1 << exp_R1); + + exp_R2 = norm_l(R2); + R2 = (R2 << exp_R2); + + + R1 = vo_L_mult(vo_round(R1), vo_round(R2)); + + i = norm_l(R1); + R1 = (R1 << i); + + exp_R1 += exp_R2; + exp_R1 += i; + exp_R1 = 62 - exp_R1; + + Isqrt_n(&R1, &exp_R1); + + R0 = vo_L_mult(voround(R0), voround(R1)); + exp_R0 = 31 - exp_R0; + exp_R0 += exp_R1; + + *gain = vo_round(L_shl(R0, exp_R0)); + + /* Shitf hp_wsp[] for next frame */ + + for (i = 0; i < L_max; i++) + { + old_hp_wsp[i] = old_hp_wsp[i + L_frame]; + } + + return (Tm); +} + +/************************************************************************ +* Function: median5 * +* * +* Returns the median of the set {X[-2], X[-1],..., X[2]}, * +* whose elements are 16-bit integers. * +* * +* Input: * +* X[-2:2] 16-bit integers. * +* * +* Return: * +* The median of {X[-2], X[-1],..., X[2]}. * +************************************************************************/ + +Word16 median5(Word16 x[]) +{ + Word16 x1, x2, x3, x4, x5; + Word16 tmp; + + x1 = x[-2]; + x2 = x[-1]; + x3 = x[0]; + x4 = x[1]; + x5 = x[2]; + + if (x2 < x1) + { + tmp = x1; + x1 = x2; + x2 = tmp; + } + if (x3 < x1) + { + tmp = x1; + x1 = x3; + x3 = tmp; + } + if (x4 < x1) + { + tmp = x1; + x1 = x4; + x4 = tmp; + } + if (x5 < x1) + { + x5 = x1; + } + if (x3 < x2) + { + tmp = x2; + x2 = x3; + x3 = tmp; + } + if (x4 < x2) + { + tmp = x2; + x2 = x4; + x4 = tmp; + } + if (x5 < x2) + { + x5 = x2; + } + if (x4 < x3) + { + x3 = x4; + } + if (x5 < x3) + { + x3 = x5; + } + return (x3); +} + + +Word16 Med_olag( /* output : median of 5 previous open-loop lags */ + Word16 prev_ol_lag, /* input : previous open-loop lag */ + Word16 old_ol_lag[5] + ) +{ + Word32 i; + + /* Use median of 5 previous open-loop lags as old lag */ + + for (i = 4; i > 0; i--) + { + old_ol_lag[i] = old_ol_lag[i - 1]; + } + + old_ol_lag[0] = prev_ol_lag; + + i = median5(&old_ol_lag[2]); + + return i; + +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c b/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c index c8a227c..6f55b8f 100644 --- a/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c +++ b/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c @@ -1,49 +1,49 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: pit_shrp.c * -* * -* Description: Performs Pitch sharpening routine * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" - -void Pit_shrp( - Word16 * x, /* in/out: impulse response (or algebraic code) */ - Word16 pit_lag, /* input : pitch lag */ - Word16 sharp, /* input : pitch sharpening factor (Q15) */ - Word16 L_subfr /* input : subframe size */ - ) -{ - Word32 i; - Word32 L_tmp; - Word16 *x_ptr = x + pit_lag; - - for (i = pit_lag; i < L_subfr; i++) - { - L_tmp = (*x_ptr << 15); - L_tmp += *x++ * sharp; - *x_ptr++ = ((L_tmp + 0x4000)>>15); - } - - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: pit_shrp.c * +* * +* Description: Performs Pitch sharpening routine * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" + +void Pit_shrp( + Word16 * x, /* in/out: impulse response (or algebraic code) */ + Word16 pit_lag, /* input : pitch lag */ + Word16 sharp, /* input : pitch sharpening factor (Q15) */ + Word16 L_subfr /* input : subframe size */ + ) +{ + Word32 i; + Word32 L_tmp; + Word16 *x_ptr = x + pit_lag; + + for (i = pit_lag; i < L_subfr; i++) + { + L_tmp = (*x_ptr << 15); + L_tmp += *x++ * sharp; + *x_ptr++ = ((L_tmp + 0x4000)>>15); + } + + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c b/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c index c115b11..41d7413 100644 --- a/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c +++ b/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c @@ -1,324 +1,324 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: pitch_f4.c * -* * -* Description: Find the closed loop pitch period with * -* 1/4 subsample resolution. * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "math_op.h" -#include "acelp.h" -#include "cnst.h" - -#define UP_SAMP 4 -#define L_INTERPOL1 4 - -/* Local functions */ - -#ifdef ASM_OPT -void Norm_corr_asm( - Word16 exc[], /* (i) : excitation buffer */ - Word16 xn[], /* (i) : target vector */ - Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */ - Word16 L_subfr, - Word16 t_min, /* (i) : minimum value of pitch lag. */ - Word16 t_max, /* (i) : maximum value of pitch lag. */ - Word16 corr_norm[] /* (o) Q15 : normalized correlation */ - ); -#else -static void Norm_Corr( - Word16 exc[], /* (i) : excitation buffer */ - Word16 xn[], /* (i) : target vector */ - Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */ - Word16 L_subfr, - Word16 t_min, /* (i) : minimum value of pitch lag. */ - Word16 t_max, /* (i) : maximum value of pitch lag. */ - Word16 corr_norm[] /* (o) Q15 : normalized correlation */ - ); -#endif - -static Word16 Interpol_4( /* (o) : interpolated value */ - Word16 * x, /* (i) : input vector */ - Word32 frac /* (i) : fraction (-4..+3) */ - ); - - -Word16 Pitch_fr4( /* (o) : pitch period. */ - Word16 exc[], /* (i) : excitation buffer */ - Word16 xn[], /* (i) : target vector */ - Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */ - Word16 t0_min, /* (i) : minimum value in the searched range. */ - Word16 t0_max, /* (i) : maximum value in the searched range. */ - Word16 * pit_frac, /* (o) : chosen fraction (0, 1, 2 or 3). */ - Word16 i_subfr, /* (i) : indicator for first subframe. */ - Word16 t0_fr2, /* (i) : minimum value for resolution 1/2 */ - Word16 t0_fr1, /* (i) : minimum value for resolution 1 */ - Word16 L_subfr /* (i) : Length of subframe */ - ) -{ - Word32 fraction, i; - Word16 t_min, t_max; - Word16 max, t0, step, temp; - Word16 *corr; - Word16 corr_v[40]; /* Total length = t0_max-t0_min+1+2*L_inter */ - - /* Find interval to compute normalized correlation */ - - t_min = t0_min - L_INTERPOL1; - t_max = t0_max + L_INTERPOL1; - corr = &corr_v[-t_min]; - /* Compute normalized correlation between target and filtered excitation */ -#ifdef ASM_OPT /* asm optimization branch */ - Norm_corr_asm(exc, xn, h, L_subfr, t_min, t_max, corr); -#else - Norm_Corr(exc, xn, h, L_subfr, t_min, t_max, corr); -#endif - - /* Find integer pitch */ - - max = corr[t0_min]; - t0 = t0_min; - for (i = t0_min + 1; i <= t0_max; i++) - { - if (corr[i] >= max) - { - max = corr[i]; - t0 = i; - } - } - /* If first subframe and t0 >= t0_fr1, do not search fractionnal pitch */ - if ((i_subfr == 0) && (t0 >= t0_fr1)) - { - *pit_frac = 0; - return (t0); - } - /*------------------------------------------------------------------* - * Search fractionnal pitch with 1/4 subsample resolution. * - * Test the fractions around t0 and choose the one which maximizes * - * the interpolated normalized correlation. * - *------------------------------------------------------------------*/ - - step = 1; /* 1/4 subsample resolution */ - fraction = -3; - if ((t0_fr2 == PIT_MIN)||((i_subfr == 0) && (t0 >= t0_fr2))) - { - step = 2; /* 1/2 subsample resolution */ - fraction = -2; - } - if(t0 == t0_min) - { - fraction = 0; - } - max = Interpol_4(&corr[t0], fraction); - - for (i = fraction + step; i <= 3; i += step) - { - temp = Interpol_4(&corr[t0], i); - if(temp > max) - { - max = temp; - fraction = i; - } - } - /* limit the fraction value in the interval [0,1,2,3] */ - if (fraction < 0) - { - fraction += UP_SAMP; - t0 -= 1; - } - *pit_frac = fraction; - return (t0); -} - - -/*********************************************************************************** -* Function: Norm_Corr() * -* * -* Description: Find the normalized correlation between the target vector and the * -* filtered past excitation. * -* (correlation between target and filtered excitation divided by the * -* square root of energy of target and filtered excitation). * -************************************************************************************/ -#ifndef ASM_OPT -static void Norm_Corr( - Word16 exc[], /* (i) : excitation buffer */ - Word16 xn[], /* (i) : target vector */ - Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */ - Word16 L_subfr, - Word16 t_min, /* (i) : minimum value of pitch lag. */ - Word16 t_max, /* (i) : maximum value of pitch lag. */ - Word16 corr_norm[]) /* (o) Q15 : normalized correlation */ -{ - Word32 i, k, t; - Word32 corr, exp_corr, norm, exp, scale; - Word16 exp_norm, excf[L_SUBFR], tmp; - Word32 L_tmp, L_tmp1, L_tmp2; - - /* compute the filtered excitation for the first delay t_min */ - k = -t_min; - -#ifdef ASM_OPT /* asm optimization branch */ - Convolve_asm(&exc[k], h, excf, 64); -#else - Convolve(&exc[k], h, excf, 64); -#endif - - /* Compute rounded down 1/sqrt(energy of xn[]) */ - L_tmp = 0; - for (i = 0; i < 64; i+=4) - { - L_tmp += (xn[i] * xn[i]); - L_tmp += (xn[i+1] * xn[i+1]); - L_tmp += (xn[i+2] * xn[i+2]); - L_tmp += (xn[i+3] * xn[i+3]); - } - - L_tmp = (L_tmp << 1) + 1; - exp = norm_l(L_tmp); - exp = (32 - exp); - //exp = exp + 2; /* energy of xn[] x 2 + rounded up */ - scale = -(exp >> 1); /* (1<> L_tmp2; - } - else - { - L_tmp = L_tmp << L_tmp2; - } - - corr_norm[t] = vo_round(L_tmp); - /* modify the filtered excitation excf[] for the next iteration */ - - if(t != t_max) - { - k = -(t + 1); - tmp = exc[k]; - for (i = 63; i > 0; i--) - { - excf[i] = add1(vo_mult(tmp, h[i]), excf[i - 1]); - } - excf[0] = vo_mult(tmp, h[0]); - } - } - return; -} - -#endif -/************************************************************************************ -* Function: Interpol_4() * -* * -* Description: For interpolating the normalized correlation with 1/4 resolution. * -**************************************************************************************/ - -/* 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) in Q14 */ -static Word16 inter4_1[4][8] = -{ - {-12, 420, -1732, 5429, 13418, -1242, 73, 32}, - {-26, 455, -2142, 9910, 9910, -2142, 455, -26}, - {32, 73, -1242, 13418, 5429, -1732, 420, -12}, - {206, -766, 1376, 14746, 1376, -766, 206, 0} -}; - -/*** Coefficients in floating point -static float inter4_1[UP_SAMP*L_INTERPOL1+1] = { -0.900000, -0.818959, 0.604850, 0.331379, 0.083958, --0.075795, -0.130717, -0.105685, -0.046774, -0.004467, 0.027789, 0.025642, 0.012571, -0.001927, -0.001571, -0.000753, 0.000000}; -***/ - -static Word16 Interpol_4( /* (o) : interpolated value */ - Word16 * x, /* (i) : input vector */ - Word32 frac /* (i) : fraction (-4..+3) */ - ) -{ - Word16 sum; - Word32 k, L_sum; - Word16 *ptr; - - if (frac < 0) - { - frac += UP_SAMP; - x--; - } - x = x - L_INTERPOL1 + 1; - k = UP_SAMP - 1 - frac; - ptr = &(inter4_1[k][0]); - - L_sum = vo_mult32(x[0], (*ptr++)); - L_sum += vo_mult32(x[1], (*ptr++)); - L_sum += vo_mult32(x[2], (*ptr++)); - L_sum += vo_mult32(x[3], (*ptr++)); - L_sum += vo_mult32(x[4], (*ptr++)); - L_sum += vo_mult32(x[5], (*ptr++)); - L_sum += vo_mult32(x[6], (*ptr++)); - L_sum += vo_mult32(x[7], (*ptr++)); - - sum = extract_h(L_add(L_shl2(L_sum, 2), 0x8000)); - return (sum); -} - - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: pitch_f4.c * +* * +* Description: Find the closed loop pitch period with * +* 1/4 subsample resolution. * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "math_op.h" +#include "acelp.h" +#include "cnst.h" + +#define UP_SAMP 4 +#define L_INTERPOL1 4 + +/* Local functions */ + +#ifdef ASM_OPT +void Norm_corr_asm( + Word16 exc[], /* (i) : excitation buffer */ + Word16 xn[], /* (i) : target vector */ + Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */ + Word16 L_subfr, + Word16 t_min, /* (i) : minimum value of pitch lag. */ + Word16 t_max, /* (i) : maximum value of pitch lag. */ + Word16 corr_norm[] /* (o) Q15 : normalized correlation */ + ); +#else +static void Norm_Corr( + Word16 exc[], /* (i) : excitation buffer */ + Word16 xn[], /* (i) : target vector */ + Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */ + Word16 L_subfr, + Word16 t_min, /* (i) : minimum value of pitch lag. */ + Word16 t_max, /* (i) : maximum value of pitch lag. */ + Word16 corr_norm[] /* (o) Q15 : normalized correlation */ + ); +#endif + +static Word16 Interpol_4( /* (o) : interpolated value */ + Word16 * x, /* (i) : input vector */ + Word32 frac /* (i) : fraction (-4..+3) */ + ); + + +Word16 Pitch_fr4( /* (o) : pitch period. */ + Word16 exc[], /* (i) : excitation buffer */ + Word16 xn[], /* (i) : target vector */ + Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */ + Word16 t0_min, /* (i) : minimum value in the searched range. */ + Word16 t0_max, /* (i) : maximum value in the searched range. */ + Word16 * pit_frac, /* (o) : chosen fraction (0, 1, 2 or 3). */ + Word16 i_subfr, /* (i) : indicator for first subframe. */ + Word16 t0_fr2, /* (i) : minimum value for resolution 1/2 */ + Word16 t0_fr1, /* (i) : minimum value for resolution 1 */ + Word16 L_subfr /* (i) : Length of subframe */ + ) +{ + Word32 fraction, i; + Word16 t_min, t_max; + Word16 max, t0, step, temp; + Word16 *corr; + Word16 corr_v[40]; /* Total length = t0_max-t0_min+1+2*L_inter */ + + /* Find interval to compute normalized correlation */ + + t_min = t0_min - L_INTERPOL1; + t_max = t0_max + L_INTERPOL1; + corr = &corr_v[-t_min]; + /* Compute normalized correlation between target and filtered excitation */ +#ifdef ASM_OPT /* asm optimization branch */ + Norm_corr_asm(exc, xn, h, L_subfr, t_min, t_max, corr); +#else + Norm_Corr(exc, xn, h, L_subfr, t_min, t_max, corr); +#endif + + /* Find integer pitch */ + + max = corr[t0_min]; + t0 = t0_min; + for (i = t0_min + 1; i <= t0_max; i++) + { + if (corr[i] >= max) + { + max = corr[i]; + t0 = i; + } + } + /* If first subframe and t0 >= t0_fr1, do not search fractionnal pitch */ + if ((i_subfr == 0) && (t0 >= t0_fr1)) + { + *pit_frac = 0; + return (t0); + } + /*------------------------------------------------------------------* + * Search fractionnal pitch with 1/4 subsample resolution. * + * Test the fractions around t0 and choose the one which maximizes * + * the interpolated normalized correlation. * + *------------------------------------------------------------------*/ + + step = 1; /* 1/4 subsample resolution */ + fraction = -3; + if ((t0_fr2 == PIT_MIN)||((i_subfr == 0) && (t0 >= t0_fr2))) + { + step = 2; /* 1/2 subsample resolution */ + fraction = -2; + } + if(t0 == t0_min) + { + fraction = 0; + } + max = Interpol_4(&corr[t0], fraction); + + for (i = fraction + step; i <= 3; i += step) + { + temp = Interpol_4(&corr[t0], i); + if(temp > max) + { + max = temp; + fraction = i; + } + } + /* limit the fraction value in the interval [0,1,2,3] */ + if (fraction < 0) + { + fraction += UP_SAMP; + t0 -= 1; + } + *pit_frac = fraction; + return (t0); +} + + +/*********************************************************************************** +* Function: Norm_Corr() * +* * +* Description: Find the normalized correlation between the target vector and the * +* filtered past excitation. * +* (correlation between target and filtered excitation divided by the * +* square root of energy of target and filtered excitation). * +************************************************************************************/ +#ifndef ASM_OPT +static void Norm_Corr( + Word16 exc[], /* (i) : excitation buffer */ + Word16 xn[], /* (i) : target vector */ + Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */ + Word16 L_subfr, + Word16 t_min, /* (i) : minimum value of pitch lag. */ + Word16 t_max, /* (i) : maximum value of pitch lag. */ + Word16 corr_norm[]) /* (o) Q15 : normalized correlation */ +{ + Word32 i, k, t; + Word32 corr, exp_corr, norm, exp, scale; + Word16 exp_norm, excf[L_SUBFR], tmp; + Word32 L_tmp, L_tmp1, L_tmp2; + + /* compute the filtered excitation for the first delay t_min */ + k = -t_min; + +#ifdef ASM_OPT /* asm optimization branch */ + Convolve_asm(&exc[k], h, excf, 64); +#else + Convolve(&exc[k], h, excf, 64); +#endif + + /* Compute rounded down 1/sqrt(energy of xn[]) */ + L_tmp = 0; + for (i = 0; i < 64; i+=4) + { + L_tmp += (xn[i] * xn[i]); + L_tmp += (xn[i+1] * xn[i+1]); + L_tmp += (xn[i+2] * xn[i+2]); + L_tmp += (xn[i+3] * xn[i+3]); + } + + L_tmp = (L_tmp << 1) + 1; + exp = norm_l(L_tmp); + exp = (32 - exp); + //exp = exp + 2; /* energy of xn[] x 2 + rounded up */ + scale = -(exp >> 1); /* (1<> L_tmp2; + } + else + { + L_tmp = L_tmp << L_tmp2; + } + + corr_norm[t] = vo_round(L_tmp); + /* modify the filtered excitation excf[] for the next iteration */ + + if(t != t_max) + { + k = -(t + 1); + tmp = exc[k]; + for (i = 63; i > 0; i--) + { + excf[i] = add1(vo_mult(tmp, h[i]), excf[i - 1]); + } + excf[0] = vo_mult(tmp, h[0]); + } + } + return; +} + +#endif +/************************************************************************************ +* Function: Interpol_4() * +* * +* Description: For interpolating the normalized correlation with 1/4 resolution. * +**************************************************************************************/ + +/* 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) in Q14 */ +static Word16 inter4_1[4][8] = +{ + {-12, 420, -1732, 5429, 13418, -1242, 73, 32}, + {-26, 455, -2142, 9910, 9910, -2142, 455, -26}, + {32, 73, -1242, 13418, 5429, -1732, 420, -12}, + {206, -766, 1376, 14746, 1376, -766, 206, 0} +}; + +/*** Coefficients in floating point +static float inter4_1[UP_SAMP*L_INTERPOL1+1] = { +0.900000, +0.818959, 0.604850, 0.331379, 0.083958, +-0.075795, -0.130717, -0.105685, -0.046774, +0.004467, 0.027789, 0.025642, 0.012571, +0.001927, -0.001571, -0.000753, 0.000000}; +***/ + +static Word16 Interpol_4( /* (o) : interpolated value */ + Word16 * x, /* (i) : input vector */ + Word32 frac /* (i) : fraction (-4..+3) */ + ) +{ + Word16 sum; + Word32 k, L_sum; + Word16 *ptr; + + if (frac < 0) + { + frac += UP_SAMP; + x--; + } + x = x - L_INTERPOL1 + 1; + k = UP_SAMP - 1 - frac; + ptr = &(inter4_1[k][0]); + + L_sum = vo_mult32(x[0], (*ptr++)); + L_sum += vo_mult32(x[1], (*ptr++)); + L_sum += vo_mult32(x[2], (*ptr++)); + L_sum += vo_mult32(x[3], (*ptr++)); + L_sum += vo_mult32(x[4], (*ptr++)); + L_sum += vo_mult32(x[5], (*ptr++)); + L_sum += vo_mult32(x[6], (*ptr++)); + L_sum += vo_mult32(x[7], (*ptr++)); + + sum = extract_h(L_add(L_shl2(L_sum, 2), 0x8000)); + return (sum); +} + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c b/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c index ac1ff22..b359651 100644 --- a/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c +++ b/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c @@ -1,120 +1,120 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: pred_lt4.c * -* * -* Description: Compute the result of long term prediction with * -* fractional interpolation of resolution 1/4 * -* on return exc[0..L_subr-1] contains the interpolated signal * -* (adaptive codebook excitation) * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" - -#define UP_SAMP 4 -#define L_INTERPOL2 16 - -/* 1/4 resolution interpolation filter (-3 dB at 0.856*fs/2) in Q14 */ - -Word16 inter4_2[4][32] = -{ - {0,-2,4,-2,-10,38,-88,165,-275,424,-619,871,-1207,1699,-2598,5531,14031,-2147,780,-249, - -16,153,-213,226,-209,175,-133,91,-55,28,-10,2}, - - {1,-7,19,-33,47,-52,43,-9,-60,175,-355,626,-1044,1749,-3267,10359,10359,-3267,1749,-1044, - 626,-355,175,-60,-9,43,-52,47,-33,19, -7, 1}, - - {2,-10,28,-55,91,-133,175,-209,226,-213,153,-16,-249,780,-2147,14031,5531,-2598,1699,-1207, - 871,-619,424,-275,165,-88,38,-10,-2,4,-2,0}, - - {1,-7,22,-49,92,-153,231,-325,431,-544,656,-762,853,-923,968,15401,968,-923,853,-762, - 656,-544,431,-325,231,-153,92,-49,22,-7, 1, 0} - -}; - -void Pred_lt4( - Word16 exc[], /* in/out: excitation buffer */ - Word16 T0, /* input : integer pitch lag */ - Word16 frac, /* input : fraction of lag */ - Word16 L_subfr /* input : subframe size */ - ) -{ - Word16 j, k, *x; - Word32 L_sum; - Word16 *ptr, *ptr1; - Word16 *ptr2; - - x = exc - T0; - frac = -frac; - if (frac < 0) - { - frac += UP_SAMP; - x--; - } - x -= 15; /* x = L_INTERPOL2 - 1 */ - k = 3 - frac; /* k = UP_SAMP - 1 - frac */ - - ptr2 = &(inter4_2[k][0]); - for (j = 0; j < L_subfr; j++) - { - ptr = ptr2; - ptr1 = x; - L_sum = vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - L_sum += vo_mult32((*ptr1++), (*ptr++)); - - L_sum = L_shl2(L_sum, 2); - exc[j] = extract_h(L_add(L_sum, 0x8000)); - x++; - } - - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: pred_lt4.c * +* * +* Description: Compute the result of long term prediction with * +* fractional interpolation of resolution 1/4 * +* on return exc[0..L_subr-1] contains the interpolated signal * +* (adaptive codebook excitation) * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" + +#define UP_SAMP 4 +#define L_INTERPOL2 16 + +/* 1/4 resolution interpolation filter (-3 dB at 0.856*fs/2) in Q14 */ + +Word16 inter4_2[4][32] = +{ + {0,-2,4,-2,-10,38,-88,165,-275,424,-619,871,-1207,1699,-2598,5531,14031,-2147,780,-249, + -16,153,-213,226,-209,175,-133,91,-55,28,-10,2}, + + {1,-7,19,-33,47,-52,43,-9,-60,175,-355,626,-1044,1749,-3267,10359,10359,-3267,1749,-1044, + 626,-355,175,-60,-9,43,-52,47,-33,19, -7, 1}, + + {2,-10,28,-55,91,-133,175,-209,226,-213,153,-16,-249,780,-2147,14031,5531,-2598,1699,-1207, + 871,-619,424,-275,165,-88,38,-10,-2,4,-2,0}, + + {1,-7,22,-49,92,-153,231,-325,431,-544,656,-762,853,-923,968,15401,968,-923,853,-762, + 656,-544,431,-325,231,-153,92,-49,22,-7, 1, 0} + +}; + +void Pred_lt4( + Word16 exc[], /* in/out: excitation buffer */ + Word16 T0, /* input : integer pitch lag */ + Word16 frac, /* input : fraction of lag */ + Word16 L_subfr /* input : subframe size */ + ) +{ + Word16 j, k, *x; + Word32 L_sum; + Word16 *ptr, *ptr1; + Word16 *ptr2; + + x = exc - T0; + frac = -frac; + if (frac < 0) + { + frac += UP_SAMP; + x--; + } + x -= 15; /* x = L_INTERPOL2 - 1 */ + k = 3 - frac; /* k = UP_SAMP - 1 - frac */ + + ptr2 = &(inter4_2[k][0]); + for (j = 0; j < L_subfr; j++) + { + ptr = ptr2; + ptr1 = x; + L_sum = vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + L_sum += vo_mult32((*ptr1++), (*ptr++)); + + L_sum = L_shl2(L_sum, 2); + exc[j] = extract_h(L_add(L_sum, 0x8000)); + x++; + } + + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/preemph.c b/media/libstagefright/codecs/amrwbenc/src/preemph.c index f5bcd33..5408617 100644 --- a/media/libstagefright/codecs/amrwbenc/src/preemph.c +++ b/media/libstagefright/codecs/amrwbenc/src/preemph.c @@ -1,88 +1,88 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: preemph.c * -* * -* Description: Preemphasis: filtering through 1 - g z^-1 * -* Preemph2 --> signal is multiplied by 2 * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" - -void Preemph( - Word16 x[], /* (i/o) : input signal overwritten by the output */ - Word16 mu, /* (i) Q15 : preemphasis coefficient */ - Word16 lg, /* (i) : lenght of filtering */ - Word16 * mem /* (i/o) : memory (x[-1]) */ - ) -{ - Word16 temp; - Word32 i, L_tmp; - - temp = x[lg - 1]; - - for (i = lg - 1; i > 0; i--) - { - L_tmp = L_deposit_h(x[i]); - L_tmp -= (x[i - 1] * mu)<<1; - x[i] = (L_tmp + 0x8000)>>16; - } - - L_tmp = L_deposit_h(x[0]); - L_tmp -= ((*mem) * mu)<<1; - x[0] = (L_tmp + 0x8000)>>16; - - *mem = temp; - - return; -} - - -void Preemph2( - Word16 x[], /* (i/o) : input signal overwritten by the output */ - Word16 mu, /* (i) Q15 : preemphasis coefficient */ - Word16 lg, /* (i) : lenght of filtering */ - Word16 * mem /* (i/o) : memory (x[-1]) */ - ) -{ - Word16 temp; - Word32 i, L_tmp; - - temp = x[lg - 1]; - - for (i = (Word16) (lg - 1); i > 0; i--) - { - L_tmp = L_deposit_h(x[i]); - L_tmp -= (x[i - 1] * mu)<<1; - L_tmp = (L_tmp << 1); - x[i] = (L_tmp + 0x8000)>>16; - } - - L_tmp = L_deposit_h(x[0]); - L_tmp -= ((*mem) * mu)<<1; - L_tmp = (L_tmp << 1); - x[0] = (L_tmp + 0x8000)>>16; - - *mem = temp; - - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: preemph.c * +* * +* Description: Preemphasis: filtering through 1 - g z^-1 * +* Preemph2 --> signal is multiplied by 2 * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" + +void Preemph( + Word16 x[], /* (i/o) : input signal overwritten by the output */ + Word16 mu, /* (i) Q15 : preemphasis coefficient */ + Word16 lg, /* (i) : lenght of filtering */ + Word16 * mem /* (i/o) : memory (x[-1]) */ + ) +{ + Word16 temp; + Word32 i, L_tmp; + + temp = x[lg - 1]; + + for (i = lg - 1; i > 0; i--) + { + L_tmp = L_deposit_h(x[i]); + L_tmp -= (x[i - 1] * mu)<<1; + x[i] = (L_tmp + 0x8000)>>16; + } + + L_tmp = L_deposit_h(x[0]); + L_tmp -= ((*mem) * mu)<<1; + x[0] = (L_tmp + 0x8000)>>16; + + *mem = temp; + + return; +} + + +void Preemph2( + Word16 x[], /* (i/o) : input signal overwritten by the output */ + Word16 mu, /* (i) Q15 : preemphasis coefficient */ + Word16 lg, /* (i) : lenght of filtering */ + Word16 * mem /* (i/o) : memory (x[-1]) */ + ) +{ + Word16 temp; + Word32 i, L_tmp; + + temp = x[lg - 1]; + + for (i = (Word16) (lg - 1); i > 0; i--) + { + L_tmp = L_deposit_h(x[i]); + L_tmp -= (x[i - 1] * mu)<<1; + L_tmp = (L_tmp << 1); + x[i] = (L_tmp + 0x8000)>>16; + } + + L_tmp = L_deposit_h(x[0]); + L_tmp -= ((*mem) * mu)<<1; + L_tmp = (L_tmp << 1); + x[0] = (L_tmp + 0x8000)>>16; + + *mem = temp; + + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/q_gain2.c b/media/libstagefright/codecs/amrwbenc/src/q_gain2.c index 59eefe4..7bc299f 100644 --- a/media/libstagefright/codecs/amrwbenc/src/q_gain2.c +++ b/media/libstagefright/codecs/amrwbenc/src/q_gain2.c @@ -1,346 +1,346 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/************************************************************************** -* File: q_gain2.c * -* * -* Description: * -* Quantization of pitch and codebook gains. * -* MA prediction is performed on the innovation energy (in dB with mean * -* removed). * -* An initial predicted gain, g_0, is first determined and the correction * -* factor alpha = gain / g_0 is quantized. * -* The pitch gain and the correction factor are vector quantized and the * -* mean-squared weighted error criterion is used in the quantizer search. * -****************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "oper_32b.h" -#include "math_op.h" -#include "log2.h" -#include "acelp.h" -#include "q_gain2.tab" - -#define MEAN_ENER 30 -#define RANGE 64 -#define PRED_ORDER 4 - - -/* MA prediction coeff ={0.5, 0.4, 0.3, 0.2} in Q13 */ -static Word16 pred[PRED_ORDER] = {4096, 3277, 2458, 1638}; - - -void Init_Q_gain2( - Word16 * mem /* output :static memory (2 words) */ - ) -{ - Word32 i; - - /* 4nd order quantizer energy predictor (init to -14.0 in Q10) */ - for (i = 0; i < PRED_ORDER; i++) - { - mem[i] = -14336; /* past_qua_en[i] */ - } - - return; -} - -Word16 Q_gain2( /* Return index of quantization. */ - Word16 xn[], /* (i) Q_xn: Target vector. */ - Word16 y1[], /* (i) Q_xn: Adaptive codebook. */ - Word16 Q_xn, /* (i) : xn and y1 format */ - Word16 y2[], /* (i) Q9 : Filtered innovative vector. */ - Word16 code[], /* (i) Q9 : Innovative vector. */ - Word16 g_coeff[], /* (i) : Correlations */ - /* Compute in G_pitch(). */ - Word16 L_subfr, /* (i) : Subframe lenght. */ - Word16 nbits, /* (i) : number of bits (6 or 7) */ - Word16 * gain_pit, /* (i/o)Q14: Pitch gain. */ - Word32 * gain_cod, /* (o) Q16 : Code gain. */ - Word16 gp_clip, /* (i) : Gp Clipping flag */ - Word16 * mem /* (i/o) : static memory (2 words) */ - ) -{ - Word16 index, *p, min_ind, size; - Word16 exp, frac, gcode0, exp_gcode0, e_max, exp_code, qua_ener; - Word16 g_pitch, g2_pitch, g_code, g_pit_cod, g2_code, g2_code_lo; - Word16 coeff[5], coeff_lo[5], exp_coeff[5]; - Word16 exp_max[5]; - Word32 i, j, L_tmp, dist_min; - Word16 *past_qua_en, *t_qua_gain; - - past_qua_en = mem; - - /*-----------------------------------------------------------------* - * - Find the initial quantization pitch index * - * - Set gains search range * - *-----------------------------------------------------------------*/ - if (nbits == 6) - { - t_qua_gain = t_qua_gain6b; - min_ind = 0; - size = RANGE; - - if(gp_clip == 1) - { - size = size - 16; /* limit gain pitch to 1.0 */ - } - } else - { - t_qua_gain = t_qua_gain7b; - - p = t_qua_gain7b + RANGE; /* pt at 1/4th of table */ - - j = nb_qua_gain7b - RANGE; - - if (gp_clip == 1) - { - j = j - 27; /* limit gain pitch to 1.0 */ - } - min_ind = 0; - g_pitch = *gain_pit; - - for (i = 0; i < j; i++, p += 2) - { - if (g_pitch > *p) - { - min_ind = min_ind + 1; - } - } - size = RANGE; - } - - /*------------------------------------------------------------------* - * Compute coefficient need for the quantization. * - * * - * coeff[0] = y1 y1 * - * coeff[1] = -2 xn y1 * - * coeff[2] = y2 y2 * - * coeff[3] = -2 xn y2 * - * coeff[4] = 2 y1 y2 * - * * - * Product and have been compute in G_pitch() and * - * are in vector g_coeff[]. * - *------------------------------------------------------------------*/ - - coeff[0] = g_coeff[0]; - exp_coeff[0] = g_coeff[1]; - coeff[1] = negate(g_coeff[2]); /* coeff[1] = -2 xn y1 */ - exp_coeff[1] = g_coeff[3] + 1; - - /* Compute scalar product */ -#ifdef ASM_OPT /* asm optimization branch */ - coeff[2] = extract_h(Dot_product12_asm(y2, y2, L_subfr, &exp)); -#else - coeff[2] = extract_h(Dot_product12(y2, y2, L_subfr, &exp)); -#endif - exp_coeff[2] = (exp - 18) + (Q_xn << 1); /* -18 (y2 Q9) */ - - /* Compute scalar product -2* */ -#ifdef ASM_OPT /* asm optimization branch */ - coeff[3] = extract_h(L_negate(Dot_product12_asm(xn, y2, L_subfr, &exp))); -#else - coeff[3] = extract_h(L_negate(Dot_product12(xn, y2, L_subfr, &exp))); -#endif - - exp_coeff[3] = (exp - 8) + Q_xn; /* -9 (y2 Q9), +1 (2 xn y2) */ - - /* Compute scalar product 2* */ -#ifdef ASM_OPT /* asm optimization branch */ - coeff[4] = extract_h(Dot_product12_asm(y1, y2, L_subfr, &exp)); -#else - coeff[4] = extract_h(Dot_product12(y1, y2, L_subfr, &exp)); -#endif - exp_coeff[4] = (exp - 8) + Q_xn; /* -9 (y2 Q9), +1 (2 y1 y2) */ - - /*-----------------------------------------------------------------* - * Find energy of code and compute: * - * * - * L_tmp = MEAN_ENER - 10log10(energy of code/ L_subfr) * - * = MEAN_ENER - 3.0103*log2(energy of code/ L_subfr) * - *-----------------------------------------------------------------*/ -#ifdef ASM_OPT /* asm optimization branch */ - L_tmp = Dot_product12_asm(code, code, L_subfr, &exp_code); -#else - L_tmp = Dot_product12(code, code, L_subfr, &exp_code); -#endif - /* exp_code: -18 (code in Q9), -6 (/L_subfr), -31 (L_tmp Q31->Q0) */ - exp_code = (exp_code - (18 + 6 + 31)); - - Log2(L_tmp, &exp, &frac); - exp += exp_code; - L_tmp = Mpy_32_16(exp, frac, -24660); /* x -3.0103(Q13) -> Q14 */ - - L_tmp += (MEAN_ENER * 8192)<<1; /* + MEAN_ENER in Q14 */ - - /*-----------------------------------------------------------------* - * Compute gcode0. * - * = Sum(i=0,1) pred[i]*past_qua_en[i] + mean_ener - ener_code * - *-----------------------------------------------------------------*/ - L_tmp = (L_tmp << 10); /* From Q14 to Q24 */ - L_tmp += (pred[0] * past_qua_en[0])<<1; /* Q13*Q10 -> Q24 */ - L_tmp += (pred[1] * past_qua_en[1])<<1; /* Q13*Q10 -> Q24 */ - L_tmp += (pred[2] * past_qua_en[2])<<1; /* Q13*Q10 -> Q24 */ - L_tmp += (pred[3] * past_qua_en[3])<<1; /* Q13*Q10 -> Q24 */ - - gcode0 = extract_h(L_tmp); /* From Q24 to Q8 */ - - /*-----------------------------------------------------------------* - * gcode0 = pow(10.0, gcode0/20) * - * = pow(2, 3.321928*gcode0/20) * - * = pow(2, 0.166096*gcode0) * - *-----------------------------------------------------------------*/ - - L_tmp = vo_L_mult(gcode0, 5443); /* *0.166096 in Q15 -> Q24 */ - L_tmp = L_tmp >> 8; /* From Q24 to Q16 */ - VO_L_Extract(L_tmp, &exp_gcode0, &frac); /* Extract exponent of gcode0 */ - - gcode0 = (Word16)(Pow2(14, frac)); /* Put 14 as exponent so that */ - /* output of Pow2() will be: */ - /* 16384 < Pow2() <= 32767 */ - exp_gcode0 -= 14; - - /*-------------------------------------------------------------------------* - * Find the best quantizer * - * ~~~~~~~~~~~~~~~~~~~~~~~ * - * Before doing the computation we need to aling exponents of coeff[] * - * to be sure to have the maximum precision. * - * * - * In the table the pitch gains are in Q14, the code gains are in Q11 and * - * are multiply by gcode0 which have been multiply by 2^exp_gcode0. * - * Also when we compute g_pitch*g_pitch, g_code*g_code and g_pitch*g_code * - * we divide by 2^15. * - * Considering all the scaling above we have: * - * * - * exp_code = exp_gcode0-11+15 = exp_gcode0+4 * - * * - * g_pitch*g_pitch = -14-14+15 * - * g_pitch = -14 * - * g_code*g_code = (2*exp_code)+15 * - * g_code = exp_code * - * g_pitch*g_code = -14 + exp_code +15 * - * * - * g_pitch*g_pitch * coeff[0] ;exp_max0 = exp_coeff[0] - 13 * - * g_pitch * coeff[1] ;exp_max1 = exp_coeff[1] - 14 * - * g_code*g_code * coeff[2] ;exp_max2 = exp_coeff[2] +15+(2*exp_code) * - * g_code * coeff[3] ;exp_max3 = exp_coeff[3] + exp_code * - * g_pitch*g_code * coeff[4] ;exp_max4 = exp_coeff[4] + 1 + exp_code * - *-------------------------------------------------------------------------*/ - - exp_code = (exp_gcode0 + 4); - exp_max[0] = (exp_coeff[0] - 13); - exp_max[1] = (exp_coeff[1] - 14); - exp_max[2] = (exp_coeff[2] + (15 + (exp_code << 1))); - exp_max[3] = (exp_coeff[3] + exp_code); - exp_max[4] = (exp_coeff[4] + (1 + exp_code)); - - /* Find maximum exponant */ - - e_max = exp_max[0]; - for (i = 1; i < 5; i++) - { - if(exp_max[i] > e_max) - { - e_max = exp_max[i]; - } - } - - /* align coeff[] and save in special 32 bit double precision */ - - for (i = 0; i < 5; i++) - { - j = add1(vo_sub(e_max, exp_max[i]), 2);/* /4 to avoid overflow */ - L_tmp = L_deposit_h(coeff[i]); - L_tmp = L_shr(L_tmp, j); - VO_L_Extract(L_tmp, &coeff[i], &coeff_lo[i]); - coeff_lo[i] = (coeff_lo[i] >> 3); /* lo >> 3 */ - } - - /* Codebook search */ - dist_min = MAX_32; - p = &t_qua_gain[min_ind << 1]; - - index = 0; - for (i = 0; i < size; i++) - { - g_pitch = *p++; - g_code = *p++; - - g_code = ((g_code * gcode0) + 0x4000)>>15; - g2_pitch = ((g_pitch * g_pitch) + 0x4000)>>15; - g_pit_cod = ((g_code * g_pitch) + 0x4000)>>15; - L_tmp = (g_code * g_code)<<1; - VO_L_Extract(L_tmp, &g2_code, &g2_code_lo); - - L_tmp = (coeff[2] * g2_code_lo)<<1; - L_tmp = (L_tmp >> 3); - L_tmp += (coeff_lo[0] * g2_pitch)<<1; - L_tmp += (coeff_lo[1] * g_pitch)<<1; - L_tmp += (coeff_lo[2] * g2_code)<<1; - L_tmp += (coeff_lo[3] * g_code)<<1; - L_tmp += (coeff_lo[4] * g_pit_cod)<<1; - L_tmp = (L_tmp >> 12); - L_tmp += (coeff[0] * g2_pitch)<<1; - L_tmp += (coeff[1] * g_pitch)<<1; - L_tmp += (coeff[2] * g2_code)<<1; - L_tmp += (coeff[3] * g_code)<<1; - L_tmp += (coeff[4] * g_pit_cod)<<1; - - if(L_tmp < dist_min) - { - dist_min = L_tmp; - index = i; - } - } - - /* Read the quantized gains */ - index = index + min_ind; - p = &t_qua_gain[(index + index)]; - *gain_pit = *p++; /* selected pitch gain in Q14 */ - g_code = *p++; /* selected code gain in Q11 */ - - L_tmp = vo_L_mult(g_code, gcode0); /* Q11*Q0 -> Q12 */ - L_tmp = L_shl(L_tmp, (exp_gcode0 + 4)); /* Q12 -> Q16 */ - - *gain_cod = L_tmp; /* gain of code in Q16 */ - - /*---------------------------------------------------* - * qua_ener = 20*log10(g_code) * - * = 6.0206*log2(g_code) * - * = 6.0206*(log2(g_codeQ11) - 11) * - *---------------------------------------------------*/ - - L_tmp = L_deposit_l(g_code); - Log2(L_tmp, &exp, &frac); - exp -= 11; - L_tmp = Mpy_32_16(exp, frac, 24660); /* x 6.0206 in Q12 */ - - qua_ener = (Word16)(L_tmp >> 3); /* result in Q10 */ - - /* update table of past quantized energies */ - - past_qua_en[3] = past_qua_en[2]; - past_qua_en[2] = past_qua_en[1]; - past_qua_en[1] = past_qua_en[0]; - past_qua_en[0] = qua_ener; - - return (index); -} - - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/************************************************************************** +* File: q_gain2.c * +* * +* Description: * +* Quantization of pitch and codebook gains. * +* MA prediction is performed on the innovation energy (in dB with mean * +* removed). * +* An initial predicted gain, g_0, is first determined and the correction * +* factor alpha = gain / g_0 is quantized. * +* The pitch gain and the correction factor are vector quantized and the * +* mean-squared weighted error criterion is used in the quantizer search. * +****************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "math_op.h" +#include "log2.h" +#include "acelp.h" +#include "q_gain2.tab" + +#define MEAN_ENER 30 +#define RANGE 64 +#define PRED_ORDER 4 + + +/* MA prediction coeff ={0.5, 0.4, 0.3, 0.2} in Q13 */ +static Word16 pred[PRED_ORDER] = {4096, 3277, 2458, 1638}; + + +void Init_Q_gain2( + Word16 * mem /* output :static memory (2 words) */ + ) +{ + Word32 i; + + /* 4nd order quantizer energy predictor (init to -14.0 in Q10) */ + for (i = 0; i < PRED_ORDER; i++) + { + mem[i] = -14336; /* past_qua_en[i] */ + } + + return; +} + +Word16 Q_gain2( /* Return index of quantization. */ + Word16 xn[], /* (i) Q_xn: Target vector. */ + Word16 y1[], /* (i) Q_xn: Adaptive codebook. */ + Word16 Q_xn, /* (i) : xn and y1 format */ + Word16 y2[], /* (i) Q9 : Filtered innovative vector. */ + Word16 code[], /* (i) Q9 : Innovative vector. */ + Word16 g_coeff[], /* (i) : Correlations */ + /* Compute in G_pitch(). */ + Word16 L_subfr, /* (i) : Subframe lenght. */ + Word16 nbits, /* (i) : number of bits (6 or 7) */ + Word16 * gain_pit, /* (i/o)Q14: Pitch gain. */ + Word32 * gain_cod, /* (o) Q16 : Code gain. */ + Word16 gp_clip, /* (i) : Gp Clipping flag */ + Word16 * mem /* (i/o) : static memory (2 words) */ + ) +{ + Word16 index, *p, min_ind, size; + Word16 exp, frac, gcode0, exp_gcode0, e_max, exp_code, qua_ener; + Word16 g_pitch, g2_pitch, g_code, g_pit_cod, g2_code, g2_code_lo; + Word16 coeff[5], coeff_lo[5], exp_coeff[5]; + Word16 exp_max[5]; + Word32 i, j, L_tmp, dist_min; + Word16 *past_qua_en, *t_qua_gain; + + past_qua_en = mem; + + /*-----------------------------------------------------------------* + * - Find the initial quantization pitch index * + * - Set gains search range * + *-----------------------------------------------------------------*/ + if (nbits == 6) + { + t_qua_gain = t_qua_gain6b; + min_ind = 0; + size = RANGE; + + if(gp_clip == 1) + { + size = size - 16; /* limit gain pitch to 1.0 */ + } + } else + { + t_qua_gain = t_qua_gain7b; + + p = t_qua_gain7b + RANGE; /* pt at 1/4th of table */ + + j = nb_qua_gain7b - RANGE; + + if (gp_clip == 1) + { + j = j - 27; /* limit gain pitch to 1.0 */ + } + min_ind = 0; + g_pitch = *gain_pit; + + for (i = 0; i < j; i++, p += 2) + { + if (g_pitch > *p) + { + min_ind = min_ind + 1; + } + } + size = RANGE; + } + + /*------------------------------------------------------------------* + * Compute coefficient need for the quantization. * + * * + * coeff[0] = y1 y1 * + * coeff[1] = -2 xn y1 * + * coeff[2] = y2 y2 * + * coeff[3] = -2 xn y2 * + * coeff[4] = 2 y1 y2 * + * * + * Product and have been compute in G_pitch() and * + * are in vector g_coeff[]. * + *------------------------------------------------------------------*/ + + coeff[0] = g_coeff[0]; + exp_coeff[0] = g_coeff[1]; + coeff[1] = negate(g_coeff[2]); /* coeff[1] = -2 xn y1 */ + exp_coeff[1] = g_coeff[3] + 1; + + /* Compute scalar product */ +#ifdef ASM_OPT /* asm optimization branch */ + coeff[2] = extract_h(Dot_product12_asm(y2, y2, L_subfr, &exp)); +#else + coeff[2] = extract_h(Dot_product12(y2, y2, L_subfr, &exp)); +#endif + exp_coeff[2] = (exp - 18) + (Q_xn << 1); /* -18 (y2 Q9) */ + + /* Compute scalar product -2* */ +#ifdef ASM_OPT /* asm optimization branch */ + coeff[3] = extract_h(L_negate(Dot_product12_asm(xn, y2, L_subfr, &exp))); +#else + coeff[3] = extract_h(L_negate(Dot_product12(xn, y2, L_subfr, &exp))); +#endif + + exp_coeff[3] = (exp - 8) + Q_xn; /* -9 (y2 Q9), +1 (2 xn y2) */ + + /* Compute scalar product 2* */ +#ifdef ASM_OPT /* asm optimization branch */ + coeff[4] = extract_h(Dot_product12_asm(y1, y2, L_subfr, &exp)); +#else + coeff[4] = extract_h(Dot_product12(y1, y2, L_subfr, &exp)); +#endif + exp_coeff[4] = (exp - 8) + Q_xn; /* -9 (y2 Q9), +1 (2 y1 y2) */ + + /*-----------------------------------------------------------------* + * Find energy of code and compute: * + * * + * L_tmp = MEAN_ENER - 10log10(energy of code/ L_subfr) * + * = MEAN_ENER - 3.0103*log2(energy of code/ L_subfr) * + *-----------------------------------------------------------------*/ +#ifdef ASM_OPT /* asm optimization branch */ + L_tmp = Dot_product12_asm(code, code, L_subfr, &exp_code); +#else + L_tmp = Dot_product12(code, code, L_subfr, &exp_code); +#endif + /* exp_code: -18 (code in Q9), -6 (/L_subfr), -31 (L_tmp Q31->Q0) */ + exp_code = (exp_code - (18 + 6 + 31)); + + Log2(L_tmp, &exp, &frac); + exp += exp_code; + L_tmp = Mpy_32_16(exp, frac, -24660); /* x -3.0103(Q13) -> Q14 */ + + L_tmp += (MEAN_ENER * 8192)<<1; /* + MEAN_ENER in Q14 */ + + /*-----------------------------------------------------------------* + * Compute gcode0. * + * = Sum(i=0,1) pred[i]*past_qua_en[i] + mean_ener - ener_code * + *-----------------------------------------------------------------*/ + L_tmp = (L_tmp << 10); /* From Q14 to Q24 */ + L_tmp += (pred[0] * past_qua_en[0])<<1; /* Q13*Q10 -> Q24 */ + L_tmp += (pred[1] * past_qua_en[1])<<1; /* Q13*Q10 -> Q24 */ + L_tmp += (pred[2] * past_qua_en[2])<<1; /* Q13*Q10 -> Q24 */ + L_tmp += (pred[3] * past_qua_en[3])<<1; /* Q13*Q10 -> Q24 */ + + gcode0 = extract_h(L_tmp); /* From Q24 to Q8 */ + + /*-----------------------------------------------------------------* + * gcode0 = pow(10.0, gcode0/20) * + * = pow(2, 3.321928*gcode0/20) * + * = pow(2, 0.166096*gcode0) * + *-----------------------------------------------------------------*/ + + L_tmp = vo_L_mult(gcode0, 5443); /* *0.166096 in Q15 -> Q24 */ + L_tmp = L_tmp >> 8; /* From Q24 to Q16 */ + VO_L_Extract(L_tmp, &exp_gcode0, &frac); /* Extract exponent of gcode0 */ + + gcode0 = (Word16)(Pow2(14, frac)); /* Put 14 as exponent so that */ + /* output of Pow2() will be: */ + /* 16384 < Pow2() <= 32767 */ + exp_gcode0 -= 14; + + /*-------------------------------------------------------------------------* + * Find the best quantizer * + * ~~~~~~~~~~~~~~~~~~~~~~~ * + * Before doing the computation we need to aling exponents of coeff[] * + * to be sure to have the maximum precision. * + * * + * In the table the pitch gains are in Q14, the code gains are in Q11 and * + * are multiply by gcode0 which have been multiply by 2^exp_gcode0. * + * Also when we compute g_pitch*g_pitch, g_code*g_code and g_pitch*g_code * + * we divide by 2^15. * + * Considering all the scaling above we have: * + * * + * exp_code = exp_gcode0-11+15 = exp_gcode0+4 * + * * + * g_pitch*g_pitch = -14-14+15 * + * g_pitch = -14 * + * g_code*g_code = (2*exp_code)+15 * + * g_code = exp_code * + * g_pitch*g_code = -14 + exp_code +15 * + * * + * g_pitch*g_pitch * coeff[0] ;exp_max0 = exp_coeff[0] - 13 * + * g_pitch * coeff[1] ;exp_max1 = exp_coeff[1] - 14 * + * g_code*g_code * coeff[2] ;exp_max2 = exp_coeff[2] +15+(2*exp_code) * + * g_code * coeff[3] ;exp_max3 = exp_coeff[3] + exp_code * + * g_pitch*g_code * coeff[4] ;exp_max4 = exp_coeff[4] + 1 + exp_code * + *-------------------------------------------------------------------------*/ + + exp_code = (exp_gcode0 + 4); + exp_max[0] = (exp_coeff[0] - 13); + exp_max[1] = (exp_coeff[1] - 14); + exp_max[2] = (exp_coeff[2] + (15 + (exp_code << 1))); + exp_max[3] = (exp_coeff[3] + exp_code); + exp_max[4] = (exp_coeff[4] + (1 + exp_code)); + + /* Find maximum exponant */ + + e_max = exp_max[0]; + for (i = 1; i < 5; i++) + { + if(exp_max[i] > e_max) + { + e_max = exp_max[i]; + } + } + + /* align coeff[] and save in special 32 bit double precision */ + + for (i = 0; i < 5; i++) + { + j = add1(vo_sub(e_max, exp_max[i]), 2);/* /4 to avoid overflow */ + L_tmp = L_deposit_h(coeff[i]); + L_tmp = L_shr(L_tmp, j); + VO_L_Extract(L_tmp, &coeff[i], &coeff_lo[i]); + coeff_lo[i] = (coeff_lo[i] >> 3); /* lo >> 3 */ + } + + /* Codebook search */ + dist_min = MAX_32; + p = &t_qua_gain[min_ind << 1]; + + index = 0; + for (i = 0; i < size; i++) + { + g_pitch = *p++; + g_code = *p++; + + g_code = ((g_code * gcode0) + 0x4000)>>15; + g2_pitch = ((g_pitch * g_pitch) + 0x4000)>>15; + g_pit_cod = ((g_code * g_pitch) + 0x4000)>>15; + L_tmp = (g_code * g_code)<<1; + VO_L_Extract(L_tmp, &g2_code, &g2_code_lo); + + L_tmp = (coeff[2] * g2_code_lo)<<1; + L_tmp = (L_tmp >> 3); + L_tmp += (coeff_lo[0] * g2_pitch)<<1; + L_tmp += (coeff_lo[1] * g_pitch)<<1; + L_tmp += (coeff_lo[2] * g2_code)<<1; + L_tmp += (coeff_lo[3] * g_code)<<1; + L_tmp += (coeff_lo[4] * g_pit_cod)<<1; + L_tmp = (L_tmp >> 12); + L_tmp += (coeff[0] * g2_pitch)<<1; + L_tmp += (coeff[1] * g_pitch)<<1; + L_tmp += (coeff[2] * g2_code)<<1; + L_tmp += (coeff[3] * g_code)<<1; + L_tmp += (coeff[4] * g_pit_cod)<<1; + + if(L_tmp < dist_min) + { + dist_min = L_tmp; + index = i; + } + } + + /* Read the quantized gains */ + index = index + min_ind; + p = &t_qua_gain[(index + index)]; + *gain_pit = *p++; /* selected pitch gain in Q14 */ + g_code = *p++; /* selected code gain in Q11 */ + + L_tmp = vo_L_mult(g_code, gcode0); /* Q11*Q0 -> Q12 */ + L_tmp = L_shl(L_tmp, (exp_gcode0 + 4)); /* Q12 -> Q16 */ + + *gain_cod = L_tmp; /* gain of code in Q16 */ + + /*---------------------------------------------------* + * qua_ener = 20*log10(g_code) * + * = 6.0206*log2(g_code) * + * = 6.0206*(log2(g_codeQ11) - 11) * + *---------------------------------------------------*/ + + L_tmp = L_deposit_l(g_code); + Log2(L_tmp, &exp, &frac); + exp -= 11; + L_tmp = Mpy_32_16(exp, frac, 24660); /* x 6.0206 in Q12 */ + + qua_ener = (Word16)(L_tmp >> 3); /* result in Q10 */ + + /* update table of past quantized energies */ + + past_qua_en[3] = past_qua_en[2]; + past_qua_en[2] = past_qua_en[1]; + past_qua_en[1] = past_qua_en[0]; + past_qua_en[0] = qua_ener; + + return (index); +} + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/q_pulse.c b/media/libstagefright/codecs/amrwbenc/src/q_pulse.c index a28ba40..496ca80 100644 --- a/media/libstagefright/codecs/amrwbenc/src/q_pulse.c +++ b/media/libstagefright/codecs/amrwbenc/src/q_pulse.c @@ -1,400 +1,400 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: q_pulse.c * -* * -* Description: Coding and decoding of algebraic codebook * -* * -************************************************************************/ - -#include -#include "typedef.h" -#include "basic_op.h" -#include "q_pulse.h" - -#define NB_POS 16 /* pos in track, mask for sign bit */ - -Word32 quant_1p_N1( /* (o) return N+1 bits */ - Word16 pos, /* (i) position of the pulse */ - Word16 N) /* (i) number of bits for position */ -{ - Word16 mask; - Word32 index; - - mask = (1 << N) - 1; /* mask = ((1<> 1)), 1); - index = L_shl(quant_1p_N1(posA[0], n_1), tmp); - /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */ - index = vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1)); - break; - case 2: - tmp = ((n_1 << 1) + 1); /* index = quant_2p_2N1(posA[0], posA[1], n_1) << ((2*n_1)+1); */ - index = L_shl(quant_2p_2N1(posA[0], posA[1], n_1), tmp); - /* index += quant_2p_2N1(posB[0], posB[1], n_1); */ - index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1)); - break; - case 3: - /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << N; */ - index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), N); - index = vo_L_add(index, quant_1p_N1(posB[0], n_1)); /* index += quant_1p_N1(posB[0], n_1); */ - break; - case 4: - index = quant_4p_4N1(posA[0], posA[1], posA[2], posA[3], n_1); - break; - default: - index = 0; - fprintf(stderr, "Error in function quant_4p_4N\n"); - } - tmp = ((N << 2) - 2); /* index += (i & 3) << ((4*N)-2); */ - index = vo_L_add(index, L_shl((L_deposit_l(i) & (3L)), tmp)); - - return (index); -} - - - -Word32 quant_5p_5N( /* (o) return 5*N bits */ - Word16 pos[], /* (i) position of the pulse 1..5 */ - Word16 N) /* (i) number of bits for position */ -{ - Word16 nb_pos, n_1, tmp; - Word16 posA[5], posB[5]; - Word32 i, j, k, index, tmp2; - - n_1 = (Word16) (N - 1); - nb_pos = (1 << n_1); /* nb_pos = (1<> 1)), 1); /* ((5*N)-1)) */ - index = L_shl(1L, tmp); /* index = 1 << ((5*N)-1); */ - tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);*/ - tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp); - index = vo_L_add(index, tmp2); - index = vo_L_add(index, quant_2p_2N1(posB[3], posB[4], N)); /* index += quant_2p_2N1(posB[3], posB[4], N); */ - break; - case 1: - tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1); /* index = 1 << ((5*N)-1); */ - index = L_shl(1L, tmp); - tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) <<((2*N)+1); */ - tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp); - index = vo_L_add(index, tmp2); - index = vo_L_add(index, quant_2p_2N1(posB[3], posA[0], N)); /* index += quant_2p_2N1(posB[3], posA[0], N); */ - break; - case 2: - tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1); /* ((5*N)-1)) */ - index = L_shl(1L, tmp); /* index = 1 << ((5*N)-1); */ - tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1); */ - tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp); - index = vo_L_add(index, tmp2); - index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], N)); /* index += quant_2p_2N1(posA[0], posA[1], N); */ - break; - case 3: - tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */ - index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp); - index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], N)); /* index += quant_2p_2N1(posB[0], posB[1], N); */ - break; - case 4: - tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */ - index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp); - index = vo_L_add(index, quant_2p_2N1(posA[3], posB[0], N)); /* index += quant_2p_2N1(posA[3], posB[0], N); */ - break; - case 5: - tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */ - index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp); - index = vo_L_add(index, quant_2p_2N1(posA[3], posA[4], N)); /* index += quant_2p_2N1(posA[3], posA[4], N); */ - break; - default: - index = 0; - fprintf(stderr, "Error in function quant_5p_5N\n"); - } - - return (index); -} - - -Word32 quant_6p_6N_2( /* (o) return (6*N)-2 bits */ - Word16 pos[], /* (i) position of the pulse 1..6 */ - Word16 N) /* (i) number of bits for position */ -{ - Word16 nb_pos, n_1; - Word16 posA[6], posB[6]; - Word32 i, j, k, index; - - /* !! N and n_1 are constants -> it doesn't need to be operated by Basic Operators */ - n_1 = (Word16) (N - 1); - nb_pos = (1 << n_1); /* nb_pos = (1< +#include "typedef.h" +#include "basic_op.h" +#include "q_pulse.h" + +#define NB_POS 16 /* pos in track, mask for sign bit */ + +Word32 quant_1p_N1( /* (o) return N+1 bits */ + Word16 pos, /* (i) position of the pulse */ + Word16 N) /* (i) number of bits for position */ +{ + Word16 mask; + Word32 index; + + mask = (1 << N) - 1; /* mask = ((1<> 1)), 1); + index = L_shl(quant_1p_N1(posA[0], n_1), tmp); + /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */ + index = vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1)); + break; + case 2: + tmp = ((n_1 << 1) + 1); /* index = quant_2p_2N1(posA[0], posA[1], n_1) << ((2*n_1)+1); */ + index = L_shl(quant_2p_2N1(posA[0], posA[1], n_1), tmp); + /* index += quant_2p_2N1(posB[0], posB[1], n_1); */ + index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1)); + break; + case 3: + /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << N; */ + index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), N); + index = vo_L_add(index, quant_1p_N1(posB[0], n_1)); /* index += quant_1p_N1(posB[0], n_1); */ + break; + case 4: + index = quant_4p_4N1(posA[0], posA[1], posA[2], posA[3], n_1); + break; + default: + index = 0; + fprintf(stderr, "Error in function quant_4p_4N\n"); + } + tmp = ((N << 2) - 2); /* index += (i & 3) << ((4*N)-2); */ + index = vo_L_add(index, L_shl((L_deposit_l(i) & (3L)), tmp)); + + return (index); +} + + + +Word32 quant_5p_5N( /* (o) return 5*N bits */ + Word16 pos[], /* (i) position of the pulse 1..5 */ + Word16 N) /* (i) number of bits for position */ +{ + Word16 nb_pos, n_1, tmp; + Word16 posA[5], posB[5]; + Word32 i, j, k, index, tmp2; + + n_1 = (Word16) (N - 1); + nb_pos = (1 << n_1); /* nb_pos = (1<> 1)), 1); /* ((5*N)-1)) */ + index = L_shl(1L, tmp); /* index = 1 << ((5*N)-1); */ + tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);*/ + tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp); + index = vo_L_add(index, tmp2); + index = vo_L_add(index, quant_2p_2N1(posB[3], posB[4], N)); /* index += quant_2p_2N1(posB[3], posB[4], N); */ + break; + case 1: + tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1); /* index = 1 << ((5*N)-1); */ + index = L_shl(1L, tmp); + tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) <<((2*N)+1); */ + tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp); + index = vo_L_add(index, tmp2); + index = vo_L_add(index, quant_2p_2N1(posB[3], posA[0], N)); /* index += quant_2p_2N1(posB[3], posA[0], N); */ + break; + case 2: + tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1); /* ((5*N)-1)) */ + index = L_shl(1L, tmp); /* index = 1 << ((5*N)-1); */ + tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1); */ + tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp); + index = vo_L_add(index, tmp2); + index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], N)); /* index += quant_2p_2N1(posA[0], posA[1], N); */ + break; + case 3: + tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */ + index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp); + index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], N)); /* index += quant_2p_2N1(posB[0], posB[1], N); */ + break; + case 4: + tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */ + index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp); + index = vo_L_add(index, quant_2p_2N1(posA[3], posB[0], N)); /* index += quant_2p_2N1(posA[3], posB[0], N); */ + break; + case 5: + tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */ + index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp); + index = vo_L_add(index, quant_2p_2N1(posA[3], posA[4], N)); /* index += quant_2p_2N1(posA[3], posA[4], N); */ + break; + default: + index = 0; + fprintf(stderr, "Error in function quant_5p_5N\n"); + } + + return (index); +} + + +Word32 quant_6p_6N_2( /* (o) return (6*N)-2 bits */ + Word16 pos[], /* (i) position of the pulse 1..6 */ + Word16 N) /* (i) number of bits for position */ +{ + Word16 nb_pos, n_1; + Word16 posA[6], posB[6]; + Word32 i, j, k, index; + + /* !! N and n_1 are constants -> it doesn't need to be operated by Basic Operators */ + n_1 = (Word16) (N - 1); + nb_pos = (1 << n_1); /* nb_pos = (1< 0; j--) - { - isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; - } - isf_buf[i] = isf_q[i]; - } - } - } else - { /* bad frame */ - for (i = 0; i < M; i++) - { - L_tmp = mean_isf[i] << 14; - for (j = 0; j < L_MEANBUF; j++) - { - L_tmp += (isf_buf[j * M + i] << 14); - } - ref_isf[i] = vo_round(L_tmp); - } - - /* use the past ISFs slightly shifted towards their mean */ - for (i = 0; i < ORDER; i++) - { - isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i])); - } - - /* estimate past quantized residual to be used in next frame */ - for (i = 0; i < ORDER; i++) - { - tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */ - past_isfq[i] = vo_sub(isf_q[i], tmp); - past_isfq[i] = (past_isfq[i] >> 1); /* past_isfq[i] *= 0.5 */ - } - } - - Reorder_isf(isf_q, ISF_GAP, ORDER); - return; -} - -/********************************************************************* -* Function: Disf_2s_36b() * -* * -* Description: Decoding of ISF parameters * -*********************************************************************/ - -void Dpisf_2s_36b( - Word16 * indice, /* input: quantization indices */ - Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ - Word16 * past_isfq, /* i/0 : past ISF quantizer */ - Word16 * isfold, /* input : past quantized ISF */ - Word16 * isf_buf, /* input : isf buffer */ - Word16 bfi, /* input : Bad frame indicator */ - Word16 enc_dec - ) -{ - Word16 ref_isf[M], tmp; - Word32 i, j, L_tmp; - - if (bfi == 0) /* Good frame */ - { - for (i = 0; i < 9; i++) - { - isf_q[i] = dico1_isf[indice[0] * 9 + i]; - } - for (i = 0; i < 7; i++) - { - isf_q[i + 9] = dico2_isf[indice[1] * 7 + i]; - } - - for (i = 0; i < 5; i++) - { - isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]); - } - for (i = 0; i < 4; i++) - { - isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]); - } - for (i = 0; i < 7; i++) - { - isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]); - } - - for (i = 0; i < ORDER; i++) - { - tmp = isf_q[i]; - isf_q[i] = add1(tmp, mean_isf[i]); - isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i])); - past_isfq[i] = tmp; - } - - - if (enc_dec) - { - for (i = 0; i < M; i++) - { - for (j = (L_MEANBUF - 1); j > 0; j--) - { - isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; - } - isf_buf[i] = isf_q[i]; - } - } - } else - { /* bad frame */ - for (i = 0; i < M; i++) - { - L_tmp = (mean_isf[i] << 14); - for (j = 0; j < L_MEANBUF; j++) - { - L_tmp += (isf_buf[j * M + i] << 14); - } - ref_isf[i] = vo_round(L_tmp); - } - - /* use the past ISFs slightly shifted towards their mean */ - for (i = 0; i < ORDER; i++) - { - isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i])); - } - - /* estimate past quantized residual to be used in next frame */ - for (i = 0; i < ORDER; i++) - { - tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */ - past_isfq[i] = vo_sub(isf_q[i], tmp); - past_isfq[i] = past_isfq[i] >> 1; /* past_isfq[i] *= 0.5 */ - } - } - - Reorder_isf(isf_q, ISF_GAP, ORDER); - - return; -} - - -/*************************************************************************** -* Function: Reorder_isf() * -* * -* Description: To make sure that the isfs are properly order and to * -* keep a certain minimum distance between consecutive isfs. * -*--------------------------------------------------------------------------* -* Argument description in/out * -* * -* isf[] vector of isfs i/o * -* min_dist minimum required distance i * -* n LPC order i * -****************************************************************************/ - -void Reorder_isf( - Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */ - Word16 min_dist, /* (i) Q15 : minimum distance to keep */ - Word16 n /* (i) : number of ISF */ - ) -{ - Word32 i; - Word16 isf_min; - - isf_min = min_dist; - for (i = 0; i < n - 1; i++) - { - if(isf[i] < isf_min) - { - isf[i] = isf_min; - } - isf_min = (isf[i] + min_dist); - } - return; -} - - -Word16 Sub_VQ( /* output: return quantization index */ - Word16 * x, /* input : ISF residual vector */ - Word16 * dico, /* input : quantization codebook */ - Word16 dim, /* input : dimention of vector */ - Word16 dico_size, /* input : size of quantization codebook */ - Word32 * distance /* output: error of quantization */ - ) -{ - Word16 temp, *p_dico; - Word32 i, j, index; - Word32 dist_min, dist; - - dist_min = MAX_32; - p_dico = dico; - - index = 0; - for (i = 0; i < dico_size; i++) - { - dist = 0; - - for (j = 0; j < dim; j++) - { - temp = x[j] - (*p_dico++); - dist += (temp * temp)<<1; - } - - if(dist < dist_min) - { - dist_min = dist; - index = i; - } - } - - *distance = dist_min; - - /* Reading the selected vector */ - p_dico = &dico[index * dim]; - for (j = 0; j < dim; j++) - { - x[j] = *p_dico++; - } - - return index; -} - - -static void VQ_stage1( - Word16 * x, /* input : ISF residual vector */ - Word16 * dico, /* input : quantization codebook */ - Word16 dim, /* input : dimention of vector */ - Word16 dico_size, /* input : size of quantization codebook */ - Word16 * index, /* output: indices of survivors */ - Word16 surv /* input : number of survivor */ - ) -{ - Word16 temp, *p_dico; - Word32 i, j, k, l; - Word32 dist_min[N_SURV_MAX], dist; - - dist_min[0] = MAX_32; - dist_min[1] = MAX_32; - dist_min[2] = MAX_32; - dist_min[3] = MAX_32; - index[0] = 0; - index[1] = 1; - index[2] = 2; - index[3] = 3; - - p_dico = dico; - - for (i = 0; i < dico_size; i++) - { - dist = 0; - for (j = 0; j < dim; j++) - { - temp = x[j] - (*p_dico++); - dist += (temp * temp)<<1; - } - - for (k = 0; k < surv; k++) - { - if(dist < dist_min[k]) - { - for (l = surv - 1; l > k; l--) - { - dist_min[l] = dist_min[l - 1]; - index[l] = index[l - 1]; - } - dist_min[k] = dist; - index[k] = i; - break; - } - } - } - return; -} - - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: apisf_2s.c * +* * +* Description: Coding/Decodeing of ISF parameters with predication +* The ISF vector is quantized using two-stage VQ with split-by-2 * +* in 1st stage and split-by-5(or 3) in the second stage * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "cnst.h" +#include "acelp.h" +#include "qpisf_2s.tab" /* Codebooks of isfs */ + +#define MU 10923 /* Prediction factor (1.0/3.0) in Q15 */ +#define N_SURV_MAX 4 /* 4 survivors max */ +#define ALPHA 29491 /* 0. 9 in Q15 */ +#define ONE_ALPHA (32768-ALPHA) /* (1.0 - ALPHA) in Q15 */ + +/* private functions */ +static void VQ_stage1( + Word16 * x, /* input : ISF residual vector */ + Word16 * dico, /* input : quantization codebook */ + Word16 dim, /* input : dimention of vector */ + Word16 dico_size, /* input : size of quantization codebook */ + Word16 * index, /* output: indices of survivors */ + Word16 surv /* input : number of survivor */ + ); + +/************************************************************************** +* Function: Qpisf_2s_46B() * +* * +* Description: Quantization of isf parameters with prediction. (46 bits) * +* * +* The isf vector is quantized using two-stage VQ with split-by-2 in * +* 1st stage and split-by-5 in the second stage. * +***************************************************************************/ + +void Qpisf_2s_46b( + Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ + Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ + Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ + Word16 * indice, /* (o) : quantization indices */ + Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ + ) +{ + Word16 tmp_ind[5]; + Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */ + Word32 i, k, temp, min_err, distance; + Word16 isf[ORDER]; + Word16 isf_stage2[ORDER]; + + for (i = 0; i < ORDER; i++) + { + isf[i] = vo_sub(isf1[i], mean_isf[i]); + isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i])); + } + + VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv); + + distance = MAX_32; + + for (k = 0; k < nb_surv; k++) + { + for (i = 0; i < 9; i++) + { + isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]); + } + tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err); + temp = min_err; + tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err); + temp = vo_L_add(temp, min_err); + tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err); + temp = vo_L_add(temp, min_err); + + if(temp < distance) + { + distance = temp; + indice[0] = surv1[k]; + for (i = 0; i < 3; i++) + { + indice[i + 2] = tmp_ind[i]; + } + } + } + + + VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv); + + distance = MAX_32; + + for (k = 0; k < nb_surv; k++) + { + for (i = 0; i < 7; i++) + { + isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]); + } + + tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err); + temp = min_err; + tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err); + temp = vo_L_add(temp, min_err); + + if(temp < distance) + { + distance = temp; + indice[1] = surv1[k]; + for (i = 0; i < 2; i++) + { + indice[i + 5] = tmp_ind[i]; + } + } + } + + Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0); + + return; +} + +/***************************************************************************** +* Function: Qpisf_2s_36B() * +* * +* Description: Quantization of isf parameters with prediction. (36 bits) * +* * +* The isf vector is quantized using two-stage VQ with split-by-2 in * +* 1st stage and split-by-3 in the second stage. * +******************************************************************************/ + +void Qpisf_2s_36b( + Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ + Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ + Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ + Word16 * indice, /* (o) : quantization indices */ + Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ + ) +{ + Word16 i, k, tmp_ind[5]; + Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */ + Word32 temp, min_err, distance; + Word16 isf[ORDER]; + Word16 isf_stage2[ORDER]; + + for (i = 0; i < ORDER; i++) + { + isf[i] = vo_sub(isf1[i], mean_isf[i]); + isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i])); + } + + VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv); + + distance = MAX_32; + + for (k = 0; k < nb_surv; k++) + { + for (i = 0; i < 9; i++) + { + isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]); + } + + tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err); + temp = min_err; + tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err); + temp = vo_L_add(temp, min_err); + + if(temp < distance) + { + distance = temp; + indice[0] = surv1[k]; + for (i = 0; i < 2; i++) + { + indice[i + 2] = tmp_ind[i]; + } + } + } + + VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv); + distance = MAX_32; + + for (k = 0; k < nb_surv; k++) + { + for (i = 0; i < 7; i++) + { + isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]); + } + + tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err); + temp = min_err; + + if(temp < distance) + { + distance = temp; + indice[1] = surv1[k]; + indice[4] = tmp_ind[0]; + } + } + + Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0); + + return; +} + +/********************************************************************* +* Function: Dpisf_2s_46b() * +* * +* Description: Decoding of ISF parameters * +**********************************************************************/ + +void Dpisf_2s_46b( + Word16 * indice, /* input: quantization indices */ + Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ + Word16 * past_isfq, /* i/0 : past ISF quantizer */ + Word16 * isfold, /* input : past quantized ISF */ + Word16 * isf_buf, /* input : isf buffer */ + Word16 bfi, /* input : Bad frame indicator */ + Word16 enc_dec + ) +{ + Word16 ref_isf[M], tmp; + Word32 i, j, L_tmp; + + if (bfi == 0) /* Good frame */ + { + for (i = 0; i < 9; i++) + { + isf_q[i] = dico1_isf[indice[0] * 9 + i]; + } + for (i = 0; i < 7; i++) + { + isf_q[i + 9] = dico2_isf[indice[1] * 7 + i]; + } + + for (i = 0; i < 3; i++) + { + isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]); + isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]); + isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]); + isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]); + } + + for (i = 0; i < 4; i++) + { + isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]); + } + + for (i = 0; i < ORDER; i++) + { + tmp = isf_q[i]; + isf_q[i] = add1(tmp, mean_isf[i]); + isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i])); + past_isfq[i] = tmp; + } + + if (enc_dec) + { + for (i = 0; i < M; i++) + { + for (j = (L_MEANBUF - 1); j > 0; j--) + { + isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; + } + isf_buf[i] = isf_q[i]; + } + } + } else + { /* bad frame */ + for (i = 0; i < M; i++) + { + L_tmp = mean_isf[i] << 14; + for (j = 0; j < L_MEANBUF; j++) + { + L_tmp += (isf_buf[j * M + i] << 14); + } + ref_isf[i] = vo_round(L_tmp); + } + + /* use the past ISFs slightly shifted towards their mean */ + for (i = 0; i < ORDER; i++) + { + isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i])); + } + + /* estimate past quantized residual to be used in next frame */ + for (i = 0; i < ORDER; i++) + { + tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */ + past_isfq[i] = vo_sub(isf_q[i], tmp); + past_isfq[i] = (past_isfq[i] >> 1); /* past_isfq[i] *= 0.5 */ + } + } + + Reorder_isf(isf_q, ISF_GAP, ORDER); + return; +} + +/********************************************************************* +* Function: Disf_2s_36b() * +* * +* Description: Decoding of ISF parameters * +*********************************************************************/ + +void Dpisf_2s_36b( + Word16 * indice, /* input: quantization indices */ + Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ + Word16 * past_isfq, /* i/0 : past ISF quantizer */ + Word16 * isfold, /* input : past quantized ISF */ + Word16 * isf_buf, /* input : isf buffer */ + Word16 bfi, /* input : Bad frame indicator */ + Word16 enc_dec + ) +{ + Word16 ref_isf[M], tmp; + Word32 i, j, L_tmp; + + if (bfi == 0) /* Good frame */ + { + for (i = 0; i < 9; i++) + { + isf_q[i] = dico1_isf[indice[0] * 9 + i]; + } + for (i = 0; i < 7; i++) + { + isf_q[i + 9] = dico2_isf[indice[1] * 7 + i]; + } + + for (i = 0; i < 5; i++) + { + isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]); + } + for (i = 0; i < 4; i++) + { + isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]); + } + for (i = 0; i < 7; i++) + { + isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]); + } + + for (i = 0; i < ORDER; i++) + { + tmp = isf_q[i]; + isf_q[i] = add1(tmp, mean_isf[i]); + isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i])); + past_isfq[i] = tmp; + } + + + if (enc_dec) + { + for (i = 0; i < M; i++) + { + for (j = (L_MEANBUF - 1); j > 0; j--) + { + isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; + } + isf_buf[i] = isf_q[i]; + } + } + } else + { /* bad frame */ + for (i = 0; i < M; i++) + { + L_tmp = (mean_isf[i] << 14); + for (j = 0; j < L_MEANBUF; j++) + { + L_tmp += (isf_buf[j * M + i] << 14); + } + ref_isf[i] = vo_round(L_tmp); + } + + /* use the past ISFs slightly shifted towards their mean */ + for (i = 0; i < ORDER; i++) + { + isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i])); + } + + /* estimate past quantized residual to be used in next frame */ + for (i = 0; i < ORDER; i++) + { + tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */ + past_isfq[i] = vo_sub(isf_q[i], tmp); + past_isfq[i] = past_isfq[i] >> 1; /* past_isfq[i] *= 0.5 */ + } + } + + Reorder_isf(isf_q, ISF_GAP, ORDER); + + return; +} + + +/*************************************************************************** +* Function: Reorder_isf() * +* * +* Description: To make sure that the isfs are properly order and to * +* keep a certain minimum distance between consecutive isfs. * +*--------------------------------------------------------------------------* +* Argument description in/out * +* * +* isf[] vector of isfs i/o * +* min_dist minimum required distance i * +* n LPC order i * +****************************************************************************/ + +void Reorder_isf( + Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */ + Word16 min_dist, /* (i) Q15 : minimum distance to keep */ + Word16 n /* (i) : number of ISF */ + ) +{ + Word32 i; + Word16 isf_min; + + isf_min = min_dist; + for (i = 0; i < n - 1; i++) + { + if(isf[i] < isf_min) + { + isf[i] = isf_min; + } + isf_min = (isf[i] + min_dist); + } + return; +} + + +Word16 Sub_VQ( /* output: return quantization index */ + Word16 * x, /* input : ISF residual vector */ + Word16 * dico, /* input : quantization codebook */ + Word16 dim, /* input : dimention of vector */ + Word16 dico_size, /* input : size of quantization codebook */ + Word32 * distance /* output: error of quantization */ + ) +{ + Word16 temp, *p_dico; + Word32 i, j, index; + Word32 dist_min, dist; + + dist_min = MAX_32; + p_dico = dico; + + index = 0; + for (i = 0; i < dico_size; i++) + { + dist = 0; + + for (j = 0; j < dim; j++) + { + temp = x[j] - (*p_dico++); + dist += (temp * temp)<<1; + } + + if(dist < dist_min) + { + dist_min = dist; + index = i; + } + } + + *distance = dist_min; + + /* Reading the selected vector */ + p_dico = &dico[index * dim]; + for (j = 0; j < dim; j++) + { + x[j] = *p_dico++; + } + + return index; +} + + +static void VQ_stage1( + Word16 * x, /* input : ISF residual vector */ + Word16 * dico, /* input : quantization codebook */ + Word16 dim, /* input : dimention of vector */ + Word16 dico_size, /* input : size of quantization codebook */ + Word16 * index, /* output: indices of survivors */ + Word16 surv /* input : number of survivor */ + ) +{ + Word16 temp, *p_dico; + Word32 i, j, k, l; + Word32 dist_min[N_SURV_MAX], dist; + + dist_min[0] = MAX_32; + dist_min[1] = MAX_32; + dist_min[2] = MAX_32; + dist_min[3] = MAX_32; + index[0] = 0; + index[1] = 1; + index[2] = 2; + index[3] = 3; + + p_dico = dico; + + for (i = 0; i < dico_size; i++) + { + dist = 0; + for (j = 0; j < dim; j++) + { + temp = x[j] - (*p_dico++); + dist += (temp * temp)<<1; + } + + for (k = 0; k < surv; k++) + { + if(dist < dist_min[k]) + { + for (l = surv - 1; l > k; l--) + { + dist_min[l] = dist_min[l - 1]; + index[l] = index[l - 1]; + } + dist_min[k] = dist; + index[k] = i; + break; + } + } + } + return; +} + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/random.c b/media/libstagefright/codecs/amrwbenc/src/random.c index 8baa8bf..b896863 100644 --- a/media/libstagefright/codecs/amrwbenc/src/random.c +++ b/media/libstagefright/codecs/amrwbenc/src/random.c @@ -1,33 +1,33 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: random.c * -* * -* Description: Signed 16 bits random generator * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" - -Word16 Random(Word16 * seed) -{ - /* static Word16 seed = 21845; */ - *seed = (Word16)(L_add((L_mult(*seed, 31821) >> 1), 13849L)); - return (*seed); -} - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: random.c * +* * +* Description: Signed 16 bits random generator * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" + +Word16 Random(Word16 * seed) +{ + /* static Word16 seed = 21845; */ + *seed = (Word16)(L_add((L_mult(*seed, 31821) >> 1), 13849L)); + return (*seed); +} + diff --git a/media/libstagefright/codecs/amrwbenc/src/residu.c b/media/libstagefright/codecs/amrwbenc/src/residu.c index 6829882..328aed2 100644 --- a/media/libstagefright/codecs/amrwbenc/src/residu.c +++ b/media/libstagefright/codecs/amrwbenc/src/residu.c @@ -1,67 +1,67 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: residu.c * -* * -* Description: Compute the LPC residual by filtering * -* the input speech through A(z) * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" - -void Residu( - Word16 a[], /* (i) Q12 : prediction coefficients */ - Word16 x[], /* (i) : speech (values x[-m..-1] are needed */ - Word16 y[], /* (o) x2 : residual signal */ - Word16 lg /* (i) : size of filtering */ - ) -{ - Word16 i,*p1, *p2; - Word32 s; - for (i = 0; i < lg; i++) - { - p1 = a; - p2 = &x[i]; - s = vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1++), (*p2--)); - s += vo_mult32((*p1), (*p2)); - - s = L_shl2(s, 5); - y[i] = extract_h(L_add(s, 0x8000)); - } - - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: residu.c * +* * +* Description: Compute the LPC residual by filtering * +* the input speech through A(z) * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" + +void Residu( + Word16 a[], /* (i) Q12 : prediction coefficients */ + Word16 x[], /* (i) : speech (values x[-m..-1] are needed */ + Word16 y[], /* (o) x2 : residual signal */ + Word16 lg /* (i) : size of filtering */ + ) +{ + Word16 i,*p1, *p2; + Word32 s; + for (i = 0; i < lg; i++) + { + p1 = a; + p2 = &x[i]; + s = vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1++), (*p2--)); + s += vo_mult32((*p1), (*p2)); + + s = L_shl2(s, 5); + y[i] = extract_h(L_add(s, 0x8000)); + } + + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/scale.c b/media/libstagefright/codecs/amrwbenc/src/scale.c index af40121..b203bec 100644 --- a/media/libstagefright/codecs/amrwbenc/src/scale.c +++ b/media/libstagefright/codecs/amrwbenc/src/scale.c @@ -1,57 +1,57 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: scale.c * -* * -* Description: Scale signal to get maximum of dynamic * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" - -void Scale_sig( - Word16 x[], /* (i/o) : signal to scale */ - Word16 lg, /* (i) : size of x[] */ - Word16 exp /* (i) : exponent: x = round(x << exp) */ - ) -{ - Word32 i; - Word32 L_tmp; - if(exp > 0) - { - for (i = lg - 1 ; i >= 0; i--) - { - L_tmp = L_shl2(x[i], 16 + exp); - x[i] = extract_h(L_add(L_tmp, 0x8000)); - } - } - else - { - exp = -exp; - for (i = lg - 1; i >= 0; i--) - { - L_tmp = x[i] << 16; - L_tmp >>= exp; - x[i] = (L_tmp + 0x8000)>>16; - } - } - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: scale.c * +* * +* Description: Scale signal to get maximum of dynamic * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" + +void Scale_sig( + Word16 x[], /* (i/o) : signal to scale */ + Word16 lg, /* (i) : size of x[] */ + Word16 exp /* (i) : exponent: x = round(x << exp) */ + ) +{ + Word32 i; + Word32 L_tmp; + if(exp > 0) + { + for (i = lg - 1 ; i >= 0; i--) + { + L_tmp = L_shl2(x[i], 16 + exp); + x[i] = extract_h(L_add(L_tmp, 0x8000)); + } + } + else + { + exp = -exp; + for (i = lg - 1; i >= 0; i--) + { + L_tmp = x[i] << 16; + L_tmp >>= exp; + x[i] = (L_tmp + 0x8000)>>16; + } + } + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/stream.c b/media/libstagefright/codecs/amrwbenc/src/stream.c index a708235..bdf0d46 100644 --- a/media/libstagefright/codecs/amrwbenc/src/stream.c +++ b/media/libstagefright/codecs/amrwbenc/src/stream.c @@ -1,58 +1,58 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: stream.c * -* * -* Description: VOME API Buffer Operator Implement Code * -* * -************************************************************************/ - -#include "stream.h" - -void voAWB_InitFrameBuffer(FrameStream *stream) -{ - stream->set_ptr = NULL; - stream->frame_ptr_bk = stream->frame_ptr; - stream->set_len = 0; - stream->framebuffer_len = 0; - stream->frame_storelen = 0; -} - -void voAWB_UpdateFrameBuffer( - FrameStream *stream, - VO_MEM_OPERATOR *pMemOP - ) -{ - int len; - len = MIN(Frame_Maxsize - stream->frame_storelen, stream->set_len); - pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk + stream->frame_storelen , stream->set_ptr, len); - stream->set_len -= len; - stream->set_ptr += len; - stream->framebuffer_len = stream->frame_storelen + len; - stream->frame_ptr = stream->frame_ptr_bk; - stream->used_len += len; -} - -void voAWB_FlushFrameBuffer(FrameStream *stream) -{ - stream->set_ptr = NULL; - stream->frame_ptr_bk = stream->frame_ptr; - stream->set_len = 0; - stream->framebuffer_len = 0; - stream->frame_storelen = 0; -} - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: stream.c * +* * +* Description: VOME API Buffer Operator Implement Code * +* * +************************************************************************/ + +#include "stream.h" + +void voAWB_InitFrameBuffer(FrameStream *stream) +{ + stream->set_ptr = NULL; + stream->frame_ptr_bk = stream->frame_ptr; + stream->set_len = 0; + stream->framebuffer_len = 0; + stream->frame_storelen = 0; +} + +void voAWB_UpdateFrameBuffer( + FrameStream *stream, + VO_MEM_OPERATOR *pMemOP + ) +{ + int len; + len = MIN(Frame_Maxsize - stream->frame_storelen, stream->set_len); + pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk + stream->frame_storelen , stream->set_ptr, len); + stream->set_len -= len; + stream->set_ptr += len; + stream->framebuffer_len = stream->frame_storelen + len; + stream->frame_ptr = stream->frame_ptr_bk; + stream->used_len += len; +} + +void voAWB_FlushFrameBuffer(FrameStream *stream) +{ + stream->set_ptr = NULL; + stream->frame_ptr_bk = stream->frame_ptr; + stream->set_len = 0; + stream->framebuffer_len = 0; + stream->frame_storelen = 0; +} + diff --git a/media/libstagefright/codecs/amrwbenc/src/syn_filt.c b/media/libstagefright/codecs/amrwbenc/src/syn_filt.c index 6c1fb8e..90fafb0 100644 --- a/media/libstagefright/codecs/amrwbenc/src/syn_filt.c +++ b/media/libstagefright/codecs/amrwbenc/src/syn_filt.c @@ -1,160 +1,160 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: syn_filt.c * -* * -* Description: Do the synthesis filtering 1/A(z) * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "math_op.h" -#include "cnst.h" - -void Syn_filt( - Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ - Word16 x[], /* (i) : input signal */ - Word16 y[], /* (o) : output signal */ - Word16 lg, /* (i) : size of filtering */ - Word16 mem[], /* (i/o) : memory associated with this filtering. */ - Word16 update /* (i) : 0=no update, 1=update of memory. */ - ) -{ - Word32 i, a0; - Word16 y_buf[L_SUBFR16k + M16k]; - Word32 L_tmp; - Word16 *yy, *p1, *p2; - yy = &y_buf[0]; - /* copy initial filter states into synthesis buffer */ - for (i = 0; i < 16; i++) - { - *yy++ = mem[i]; - } - a0 = (a[0] >> 1); /* input / 2 */ - /* Do the filtering. */ - for (i = 0; i < lg; i++) - { - p1 = &a[1]; - p2 = &yy[i-1]; - L_tmp = vo_mult32(a0, x[i]); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1++), (*p2--)); - L_tmp -= vo_mult32((*p1), (*p2)); - - L_tmp = L_shl2(L_tmp, 4); - y[i] = yy[i] = extract_h(L_add(L_tmp, 0x8000)); - } - /* Update memory if required */ - if (update) - for (i = 0; i < 16; i++) - { - mem[i] = yy[lg - 16 + i]; - } - return; -} - - -void Syn_filt_32( - Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ - Word16 m, /* (i) : order of LP filter */ - Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ - Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ - Word16 sig_hi[], /* (o) /16 : synthesis high */ - Word16 sig_lo[], /* (o) /16 : synthesis low */ - Word16 lg /* (i) : size of filtering */ - ) -{ - Word32 i,a0; - Word32 L_tmp, L_tmp1; - Word16 *p1, *p2, *p3; - a0 = a[0] >> (4 + Qnew); /* input / 16 and >>Qnew */ - /* Do the filtering. */ - for (i = 0; i < lg; i++) - { - L_tmp = 0; - L_tmp1 = 0; - p1 = a; - p2 = &sig_lo[i - 1]; - p3 = &sig_hi[i - 1]; - - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - L_tmp -= vo_mult32((*p2--), (*p1)); - L_tmp1 -= vo_mult32((*p3--), (*p1++)); - - L_tmp = L_tmp >> 11; - L_tmp += vo_L_mult(exc[i], a0); - - /* sig_hi = bit16 to bit31 of synthesis */ - L_tmp = L_tmp - (L_tmp1<<1); - - L_tmp = L_tmp >> 3; /* ai in Q12 */ - sig_hi[i] = extract_h(L_tmp); - - /* sig_lo = bit4 to bit15 of synthesis */ - L_tmp >>= 4; /* 4 : sig_lo[i] >> 4 */ - sig_lo[i] = (Word16)((L_tmp - (sig_hi[i] << 13))); - } - - return; -} - - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: syn_filt.c * +* * +* Description: Do the synthesis filtering 1/A(z) * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "math_op.h" +#include "cnst.h" + +void Syn_filt( + Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ + Word16 x[], /* (i) : input signal */ + Word16 y[], /* (o) : output signal */ + Word16 lg, /* (i) : size of filtering */ + Word16 mem[], /* (i/o) : memory associated with this filtering. */ + Word16 update /* (i) : 0=no update, 1=update of memory. */ + ) +{ + Word32 i, a0; + Word16 y_buf[L_SUBFR16k + M16k]; + Word32 L_tmp; + Word16 *yy, *p1, *p2; + yy = &y_buf[0]; + /* copy initial filter states into synthesis buffer */ + for (i = 0; i < 16; i++) + { + *yy++ = mem[i]; + } + a0 = (a[0] >> 1); /* input / 2 */ + /* Do the filtering. */ + for (i = 0; i < lg; i++) + { + p1 = &a[1]; + p2 = &yy[i-1]; + L_tmp = vo_mult32(a0, x[i]); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1++), (*p2--)); + L_tmp -= vo_mult32((*p1), (*p2)); + + L_tmp = L_shl2(L_tmp, 4); + y[i] = yy[i] = extract_h(L_add(L_tmp, 0x8000)); + } + /* Update memory if required */ + if (update) + for (i = 0; i < 16; i++) + { + mem[i] = yy[lg - 16 + i]; + } + return; +} + + +void Syn_filt_32( + Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ + Word16 m, /* (i) : order of LP filter */ + Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ + Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ + Word16 sig_hi[], /* (o) /16 : synthesis high */ + Word16 sig_lo[], /* (o) /16 : synthesis low */ + Word16 lg /* (i) : size of filtering */ + ) +{ + Word32 i,a0; + Word32 L_tmp, L_tmp1; + Word16 *p1, *p2, *p3; + a0 = a[0] >> (4 + Qnew); /* input / 16 and >>Qnew */ + /* Do the filtering. */ + for (i = 0; i < lg; i++) + { + L_tmp = 0; + L_tmp1 = 0; + p1 = a; + p2 = &sig_lo[i - 1]; + p3 = &sig_hi[i - 1]; + + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + L_tmp -= vo_mult32((*p2--), (*p1)); + L_tmp1 -= vo_mult32((*p3--), (*p1++)); + + L_tmp = L_tmp >> 11; + L_tmp += vo_L_mult(exc[i], a0); + + /* sig_hi = bit16 to bit31 of synthesis */ + L_tmp = L_tmp - (L_tmp1<<1); + + L_tmp = L_tmp >> 3; /* ai in Q12 */ + sig_hi[i] = extract_h(L_tmp); + + /* sig_lo = bit4 to bit15 of synthesis */ + L_tmp >>= 4; /* 4 : sig_lo[i] >> 4 */ + sig_lo[i] = (Word16)((L_tmp - (sig_hi[i] << 13))); + } + + return; +} + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/updt_tar.c b/media/libstagefright/codecs/amrwbenc/src/updt_tar.c index f3e5650..eda2b1c 100644 --- a/media/libstagefright/codecs/amrwbenc/src/updt_tar.c +++ b/media/libstagefright/codecs/amrwbenc/src/updt_tar.c @@ -1,49 +1,49 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: updt_tar.c * -* * -* Description: Update the target vector for codebook search * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" - -void Updt_tar( - Word16 * x, /* (i) Q0 : old target (for pitch search) */ - Word16 * x2, /* (o) Q0 : new target (for codebook search) */ - Word16 * y, /* (i) Q0 : filtered adaptive codebook vector */ - Word16 gain, /* (i) Q14 : adaptive codebook gain */ - Word16 L /* (i) : subframe size */ - ) -{ - Word32 i; - Word32 L_tmp; - - for (i = 0; i < L; i++) - { - L_tmp = x[i] << 15; - L_tmp -= (y[i] * gain)<<1; - x2[i] = extract_h(L_shl2(L_tmp, 1)); - } - - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: updt_tar.c * +* * +* Description: Update the target vector for codebook search * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" + +void Updt_tar( + Word16 * x, /* (i) Q0 : old target (for pitch search) */ + Word16 * x2, /* (o) Q0 : new target (for codebook search) */ + Word16 * y, /* (i) Q0 : filtered adaptive codebook vector */ + Word16 gain, /* (i) Q14 : adaptive codebook gain */ + Word16 L /* (i) : subframe size */ + ) +{ + Word32 i; + Word32 L_tmp; + + for (i = 0; i < L; i++) + { + L_tmp = x[i] << 15; + L_tmp -= (y[i] * gain)<<1; + x2[i] = extract_h(L_shl2(L_tmp, 1)); + } + + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/util.c b/media/libstagefright/codecs/amrwbenc/src/util.c index 78141dd..76ab1b1 100644 --- a/media/libstagefright/codecs/amrwbenc/src/util.c +++ b/media/libstagefright/codecs/amrwbenc/src/util.c @@ -1,74 +1,74 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: util.c * -* * -* Description: Reset and Copy buffer * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" - -/*********************************************************************** -* Function: Set_zero() * -* Description: Set vector x[] to zero * -************************************************************************/ - -void Set_zero( - Word16 x[], /* (o) : vector to clear */ - Word16 L /* (i) : length of vector */ - ) -{ - Word32 num = (Word32)L; - do{ - *x++ = 0; - }while(--num !=0); -} - - -/********************************************************************* -* Function: Copy() * -* * -* Description: Copy vector x[] to y[] * -*********************************************************************/ - -void Copy( - Word16 x[], /* (i) : input vector */ - Word16 y[], /* (o) : output vector */ - Word16 L /* (i) : vector length */ - ) -{ - Word32 temp1,temp2,num; - if(L&1) - { - temp1 = *x++; - *y++ = temp1; - } - num = (Word32)(L>>1); - temp1 = *x++; - temp2 = *x++; - do{ - *y++ = temp1; - *y++ = temp2; - temp1 = *x++; - temp2 = *x++; - }while(--num!=0); -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: util.c * +* * +* Description: Reset and Copy buffer * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" + +/*********************************************************************** +* Function: Set_zero() * +* Description: Set vector x[] to zero * +************************************************************************/ + +void Set_zero( + Word16 x[], /* (o) : vector to clear */ + Word16 L /* (i) : length of vector */ + ) +{ + Word32 num = (Word32)L; + do{ + *x++ = 0; + }while(--num !=0); +} + + +/********************************************************************* +* Function: Copy() * +* * +* Description: Copy vector x[] to y[] * +*********************************************************************/ + +void Copy( + Word16 x[], /* (i) : input vector */ + Word16 y[], /* (o) : output vector */ + Word16 L /* (i) : vector length */ + ) +{ + Word32 temp1,temp2,num; + if(L&1) + { + temp1 = *x++; + *y++ = temp1; + } + num = (Word32)(L>>1); + temp1 = *x++; + temp2 = *x++; + do{ + *y++ = temp1; + *y++ = temp2; + temp1 = *x++; + temp2 = *x++; + }while(--num!=0); +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c b/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c index d0d99a7..bac00dd 100644 --- a/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c +++ b/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c @@ -1,1941 +1,1941 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: voAMRWBEnc.c * -* * -* Description: Performs the main encoder routine * -* Fixed-point C simulation of AMR WB ACELP coding * -* algorithm with 20 msspeech frames for * -* wideband speech signals. * -* * -************************************************************************/ - -#include -#include -#include "typedef.h" -#include "basic_op.h" -#include "oper_32b.h" -#include "math_op.h" -#include "cnst.h" -#include "acelp.h" -#include "cod_main.h" -#include "bits.h" -#include "main.h" -#include "voAMRWB.h" -#include "mem_align.h" -#include "cmnMemory.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* LPC interpolation coef {0.45, 0.8, 0.96, 1.0}; in Q15 */ -static Word16 interpol_frac[NB_SUBFR] = {14746, 26214, 31457, 32767}; - -/* isp tables for initialization */ -static Word16 isp_init[M] = -{ - 32138, 30274, 27246, 23170, 18205, 12540, 6393, 0, - -6393, -12540, -18205, -23170, -27246, -30274, -32138, 1475 -}; - -static Word16 isf_init[M] = -{ - 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, - 9216, 10240, 11264, 12288, 13312, 14336, 15360, 3840 -}; - -/* High Band encoding */ -static const Word16 HP_gain[16] = -{ - 3624, 4673, 5597, 6479, 7425, 8378, 9324, 10264, - 11210, 12206, 13391, 14844, 16770, 19655, 24289, 32728 -}; - -/* Private function declaration */ -static Word16 synthesis( - Word16 Aq[], /* A(z) : quantized Az */ - Word16 exc[], /* (i) : excitation at 12kHz */ - Word16 Q_new, /* (i) : scaling performed on exc */ - Word16 synth16k[], /* (o) : 16kHz synthesis signal */ - Coder_State * st /* (i/o) : State structure */ - ); - -/* Codec some parameters initialization */ -void Reset_encoder(void *st, Word16 reset_all) -{ - Word16 i; - Coder_State *cod_state; - cod_state = (Coder_State *) st; - Set_zero(cod_state->old_exc, PIT_MAX + L_INTERPOL); - Set_zero(cod_state->mem_syn, M); - Set_zero(cod_state->past_isfq, M); - cod_state->mem_w0 = 0; - cod_state->tilt_code = 0; - cod_state->first_frame = 1; - Init_gp_clip(cod_state->gp_clip); - cod_state->L_gc_thres = 0; - if (reset_all != 0) - { - /* Static vectors to zero */ - Set_zero(cod_state->old_speech, L_TOTAL - L_FRAME); - Set_zero(cod_state->old_wsp, (PIT_MAX / OPL_DECIM)); - Set_zero(cod_state->mem_decim2, 3); - /* routines initialization */ - Init_Decim_12k8(cod_state->mem_decim); - Init_HP50_12k8(cod_state->mem_sig_in); - Init_Levinson(cod_state->mem_levinson); - Init_Q_gain2(cod_state->qua_gain); - Init_Hp_wsp(cod_state->hp_wsp_mem); - /* isp initialization */ - Copy(isp_init, cod_state->ispold, M); - Copy(isp_init, cod_state->ispold_q, M); - /* variable initialization */ - cod_state->mem_preemph = 0; - cod_state->mem_wsp = 0; - cod_state->Q_old = 15; - cod_state->Q_max[0] = 15; - cod_state->Q_max[1] = 15; - cod_state->old_wsp_max = 0; - cod_state->old_wsp_shift = 0; - /* pitch ol initialization */ - cod_state->old_T0_med = 40; - cod_state->ol_gain = 0; - cod_state->ada_w = 0; - cod_state->ol_wght_flg = 0; - for (i = 0; i < 5; i++) - { - cod_state->old_ol_lag[i] = 40; - } - Set_zero(cod_state->old_hp_wsp, (L_FRAME / 2) / OPL_DECIM + (PIT_MAX / OPL_DECIM)); - Set_zero(cod_state->mem_syn_hf, M); - Set_zero(cod_state->mem_syn_hi, M); - Set_zero(cod_state->mem_syn_lo, M); - Init_HP50_12k8(cod_state->mem_sig_out); - Init_Filt_6k_7k(cod_state->mem_hf); - Init_HP400_12k8(cod_state->mem_hp400); - Copy(isf_init, cod_state->isfold, M); - cod_state->mem_deemph = 0; - cod_state->seed2 = 21845; - Init_Filt_6k_7k(cod_state->mem_hf2); - cod_state->gain_alpha = 32767; - cod_state->vad_hist = 0; - wb_vad_reset(cod_state->vadSt); - dtx_enc_reset(cod_state->dtx_encSt, isf_init); - } - return; -} - -/*-----------------------------------------------------------------* -* Funtion coder * -* ~~~~~ * -* ->Main coder routine. * -* * -*-----------------------------------------------------------------*/ -void coder( - Word16 * mode, /* input : used mode */ - Word16 speech16k[], /* input : 320 new speech samples (at 16 kHz) */ - Word16 prms[], /* output: output parameters */ - Word16 * ser_size, /* output: bit rate of the used mode */ - void *spe_state, /* i/o : State structure */ - Word16 allow_dtx /* input : DTX ON/OFF */ - ) -{ - /* Coder states */ - Coder_State *st; - /* Speech vector */ - Word16 old_speech[L_TOTAL]; - Word16 *new_speech, *speech, *p_window; - - /* Weighted speech vector */ - Word16 old_wsp[L_FRAME + (PIT_MAX / OPL_DECIM)]; - Word16 *wsp; - - /* Excitation vector */ - Word16 old_exc[(L_FRAME + 1) + PIT_MAX + L_INTERPOL]; - Word16 *exc; - - /* LPC coefficients */ - Word16 r_h[M + 1], r_l[M + 1]; /* Autocorrelations of windowed speech */ - Word16 rc[M]; /* Reflection coefficients. */ - Word16 Ap[M + 1]; /* A(z) with spectral expansion */ - Word16 ispnew[M]; /* immittance spectral pairs at 4nd sfr */ - Word16 ispnew_q[M]; /* quantized ISPs at 4nd subframe */ - Word16 isf[M]; /* ISF (frequency domain) at 4nd sfr */ - Word16 *p_A, *p_Aq; /* ptr to A(z) for the 4 subframes */ - Word16 A[NB_SUBFR * (M + 1)]; /* A(z) unquantized for the 4 subframes */ - Word16 Aq[NB_SUBFR * (M + 1)]; /* A(z) quantized for the 4 subframes */ - - /* Other vectors */ - Word16 xn[L_SUBFR]; /* Target vector for pitch search */ - Word16 xn2[L_SUBFR]; /* Target vector for codebook search */ - Word16 dn[L_SUBFR]; /* Correlation between xn2 and h1 */ - Word16 cn[L_SUBFR]; /* Target vector in residual domain */ - Word16 h1[L_SUBFR]; /* Impulse response vector */ - Word16 h2[L_SUBFR]; /* Impulse response vector */ - Word16 code[L_SUBFR]; /* Fixed codebook excitation */ - Word16 y1[L_SUBFR]; /* Filtered adaptive excitation */ - Word16 y2[L_SUBFR]; /* Filtered adaptive excitation */ - Word16 error[M + L_SUBFR]; /* error of quantization */ - Word16 synth[L_SUBFR]; /* 12.8kHz synthesis vector */ - Word16 exc2[L_FRAME]; /* excitation vector */ - Word16 buf[L_FRAME]; /* VAD buffer */ - - /* Scalars */ - Word32 i, j, i_subfr, select, pit_flag, clip_gain, vad_flag; - Word16 codec_mode; - Word16 T_op, T_op2, T0, T0_min, T0_max, T0_frac, index; - Word16 gain_pit, gain_code, g_coeff[4], g_coeff2[4]; - Word16 tmp, gain1, gain2, exp, Q_new, mu, shift, max; - Word16 voice_fac; - Word16 indice[8]; - Word32 L_tmp, L_gain_code, L_max, L_tmp1; - Word16 code2[L_SUBFR]; /* Fixed codebook excitation */ - Word16 stab_fac, fac, gain_code_lo; - - Word16 corr_gain; - Word16 *vo_p0, *vo_p1, *vo_p2, *vo_p3; - - st = (Coder_State *) spe_state; - - *ser_size = nb_of_bits[*mode]; - codec_mode = *mode; - - /*--------------------------------------------------------------------------* - * Initialize pointers to speech vector. * - * * - * * - * |-------|-------|-------|-------|-------|-------| * - * past sp sf1 sf2 sf3 sf4 L_NEXT * - * <------- Total speech buffer (L_TOTAL) ------> * - * old_speech * - * <------- LPC analysis window (L_WINDOW) ------> * - * | <-- present frame (L_FRAME) ----> * - * p_window | <----- new speech (L_FRAME) ----> * - * | | * - * speech | * - * new_speech * - *--------------------------------------------------------------------------*/ - - new_speech = old_speech + L_TOTAL - L_FRAME - L_FILT; /* New speech */ - speech = old_speech + L_TOTAL - L_FRAME - L_NEXT; /* Present frame */ - p_window = old_speech + L_TOTAL - L_WINDOW; - - exc = old_exc + PIT_MAX + L_INTERPOL; - wsp = old_wsp + (PIT_MAX / OPL_DECIM); - - /* copy coder memory state into working space */ - Copy(st->old_speech, old_speech, L_TOTAL - L_FRAME); - Copy(st->old_wsp, old_wsp, PIT_MAX / OPL_DECIM); - Copy(st->old_exc, old_exc, PIT_MAX + L_INTERPOL); - - /*---------------------------------------------------------------* - * Down sampling signal from 16kHz to 12.8kHz * - * -> The signal is extended by L_FILT samples (padded to zero) * - * to avoid additional delay (L_FILT samples) in the coder. * - * The last L_FILT samples are approximated after decimation and * - * are used (and windowed) only in autocorrelations. * - *---------------------------------------------------------------*/ - - Decim_12k8(speech16k, L_FRAME16k, new_speech, st->mem_decim); - - /* last L_FILT samples for autocorrelation window */ - Copy(st->mem_decim, code, 2 * L_FILT16k); - Set_zero(error, L_FILT16k); /* set next sample to zero */ - Decim_12k8(error, L_FILT16k, new_speech + L_FRAME, code); - - /*---------------------------------------------------------------* - * Perform 50Hz HP filtering of input signal. * - *---------------------------------------------------------------*/ - - HP50_12k8(new_speech, L_FRAME, st->mem_sig_in); - - /* last L_FILT samples for autocorrelation window */ - Copy(st->mem_sig_in, code, 6); - HP50_12k8(new_speech + L_FRAME, L_FILT, code); - - /*---------------------------------------------------------------* - * Perform fixed preemphasis through 1 - g z^-1 * - * Scale signal to get maximum of precision in filtering * - *---------------------------------------------------------------*/ - - mu = PREEMPH_FAC >> 1; /* Q15 --> Q14 */ - - /* get max of new preemphased samples (L_FRAME+L_FILT) */ - L_tmp = new_speech[0] << 15; - L_tmp -= (st->mem_preemph * mu)<<1; - L_max = L_abs(L_tmp); - - for (i = 1; i < L_FRAME + L_FILT; i++) - { - L_tmp = new_speech[i] << 15; - L_tmp -= (new_speech[i - 1] * mu)<<1; - L_tmp = L_abs(L_tmp); - if(L_tmp > L_max) - { - L_max = L_tmp; - } - } - - /* get scaling factor for new and previous samples */ - /* limit scaling to Q_MAX to keep dynamic for ringing in low signal */ - /* limit scaling to Q_MAX also to avoid a[0]<1 in syn_filt_32 */ - tmp = extract_h(L_max); - if (tmp == 0) - { - shift = Q_MAX; - } else - { - shift = norm_s(tmp) - 1; - if (shift < 0) - { - shift = 0; - } - if (shift > Q_MAX) - { - shift = Q_MAX; - } - } - Q_new = shift; - if (Q_new > st->Q_max[0]) - { - Q_new = st->Q_max[0]; - } - if (Q_new > st->Q_max[1]) - { - Q_new = st->Q_max[1]; - } - exp = (Q_new - st->Q_old); - st->Q_old = Q_new; - st->Q_max[1] = st->Q_max[0]; - st->Q_max[0] = shift; - - /* preemphasis with scaling (L_FRAME+L_FILT) */ - tmp = new_speech[L_FRAME - 1]; - - for (i = L_FRAME + L_FILT - 1; i > 0; i--) - { - L_tmp = new_speech[i] << 15; - L_tmp -= (new_speech[i - 1] * mu)<<1; - L_tmp = (L_tmp << Q_new); - new_speech[i] = vo_round(L_tmp); - } - - L_tmp = new_speech[0] << 15; - L_tmp -= (st->mem_preemph * mu)<<1; - L_tmp = (L_tmp << Q_new); - new_speech[0] = vo_round(L_tmp); - - st->mem_preemph = tmp; - - /* scale previous samples and memory */ - - Scale_sig(old_speech, L_TOTAL - L_FRAME - L_FILT, exp); - Scale_sig(old_exc, PIT_MAX + L_INTERPOL, exp); - Scale_sig(st->mem_syn, M, exp); - Scale_sig(st->mem_decim2, 3, exp); - Scale_sig(&(st->mem_wsp), 1, exp); - Scale_sig(&(st->mem_w0), 1, exp); - - /*------------------------------------------------------------------------* - * Call VAD * - * Preemphesis scale down signal in low frequency and keep dynamic in HF.* - * Vad work slightly in futur (new_speech = speech + L_NEXT - L_FILT). * - *------------------------------------------------------------------------*/ - Copy(new_speech, buf, L_FRAME); - -#ifdef ASM_OPT /* asm optimization branch */ - Scale_sig_opt(buf, L_FRAME, 1 - Q_new); -#else - Scale_sig(buf, L_FRAME, 1 - Q_new); -#endif - - vad_flag = wb_vad(st->vadSt, buf); /* Voice Activity Detection */ - if (vad_flag == 0) - { - st->vad_hist = (st->vad_hist + 1); - } else - { - st->vad_hist = 0; - } - - /* DTX processing */ - if (allow_dtx != 0) - { - /* Note that mode may change here */ - tx_dtx_handler(st->dtx_encSt, vad_flag, mode); - *ser_size = nb_of_bits[*mode]; - } - - if(*mode != MRDTX) - { - Parm_serial(vad_flag, 1, &prms); - } - /*------------------------------------------------------------------------* - * Perform LPC analysis * - * ~~~~~~~~~~~~~~~~~~~~ * - * - autocorrelation + lag windowing * - * - Levinson-durbin algorithm to find a[] * - * - convert a[] to isp[] * - * - convert isp[] to isf[] for quantization * - * - quantize and code the isf[] * - * - convert isf[] to isp[] for interpolation * - * - find the interpolated ISPs and convert to a[] for the 4 subframes * - *------------------------------------------------------------------------*/ - - /* LP analysis centered at 4nd subframe */ - Autocorr(p_window, M, r_h, r_l); /* Autocorrelations */ - Lag_window(r_h, r_l); /* Lag windowing */ - Levinson(r_h, r_l, A, rc, st->mem_levinson); /* Levinson Durbin */ - Az_isp(A, ispnew, st->ispold); /* From A(z) to ISP */ - - /* Find the interpolated ISPs and convert to a[] for all subframes */ - Int_isp(st->ispold, ispnew, interpol_frac, A); - - /* update ispold[] for the next frame */ - Copy(ispnew, st->ispold, M); - - /* Convert ISPs to frequency domain 0..6400 */ - Isp_isf(ispnew, isf, M); - - /* check resonance for pitch clipping algorithm */ - Gp_clip_test_isf(isf, st->gp_clip); - - /*----------------------------------------------------------------------* - * Perform PITCH_OL analysis * - * ~~~~~~~~~~~~~~~~~~~~~~~~~ * - * - Find the residual res[] for the whole speech frame * - * - Find the weighted input speech wsp[] for the whole speech frame * - * - scale wsp[] to avoid overflow in pitch estimation * - * - Find open loop pitch lag for whole speech frame * - *----------------------------------------------------------------------*/ - p_A = A; - for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) - { - /* Weighting of LPC coefficients */ - Weight_a(p_A, Ap, GAMMA1, M); - -#ifdef ASM_OPT /* asm optimization branch */ - Residu_opt(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR); -#else - Residu(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR); -#endif - - p_A += (M + 1); - } - - Deemph2(wsp, TILT_FAC, L_FRAME, &(st->mem_wsp)); - - /* find maximum value on wsp[] for 12 bits scaling */ - max = 0; - for (i = 0; i < L_FRAME; i++) - { - tmp = abs_s(wsp[i]); - if(tmp > max) - { - max = tmp; - } - } - tmp = st->old_wsp_max; - if(max > tmp) - { - tmp = max; /* tmp = max(wsp_max, old_wsp_max) */ - } - st->old_wsp_max = max; - - shift = norm_s(tmp) - 3; - if (shift > 0) - { - shift = 0; /* shift = 0..-3 */ - } - /* decimation of wsp[] to search pitch in LF and to reduce complexity */ - LP_Decim2(wsp, L_FRAME, st->mem_decim2); - - /* scale wsp[] in 12 bits to avoid overflow */ -#ifdef ASM_OPT /* asm optimization branch */ - Scale_sig_opt(wsp, L_FRAME / OPL_DECIM, shift); -#else - Scale_sig(wsp, L_FRAME / OPL_DECIM, shift); -#endif - /* scale old_wsp (warning: exp must be Q_new-Q_old) */ - exp = exp + (shift - st->old_wsp_shift); - st->old_wsp_shift = shift; - - Scale_sig(old_wsp, PIT_MAX / OPL_DECIM, exp); - Scale_sig(st->old_hp_wsp, PIT_MAX / OPL_DECIM, exp); - - scale_mem_Hp_wsp(st->hp_wsp_mem, exp); - - /* Find open loop pitch lag for whole speech frame */ - - if(*ser_size == NBBITS_7k) - { - /* Find open loop pitch lag for whole speech frame */ - T_op = Pitch_med_ol(wsp, st, L_FRAME / OPL_DECIM); - } else - { - /* Find open loop pitch lag for first 1/2 frame */ - T_op = Pitch_med_ol(wsp, st, (L_FRAME/2) / OPL_DECIM); - } - - if(st->ol_gain > 19661) /* 0.6 in Q15 */ - { - st->old_T0_med = Med_olag(T_op, st->old_ol_lag); - st->ada_w = 32767; - } else - { - st->ada_w = vo_mult(st->ada_w, 29491); - } - - if(st->ada_w < 26214) - st->ol_wght_flg = 0; - else - st->ol_wght_flg = 1; - - wb_vad_tone_detection(st->vadSt, st->ol_gain); - T_op *= OPL_DECIM; - - if(*ser_size != NBBITS_7k) - { - /* Find open loop pitch lag for second 1/2 frame */ - T_op2 = Pitch_med_ol(wsp + ((L_FRAME / 2) / OPL_DECIM), st, (L_FRAME/2) / OPL_DECIM); - - if(st->ol_gain > 19661) /* 0.6 in Q15 */ - { - st->old_T0_med = Med_olag(T_op2, st->old_ol_lag); - st->ada_w = 32767; - } else - { - st->ada_w = mult(st->ada_w, 29491); - } - - if(st->ada_w < 26214) - st->ol_wght_flg = 0; - else - st->ol_wght_flg = 1; - - wb_vad_tone_detection(st->vadSt, st->ol_gain); - - T_op2 *= OPL_DECIM; - - } else - { - T_op2 = T_op; - } - /*----------------------------------------------------------------------* - * DTX-CNG * - *----------------------------------------------------------------------*/ - if(*mode == MRDTX) /* CNG mode */ - { - /* Buffer isf's and energy */ -#ifdef ASM_OPT /* asm optimization branch */ - Residu_opt(&A[3 * (M + 1)], speech, exc, L_FRAME); -#else - Residu(&A[3 * (M + 1)], speech, exc, L_FRAME); -#endif - - for (i = 0; i < L_FRAME; i++) - { - exc2[i] = shr(exc[i], Q_new); - } - - L_tmp = 0; - for (i = 0; i < L_FRAME; i++) - L_tmp += (exc2[i] * exc2[i])<<1; - - L_tmp >>= 1; - - dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode); - - /* Quantize and code the ISFs */ - dtx_enc(st->dtx_encSt, isf, exc2, &prms); - - /* Convert ISFs to the cosine domain */ - Isf_isp(isf, ispnew_q, M); - Isp_Az(ispnew_q, Aq, M, 0); - - for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) - { - corr_gain = synthesis(Aq, &exc2[i_subfr], 0, &speech16k[i_subfr * 5 / 4], st); - } - Copy(isf, st->isfold, M); - - /* reset speech coder memories */ - Reset_encoder(st, 0); - - /*--------------------------------------------------* - * Update signal for next frame. * - * -> save past of speech[] and wsp[]. * - *--------------------------------------------------*/ - - Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME); - Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM); - - return; - } - /*----------------------------------------------------------------------* - * ACELP * - *----------------------------------------------------------------------*/ - - /* Quantize and code the ISFs */ - - if (*ser_size <= NBBITS_7k) - { - Qpisf_2s_36b(isf, isf, st->past_isfq, indice, 4); - - Parm_serial(indice[0], 8, &prms); - Parm_serial(indice[1], 8, &prms); - Parm_serial(indice[2], 7, &prms); - Parm_serial(indice[3], 7, &prms); - Parm_serial(indice[4], 6, &prms); - } else - { - Qpisf_2s_46b(isf, isf, st->past_isfq, indice, 4); - - Parm_serial(indice[0], 8, &prms); - Parm_serial(indice[1], 8, &prms); - Parm_serial(indice[2], 6, &prms); - Parm_serial(indice[3], 7, &prms); - Parm_serial(indice[4], 7, &prms); - Parm_serial(indice[5], 5, &prms); - Parm_serial(indice[6], 5, &prms); - } - - /* Check stability on isf : distance between old isf and current isf */ - - L_tmp = 0; - for (i = 0; i < M - 1; i++) - { - tmp = vo_sub(isf[i], st->isfold[i]); - L_tmp += (tmp * tmp)<<1; - } - - tmp = extract_h(L_shl2(L_tmp, 8)); - - tmp = vo_mult(tmp, 26214); /* tmp = L_tmp*0.8/256 */ - tmp = vo_sub(20480, tmp); /* 1.25 - tmp (in Q14) */ - - stab_fac = shl(tmp, 1); - - if (stab_fac < 0) - { - stab_fac = 0; - } - Copy(isf, st->isfold, M); - - /* Convert ISFs to the cosine domain */ - Isf_isp(isf, ispnew_q, M); - - if (st->first_frame != 0) - { - st->first_frame = 0; - Copy(ispnew_q, st->ispold_q, M); - } - /* Find the interpolated ISPs and convert to a[] for all subframes */ - - Int_isp(st->ispold_q, ispnew_q, interpol_frac, Aq); - - /* update ispold[] for the next frame */ - Copy(ispnew_q, st->ispold_q, M); - - p_Aq = Aq; - for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) - { -#ifdef ASM_OPT /* asm optimization branch */ - Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR); -#else - Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR); -#endif - p_Aq += (M + 1); - } - - /* Buffer isf's and energy for dtx on non-speech frame */ - if (vad_flag == 0) - { - for (i = 0; i < L_FRAME; i++) - { - exc2[i] = exc[i] >> Q_new; - } - L_tmp = 0; - for (i = 0; i < L_FRAME; i++) - L_tmp += (exc2[i] * exc2[i])<<1; - L_tmp >>= 1; - - dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode); - } - /* range for closed loop pitch search in 1st subframe */ - - T0_min = T_op - 8; - if (T0_min < PIT_MIN) - { - T0_min = PIT_MIN; - } - T0_max = (T0_min + 15); - - if(T0_max > PIT_MAX) - { - T0_max = PIT_MAX; - T0_min = T0_max - 15; - } - /*------------------------------------------------------------------------* - * Loop for every subframe in the analysis frame * - *------------------------------------------------------------------------* - * To find the pitch and innovation parameters. The subframe size is * - * L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times. * - * - compute the target signal for pitch search * - * - compute impulse response of weighted synthesis filter (h1[]) * - * - find the closed-loop pitch parameters * - * - encode the pitch dealy * - * - find 2 lt prediction (with / without LP filter for lt pred) * - * - find 2 pitch gains and choose the best lt prediction. * - * - find target vector for codebook search * - * - update the impulse response h1[] for codebook search * - * - correlation between target vector and impulse response * - * - codebook search and encoding * - * - VQ of pitch and codebook gains * - * - find voicing factor and tilt of code for next subframe. * - * - update states of weighting filter * - * - find excitation and synthesis speech * - *------------------------------------------------------------------------*/ - p_A = A; - p_Aq = Aq; - for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) - { - pit_flag = i_subfr; - if ((i_subfr == 2 * L_SUBFR) && (*ser_size > NBBITS_7k)) - { - pit_flag = 0; - /* range for closed loop pitch search in 3rd subframe */ - T0_min = (T_op2 - 8); - - if (T0_min < PIT_MIN) - { - T0_min = PIT_MIN; - } - T0_max = (T0_min + 15); - if (T0_max > PIT_MAX) - { - T0_max = PIT_MAX; - T0_min = (T0_max - 15); - } - } - /*-----------------------------------------------------------------------* - * * - * Find the target vector for pitch search: * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * - * * - * |------| res[n] * - * speech[n]---| A(z) |-------- * - * |------| | |--------| error[n] |------| * - * zero -- (-)--| 1/A(z) |-----------| W(z) |-- target * - * exc |--------| |------| * - * * - * Instead of subtracting the zero-input response of filters from * - * the weighted input speech, the above configuration is used to * - * compute the target vector. * - * * - *-----------------------------------------------------------------------*/ - - for (i = 0; i < M; i++) - { - error[i] = vo_sub(speech[i + i_subfr - M], st->mem_syn[i]); - } - -#ifdef ASM_OPT /* asm optimization branch */ - Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR); -#else - Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR); -#endif - Syn_filt(p_Aq, &exc[i_subfr], error + M, L_SUBFR, error, 0); - Weight_a(p_A, Ap, GAMMA1, M); - -#ifdef ASM_OPT /* asm optimization branch */ - Residu_opt(Ap, error + M, xn, L_SUBFR); -#else - Residu(Ap, error + M, xn, L_SUBFR); -#endif - Deemph2(xn, TILT_FAC, L_SUBFR, &(st->mem_w0)); - - /*----------------------------------------------------------------------* - * Find approx. target in residual domain "cn[]" for inovation search. * - *----------------------------------------------------------------------*/ - /* first half: xn[] --> cn[] */ - Set_zero(code, M); - Copy(xn, code + M, L_SUBFR / 2); - tmp = 0; - Preemph2(code + M, TILT_FAC, L_SUBFR / 2, &tmp); - Weight_a(p_A, Ap, GAMMA1, M); - Syn_filt(Ap,code + M, code + M, L_SUBFR / 2, code, 0); - -#ifdef ASM_OPT /* asm optimization branch */ - Residu_opt(p_Aq,code + M, cn, L_SUBFR / 2); -#else - Residu(p_Aq,code + M, cn, L_SUBFR / 2); -#endif - - /* second half: res[] --> cn[] (approximated and faster) */ - Copy(&exc[i_subfr + (L_SUBFR / 2)], cn + (L_SUBFR / 2), L_SUBFR / 2); - - /*---------------------------------------------------------------* - * Compute impulse response, h1[], of weighted synthesis filter * - *---------------------------------------------------------------*/ - - Set_zero(error, M + L_SUBFR); - Weight_a(p_A, error + M, GAMMA1, M); - - vo_p0 = error+M; - vo_p3 = h1; - for (i = 0; i < L_SUBFR; i++) - { - L_tmp = *vo_p0 << 14; /* x4 (Q12 to Q14) */ - vo_p1 = p_Aq + 1; - vo_p2 = vo_p0-1; - for (j = 1; j <= M/4; j++) - { - L_tmp -= *vo_p1++ * *vo_p2--; - L_tmp -= *vo_p1++ * *vo_p2--; - L_tmp -= *vo_p1++ * *vo_p2--; - L_tmp -= *vo_p1++ * *vo_p2--; - } - *vo_p3++ = *vo_p0++ = vo_round((L_tmp <<4)); - } - /* deemph without division by 2 -> Q14 to Q15 */ - tmp = 0; - Deemph2(h1, TILT_FAC, L_SUBFR, &tmp); /* h1 in Q14 */ - - /* h2 in Q12 for codebook search */ - Copy(h1, h2, L_SUBFR); - - /*---------------------------------------------------------------* - * scale xn[] and h1[] to avoid overflow in dot_product12() * - *---------------------------------------------------------------*/ -#ifdef ASM_OPT /* asm optimization branch */ - Scale_sig_opt(h2, L_SUBFR, -2); - Scale_sig_opt(xn, L_SUBFR, shift); /* scaling of xn[] to limit dynamic at 12 bits */ - Scale_sig_opt(h1, L_SUBFR, 1 + shift); /* set h1[] in Q15 with scaling for convolution */ -#else - Scale_sig(h2, L_SUBFR, -2); - Scale_sig(xn, L_SUBFR, shift); /* scaling of xn[] to limit dynamic at 12 bits */ - Scale_sig(h1, L_SUBFR, 1 + shift); /* set h1[] in Q15 with scaling for convolution */ -#endif - /*----------------------------------------------------------------------* - * Closed-loop fractional pitch search * - *----------------------------------------------------------------------*/ - /* find closed loop fractional pitch lag */ - if(*ser_size <= NBBITS_9k) - { - T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac, - pit_flag, PIT_MIN, PIT_FR1_8b, L_SUBFR); - - /* encode pitch lag */ - if (pit_flag == 0) /* if 1st/3rd subframe */ - { - /*--------------------------------------------------------------* - * The pitch range for the 1st/3rd subframe is encoded with * - * 8 bits and is divided as follows: * - * PIT_MIN to PIT_FR1-1 resolution 1/2 (frac = 0 or 2) * - * PIT_FR1 to PIT_MAX resolution 1 (frac = 0) * - *--------------------------------------------------------------*/ - if (T0 < PIT_FR1_8b) - { - index = ((T0 << 1) + (T0_frac >> 1) - (PIT_MIN<<1)); - } else - { - index = ((T0 - PIT_FR1_8b) + ((PIT_FR1_8b - PIT_MIN)*2)); - } - - Parm_serial(index, 8, &prms); - - /* find T0_min and T0_max for subframe 2 and 4 */ - T0_min = (T0 - 8); - if (T0_min < PIT_MIN) - { - T0_min = PIT_MIN; - } - T0_max = T0_min + 15; - if (T0_max > PIT_MAX) - { - T0_max = PIT_MAX; - T0_min = (T0_max - 15); - } - } else - { /* if subframe 2 or 4 */ - /*--------------------------------------------------------------* - * The pitch range for subframe 2 or 4 is encoded with 5 bits: * - * T0_min to T0_max resolution 1/2 (frac = 0 or 2) * - *--------------------------------------------------------------*/ - i = (T0 - T0_min); - index = (i << 1) + (T0_frac >> 1); - - Parm_serial(index, 5, &prms); - } - } else - { - T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac, - pit_flag, PIT_FR2, PIT_FR1_9b, L_SUBFR); - - /* encode pitch lag */ - if (pit_flag == 0) /* if 1st/3rd subframe */ - { - /*--------------------------------------------------------------* - * The pitch range for the 1st/3rd subframe is encoded with * - * 9 bits and is divided as follows: * - * PIT_MIN to PIT_FR2-1 resolution 1/4 (frac = 0,1,2 or 3) * - * PIT_FR2 to PIT_FR1-1 resolution 1/2 (frac = 0 or 1) * - * PIT_FR1 to PIT_MAX resolution 1 (frac = 0) * - *--------------------------------------------------------------*/ - - if (T0 < PIT_FR2) - { - index = ((T0 << 2) + T0_frac) - (PIT_MIN << 2); - } else if(T0 < PIT_FR1_9b) - { - index = ((((T0 << 1) + (T0_frac >> 1)) - (PIT_FR2<<1)) + ((PIT_FR2 - PIT_MIN)<<2)); - } else - { - index = (((T0 - PIT_FR1_9b) + ((PIT_FR2 - PIT_MIN)<<2)) + ((PIT_FR1_9b - PIT_FR2)<<1)); - } - - Parm_serial(index, 9, &prms); - - /* find T0_min and T0_max for subframe 2 and 4 */ - - T0_min = (T0 - 8); - if (T0_min < PIT_MIN) - { - T0_min = PIT_MIN; - } - T0_max = T0_min + 15; - - if (T0_max > PIT_MAX) - { - T0_max = PIT_MAX; - T0_min = (T0_max - 15); - } - } else - { /* if subframe 2 or 4 */ - /*--------------------------------------------------------------* - * The pitch range for subframe 2 or 4 is encoded with 6 bits: * - * T0_min to T0_max resolution 1/4 (frac = 0,1,2 or 3) * - *--------------------------------------------------------------*/ - i = (T0 - T0_min); - index = (i << 2) + T0_frac; - Parm_serial(index, 6, &prms); - } - } - - /*-----------------------------------------------------------------* - * Gain clipping test to avoid unstable synthesis on frame erasure * - *-----------------------------------------------------------------*/ - - clip_gain = 0; - if((st->gp_clip[0] < 154) && (st->gp_clip[1] > 14746)) - clip_gain = 1; - - /*-----------------------------------------------------------------* - * - find unity gain pitch excitation (adaptive codebook entry) * - * with fractional interpolation. * - * - find filtered pitch exc. y1[]=exc[] convolved with h1[]) * - * - compute pitch gain1 * - *-----------------------------------------------------------------*/ - /* find pitch exitation */ -#ifdef ASM_OPT /* asm optimization branch */ - pred_lt4_asm(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1); -#else - Pred_lt4(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1); -#endif - if (*ser_size > NBBITS_9k) - { -#ifdef ASM_OPT /* asm optimization branch */ - Convolve_asm(&exc[i_subfr], h1, y1, L_SUBFR); -#else - Convolve(&exc[i_subfr], h1, y1, L_SUBFR); -#endif - gain1 = G_pitch(xn, y1, g_coeff, L_SUBFR); - /* clip gain if necessary to avoid problem at decoder */ - if ((clip_gain != 0) && (gain1 > GP_CLIP)) - { - gain1 = GP_CLIP; - } - /* find energy of new target xn2[] */ - Updt_tar(xn, dn, y1, gain1, L_SUBFR); /* dn used temporary */ - } else - { - gain1 = 0; - } - /*-----------------------------------------------------------------* - * - find pitch excitation filtered by 1st order LP filter. * - * - find filtered pitch exc. y2[]=exc[] convolved with h1[]) * - * - compute pitch gain2 * - *-----------------------------------------------------------------*/ - /* find pitch excitation with lp filter */ - vo_p0 = exc + i_subfr-1; - vo_p1 = code; - /* find pitch excitation with lp filter */ - for (i = 0; i < L_SUBFR/2; i++) - { - L_tmp = 5898 * *vo_p0++; - L_tmp1 = 5898 * *vo_p0; - L_tmp += 20972 * *vo_p0++; - L_tmp1 += 20972 * *vo_p0++; - L_tmp1 += 5898 * *vo_p0--; - L_tmp += 5898 * *vo_p0; - *vo_p1++ = (L_tmp + 0x4000)>>15; - *vo_p1++ = (L_tmp1 + 0x4000)>>15; - } - -#ifdef ASM_OPT /* asm optimization branch */ - Convolve_asm(code, h1, y2, L_SUBFR); -#else - Convolve(code, h1, y2, L_SUBFR); -#endif - - gain2 = G_pitch(xn, y2, g_coeff2, L_SUBFR); - - /* clip gain if necessary to avoid problem at decoder */ - if ((clip_gain != 0) && (gain2 > GP_CLIP)) - { - gain2 = GP_CLIP; - } - /* find energy of new target xn2[] */ - Updt_tar(xn, xn2, y2, gain2, L_SUBFR); - /*-----------------------------------------------------------------* - * use the best prediction (minimise quadratic error). * - *-----------------------------------------------------------------*/ - select = 0; - if(*ser_size > NBBITS_9k) - { - L_tmp = 0L; - vo_p0 = dn; - vo_p1 = xn2; - for (i = 0; i < L_SUBFR/2; i++) - { - L_tmp += *vo_p0 * *vo_p0; - vo_p0++; - L_tmp -= *vo_p1 * *vo_p1; - vo_p1++; - L_tmp += *vo_p0 * *vo_p0; - vo_p0++; - L_tmp -= *vo_p1 * *vo_p1; - vo_p1++; - } - - if (L_tmp <= 0) - { - select = 1; - } - Parm_serial(select, 1, &prms); - } - if (select == 0) - { - /* use the lp filter for pitch excitation prediction */ - gain_pit = gain2; - Copy(code, &exc[i_subfr], L_SUBFR); - Copy(y2, y1, L_SUBFR); - Copy(g_coeff2, g_coeff, 4); - } else - { - /* no filter used for pitch excitation prediction */ - gain_pit = gain1; - Copy(dn, xn2, L_SUBFR); /* target vector for codebook search */ - } - /*-----------------------------------------------------------------* - * - update cn[] for codebook search * - *-----------------------------------------------------------------*/ - Updt_tar(cn, cn, &exc[i_subfr], gain_pit, L_SUBFR); - -#ifdef ASM_OPT /* asm optimization branch */ - Scale_sig_opt(cn, L_SUBFR, shift); /* scaling of cn[] to limit dynamic at 12 bits */ -#else - Scale_sig(cn, L_SUBFR, shift); /* scaling of cn[] to limit dynamic at 12 bits */ -#endif - /*-----------------------------------------------------------------* - * - include fixed-gain pitch contribution into impulse resp. h1[] * - *-----------------------------------------------------------------*/ - tmp = 0; - Preemph(h2, st->tilt_code, L_SUBFR, &tmp); - - if (T0_frac > 2) - T0 = (T0 + 1); - Pit_shrp(h2, T0, PIT_SHARP, L_SUBFR); - /*-----------------------------------------------------------------* - * - Correlation between target xn2[] and impulse response h1[] * - * - Innovative codebook search * - *-----------------------------------------------------------------*/ - cor_h_x(h2, xn2, dn); - if (*ser_size <= NBBITS_7k) - { - ACELP_2t64_fx(dn, cn, h2, code, y2, indice); - - Parm_serial(indice[0], 12, &prms); - } else if(*ser_size <= NBBITS_9k) - { - ACELP_4t64_fx(dn, cn, h2, code, y2, 20, *ser_size, indice); - - Parm_serial(indice[0], 5, &prms); - Parm_serial(indice[1], 5, &prms); - Parm_serial(indice[2], 5, &prms); - Parm_serial(indice[3], 5, &prms); - } else if(*ser_size <= NBBITS_12k) - { - ACELP_4t64_fx(dn, cn, h2, code, y2, 36, *ser_size, indice); - - Parm_serial(indice[0], 9, &prms); - Parm_serial(indice[1], 9, &prms); - Parm_serial(indice[2], 9, &prms); - Parm_serial(indice[3], 9, &prms); - } else if(*ser_size <= NBBITS_14k) - { - ACELP_4t64_fx(dn, cn, h2, code, y2, 44, *ser_size, indice); - - Parm_serial(indice[0], 13, &prms); - Parm_serial(indice[1], 13, &prms); - Parm_serial(indice[2], 9, &prms); - Parm_serial(indice[3], 9, &prms); - } else if(*ser_size <= NBBITS_16k) - { - ACELP_4t64_fx(dn, cn, h2, code, y2, 52, *ser_size, indice); - - Parm_serial(indice[0], 13, &prms); - Parm_serial(indice[1], 13, &prms); - Parm_serial(indice[2], 13, &prms); - Parm_serial(indice[3], 13, &prms); - } else if(*ser_size <= NBBITS_18k) - { - ACELP_4t64_fx(dn, cn, h2, code, y2, 64, *ser_size, indice); - - Parm_serial(indice[0], 2, &prms); - Parm_serial(indice[1], 2, &prms); - Parm_serial(indice[2], 2, &prms); - Parm_serial(indice[3], 2, &prms); - Parm_serial(indice[4], 14, &prms); - Parm_serial(indice[5], 14, &prms); - Parm_serial(indice[6], 14, &prms); - Parm_serial(indice[7], 14, &prms); - } else if(*ser_size <= NBBITS_20k) - { - ACELP_4t64_fx(dn, cn, h2, code, y2, 72, *ser_size, indice); - - Parm_serial(indice[0], 10, &prms); - Parm_serial(indice[1], 10, &prms); - Parm_serial(indice[2], 2, &prms); - Parm_serial(indice[3], 2, &prms); - Parm_serial(indice[4], 10, &prms); - Parm_serial(indice[5], 10, &prms); - Parm_serial(indice[6], 14, &prms); - Parm_serial(indice[7], 14, &prms); - } else - { - ACELP_4t64_fx(dn, cn, h2, code, y2, 88, *ser_size, indice); - - Parm_serial(indice[0], 11, &prms); - Parm_serial(indice[1], 11, &prms); - Parm_serial(indice[2], 11, &prms); - Parm_serial(indice[3], 11, &prms); - Parm_serial(indice[4], 11, &prms); - Parm_serial(indice[5], 11, &prms); - Parm_serial(indice[6], 11, &prms); - Parm_serial(indice[7], 11, &prms); - } - /*-------------------------------------------------------* - * - Add the fixed-gain pitch contribution to code[]. * - *-------------------------------------------------------*/ - tmp = 0; - Preemph(code, st->tilt_code, L_SUBFR, &tmp); - Pit_shrp(code, T0, PIT_SHARP, L_SUBFR); - /*----------------------------------------------------------* - * - Compute the fixed codebook gain * - * - quantize fixed codebook gain * - *----------------------------------------------------------*/ - if(*ser_size <= NBBITS_9k) - { - index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 6, - &gain_pit, &L_gain_code, clip_gain, st->qua_gain); - Parm_serial(index, 6, &prms); - } else - { - index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 7, - &gain_pit, &L_gain_code, clip_gain, st->qua_gain); - Parm_serial(index, 7, &prms); - } - /* test quantized gain of pitch for pitch clipping algorithm */ - Gp_clip_test_gain_pit(gain_pit, st->gp_clip); - - L_tmp = L_shl(L_gain_code, Q_new); - gain_code = extract_h(L_add(L_tmp, 0x8000)); - - /*----------------------------------------------------------* - * Update parameters for the next subframe. * - * - tilt of code: 0.0 (unvoiced) to 0.5 (voiced) * - *----------------------------------------------------------*/ - /* find voice factor in Q15 (1=voiced, -1=unvoiced) */ - Copy(&exc[i_subfr], exc2, L_SUBFR); - -#ifdef ASM_OPT /* asm optimization branch */ - Scale_sig_opt(exc2, L_SUBFR, shift); -#else - Scale_sig(exc2, L_SUBFR, shift); -#endif - voice_fac = voice_factor(exc2, shift, gain_pit, code, gain_code, L_SUBFR); - /* tilt of code for next subframe: 0.5=voiced, 0=unvoiced */ - st->tilt_code = ((voice_fac >> 2) + 8192); - /*------------------------------------------------------* - * - Update filter's memory "mem_w0" for finding the * - * target vector in the next subframe. * - * - Find the total excitation * - * - Find synthesis speech to update mem_syn[]. * - *------------------------------------------------------*/ - - /* y2 in Q9, gain_pit in Q14 */ - L_tmp = (gain_code * y2[L_SUBFR - 1])<<1; - L_tmp = L_shl(L_tmp, (5 + shift)); - L_tmp = L_negate(L_tmp); - L_tmp += (xn[L_SUBFR - 1] * 16384)<<1; - L_tmp -= (y1[L_SUBFR - 1] * gain_pit)<<1; - L_tmp = L_shl(L_tmp, (1 - shift)); - st->mem_w0 = extract_h(L_add(L_tmp, 0x8000)); - - if (*ser_size >= NBBITS_24k) - Copy(&exc[i_subfr], exc2, L_SUBFR); - - for (i = 0; i < L_SUBFR; i++) - { - /* code in Q9, gain_pit in Q14 */ - L_tmp = (gain_code * code[i])<<1; - L_tmp = (L_tmp << 5); - L_tmp += (exc[i + i_subfr] * gain_pit)<<1; - L_tmp = L_shl2(L_tmp, 1); - exc[i + i_subfr] = extract_h(L_add(L_tmp, 0x8000)); - } - - Syn_filt(p_Aq,&exc[i_subfr], synth, L_SUBFR, st->mem_syn, 1); - - if(*ser_size >= NBBITS_24k) - { - /*------------------------------------------------------------* - * phase dispersion to enhance noise in low bit rate * - *------------------------------------------------------------*/ - /* L_gain_code in Q16 */ - VO_L_Extract(L_gain_code, &gain_code, &gain_code_lo); - - /*------------------------------------------------------------* - * noise enhancer * - * ~~~~~~~~~~~~~~ * - * - Enhance excitation on noise. (modify gain of code) * - * If signal is noisy and LPC filter is stable, move gain * - * of code 1.5 dB toward gain of code threshold. * - * This decrease by 3 dB noise energy variation. * - *------------------------------------------------------------*/ - tmp = (16384 - (voice_fac >> 1)); /* 1=unvoiced, 0=voiced */ - fac = vo_mult(stab_fac, tmp); - L_tmp = L_gain_code; - if(L_tmp < st->L_gc_thres) - { - L_tmp = vo_L_add(L_tmp, Mpy_32_16(gain_code, gain_code_lo, 6226)); - if(L_tmp > st->L_gc_thres) - { - L_tmp = st->L_gc_thres; - } - } else - { - L_tmp = Mpy_32_16(gain_code, gain_code_lo, 27536); - if(L_tmp < st->L_gc_thres) - { - L_tmp = st->L_gc_thres; - } - } - st->L_gc_thres = L_tmp; - - L_gain_code = Mpy_32_16(gain_code, gain_code_lo, (32767 - fac)); - VO_L_Extract(L_tmp, &gain_code, &gain_code_lo); - L_gain_code = vo_L_add(L_gain_code, Mpy_32_16(gain_code, gain_code_lo, fac)); - - /*------------------------------------------------------------* - * pitch enhancer * - * ~~~~~~~~~~~~~~ * - * - Enhance excitation on voice. (HP filtering of code) * - * On voiced signal, filtering of code by a smooth fir HP * - * filter to decrease energy of code in low frequency. * - *------------------------------------------------------------*/ - - tmp = ((voice_fac >> 3) + 4096); /* 0.25=voiced, 0=unvoiced */ - - L_tmp = L_deposit_h(code[0]); - L_tmp -= (code[1] * tmp)<<1; - code2[0] = vo_round(L_tmp); - - for (i = 1; i < L_SUBFR - 1; i++) - { - L_tmp = L_deposit_h(code[i]); - L_tmp -= (code[i + 1] * tmp)<<1; - L_tmp -= (code[i - 1] * tmp)<<1; - code2[i] = vo_round(L_tmp); - } - - L_tmp = L_deposit_h(code[L_SUBFR - 1]); - L_tmp -= (code[L_SUBFR - 2] * tmp)<<1; - code2[L_SUBFR - 1] = vo_round(L_tmp); - - /* build excitation */ - gain_code = vo_round(L_shl(L_gain_code, Q_new)); - - for (i = 0; i < L_SUBFR; i++) - { - L_tmp = (code2[i] * gain_code)<<1; - L_tmp = (L_tmp << 5); - L_tmp += (exc2[i] * gain_pit)<<1; - L_tmp = (L_tmp << 1); - exc2[i] = vo_round(L_tmp); - } - - corr_gain = synthesis(p_Aq, exc2, Q_new, &speech16k[i_subfr * 5 / 4], st); - Parm_serial(corr_gain, 4, &prms); - } - p_A += (M + 1); - p_Aq += (M + 1); - } /* end of subframe loop */ - - /*--------------------------------------------------* - * Update signal for next frame. * - * -> save past of speech[], wsp[] and exc[]. * - *--------------------------------------------------*/ - Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME); - Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM); - Copy(&old_exc[L_FRAME], st->old_exc, PIT_MAX + L_INTERPOL); - return; -} - -/*-----------------------------------------------------* -* Function synthesis() * -* * -* Synthesis of signal at 16kHz with HF extension. * -* * -*-----------------------------------------------------*/ - -static Word16 synthesis( - Word16 Aq[], /* A(z) : quantized Az */ - Word16 exc[], /* (i) : excitation at 12kHz */ - Word16 Q_new, /* (i) : scaling performed on exc */ - Word16 synth16k[], /* (o) : 16kHz synthesis signal */ - Coder_State * st /* (i/o) : State structure */ - ) -{ - Word16 fac, tmp, exp; - Word16 ener, exp_ener; - Word32 L_tmp, i; - - Word16 synth_hi[M + L_SUBFR], synth_lo[M + L_SUBFR]; - Word16 synth[L_SUBFR]; - Word16 HF[L_SUBFR16k]; /* High Frequency vector */ - Word16 Ap[M + 1]; - - Word16 HF_SP[L_SUBFR16k]; /* High Frequency vector (from original signal) */ - - Word16 HP_est_gain, HP_calc_gain, HP_corr_gain; - Word16 dist_min, dist; - Word16 HP_gain_ind = 0; - Word16 gain1, gain2; - Word16 weight1, weight2; - - /*------------------------------------------------------------* - * speech synthesis * - * ~~~~~~~~~~~~~~~~ * - * - Find synthesis speech corresponding to exc2[]. * - * - Perform fixed deemphasis and hp 50hz filtering. * - * - Oversampling from 12.8kHz to 16kHz. * - *------------------------------------------------------------*/ - Copy(st->mem_syn_hi, synth_hi, M); - Copy(st->mem_syn_lo, synth_lo, M); - -#ifdef ASM_OPT /* asm optimization branch */ - Syn_filt_32_asm(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR); -#else - Syn_filt_32(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR); -#endif - - Copy(synth_hi + L_SUBFR, st->mem_syn_hi, M); - Copy(synth_lo + L_SUBFR, st->mem_syn_lo, M); - -#ifdef ASM_OPT /* asm optimization branch */ - Deemph_32_asm(synth_hi + M, synth_lo + M, synth, &(st->mem_deemph)); -#else - Deemph_32(synth_hi + M, synth_lo + M, synth, PREEMPH_FAC, L_SUBFR, &(st->mem_deemph)); -#endif - - HP50_12k8(synth, L_SUBFR, st->mem_sig_out); - - /* Original speech signal as reference for high band gain quantisation */ - for (i = 0; i < L_SUBFR16k; i++) - { - HF_SP[i] = synth16k[i]; - } - - /*------------------------------------------------------* - * HF noise synthesis * - * ~~~~~~~~~~~~~~~~~~ * - * - Generate HF noise between 5.5 and 7.5 kHz. * - * - Set energy of noise according to synthesis tilt. * - * tilt > 0.8 ==> - 14 dB (voiced) * - * tilt 0.5 ==> - 6 dB (voiced or noise) * - * tilt < 0.0 ==> 0 dB (noise) * - *------------------------------------------------------*/ - /* generate white noise vector */ - for (i = 0; i < L_SUBFR16k; i++) - { - HF[i] = Random(&(st->seed2))>>3; - } - /* energy of excitation */ -#ifdef ASM_OPT /* asm optimization branch */ - Scale_sig_opt(exc, L_SUBFR, -3); - Q_new = Q_new - 3; - ener = extract_h(Dot_product12_asm(exc, exc, L_SUBFR, &exp_ener)); -#else - Scale_sig(exc, L_SUBFR, -3); - Q_new = Q_new - 3; - ener = extract_h(Dot_product12(exc, exc, L_SUBFR, &exp_ener)); -#endif - - exp_ener = exp_ener - (Q_new + Q_new); - /* set energy of white noise to energy of excitation */ -#ifdef ASM_OPT /* asm optimization branch */ - tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp)); -#else - tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp)); -#endif - - if(tmp > ener) - { - tmp = (tmp >> 1); /* Be sure tmp < ener */ - exp = (exp + 1); - } - L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */ - exp = (exp - exp_ener); - Isqrt_n(&L_tmp, &exp); - L_tmp = L_shl(L_tmp, (exp + 1)); /* L_tmp x 2, L_tmp in Q31 */ - tmp = extract_h(L_tmp); /* tmp = 2 x sqrt(ener_exc/ener_hf) */ - - for (i = 0; i < L_SUBFR16k; i++) - { - HF[i] = vo_mult(HF[i], tmp); - } - - /* find tilt of synthesis speech (tilt: 1=voiced, -1=unvoiced) */ - HP400_12k8(synth, L_SUBFR, st->mem_hp400); - - L_tmp = 1L; - for (i = 0; i < L_SUBFR; i++) - L_tmp += (synth[i] * synth[i])<<1; - - exp = norm_l(L_tmp); - ener = extract_h(L_tmp << exp); /* ener = r[0] */ - - L_tmp = 1L; - for (i = 1; i < L_SUBFR; i++) - L_tmp +=(synth[i] * synth[i - 1])<<1; - - tmp = extract_h(L_tmp << exp); /* tmp = r[1] */ - - if (tmp > 0) - { - fac = div_s(tmp, ener); - } else - { - fac = 0; - } - - /* modify energy of white noise according to synthesis tilt */ - gain1 = 32767 - fac; - gain2 = vo_mult(gain1, 20480); - gain2 = shl(gain2, 1); - - if (st->vad_hist > 0) - { - weight1 = 0; - weight2 = 32767; - } else - { - weight1 = 32767; - weight2 = 0; - } - tmp = vo_mult(weight1, gain1); - tmp = add1(tmp, vo_mult(weight2, gain2)); - - if (tmp != 0) - { - tmp = (tmp + 1); - } - HP_est_gain = tmp; - - if(HP_est_gain < 3277) - { - HP_est_gain = 3277; /* 0.1 in Q15 */ - } - /* synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz */ - Weight_a(Aq, Ap, 19661, M); /* fac=0.6 */ - -#ifdef ASM_OPT /* asm optimization branch */ - Syn_filt_asm(Ap, HF, HF, st->mem_syn_hf); - /* noise High Pass filtering (1ms of delay) */ - Filt_6k_7k_asm(HF, L_SUBFR16k, st->mem_hf); - /* filtering of the original signal */ - Filt_6k_7k_asm(HF_SP, L_SUBFR16k, st->mem_hf2); - - /* check the gain difference */ - Scale_sig_opt(HF_SP, L_SUBFR16k, -1); - ener = extract_h(Dot_product12_asm(HF_SP, HF_SP, L_SUBFR16k, &exp_ener)); - /* set energy of white noise to energy of excitation */ - tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp)); -#else - Syn_filt(Ap, HF, HF, L_SUBFR16k, st->mem_syn_hf, 1); - /* noise High Pass filtering (1ms of delay) */ - Filt_6k_7k(HF, L_SUBFR16k, st->mem_hf); - /* filtering of the original signal */ - Filt_6k_7k(HF_SP, L_SUBFR16k, st->mem_hf2); - /* check the gain difference */ - Scale_sig(HF_SP, L_SUBFR16k, -1); - ener = extract_h(Dot_product12(HF_SP, HF_SP, L_SUBFR16k, &exp_ener)); - /* set energy of white noise to energy of excitation */ - tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp)); -#endif - - if (tmp > ener) - { - tmp = (tmp >> 1); /* Be sure tmp < ener */ - exp = (exp + 1); - } - L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */ - exp = vo_sub(exp, exp_ener); - Isqrt_n(&L_tmp, &exp); - L_tmp = L_shl(L_tmp, exp); /* L_tmp, L_tmp in Q31 */ - HP_calc_gain = extract_h(L_tmp); /* tmp = sqrt(ener_input/ener_hf) */ - - /* st->gain_alpha *= st->dtx_encSt->dtxHangoverCount/7 */ - L_tmp = (vo_L_mult(st->dtx_encSt->dtxHangoverCount, 4681) << 15); - st->gain_alpha = vo_mult(st->gain_alpha, extract_h(L_tmp)); - - if(st->dtx_encSt->dtxHangoverCount > 6) - st->gain_alpha = 32767; - HP_est_gain = HP_est_gain >> 1; /* From Q15 to Q14 */ - HP_corr_gain = add1(vo_mult(HP_calc_gain, st->gain_alpha), vo_mult((32767 - st->gain_alpha), HP_est_gain)); - - /* Quantise the correction gain */ - dist_min = 32767; - for (i = 0; i < 16; i++) - { - dist = vo_mult((HP_corr_gain - HP_gain[i]), (HP_corr_gain - HP_gain[i])); - if (dist_min > dist) - { - dist_min = dist; - HP_gain_ind = i; - } - } - HP_corr_gain = HP_gain[HP_gain_ind]; - /* return the quantised gain index when using the highest mode, otherwise zero */ - return (HP_gain_ind); -} - -/************************************************* -* -* Breif: Codec main function -* -**************************************************/ - -int AMR_Enc_Encode(HAMRENC hCodec) -{ - Word32 i; - Coder_State *gData = (Coder_State*)hCodec; - Word16 *signal; - Word16 packed_size = 0; - Word16 prms[NB_BITS_MAX]; - Word16 coding_mode = 0, nb_bits, allow_dtx, mode, reset_flag; - mode = gData->mode; - coding_mode = gData->mode; - nb_bits = nb_of_bits[mode]; - signal = (Word16 *)gData->inputStream; - allow_dtx = gData->allow_dtx; - - /* check for homing frame */ - reset_flag = encoder_homing_frame_test(signal); - - for (i = 0; i < L_FRAME16k; i++) /* Delete the 2 LSBs (14-bit input) */ - { - *(signal + i) = (Word16) (*(signal + i) & 0xfffC); - } - - coder(&coding_mode, signal, prms, &nb_bits, gData, allow_dtx); - packed_size = PackBits(prms, coding_mode, mode, gData); - if (reset_flag != 0) - { - Reset_encoder(gData, 1); - } - return packed_size; -} - -/*************************************************************************** -* -*Brief: Codec API function --- Initialize the codec and return a codec handle -* -***************************************************************************/ - -VO_U32 VO_API voAMRWB_Init(VO_HANDLE * phCodec, /* o: the audio codec handle */ - VO_AUDIO_CODINGTYPE vType, /* i: Codec Type ID */ - VO_CODEC_INIT_USERDATA * pUserData /* i: init Parameters */ - ) -{ - Coder_State *st; - FrameStream *stream; -#ifdef USE_DEAULT_MEM - VO_MEM_OPERATOR voMemoprator; -#endif - VO_MEM_OPERATOR *pMemOP; - int interMem = 0; - - if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL ) - { -#ifdef USE_DEAULT_MEM - voMemoprator.Alloc = cmnMemAlloc; - voMemoprator.Copy = cmnMemCopy; - voMemoprator.Free = cmnMemFree; - voMemoprator.Set = cmnMemSet; - voMemoprator.Check = cmnMemCheck; - interMem = 1; - pMemOP = &voMemoprator; -#else - *phCodec = NULL; - return VO_ERR_INVALID_ARG; -#endif - } - else - { - pMemOP = (VO_MEM_OPERATOR *)pUserData->memData; - } - /*-------------------------------------------------------------------------* - * Memory allocation for coder state. * - *-------------------------------------------------------------------------*/ - if ((st = (Coder_State *)mem_malloc(pMemOP, sizeof(Coder_State), 32, VO_INDEX_ENC_AMRWB)) == NULL) - { - return VO_ERR_OUTOF_MEMORY; - } - - st->vadSt = NULL; - st->dtx_encSt = NULL; - st->sid_update_counter = 3; - st->sid_handover_debt = 0; - st->prev_ft = TX_SPEECH; - st->inputStream = NULL; - st->inputSize = 0; - - /* Default setting */ - st->mode = VOAMRWB_MD2385; /* bit rate 23.85kbps */ - st->frameType = VOAMRWB_RFC3267; /* frame type: RFC3267 */ - st->allow_dtx = 0; /* disable DTX mode */ - - st->outputStream = NULL; - st->outputSize = 0; - - st->stream = (FrameStream *)mem_malloc(pMemOP, sizeof(FrameStream), 32, VO_INDEX_ENC_AMRWB); - if(st->stream == NULL) - return VO_ERR_OUTOF_MEMORY; - - st->stream->frame_ptr = (unsigned char *)mem_malloc(pMemOP, Frame_Maxsize, 32, VO_INDEX_ENC_AMRWB); - if(st->stream->frame_ptr == NULL) - return VO_ERR_OUTOF_MEMORY; - - stream = st->stream; - voAWB_InitFrameBuffer(stream); - - wb_vad_init(&(st->vadSt), pMemOP); - dtx_enc_init(&(st->dtx_encSt), isf_init, pMemOP); - - Reset_encoder((void *) st, 1); - - if(interMem) - { - st->voMemoprator.Alloc = cmnMemAlloc; - st->voMemoprator.Copy = cmnMemCopy; - st->voMemoprator.Free = cmnMemFree; - st->voMemoprator.Set = cmnMemSet; - st->voMemoprator.Check = cmnMemCheck; - pMemOP = &st->voMemoprator; - } - - st->pvoMemop = pMemOP; - - *phCodec = (void *) st; - - return VO_ERR_NONE; -} - -/********************************************************************************** -* -* Brief: Codec API function: Input PCM data -* -***********************************************************************************/ - -VO_U32 VO_API voAMRWB_SetInputData( - VO_HANDLE hCodec, /* i/o: The codec handle which was created by Init function */ - VO_CODECBUFFER * pInput /* i: The input buffer parameter */ - ) -{ - Coder_State *gData; - FrameStream *stream; - - if(NULL == hCodec) - { - return VO_ERR_INVALID_ARG; - } - - gData = (Coder_State *)hCodec; - stream = gData->stream; - - if(NULL == pInput || NULL == pInput->Buffer || 0 > pInput->Length) - { - return VO_ERR_INVALID_ARG; - } - - stream->set_ptr = pInput->Buffer; - stream->set_len = pInput->Length; - stream->frame_ptr = stream->frame_ptr_bk; - stream->used_len = 0; - - return VO_ERR_NONE; -} - -/************************************************************************************** -* -* Brief: Codec API function: Get the compression audio data frame by frame -* -***************************************************************************************/ - -VO_U32 VO_API voAMRWB_GetOutputData( - VO_HANDLE hCodec, /* i: The Codec Handle which was created by Init function*/ - VO_CODECBUFFER * pOutput, /* o: The output audio data */ - VO_AUDIO_OUTPUTINFO * pAudioFormat /* o: The encoder module filled audio format and used the input size*/ - ) -{ - Coder_State* gData = (Coder_State*)hCodec; - VO_MEM_OPERATOR *pMemOP; - FrameStream *stream = (FrameStream *)gData->stream; - pMemOP = (VO_MEM_OPERATOR *)gData->pvoMemop; - - if(stream->framebuffer_len < Frame_MaxByte) /* check the work buffer len */ - { - stream->frame_storelen = stream->framebuffer_len; - if(stream->frame_storelen) - { - pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk , stream->frame_ptr , stream->frame_storelen); - } - if(stream->set_len > 0) - { - voAWB_UpdateFrameBuffer(stream, pMemOP); - } - if(stream->framebuffer_len < Frame_MaxByte) - { - if(pAudioFormat) - pAudioFormat->InputUsed = stream->used_len; - return VO_ERR_INPUT_BUFFER_SMALL; - } - } - - gData->inputStream = stream->frame_ptr; - gData->outputStream = (unsigned short*)pOutput->Buffer; - - gData->outputSize = AMR_Enc_Encode(gData); /* encoder main function */ - - pOutput->Length = gData->outputSize; /* get the output buffer length */ - stream->frame_ptr += 640; /* update the work buffer ptr */ - stream->framebuffer_len -= 640; - - if(pAudioFormat) /* return output audio information */ - { - pAudioFormat->Format.Channels = 1; - pAudioFormat->Format.SampleRate = 8000; - pAudioFormat->Format.SampleBits = 16; - pAudioFormat->InputUsed = stream->used_len; - } - return VO_ERR_NONE; -} - -/************************************************************************* -* -* Brief: Codec API function---set the data by specified parameter ID -* -*************************************************************************/ - - -VO_U32 VO_API voAMRWB_SetParam( - VO_HANDLE hCodec, /* i/o: The Codec Handle which was created by Init function */ - VO_S32 uParamID, /* i: The param ID */ - VO_PTR pData /* i: The param value depend on the ID */ - ) -{ - Coder_State* gData = (Coder_State*)hCodec; - FrameStream *stream = (FrameStream *)(gData->stream); - int *lValue = (int*)pData; - - switch(uParamID) - { - /* setting AMR-WB frame type*/ - case VO_PID_AMRWB_FRAMETYPE: - if(*lValue < VOAMRWB_DEFAULT || *lValue > VOAMRWB_RFC3267) - return VO_ERR_WRONG_PARAM_ID; - gData->frameType = *lValue; - break; - /* setting AMR-WB bit rate */ - case VO_PID_AMRWB_MODE: - { - if(*lValue < VOAMRWB_MD66 || *lValue > VOAMRWB_MD2385) - return VO_ERR_WRONG_PARAM_ID; - gData->mode = *lValue; - } - break; - /* enable or disable DTX mode */ - case VO_PID_AMRWB_DTX: - gData->allow_dtx = (Word16)(*lValue); - break; - - case VO_PID_COMMON_HEADDATA: - break; - /* flush the work buffer */ - case VO_PID_COMMON_FLUSH: - stream->set_ptr = NULL; - stream->frame_storelen = 0; - stream->framebuffer_len = 0; - stream->set_len = 0; - break; - - default: - return VO_ERR_WRONG_PARAM_ID; - } - return VO_ERR_NONE; -} - -/************************************************************************** -* -*Brief: Codec API function---Get the data by specified parameter ID -* -***************************************************************************/ - -VO_U32 VO_API voAMRWB_GetParam( - VO_HANDLE hCodec, /* i: The Codec Handle which was created by Init function */ - VO_S32 uParamID, /* i: The param ID */ - VO_PTR pData /* o: The param value depend on the ID */ - ) -{ - int temp; - Coder_State* gData = (Coder_State*)hCodec; - - if (gData==NULL) - return VO_ERR_INVALID_ARG; - switch(uParamID) - { - /* output audio format */ - case VO_PID_AMRWB_FORMAT: - { - VO_AUDIO_FORMAT* fmt = (VO_AUDIO_FORMAT*)pData; - fmt->Channels = 1; - fmt->SampleRate = 16000; - fmt->SampleBits = 16; - break; - } - /* output audio channel number */ - case VO_PID_AMRWB_CHANNELS: - temp = 1; - pData = (void *)(&temp); - break; - /* output audio sample rate */ - case VO_PID_AMRWB_SAMPLERATE: - temp = 16000; - pData = (void *)(&temp); - break; - /* output audio frame type */ - case VO_PID_AMRWB_FRAMETYPE: - temp = gData->frameType; - pData = (void *)(&temp); - break; - /* output audio bit rate */ - case VO_PID_AMRWB_MODE: - temp = gData->mode; - pData = (void *)(&temp); - break; - default: - return VO_ERR_WRONG_PARAM_ID; - } - - return VO_ERR_NONE; -} - -/*********************************************************************************** -* -* Brief: Codec API function---Release the codec after all encoder operations are done -* -*************************************************************************************/ - -VO_U32 VO_API voAMRWB_Uninit(VO_HANDLE hCodec /* i/o: Codec handle pointer */ - ) -{ - Coder_State* gData = (Coder_State*)hCodec; - VO_MEM_OPERATOR *pMemOP; - pMemOP = gData->pvoMemop; - - if(hCodec) - { - if(gData->stream) - { - if(gData->stream->frame_ptr_bk) - { - mem_free(pMemOP, gData->stream->frame_ptr_bk, VO_INDEX_ENC_AMRWB); - gData->stream->frame_ptr_bk = NULL; - } - mem_free(pMemOP, gData->stream, VO_INDEX_ENC_AMRWB); - gData->stream = NULL; - } - wb_vad_exit(&(((Coder_State *) gData)->vadSt), pMemOP); - dtx_enc_exit(&(((Coder_State *) gData)->dtx_encSt), pMemOP); - - mem_free(pMemOP, hCodec, VO_INDEX_ENC_AMRWB); - hCodec = NULL; - } - - return VO_ERR_NONE; -} - -/******************************************************************************** -* -* Brief: voGetAMRWBEncAPI gets the API handle of the codec -* -********************************************************************************/ - -VO_S32 VO_API voGetAMRWBEncAPI( - VO_AUDIO_CODECAPI * pEncHandle /* i/o: Codec handle pointer */ - ) -{ - if(NULL == pEncHandle) - return VO_ERR_INVALID_ARG; - pEncHandle->Init = voAMRWB_Init; - pEncHandle->SetInputData = voAMRWB_SetInputData; - pEncHandle->GetOutputData = voAMRWB_GetOutputData; - pEncHandle->SetParam = voAMRWB_SetParam; - pEncHandle->GetParam = voAMRWB_GetParam; - pEncHandle->Uninit = voAMRWB_Uninit; - - return VO_ERR_NONE; -} - -#ifdef __cplusplus -} -#endif +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: voAMRWBEnc.c * +* * +* Description: Performs the main encoder routine * +* Fixed-point C simulation of AMR WB ACELP coding * +* algorithm with 20 msspeech frames for * +* wideband speech signals. * +* * +************************************************************************/ + +#include +#include +#include "typedef.h" +#include "basic_op.h" +#include "oper_32b.h" +#include "math_op.h" +#include "cnst.h" +#include "acelp.h" +#include "cod_main.h" +#include "bits.h" +#include "main.h" +#include "voAMRWB.h" +#include "mem_align.h" +#include "cmnMemory.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* LPC interpolation coef {0.45, 0.8, 0.96, 1.0}; in Q15 */ +static Word16 interpol_frac[NB_SUBFR] = {14746, 26214, 31457, 32767}; + +/* isp tables for initialization */ +static Word16 isp_init[M] = +{ + 32138, 30274, 27246, 23170, 18205, 12540, 6393, 0, + -6393, -12540, -18205, -23170, -27246, -30274, -32138, 1475 +}; + +static Word16 isf_init[M] = +{ + 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, + 9216, 10240, 11264, 12288, 13312, 14336, 15360, 3840 +}; + +/* High Band encoding */ +static const Word16 HP_gain[16] = +{ + 3624, 4673, 5597, 6479, 7425, 8378, 9324, 10264, + 11210, 12206, 13391, 14844, 16770, 19655, 24289, 32728 +}; + +/* Private function declaration */ +static Word16 synthesis( + Word16 Aq[], /* A(z) : quantized Az */ + Word16 exc[], /* (i) : excitation at 12kHz */ + Word16 Q_new, /* (i) : scaling performed on exc */ + Word16 synth16k[], /* (o) : 16kHz synthesis signal */ + Coder_State * st /* (i/o) : State structure */ + ); + +/* Codec some parameters initialization */ +void Reset_encoder(void *st, Word16 reset_all) +{ + Word16 i; + Coder_State *cod_state; + cod_state = (Coder_State *) st; + Set_zero(cod_state->old_exc, PIT_MAX + L_INTERPOL); + Set_zero(cod_state->mem_syn, M); + Set_zero(cod_state->past_isfq, M); + cod_state->mem_w0 = 0; + cod_state->tilt_code = 0; + cod_state->first_frame = 1; + Init_gp_clip(cod_state->gp_clip); + cod_state->L_gc_thres = 0; + if (reset_all != 0) + { + /* Static vectors to zero */ + Set_zero(cod_state->old_speech, L_TOTAL - L_FRAME); + Set_zero(cod_state->old_wsp, (PIT_MAX / OPL_DECIM)); + Set_zero(cod_state->mem_decim2, 3); + /* routines initialization */ + Init_Decim_12k8(cod_state->mem_decim); + Init_HP50_12k8(cod_state->mem_sig_in); + Init_Levinson(cod_state->mem_levinson); + Init_Q_gain2(cod_state->qua_gain); + Init_Hp_wsp(cod_state->hp_wsp_mem); + /* isp initialization */ + Copy(isp_init, cod_state->ispold, M); + Copy(isp_init, cod_state->ispold_q, M); + /* variable initialization */ + cod_state->mem_preemph = 0; + cod_state->mem_wsp = 0; + cod_state->Q_old = 15; + cod_state->Q_max[0] = 15; + cod_state->Q_max[1] = 15; + cod_state->old_wsp_max = 0; + cod_state->old_wsp_shift = 0; + /* pitch ol initialization */ + cod_state->old_T0_med = 40; + cod_state->ol_gain = 0; + cod_state->ada_w = 0; + cod_state->ol_wght_flg = 0; + for (i = 0; i < 5; i++) + { + cod_state->old_ol_lag[i] = 40; + } + Set_zero(cod_state->old_hp_wsp, (L_FRAME / 2) / OPL_DECIM + (PIT_MAX / OPL_DECIM)); + Set_zero(cod_state->mem_syn_hf, M); + Set_zero(cod_state->mem_syn_hi, M); + Set_zero(cod_state->mem_syn_lo, M); + Init_HP50_12k8(cod_state->mem_sig_out); + Init_Filt_6k_7k(cod_state->mem_hf); + Init_HP400_12k8(cod_state->mem_hp400); + Copy(isf_init, cod_state->isfold, M); + cod_state->mem_deemph = 0; + cod_state->seed2 = 21845; + Init_Filt_6k_7k(cod_state->mem_hf2); + cod_state->gain_alpha = 32767; + cod_state->vad_hist = 0; + wb_vad_reset(cod_state->vadSt); + dtx_enc_reset(cod_state->dtx_encSt, isf_init); + } + return; +} + +/*-----------------------------------------------------------------* +* Funtion coder * +* ~~~~~ * +* ->Main coder routine. * +* * +*-----------------------------------------------------------------*/ +void coder( + Word16 * mode, /* input : used mode */ + Word16 speech16k[], /* input : 320 new speech samples (at 16 kHz) */ + Word16 prms[], /* output: output parameters */ + Word16 * ser_size, /* output: bit rate of the used mode */ + void *spe_state, /* i/o : State structure */ + Word16 allow_dtx /* input : DTX ON/OFF */ + ) +{ + /* Coder states */ + Coder_State *st; + /* Speech vector */ + Word16 old_speech[L_TOTAL]; + Word16 *new_speech, *speech, *p_window; + + /* Weighted speech vector */ + Word16 old_wsp[L_FRAME + (PIT_MAX / OPL_DECIM)]; + Word16 *wsp; + + /* Excitation vector */ + Word16 old_exc[(L_FRAME + 1) + PIT_MAX + L_INTERPOL]; + Word16 *exc; + + /* LPC coefficients */ + Word16 r_h[M + 1], r_l[M + 1]; /* Autocorrelations of windowed speech */ + Word16 rc[M]; /* Reflection coefficients. */ + Word16 Ap[M + 1]; /* A(z) with spectral expansion */ + Word16 ispnew[M]; /* immittance spectral pairs at 4nd sfr */ + Word16 ispnew_q[M]; /* quantized ISPs at 4nd subframe */ + Word16 isf[M]; /* ISF (frequency domain) at 4nd sfr */ + Word16 *p_A, *p_Aq; /* ptr to A(z) for the 4 subframes */ + Word16 A[NB_SUBFR * (M + 1)]; /* A(z) unquantized for the 4 subframes */ + Word16 Aq[NB_SUBFR * (M + 1)]; /* A(z) quantized for the 4 subframes */ + + /* Other vectors */ + Word16 xn[L_SUBFR]; /* Target vector for pitch search */ + Word16 xn2[L_SUBFR]; /* Target vector for codebook search */ + Word16 dn[L_SUBFR]; /* Correlation between xn2 and h1 */ + Word16 cn[L_SUBFR]; /* Target vector in residual domain */ + Word16 h1[L_SUBFR]; /* Impulse response vector */ + Word16 h2[L_SUBFR]; /* Impulse response vector */ + Word16 code[L_SUBFR]; /* Fixed codebook excitation */ + Word16 y1[L_SUBFR]; /* Filtered adaptive excitation */ + Word16 y2[L_SUBFR]; /* Filtered adaptive excitation */ + Word16 error[M + L_SUBFR]; /* error of quantization */ + Word16 synth[L_SUBFR]; /* 12.8kHz synthesis vector */ + Word16 exc2[L_FRAME]; /* excitation vector */ + Word16 buf[L_FRAME]; /* VAD buffer */ + + /* Scalars */ + Word32 i, j, i_subfr, select, pit_flag, clip_gain, vad_flag; + Word16 codec_mode; + Word16 T_op, T_op2, T0, T0_min, T0_max, T0_frac, index; + Word16 gain_pit, gain_code, g_coeff[4], g_coeff2[4]; + Word16 tmp, gain1, gain2, exp, Q_new, mu, shift, max; + Word16 voice_fac; + Word16 indice[8]; + Word32 L_tmp, L_gain_code, L_max, L_tmp1; + Word16 code2[L_SUBFR]; /* Fixed codebook excitation */ + Word16 stab_fac, fac, gain_code_lo; + + Word16 corr_gain; + Word16 *vo_p0, *vo_p1, *vo_p2, *vo_p3; + + st = (Coder_State *) spe_state; + + *ser_size = nb_of_bits[*mode]; + codec_mode = *mode; + + /*--------------------------------------------------------------------------* + * Initialize pointers to speech vector. * + * * + * * + * |-------|-------|-------|-------|-------|-------| * + * past sp sf1 sf2 sf3 sf4 L_NEXT * + * <------- Total speech buffer (L_TOTAL) ------> * + * old_speech * + * <------- LPC analysis window (L_WINDOW) ------> * + * | <-- present frame (L_FRAME) ----> * + * p_window | <----- new speech (L_FRAME) ----> * + * | | * + * speech | * + * new_speech * + *--------------------------------------------------------------------------*/ + + new_speech = old_speech + L_TOTAL - L_FRAME - L_FILT; /* New speech */ + speech = old_speech + L_TOTAL - L_FRAME - L_NEXT; /* Present frame */ + p_window = old_speech + L_TOTAL - L_WINDOW; + + exc = old_exc + PIT_MAX + L_INTERPOL; + wsp = old_wsp + (PIT_MAX / OPL_DECIM); + + /* copy coder memory state into working space */ + Copy(st->old_speech, old_speech, L_TOTAL - L_FRAME); + Copy(st->old_wsp, old_wsp, PIT_MAX / OPL_DECIM); + Copy(st->old_exc, old_exc, PIT_MAX + L_INTERPOL); + + /*---------------------------------------------------------------* + * Down sampling signal from 16kHz to 12.8kHz * + * -> The signal is extended by L_FILT samples (padded to zero) * + * to avoid additional delay (L_FILT samples) in the coder. * + * The last L_FILT samples are approximated after decimation and * + * are used (and windowed) only in autocorrelations. * + *---------------------------------------------------------------*/ + + Decim_12k8(speech16k, L_FRAME16k, new_speech, st->mem_decim); + + /* last L_FILT samples for autocorrelation window */ + Copy(st->mem_decim, code, 2 * L_FILT16k); + Set_zero(error, L_FILT16k); /* set next sample to zero */ + Decim_12k8(error, L_FILT16k, new_speech + L_FRAME, code); + + /*---------------------------------------------------------------* + * Perform 50Hz HP filtering of input signal. * + *---------------------------------------------------------------*/ + + HP50_12k8(new_speech, L_FRAME, st->mem_sig_in); + + /* last L_FILT samples for autocorrelation window */ + Copy(st->mem_sig_in, code, 6); + HP50_12k8(new_speech + L_FRAME, L_FILT, code); + + /*---------------------------------------------------------------* + * Perform fixed preemphasis through 1 - g z^-1 * + * Scale signal to get maximum of precision in filtering * + *---------------------------------------------------------------*/ + + mu = PREEMPH_FAC >> 1; /* Q15 --> Q14 */ + + /* get max of new preemphased samples (L_FRAME+L_FILT) */ + L_tmp = new_speech[0] << 15; + L_tmp -= (st->mem_preemph * mu)<<1; + L_max = L_abs(L_tmp); + + for (i = 1; i < L_FRAME + L_FILT; i++) + { + L_tmp = new_speech[i] << 15; + L_tmp -= (new_speech[i - 1] * mu)<<1; + L_tmp = L_abs(L_tmp); + if(L_tmp > L_max) + { + L_max = L_tmp; + } + } + + /* get scaling factor for new and previous samples */ + /* limit scaling to Q_MAX to keep dynamic for ringing in low signal */ + /* limit scaling to Q_MAX also to avoid a[0]<1 in syn_filt_32 */ + tmp = extract_h(L_max); + if (tmp == 0) + { + shift = Q_MAX; + } else + { + shift = norm_s(tmp) - 1; + if (shift < 0) + { + shift = 0; + } + if (shift > Q_MAX) + { + shift = Q_MAX; + } + } + Q_new = shift; + if (Q_new > st->Q_max[0]) + { + Q_new = st->Q_max[0]; + } + if (Q_new > st->Q_max[1]) + { + Q_new = st->Q_max[1]; + } + exp = (Q_new - st->Q_old); + st->Q_old = Q_new; + st->Q_max[1] = st->Q_max[0]; + st->Q_max[0] = shift; + + /* preemphasis with scaling (L_FRAME+L_FILT) */ + tmp = new_speech[L_FRAME - 1]; + + for (i = L_FRAME + L_FILT - 1; i > 0; i--) + { + L_tmp = new_speech[i] << 15; + L_tmp -= (new_speech[i - 1] * mu)<<1; + L_tmp = (L_tmp << Q_new); + new_speech[i] = vo_round(L_tmp); + } + + L_tmp = new_speech[0] << 15; + L_tmp -= (st->mem_preemph * mu)<<1; + L_tmp = (L_tmp << Q_new); + new_speech[0] = vo_round(L_tmp); + + st->mem_preemph = tmp; + + /* scale previous samples and memory */ + + Scale_sig(old_speech, L_TOTAL - L_FRAME - L_FILT, exp); + Scale_sig(old_exc, PIT_MAX + L_INTERPOL, exp); + Scale_sig(st->mem_syn, M, exp); + Scale_sig(st->mem_decim2, 3, exp); + Scale_sig(&(st->mem_wsp), 1, exp); + Scale_sig(&(st->mem_w0), 1, exp); + + /*------------------------------------------------------------------------* + * Call VAD * + * Preemphesis scale down signal in low frequency and keep dynamic in HF.* + * Vad work slightly in futur (new_speech = speech + L_NEXT - L_FILT). * + *------------------------------------------------------------------------*/ + Copy(new_speech, buf, L_FRAME); + +#ifdef ASM_OPT /* asm optimization branch */ + Scale_sig_opt(buf, L_FRAME, 1 - Q_new); +#else + Scale_sig(buf, L_FRAME, 1 - Q_new); +#endif + + vad_flag = wb_vad(st->vadSt, buf); /* Voice Activity Detection */ + if (vad_flag == 0) + { + st->vad_hist = (st->vad_hist + 1); + } else + { + st->vad_hist = 0; + } + + /* DTX processing */ + if (allow_dtx != 0) + { + /* Note that mode may change here */ + tx_dtx_handler(st->dtx_encSt, vad_flag, mode); + *ser_size = nb_of_bits[*mode]; + } + + if(*mode != MRDTX) + { + Parm_serial(vad_flag, 1, &prms); + } + /*------------------------------------------------------------------------* + * Perform LPC analysis * + * ~~~~~~~~~~~~~~~~~~~~ * + * - autocorrelation + lag windowing * + * - Levinson-durbin algorithm to find a[] * + * - convert a[] to isp[] * + * - convert isp[] to isf[] for quantization * + * - quantize and code the isf[] * + * - convert isf[] to isp[] for interpolation * + * - find the interpolated ISPs and convert to a[] for the 4 subframes * + *------------------------------------------------------------------------*/ + + /* LP analysis centered at 4nd subframe */ + Autocorr(p_window, M, r_h, r_l); /* Autocorrelations */ + Lag_window(r_h, r_l); /* Lag windowing */ + Levinson(r_h, r_l, A, rc, st->mem_levinson); /* Levinson Durbin */ + Az_isp(A, ispnew, st->ispold); /* From A(z) to ISP */ + + /* Find the interpolated ISPs and convert to a[] for all subframes */ + Int_isp(st->ispold, ispnew, interpol_frac, A); + + /* update ispold[] for the next frame */ + Copy(ispnew, st->ispold, M); + + /* Convert ISPs to frequency domain 0..6400 */ + Isp_isf(ispnew, isf, M); + + /* check resonance for pitch clipping algorithm */ + Gp_clip_test_isf(isf, st->gp_clip); + + /*----------------------------------------------------------------------* + * Perform PITCH_OL analysis * + * ~~~~~~~~~~~~~~~~~~~~~~~~~ * + * - Find the residual res[] for the whole speech frame * + * - Find the weighted input speech wsp[] for the whole speech frame * + * - scale wsp[] to avoid overflow in pitch estimation * + * - Find open loop pitch lag for whole speech frame * + *----------------------------------------------------------------------*/ + p_A = A; + for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) + { + /* Weighting of LPC coefficients */ + Weight_a(p_A, Ap, GAMMA1, M); + +#ifdef ASM_OPT /* asm optimization branch */ + Residu_opt(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR); +#else + Residu(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR); +#endif + + p_A += (M + 1); + } + + Deemph2(wsp, TILT_FAC, L_FRAME, &(st->mem_wsp)); + + /* find maximum value on wsp[] for 12 bits scaling */ + max = 0; + for (i = 0; i < L_FRAME; i++) + { + tmp = abs_s(wsp[i]); + if(tmp > max) + { + max = tmp; + } + } + tmp = st->old_wsp_max; + if(max > tmp) + { + tmp = max; /* tmp = max(wsp_max, old_wsp_max) */ + } + st->old_wsp_max = max; + + shift = norm_s(tmp) - 3; + if (shift > 0) + { + shift = 0; /* shift = 0..-3 */ + } + /* decimation of wsp[] to search pitch in LF and to reduce complexity */ + LP_Decim2(wsp, L_FRAME, st->mem_decim2); + + /* scale wsp[] in 12 bits to avoid overflow */ +#ifdef ASM_OPT /* asm optimization branch */ + Scale_sig_opt(wsp, L_FRAME / OPL_DECIM, shift); +#else + Scale_sig(wsp, L_FRAME / OPL_DECIM, shift); +#endif + /* scale old_wsp (warning: exp must be Q_new-Q_old) */ + exp = exp + (shift - st->old_wsp_shift); + st->old_wsp_shift = shift; + + Scale_sig(old_wsp, PIT_MAX / OPL_DECIM, exp); + Scale_sig(st->old_hp_wsp, PIT_MAX / OPL_DECIM, exp); + + scale_mem_Hp_wsp(st->hp_wsp_mem, exp); + + /* Find open loop pitch lag for whole speech frame */ + + if(*ser_size == NBBITS_7k) + { + /* Find open loop pitch lag for whole speech frame */ + T_op = Pitch_med_ol(wsp, st, L_FRAME / OPL_DECIM); + } else + { + /* Find open loop pitch lag for first 1/2 frame */ + T_op = Pitch_med_ol(wsp, st, (L_FRAME/2) / OPL_DECIM); + } + + if(st->ol_gain > 19661) /* 0.6 in Q15 */ + { + st->old_T0_med = Med_olag(T_op, st->old_ol_lag); + st->ada_w = 32767; + } else + { + st->ada_w = vo_mult(st->ada_w, 29491); + } + + if(st->ada_w < 26214) + st->ol_wght_flg = 0; + else + st->ol_wght_flg = 1; + + wb_vad_tone_detection(st->vadSt, st->ol_gain); + T_op *= OPL_DECIM; + + if(*ser_size != NBBITS_7k) + { + /* Find open loop pitch lag for second 1/2 frame */ + T_op2 = Pitch_med_ol(wsp + ((L_FRAME / 2) / OPL_DECIM), st, (L_FRAME/2) / OPL_DECIM); + + if(st->ol_gain > 19661) /* 0.6 in Q15 */ + { + st->old_T0_med = Med_olag(T_op2, st->old_ol_lag); + st->ada_w = 32767; + } else + { + st->ada_w = mult(st->ada_w, 29491); + } + + if(st->ada_w < 26214) + st->ol_wght_flg = 0; + else + st->ol_wght_flg = 1; + + wb_vad_tone_detection(st->vadSt, st->ol_gain); + + T_op2 *= OPL_DECIM; + + } else + { + T_op2 = T_op; + } + /*----------------------------------------------------------------------* + * DTX-CNG * + *----------------------------------------------------------------------*/ + if(*mode == MRDTX) /* CNG mode */ + { + /* Buffer isf's and energy */ +#ifdef ASM_OPT /* asm optimization branch */ + Residu_opt(&A[3 * (M + 1)], speech, exc, L_FRAME); +#else + Residu(&A[3 * (M + 1)], speech, exc, L_FRAME); +#endif + + for (i = 0; i < L_FRAME; i++) + { + exc2[i] = shr(exc[i], Q_new); + } + + L_tmp = 0; + for (i = 0; i < L_FRAME; i++) + L_tmp += (exc2[i] * exc2[i])<<1; + + L_tmp >>= 1; + + dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode); + + /* Quantize and code the ISFs */ + dtx_enc(st->dtx_encSt, isf, exc2, &prms); + + /* Convert ISFs to the cosine domain */ + Isf_isp(isf, ispnew_q, M); + Isp_Az(ispnew_q, Aq, M, 0); + + for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) + { + corr_gain = synthesis(Aq, &exc2[i_subfr], 0, &speech16k[i_subfr * 5 / 4], st); + } + Copy(isf, st->isfold, M); + + /* reset speech coder memories */ + Reset_encoder(st, 0); + + /*--------------------------------------------------* + * Update signal for next frame. * + * -> save past of speech[] and wsp[]. * + *--------------------------------------------------*/ + + Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME); + Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM); + + return; + } + /*----------------------------------------------------------------------* + * ACELP * + *----------------------------------------------------------------------*/ + + /* Quantize and code the ISFs */ + + if (*ser_size <= NBBITS_7k) + { + Qpisf_2s_36b(isf, isf, st->past_isfq, indice, 4); + + Parm_serial(indice[0], 8, &prms); + Parm_serial(indice[1], 8, &prms); + Parm_serial(indice[2], 7, &prms); + Parm_serial(indice[3], 7, &prms); + Parm_serial(indice[4], 6, &prms); + } else + { + Qpisf_2s_46b(isf, isf, st->past_isfq, indice, 4); + + Parm_serial(indice[0], 8, &prms); + Parm_serial(indice[1], 8, &prms); + Parm_serial(indice[2], 6, &prms); + Parm_serial(indice[3], 7, &prms); + Parm_serial(indice[4], 7, &prms); + Parm_serial(indice[5], 5, &prms); + Parm_serial(indice[6], 5, &prms); + } + + /* Check stability on isf : distance between old isf and current isf */ + + L_tmp = 0; + for (i = 0; i < M - 1; i++) + { + tmp = vo_sub(isf[i], st->isfold[i]); + L_tmp += (tmp * tmp)<<1; + } + + tmp = extract_h(L_shl2(L_tmp, 8)); + + tmp = vo_mult(tmp, 26214); /* tmp = L_tmp*0.8/256 */ + tmp = vo_sub(20480, tmp); /* 1.25 - tmp (in Q14) */ + + stab_fac = shl(tmp, 1); + + if (stab_fac < 0) + { + stab_fac = 0; + } + Copy(isf, st->isfold, M); + + /* Convert ISFs to the cosine domain */ + Isf_isp(isf, ispnew_q, M); + + if (st->first_frame != 0) + { + st->first_frame = 0; + Copy(ispnew_q, st->ispold_q, M); + } + /* Find the interpolated ISPs and convert to a[] for all subframes */ + + Int_isp(st->ispold_q, ispnew_q, interpol_frac, Aq); + + /* update ispold[] for the next frame */ + Copy(ispnew_q, st->ispold_q, M); + + p_Aq = Aq; + for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) + { +#ifdef ASM_OPT /* asm optimization branch */ + Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR); +#else + Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR); +#endif + p_Aq += (M + 1); + } + + /* Buffer isf's and energy for dtx on non-speech frame */ + if (vad_flag == 0) + { + for (i = 0; i < L_FRAME; i++) + { + exc2[i] = exc[i] >> Q_new; + } + L_tmp = 0; + for (i = 0; i < L_FRAME; i++) + L_tmp += (exc2[i] * exc2[i])<<1; + L_tmp >>= 1; + + dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode); + } + /* range for closed loop pitch search in 1st subframe */ + + T0_min = T_op - 8; + if (T0_min < PIT_MIN) + { + T0_min = PIT_MIN; + } + T0_max = (T0_min + 15); + + if(T0_max > PIT_MAX) + { + T0_max = PIT_MAX; + T0_min = T0_max - 15; + } + /*------------------------------------------------------------------------* + * Loop for every subframe in the analysis frame * + *------------------------------------------------------------------------* + * To find the pitch and innovation parameters. The subframe size is * + * L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times. * + * - compute the target signal for pitch search * + * - compute impulse response of weighted synthesis filter (h1[]) * + * - find the closed-loop pitch parameters * + * - encode the pitch dealy * + * - find 2 lt prediction (with / without LP filter for lt pred) * + * - find 2 pitch gains and choose the best lt prediction. * + * - find target vector for codebook search * + * - update the impulse response h1[] for codebook search * + * - correlation between target vector and impulse response * + * - codebook search and encoding * + * - VQ of pitch and codebook gains * + * - find voicing factor and tilt of code for next subframe. * + * - update states of weighting filter * + * - find excitation and synthesis speech * + *------------------------------------------------------------------------*/ + p_A = A; + p_Aq = Aq; + for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) + { + pit_flag = i_subfr; + if ((i_subfr == 2 * L_SUBFR) && (*ser_size > NBBITS_7k)) + { + pit_flag = 0; + /* range for closed loop pitch search in 3rd subframe */ + T0_min = (T_op2 - 8); + + if (T0_min < PIT_MIN) + { + T0_min = PIT_MIN; + } + T0_max = (T0_min + 15); + if (T0_max > PIT_MAX) + { + T0_max = PIT_MAX; + T0_min = (T0_max - 15); + } + } + /*-----------------------------------------------------------------------* + * * + * Find the target vector for pitch search: * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * + * * + * |------| res[n] * + * speech[n]---| A(z) |-------- * + * |------| | |--------| error[n] |------| * + * zero -- (-)--| 1/A(z) |-----------| W(z) |-- target * + * exc |--------| |------| * + * * + * Instead of subtracting the zero-input response of filters from * + * the weighted input speech, the above configuration is used to * + * compute the target vector. * + * * + *-----------------------------------------------------------------------*/ + + for (i = 0; i < M; i++) + { + error[i] = vo_sub(speech[i + i_subfr - M], st->mem_syn[i]); + } + +#ifdef ASM_OPT /* asm optimization branch */ + Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR); +#else + Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR); +#endif + Syn_filt(p_Aq, &exc[i_subfr], error + M, L_SUBFR, error, 0); + Weight_a(p_A, Ap, GAMMA1, M); + +#ifdef ASM_OPT /* asm optimization branch */ + Residu_opt(Ap, error + M, xn, L_SUBFR); +#else + Residu(Ap, error + M, xn, L_SUBFR); +#endif + Deemph2(xn, TILT_FAC, L_SUBFR, &(st->mem_w0)); + + /*----------------------------------------------------------------------* + * Find approx. target in residual domain "cn[]" for inovation search. * + *----------------------------------------------------------------------*/ + /* first half: xn[] --> cn[] */ + Set_zero(code, M); + Copy(xn, code + M, L_SUBFR / 2); + tmp = 0; + Preemph2(code + M, TILT_FAC, L_SUBFR / 2, &tmp); + Weight_a(p_A, Ap, GAMMA1, M); + Syn_filt(Ap,code + M, code + M, L_SUBFR / 2, code, 0); + +#ifdef ASM_OPT /* asm optimization branch */ + Residu_opt(p_Aq,code + M, cn, L_SUBFR / 2); +#else + Residu(p_Aq,code + M, cn, L_SUBFR / 2); +#endif + + /* second half: res[] --> cn[] (approximated and faster) */ + Copy(&exc[i_subfr + (L_SUBFR / 2)], cn + (L_SUBFR / 2), L_SUBFR / 2); + + /*---------------------------------------------------------------* + * Compute impulse response, h1[], of weighted synthesis filter * + *---------------------------------------------------------------*/ + + Set_zero(error, M + L_SUBFR); + Weight_a(p_A, error + M, GAMMA1, M); + + vo_p0 = error+M; + vo_p3 = h1; + for (i = 0; i < L_SUBFR; i++) + { + L_tmp = *vo_p0 << 14; /* x4 (Q12 to Q14) */ + vo_p1 = p_Aq + 1; + vo_p2 = vo_p0-1; + for (j = 1; j <= M/4; j++) + { + L_tmp -= *vo_p1++ * *vo_p2--; + L_tmp -= *vo_p1++ * *vo_p2--; + L_tmp -= *vo_p1++ * *vo_p2--; + L_tmp -= *vo_p1++ * *vo_p2--; + } + *vo_p3++ = *vo_p0++ = vo_round((L_tmp <<4)); + } + /* deemph without division by 2 -> Q14 to Q15 */ + tmp = 0; + Deemph2(h1, TILT_FAC, L_SUBFR, &tmp); /* h1 in Q14 */ + + /* h2 in Q12 for codebook search */ + Copy(h1, h2, L_SUBFR); + + /*---------------------------------------------------------------* + * scale xn[] and h1[] to avoid overflow in dot_product12() * + *---------------------------------------------------------------*/ +#ifdef ASM_OPT /* asm optimization branch */ + Scale_sig_opt(h2, L_SUBFR, -2); + Scale_sig_opt(xn, L_SUBFR, shift); /* scaling of xn[] to limit dynamic at 12 bits */ + Scale_sig_opt(h1, L_SUBFR, 1 + shift); /* set h1[] in Q15 with scaling for convolution */ +#else + Scale_sig(h2, L_SUBFR, -2); + Scale_sig(xn, L_SUBFR, shift); /* scaling of xn[] to limit dynamic at 12 bits */ + Scale_sig(h1, L_SUBFR, 1 + shift); /* set h1[] in Q15 with scaling for convolution */ +#endif + /*----------------------------------------------------------------------* + * Closed-loop fractional pitch search * + *----------------------------------------------------------------------*/ + /* find closed loop fractional pitch lag */ + if(*ser_size <= NBBITS_9k) + { + T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac, + pit_flag, PIT_MIN, PIT_FR1_8b, L_SUBFR); + + /* encode pitch lag */ + if (pit_flag == 0) /* if 1st/3rd subframe */ + { + /*--------------------------------------------------------------* + * The pitch range for the 1st/3rd subframe is encoded with * + * 8 bits and is divided as follows: * + * PIT_MIN to PIT_FR1-1 resolution 1/2 (frac = 0 or 2) * + * PIT_FR1 to PIT_MAX resolution 1 (frac = 0) * + *--------------------------------------------------------------*/ + if (T0 < PIT_FR1_8b) + { + index = ((T0 << 1) + (T0_frac >> 1) - (PIT_MIN<<1)); + } else + { + index = ((T0 - PIT_FR1_8b) + ((PIT_FR1_8b - PIT_MIN)*2)); + } + + Parm_serial(index, 8, &prms); + + /* find T0_min and T0_max for subframe 2 and 4 */ + T0_min = (T0 - 8); + if (T0_min < PIT_MIN) + { + T0_min = PIT_MIN; + } + T0_max = T0_min + 15; + if (T0_max > PIT_MAX) + { + T0_max = PIT_MAX; + T0_min = (T0_max - 15); + } + } else + { /* if subframe 2 or 4 */ + /*--------------------------------------------------------------* + * The pitch range for subframe 2 or 4 is encoded with 5 bits: * + * T0_min to T0_max resolution 1/2 (frac = 0 or 2) * + *--------------------------------------------------------------*/ + i = (T0 - T0_min); + index = (i << 1) + (T0_frac >> 1); + + Parm_serial(index, 5, &prms); + } + } else + { + T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac, + pit_flag, PIT_FR2, PIT_FR1_9b, L_SUBFR); + + /* encode pitch lag */ + if (pit_flag == 0) /* if 1st/3rd subframe */ + { + /*--------------------------------------------------------------* + * The pitch range for the 1st/3rd subframe is encoded with * + * 9 bits and is divided as follows: * + * PIT_MIN to PIT_FR2-1 resolution 1/4 (frac = 0,1,2 or 3) * + * PIT_FR2 to PIT_FR1-1 resolution 1/2 (frac = 0 or 1) * + * PIT_FR1 to PIT_MAX resolution 1 (frac = 0) * + *--------------------------------------------------------------*/ + + if (T0 < PIT_FR2) + { + index = ((T0 << 2) + T0_frac) - (PIT_MIN << 2); + } else if(T0 < PIT_FR1_9b) + { + index = ((((T0 << 1) + (T0_frac >> 1)) - (PIT_FR2<<1)) + ((PIT_FR2 - PIT_MIN)<<2)); + } else + { + index = (((T0 - PIT_FR1_9b) + ((PIT_FR2 - PIT_MIN)<<2)) + ((PIT_FR1_9b - PIT_FR2)<<1)); + } + + Parm_serial(index, 9, &prms); + + /* find T0_min and T0_max for subframe 2 and 4 */ + + T0_min = (T0 - 8); + if (T0_min < PIT_MIN) + { + T0_min = PIT_MIN; + } + T0_max = T0_min + 15; + + if (T0_max > PIT_MAX) + { + T0_max = PIT_MAX; + T0_min = (T0_max - 15); + } + } else + { /* if subframe 2 or 4 */ + /*--------------------------------------------------------------* + * The pitch range for subframe 2 or 4 is encoded with 6 bits: * + * T0_min to T0_max resolution 1/4 (frac = 0,1,2 or 3) * + *--------------------------------------------------------------*/ + i = (T0 - T0_min); + index = (i << 2) + T0_frac; + Parm_serial(index, 6, &prms); + } + } + + /*-----------------------------------------------------------------* + * Gain clipping test to avoid unstable synthesis on frame erasure * + *-----------------------------------------------------------------*/ + + clip_gain = 0; + if((st->gp_clip[0] < 154) && (st->gp_clip[1] > 14746)) + clip_gain = 1; + + /*-----------------------------------------------------------------* + * - find unity gain pitch excitation (adaptive codebook entry) * + * with fractional interpolation. * + * - find filtered pitch exc. y1[]=exc[] convolved with h1[]) * + * - compute pitch gain1 * + *-----------------------------------------------------------------*/ + /* find pitch exitation */ +#ifdef ASM_OPT /* asm optimization branch */ + pred_lt4_asm(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1); +#else + Pred_lt4(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1); +#endif + if (*ser_size > NBBITS_9k) + { +#ifdef ASM_OPT /* asm optimization branch */ + Convolve_asm(&exc[i_subfr], h1, y1, L_SUBFR); +#else + Convolve(&exc[i_subfr], h1, y1, L_SUBFR); +#endif + gain1 = G_pitch(xn, y1, g_coeff, L_SUBFR); + /* clip gain if necessary to avoid problem at decoder */ + if ((clip_gain != 0) && (gain1 > GP_CLIP)) + { + gain1 = GP_CLIP; + } + /* find energy of new target xn2[] */ + Updt_tar(xn, dn, y1, gain1, L_SUBFR); /* dn used temporary */ + } else + { + gain1 = 0; + } + /*-----------------------------------------------------------------* + * - find pitch excitation filtered by 1st order LP filter. * + * - find filtered pitch exc. y2[]=exc[] convolved with h1[]) * + * - compute pitch gain2 * + *-----------------------------------------------------------------*/ + /* find pitch excitation with lp filter */ + vo_p0 = exc + i_subfr-1; + vo_p1 = code; + /* find pitch excitation with lp filter */ + for (i = 0; i < L_SUBFR/2; i++) + { + L_tmp = 5898 * *vo_p0++; + L_tmp1 = 5898 * *vo_p0; + L_tmp += 20972 * *vo_p0++; + L_tmp1 += 20972 * *vo_p0++; + L_tmp1 += 5898 * *vo_p0--; + L_tmp += 5898 * *vo_p0; + *vo_p1++ = (L_tmp + 0x4000)>>15; + *vo_p1++ = (L_tmp1 + 0x4000)>>15; + } + +#ifdef ASM_OPT /* asm optimization branch */ + Convolve_asm(code, h1, y2, L_SUBFR); +#else + Convolve(code, h1, y2, L_SUBFR); +#endif + + gain2 = G_pitch(xn, y2, g_coeff2, L_SUBFR); + + /* clip gain if necessary to avoid problem at decoder */ + if ((clip_gain != 0) && (gain2 > GP_CLIP)) + { + gain2 = GP_CLIP; + } + /* find energy of new target xn2[] */ + Updt_tar(xn, xn2, y2, gain2, L_SUBFR); + /*-----------------------------------------------------------------* + * use the best prediction (minimise quadratic error). * + *-----------------------------------------------------------------*/ + select = 0; + if(*ser_size > NBBITS_9k) + { + L_tmp = 0L; + vo_p0 = dn; + vo_p1 = xn2; + for (i = 0; i < L_SUBFR/2; i++) + { + L_tmp += *vo_p0 * *vo_p0; + vo_p0++; + L_tmp -= *vo_p1 * *vo_p1; + vo_p1++; + L_tmp += *vo_p0 * *vo_p0; + vo_p0++; + L_tmp -= *vo_p1 * *vo_p1; + vo_p1++; + } + + if (L_tmp <= 0) + { + select = 1; + } + Parm_serial(select, 1, &prms); + } + if (select == 0) + { + /* use the lp filter for pitch excitation prediction */ + gain_pit = gain2; + Copy(code, &exc[i_subfr], L_SUBFR); + Copy(y2, y1, L_SUBFR); + Copy(g_coeff2, g_coeff, 4); + } else + { + /* no filter used for pitch excitation prediction */ + gain_pit = gain1; + Copy(dn, xn2, L_SUBFR); /* target vector for codebook search */ + } + /*-----------------------------------------------------------------* + * - update cn[] for codebook search * + *-----------------------------------------------------------------*/ + Updt_tar(cn, cn, &exc[i_subfr], gain_pit, L_SUBFR); + +#ifdef ASM_OPT /* asm optimization branch */ + Scale_sig_opt(cn, L_SUBFR, shift); /* scaling of cn[] to limit dynamic at 12 bits */ +#else + Scale_sig(cn, L_SUBFR, shift); /* scaling of cn[] to limit dynamic at 12 bits */ +#endif + /*-----------------------------------------------------------------* + * - include fixed-gain pitch contribution into impulse resp. h1[] * + *-----------------------------------------------------------------*/ + tmp = 0; + Preemph(h2, st->tilt_code, L_SUBFR, &tmp); + + if (T0_frac > 2) + T0 = (T0 + 1); + Pit_shrp(h2, T0, PIT_SHARP, L_SUBFR); + /*-----------------------------------------------------------------* + * - Correlation between target xn2[] and impulse response h1[] * + * - Innovative codebook search * + *-----------------------------------------------------------------*/ + cor_h_x(h2, xn2, dn); + if (*ser_size <= NBBITS_7k) + { + ACELP_2t64_fx(dn, cn, h2, code, y2, indice); + + Parm_serial(indice[0], 12, &prms); + } else if(*ser_size <= NBBITS_9k) + { + ACELP_4t64_fx(dn, cn, h2, code, y2, 20, *ser_size, indice); + + Parm_serial(indice[0], 5, &prms); + Parm_serial(indice[1], 5, &prms); + Parm_serial(indice[2], 5, &prms); + Parm_serial(indice[3], 5, &prms); + } else if(*ser_size <= NBBITS_12k) + { + ACELP_4t64_fx(dn, cn, h2, code, y2, 36, *ser_size, indice); + + Parm_serial(indice[0], 9, &prms); + Parm_serial(indice[1], 9, &prms); + Parm_serial(indice[2], 9, &prms); + Parm_serial(indice[3], 9, &prms); + } else if(*ser_size <= NBBITS_14k) + { + ACELP_4t64_fx(dn, cn, h2, code, y2, 44, *ser_size, indice); + + Parm_serial(indice[0], 13, &prms); + Parm_serial(indice[1], 13, &prms); + Parm_serial(indice[2], 9, &prms); + Parm_serial(indice[3], 9, &prms); + } else if(*ser_size <= NBBITS_16k) + { + ACELP_4t64_fx(dn, cn, h2, code, y2, 52, *ser_size, indice); + + Parm_serial(indice[0], 13, &prms); + Parm_serial(indice[1], 13, &prms); + Parm_serial(indice[2], 13, &prms); + Parm_serial(indice[3], 13, &prms); + } else if(*ser_size <= NBBITS_18k) + { + ACELP_4t64_fx(dn, cn, h2, code, y2, 64, *ser_size, indice); + + Parm_serial(indice[0], 2, &prms); + Parm_serial(indice[1], 2, &prms); + Parm_serial(indice[2], 2, &prms); + Parm_serial(indice[3], 2, &prms); + Parm_serial(indice[4], 14, &prms); + Parm_serial(indice[5], 14, &prms); + Parm_serial(indice[6], 14, &prms); + Parm_serial(indice[7], 14, &prms); + } else if(*ser_size <= NBBITS_20k) + { + ACELP_4t64_fx(dn, cn, h2, code, y2, 72, *ser_size, indice); + + Parm_serial(indice[0], 10, &prms); + Parm_serial(indice[1], 10, &prms); + Parm_serial(indice[2], 2, &prms); + Parm_serial(indice[3], 2, &prms); + Parm_serial(indice[4], 10, &prms); + Parm_serial(indice[5], 10, &prms); + Parm_serial(indice[6], 14, &prms); + Parm_serial(indice[7], 14, &prms); + } else + { + ACELP_4t64_fx(dn, cn, h2, code, y2, 88, *ser_size, indice); + + Parm_serial(indice[0], 11, &prms); + Parm_serial(indice[1], 11, &prms); + Parm_serial(indice[2], 11, &prms); + Parm_serial(indice[3], 11, &prms); + Parm_serial(indice[4], 11, &prms); + Parm_serial(indice[5], 11, &prms); + Parm_serial(indice[6], 11, &prms); + Parm_serial(indice[7], 11, &prms); + } + /*-------------------------------------------------------* + * - Add the fixed-gain pitch contribution to code[]. * + *-------------------------------------------------------*/ + tmp = 0; + Preemph(code, st->tilt_code, L_SUBFR, &tmp); + Pit_shrp(code, T0, PIT_SHARP, L_SUBFR); + /*----------------------------------------------------------* + * - Compute the fixed codebook gain * + * - quantize fixed codebook gain * + *----------------------------------------------------------*/ + if(*ser_size <= NBBITS_9k) + { + index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 6, + &gain_pit, &L_gain_code, clip_gain, st->qua_gain); + Parm_serial(index, 6, &prms); + } else + { + index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 7, + &gain_pit, &L_gain_code, clip_gain, st->qua_gain); + Parm_serial(index, 7, &prms); + } + /* test quantized gain of pitch for pitch clipping algorithm */ + Gp_clip_test_gain_pit(gain_pit, st->gp_clip); + + L_tmp = L_shl(L_gain_code, Q_new); + gain_code = extract_h(L_add(L_tmp, 0x8000)); + + /*----------------------------------------------------------* + * Update parameters for the next subframe. * + * - tilt of code: 0.0 (unvoiced) to 0.5 (voiced) * + *----------------------------------------------------------*/ + /* find voice factor in Q15 (1=voiced, -1=unvoiced) */ + Copy(&exc[i_subfr], exc2, L_SUBFR); + +#ifdef ASM_OPT /* asm optimization branch */ + Scale_sig_opt(exc2, L_SUBFR, shift); +#else + Scale_sig(exc2, L_SUBFR, shift); +#endif + voice_fac = voice_factor(exc2, shift, gain_pit, code, gain_code, L_SUBFR); + /* tilt of code for next subframe: 0.5=voiced, 0=unvoiced */ + st->tilt_code = ((voice_fac >> 2) + 8192); + /*------------------------------------------------------* + * - Update filter's memory "mem_w0" for finding the * + * target vector in the next subframe. * + * - Find the total excitation * + * - Find synthesis speech to update mem_syn[]. * + *------------------------------------------------------*/ + + /* y2 in Q9, gain_pit in Q14 */ + L_tmp = (gain_code * y2[L_SUBFR - 1])<<1; + L_tmp = L_shl(L_tmp, (5 + shift)); + L_tmp = L_negate(L_tmp); + L_tmp += (xn[L_SUBFR - 1] * 16384)<<1; + L_tmp -= (y1[L_SUBFR - 1] * gain_pit)<<1; + L_tmp = L_shl(L_tmp, (1 - shift)); + st->mem_w0 = extract_h(L_add(L_tmp, 0x8000)); + + if (*ser_size >= NBBITS_24k) + Copy(&exc[i_subfr], exc2, L_SUBFR); + + for (i = 0; i < L_SUBFR; i++) + { + /* code in Q9, gain_pit in Q14 */ + L_tmp = (gain_code * code[i])<<1; + L_tmp = (L_tmp << 5); + L_tmp += (exc[i + i_subfr] * gain_pit)<<1; + L_tmp = L_shl2(L_tmp, 1); + exc[i + i_subfr] = extract_h(L_add(L_tmp, 0x8000)); + } + + Syn_filt(p_Aq,&exc[i_subfr], synth, L_SUBFR, st->mem_syn, 1); + + if(*ser_size >= NBBITS_24k) + { + /*------------------------------------------------------------* + * phase dispersion to enhance noise in low bit rate * + *------------------------------------------------------------*/ + /* L_gain_code in Q16 */ + VO_L_Extract(L_gain_code, &gain_code, &gain_code_lo); + + /*------------------------------------------------------------* + * noise enhancer * + * ~~~~~~~~~~~~~~ * + * - Enhance excitation on noise. (modify gain of code) * + * If signal is noisy and LPC filter is stable, move gain * + * of code 1.5 dB toward gain of code threshold. * + * This decrease by 3 dB noise energy variation. * + *------------------------------------------------------------*/ + tmp = (16384 - (voice_fac >> 1)); /* 1=unvoiced, 0=voiced */ + fac = vo_mult(stab_fac, tmp); + L_tmp = L_gain_code; + if(L_tmp < st->L_gc_thres) + { + L_tmp = vo_L_add(L_tmp, Mpy_32_16(gain_code, gain_code_lo, 6226)); + if(L_tmp > st->L_gc_thres) + { + L_tmp = st->L_gc_thres; + } + } else + { + L_tmp = Mpy_32_16(gain_code, gain_code_lo, 27536); + if(L_tmp < st->L_gc_thres) + { + L_tmp = st->L_gc_thres; + } + } + st->L_gc_thres = L_tmp; + + L_gain_code = Mpy_32_16(gain_code, gain_code_lo, (32767 - fac)); + VO_L_Extract(L_tmp, &gain_code, &gain_code_lo); + L_gain_code = vo_L_add(L_gain_code, Mpy_32_16(gain_code, gain_code_lo, fac)); + + /*------------------------------------------------------------* + * pitch enhancer * + * ~~~~~~~~~~~~~~ * + * - Enhance excitation on voice. (HP filtering of code) * + * On voiced signal, filtering of code by a smooth fir HP * + * filter to decrease energy of code in low frequency. * + *------------------------------------------------------------*/ + + tmp = ((voice_fac >> 3) + 4096); /* 0.25=voiced, 0=unvoiced */ + + L_tmp = L_deposit_h(code[0]); + L_tmp -= (code[1] * tmp)<<1; + code2[0] = vo_round(L_tmp); + + for (i = 1; i < L_SUBFR - 1; i++) + { + L_tmp = L_deposit_h(code[i]); + L_tmp -= (code[i + 1] * tmp)<<1; + L_tmp -= (code[i - 1] * tmp)<<1; + code2[i] = vo_round(L_tmp); + } + + L_tmp = L_deposit_h(code[L_SUBFR - 1]); + L_tmp -= (code[L_SUBFR - 2] * tmp)<<1; + code2[L_SUBFR - 1] = vo_round(L_tmp); + + /* build excitation */ + gain_code = vo_round(L_shl(L_gain_code, Q_new)); + + for (i = 0; i < L_SUBFR; i++) + { + L_tmp = (code2[i] * gain_code)<<1; + L_tmp = (L_tmp << 5); + L_tmp += (exc2[i] * gain_pit)<<1; + L_tmp = (L_tmp << 1); + exc2[i] = vo_round(L_tmp); + } + + corr_gain = synthesis(p_Aq, exc2, Q_new, &speech16k[i_subfr * 5 / 4], st); + Parm_serial(corr_gain, 4, &prms); + } + p_A += (M + 1); + p_Aq += (M + 1); + } /* end of subframe loop */ + + /*--------------------------------------------------* + * Update signal for next frame. * + * -> save past of speech[], wsp[] and exc[]. * + *--------------------------------------------------*/ + Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME); + Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM); + Copy(&old_exc[L_FRAME], st->old_exc, PIT_MAX + L_INTERPOL); + return; +} + +/*-----------------------------------------------------* +* Function synthesis() * +* * +* Synthesis of signal at 16kHz with HF extension. * +* * +*-----------------------------------------------------*/ + +static Word16 synthesis( + Word16 Aq[], /* A(z) : quantized Az */ + Word16 exc[], /* (i) : excitation at 12kHz */ + Word16 Q_new, /* (i) : scaling performed on exc */ + Word16 synth16k[], /* (o) : 16kHz synthesis signal */ + Coder_State * st /* (i/o) : State structure */ + ) +{ + Word16 fac, tmp, exp; + Word16 ener, exp_ener; + Word32 L_tmp, i; + + Word16 synth_hi[M + L_SUBFR], synth_lo[M + L_SUBFR]; + Word16 synth[L_SUBFR]; + Word16 HF[L_SUBFR16k]; /* High Frequency vector */ + Word16 Ap[M + 1]; + + Word16 HF_SP[L_SUBFR16k]; /* High Frequency vector (from original signal) */ + + Word16 HP_est_gain, HP_calc_gain, HP_corr_gain; + Word16 dist_min, dist; + Word16 HP_gain_ind = 0; + Word16 gain1, gain2; + Word16 weight1, weight2; + + /*------------------------------------------------------------* + * speech synthesis * + * ~~~~~~~~~~~~~~~~ * + * - Find synthesis speech corresponding to exc2[]. * + * - Perform fixed deemphasis and hp 50hz filtering. * + * - Oversampling from 12.8kHz to 16kHz. * + *------------------------------------------------------------*/ + Copy(st->mem_syn_hi, synth_hi, M); + Copy(st->mem_syn_lo, synth_lo, M); + +#ifdef ASM_OPT /* asm optimization branch */ + Syn_filt_32_asm(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR); +#else + Syn_filt_32(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR); +#endif + + Copy(synth_hi + L_SUBFR, st->mem_syn_hi, M); + Copy(synth_lo + L_SUBFR, st->mem_syn_lo, M); + +#ifdef ASM_OPT /* asm optimization branch */ + Deemph_32_asm(synth_hi + M, synth_lo + M, synth, &(st->mem_deemph)); +#else + Deemph_32(synth_hi + M, synth_lo + M, synth, PREEMPH_FAC, L_SUBFR, &(st->mem_deemph)); +#endif + + HP50_12k8(synth, L_SUBFR, st->mem_sig_out); + + /* Original speech signal as reference for high band gain quantisation */ + for (i = 0; i < L_SUBFR16k; i++) + { + HF_SP[i] = synth16k[i]; + } + + /*------------------------------------------------------* + * HF noise synthesis * + * ~~~~~~~~~~~~~~~~~~ * + * - Generate HF noise between 5.5 and 7.5 kHz. * + * - Set energy of noise according to synthesis tilt. * + * tilt > 0.8 ==> - 14 dB (voiced) * + * tilt 0.5 ==> - 6 dB (voiced or noise) * + * tilt < 0.0 ==> 0 dB (noise) * + *------------------------------------------------------*/ + /* generate white noise vector */ + for (i = 0; i < L_SUBFR16k; i++) + { + HF[i] = Random(&(st->seed2))>>3; + } + /* energy of excitation */ +#ifdef ASM_OPT /* asm optimization branch */ + Scale_sig_opt(exc, L_SUBFR, -3); + Q_new = Q_new - 3; + ener = extract_h(Dot_product12_asm(exc, exc, L_SUBFR, &exp_ener)); +#else + Scale_sig(exc, L_SUBFR, -3); + Q_new = Q_new - 3; + ener = extract_h(Dot_product12(exc, exc, L_SUBFR, &exp_ener)); +#endif + + exp_ener = exp_ener - (Q_new + Q_new); + /* set energy of white noise to energy of excitation */ +#ifdef ASM_OPT /* asm optimization branch */ + tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp)); +#else + tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp)); +#endif + + if(tmp > ener) + { + tmp = (tmp >> 1); /* Be sure tmp < ener */ + exp = (exp + 1); + } + L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */ + exp = (exp - exp_ener); + Isqrt_n(&L_tmp, &exp); + L_tmp = L_shl(L_tmp, (exp + 1)); /* L_tmp x 2, L_tmp in Q31 */ + tmp = extract_h(L_tmp); /* tmp = 2 x sqrt(ener_exc/ener_hf) */ + + for (i = 0; i < L_SUBFR16k; i++) + { + HF[i] = vo_mult(HF[i], tmp); + } + + /* find tilt of synthesis speech (tilt: 1=voiced, -1=unvoiced) */ + HP400_12k8(synth, L_SUBFR, st->mem_hp400); + + L_tmp = 1L; + for (i = 0; i < L_SUBFR; i++) + L_tmp += (synth[i] * synth[i])<<1; + + exp = norm_l(L_tmp); + ener = extract_h(L_tmp << exp); /* ener = r[0] */ + + L_tmp = 1L; + for (i = 1; i < L_SUBFR; i++) + L_tmp +=(synth[i] * synth[i - 1])<<1; + + tmp = extract_h(L_tmp << exp); /* tmp = r[1] */ + + if (tmp > 0) + { + fac = div_s(tmp, ener); + } else + { + fac = 0; + } + + /* modify energy of white noise according to synthesis tilt */ + gain1 = 32767 - fac; + gain2 = vo_mult(gain1, 20480); + gain2 = shl(gain2, 1); + + if (st->vad_hist > 0) + { + weight1 = 0; + weight2 = 32767; + } else + { + weight1 = 32767; + weight2 = 0; + } + tmp = vo_mult(weight1, gain1); + tmp = add1(tmp, vo_mult(weight2, gain2)); + + if (tmp != 0) + { + tmp = (tmp + 1); + } + HP_est_gain = tmp; + + if(HP_est_gain < 3277) + { + HP_est_gain = 3277; /* 0.1 in Q15 */ + } + /* synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz */ + Weight_a(Aq, Ap, 19661, M); /* fac=0.6 */ + +#ifdef ASM_OPT /* asm optimization branch */ + Syn_filt_asm(Ap, HF, HF, st->mem_syn_hf); + /* noise High Pass filtering (1ms of delay) */ + Filt_6k_7k_asm(HF, L_SUBFR16k, st->mem_hf); + /* filtering of the original signal */ + Filt_6k_7k_asm(HF_SP, L_SUBFR16k, st->mem_hf2); + + /* check the gain difference */ + Scale_sig_opt(HF_SP, L_SUBFR16k, -1); + ener = extract_h(Dot_product12_asm(HF_SP, HF_SP, L_SUBFR16k, &exp_ener)); + /* set energy of white noise to energy of excitation */ + tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp)); +#else + Syn_filt(Ap, HF, HF, L_SUBFR16k, st->mem_syn_hf, 1); + /* noise High Pass filtering (1ms of delay) */ + Filt_6k_7k(HF, L_SUBFR16k, st->mem_hf); + /* filtering of the original signal */ + Filt_6k_7k(HF_SP, L_SUBFR16k, st->mem_hf2); + /* check the gain difference */ + Scale_sig(HF_SP, L_SUBFR16k, -1); + ener = extract_h(Dot_product12(HF_SP, HF_SP, L_SUBFR16k, &exp_ener)); + /* set energy of white noise to energy of excitation */ + tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp)); +#endif + + if (tmp > ener) + { + tmp = (tmp >> 1); /* Be sure tmp < ener */ + exp = (exp + 1); + } + L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */ + exp = vo_sub(exp, exp_ener); + Isqrt_n(&L_tmp, &exp); + L_tmp = L_shl(L_tmp, exp); /* L_tmp, L_tmp in Q31 */ + HP_calc_gain = extract_h(L_tmp); /* tmp = sqrt(ener_input/ener_hf) */ + + /* st->gain_alpha *= st->dtx_encSt->dtxHangoverCount/7 */ + L_tmp = (vo_L_mult(st->dtx_encSt->dtxHangoverCount, 4681) << 15); + st->gain_alpha = vo_mult(st->gain_alpha, extract_h(L_tmp)); + + if(st->dtx_encSt->dtxHangoverCount > 6) + st->gain_alpha = 32767; + HP_est_gain = HP_est_gain >> 1; /* From Q15 to Q14 */ + HP_corr_gain = add1(vo_mult(HP_calc_gain, st->gain_alpha), vo_mult((32767 - st->gain_alpha), HP_est_gain)); + + /* Quantise the correction gain */ + dist_min = 32767; + for (i = 0; i < 16; i++) + { + dist = vo_mult((HP_corr_gain - HP_gain[i]), (HP_corr_gain - HP_gain[i])); + if (dist_min > dist) + { + dist_min = dist; + HP_gain_ind = i; + } + } + HP_corr_gain = HP_gain[HP_gain_ind]; + /* return the quantised gain index when using the highest mode, otherwise zero */ + return (HP_gain_ind); +} + +/************************************************* +* +* Breif: Codec main function +* +**************************************************/ + +int AMR_Enc_Encode(HAMRENC hCodec) +{ + Word32 i; + Coder_State *gData = (Coder_State*)hCodec; + Word16 *signal; + Word16 packed_size = 0; + Word16 prms[NB_BITS_MAX]; + Word16 coding_mode = 0, nb_bits, allow_dtx, mode, reset_flag; + mode = gData->mode; + coding_mode = gData->mode; + nb_bits = nb_of_bits[mode]; + signal = (Word16 *)gData->inputStream; + allow_dtx = gData->allow_dtx; + + /* check for homing frame */ + reset_flag = encoder_homing_frame_test(signal); + + for (i = 0; i < L_FRAME16k; i++) /* Delete the 2 LSBs (14-bit input) */ + { + *(signal + i) = (Word16) (*(signal + i) & 0xfffC); + } + + coder(&coding_mode, signal, prms, &nb_bits, gData, allow_dtx); + packed_size = PackBits(prms, coding_mode, mode, gData); + if (reset_flag != 0) + { + Reset_encoder(gData, 1); + } + return packed_size; +} + +/*************************************************************************** +* +*Brief: Codec API function --- Initialize the codec and return a codec handle +* +***************************************************************************/ + +VO_U32 VO_API voAMRWB_Init(VO_HANDLE * phCodec, /* o: the audio codec handle */ + VO_AUDIO_CODINGTYPE vType, /* i: Codec Type ID */ + VO_CODEC_INIT_USERDATA * pUserData /* i: init Parameters */ + ) +{ + Coder_State *st; + FrameStream *stream; +#ifdef USE_DEAULT_MEM + VO_MEM_OPERATOR voMemoprator; +#endif + VO_MEM_OPERATOR *pMemOP; + int interMem = 0; + + if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL ) + { +#ifdef USE_DEAULT_MEM + voMemoprator.Alloc = cmnMemAlloc; + voMemoprator.Copy = cmnMemCopy; + voMemoprator.Free = cmnMemFree; + voMemoprator.Set = cmnMemSet; + voMemoprator.Check = cmnMemCheck; + interMem = 1; + pMemOP = &voMemoprator; +#else + *phCodec = NULL; + return VO_ERR_INVALID_ARG; +#endif + } + else + { + pMemOP = (VO_MEM_OPERATOR *)pUserData->memData; + } + /*-------------------------------------------------------------------------* + * Memory allocation for coder state. * + *-------------------------------------------------------------------------*/ + if ((st = (Coder_State *)mem_malloc(pMemOP, sizeof(Coder_State), 32, VO_INDEX_ENC_AMRWB)) == NULL) + { + return VO_ERR_OUTOF_MEMORY; + } + + st->vadSt = NULL; + st->dtx_encSt = NULL; + st->sid_update_counter = 3; + st->sid_handover_debt = 0; + st->prev_ft = TX_SPEECH; + st->inputStream = NULL; + st->inputSize = 0; + + /* Default setting */ + st->mode = VOAMRWB_MD2385; /* bit rate 23.85kbps */ + st->frameType = VOAMRWB_RFC3267; /* frame type: RFC3267 */ + st->allow_dtx = 0; /* disable DTX mode */ + + st->outputStream = NULL; + st->outputSize = 0; + + st->stream = (FrameStream *)mem_malloc(pMemOP, sizeof(FrameStream), 32, VO_INDEX_ENC_AMRWB); + if(st->stream == NULL) + return VO_ERR_OUTOF_MEMORY; + + st->stream->frame_ptr = (unsigned char *)mem_malloc(pMemOP, Frame_Maxsize, 32, VO_INDEX_ENC_AMRWB); + if(st->stream->frame_ptr == NULL) + return VO_ERR_OUTOF_MEMORY; + + stream = st->stream; + voAWB_InitFrameBuffer(stream); + + wb_vad_init(&(st->vadSt), pMemOP); + dtx_enc_init(&(st->dtx_encSt), isf_init, pMemOP); + + Reset_encoder((void *) st, 1); + + if(interMem) + { + st->voMemoprator.Alloc = cmnMemAlloc; + st->voMemoprator.Copy = cmnMemCopy; + st->voMemoprator.Free = cmnMemFree; + st->voMemoprator.Set = cmnMemSet; + st->voMemoprator.Check = cmnMemCheck; + pMemOP = &st->voMemoprator; + } + + st->pvoMemop = pMemOP; + + *phCodec = (void *) st; + + return VO_ERR_NONE; +} + +/********************************************************************************** +* +* Brief: Codec API function: Input PCM data +* +***********************************************************************************/ + +VO_U32 VO_API voAMRWB_SetInputData( + VO_HANDLE hCodec, /* i/o: The codec handle which was created by Init function */ + VO_CODECBUFFER * pInput /* i: The input buffer parameter */ + ) +{ + Coder_State *gData; + FrameStream *stream; + + if(NULL == hCodec) + { + return VO_ERR_INVALID_ARG; + } + + gData = (Coder_State *)hCodec; + stream = gData->stream; + + if(NULL == pInput || NULL == pInput->Buffer || 0 > pInput->Length) + { + return VO_ERR_INVALID_ARG; + } + + stream->set_ptr = pInput->Buffer; + stream->set_len = pInput->Length; + stream->frame_ptr = stream->frame_ptr_bk; + stream->used_len = 0; + + return VO_ERR_NONE; +} + +/************************************************************************************** +* +* Brief: Codec API function: Get the compression audio data frame by frame +* +***************************************************************************************/ + +VO_U32 VO_API voAMRWB_GetOutputData( + VO_HANDLE hCodec, /* i: The Codec Handle which was created by Init function*/ + VO_CODECBUFFER * pOutput, /* o: The output audio data */ + VO_AUDIO_OUTPUTINFO * pAudioFormat /* o: The encoder module filled audio format and used the input size*/ + ) +{ + Coder_State* gData = (Coder_State*)hCodec; + VO_MEM_OPERATOR *pMemOP; + FrameStream *stream = (FrameStream *)gData->stream; + pMemOP = (VO_MEM_OPERATOR *)gData->pvoMemop; + + if(stream->framebuffer_len < Frame_MaxByte) /* check the work buffer len */ + { + stream->frame_storelen = stream->framebuffer_len; + if(stream->frame_storelen) + { + pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk , stream->frame_ptr , stream->frame_storelen); + } + if(stream->set_len > 0) + { + voAWB_UpdateFrameBuffer(stream, pMemOP); + } + if(stream->framebuffer_len < Frame_MaxByte) + { + if(pAudioFormat) + pAudioFormat->InputUsed = stream->used_len; + return VO_ERR_INPUT_BUFFER_SMALL; + } + } + + gData->inputStream = stream->frame_ptr; + gData->outputStream = (unsigned short*)pOutput->Buffer; + + gData->outputSize = AMR_Enc_Encode(gData); /* encoder main function */ + + pOutput->Length = gData->outputSize; /* get the output buffer length */ + stream->frame_ptr += 640; /* update the work buffer ptr */ + stream->framebuffer_len -= 640; + + if(pAudioFormat) /* return output audio information */ + { + pAudioFormat->Format.Channels = 1; + pAudioFormat->Format.SampleRate = 8000; + pAudioFormat->Format.SampleBits = 16; + pAudioFormat->InputUsed = stream->used_len; + } + return VO_ERR_NONE; +} + +/************************************************************************* +* +* Brief: Codec API function---set the data by specified parameter ID +* +*************************************************************************/ + + +VO_U32 VO_API voAMRWB_SetParam( + VO_HANDLE hCodec, /* i/o: The Codec Handle which was created by Init function */ + VO_S32 uParamID, /* i: The param ID */ + VO_PTR pData /* i: The param value depend on the ID */ + ) +{ + Coder_State* gData = (Coder_State*)hCodec; + FrameStream *stream = (FrameStream *)(gData->stream); + int *lValue = (int*)pData; + + switch(uParamID) + { + /* setting AMR-WB frame type*/ + case VO_PID_AMRWB_FRAMETYPE: + if(*lValue < VOAMRWB_DEFAULT || *lValue > VOAMRWB_RFC3267) + return VO_ERR_WRONG_PARAM_ID; + gData->frameType = *lValue; + break; + /* setting AMR-WB bit rate */ + case VO_PID_AMRWB_MODE: + { + if(*lValue < VOAMRWB_MD66 || *lValue > VOAMRWB_MD2385) + return VO_ERR_WRONG_PARAM_ID; + gData->mode = *lValue; + } + break; + /* enable or disable DTX mode */ + case VO_PID_AMRWB_DTX: + gData->allow_dtx = (Word16)(*lValue); + break; + + case VO_PID_COMMON_HEADDATA: + break; + /* flush the work buffer */ + case VO_PID_COMMON_FLUSH: + stream->set_ptr = NULL; + stream->frame_storelen = 0; + stream->framebuffer_len = 0; + stream->set_len = 0; + break; + + default: + return VO_ERR_WRONG_PARAM_ID; + } + return VO_ERR_NONE; +} + +/************************************************************************** +* +*Brief: Codec API function---Get the data by specified parameter ID +* +***************************************************************************/ + +VO_U32 VO_API voAMRWB_GetParam( + VO_HANDLE hCodec, /* i: The Codec Handle which was created by Init function */ + VO_S32 uParamID, /* i: The param ID */ + VO_PTR pData /* o: The param value depend on the ID */ + ) +{ + int temp; + Coder_State* gData = (Coder_State*)hCodec; + + if (gData==NULL) + return VO_ERR_INVALID_ARG; + switch(uParamID) + { + /* output audio format */ + case VO_PID_AMRWB_FORMAT: + { + VO_AUDIO_FORMAT* fmt = (VO_AUDIO_FORMAT*)pData; + fmt->Channels = 1; + fmt->SampleRate = 16000; + fmt->SampleBits = 16; + break; + } + /* output audio channel number */ + case VO_PID_AMRWB_CHANNELS: + temp = 1; + pData = (void *)(&temp); + break; + /* output audio sample rate */ + case VO_PID_AMRWB_SAMPLERATE: + temp = 16000; + pData = (void *)(&temp); + break; + /* output audio frame type */ + case VO_PID_AMRWB_FRAMETYPE: + temp = gData->frameType; + pData = (void *)(&temp); + break; + /* output audio bit rate */ + case VO_PID_AMRWB_MODE: + temp = gData->mode; + pData = (void *)(&temp); + break; + default: + return VO_ERR_WRONG_PARAM_ID; + } + + return VO_ERR_NONE; +} + +/*********************************************************************************** +* +* Brief: Codec API function---Release the codec after all encoder operations are done +* +*************************************************************************************/ + +VO_U32 VO_API voAMRWB_Uninit(VO_HANDLE hCodec /* i/o: Codec handle pointer */ + ) +{ + Coder_State* gData = (Coder_State*)hCodec; + VO_MEM_OPERATOR *pMemOP; + pMemOP = gData->pvoMemop; + + if(hCodec) + { + if(gData->stream) + { + if(gData->stream->frame_ptr_bk) + { + mem_free(pMemOP, gData->stream->frame_ptr_bk, VO_INDEX_ENC_AMRWB); + gData->stream->frame_ptr_bk = NULL; + } + mem_free(pMemOP, gData->stream, VO_INDEX_ENC_AMRWB); + gData->stream = NULL; + } + wb_vad_exit(&(((Coder_State *) gData)->vadSt), pMemOP); + dtx_enc_exit(&(((Coder_State *) gData)->dtx_encSt), pMemOP); + + mem_free(pMemOP, hCodec, VO_INDEX_ENC_AMRWB); + hCodec = NULL; + } + + return VO_ERR_NONE; +} + +/******************************************************************************** +* +* Brief: voGetAMRWBEncAPI gets the API handle of the codec +* +********************************************************************************/ + +VO_S32 VO_API voGetAMRWBEncAPI( + VO_AUDIO_CODECAPI * pEncHandle /* i/o: Codec handle pointer */ + ) +{ + if(NULL == pEncHandle) + return VO_ERR_INVALID_ARG; + pEncHandle->Init = voAMRWB_Init; + pEncHandle->SetInputData = voAMRWB_SetInputData; + pEncHandle->GetOutputData = voAMRWB_GetOutputData; + pEncHandle->SetParam = voAMRWB_SetParam; + pEncHandle->GetParam = voAMRWB_GetParam; + pEncHandle->Uninit = voAMRWB_Uninit; + + return VO_ERR_NONE; +} + +#ifdef __cplusplus +} +#endif diff --git a/media/libstagefright/codecs/amrwbenc/src/voicefac.c b/media/libstagefright/codecs/amrwbenc/src/voicefac.c index 187d774..17e4e55 100644 --- a/media/libstagefright/codecs/amrwbenc/src/voicefac.c +++ b/media/libstagefright/codecs/amrwbenc/src/voicefac.c @@ -1,92 +1,92 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: voicefac.c * -* * -* Description: Find the voicing factors (1 = voice to -1 = unvoiced) * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" -#include "math_op.h" - -Word16 voice_factor( /* (o) Q15 : factor (-1=unvoiced to 1=voiced) */ - Word16 exc[], /* (i) Q_exc : pitch excitation */ - Word16 Q_exc, /* (i) : exc format */ - Word16 gain_pit, /* (i) Q14 : gain of pitch */ - Word16 code[], /* (i) Q9 : Fixed codebook excitation */ - Word16 gain_code, /* (i) Q0 : gain of code */ - Word16 L_subfr /* (i) : subframe length */ - ) -{ - Word16 tmp, exp, ener1, exp1, ener2, exp2; - Word32 i, L_tmp; - -#ifdef ASM_OPT /* asm optimization branch */ - ener1 = extract_h(Dot_product12_asm(exc, exc, L_subfr, &exp1)); -#else - ener1 = extract_h(Dot_product12(exc, exc, L_subfr, &exp1)); -#endif - exp1 = exp1 - (Q_exc + Q_exc); - L_tmp = vo_L_mult(gain_pit, gain_pit); - exp = norm_l(L_tmp); - tmp = extract_h(L_tmp << exp); - ener1 = vo_mult(ener1, tmp); - exp1 = exp1 - exp - 10; /* 10 -> gain_pit Q14 to Q9 */ - -#ifdef ASM_OPT /* asm optimization branch */ - ener2 = extract_h(Dot_product12_asm(code, code, L_subfr, &exp2)); -#else - ener2 = extract_h(Dot_product12(code, code, L_subfr, &exp2)); -#endif - - exp = norm_s(gain_code); - tmp = gain_code << exp; - tmp = vo_mult(tmp, tmp); - ener2 = vo_mult(ener2, tmp); - exp2 = exp2 - (exp + exp); - - i = exp1 - exp2; - - if (i >= 0) - { - ener1 = ener1 >> 1; - ener2 = ener2 >> (i + 1); - } else - { - ener1 = ener1 >> (1 - i); - ener2 = ener2 >> 1; - } - - tmp = vo_sub(ener1, ener2); - ener1 = add1(add1(ener1, ener2), 1); - - if (tmp >= 0) - { - tmp = div_s(tmp, ener1); - } else - { - tmp = vo_negate(div_s(vo_negate(tmp), ener1)); - } - - return (tmp); -} - - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: voicefac.c * +* * +* Description: Find the voicing factors (1 = voice to -1 = unvoiced) * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "math_op.h" + +Word16 voice_factor( /* (o) Q15 : factor (-1=unvoiced to 1=voiced) */ + Word16 exc[], /* (i) Q_exc : pitch excitation */ + Word16 Q_exc, /* (i) : exc format */ + Word16 gain_pit, /* (i) Q14 : gain of pitch */ + Word16 code[], /* (i) Q9 : Fixed codebook excitation */ + Word16 gain_code, /* (i) Q0 : gain of code */ + Word16 L_subfr /* (i) : subframe length */ + ) +{ + Word16 tmp, exp, ener1, exp1, ener2, exp2; + Word32 i, L_tmp; + +#ifdef ASM_OPT /* asm optimization branch */ + ener1 = extract_h(Dot_product12_asm(exc, exc, L_subfr, &exp1)); +#else + ener1 = extract_h(Dot_product12(exc, exc, L_subfr, &exp1)); +#endif + exp1 = exp1 - (Q_exc + Q_exc); + L_tmp = vo_L_mult(gain_pit, gain_pit); + exp = norm_l(L_tmp); + tmp = extract_h(L_tmp << exp); + ener1 = vo_mult(ener1, tmp); + exp1 = exp1 - exp - 10; /* 10 -> gain_pit Q14 to Q9 */ + +#ifdef ASM_OPT /* asm optimization branch */ + ener2 = extract_h(Dot_product12_asm(code, code, L_subfr, &exp2)); +#else + ener2 = extract_h(Dot_product12(code, code, L_subfr, &exp2)); +#endif + + exp = norm_s(gain_code); + tmp = gain_code << exp; + tmp = vo_mult(tmp, tmp); + ener2 = vo_mult(ener2, tmp); + exp2 = exp2 - (exp + exp); + + i = exp1 - exp2; + + if (i >= 0) + { + ener1 = ener1 >> 1; + ener2 = ener2 >> (i + 1); + } else + { + ener1 = ener1 >> (1 - i); + ener2 = ener2 >> 1; + } + + tmp = vo_sub(ener1, ener2); + ener1 = add1(add1(ener1, ener2), 1); + + if (tmp >= 0) + { + tmp = div_s(tmp, ener1); + } else + { + tmp = vo_negate(div_s(vo_negate(tmp), ener1)); + } + + return (tmp); +} + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/wb_vad.c b/media/libstagefright/codecs/amrwbenc/src/wb_vad.c index 0126853..7e1d673 100644 --- a/media/libstagefright/codecs/amrwbenc/src/wb_vad.c +++ b/media/libstagefright/codecs/amrwbenc/src/wb_vad.c @@ -1,808 +1,808 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: wb_vad.c * -* * -* Description: Voice Activity Detection * -* * -************************************************************************/ - -#include -#include -#include "cnst.h" -#include "wb_vad.h" -#include "typedef.h" -#include "basic_op.h" -#include "math_op.h" -#include "wb_vad_c.h" -#include "mem_align.h" - -/****************************************************************************** -* Calculate Log2 and scale the signal: -* -* ilog2(Word32 in) = -1024*log10(in * 2^-31)/log10(2), where in = [1, 2^31-1] -* -* input output -* 32768 16384 -* 1 31744 -* -* When input is in the range of [1,2^16], max error is 0.0380%. -*********************************************************************************/ - -static Word16 ilog2( /* return: output value of the log2 */ - Word16 mant /* i: value to be converted */ - ) -{ - Word16 ex, ex2, res; - Word32 i, l_temp; - - if (mant <= 0) - { - mant = 1; - } - ex = norm_s(mant); - mant = mant << ex; - - for (i = 0; i < 3; i++) - mant = vo_mult(mant, mant); - l_temp = vo_L_mult(mant, mant); - - ex2 = norm_l(l_temp); - mant = extract_h(l_temp << ex2); - - res = (ex + 16) << 10; - res = add1(res, (ex2 << 6)); - res = vo_sub(add1(res, 127), (mant >> 8)); - return (res); -} - -/****************************************************************************** -* -* Function : filter5 -* Purpose : Fifth-order half-band lowpass/highpass filter pair with -* decimation. -* -*******************************************************************************/ - -static void filter5( - Word16 * in0, /* i/o : input values; output low-pass part */ - Word16 * in1, /* i/o : input values; output high-pass part */ - Word16 data[] /* i/o : filter memory */ - ) -{ - Word16 temp0, temp1, temp2; - - temp0 = vo_sub(*in0, vo_mult(COEFF5_1, data[0])); - temp1 = add1(data[0], vo_mult(COEFF5_1, temp0)); - data[0] = temp0; - - temp0 = vo_sub(*in1, vo_mult(COEFF5_2, data[1])); - temp2 = add1(data[1], vo_mult(COEFF5_2, temp0)); - data[1] = temp0; - - *in0 = extract_h((vo_L_add(temp1, temp2) << 15)); - *in1 = extract_h((vo_L_sub(temp1, temp2) << 15)); -} - -/****************************************************************************** -* -* Function : filter3 -* Purpose : Third-order half-band lowpass/highpass filter pair with -* decimation. -* -*******************************************************************************/ - -static void filter3( - Word16 * in0, /* i/o : input values; output low-pass part */ - Word16 * in1, /* i/o : input values; output high-pass part */ - Word16 * data /* i/o : filter memory */ - ) -{ - Word16 temp1, temp2; - - temp1 = vo_sub(*in1, vo_mult(COEFF3, *data)); - temp2 = add1(*data, vo_mult(COEFF3, temp1)); - *data = temp1; - - *in1 = extract_h((vo_L_sub(*in0, temp2) << 15)); - *in0 = extract_h((vo_L_add(*in0, temp2) << 15)); -} - -/****************************************************************************** -* -* Function : level_calculation -* Purpose : Calculate signal level in a sub-band. Level is calculated -* by summing absolute values of the input data. -* -* Signal level calculated from of the end of the frame -* (data[count1 - count2]) is stored to (*sub_level) -* and added to the level of the next frame. -* -******************************************************************************/ - -static Word16 level_calculation( /* return: signal level */ - Word16 data[], /* i : signal buffer */ - Word16 * sub_level, /* i : level calculated at the end of the previous frame*/ - /* o : level of signal calculated from the last */ - /* (count2 - count1) samples */ - Word16 count1, /* i : number of samples to be counted */ - Word16 count2, /* i : number of samples to be counted */ - Word16 ind_m, /* i : step size for the index of the data buffer */ - Word16 ind_a, /* i : starting index of the data buffer */ - Word16 scale /* i : scaling for the level calculation */ - ) -{ - Word32 i, l_temp1, l_temp2; - Word16 level; - - l_temp1 = 0L; - for (i = count1; i < count2; i++) - { - l_temp1 += (abs_s(data[ind_m * i + ind_a])<<1); - } - - l_temp2 = vo_L_add(l_temp1, L_shl(*sub_level, 16 - scale)); - *sub_level = extract_h(L_shl(l_temp1, scale)); - - for (i = 0; i < count1; i++) - { - l_temp2 += (abs_s(data[ind_m * i + ind_a])<<1); - } - level = extract_h(L_shl2(l_temp2, scale)); - - return level; -} - -/****************************************************************************** -* -* Function : filter_bank -* Purpose : Divide input signal into bands and calculate level of -* the signal in each band -* -*******************************************************************************/ - -static void filter_bank( - VadVars * st, /* i/o : State struct */ - Word16 in[], /* i : input frame */ - Word16 level[] /* o : signal levels at each band */ - ) -{ - Word32 i; - Word16 tmp_buf[FRAME_LEN]; - - /* shift input 1 bit down for safe scaling */ - for (i = 0; i < FRAME_LEN; i++) - { - tmp_buf[i] = in[i] >> 1; - } - - /* run the filter bank */ - for (i = 0; i < 128; i++) - { - filter5(&tmp_buf[2 * i], &tmp_buf[2 * i + 1], st->a_data5[0]); - } - for (i = 0; i < 64; i++) - { - filter5(&tmp_buf[4 * i], &tmp_buf[4 * i + 2], st->a_data5[1]); - filter5(&tmp_buf[4 * i + 1], &tmp_buf[4 * i + 3], st->a_data5[2]); - } - for (i = 0; i < 32; i++) - { - filter5(&tmp_buf[8 * i], &tmp_buf[8 * i + 4], st->a_data5[3]); - filter5(&tmp_buf[8 * i + 2], &tmp_buf[8 * i + 6], st->a_data5[4]); - filter3(&tmp_buf[8 * i + 3], &tmp_buf[8 * i + 7], &st->a_data3[0]); - } - for (i = 0; i < 16; i++) - { - filter3(&tmp_buf[16 * i + 0], &tmp_buf[16 * i + 8], &st->a_data3[1]); - filter3(&tmp_buf[16 * i + 4], &tmp_buf[16 * i + 12], &st->a_data3[2]); - filter3(&tmp_buf[16 * i + 6], &tmp_buf[16 * i + 14], &st->a_data3[3]); - } - - for (i = 0; i < 8; i++) - { - filter3(&tmp_buf[32 * i + 0], &tmp_buf[32 * i + 16], &st->a_data3[4]); - filter3(&tmp_buf[32 * i + 8], &tmp_buf[32 * i + 24], &st->a_data3[5]); - } - - /* calculate levels in each frequency band */ - - /* 4800 - 6400 Hz */ - level[11] = level_calculation(tmp_buf, &st->sub_level[11], 16, 64, 4, 1, 14); - /* 4000 - 4800 Hz */ - level[10] = level_calculation(tmp_buf, &st->sub_level[10], 8, 32, 8, 7, 15); - /* 3200 - 4000 Hz */ - level[9] = level_calculation(tmp_buf, &st->sub_level[9],8, 32, 8, 3, 15); - /* 2400 - 3200 Hz */ - level[8] = level_calculation(tmp_buf, &st->sub_level[8],8, 32, 8, 2, 15); - /* 2000 - 2400 Hz */ - level[7] = level_calculation(tmp_buf, &st->sub_level[7],4, 16, 16, 14, 16); - /* 1600 - 2000 Hz */ - level[6] = level_calculation(tmp_buf, &st->sub_level[6],4, 16, 16, 6, 16); - /* 1200 - 1600 Hz */ - level[5] = level_calculation(tmp_buf, &st->sub_level[5],4, 16, 16, 4, 16); - /* 800 - 1200 Hz */ - level[4] = level_calculation(tmp_buf, &st->sub_level[4],4, 16, 16, 12, 16); - /* 600 - 800 Hz */ - level[3] = level_calculation(tmp_buf, &st->sub_level[3],2, 8, 32, 8, 17); - /* 400 - 600 Hz */ - level[2] = level_calculation(tmp_buf, &st->sub_level[2],2, 8, 32, 24, 17); - /* 200 - 400 Hz */ - level[1] = level_calculation(tmp_buf, &st->sub_level[1],2, 8, 32, 16, 17); - /* 0 - 200 Hz */ - level[0] = level_calculation(tmp_buf, &st->sub_level[0],2, 8, 32, 0, 17); -} - -/****************************************************************************** -* -* Function : update_cntrl -* Purpose : Control update of the background noise estimate. -* -*******************************************************************************/ - -static void update_cntrl( - VadVars * st, /* i/o : State structure */ - Word16 level[] /* i : sub-band levels of the input frame */ - ) -{ - Word32 i; - Word16 num, temp, stat_rat, exp, denom; - Word16 alpha; - - /* if a tone has been detected for a while, initialize stat_count */ - if (sub((Word16) (st->tone_flag & 0x7c00), 0x7c00) == 0) - { - st->stat_count = STAT_COUNT; - } else - { - /* if 8 last vad-decisions have been "0", reinitialize stat_count */ - if ((st->vadreg & 0x7f80) == 0) - { - st->stat_count = STAT_COUNT; - } else - { - stat_rat = 0; - for (i = 0; i < COMPLEN; i++) - { - if(level[i] > st->ave_level[i]) - { - num = level[i]; - denom = st->ave_level[i]; - } else - { - num = st->ave_level[i]; - denom = level[i]; - } - /* Limit nimimum value of num and denom to STAT_THR_LEVEL */ - if(num < STAT_THR_LEVEL) - { - num = STAT_THR_LEVEL; - } - if(denom < STAT_THR_LEVEL) - { - denom = STAT_THR_LEVEL; - } - exp = norm_s(denom); - denom = denom << exp; - - /* stat_rat = num/denom * 64 */ - temp = div_s(num >> 1, denom); - stat_rat = add1(stat_rat, shr(temp, (8 - exp))); - } - - /* compare stat_rat with a threshold and update stat_count */ - if(stat_rat > STAT_THR) - { - st->stat_count = STAT_COUNT; - } else - { - if ((st->vadreg & 0x4000) != 0) - { - - if (st->stat_count != 0) - { - st->stat_count = st->stat_count - 1; - } - } - } - } - } - - /* Update average amplitude estimate for stationarity estimation */ - alpha = ALPHA4; - if(st->stat_count == STAT_COUNT) - { - alpha = 32767; - } else if ((st->vadreg & 0x4000) == 0) - { - alpha = ALPHA5; - } - for (i = 0; i < COMPLEN; i++) - { - st->ave_level[i] = add1(st->ave_level[i], vo_mult_r(alpha, vo_sub(level[i], st->ave_level[i]))); - } -} - -/****************************************************************************** -* -* Function : hangover_addition -* Purpose : Add hangover after speech bursts -* -*******************************************************************************/ - -static Word16 hangover_addition( /* return: VAD_flag indicating final VAD decision */ - VadVars * st, /* i/o : State structure */ - Word16 low_power, /* i : flag power of the input frame */ - Word16 hang_len, /* i : hangover length */ - Word16 burst_len /* i : minimum burst length for hangover addition */ - ) -{ - /* if the input power (pow_sum) is lower than a threshold, clear counters and set VAD_flag to "0" */ - if (low_power != 0) - { - st->burst_count = 0; - st->hang_count = 0; - return 0; - } - /* update the counters (hang_count, burst_count) */ - if ((st->vadreg & 0x4000) != 0) - { - st->burst_count = st->burst_count + 1; - if(st->burst_count >= burst_len) - { - st->hang_count = hang_len; - } - return 1; - } else - { - st->burst_count = 0; - if (st->hang_count > 0) - { - st->hang_count = st->hang_count - 1; - return 1; - } - } - return 0; -} - -/****************************************************************************** -* -* Function : noise_estimate_update -* Purpose : Update of background noise estimate -* -*******************************************************************************/ - -static void noise_estimate_update( - VadVars * st, /* i/o : State structure */ - Word16 level[] /* i : sub-band levels of the input frame */ - ) -{ - Word32 i; - Word16 alpha_up, alpha_down, bckr_add = 2; - - /* Control update of bckr_est[] */ - update_cntrl(st, level); - - /* Choose update speed */ - if ((0x7800 & st->vadreg) == 0) - { - alpha_up = ALPHA_UP1; - alpha_down = ALPHA_DOWN1; - } else - { - if ((st->stat_count == 0)) - { - alpha_up = ALPHA_UP2; - alpha_down = ALPHA_DOWN2; - } else - { - alpha_up = 0; - alpha_down = ALPHA3; - bckr_add = 0; - } - } - - /* Update noise estimate (bckr_est) */ - for (i = 0; i < COMPLEN; i++) - { - Word16 temp; - temp = (st->old_level[i] - st->bckr_est[i]); - - if (temp < 0) - { /* update downwards */ - st->bckr_est[i] = add1(-2, add(st->bckr_est[i],vo_mult_r(alpha_down, temp))); - /* limit minimum value of the noise estimate to NOISE_MIN */ - if(st->bckr_est[i] < NOISE_MIN) - { - st->bckr_est[i] = NOISE_MIN; - } - } else - { /* update upwards */ - st->bckr_est[i] = add1(bckr_add, add1(st->bckr_est[i],vo_mult_r(alpha_up, temp))); - - /* limit maximum value of the noise estimate to NOISE_MAX */ - if(st->bckr_est[i] > NOISE_MAX) - { - st->bckr_est[i] = NOISE_MAX; - } - } - } - - /* Update signal levels of the previous frame (old_level) */ - for (i = 0; i < COMPLEN; i++) - { - st->old_level[i] = level[i]; - } -} - -/****************************************************************************** -* -* Function : vad_decision -* Purpose : Calculates VAD_flag -* -*******************************************************************************/ - -static Word16 vad_decision( /* return value : VAD_flag */ - VadVars * st, /* i/o : State structure */ - Word16 level[COMPLEN], /* i : sub-band levels of the input frame */ - Word32 pow_sum /* i : power of the input frame */ - ) -{ - Word32 i; - Word32 L_snr_sum; - Word32 L_temp; - Word16 vad_thr, temp, noise_level; - Word16 low_power_flag; - Word16 hang_len, burst_len; - Word16 ilog2_speech_level, ilog2_noise_level; - Word16 temp2; - - /* Calculate squared sum of the input levels (level) divided by the background noise components - * (bckr_est). */ - L_snr_sum = 0; - for (i = 0; i < COMPLEN; i++) - { - Word16 exp; - - exp = norm_s(st->bckr_est[i]); - temp = (st->bckr_est[i] << exp); - temp = div_s((level[i] >> 1), temp); - temp = shl(temp, (exp - (UNIRSHFT - 1))); - L_snr_sum = L_mac(L_snr_sum, temp, temp); - } - - /* Calculate average level of estimated background noise */ - L_temp = 0; - for (i = 1; i < COMPLEN; i++) /* ignore lowest band */ - { - L_temp = vo_L_add(L_temp, st->bckr_est[i]); - } - - noise_level = extract_h((L_temp << 12)); - /* if SNR is lower than a threshold (MIN_SPEECH_SNR), and increase speech_level */ - temp = vo_mult(noise_level, MIN_SPEECH_SNR) << 3; - - if(st->speech_level < temp) - { - st->speech_level = temp; - } - ilog2_noise_level = ilog2(noise_level); - - /* If SNR is very poor, speech_level is probably corrupted by noise level. This is correctred by - * subtracting MIN_SPEECH_SNR*noise_level from speech level */ - ilog2_speech_level = ilog2(st->speech_level - temp); - - temp = add1(vo_mult(NO_SLOPE, (ilog2_noise_level - NO_P1)), THR_HIGH); - - temp2 = add1(SP_CH_MIN, vo_mult(SP_SLOPE, (ilog2_speech_level - SP_P1))); - if (temp2 < SP_CH_MIN) - { - temp2 = SP_CH_MIN; - } - if (temp2 > SP_CH_MAX) - { - temp2 = SP_CH_MAX; - } - vad_thr = temp + temp2; - - if(vad_thr < THR_MIN) - { - vad_thr = THR_MIN; - } - /* Shift VAD decision register */ - st->vadreg = (st->vadreg >> 1); - - /* Make intermediate VAD decision */ - if(L_snr_sum > vo_L_mult(vad_thr, (512 * COMPLEN))) - { - st->vadreg = (Word16) (st->vadreg | 0x4000); - } - /* check if the input power (pow_sum) is lower than a threshold" */ - if(pow_sum < VAD_POW_LOW) - { - low_power_flag = 1; - } else - { - low_power_flag = 0; - } - /* Update background noise estimates */ - noise_estimate_update(st, level); - - /* Calculate values for hang_len and burst_len based on vad_thr */ - hang_len = add1(vo_mult(HANG_SLOPE, (vad_thr - HANG_P1)), HANG_HIGH); - if(hang_len < HANG_LOW) - { - hang_len = HANG_LOW; - } - burst_len = add1(vo_mult(BURST_SLOPE, (vad_thr - BURST_P1)), BURST_HIGH); - - return (hangover_addition(st, low_power_flag, hang_len, burst_len)); -} - -/****************************************************************************** -* -* Function : Estimate_Speech() -* Purpose : Estimate speech level -* -* Maximum signal level is searched and stored to the variable sp_max. -* The speech frames must locate within SP_EST_COUNT number of frames. -* Thus, noisy frames having occasional VAD = "1" decisions will not -* affect to the estimated speech_level. -* -*******************************************************************************/ - -static void Estimate_Speech( - VadVars * st, /* i/o : State structure */ - Word16 in_level /* level of the input frame */ - ) -{ - Word16 alpha; - - /* if the required activity count cannot be achieved, reset counters */ - if((st->sp_est_cnt - st->sp_max_cnt) > (SP_EST_COUNT - SP_ACTIVITY_COUNT)) - { - st->sp_est_cnt = 0; - st->sp_max = 0; - st->sp_max_cnt = 0; - } - st->sp_est_cnt += 1; - - if (((st->vadreg & 0x4000)||(in_level > st->speech_level)) && (in_level > MIN_SPEECH_LEVEL1)) - { - /* update sp_max */ - if(in_level > st->sp_max) - { - st->sp_max = in_level; - } - st->sp_max_cnt += 1; - - if(st->sp_max_cnt >= SP_ACTIVITY_COUNT) - { - Word16 tmp; - /* update speech estimate */ - tmp = (st->sp_max >> 1); /* scale to get "average" speech level */ - - /* select update speed */ - if(tmp > st->speech_level) - { - alpha = ALPHA_SP_UP; - } else - { - alpha = ALPHA_SP_DOWN; - } - if(tmp > MIN_SPEECH_LEVEL2) - { - st->speech_level = add1(st->speech_level, vo_mult_r(alpha, vo_sub(tmp, st->speech_level))); - } - /* clear all counters used for speech estimation */ - st->sp_max = 0; - st->sp_max_cnt = 0; - st->sp_est_cnt = 0; - } - } -} - -/****************************************************************************** -* -* Function: wb_vad_init -* Purpose: Allocates state memory and initializes state memory -* -*******************************************************************************/ - -Word16 wb_vad_init( /* return: non-zero with error, zero for ok. */ - VadVars ** state, /* i/o : State structure */ - VO_MEM_OPERATOR *pMemOP - ) -{ - VadVars *s; - - if (state == (VadVars **) NULL) - { - fprintf(stderr, "vad_init: invalid parameter\n"); - return -1; - } - *state = NULL; - - /* allocate memory */ - if ((s = (VadVars *) mem_malloc(pMemOP, sizeof(VadVars), 32, VO_INDEX_ENC_AMRWB)) == NULL) - { - fprintf(stderr, "vad_init: can not malloc state structure\n"); - return -1; - } - wb_vad_reset(s); - - *state = s; - - return 0; -} - -/****************************************************************************** -* -* Function: wb_vad_reset -* Purpose: Initializes state memory -* -*******************************************************************************/ - -Word16 wb_vad_reset( /* return: non-zero with error, zero for ok. */ - VadVars * state /* i/o : State structure */ - ) -{ - Word32 i, j; - - if (state == (VadVars *) NULL) - { - fprintf(stderr, "vad_reset: invalid parameter\n"); - return -1; - } - state->tone_flag = 0; - state->vadreg = 0; - state->hang_count = 0; - state->burst_count = 0; - state->hang_count = 0; - - /* initialize memory used by the filter bank */ - for (i = 0; i < F_5TH_CNT; i++) - { - for (j = 0; j < 2; j++) - { - state->a_data5[i][j] = 0; - } - } - - for (i = 0; i < F_3TH_CNT; i++) - { - state->a_data3[i] = 0; - } - - /* initialize the rest of the memory */ - for (i = 0; i < COMPLEN; i++) - { - state->bckr_est[i] = NOISE_INIT; - state->old_level[i] = NOISE_INIT; - state->ave_level[i] = NOISE_INIT; - state->sub_level[i] = 0; - } - - state->sp_est_cnt = 0; - state->sp_max = 0; - state->sp_max_cnt = 0; - state->speech_level = SPEECH_LEVEL_INIT; - state->prev_pow_sum = 0; - return 0; -} - -/****************************************************************************** -* -* Function: wb_vad_exit -* Purpose: The memory used for state memory is freed -* -*******************************************************************************/ - -void wb_vad_exit( - VadVars ** state, /* i/o : State structure */ - VO_MEM_OPERATOR *pMemOP - ) -{ - if (state == NULL || *state == NULL) - return; - /* deallocate memory */ - mem_free(pMemOP, *state, VO_INDEX_ENC_AMRWB); - *state = NULL; - return; -} - -/****************************************************************************** -* -* Function : wb_vad_tone_detection -* Purpose : Search maximum pitch gain from a frame. Set tone flag if -* pitch gain is high. This is used to detect -* signaling tones and other signals with high pitch gain. -* -*******************************************************************************/ - -void wb_vad_tone_detection( - VadVars * st, /* i/o : State struct */ - Word16 p_gain /* pitch gain */ - ) -{ - /* update tone flag */ - st->tone_flag = (st->tone_flag >> 1); - - /* if (pitch_gain > TONE_THR) set tone flag */ - if (p_gain > TONE_THR) - { - st->tone_flag = (Word16) (st->tone_flag | 0x4000); - } -} - -/****************************************************************************** -* -* Function : wb_vad -* Purpose : Main program for Voice Activity Detection (VAD) for AMR -* -*******************************************************************************/ - -Word16 wb_vad( /* Return value : VAD Decision, 1 = speech, 0 = noise */ - VadVars * st, /* i/o : State structure */ - Word16 in_buf[] /* i : samples of the input frame */ - ) -{ - Word16 level[COMPLEN]; - Word32 i; - Word16 VAD_flag, temp; - Word32 L_temp, pow_sum; - - /* Calculate power of the input frame. */ - L_temp = 0L; - for (i = 0; i < FRAME_LEN; i++) - { - L_temp = L_mac(L_temp, in_buf[i], in_buf[i]); - } - - /* pow_sum = power of current frame and previous frame */ - pow_sum = L_add(L_temp, st->prev_pow_sum); - - /* save power of current frame for next call */ - st->prev_pow_sum = L_temp; - - /* If input power is very low, clear tone flag */ - if (pow_sum < POW_TONE_THR) - { - st->tone_flag = (Word16) (st->tone_flag & 0x1fff); - } - /* Run the filter bank and calculate signal levels at each band */ - filter_bank(st, in_buf, level); - - /* compute VAD decision */ - VAD_flag = vad_decision(st, level, pow_sum); - - /* Calculate input level */ - L_temp = 0; - for (i = 1; i < COMPLEN; i++) /* ignore lowest band */ - { - L_temp = vo_L_add(L_temp, level[i]); - } - - temp = extract_h(L_temp << 12); - - Estimate_Speech(st, temp); /* Estimate speech level */ - return (VAD_flag); -} - - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: wb_vad.c * +* * +* Description: Voice Activity Detection * +* * +************************************************************************/ + +#include +#include +#include "cnst.h" +#include "wb_vad.h" +#include "typedef.h" +#include "basic_op.h" +#include "math_op.h" +#include "wb_vad_c.h" +#include "mem_align.h" + +/****************************************************************************** +* Calculate Log2 and scale the signal: +* +* ilog2(Word32 in) = -1024*log10(in * 2^-31)/log10(2), where in = [1, 2^31-1] +* +* input output +* 32768 16384 +* 1 31744 +* +* When input is in the range of [1,2^16], max error is 0.0380%. +*********************************************************************************/ + +static Word16 ilog2( /* return: output value of the log2 */ + Word16 mant /* i: value to be converted */ + ) +{ + Word16 ex, ex2, res; + Word32 i, l_temp; + + if (mant <= 0) + { + mant = 1; + } + ex = norm_s(mant); + mant = mant << ex; + + for (i = 0; i < 3; i++) + mant = vo_mult(mant, mant); + l_temp = vo_L_mult(mant, mant); + + ex2 = norm_l(l_temp); + mant = extract_h(l_temp << ex2); + + res = (ex + 16) << 10; + res = add1(res, (ex2 << 6)); + res = vo_sub(add1(res, 127), (mant >> 8)); + return (res); +} + +/****************************************************************************** +* +* Function : filter5 +* Purpose : Fifth-order half-band lowpass/highpass filter pair with +* decimation. +* +*******************************************************************************/ + +static void filter5( + Word16 * in0, /* i/o : input values; output low-pass part */ + Word16 * in1, /* i/o : input values; output high-pass part */ + Word16 data[] /* i/o : filter memory */ + ) +{ + Word16 temp0, temp1, temp2; + + temp0 = vo_sub(*in0, vo_mult(COEFF5_1, data[0])); + temp1 = add1(data[0], vo_mult(COEFF5_1, temp0)); + data[0] = temp0; + + temp0 = vo_sub(*in1, vo_mult(COEFF5_2, data[1])); + temp2 = add1(data[1], vo_mult(COEFF5_2, temp0)); + data[1] = temp0; + + *in0 = extract_h((vo_L_add(temp1, temp2) << 15)); + *in1 = extract_h((vo_L_sub(temp1, temp2) << 15)); +} + +/****************************************************************************** +* +* Function : filter3 +* Purpose : Third-order half-band lowpass/highpass filter pair with +* decimation. +* +*******************************************************************************/ + +static void filter3( + Word16 * in0, /* i/o : input values; output low-pass part */ + Word16 * in1, /* i/o : input values; output high-pass part */ + Word16 * data /* i/o : filter memory */ + ) +{ + Word16 temp1, temp2; + + temp1 = vo_sub(*in1, vo_mult(COEFF3, *data)); + temp2 = add1(*data, vo_mult(COEFF3, temp1)); + *data = temp1; + + *in1 = extract_h((vo_L_sub(*in0, temp2) << 15)); + *in0 = extract_h((vo_L_add(*in0, temp2) << 15)); +} + +/****************************************************************************** +* +* Function : level_calculation +* Purpose : Calculate signal level in a sub-band. Level is calculated +* by summing absolute values of the input data. +* +* Signal level calculated from of the end of the frame +* (data[count1 - count2]) is stored to (*sub_level) +* and added to the level of the next frame. +* +******************************************************************************/ + +static Word16 level_calculation( /* return: signal level */ + Word16 data[], /* i : signal buffer */ + Word16 * sub_level, /* i : level calculated at the end of the previous frame*/ + /* o : level of signal calculated from the last */ + /* (count2 - count1) samples */ + Word16 count1, /* i : number of samples to be counted */ + Word16 count2, /* i : number of samples to be counted */ + Word16 ind_m, /* i : step size for the index of the data buffer */ + Word16 ind_a, /* i : starting index of the data buffer */ + Word16 scale /* i : scaling for the level calculation */ + ) +{ + Word32 i, l_temp1, l_temp2; + Word16 level; + + l_temp1 = 0L; + for (i = count1; i < count2; i++) + { + l_temp1 += (abs_s(data[ind_m * i + ind_a])<<1); + } + + l_temp2 = vo_L_add(l_temp1, L_shl(*sub_level, 16 - scale)); + *sub_level = extract_h(L_shl(l_temp1, scale)); + + for (i = 0; i < count1; i++) + { + l_temp2 += (abs_s(data[ind_m * i + ind_a])<<1); + } + level = extract_h(L_shl2(l_temp2, scale)); + + return level; +} + +/****************************************************************************** +* +* Function : filter_bank +* Purpose : Divide input signal into bands and calculate level of +* the signal in each band +* +*******************************************************************************/ + +static void filter_bank( + VadVars * st, /* i/o : State struct */ + Word16 in[], /* i : input frame */ + Word16 level[] /* o : signal levels at each band */ + ) +{ + Word32 i; + Word16 tmp_buf[FRAME_LEN]; + + /* shift input 1 bit down for safe scaling */ + for (i = 0; i < FRAME_LEN; i++) + { + tmp_buf[i] = in[i] >> 1; + } + + /* run the filter bank */ + for (i = 0; i < 128; i++) + { + filter5(&tmp_buf[2 * i], &tmp_buf[2 * i + 1], st->a_data5[0]); + } + for (i = 0; i < 64; i++) + { + filter5(&tmp_buf[4 * i], &tmp_buf[4 * i + 2], st->a_data5[1]); + filter5(&tmp_buf[4 * i + 1], &tmp_buf[4 * i + 3], st->a_data5[2]); + } + for (i = 0; i < 32; i++) + { + filter5(&tmp_buf[8 * i], &tmp_buf[8 * i + 4], st->a_data5[3]); + filter5(&tmp_buf[8 * i + 2], &tmp_buf[8 * i + 6], st->a_data5[4]); + filter3(&tmp_buf[8 * i + 3], &tmp_buf[8 * i + 7], &st->a_data3[0]); + } + for (i = 0; i < 16; i++) + { + filter3(&tmp_buf[16 * i + 0], &tmp_buf[16 * i + 8], &st->a_data3[1]); + filter3(&tmp_buf[16 * i + 4], &tmp_buf[16 * i + 12], &st->a_data3[2]); + filter3(&tmp_buf[16 * i + 6], &tmp_buf[16 * i + 14], &st->a_data3[3]); + } + + for (i = 0; i < 8; i++) + { + filter3(&tmp_buf[32 * i + 0], &tmp_buf[32 * i + 16], &st->a_data3[4]); + filter3(&tmp_buf[32 * i + 8], &tmp_buf[32 * i + 24], &st->a_data3[5]); + } + + /* calculate levels in each frequency band */ + + /* 4800 - 6400 Hz */ + level[11] = level_calculation(tmp_buf, &st->sub_level[11], 16, 64, 4, 1, 14); + /* 4000 - 4800 Hz */ + level[10] = level_calculation(tmp_buf, &st->sub_level[10], 8, 32, 8, 7, 15); + /* 3200 - 4000 Hz */ + level[9] = level_calculation(tmp_buf, &st->sub_level[9],8, 32, 8, 3, 15); + /* 2400 - 3200 Hz */ + level[8] = level_calculation(tmp_buf, &st->sub_level[8],8, 32, 8, 2, 15); + /* 2000 - 2400 Hz */ + level[7] = level_calculation(tmp_buf, &st->sub_level[7],4, 16, 16, 14, 16); + /* 1600 - 2000 Hz */ + level[6] = level_calculation(tmp_buf, &st->sub_level[6],4, 16, 16, 6, 16); + /* 1200 - 1600 Hz */ + level[5] = level_calculation(tmp_buf, &st->sub_level[5],4, 16, 16, 4, 16); + /* 800 - 1200 Hz */ + level[4] = level_calculation(tmp_buf, &st->sub_level[4],4, 16, 16, 12, 16); + /* 600 - 800 Hz */ + level[3] = level_calculation(tmp_buf, &st->sub_level[3],2, 8, 32, 8, 17); + /* 400 - 600 Hz */ + level[2] = level_calculation(tmp_buf, &st->sub_level[2],2, 8, 32, 24, 17); + /* 200 - 400 Hz */ + level[1] = level_calculation(tmp_buf, &st->sub_level[1],2, 8, 32, 16, 17); + /* 0 - 200 Hz */ + level[0] = level_calculation(tmp_buf, &st->sub_level[0],2, 8, 32, 0, 17); +} + +/****************************************************************************** +* +* Function : update_cntrl +* Purpose : Control update of the background noise estimate. +* +*******************************************************************************/ + +static void update_cntrl( + VadVars * st, /* i/o : State structure */ + Word16 level[] /* i : sub-band levels of the input frame */ + ) +{ + Word32 i; + Word16 num, temp, stat_rat, exp, denom; + Word16 alpha; + + /* if a tone has been detected for a while, initialize stat_count */ + if (sub((Word16) (st->tone_flag & 0x7c00), 0x7c00) == 0) + { + st->stat_count = STAT_COUNT; + } else + { + /* if 8 last vad-decisions have been "0", reinitialize stat_count */ + if ((st->vadreg & 0x7f80) == 0) + { + st->stat_count = STAT_COUNT; + } else + { + stat_rat = 0; + for (i = 0; i < COMPLEN; i++) + { + if(level[i] > st->ave_level[i]) + { + num = level[i]; + denom = st->ave_level[i]; + } else + { + num = st->ave_level[i]; + denom = level[i]; + } + /* Limit nimimum value of num and denom to STAT_THR_LEVEL */ + if(num < STAT_THR_LEVEL) + { + num = STAT_THR_LEVEL; + } + if(denom < STAT_THR_LEVEL) + { + denom = STAT_THR_LEVEL; + } + exp = norm_s(denom); + denom = denom << exp; + + /* stat_rat = num/denom * 64 */ + temp = div_s(num >> 1, denom); + stat_rat = add1(stat_rat, shr(temp, (8 - exp))); + } + + /* compare stat_rat with a threshold and update stat_count */ + if(stat_rat > STAT_THR) + { + st->stat_count = STAT_COUNT; + } else + { + if ((st->vadreg & 0x4000) != 0) + { + + if (st->stat_count != 0) + { + st->stat_count = st->stat_count - 1; + } + } + } + } + } + + /* Update average amplitude estimate for stationarity estimation */ + alpha = ALPHA4; + if(st->stat_count == STAT_COUNT) + { + alpha = 32767; + } else if ((st->vadreg & 0x4000) == 0) + { + alpha = ALPHA5; + } + for (i = 0; i < COMPLEN; i++) + { + st->ave_level[i] = add1(st->ave_level[i], vo_mult_r(alpha, vo_sub(level[i], st->ave_level[i]))); + } +} + +/****************************************************************************** +* +* Function : hangover_addition +* Purpose : Add hangover after speech bursts +* +*******************************************************************************/ + +static Word16 hangover_addition( /* return: VAD_flag indicating final VAD decision */ + VadVars * st, /* i/o : State structure */ + Word16 low_power, /* i : flag power of the input frame */ + Word16 hang_len, /* i : hangover length */ + Word16 burst_len /* i : minimum burst length for hangover addition */ + ) +{ + /* if the input power (pow_sum) is lower than a threshold, clear counters and set VAD_flag to "0" */ + if (low_power != 0) + { + st->burst_count = 0; + st->hang_count = 0; + return 0; + } + /* update the counters (hang_count, burst_count) */ + if ((st->vadreg & 0x4000) != 0) + { + st->burst_count = st->burst_count + 1; + if(st->burst_count >= burst_len) + { + st->hang_count = hang_len; + } + return 1; + } else + { + st->burst_count = 0; + if (st->hang_count > 0) + { + st->hang_count = st->hang_count - 1; + return 1; + } + } + return 0; +} + +/****************************************************************************** +* +* Function : noise_estimate_update +* Purpose : Update of background noise estimate +* +*******************************************************************************/ + +static void noise_estimate_update( + VadVars * st, /* i/o : State structure */ + Word16 level[] /* i : sub-band levels of the input frame */ + ) +{ + Word32 i; + Word16 alpha_up, alpha_down, bckr_add = 2; + + /* Control update of bckr_est[] */ + update_cntrl(st, level); + + /* Choose update speed */ + if ((0x7800 & st->vadreg) == 0) + { + alpha_up = ALPHA_UP1; + alpha_down = ALPHA_DOWN1; + } else + { + if ((st->stat_count == 0)) + { + alpha_up = ALPHA_UP2; + alpha_down = ALPHA_DOWN2; + } else + { + alpha_up = 0; + alpha_down = ALPHA3; + bckr_add = 0; + } + } + + /* Update noise estimate (bckr_est) */ + for (i = 0; i < COMPLEN; i++) + { + Word16 temp; + temp = (st->old_level[i] - st->bckr_est[i]); + + if (temp < 0) + { /* update downwards */ + st->bckr_est[i] = add1(-2, add(st->bckr_est[i],vo_mult_r(alpha_down, temp))); + /* limit minimum value of the noise estimate to NOISE_MIN */ + if(st->bckr_est[i] < NOISE_MIN) + { + st->bckr_est[i] = NOISE_MIN; + } + } else + { /* update upwards */ + st->bckr_est[i] = add1(bckr_add, add1(st->bckr_est[i],vo_mult_r(alpha_up, temp))); + + /* limit maximum value of the noise estimate to NOISE_MAX */ + if(st->bckr_est[i] > NOISE_MAX) + { + st->bckr_est[i] = NOISE_MAX; + } + } + } + + /* Update signal levels of the previous frame (old_level) */ + for (i = 0; i < COMPLEN; i++) + { + st->old_level[i] = level[i]; + } +} + +/****************************************************************************** +* +* Function : vad_decision +* Purpose : Calculates VAD_flag +* +*******************************************************************************/ + +static Word16 vad_decision( /* return value : VAD_flag */ + VadVars * st, /* i/o : State structure */ + Word16 level[COMPLEN], /* i : sub-band levels of the input frame */ + Word32 pow_sum /* i : power of the input frame */ + ) +{ + Word32 i; + Word32 L_snr_sum; + Word32 L_temp; + Word16 vad_thr, temp, noise_level; + Word16 low_power_flag; + Word16 hang_len, burst_len; + Word16 ilog2_speech_level, ilog2_noise_level; + Word16 temp2; + + /* Calculate squared sum of the input levels (level) divided by the background noise components + * (bckr_est). */ + L_snr_sum = 0; + for (i = 0; i < COMPLEN; i++) + { + Word16 exp; + + exp = norm_s(st->bckr_est[i]); + temp = (st->bckr_est[i] << exp); + temp = div_s((level[i] >> 1), temp); + temp = shl(temp, (exp - (UNIRSHFT - 1))); + L_snr_sum = L_mac(L_snr_sum, temp, temp); + } + + /* Calculate average level of estimated background noise */ + L_temp = 0; + for (i = 1; i < COMPLEN; i++) /* ignore lowest band */ + { + L_temp = vo_L_add(L_temp, st->bckr_est[i]); + } + + noise_level = extract_h((L_temp << 12)); + /* if SNR is lower than a threshold (MIN_SPEECH_SNR), and increase speech_level */ + temp = vo_mult(noise_level, MIN_SPEECH_SNR) << 3; + + if(st->speech_level < temp) + { + st->speech_level = temp; + } + ilog2_noise_level = ilog2(noise_level); + + /* If SNR is very poor, speech_level is probably corrupted by noise level. This is correctred by + * subtracting MIN_SPEECH_SNR*noise_level from speech level */ + ilog2_speech_level = ilog2(st->speech_level - temp); + + temp = add1(vo_mult(NO_SLOPE, (ilog2_noise_level - NO_P1)), THR_HIGH); + + temp2 = add1(SP_CH_MIN, vo_mult(SP_SLOPE, (ilog2_speech_level - SP_P1))); + if (temp2 < SP_CH_MIN) + { + temp2 = SP_CH_MIN; + } + if (temp2 > SP_CH_MAX) + { + temp2 = SP_CH_MAX; + } + vad_thr = temp + temp2; + + if(vad_thr < THR_MIN) + { + vad_thr = THR_MIN; + } + /* Shift VAD decision register */ + st->vadreg = (st->vadreg >> 1); + + /* Make intermediate VAD decision */ + if(L_snr_sum > vo_L_mult(vad_thr, (512 * COMPLEN))) + { + st->vadreg = (Word16) (st->vadreg | 0x4000); + } + /* check if the input power (pow_sum) is lower than a threshold" */ + if(pow_sum < VAD_POW_LOW) + { + low_power_flag = 1; + } else + { + low_power_flag = 0; + } + /* Update background noise estimates */ + noise_estimate_update(st, level); + + /* Calculate values for hang_len and burst_len based on vad_thr */ + hang_len = add1(vo_mult(HANG_SLOPE, (vad_thr - HANG_P1)), HANG_HIGH); + if(hang_len < HANG_LOW) + { + hang_len = HANG_LOW; + } + burst_len = add1(vo_mult(BURST_SLOPE, (vad_thr - BURST_P1)), BURST_HIGH); + + return (hangover_addition(st, low_power_flag, hang_len, burst_len)); +} + +/****************************************************************************** +* +* Function : Estimate_Speech() +* Purpose : Estimate speech level +* +* Maximum signal level is searched and stored to the variable sp_max. +* The speech frames must locate within SP_EST_COUNT number of frames. +* Thus, noisy frames having occasional VAD = "1" decisions will not +* affect to the estimated speech_level. +* +*******************************************************************************/ + +static void Estimate_Speech( + VadVars * st, /* i/o : State structure */ + Word16 in_level /* level of the input frame */ + ) +{ + Word16 alpha; + + /* if the required activity count cannot be achieved, reset counters */ + if((st->sp_est_cnt - st->sp_max_cnt) > (SP_EST_COUNT - SP_ACTIVITY_COUNT)) + { + st->sp_est_cnt = 0; + st->sp_max = 0; + st->sp_max_cnt = 0; + } + st->sp_est_cnt += 1; + + if (((st->vadreg & 0x4000)||(in_level > st->speech_level)) && (in_level > MIN_SPEECH_LEVEL1)) + { + /* update sp_max */ + if(in_level > st->sp_max) + { + st->sp_max = in_level; + } + st->sp_max_cnt += 1; + + if(st->sp_max_cnt >= SP_ACTIVITY_COUNT) + { + Word16 tmp; + /* update speech estimate */ + tmp = (st->sp_max >> 1); /* scale to get "average" speech level */ + + /* select update speed */ + if(tmp > st->speech_level) + { + alpha = ALPHA_SP_UP; + } else + { + alpha = ALPHA_SP_DOWN; + } + if(tmp > MIN_SPEECH_LEVEL2) + { + st->speech_level = add1(st->speech_level, vo_mult_r(alpha, vo_sub(tmp, st->speech_level))); + } + /* clear all counters used for speech estimation */ + st->sp_max = 0; + st->sp_max_cnt = 0; + st->sp_est_cnt = 0; + } + } +} + +/****************************************************************************** +* +* Function: wb_vad_init +* Purpose: Allocates state memory and initializes state memory +* +*******************************************************************************/ + +Word16 wb_vad_init( /* return: non-zero with error, zero for ok. */ + VadVars ** state, /* i/o : State structure */ + VO_MEM_OPERATOR *pMemOP + ) +{ + VadVars *s; + + if (state == (VadVars **) NULL) + { + fprintf(stderr, "vad_init: invalid parameter\n"); + return -1; + } + *state = NULL; + + /* allocate memory */ + if ((s = (VadVars *) mem_malloc(pMemOP, sizeof(VadVars), 32, VO_INDEX_ENC_AMRWB)) == NULL) + { + fprintf(stderr, "vad_init: can not malloc state structure\n"); + return -1; + } + wb_vad_reset(s); + + *state = s; + + return 0; +} + +/****************************************************************************** +* +* Function: wb_vad_reset +* Purpose: Initializes state memory +* +*******************************************************************************/ + +Word16 wb_vad_reset( /* return: non-zero with error, zero for ok. */ + VadVars * state /* i/o : State structure */ + ) +{ + Word32 i, j; + + if (state == (VadVars *) NULL) + { + fprintf(stderr, "vad_reset: invalid parameter\n"); + return -1; + } + state->tone_flag = 0; + state->vadreg = 0; + state->hang_count = 0; + state->burst_count = 0; + state->hang_count = 0; + + /* initialize memory used by the filter bank */ + for (i = 0; i < F_5TH_CNT; i++) + { + for (j = 0; j < 2; j++) + { + state->a_data5[i][j] = 0; + } + } + + for (i = 0; i < F_3TH_CNT; i++) + { + state->a_data3[i] = 0; + } + + /* initialize the rest of the memory */ + for (i = 0; i < COMPLEN; i++) + { + state->bckr_est[i] = NOISE_INIT; + state->old_level[i] = NOISE_INIT; + state->ave_level[i] = NOISE_INIT; + state->sub_level[i] = 0; + } + + state->sp_est_cnt = 0; + state->sp_max = 0; + state->sp_max_cnt = 0; + state->speech_level = SPEECH_LEVEL_INIT; + state->prev_pow_sum = 0; + return 0; +} + +/****************************************************************************** +* +* Function: wb_vad_exit +* Purpose: The memory used for state memory is freed +* +*******************************************************************************/ + +void wb_vad_exit( + VadVars ** state, /* i/o : State structure */ + VO_MEM_OPERATOR *pMemOP + ) +{ + if (state == NULL || *state == NULL) + return; + /* deallocate memory */ + mem_free(pMemOP, *state, VO_INDEX_ENC_AMRWB); + *state = NULL; + return; +} + +/****************************************************************************** +* +* Function : wb_vad_tone_detection +* Purpose : Search maximum pitch gain from a frame. Set tone flag if +* pitch gain is high. This is used to detect +* signaling tones and other signals with high pitch gain. +* +*******************************************************************************/ + +void wb_vad_tone_detection( + VadVars * st, /* i/o : State struct */ + Word16 p_gain /* pitch gain */ + ) +{ + /* update tone flag */ + st->tone_flag = (st->tone_flag >> 1); + + /* if (pitch_gain > TONE_THR) set tone flag */ + if (p_gain > TONE_THR) + { + st->tone_flag = (Word16) (st->tone_flag | 0x4000); + } +} + +/****************************************************************************** +* +* Function : wb_vad +* Purpose : Main program for Voice Activity Detection (VAD) for AMR +* +*******************************************************************************/ + +Word16 wb_vad( /* Return value : VAD Decision, 1 = speech, 0 = noise */ + VadVars * st, /* i/o : State structure */ + Word16 in_buf[] /* i : samples of the input frame */ + ) +{ + Word16 level[COMPLEN]; + Word32 i; + Word16 VAD_flag, temp; + Word32 L_temp, pow_sum; + + /* Calculate power of the input frame. */ + L_temp = 0L; + for (i = 0; i < FRAME_LEN; i++) + { + L_temp = L_mac(L_temp, in_buf[i], in_buf[i]); + } + + /* pow_sum = power of current frame and previous frame */ + pow_sum = L_add(L_temp, st->prev_pow_sum); + + /* save power of current frame for next call */ + st->prev_pow_sum = L_temp; + + /* If input power is very low, clear tone flag */ + if (pow_sum < POW_TONE_THR) + { + st->tone_flag = (Word16) (st->tone_flag & 0x1fff); + } + /* Run the filter bank and calculate signal levels at each band */ + filter_bank(st, in_buf, level); + + /* compute VAD decision */ + VAD_flag = vad_decision(st, level, pow_sum); + + /* Calculate input level */ + L_temp = 0; + for (i = 1; i < COMPLEN; i++) /* ignore lowest band */ + { + L_temp = vo_L_add(L_temp, level[i]); + } + + temp = extract_h(L_temp << 12); + + Estimate_Speech(st, temp); /* Estimate speech level */ + return (VAD_flag); +} + + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/weight_a.c b/media/libstagefright/codecs/amrwbenc/src/weight_a.c index d47be97..8f0fb39 100644 --- a/media/libstagefright/codecs/amrwbenc/src/weight_a.c +++ b/media/libstagefright/codecs/amrwbenc/src/weight_a.c @@ -1,48 +1,48 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ - -/*********************************************************************** -* File: weight_a.c * -* * -* Description:Weighting of LPC coefficients * -* ap[i] = a[i] * (gamma ** i) * -* * -************************************************************************/ - -#include "typedef.h" -#include "basic_op.h" - -void Weight_a( - Word16 a[], /* (i) Q12 : a[m+1] LPC coefficients */ - Word16 ap[], /* (o) Q12 : Spectral expanded LPC coefficients */ - Word16 gamma, /* (i) Q15 : Spectral expansion factor. */ - Word16 m /* (i) : LPC order. */ - ) -{ - Word32 num = m - 1, fac; - *ap++ = *a++; - fac = gamma; - do{ - *ap++ =(Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16); - fac = (vo_L_mult(fac, gamma) + 0x8000) >> 16; - }while(--num != 0); - - *ap++ = (Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16); - return; -} - - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +/*********************************************************************** +* File: weight_a.c * +* * +* Description:Weighting of LPC coefficients * +* ap[i] = a[i] * (gamma ** i) * +* * +************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" + +void Weight_a( + Word16 a[], /* (i) Q12 : a[m+1] LPC coefficients */ + Word16 ap[], /* (o) Q12 : Spectral expanded LPC coefficients */ + Word16 gamma, /* (i) Q15 : Spectral expansion factor. */ + Word16 m /* (i) : LPC order. */ + ) +{ + Word32 num = m - 1, fac; + *ap++ = *a++; + fac = gamma; + do{ + *ap++ =(Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16); + fac = (vo_L_mult(fac, gamma) + 0x8000) >> 16; + }while(--num != 0); + + *ap++ = (Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16); + return; +} + + + diff --git a/media/libstagefright/codecs/common/Config.mk b/media/libstagefright/codecs/common/Config.mk index 27a17c1..3d754e7 100644 --- a/media/libstagefright/codecs/common/Config.mk +++ b/media/libstagefright/codecs/common/Config.mk @@ -1,24 +1,24 @@ -# -# This configure file is just for Linux projects against Android -# - -VOPRJ := -VONJ := - -# WARNING: -# Using v7 breaks generic build -ifeq ($(TARGET_ARCH),arm) -VOTT := v5 -else -VOTT := pc -endif - -# Do we also need to check on ARCH_ARM_HAVE_ARMV7A? - probably not -ifeq ($(ARCH_ARM_HAVE_NEON),true) -VOTT := v7 -endif - -VOTEST := 0 - -VO_CFLAGS:=-DLINUX - +# +# This configure file is just for Linux projects against Android +# + +VOPRJ := +VONJ := + +# WARNING: +# Using v7 breaks generic build +ifeq ($(TARGET_ARCH),arm) +VOTT := v5 +else +VOTT := pc +endif + +# Do we also need to check on ARCH_ARM_HAVE_ARMV7A? - probably not +ifeq ($(ARCH_ARM_HAVE_NEON),true) +VOTT := v7 +endif + +VOTEST := 0 + +VO_CFLAGS:=-DLINUX + diff --git a/media/libstagefright/codecs/common/cmnMemory.c b/media/libstagefright/codecs/common/cmnMemory.c index c17264c..dd7c26d 100644 --- a/media/libstagefright/codecs/common/cmnMemory.c +++ b/media/libstagefright/codecs/common/cmnMemory.c @@ -1,73 +1,73 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: cmnMemory.c - - Content: sample code for memory operator implementation - -*******************************************************************************/ -#include "cmnMemory.h" - -#include -#if defined LINUX -#include -#endif - -//VO_MEM_OPERATOR g_memOP; - -VO_U32 cmnMemAlloc (VO_S32 uID, VO_MEM_INFO * pMemInfo) -{ - if (!pMemInfo) - return VO_ERR_INVALID_ARG; - - pMemInfo->VBuffer = malloc (pMemInfo->Size); - return 0; -} - -VO_U32 cmnMemFree (VO_S32 uID, VO_PTR pMem) -{ - free (pMem); - return 0; -} - -VO_U32 cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize) -{ - memset (pBuff, uValue, uSize); - return 0; -} - -VO_U32 cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize) -{ - memcpy (pDest, pSource, uSize); - return 0; -} - -VO_U32 cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize) -{ - return 0; -} - -VO_S32 cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize) -{ - return memcmp(pBuffer1, pBuffer2, uSize); -} - -VO_U32 cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize) -{ - memmove (pDest, pSource, uSize); - return 0; -} - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: cmnMemory.c + + Content: sample code for memory operator implementation + +*******************************************************************************/ +#include "cmnMemory.h" + +#include +#if defined LINUX +#include +#endif + +//VO_MEM_OPERATOR g_memOP; + +VO_U32 cmnMemAlloc (VO_S32 uID, VO_MEM_INFO * pMemInfo) +{ + if (!pMemInfo) + return VO_ERR_INVALID_ARG; + + pMemInfo->VBuffer = malloc (pMemInfo->Size); + return 0; +} + +VO_U32 cmnMemFree (VO_S32 uID, VO_PTR pMem) +{ + free (pMem); + return 0; +} + +VO_U32 cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize) +{ + memset (pBuff, uValue, uSize); + return 0; +} + +VO_U32 cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize) +{ + memcpy (pDest, pSource, uSize); + return 0; +} + +VO_U32 cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize) +{ + return 0; +} + +VO_S32 cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize) +{ + return memcmp(pBuffer1, pBuffer2, uSize); +} + +VO_U32 cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize) +{ + memmove (pDest, pSource, uSize); + return 0; +} + diff --git a/media/libstagefright/codecs/common/include/cmnMemory.h b/media/libstagefright/codecs/common/include/cmnMemory.h index 9315600..0308dfa 100644 --- a/media/libstagefright/codecs/common/include/cmnMemory.h +++ b/media/libstagefright/codecs/common/include/cmnMemory.h @@ -1,106 +1,106 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: cmnMemory.h - - Content: memory operator implementation header file - -*******************************************************************************/ - -#ifndef __cmnMemory_H__ -#define __cmnMemory_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include - -//extern VO_MEM_OPERATOR g_memOP; - -/** - * Allocate memory - * \param uID [in] module ID - * \param uSize [in] size of memory - * \return value is the allocated memory address. NULL is failed. - */ -VO_U32 cmnMemAlloc (VO_S32 uID, VO_MEM_INFO * pMemInfo); - -/** - * Free up memory - * \param uID [in] module ID - * \param pMem [in] address of memory - * \return value 0, if succeeded. - */ -VO_U32 cmnMemFree (VO_S32 uID, VO_PTR pBuffer); - -/** - * memory set function - * \param uID [in] module ID - * \param pBuff [in/out] address of memory - * \param uValue [in] the value to be set - * \param uSize [in] the size to be set - * \return value 0, if succeeded. - */ -VO_U32 cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize); - -/** - * memory copy function - * \param uID [in] module ID - * \param pDest [in/out] address of destination memory - * \param pSource [in] address of source memory - * \param uSize [in] the size to be copied - * \return value 0, if succeeded. - */ -VO_U32 cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize); - -/** - * memory check function - * \param uID [in] module ID - * \param pBuff [in] address of buffer to be checked - * \param uSize [in] the size to be checked - * \return value 0, if succeeded. - */ -VO_U32 cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize); - -/** - * memory compare function - * \param uID [in] module ID - * \param pBuffer1 [in] address of buffer 1 to be compared - * \param pBuffer2 [in] address of buffer 2 to be compared - * \param uSize [in] the size to be compared - * \return value: same as standard C run-time memcmp() function. - */ -VO_S32 cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize); - -/** - * memory move function - * \param uID [in] module ID - * \param pDest [in/out] address of destination memory - * \param pSource [in] address of source memory - * \param uSize [in] the size to be moved - * \return value 0, if succeeded. - */ -VO_U32 cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif // __cmnMemory_H__ - - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: cmnMemory.h + + Content: memory operator implementation header file + +*******************************************************************************/ + +#ifndef __cmnMemory_H__ +#define __cmnMemory_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include + +//extern VO_MEM_OPERATOR g_memOP; + +/** + * Allocate memory + * \param uID [in] module ID + * \param uSize [in] size of memory + * \return value is the allocated memory address. NULL is failed. + */ +VO_U32 cmnMemAlloc (VO_S32 uID, VO_MEM_INFO * pMemInfo); + +/** + * Free up memory + * \param uID [in] module ID + * \param pMem [in] address of memory + * \return value 0, if succeeded. + */ +VO_U32 cmnMemFree (VO_S32 uID, VO_PTR pBuffer); + +/** + * memory set function + * \param uID [in] module ID + * \param pBuff [in/out] address of memory + * \param uValue [in] the value to be set + * \param uSize [in] the size to be set + * \return value 0, if succeeded. + */ +VO_U32 cmnMemSet (VO_S32 uID, VO_PTR pBuff, VO_U8 uValue, VO_U32 uSize); + +/** + * memory copy function + * \param uID [in] module ID + * \param pDest [in/out] address of destination memory + * \param pSource [in] address of source memory + * \param uSize [in] the size to be copied + * \return value 0, if succeeded. + */ +VO_U32 cmnMemCopy (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize); + +/** + * memory check function + * \param uID [in] module ID + * \param pBuff [in] address of buffer to be checked + * \param uSize [in] the size to be checked + * \return value 0, if succeeded. + */ +VO_U32 cmnMemCheck (VO_S32 uID, VO_PTR pBuffer, VO_U32 uSize); + +/** + * memory compare function + * \param uID [in] module ID + * \param pBuffer1 [in] address of buffer 1 to be compared + * \param pBuffer2 [in] address of buffer 2 to be compared + * \param uSize [in] the size to be compared + * \return value: same as standard C run-time memcmp() function. + */ +VO_S32 cmnMemCompare (VO_S32 uID, VO_PTR pBuffer1, VO_PTR pBuffer2, VO_U32 uSize); + +/** + * memory move function + * \param uID [in] module ID + * \param pDest [in/out] address of destination memory + * \param pSource [in] address of source memory + * \param uSize [in] the size to be moved + * \return value 0, if succeeded. + */ +VO_U32 cmnMemMove (VO_S32 uID, VO_PTR pDest, VO_PTR pSource, VO_U32 uSize); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif // __cmnMemory_H__ + + diff --git a/media/libstagefright/codecs/common/include/voAAC.h b/media/libstagefright/codecs/common/include/voAAC.h index d11ed83..9ecb142 100644 --- a/media/libstagefright/codecs/common/include/voAAC.h +++ b/media/libstagefright/codecs/common/include/voAAC.h @@ -1,74 +1,74 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: voAAC.h - - Content: AAC codec APIs & data types - -*******************************************************************************/ - -#ifndef __voAAC_H__ -#define __voAAC_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include "voAudio.h" - -/*! - * the frame type that the decoder supports - */ -typedef enum { - VOAAC_RAWDATA = 0, /*! */ - VOAMRWB_N_MODES = 9, /*!< Invalid mode */ - VOAMRWB_MODE_MAX = VO_MAX_ENUM_VALUE - -}VOAMRWBMODE; - -/*!* the frame format the codec supports*/ -typedef enum { - VOAMRWB_DEFAULT = 0, /*!< the frame type is the header (defined in RFC3267) + rawdata*/ - /*One word (2-byte) for sync word (0x6b21)*/ - /*One word (2-byte) for frame length N.*/ - /*N words (2-byte) containing N bits (bit 0 = 0x007f, bit 1 = 0x0081).*/ - VOAMRWB_ITU = 1, - /*One word (2-byte) for sync word (0x6b21).*/ - /*One word (2-byte) to indicate the frame type.*/ - /*One word (2-byte) to indicate the mode.*/ - /*N words (2-byte) containing N bits (bit 0 = 0xff81, bit 1 = 0x007f).*/ - VOAMRWB_RFC3267 = 2, /* see RFC 3267 */ - VOAMRWB_TMAX = VO_MAX_ENUM_VALUE -}VOAMRWBFRAMETYPE; - - -#define VO_PID_AMRWB_Module 0x42261000 -#define VO_PID_AMRWB_FORMAT (VO_PID_AMRWB_Module | 0x0002) -#define VO_PID_AMRWB_CHANNELS (VO_PID_AMRWB_Module | 0x0003) -#define VO_PID_AMRWB_SAMPLERATE (VO_PID_AMRWB_Module | 0x0004) -#define VO_PID_AMRWB_FRAMETYPE (VO_PID_AMRWB_Module | 0x0005) -#define VO_PID_AMRWB_MODE (VO_PID_AMRWB_Module | 0x0006) -#define VO_PID_AMRWB_DTX (VO_PID_AMRWB_Module | 0x0007) - -/** - * Get audio codec API interface - * \param pEncHandle [out] Return the AMRWB Encoder handle. - * \retval VO_ERR_OK Succeeded. - */ -VO_S32 VO_API voGetAMRWBEncAPI(VO_AUDIO_CODECAPI *pEncHandle); - - -#pragma pack(pop) -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - - -#endif //__VOAMRWB_H__ - +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: voAMRWB.h + + Content: AMR-WB codec APIs & data types + +*******************************************************************************/ +#ifndef __VOAMRWB_H__ +#define __VOAMRWB_H__ + +#include "voAudio.h" +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +#pragma pack(push, 4) + +/*!* the bit rate the codec supports*/ +typedef enum { + VOAMRWB_MDNONE = -1, /*!< Invalid mode */ + VOAMRWB_MD66 = 0, /*!< 6.60kbps */ + VOAMRWB_MD885 = 1, /*!< 8.85kbps */ + VOAMRWB_MD1265 = 2, /*!< 12.65kbps */ + VOAMRWB_MD1425 = 3, /*!< 14.25kbps */ + VOAMRWB_MD1585 = 4, /*!< 15.85bps */ + VOAMRWB_MD1825 = 5, /*!< 18.25bps */ + VOAMRWB_MD1985 = 6, /*!< 19.85kbps */ + VOAMRWB_MD2305 = 7, /*!< 23.05kbps */ + VOAMRWB_MD2385 = 8, /*!< 23.85kbps> */ + VOAMRWB_N_MODES = 9, /*!< Invalid mode */ + VOAMRWB_MODE_MAX = VO_MAX_ENUM_VALUE + +}VOAMRWBMODE; + +/*!* the frame format the codec supports*/ +typedef enum { + VOAMRWB_DEFAULT = 0, /*!< the frame type is the header (defined in RFC3267) + rawdata*/ + /*One word (2-byte) for sync word (0x6b21)*/ + /*One word (2-byte) for frame length N.*/ + /*N words (2-byte) containing N bits (bit 0 = 0x007f, bit 1 = 0x0081).*/ + VOAMRWB_ITU = 1, + /*One word (2-byte) for sync word (0x6b21).*/ + /*One word (2-byte) to indicate the frame type.*/ + /*One word (2-byte) to indicate the mode.*/ + /*N words (2-byte) containing N bits (bit 0 = 0xff81, bit 1 = 0x007f).*/ + VOAMRWB_RFC3267 = 2, /* see RFC 3267 */ + VOAMRWB_TMAX = VO_MAX_ENUM_VALUE +}VOAMRWBFRAMETYPE; + + +#define VO_PID_AMRWB_Module 0x42261000 +#define VO_PID_AMRWB_FORMAT (VO_PID_AMRWB_Module | 0x0002) +#define VO_PID_AMRWB_CHANNELS (VO_PID_AMRWB_Module | 0x0003) +#define VO_PID_AMRWB_SAMPLERATE (VO_PID_AMRWB_Module | 0x0004) +#define VO_PID_AMRWB_FRAMETYPE (VO_PID_AMRWB_Module | 0x0005) +#define VO_PID_AMRWB_MODE (VO_PID_AMRWB_Module | 0x0006) +#define VO_PID_AMRWB_DTX (VO_PID_AMRWB_Module | 0x0007) + +/** + * Get audio codec API interface + * \param pEncHandle [out] Return the AMRWB Encoder handle. + * \retval VO_ERR_OK Succeeded. + */ +VO_S32 VO_API voGetAMRWBEncAPI(VO_AUDIO_CODECAPI *pEncHandle); + + +#pragma pack(pop) +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + + +#endif //__VOAMRWB_H__ + diff --git a/media/libstagefright/codecs/common/include/voAudio.h b/media/libstagefright/codecs/common/include/voAudio.h index 64c9dfb..21d0cf6 100644 --- a/media/libstagefright/codecs/common/include/voAudio.h +++ b/media/libstagefright/codecs/common/include/voAudio.h @@ -1,173 +1,173 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: voAudio.h - - Content: Audio types and functions - -*******************************************************************************/ - -#ifndef __voAudio_H__ -#define __voAudio_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include "voIndex.h" -#include "voMem.h" - -#define VO_PID_AUDIO_BASE 0x42000000 /*!< The base param ID for AUDIO codec */ -#define VO_PID_AUDIO_FORMAT (VO_PID_AUDIO_BASE | 0X0001) /*!< The format data of audio in track */ -#define VO_PID_AUDIO_SAMPLEREATE (VO_PID_AUDIO_BASE | 0X0002) /*!< The sample rate of audio */ -#define VO_PID_AUDIO_CHANNELS (VO_PID_AUDIO_BASE | 0X0003) /*!< The channel of audio */ -#define VO_PID_AUDIO_BITRATE (VO_PID_AUDIO_BASE | 0X0004) /*!< The bit rate of audio */ -#define VO_PID_AUDIO_CHANNELMODE (VO_PID_AUDIO_BASE | 0X0005) /*!< The channel mode of audio */ - -#define VO_ERR_AUDIO_BASE 0x82000000 -#define VO_ERR_AUDIO_UNSCHANNEL VO_ERR_AUDIO_BASE | 0x0001 -#define VO_ERR_AUDIO_UNSSAMPLERATE VO_ERR_AUDIO_BASE | 0x0002 -#define VO_ERR_AUDIO_UNSFEATURE VO_ERR_AUDIO_BASE | 0x0003 - - -/** - *Enumeration used to define the possible audio coding formats. - */ -typedef enum VO_AUDIO_CODINGTYPE { - VO_AUDIO_CodingUnused = 0, /**< Placeholder value when coding is N/A */ - VO_AUDIO_CodingPCM, /**< Any variant of PCM coding */ - VO_AUDIO_CodingADPCM, /**< Any variant of ADPCM encoded data */ - VO_AUDIO_CodingAMRNB, /**< Any variant of AMR encoded data */ - VO_AUDIO_CodingAMRWB, /**< Any variant of AMR encoded data */ - VO_AUDIO_CodingAMRWBP, /**< Any variant of AMR encoded data */ - VO_AUDIO_CodingQCELP13, /**< Any variant of QCELP 13kbps encoded data */ - VO_AUDIO_CodingEVRC, /**< Any variant of EVRC encoded data */ - VO_AUDIO_CodingAAC, /**< Any variant of AAC encoded data, 0xA106 - ISO/MPEG-4 AAC, 0xFF - AAC */ - VO_AUDIO_CodingAC3, /**< Any variant of AC3 encoded data */ - VO_AUDIO_CodingFLAC, /**< Any variant of FLAC encoded data */ - VO_AUDIO_CodingMP1, /**< Any variant of MP1 encoded data */ - VO_AUDIO_CodingMP3, /**< Any variant of MP3 encoded data */ - VO_AUDIO_CodingOGG, /**< Any variant of OGG encoded data */ - VO_AUDIO_CodingWMA, /**< Any variant of WMA encoded data */ - VO_AUDIO_CodingRA, /**< Any variant of RA encoded data */ - VO_AUDIO_CodingMIDI, /**< Any variant of MIDI encoded data */ - VO_AUDIO_CodingDRA, /**< Any variant of dra encoded data */ - VO_AUDIO_CodingG729, /**< Any variant of dra encoded data */ - VO_AUDIO_Coding_MAX = VO_MAX_ENUM_VALUE -} VO_AUDIO_CODINGTYPE; - -/*! -* the channel type value -*/ -typedef enum { - VO_CHANNEL_CENTER = 1, /*!
InputUsed is total used input data size in byte. - * \retval VO_ERR_NONE Succeeded. - * VO_ERR_INPUT_BUFFER_SMALL. The input was finished or the input data was not enought. Continue to input - * data before next call. - */ - VO_U32 (VO_API * GetOutputData) (VO_HANDLE hCodec, VO_CODECBUFFER * pOutBuffer, VO_AUDIO_OUTPUTINFO * pOutInfo); - - /** - * Set the parameter for the specified param ID. - * \param hCodec [IN]] The codec handle which was created by Init function. - * \param uParamID [IN] The param ID. - * \param pData [IN] The param value. - * \retval VO_ERR_NONE Succeeded. - */ - VO_U32 (VO_API * SetParam) (VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData); - - /** - * Get the parameter for the specified param ID. - * \param hCodec [IN]] The codec handle which was created by Init function. - * \param uParamID [IN] The param ID. - * \param pData [IN] The param value. - * \retval VO_ERR_NONE Succeeded. - */ - VO_U32 (VO_API * GetParam) (VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData); - - /** - * Uninit the Codec. - * \param hCodec [IN]] The codec handle which was created by Init function. - * \retval VO_ERR_NONE Succeeded. - */ - VO_U32 (VO_API * Uninit) (VO_HANDLE hCodec); -} VO_AUDIO_CODECAPI; - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif // __voAudio_H__ +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: voAudio.h + + Content: Audio types and functions + +*******************************************************************************/ + +#ifndef __voAudio_H__ +#define __voAudio_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "voIndex.h" +#include "voMem.h" + +#define VO_PID_AUDIO_BASE 0x42000000 /*!< The base param ID for AUDIO codec */ +#define VO_PID_AUDIO_FORMAT (VO_PID_AUDIO_BASE | 0X0001) /*!< The format data of audio in track */ +#define VO_PID_AUDIO_SAMPLEREATE (VO_PID_AUDIO_BASE | 0X0002) /*!< The sample rate of audio */ +#define VO_PID_AUDIO_CHANNELS (VO_PID_AUDIO_BASE | 0X0003) /*!< The channel of audio */ +#define VO_PID_AUDIO_BITRATE (VO_PID_AUDIO_BASE | 0X0004) /*!< The bit rate of audio */ +#define VO_PID_AUDIO_CHANNELMODE (VO_PID_AUDIO_BASE | 0X0005) /*!< The channel mode of audio */ + +#define VO_ERR_AUDIO_BASE 0x82000000 +#define VO_ERR_AUDIO_UNSCHANNEL VO_ERR_AUDIO_BASE | 0x0001 +#define VO_ERR_AUDIO_UNSSAMPLERATE VO_ERR_AUDIO_BASE | 0x0002 +#define VO_ERR_AUDIO_UNSFEATURE VO_ERR_AUDIO_BASE | 0x0003 + + +/** + *Enumeration used to define the possible audio coding formats. + */ +typedef enum VO_AUDIO_CODINGTYPE { + VO_AUDIO_CodingUnused = 0, /**< Placeholder value when coding is N/A */ + VO_AUDIO_CodingPCM, /**< Any variant of PCM coding */ + VO_AUDIO_CodingADPCM, /**< Any variant of ADPCM encoded data */ + VO_AUDIO_CodingAMRNB, /**< Any variant of AMR encoded data */ + VO_AUDIO_CodingAMRWB, /**< Any variant of AMR encoded data */ + VO_AUDIO_CodingAMRWBP, /**< Any variant of AMR encoded data */ + VO_AUDIO_CodingQCELP13, /**< Any variant of QCELP 13kbps encoded data */ + VO_AUDIO_CodingEVRC, /**< Any variant of EVRC encoded data */ + VO_AUDIO_CodingAAC, /**< Any variant of AAC encoded data, 0xA106 - ISO/MPEG-4 AAC, 0xFF - AAC */ + VO_AUDIO_CodingAC3, /**< Any variant of AC3 encoded data */ + VO_AUDIO_CodingFLAC, /**< Any variant of FLAC encoded data */ + VO_AUDIO_CodingMP1, /**< Any variant of MP1 encoded data */ + VO_AUDIO_CodingMP3, /**< Any variant of MP3 encoded data */ + VO_AUDIO_CodingOGG, /**< Any variant of OGG encoded data */ + VO_AUDIO_CodingWMA, /**< Any variant of WMA encoded data */ + VO_AUDIO_CodingRA, /**< Any variant of RA encoded data */ + VO_AUDIO_CodingMIDI, /**< Any variant of MIDI encoded data */ + VO_AUDIO_CodingDRA, /**< Any variant of dra encoded data */ + VO_AUDIO_CodingG729, /**< Any variant of dra encoded data */ + VO_AUDIO_Coding_MAX = VO_MAX_ENUM_VALUE +} VO_AUDIO_CODINGTYPE; + +/*! +* the channel type value +*/ +typedef enum { + VO_CHANNEL_CENTER = 1, /*!
InputUsed is total used input data size in byte. + * \retval VO_ERR_NONE Succeeded. + * VO_ERR_INPUT_BUFFER_SMALL. The input was finished or the input data was not enought. Continue to input + * data before next call. + */ + VO_U32 (VO_API * GetOutputData) (VO_HANDLE hCodec, VO_CODECBUFFER * pOutBuffer, VO_AUDIO_OUTPUTINFO * pOutInfo); + + /** + * Set the parameter for the specified param ID. + * \param hCodec [IN]] The codec handle which was created by Init function. + * \param uParamID [IN] The param ID. + * \param pData [IN] The param value. + * \retval VO_ERR_NONE Succeeded. + */ + VO_U32 (VO_API * SetParam) (VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData); + + /** + * Get the parameter for the specified param ID. + * \param hCodec [IN]] The codec handle which was created by Init function. + * \param uParamID [IN] The param ID. + * \param pData [IN] The param value. + * \retval VO_ERR_NONE Succeeded. + */ + VO_U32 (VO_API * GetParam) (VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData); + + /** + * Uninit the Codec. + * \param hCodec [IN]] The codec handle which was created by Init function. + * \retval VO_ERR_NONE Succeeded. + */ + VO_U32 (VO_API * Uninit) (VO_HANDLE hCodec); +} VO_AUDIO_CODECAPI; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif // __voAudio_H__ diff --git a/media/libstagefright/codecs/common/include/voIndex.h b/media/libstagefright/codecs/common/include/voIndex.h index 541a0db..a409a6e 100644 --- a/media/libstagefright/codecs/common/include/voIndex.h +++ b/media/libstagefright/codecs/common/include/voIndex.h @@ -1,193 +1,193 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: voIndex.h - - Content: module and ID definition - -*******************************************************************************/ - -#ifndef __voIndex_H__ -#define __voIndex_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include "voType.h" - -/* Define the module ID */ -#define _MAKE_SOURCE_ID(id, name) \ -VO_INDEX_SRC_##name = _VO_INDEX_SOURCE | id, - -#define _MAKE_CODEC_ID(id, name) \ -VO_INDEX_DEC_##name = _VO_INDEX_DEC | id, \ -VO_INDEX_ENC_##name = _VO_INDEX_ENC | id, - -#define _MAKE_EFFECT_ID(id, name) \ -VO_INDEX_EFT_##name = _VO_INDEX_EFFECT | id, - -#define _MAKE_SINK_ID(id, name) \ -VO_INDEX_SNK_##name = _VO_INDEX_SINK | id, - -#define _MAKE_FILTER_ID(id, name) \ -VO_INDEX_FLT_##name = _VO_INDEX_FILTER | id, - -#define _MAKE_OMX_ID(id, name) \ -VO_INDEX_OMX_##name = _VO_INDEX_OMX | id, - -#define _MAKE_MFW_ID(id, name) \ -VO_INDEX_MFW_##name = _VO_INDEX_MFW | id, - -enum -{ - _VO_INDEX_SOURCE = 0x01000000, - _VO_INDEX_DEC = 0x02000000, - _VO_INDEX_ENC = 0x03000000, - _VO_INDEX_EFFECT = 0x04000000, - _VO_INDEX_SINK = 0x05000000, - _VO_INDEX_FILTER = 0x06000000, - _VO_INDEX_OMX = 0x07000000, - _VO_INDEX_MFW = 0x08000000, - - // define file parser modules - _MAKE_SOURCE_ID (0x010000, MP4) - _MAKE_SOURCE_ID (0x020000, AVI) - _MAKE_SOURCE_ID (0x030000, ASF) - _MAKE_SOURCE_ID (0x040000, REAL) - _MAKE_SOURCE_ID (0x050000, AUDIO) - _MAKE_SOURCE_ID (0x060000, FLASH) - _MAKE_SOURCE_ID (0x070000, OGG) - _MAKE_SOURCE_ID (0x080000, MKV) - - // define network source modules - _MAKE_SOURCE_ID (0x110000, RTSP) - _MAKE_SOURCE_ID (0x120000, HTTP) - - // define CMMB source modules - _MAKE_SOURCE_ID (0x200000, CMMB) - _MAKE_SOURCE_ID (0x210000, CMMB_INNO) - _MAKE_SOURCE_ID (0x220000, CMMB_TELE) - _MAKE_SOURCE_ID (0x230000, CMMB_SIANO) - - // define DVBT source modules - _MAKE_SOURCE_ID (0x300000, DVBT) - _MAKE_SOURCE_ID (0x310000, DVBT_DIBCOM) - - // define other source modules - _MAKE_SOURCE_ID (0x400000, ID3) - - // define video codec modules - _MAKE_CODEC_ID (0x010000, H264) - _MAKE_CODEC_ID (0x020000, MPEG4) - _MAKE_CODEC_ID (0x030000, H263) - _MAKE_CODEC_ID (0x040000, S263) - _MAKE_CODEC_ID (0x050000, RV) - _MAKE_CODEC_ID (0x060000, WMV) - _MAKE_CODEC_ID (0x070000, DIVX3) - _MAKE_CODEC_ID (0x080000, MJPEG) - _MAKE_CODEC_ID (0x090000, MPEG2) - _MAKE_CODEC_ID (0x0A0000, VP6) - - // define audio codec modules - _MAKE_CODEC_ID (0x210000, AAC) - _MAKE_CODEC_ID (0x220000, MP3) - _MAKE_CODEC_ID (0x230000, WMA) - _MAKE_CODEC_ID (0x240000, RA) - _MAKE_CODEC_ID (0x250000, AMRNB) - _MAKE_CODEC_ID (0x260000, AMRWB) - _MAKE_CODEC_ID (0x270000, AMRWBP) - _MAKE_CODEC_ID (0x280000, QCELP) - _MAKE_CODEC_ID (0x290000, EVRC) - _MAKE_CODEC_ID (0x2A0000, ADPCM) - _MAKE_CODEC_ID (0x2B0000, MIDI) - _MAKE_CODEC_ID (0x2C0000, AC3) - _MAKE_CODEC_ID (0x2D0000, FLAC) - _MAKE_CODEC_ID (0x2E0000, DRA) - _MAKE_CODEC_ID (0x2F0000, OGG) - _MAKE_CODEC_ID (0x300000, G729) - - // define image codec modules - _MAKE_CODEC_ID (0x410000, JPEG) - _MAKE_CODEC_ID (0x420000, GIF) - _MAKE_CODEC_ID (0x430000, PNG) - _MAKE_CODEC_ID (0x440000, TIF) - - // define effect modules - _MAKE_EFFECT_ID (0x010000, EQ) - - // define sink modules - _MAKE_SINK_ID (0x010000, VIDEO) - _MAKE_SINK_ID (0x020000, AUDIO) - _MAKE_SINK_ID (0x030000, CCRRR) - _MAKE_SINK_ID (0x040000, CCRRV) - - _MAKE_SINK_ID (0x110000, MP4) - _MAKE_SINK_ID (0x120000, AVI) - _MAKE_SINK_ID (0x130000, AFW) - - // define media frame module ID - _MAKE_MFW_ID (0x010000, VOMMPLAY) - _MAKE_MFW_ID (0x020000, VOMMREC) - _MAKE_MFW_ID (0x030000, VOME) -}; - - -/* define the error ID */ -#define VO_ERR_NONE 0x00000000 -#define VO_ERR_FINISH 0x00000001 -#define VO_ERR_BASE 0X80000000 -#define VO_ERR_FAILED 0x80000001 -#define VO_ERR_OUTOF_MEMORY 0x80000002 -#define VO_ERR_NOT_IMPLEMENT 0x80000003 -#define VO_ERR_INVALID_ARG 0x80000004 -#define VO_ERR_INPUT_BUFFER_SMALL 0x80000005 -#define VO_ERR_OUTPUT_BUFFER_SMALL 0x80000006 -#define VO_ERR_WRONG_STATUS 0x80000007 -#define VO_ERR_WRONG_PARAM_ID 0x80000008 -#define VO_ERR_LICENSE_ERROR 0x80000009 - -/* xxx is the module ID -#define VO_ERR_FAILED 0x8xxx0001 -#define VO_ERR_OUTOF_MEMORY 0x8xxx0002 -#define VO_ERR_NOT_IMPLEMENT 0x8xxx0003 -#define VO_ERR_INVALID_ARG 0x8xxx0004 -#define VO_ERR_INPUT_BUFFER_SMALL 0x8xxx0005 -#define VO_ERR_OUTPUT_BUFFER_SMALL 0x8xxx0006 -#define VO_ERR_WRONG_STATUS 0x8xxx0007 -#define VO_ERR_WRONG_PARAM_ID 0x8xxx0008 -#define VO_ERR_LICENSE_ERROR 0x8xxx0009 -// Module own error ID -#define VO_ERR_Module 0x8xxx0X00 -*/ - -#define VO_PID_COMMON_BASE 0x40000000 /*!< The base of common param ID */ -#define VO_PID_COMMON_QUERYMEM (VO_PID_COMMON_BASE | 0X0001) /*!< Query the memory needed; Reserved. */ -#define VO_PID_COMMON_INPUTTYPE (VO_PID_COMMON_BASE | 0X0002) /*!< Set or get the input buffer type. VO_INPUT_TYPE */ -#define VO_PID_COMMON_HASRESOURCE (VO_PID_COMMON_BASE | 0X0003) /*!< Query it has resource to be used. VO_U32 *, 1 have, 0 No */ -#define VO_PID_COMMON_HEADDATA (VO_PID_COMMON_BASE | 0X0004) /*!< Decoder track header data. VO_CODECBUFFER * */ -#define VO_PID_COMMON_FLUSH (VO_PID_COMMON_BASE | 0X0005) /*!< Flush the codec buffer. VO_U32 *, 1 Flush, 0 No * */ - -/* -// Module Param ID -#define VO_ID_Mdoule 0x0xxx1000 -*/ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif // __voIndex_H__ +/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +/******************************************************************************* + File: voIndex.h + + Content: module and ID definition + +*******************************************************************************/ + +#ifndef __voIndex_H__ +#define __voIndex_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "voType.h" + +/* Define the module ID */ +#define _MAKE_SOURCE_ID(id, name) \ +VO_INDEX_SRC_##name = _VO_INDEX_SOURCE | id, + +#define _MAKE_CODEC_ID(id, name) \ +VO_INDEX_DEC_##name = _VO_INDEX_DEC | id, \ +VO_INDEX_ENC_##name = _VO_INDEX_ENC | id, + +#define _MAKE_EFFECT_ID(id, name) \ +VO_INDEX_EFT_##name = _VO_INDEX_EFFECT | id, + +#define _MAKE_SINK_ID(id, name) \ +VO_INDEX_SNK_##name = _VO_INDEX_SINK | id, + +#define _MAKE_FILTER_ID(id, name) \ +VO_INDEX_FLT_##name = _VO_INDEX_FILTER | id, + +#define _MAKE_OMX_ID(id, name) \ +VO_INDEX_OMX_##name = _VO_INDEX_OMX | id, + +#define _MAKE_MFW_ID(id, name) \ +VO_INDEX_MFW_##name = _VO_INDEX_MFW | id, + +enum +{ + _VO_INDEX_SOURCE = 0x01000000, + _VO_INDEX_DEC = 0x02000000, + _VO_INDEX_ENC = 0x03000000, + _VO_INDEX_EFFECT = 0x04000000, + _VO_INDEX_SINK = 0x05000000, + _VO_INDEX_FILTER = 0x06000000, + _VO_INDEX_OMX = 0x07000000, + _VO_INDEX_MFW = 0x08000000, + + // define file parser modules + _MAKE_SOURCE_ID (0x010000, MP4) + _MAKE_SOURCE_ID (0x020000, AVI) + _MAKE_SOURCE_ID (0x030000, ASF) + _MAKE_SOURCE_ID (0x040000, REAL) + _MAKE_SOURCE_ID (0x050000, AUDIO) + _MAKE_SOURCE_ID (0x060000, FLASH) + _MAKE_SOURCE_ID (0x070000, OGG) + _MAKE_SOURCE_ID (0x080000, MKV) + + // define network source modules + _MAKE_SOURCE_ID (0x110000, RTSP) + _MAKE_SOURCE_ID (0x120000, HTTP) + + // define CMMB source modules + _MAKE_SOURCE_ID (0x200000, CMMB) + _MAKE_SOURCE_ID (0x210000, CMMB_INNO) + _MAKE_SOURCE_ID (0x220000, CMMB_TELE) + _MAKE_SOURCE_ID (0x230000, CMMB_SIANO) + + // define DVBT source modules + _MAKE_SOURCE_ID (0x300000, DVBT) + _MAKE_SOURCE_ID (0x310000, DVBT_DIBCOM) + + // define other source modules + _MAKE_SOURCE_ID (0x400000, ID3) + + // define video codec modules + _MAKE_CODEC_ID (0x010000, H264) + _MAKE_CODEC_ID (0x020000, MPEG4) + _MAKE_CODEC_ID (0x030000, H263) + _MAKE_CODEC_ID (0x040000, S263) + _MAKE_CODEC_ID (0x050000, RV) + _MAKE_CODEC_ID (0x060000, WMV) + _MAKE_CODEC_ID (0x070000, DIVX3) + _MAKE_CODEC_ID (0x080000, MJPEG) + _MAKE_CODEC_ID (0x090000, MPEG2) + _MAKE_CODEC_ID (0x0A0000, VP6) + + // define audio codec modules + _MAKE_CODEC_ID (0x210000, AAC) + _MAKE_CODEC_ID (0x220000, MP3) + _MAKE_CODEC_ID (0x230000, WMA) + _MAKE_CODEC_ID (0x240000, RA) + _MAKE_CODEC_ID (0x250000, AMRNB) + _MAKE_CODEC_ID (0x260000, AMRWB) + _MAKE_CODEC_ID (0x270000, AMRWBP) + _MAKE_CODEC_ID (0x280000, QCELP) + _MAKE_CODEC_ID (0x290000, EVRC) + _MAKE_CODEC_ID (0x2A0000, ADPCM) + _MAKE_CODEC_ID (0x2B0000, MIDI) + _MAKE_CODEC_ID (0x2C0000, AC3) + _MAKE_CODEC_ID (0x2D0000, FLAC) + _MAKE_CODEC_ID (0x2E0000, DRA) + _MAKE_CODEC_ID (0x2F0000, OGG) + _MAKE_CODEC_ID (0x300000, G729) + + // define image codec modules + _MAKE_CODEC_ID (0x410000, JPEG) + _MAKE_CODEC_ID (0x420000, GIF) + _MAKE_CODEC_ID (0x430000, PNG) + _MAKE_CODEC_ID (0x440000, TIF) + + // define effect modules + _MAKE_EFFECT_ID (0x010000, EQ) + + // define sink modules + _MAKE_SINK_ID (0x010000, VIDEO) + _MAKE_SINK_ID (0x020000, AUDIO) + _MAKE_SINK_ID (0x030000, CCRRR) + _MAKE_SINK_ID (0x040000, CCRRV) + + _MAKE_SINK_ID (0x110000, MP4) + _MAKE_SINK_ID (0x120000, AVI) + _MAKE_SINK_ID (0x130000, AFW) + + // define media frame module ID + _MAKE_MFW_ID (0x010000, VOMMPLAY) + _MAKE_MFW_ID (0x020000, VOMMREC) + _MAKE_MFW_ID (0x030000, VOME) +}; + + +/* define the error ID */ +#define VO_ERR_NONE 0x00000000 +#define VO_ERR_FINISH 0x00000001 +#define VO_ERR_BASE 0X80000000 +#define VO_ERR_FAILED 0x80000001 +#define VO_ERR_OUTOF_MEMORY 0x80000002 +#define VO_ERR_NOT_IMPLEMENT 0x80000003 +#define VO_ERR_INVALID_ARG 0x80000004 +#define VO_ERR_INPUT_BUFFER_SMALL 0x80000005 +#define VO_ERR_OUTPUT_BUFFER_SMALL 0x80000006 +#define VO_ERR_WRONG_STATUS 0x80000007 +#define VO_ERR_WRONG_PARAM_ID 0x80000008 +#define VO_ERR_LICENSE_ERROR 0x80000009 + +/* xxx is the module ID +#define VO_ERR_FAILED 0x8xxx0001 +#define VO_ERR_OUTOF_MEMORY 0x8xxx0002 +#define VO_ERR_NOT_IMPLEMENT 0x8xxx0003 +#define VO_ERR_INVALID_ARG 0x8xxx0004 +#define VO_ERR_INPUT_BUFFER_SMALL 0x8xxx0005 +#define VO_ERR_OUTPUT_BUFFER_SMALL 0x8xxx0006 +#define VO_ERR_WRONG_STATUS 0x8xxx0007 +#define VO_ERR_WRONG_PARAM_ID 0x8xxx0008 +#define VO_ERR_LICENSE_ERROR 0x8xxx0009 +// Module own error ID +#define VO_ERR_Module 0x8xxx0X00 +*/ + +#define VO_PID_COMMON_BASE 0x40000000 /*!< The base of common param ID */ +#define VO_PID_COMMON_QUERYMEM (VO_PID_COMMON_BASE | 0X0001) /*!< Query the memory needed; Reserved. */ +#define VO_PID_COMMON_INPUTTYPE (VO_PID_COMMON_BASE | 0X0002) /*!< Set or get the input buffer type. VO_INPUT_TYPE */ +#define VO_PID_COMMON_HASRESOURCE (VO_PID_COMMON_BASE | 0X0003) /*!< Query it has resource to be used. VO_U32 *, 1 have, 0 No */ +#define VO_PID_COMMON_HEADDATA (VO_PID_COMMON_BASE | 0X0004) /*!< Decoder track header data. VO_CODECBUFFER * */ +#define VO_PID_COMMON_FLUSH (VO_PID_COMMON_BASE | 0X0005) /*!< Flush the codec buffer. VO_U32 *, 1 Flush, 0 No * */ + +/* +// Module Param ID +#define VO_ID_Mdoule 0x0xxx1000 +*/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif // __voIndex_H__ diff --git a/media/libstagefright/codecs/common/include/voType.h b/media/libstagefright/codecs/common/include/voType.h index 2669134..70b2e83 100644 --- a/media/libstagefright/codecs/common/include/voType.h +++ b/media/libstagefright/codecs/common/include/voType.h @@ -1,221 +1,221 @@ -/* - ** Copyright 2003-2010, VisualOn, Inc. - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - */ -/******************************************************************************* - File: voType.h - - Content: data type definition - -*******************************************************************************/ -#ifndef __voType_H__ -#define __voType_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#ifdef _WIN32 -# define VO_API __cdecl -# define VO_CBI __stdcall -#else -# define VO_API -# define VO_CBI -#endif //_WIN32 - -/** VO_IN is used to identify inputs to an VO function. This designation - will also be used in the case of a pointer that points to a parameter - that is used as an output. */ -#ifndef VO_IN -#define VO_IN -#endif - -/** VO_OUT is used to identify outputs from an VO function. This - designation will also be used in the case of a pointer that points - to a parameter that is used as an input. */ -#ifndef VO_OUT -#define VO_OUT -#endif - -/** VO_INOUT is used to identify parameters that may be either inputs or - outputs from an VO function at the same time. This designation will - also be used in the case of a pointer that points to a parameter that - is used both as an input and an output. */ -#ifndef VO_INOUT -#define VO_INOUT -#endif - -#define VO_MAX_ENUM_VALUE 0X7FFFFFFF - -/** VO_VOID */ -typedef void VO_VOID; - -/** VO_U8 is an 8 bit unsigned quantity that is byte aligned */ -typedef unsigned char VO_U8; - -/** VO_BYTE is an 8 bit unsigned quantity that is byte aligned */ -typedef unsigned char VO_BYTE; - -/** VO_S8 is an 8 bit signed quantity that is byte aligned */ -typedef signed char VO_S8; - -/** VO_CHAR is an 8 bit signed quantity that is byte aligned */ -typedef char VO_CHAR; - -/** VO_U16 is a 16 bit unsigned quantity that is 16 bit word aligned */ -typedef unsigned short VO_U16; - -/** VO_WCHAR is a 16 bit unsigned quantity that is 16 bit word aligned */ -#if defined _WIN32 -typedef unsigned short VO_WCHAR; -typedef unsigned short* VO_PWCHAR; -#elif defined LINUX -typedef unsigned char VO_WCHAR; -typedef unsigned char* VO_PWCHAR; -#endif - -/** VO_S16 is a 16 bit signed quantity that is 16 bit word aligned */ -typedef signed short VO_S16; - -/** VO_U32 is a 32 bit unsigned quantity that is 32 bit word aligned */ -typedef unsigned long VO_U32; - -/** VO_S32 is a 32 bit signed quantity that is 32 bit word aligned */ -typedef signed long VO_S32; - -/* Users with compilers that cannot accept the "long long" designation should - define the VO_SKIP64BIT macro. It should be noted that this may cause - some components to fail to compile if the component was written to require - 64 bit integral types. However, these components would NOT compile anyway - since the compiler does not support the way the component was written. -*/ -#ifndef VO_SKIP64BIT -#ifdef _WIN32 -/** VO_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */ -typedef unsigned __int64 VO_U64; -/** VO_S64 is a 64 bit signed quantity that is 64 bit word aligned */ -typedef signed __int64 VO_S64; -#else // WIN32 -/** VO_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */ -typedef unsigned long long VO_U64; -/** VO_S64 is a 64 bit signed quantity that is 64 bit word aligned */ -typedef signed long long VO_S64; -#endif // WIN32 -#endif // VO_SKIP64BIT - -/** The VO_BOOL type is intended to be used to represent a true or a false - value when passing parameters to and from the VO core and components. The - VO_BOOL is a 32 bit quantity and is aligned on a 32 bit word boundary. - */ -typedef enum VO_BOOL { - VO_FALSE = 0, - VO_TRUE = !VO_FALSE, - VO_BOOL_MAX = VO_MAX_ENUM_VALUE -} VO_BOOL; - -/** The VO_PTR type is intended to be used to pass pointers between the VO - applications and the VO Core and components. This is a 32 bit pointer and - is aligned on a 32 bit boundary. - */ -typedef void* VO_PTR; - -/** The VO_HANDLE type is intended to be used to pass pointers between the VO - applications and the VO Core and components. This is a 32 bit pointer and - is aligned on a 32 bit boundary. - */ -typedef void* VO_HANDLE; - -/** The VO_STRING type is intended to be used to pass "C" type strings between - the application and the core and component. The VO_STRING type is a 32 - bit pointer to a zero terminated string. The pointer is word aligned and - the string is byte aligned. - */ -typedef char* VO_PCHAR; - -/** The VO_PBYTE type is intended to be used to pass arrays of bytes such as - buffers between the application and the component and core. The VO_PBYTE - type is a 32 bit pointer to a zero terminated string. The pointer is word - aligned and the string is byte aligned. - */ -typedef unsigned char* VO_PBYTE; - -/** The VO_PTCHAR type is intended to be used to pass arrays of wchar such as - unicode char between the application and the component and core. The VO_PTCHAR - type is a 32 bit pointer to a zero terminated string. The pointer is word - aligned and the string is byte aligned. - */ -/* -#if !defined LINUX -typedef unsigned short* VO_PTCHAR; -typedef unsigned short* VO_TCHAR; -#else -typedef char* VO_PTCHAR; -typedef char VO_TCHAR; -#endif -*/ - -#ifndef NULL -#ifdef __cplusplus -#define NULL 0 -#else -#define NULL ((void *)0) -#endif -#endif - -/** - * Input stream format, Frame or Stream.. - */ -typedef enum { - VO_INPUT_FRAME = 1, /*!< Input contains completely frame(s) data. */ - VO_INPUT_STREAM, /*!< Input is stream data. */ - VO_INPUT_STREAM_MAX = VO_MAX_ENUM_VALUE -} VO_INPUT_TYPE; - - -/** - * General data buffer, used as input or output. - */ -typedef struct { - VO_PBYTE Buffer; /*!< Buffer pointer */ - VO_U32 Length; /*!< Buffer size in byte */ - VO_S64 Time; /*!< The time of the buffer */ -} VO_CODECBUFFER; - - -/** - * The init memdata flag. - */ -typedef enum{ - VO_IMF_USERMEMOPERATOR =0, /*!< memData is the pointer of memoperator function*/ - VO_IMF_PREALLOCATEDBUFFER =1, /*!< memData is preallocated memory*/ - VO_IMF_MAX = VO_MAX_ENUM_VALUE -}VO_INIT_MEM_FlAG; - - -/** - * The init memory structure.. - */ -typedef struct{ - VO_INIT_MEM_FlAG memflag; /*!