diff options
author | Mans Rullgard <mans@mansr.com> | 2011-04-22 09:22:33 +0300 |
---|---|---|
committer | James Dong <jdong@google.com> | 2011-05-21 09:39:22 -0700 |
commit | e2e838afcf03e603a41a0455846eaf9614537c16 (patch) | |
tree | b6c2eedacc690a2c5514ac33dea7267cb38744bf /media/libstagefright/codecs/amrwbenc | |
parent | 8294aac281863e584027c3f2c7d2007c4140bf24 (diff) | |
download | frameworks_av-e2e838afcf03e603a41a0455846eaf9614537c16.zip frameworks_av-e2e838afcf03e603a41a0455846eaf9614537c16.tar.gz frameworks_av-e2e838afcf03e603a41a0455846eaf9614537c16.tar.bz2 |
Convert line breaks to Unix style
Change-Id: I6219725a9fbd72432bad71a176c14f26fabdbd5f
Diffstat (limited to 'media/libstagefright/codecs/amrwbenc')
94 files changed, 19594 insertions, 19594 deletions
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 <dlfcn.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#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 <dlfcn.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#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 <xn y1> <y1 y1> */
-/* 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 <xn y1> <y1 y1> */ +/* 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 <stdio.h>
-#include <stdlib.h>
-#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 <stdio.h> +#include <stdlib.h> +#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 <stdio.h>
-#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 <stdio.h> +#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 <stdio.h>
-#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 <stdio.h> +#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 <float.h>
-#include <limits.h>
-
-
-
-/*
-********************************************************************************
-* 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 <float.h> +#include <limits.h> + + + +/* +******************************************************************************** +* 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<<norm;
- L_sum = L_sum<<norm;
-
- r_h[(2*i)-1] = 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<<norm; + L_sum = L_sum<<norm; + + r_h[(2*i)-1] = 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<NC; i++) *
- * { *
- * f1[i] = a[i] + a[M-i]; *
- * f2[i] = a[i] - a[M-i]; *
- * } *
- * f1[NC] = 2.0*a[NC]; *
- * *
- * for (i=2; i<NC; i++) Divide by (1-z^-2) *
- * f2[i] += f2[i-2]; *
- *-------------------------------------------------------------*/
- for (i = 0; i < NC; i++)
- {
- t0 = a[i] << 15;
- f1[i] = vo_round(t0 + (a[M - i] << 15)); /* =(a[i]+a[M-i])/2 */
- f2[i] = vo_round(t0 - (a[M - i] << 15)); /* =(a[i]-a[M-i])/2 */
- }
- f1[NC] = a[NC];
- for (i = 2; i < NC; i++) /* Divide by (1-z^-2) */
- f2[i] = add1(f2[i], f2[i - 2]);
-
- /*---------------------------------------------------------------------*
- * Find the ISPs (roots of F1(z) and F2(z) ) using the *
- * Chebyshev polynomial evaluation. *
- * The roots of F1(z) and F2(z) are alternatively searched. *
- * We start by finding the first root of F1(z) then we switch *
- * to F2(z) then back to F1(z) and so on until all roots are found. *
- * *
- * - Evaluate Chebyshev pol. at grid points and check for sign change.*
- * - If sign change track the root by subdividing the interval *
- * 2 times and ckecking sign change. *
- *---------------------------------------------------------------------*/
- nf = 0; /* number of found frequencies */
- ip = 0; /* indicator for f1 or f2 */
- coef = f1;
- order = NC;
- xlow = vogrid[0];
- ylow = Chebps2(xlow, coef, order);
- j = 0;
- while ((nf < M - 1) && (j < GRID_POINTS))
- {
- j ++;
- xhigh = xlow;
- yhigh = ylow;
- xlow = vogrid[j];
- ylow = Chebps2(xlow, coef, order);
- if ((ylow * yhigh) <= (Word32) 0)
- {
- /* divide 2 times the interval */
- for (i = 0; i < 2; i++)
- {
- xmid = (xlow >> 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<NC; i++) * + * { * + * f1[i] = a[i] + a[M-i]; * + * f2[i] = a[i] - a[M-i]; * + * } * + * f1[NC] = 2.0*a[NC]; * + * * + * for (i=2; i<NC; i++) Divide by (1-z^-2) * + * f2[i] += f2[i-2]; * + *-------------------------------------------------------------*/ + for (i = 0; i < NC; i++) + { + t0 = a[i] << 15; + f1[i] = vo_round(t0 + (a[M - i] << 15)); /* =(a[i]+a[M-i])/2 */ + f2[i] = vo_round(t0 - (a[M - i] << 15)); /* =(a[i]-a[M-i])/2 */ + } + f1[NC] = a[NC]; + for (i = 2; i < NC; i++) /* Divide by (1-z^-2) */ + f2[i] = add1(f2[i], f2[i - 2]); + + /*---------------------------------------------------------------------* + * Find the ISPs (roots of F1(z) and F2(z) ) using the * + * Chebyshev polynomial evaluation. * + * The roots of F1(z) and F2(z) are alternatively searched. * + * We start by finding the first root of F1(z) then we switch * + * to F2(z) then back to F1(z) and so on until all roots are found. * + * * + * - Evaluate Chebyshev pol. at grid points and check for sign change.* + * - If sign change track the root by subdividing the interval * + * 2 times and ckecking sign change. * + *---------------------------------------------------------------------*/ + nf = 0; /* number of found frequencies */ + ip = 0; /* indicator for f1 or f2 */ + coef = f1; + order = NC; + xlow = vogrid[0]; + ylow = Chebps2(xlow, coef, order); + j = 0; + while ((nf < M - 1) && (j < GRID_POINTS)) + { + j ++; + xhigh = xlow; + yhigh = ylow; + xlow = vogrid[j]; + ylow = Chebps2(xlow, coef, order); + if ((ylow * yhigh) <= (Word32) 0) + { + /* divide 2 times the interval */ + for (i = 0; i < 2; i++) + { + xmid = (xlow >> 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 <stdlib.h>
-#include <stdio.h>
-#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 <stdlib.h> +#include <stdio.h> +#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 <malloc.h>
-#if defined LINUX
-#include <string.h>
-#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 <malloc.h> +#if defined LINUX +#include <string.h> +#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 <stdio.h>
-#include <stdlib.h>
-#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 <stdio.h> +#include <stdlib.h> +#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 <y1[],y1[]> */
-#ifdef ASM_OPT /* asm optimization branch */
- /* Compute scalar product <xn[],y1[]> */
- 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 <xn[],y1[]> */
- 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 <y1[],y1[]> */ +#ifdef ASM_OPT /* asm optimization branch */ + /* Compute scalar product <xn[],y1[]> */ + 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 <xn[],y1[]> */ + 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 <x[],y[]> |
-| |
-| 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 <x[],y[]> 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 <x[],y[]> | +| | +| 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 <x[],y[]> 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<<scale) < 1/sqrt(energy rounded) */
-
- /* loop for every possible period */
-
- for (t = t_min; t <= t_max; t++)
- {
- /* Compute correlation between xn[] and excf[] */
- L_tmp = 0;
- L_tmp1 = 0;
- for (i = 0; i < 64; i+=4)
- {
- L_tmp += (xn[i] * excf[i]);
- L_tmp1 += (excf[i] * excf[i]);
- L_tmp += (xn[i+1] * excf[i+1]);
- L_tmp1 += (excf[i+1] * excf[i+1]);
- L_tmp += (xn[i+2] * excf[i+2]);
- L_tmp1 += (excf[i+2] * excf[i+2]);
- L_tmp += (xn[i+3] * excf[i+3]);
- L_tmp1 += (excf[i+3] * excf[i+3]);
- }
-
- L_tmp = (L_tmp << 1) + 1;
- L_tmp1 = (L_tmp1 << 1) + 1;
-
- exp = norm_l(L_tmp);
- L_tmp = (L_tmp << exp);
- exp_corr = (30 - exp);
- corr = extract_h(L_tmp);
-
- exp = norm_l(L_tmp1);
- L_tmp = (L_tmp1 << exp);
- exp_norm = (30 - exp);
-
- Isqrt_n(&L_tmp, &exp_norm);
- norm = extract_h(L_tmp);
-
- /* Normalize correlation = correlation * (1/sqrt(energy)) */
-
- L_tmp = vo_L_mult(corr, norm);
-
- L_tmp2 = exp_corr + exp_norm + scale;
- if(L_tmp2 < 0)
- {
- L_tmp2 = -L_tmp2;
- L_tmp = L_tmp >> 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<<scale) < 1/sqrt(energy rounded) */ + + /* loop for every possible period */ + + for (t = t_min; t <= t_max; t++) + { + /* Compute correlation between xn[] and excf[] */ + L_tmp = 0; + L_tmp1 = 0; + for (i = 0; i < 64; i+=4) + { + L_tmp += (xn[i] * excf[i]); + L_tmp1 += (excf[i] * excf[i]); + L_tmp += (xn[i+1] * excf[i+1]); + L_tmp1 += (excf[i+1] * excf[i+1]); + L_tmp += (xn[i+2] * excf[i+2]); + L_tmp1 += (excf[i+2] * excf[i+2]); + L_tmp += (xn[i+3] * excf[i+3]); + L_tmp1 += (excf[i+3] * excf[i+3]); + } + + L_tmp = (L_tmp << 1) + 1; + L_tmp1 = (L_tmp1 << 1) + 1; + + exp = norm_l(L_tmp); + L_tmp = (L_tmp << exp); + exp_corr = (30 - exp); + corr = extract_h(L_tmp); + + exp = norm_l(L_tmp1); + L_tmp = (L_tmp1 << exp); + exp_norm = (30 - exp); + + Isqrt_n(&L_tmp, &exp_norm); + norm = extract_h(L_tmp); + + /* Normalize correlation = correlation * (1/sqrt(energy)) */ + + L_tmp = vo_L_mult(corr, norm); + + L_tmp2 = exp_corr + exp_norm + scale; + if(L_tmp2 < 0) + { + L_tmp2 = -L_tmp2; + L_tmp = L_tmp >> 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 <xn y1> <y1 y1> */
- /* 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 <y1 y1> and <xn y1> 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 <y2[],y2[]> */
-#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*<xn[],y2[]> */
-#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*<y1[],y2[]> */
-#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 <xn y1> <y1 y1> */ + /* 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 <y1 y1> and <xn y1> 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 <y2[],y2[]> */ +#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*<xn[],y2[]> */ +#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*<y1[],y2[]> */ +#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 <stdio.h>
-#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<<N)-1); */
- /*-------------------------------------------------------*
- * Quantization of 1 pulse with N+1 bits: *
- *-------------------------------------------------------*/
- index = L_deposit_l((Word16) (pos & mask));
- if ((pos & NB_POS) != 0)
- {
- index = vo_L_add(index, L_deposit_l(1 << N)); /* index += 1 << N; */
- }
- return (index);
-}
-
-
-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 */
-{
- Word16 mask, tmp;
- Word32 index;
- mask = (1 << N) - 1; /* mask = ((1<<N)-1); */
- /*-------------------------------------------------------*
- * Quantization of 2 pulses with 2*N+1 bits: *
- *-------------------------------------------------------*/
- if (((pos2 ^ pos1) & NB_POS) == 0)
- {
- /* sign of 1st pulse == sign of 2th pulse */
- if(pos1 <= pos2) /* ((pos1 - pos2) <= 0) */
- {
- /* index = ((pos1 & mask) << N) + (pos2 & mask); */
- index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
- } else
- {
- /* ((pos2 & mask) << N) + (pos1 & mask); */
- index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
- }
- if ((pos1 & NB_POS) != 0)
- {
- tmp = (N << 1);
- index = vo_L_add(index, (1L << tmp)); /* index += 1 << (2*N); */
- }
- } else
- {
- /* sign of 1st pulse != sign of 2th pulse */
- if (vo_sub((Word16) (pos1 & mask), (Word16) (pos2 & mask)) <= 0)
- {
- /* index = ((pos2 & mask) << N) + (pos1 & mask); */
- index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
- if ((pos2 & NB_POS) != 0)
- {
- tmp = (N << 1); /* index += 1 << (2*N); */
- index = vo_L_add(index, (1L << tmp));
- }
- } else
- {
- /* index = ((pos1 & mask) << N) + (pos2 & mask); */
- index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
- if ((pos1 & NB_POS) != 0)
- {
- tmp = (N << 1);
- index = vo_L_add(index, (1 << tmp)); /* index += 1 << (2*N); */
- }
- }
- }
- return (index);
-}
-
-
-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 */
-{
- Word16 nb_pos;
- Word32 index;
-
- nb_pos =(1 <<(N - 1)); /* nb_pos = (1<<(N-1)); */
- /*-------------------------------------------------------*
- * Quantization of 3 pulses with 3*N+1 bits: *
- *-------------------------------------------------------*/
- if (((pos1 ^ pos2) & nb_pos) == 0)
- {
- index = quant_2p_2N1(pos1, pos2, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
- /* index += (pos1 & nb_pos) << N; */
- index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
- /* index += quant_1p_N1(pos3, N) << (2*N); */
- index = vo_L_add(index, (quant_1p_N1(pos3, N)<<(N << 1)));
-
- } else if (((pos1 ^ pos3) & nb_pos) == 0)
- {
- index = quant_2p_2N1(pos1, pos3, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos3, (N-1)); */
- index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
- /* index += (pos1 & nb_pos) << N; */
- index = vo_L_add(index, (quant_1p_N1(pos2, N) << (N << 1)));
- /* index += quant_1p_N1(pos2, N) <<
- * (2*N); */
- } else
- {
- index = quant_2p_2N1(pos2, pos3, (N - 1)); /* index = quant_2p_2N1(pos2, pos3, (N-1)); */
- /* index += (pos2 & nb_pos) << N; */
- index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));
- /* index += quant_1p_N1(pos1, N) << (2*N); */
- index = vo_L_add(index, (quant_1p_N1(pos1, N) << (N << 1)));
- }
- return (index);
-}
-
-
-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 */
-{
- Word16 nb_pos;
- Word32 index;
-
- nb_pos = 1 << (N - 1); /* nb_pos = (1<<(N-1)); */
- /*-------------------------------------------------------*
- * Quantization of 4 pulses with 4*N+1 bits: *
- *-------------------------------------------------------*/
- if (((pos1 ^ pos2) & nb_pos) == 0)
- {
- index = quant_2p_2N1(pos1, pos2, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
- /* index += (pos1 & nb_pos) << N; */
- index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
- /* index += quant_2p_2N1(pos3, pos4, N) << (2*N); */
- index = vo_L_add(index, (quant_2p_2N1(pos3, pos4, N) << (N << 1)));
- } else if (((pos1 ^ pos3) & nb_pos) == 0)
- {
- index = quant_2p_2N1(pos1, pos3, (N - 1));
- /* index += (pos1 & nb_pos) << N; */
- index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
- /* index += quant_2p_2N1(pos2, pos4, N) << (2*N); */
- index = vo_L_add(index, (quant_2p_2N1(pos2, pos4, N) << (N << 1)));
- } else
- {
- index = quant_2p_2N1(pos2, pos3, (N - 1));
- /* index += (pos2 & nb_pos) << N; */
- index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));
- /* index += quant_2p_2N1(pos1, pos4, N) << (2*N); */
- index = vo_L_add(index, (quant_2p_2N1(pos1, pos4, N) << (N << 1)));
- }
- return (index);
-}
-
-
-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 */
-{
- Word16 nb_pos, mask, n_1, tmp;
- Word16 posA[4], posB[4];
- Word32 i, j, k, index;
-
- n_1 = (Word16) (N - 1);
- nb_pos = (1 << n_1); /* nb_pos = (1<<n_1); */
- mask = vo_sub((1 << N), 1); /* mask = ((1<<N)-1); */
-
- i = 0;
- j = 0;
- for (k = 0; k < 4; k++)
- {
- if ((pos[k] & nb_pos) == 0)
- {
- posA[i++] = pos[k];
- } else
- {
- posB[j++] = pos[k];
- }
- }
-
- switch (i)
- {
- case 0:
- tmp = vo_sub((N << 2), 3); /* index = 1 << ((4*N)-3); */
- index = (1L << tmp);
- /* index += quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1); */
- index = vo_L_add(index, quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1));
- break;
- case 1:
- /* index = quant_1p_N1(posA[0], n_1) << ((3*n_1)+1); */
- tmp = add1((Word16)((vo_L_mult(3, n_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<<n_1); */
-
- i = 0;
- j = 0;
- for (k = 0; k < 5; k++)
- {
- if ((pos[k] & nb_pos) == 0)
- {
- posA[i++] = pos[k];
- } else
- {
- posB[j++] = pos[k];
- }
- }
-
- switch (i)
- {
- case 0:
- 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(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<<n_1); */
-
- i = 0;
- j = 0;
- for (k = 0; k < 6; k++)
- {
- if ((pos[k] & nb_pos) == 0)
- {
- posA[i++] = pos[k];
- } else
- {
- posB[j++] = pos[k];
- }
- }
-
- switch (i)
- {
- case 0:
- index = (1 << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
- index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
- index = vo_L_add(index, quant_1p_N1(posB[5], n_1)); /* index += quant_1p_N1(posB[5], n_1); */
- break;
- case 1:
- index = (1L << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
- index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
- index = vo_L_add(index, quant_1p_N1(posA[0], n_1)); /* index += quant_1p_N1(posA[0], n_1); */
- break;
- case 2:
- index = (1L << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
- /* index += quant_4p_4N(posB, n_1) << ((2*n_1)+1); */
- index = vo_L_add(index, (quant_4p_4N(posB, n_1) << (Word16) (2 * n_1 + 1)));
- index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], n_1)); /* index += quant_2p_2N1(posA[0], posA[1], n_1); */
- break;
- case 3:
- index = (quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << (Word16) (3 * n_1 + 1));
- /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((3*n_1)+1); */
- index =vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
- /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
- break;
- case 4:
- i = 2;
- index = (quant_4p_4N(posA, n_1) << (Word16) (2 * n_1 + 1)); /* index = quant_4p_4N(posA, n_1) << ((2*n_1)+1); */
- index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1)); /* index += quant_2p_2N1(posB[0], posB[1], n_1); */
- break;
- case 5:
- i = 1;
- index = (quant_5p_5N(posA, n_1) << N); /* index = quant_5p_5N(posA, 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 6:
- i = 0;
- index = (quant_5p_5N(posA, n_1) << N); /* index = quant_5p_5N(posA, n_1) << N; */
- index = vo_L_add(index, quant_1p_N1(posA[5], n_1)); /* index += quant_1p_N1(posA[5], n_1); */
- break;
- default:
- index = 0;
- fprintf(stderr, "Error in function quant_6p_6N_2\n");
- }
- index = vo_L_add(index, ((L_deposit_l(i) & 3L) << (Word16) (6 * N - 4))); /* index += (i & 3) << ((6*N)-4); */
-
- 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_pulse.c * +* * +* Description: Coding and decoding of algebraic codebook * +* * +************************************************************************/ + +#include <stdio.h> +#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<<N)-1); */ + /*-------------------------------------------------------* + * Quantization of 1 pulse with N+1 bits: * + *-------------------------------------------------------*/ + index = L_deposit_l((Word16) (pos & mask)); + if ((pos & NB_POS) != 0) + { + index = vo_L_add(index, L_deposit_l(1 << N)); /* index += 1 << N; */ + } + return (index); +} + + +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 */ +{ + Word16 mask, tmp; + Word32 index; + mask = (1 << N) - 1; /* mask = ((1<<N)-1); */ + /*-------------------------------------------------------* + * Quantization of 2 pulses with 2*N+1 bits: * + *-------------------------------------------------------*/ + if (((pos2 ^ pos1) & NB_POS) == 0) + { + /* sign of 1st pulse == sign of 2th pulse */ + if(pos1 <= pos2) /* ((pos1 - pos2) <= 0) */ + { + /* index = ((pos1 & mask) << N) + (pos2 & mask); */ + index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask)))); + } else + { + /* ((pos2 & mask) << N) + (pos1 & mask); */ + index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask)))); + } + if ((pos1 & NB_POS) != 0) + { + tmp = (N << 1); + index = vo_L_add(index, (1L << tmp)); /* index += 1 << (2*N); */ + } + } else + { + /* sign of 1st pulse != sign of 2th pulse */ + if (vo_sub((Word16) (pos1 & mask), (Word16) (pos2 & mask)) <= 0) + { + /* index = ((pos2 & mask) << N) + (pos1 & mask); */ + index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask)))); + if ((pos2 & NB_POS) != 0) + { + tmp = (N << 1); /* index += 1 << (2*N); */ + index = vo_L_add(index, (1L << tmp)); + } + } else + { + /* index = ((pos1 & mask) << N) + (pos2 & mask); */ + index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask)))); + if ((pos1 & NB_POS) != 0) + { + tmp = (N << 1); + index = vo_L_add(index, (1 << tmp)); /* index += 1 << (2*N); */ + } + } + } + return (index); +} + + +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 */ +{ + Word16 nb_pos; + Word32 index; + + nb_pos =(1 <<(N - 1)); /* nb_pos = (1<<(N-1)); */ + /*-------------------------------------------------------* + * Quantization of 3 pulses with 3*N+1 bits: * + *-------------------------------------------------------*/ + if (((pos1 ^ pos2) & nb_pos) == 0) + { + index = quant_2p_2N1(pos1, pos2, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos2, (N-1)); */ + /* index += (pos1 & nb_pos) << N; */ + index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N)); + /* index += quant_1p_N1(pos3, N) << (2*N); */ + index = vo_L_add(index, (quant_1p_N1(pos3, N)<<(N << 1))); + + } else if (((pos1 ^ pos3) & nb_pos) == 0) + { + index = quant_2p_2N1(pos1, pos3, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos3, (N-1)); */ + index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N)); + /* index += (pos1 & nb_pos) << N; */ + index = vo_L_add(index, (quant_1p_N1(pos2, N) << (N << 1))); + /* index += quant_1p_N1(pos2, N) << + * (2*N); */ + } else + { + index = quant_2p_2N1(pos2, pos3, (N - 1)); /* index = quant_2p_2N1(pos2, pos3, (N-1)); */ + /* index += (pos2 & nb_pos) << N; */ + index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N)); + /* index += quant_1p_N1(pos1, N) << (2*N); */ + index = vo_L_add(index, (quant_1p_N1(pos1, N) << (N << 1))); + } + return (index); +} + + +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 */ +{ + Word16 nb_pos; + Word32 index; + + nb_pos = 1 << (N - 1); /* nb_pos = (1<<(N-1)); */ + /*-------------------------------------------------------* + * Quantization of 4 pulses with 4*N+1 bits: * + *-------------------------------------------------------*/ + if (((pos1 ^ pos2) & nb_pos) == 0) + { + index = quant_2p_2N1(pos1, pos2, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos2, (N-1)); */ + /* index += (pos1 & nb_pos) << N; */ + index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N)); + /* index += quant_2p_2N1(pos3, pos4, N) << (2*N); */ + index = vo_L_add(index, (quant_2p_2N1(pos3, pos4, N) << (N << 1))); + } else if (((pos1 ^ pos3) & nb_pos) == 0) + { + index = quant_2p_2N1(pos1, pos3, (N - 1)); + /* index += (pos1 & nb_pos) << N; */ + index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N)); + /* index += quant_2p_2N1(pos2, pos4, N) << (2*N); */ + index = vo_L_add(index, (quant_2p_2N1(pos2, pos4, N) << (N << 1))); + } else + { + index = quant_2p_2N1(pos2, pos3, (N - 1)); + /* index += (pos2 & nb_pos) << N; */ + index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N)); + /* index += quant_2p_2N1(pos1, pos4, N) << (2*N); */ + index = vo_L_add(index, (quant_2p_2N1(pos1, pos4, N) << (N << 1))); + } + return (index); +} + + +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 */ +{ + Word16 nb_pos, mask, n_1, tmp; + Word16 posA[4], posB[4]; + Word32 i, j, k, index; + + n_1 = (Word16) (N - 1); + nb_pos = (1 << n_1); /* nb_pos = (1<<n_1); */ + mask = vo_sub((1 << N), 1); /* mask = ((1<<N)-1); */ + + i = 0; + j = 0; + for (k = 0; k < 4; k++) + { + if ((pos[k] & nb_pos) == 0) + { + posA[i++] = pos[k]; + } else + { + posB[j++] = pos[k]; + } + } + + switch (i) + { + case 0: + tmp = vo_sub((N << 2), 3); /* index = 1 << ((4*N)-3); */ + index = (1L << tmp); + /* index += quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1); */ + index = vo_L_add(index, quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1)); + break; + case 1: + /* index = quant_1p_N1(posA[0], n_1) << ((3*n_1)+1); */ + tmp = add1((Word16)((vo_L_mult(3, n_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<<n_1); */ + + i = 0; + j = 0; + for (k = 0; k < 5; k++) + { + if ((pos[k] & nb_pos) == 0) + { + posA[i++] = pos[k]; + } else + { + posB[j++] = pos[k]; + } + } + + switch (i) + { + case 0: + 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(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<<n_1); */ + + i = 0; + j = 0; + for (k = 0; k < 6; k++) + { + if ((pos[k] & nb_pos) == 0) + { + posA[i++] = pos[k]; + } else + { + posB[j++] = pos[k]; + } + } + + switch (i) + { + case 0: + index = (1 << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */ + index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */ + index = vo_L_add(index, quant_1p_N1(posB[5], n_1)); /* index += quant_1p_N1(posB[5], n_1); */ + break; + case 1: + index = (1L << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */ + index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */ + index = vo_L_add(index, quant_1p_N1(posA[0], n_1)); /* index += quant_1p_N1(posA[0], n_1); */ + break; + case 2: + index = (1L << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */ + /* index += quant_4p_4N(posB, n_1) << ((2*n_1)+1); */ + index = vo_L_add(index, (quant_4p_4N(posB, n_1) << (Word16) (2 * n_1 + 1))); + index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], n_1)); /* index += quant_2p_2N1(posA[0], posA[1], n_1); */ + break; + case 3: + index = (quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << (Word16) (3 * n_1 + 1)); + /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((3*n_1)+1); */ + index =vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1)); + /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */ + break; + case 4: + i = 2; + index = (quant_4p_4N(posA, n_1) << (Word16) (2 * n_1 + 1)); /* index = quant_4p_4N(posA, n_1) << ((2*n_1)+1); */ + index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1)); /* index += quant_2p_2N1(posB[0], posB[1], n_1); */ + break; + case 5: + i = 1; + index = (quant_5p_5N(posA, n_1) << N); /* index = quant_5p_5N(posA, 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 6: + i = 0; + index = (quant_5p_5N(posA, n_1) << N); /* index = quant_5p_5N(posA, n_1) << N; */ + index = vo_L_add(index, quant_1p_N1(posA[5], n_1)); /* index += quant_1p_N1(posA[5], n_1); */ + break; + default: + index = 0; + fprintf(stderr, "Error in function quant_6p_6N_2\n"); + } + index = vo_L_add(index, ((L_deposit_l(i) & 3L) << (Word16) (6 * N - 4))); /* index += (i & 3) << ((6*N)-4); */ + + return (index); +} + + diff --git a/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c b/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c index 00b0a53..f6d53de 100644 --- a/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c +++ b/media/libstagefright/codecs/amrwbenc/src/qisf_ns.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: qisf_ns.c *
-* *
-* Description: Coding/Decoding of ISF parameters for background noise.*
-* The ISF vector is quantized using VQ with split-by-5 *
-* *
-****************************************************************************/
-
-#include "typedef.h"
-#include "basic_op.h"
-#include "acelp.h"
-#include "qisf_ns.tab" /* Codebooks of ISFs */
-
-/*------------------------------------------------------------------*
-* routine: Qisf_ns() *
-* ~~~~~~~~~ *
-*------------------------------------------------------------------*/
-
-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 */
- )
-{
- Word16 i;
- Word32 tmp;
-
- for (i = 0; i < ORDER; i++)
- {
- isf_q[i] = sub(isf1[i], mean_isf_noise[i]);
- }
-
- indice[0] = Sub_VQ(&isf_q[0], dico1_isf_noise, 2, SIZE_BK_NOISE1, &tmp);
- indice[1] = Sub_VQ(&isf_q[2], dico2_isf_noise, 3, SIZE_BK_NOISE2, &tmp);
- indice[2] = Sub_VQ(&isf_q[5], dico3_isf_noise, 3, SIZE_BK_NOISE3, &tmp);
- indice[3] = Sub_VQ(&isf_q[8], dico4_isf_noise, 4, SIZE_BK_NOISE4, &tmp);
- indice[4] = Sub_VQ(&isf_q[12], dico5_isf_noise, 4, SIZE_BK_NOISE5, &tmp);
-
- /* decoding the ISFs */
-
- Disf_ns(indice, isf_q);
-
- return;
-}
-
-/********************************************************************
-* Function: Disf_ns() *
-* ~~~~~~~~~ *
-* Decoding of ISF parameters *
-*-------------------------------------------------------------------*
-* Arguments: *
-* indice[] : indices of the selected codebook entries *
-* isf[] : quantized ISFs (in frequency domain) *
-*********************************************************************/
-
-void Disf_ns(
- Word16 * indice, /* input: quantization indices */
- Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */
- )
-{
- Word16 i;
-
- for (i = 0; i < 2; i++)
- {
- isf_q[i] = dico1_isf_noise[indice[0] * 2 + i];
- }
- for (i = 0; i < 3; i++)
- {
- isf_q[i + 2] = dico2_isf_noise[indice[1] * 3 + i];
- }
- for (i = 0; i < 3; i++)
- {
- isf_q[i + 5] = dico3_isf_noise[indice[2] * 3 + i];
- }
- for (i = 0; i < 4; i++)
- {
- isf_q[i + 8] = dico4_isf_noise[indice[3] * 4 + i];
- }
- for (i = 0; i < 4; i++)
- {
- isf_q[i + 12] = dico5_isf_noise[indice[4] * 4 + i];
- }
-
- for (i = 0; i < ORDER; i++)
- {
- isf_q[i] = add(isf_q[i], mean_isf_noise[i]);
- }
-
- Reorder_isf(isf_q, ISF_GAP, ORDER);
-
- 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: qisf_ns.c * +* * +* Description: Coding/Decoding of ISF parameters for background noise.* +* The ISF vector is quantized using VQ with split-by-5 * +* * +****************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "acelp.h" +#include "qisf_ns.tab" /* Codebooks of ISFs */ + +/*------------------------------------------------------------------* +* routine: Qisf_ns() * +* ~~~~~~~~~ * +*------------------------------------------------------------------*/ + +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 */ + ) +{ + Word16 i; + Word32 tmp; + + for (i = 0; i < ORDER; i++) + { + isf_q[i] = sub(isf1[i], mean_isf_noise[i]); + } + + indice[0] = Sub_VQ(&isf_q[0], dico1_isf_noise, 2, SIZE_BK_NOISE1, &tmp); + indice[1] = Sub_VQ(&isf_q[2], dico2_isf_noise, 3, SIZE_BK_NOISE2, &tmp); + indice[2] = Sub_VQ(&isf_q[5], dico3_isf_noise, 3, SIZE_BK_NOISE3, &tmp); + indice[3] = Sub_VQ(&isf_q[8], dico4_isf_noise, 4, SIZE_BK_NOISE4, &tmp); + indice[4] = Sub_VQ(&isf_q[12], dico5_isf_noise, 4, SIZE_BK_NOISE5, &tmp); + + /* decoding the ISFs */ + + Disf_ns(indice, isf_q); + + return; +} + +/******************************************************************** +* Function: Disf_ns() * +* ~~~~~~~~~ * +* Decoding of ISF parameters * +*-------------------------------------------------------------------* +* Arguments: * +* indice[] : indices of the selected codebook entries * +* isf[] : quantized ISFs (in frequency domain) * +*********************************************************************/ + +void Disf_ns( + Word16 * indice, /* input: quantization indices */ + Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */ + ) +{ + Word16 i; + + for (i = 0; i < 2; i++) + { + isf_q[i] = dico1_isf_noise[indice[0] * 2 + i]; + } + for (i = 0; i < 3; i++) + { + isf_q[i + 2] = dico2_isf_noise[indice[1] * 3 + i]; + } + for (i = 0; i < 3; i++) + { + isf_q[i + 5] = dico3_isf_noise[indice[2] * 3 + i]; + } + for (i = 0; i < 4; i++) + { + isf_q[i + 8] = dico4_isf_noise[indice[3] * 4 + i]; + } + for (i = 0; i < 4; i++) + { + isf_q[i + 12] = dico5_isf_noise[indice[4] * 4 + i]; + } + + for (i = 0; i < ORDER; i++) + { + isf_q[i] = add(isf_q[i], mean_isf_noise[i]); + } + + Reorder_isf(isf_q, ISF_GAP, ORDER); + + return; +} + + + diff --git a/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c b/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c index ccedb5c..ac13a67 100644 --- a/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c +++ b/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c @@ -1,542 +1,542 @@ -/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT 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;
-}
-
-
-
-
+/* + ** Copyright 2003-2010, VisualOn, Inc. + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT 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 <stdio.h>
-#include <stdlib.h>
-#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 <stdio.h> +#include <stdlib.h> +#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 <stdlib.h>
-#include <stdio.h>
-#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 <stdlib.h> +#include <stdio.h> +#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; +} + + + |